Merge branch 'master' into project-dashboards

This commit is contained in:
Manuel Rego Casasnovas 2011-12-02 17:52:06 +01:00
commit 30b9edbbbf
105 changed files with 4328 additions and 1597 deletions

View file

@ -6,7 +6,7 @@ Authors
LibrePlan Team LibrePlan Team
-------------- --------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es> * Cristina Alvariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com> * Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com> * Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com> * Xavier Castaño García <xcastanho@igalia.com>

48
HACKING
View file

@ -64,15 +64,15 @@ Debian/Ubuntu
* Use SQL sentences:: * Use SQL sentences::
CREATE DATABASE navaldev; CREATE DATABASE libreplandev;
CREATE DATABASE navaldevtest; CREATE DATABASE libreplandevtest;
CREATE USER naval WITH PASSWORD 'naval'; CREATE USER libreplan WITH PASSWORD 'libreplan';
GRANT ALL PRIVILEGES ON DATABASE navaldev TO naval; GRANT ALL PRIVILEGES ON DATABASE libreplandev TO libreplan;
GRANT ALL PRIVILEGES ON DATABASE navaldevtest TO naval; GRANT ALL PRIVILEGES ON DATABASE libreplandevtest TO libreplan;
* Download source code:: * Download source code::
$ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan $ git clone git://navalplan.git.sourceforge.net/gitroot/navalplan/navalplan
* Compile project:: * Compile project::
@ -103,11 +103,11 @@ Fedora
* Use SQL sentences:: * Use SQL sentences::
CREATE DATABASE navaldev; CREATE DATABASE libreplandev;
CREATE DATABASE navaldevtest; CREATE DATABASE libreplandevtest;
CREATE USER naval WITH PASSWORD 'naval'; CREATE USER libreplan WITH PASSWORD 'libreplan';
GRANT ALL PRIVILEGES ON DATABASE navaldev TO naval; GRANT ALL PRIVILEGES ON DATABASE libreplandev TO libreplan;
GRANT ALL PRIVILEGES ON DATABASE navaldevtest TO naval; GRANT ALL PRIVILEGES ON DATABASE libreplandevtest TO libreplan;
* Set ``postgres`` user password:: * Set ``postgres`` user password::
@ -121,7 +121,7 @@ Fedora
* Download source code:: * Download source code::
$ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan $ git clone git://navalplan.git.sourceforge.net/gitroot/navalplan/navalplan
* Compile project:: * Compile project::
@ -163,11 +163,11 @@ openSUSE
* Use SQL sentences:: * Use SQL sentences::
CREATE DATABASE navaldev; CREATE DATABASE libreplandev;
CREATE DATABASE navaldevtest; CREATE DATABASE libreplandevtest;
CREATE USER naval WITH PASSWORD 'naval'; CREATE USER libreplan WITH PASSWORD 'libreplan';
GRANT ALL PRIVILEGES ON DATABASE navaldev TO naval; GRANT ALL PRIVILEGES ON DATABASE libreplandev TO libreplan;
GRANT ALL PRIVILEGES ON DATABASE navaldevtest TO naval; GRANT ALL PRIVILEGES ON DATABASE libreplandevtest TO libreplan;
* Set ``postgres`` user password:: * Set ``postgres`` user password::
@ -181,7 +181,7 @@ openSUSE
* Download source code:: * Download source code::
$ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan $ git clone git://navalplan.git.sourceforge.net/gitroot/navalplan/navalplan
* Compile project:: * Compile project::
@ -275,11 +275,11 @@ profiles defined in ``pom.xml`` of business and webapp modules).
* *dev* - Development environment (default) * *dev* - Development environment (default)
It uses databases ``navaldev`` and ``navaldevtest``. It uses databases ``libreplandev`` and ``libreplandevtest``.
* *prod* - Production environment * *prod* - Production environment
Unlike *dev* it uses database ``navalprod`` and `navalprodtest``. Unlike *dev* it uses database ``libreplanprod`` and `libreplanprodtest``.
It is needed to use it in combination with *postgresql* or *mysql* profiles. It is needed to use it in combination with *postgresql* or *mysql* profiles.
@ -361,10 +361,10 @@ For MySQL users here are specific instructions.
* SQL sentences to create database:: * SQL sentences to create database::
CREATE DATABASE navaldev; CREATE DATABASE libreplandev;
CREATE DATABASE navaldevtest; CREATE DATABASE libreplandevtest;
GRANT ALL ON navaldev.* to 'naval'@'localhost' identified by 'naval'; GRANT ALL ON libreplandev.* to 'libreplan'@'localhost' identified by 'libreplan';
GRANT ALL ON navaldevtest.* to 'naval'@'localhost' identified by 'naval'; GRANT ALL ON libreplandevtest.* to 'libreplan'@'localhost' identified by 'libreplan';
* Compile project:: * Compile project::

16
INSTALL
View file

@ -29,17 +29,17 @@ Debian packages
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
There are Debian packages for Squeeze (i386 and amd64), you can download them There are Debian packages for Squeeze (i386 and amd64), you can download them
from: http://sourceforge.net/projects/libreplan/files/LibrePlan/ from: http://sourceforge.net/projects/navalplan/files/LibrePlan/
Instructions: Instructions:
* Download the package:: * Download the package::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1-1_amd64.deb $ wget http://downloads.sourceforge.net/project/navalplan/files/LibrePlan/libreplan_1.2.0-1_amd64.deb
* Install package:: * Install package::
# dpkg -i libreplan_1.1.1-1_amd64.deb # dpkg -i libreplan_1.2.0-1_amd64.deb
* Install dependencies:: * Install dependencies::
@ -68,7 +68,7 @@ Debian/Ubuntu
* Download database installation script:: * Download database installation script::
$ wget -O install.sql http://downloads.sourceforge.net/project/libreplan/LibrePlan/install_1.1.1.sql $ wget -O install.sql http://downloads.sourceforge.net/project/navalplan/LibrePlan/install_1.2.0.sql
* Create database structure:: * Create database structure::
@ -76,7 +76,7 @@ Debian/Ubuntu
* Download ``.war`` file from SourceForge.net:: * Download ``.war`` file from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war $ wget -O libreplan.war http://downloads.sourceforge.net/project/navalplan/LibrePlan/libreplan_1.2.0.war
* Create a new file ``/etc/tomcat6/Catalina/localhost/libreplan.xml`` (file * Create a new file ``/etc/tomcat6/Catalina/localhost/libreplan.xml`` (file
name has to match with ``.war`` name) with database configuration for name has to match with ``.war`` name) with database configuration for
@ -170,7 +170,7 @@ openSUSE
* Download database installation script:: * Download database installation script::
$ wget -O install.sql http://downloads.sourceforge.net/project/libreplan/LibrePlan/install_1.1.1.sql $ wget -O install.sql http://downloads.sourceforge.net/project/navalplan/LibrePlan/install_1.2.0.sql
* Create database structure:: * Create database structure::
@ -178,7 +178,7 @@ openSUSE
* Download ``.war`` file from SourceForge.net:: * Download ``.war`` file from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war $ wget -O libreplan.war http://downloads.sourceforge.net/project/navalplan/LibrePlan/libreplan_1.2.0.war
* Create a new file ``/etc/tomcat6/Catalina/localhost/libreplan.xml`` (file * Create a new file ``/etc/tomcat6/Catalina/localhost/libreplan.xml`` (file
name has to match with ``.war`` name) with database configuration for name has to match with ``.war`` name) with database configuration for
@ -215,7 +215,7 @@ Logs
Since *LibrePlan 1.1.1* log system is configured automatically creating a new Since *LibrePlan 1.1.1* log system is configured automatically creating a new
folder under ``/var/log/tomcat6/`` with ``.war`` name. For example: folder under ``/var/log/tomcat6/`` with ``.war`` name. For example:
``/var/log/tomcat6/libreplan.war``. ``/var/log/tomcat6/libreplan/``.
Inside this new directory there will be two files (``libreplan.log`` and Inside this new directory there will be two files (``libreplan.log`` and
``libreplan-error.log``) that will be rotated every day. ``libreplan-error.log``) that will be rotated every day.

1403
NEWS

File diff suppressed because it is too large Load diff

109
README
View file

@ -5,32 +5,84 @@ LibrePlan
Description Description
----------- -----------
*LibrePlan* is a free software web application for project management. *LibrePlan* is a free software web application for project management,
monitoring and control.
*LibrePlan* is a planning tool for users based on some concepts: company and *LibrePlan* is a collaborative tool to plan, monitor and control projects and
multi-project overview, criteria assignments, tasks tagging, resources has a rich web interface which provides a desktop alike user experience. All the
management, resource allocation (specific and generic), company load control, team members can take part in the planning and this makes possible to have a
external integration, etc. real-time planning.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Although its name is clearly related to shipbuilding, *LibrePlan* is a fully
useful planning tool for any type of company whose workflow requires project and
order administration and scheduling.
Features Features
~~~~~~~~ ~~~~~~~~
* Multiproject management. It offers a global vision of the company managing * Resource management:
several projects sharing resources.
* Group resource allocations: dynamic groups based on criteria. * Two type of resources: machines and workers.
* Flexible calendars. * Flexible calendars easily reusable.
* Configurable Gantt chart from Work Breakdown Structure (WBS) [1]_. * Resource configuration based on skills and roles.
* Resource Breakdown Structure (RBS) chart [2]_.
* Overload resource allocation control. * Planning:
* Earned Value Management [3]_.
* Cost analysis based on work reports. * Simple way to configure and estimate the work to plan. It is carried out
* Integration with other *LibrePlan* instances and third-parties. through Work Breakdown Structures (WBS) [1]_.
* Other functionalities: Materials, quality forms, project templates, planning * Different detail levels during the planning.
scenarios, multiple task progress measurement ... * Two ways to allocate resources:
* Specific allocation: Concrete individuals.
* Assisted generic allocation: Based on skills and roles fulfilled by the
resources.
* Templates to reuse work. Projects can be created based on templates for
repeatable tasks being able to save time.
* Automatic resource reallocation in order to minimize overload (overtime).
* Advanced allocation. Manual configuration of daily work hours on a task
when automatic allocation does not suit your needs.
* Monte Carlo method. Statistical simulation to calculate the possibility to
complete a project in a range of dates.
* Projects control and monitoring:
* Company global analysis.
* Earned Value Management [2]_. Project management method to objectively
measure progress and performance of a project.
* Planning quality management. It is possible to control quality of the tasks
to be performed through forms.
* Projects cost analysis.
* Reported hours: worked hours are assigned to each task to track costs during
the planning
* Progress measurement through different unit types.
* Outsourcing
LibrePlan provides support for companies that do outsourcing:
* Project tasks can be outsourced and sent to the LibrePlan installation of
the supplier.
* You can receive progress notifications of the subcontractors to know how
outsourced tasks are evolving .
* Other features:
* Materials. You can manage the materials that planned tasks need to be
carried out.
* Complete users system with permissions, LDAP authentication, etc.
Requirements Requirements
@ -74,17 +126,17 @@ Availability
------------ ------------
The cutting-edge version of this project is always available from the Git The cutting-edge version of this project is always available from the Git
repository at http://libreplan.git.sourceforge.net/. repository at http://navalplan.git.sourceforge.net/.
Released versions are available at Released versions are available at
http://sourceforge.net/projects/libreplan/files. http://sourceforge.net/projects/navalplan/files.
Webpage Webpage
------- -------
You can find more information about *LibrePlan* at You can find more information about *LibrePlan* at
http://www.libreplan.org/en/. http://www.libreplan.com/.
For information related with *LibrePlan* development you can visit the wiki at For information related with *LibrePlan* development you can visit the wiki at
http://wiki.libreplan.org/. http://wiki.libreplan.org/.
@ -100,7 +152,7 @@ License
------- -------
*LibrePlan* is released under the terms of the GNU Affero General Public *LibrePlan* is released under the terms of the GNU Affero General Public
License version 3 [4]_. License version 3 [3]_.
Please read the ``COPYING`` file for details. Please read the ``COPYING`` file for details.
@ -109,14 +161,13 @@ Authors
------- -------
This project is sponsored by *Fundación para o Fomento da Calidade Industrial e This project is sponsored by *Fundación para o Fomento da Calidade Industrial e
o Desenvolvemento Tecnolóxico de Galicia* [5]_. o Desenvolvemento Tecnolóxico de Galicia* [4]_.
Please see ``AUTHORS`` file for more information about the authors. Please see ``AUTHORS`` file for more information about the authors.
.. [1] http://en.wikipedia.org/wiki/Work_Breakdown_Structure .. [1] http://en.wikipedia.org/wiki/Work_Breakdown_Structure
.. [2] http://en.wikipedia.org/wiki/Resource_Breakdown_Structure .. [2] http://en.wikipedia.org/wiki/Earned_Value_Management
.. [3] http://en.wikipedia.org/wiki/Earned_Value_Management .. [3] http://www.fsf.org/licensing/licenses/agpl.html
.. [4] http://www.fsf.org/licensing/licenses/agpl.html .. [4] http://www.fundacioncalidade.org/
.. [5] http://www.fundacioncalidade.org/

12
UPDATE
View file

@ -26,11 +26,11 @@ Instructions:
* Download the new package:: * Download the new package::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1-1_amd64.deb $ wget http://downloads.sourceforge.net/project/navalplan/NavalPlan/navalplan_1.1.1-1_amd64.deb
* Install package:: * Install package::
# dpkg -i libreplan_1.1.1-1_amd64.deb # dpkg -i navalplan_1.1.1-1_amd64.deb
* Install new dependencies if needed:: * Install new dependencies if needed::
@ -51,7 +51,7 @@ Debian/Ubuntu
are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download
``upgrade_1.1.0.sql``:: ``upgrade_1.1.0.sql``::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/upgrade_1.1.0.sql $ wget http://downloads.sourceforge.net/project/navalplan/NavalPlan/upgrade_1.1.0.sql
* Upgrade database:: * Upgrade database::
@ -59,7 +59,7 @@ Debian/Ubuntu
* Download ``.war`` file of new version from SourceForge.net:: * Download ``.war`` file of new version from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war $ wget -O libreplan.war http://downloads.sourceforge.net/project/navalplan/NavalPlan/navalplan_1.1.1.war
* Backup current deployed application:: * Backup current deployed application::
@ -87,7 +87,7 @@ openSUSE
are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download
``upgrade_1.1.0.sql``:: ``upgrade_1.1.0.sql``::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/upgrade_1.1.0.sql $ wget http://downloads.sourceforge.net/project/navalplan/NavalPlan/upgrade_1.1.0.sql
* Upgrade database:: * Upgrade database::
@ -95,7 +95,7 @@ openSUSE
* Download ``.war`` file of new version from SourceForge.net:: * Download ``.war`` file of new version from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war $ wget -O libreplan.war http://downloads.sourceforge.net/project/navalplan/NavalPlan/navalplan_1.1.1.war
* Backup current deployed application:: * Backup current deployed application::

46
debian/changelog vendored
View file

@ -1,4 +1,12 @@
libreplan (1.1.3-1) maverick; urgency=low libreplan (1.2.0-1) maverick; urgency=low
* Released LibrePlan 1.2.0
* Created a transitional package navalplan-1.2.0-1 in order to ease the
migration from NavalPlan 1.1 to LibrePlan 1.2
-- Manuel Rego Casasnovas <rego@igalia.com> Thu, 01 Dec 2011 16:40:00 +0100
navalplan (1.1.3-1) maverick; urgency=low
* Fixed important issue in Gantt view for big projects with labels. * Fixed important issue in Gantt view for big projects with labels.
* Added bugs fixed from stable branch. * Added bugs fixed from stable branch.
@ -6,7 +14,7 @@ libreplan (1.1.3-1) maverick; urgency=low
-- Manuel Rego Casasnovas <rego@igalia.com> Fri, 12 Aug 2011 13:08:00 +0200 -- Manuel Rego Casasnovas <rego@igalia.com> Fri, 12 Aug 2011 13:08:00 +0200
libreplan (1.1.2-1) maverick; urgency=low navalplan (1.1.2-1) maverick; urgency=low
* Fixed critical bug that causes concurrency issues editing projects with * Fixed critical bug that causes concurrency issues editing projects with
labels. labels.
@ -15,7 +23,7 @@ libreplan (1.1.2-1) maverick; urgency=low
-- Manuel Rego Casasnovas <rego@igalia.com> Wed, 18 Jul 2011 13:23:00 +0200 -- Manuel Rego Casasnovas <rego@igalia.com> Wed, 18 Jul 2011 13:23:00 +0200
libreplan (1.1.1-1) maverick; urgency=low navalplan (1.1.1-1) maverick; urgency=low
* Changed dependency from OpenJDK to default-jdk or default-jre. * Changed dependency from OpenJDK to default-jdk or default-jre.
* Added bugs fixed from stable branch. * Added bugs fixed from stable branch.
@ -23,7 +31,7 @@ libreplan (1.1.1-1) maverick; urgency=low
-- Manuel Rego Casasnovas <rego@igalia.com> Wed, 07 Jun 2011 09:15:00 +0200 -- Manuel Rego Casasnovas <rego@igalia.com> Wed, 07 Jun 2011 09:15:00 +0200
libreplan (1.1.0-1) maverick; urgency=low navalplan (1.1.0-1) maverick; urgency=low
* Removed unnecessary dependency with texlive-latex-recommended and pgf * Removed unnecessary dependency with texlive-latex-recommended and pgf
packages. packages.
@ -33,35 +41,35 @@ libreplan (1.1.0-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Wed, 19 Apr 2011 07:50:00 +0200 -- Manuel Rego Casasnovas <mrego@igalia.com> Wed, 19 Apr 2011 07:50:00 +0200
libreplan (1.0.6-1) maverick; urgency=low navalplan (1.0.6-1) maverick; urgency=low
* Several important bugs fixed during 1.1 stabilization. * Several important bugs fixed during 1.1 stabilization.
* Released version 1.0.6. * Released version 1.0.6.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 27 Apr 2011 11:49:00 +0200 -- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 27 Apr 2011 11:49:00 +0200
libreplan (1.0.5-1) maverick; urgency=low navalplan (1.0.5-1) maverick; urgency=low
* Added bugs fixed from stable branch. * Added bugs fixed from stable branch.
* Released version 1.0.5. * Released version 1.0.5.
-- Manuel Rego Casasnovas <mrego@igalia.com> Fri, 08 Apr 2011 11:20:46 +0200 -- Manuel Rego Casasnovas <mrego@igalia.com> Fri, 08 Apr 2011 11:20:46 +0200
libreplan (1.0.4-1) maverick; urgency=low navalplan (1.0.4-1) maverick; urgency=low
* Added bugs fixed from stable branch. * Added bugs fixed from stable branch.
* Released version 1.0.4. * Released version 1.0.4.
-- Manuel Rego Casasnovas <mrego@igalia.com> Thu, 17 Mar 2011 12:27:47 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Thu, 17 Mar 2011 12:27:47 +0100
libreplan (1.0.3-1) maverick; urgency=low navalplan (1.0.3-1) maverick; urgency=low
* Added bugs fixed from stable branch. * Added bugs fixed from stable branch.
* Released version 1.0.3. * Released version 1.0.3.
-- Manuel Rego Casasnovas <mrego@igalia.com> Mon, 14 Feb 2011 07:23:58 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Mon, 14 Feb 2011 07:23:58 +0100
libreplan (1.0.2-1) maverick; urgency=low navalplan (1.0.2-1) maverick; urgency=low
* Fixed database installation script. * Fixed database installation script.
* Added bugfixed from stable branch. * Added bugfixed from stable branch.
@ -69,7 +77,7 @@ libreplan (1.0.2-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Fri, 21 Jan 2011 12:07:33 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Fri, 21 Jan 2011 12:07:33 +0100
libreplan (1.0.1-1) maverick; urgency=low navalplan (1.0.1-1) maverick; urgency=low
* Added dependency with ttf-freefont on Debian package (needed for Jasper * Added dependency with ttf-freefont on Debian package (needed for Jasper
reports). reports).
@ -78,7 +86,7 @@ libreplan (1.0.1-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@erizana> Fri, 14 Jan 2011 09:58:33 +0100 -- Manuel Rego Casasnovas <mrego@erizana> Fri, 14 Jan 2011 09:58:33 +0100
libreplan (1.0.0-1) maverick; urgency=low navalplan (1.0.0-1) maverick; urgency=low
* Updated to upstream. Released version 1.0. * Updated to upstream. Released version 1.0.
* Added upgrade script needed to upgrade to version 1.0. * Added upgrade script needed to upgrade to version 1.0.
@ -86,33 +94,33 @@ libreplan (1.0.0-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 07 Jan 2011 16:45:00 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 07 Jan 2011 16:45:00 +0100
libreplan (0.9.2-3) maverick; urgency=low navalplan (0.9.2-3) maverick; urgency=low
* Added missing postgresql dependency. * Added missing postgresql dependency.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 07 Jan 2011 10:00:00 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 07 Jan 2011 10:00:00 +0100
libreplan (0.9.2-2) maverick; urgency=low navalplan (0.9.2-2) maverick; urgency=low
* Added postgresql-client dependency needed because of dbconfig. * Added postgresql-client dependency needed because of dbconfig.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 05 Jan 2011 16:12:00 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 05 Jan 2011 16:12:00 +0100
libreplan (0.9.2-1) maverick; urgency=low navalplan (0.9.2-1) maverick; urgency=low
* Updated to upstream. * Updated to upstream.
* Fixed issues on debian package. * Fixed issues on debian package.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 04 Jan 2011 15:58:19 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 04 Jan 2011 15:58:19 +0100
libreplan (0.9.1) maverick; urgency=low navalplan (0.9.1) maverick; urgency=low
* Updated to upstream. * Updated to upstream.
* Fixed problems with translations. * Fixed problems with translations.
-- Manuel Rego Casasnovas <mrego@igalia.com> Thu, 23 Dec 2010 00:14:54 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Thu, 23 Dec 2010 00:14:54 +0100
libreplan (0.9.0) maverick; urgency=low navalplan (0.9.0) maverick; urgency=low
* Updated to upstream. * Updated to upstream.
* Fixed issues with context.xml file. * Fixed issues with context.xml file.
@ -121,19 +129,19 @@ libreplan (0.9.0) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 21 Dec 2010 17:31:08 +0100 -- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 21 Dec 2010 17:31:08 +0100
libreplan (20100908) lucid; urgency=low navalplan (20100908) lucid; urgency=low
* Updated to upstream. * Updated to upstream.
-- Jose Maria Casanova Crespo (Chema) <jmcasanova@igalia.com> Wed, 8 Sep 2010 00:00:00 +0000 -- Jose Maria Casanova Crespo (Chema) <jmcasanova@igalia.com> Wed, 8 Sep 2010 00:00:00 +0000
libreplan (20100415) karmic; urgency=low navalplan (20100415) karmic; urgency=low
* Updated to upstream. * Updated to upstream.
-- Jose Maria Casanova Crespo (Chema) <jmcasanova@igalia.com> Thu, 15 Mar 2010 14:30:00 +0000 -- Jose Maria Casanova Crespo (Chema) <jmcasanova@igalia.com> Thu, 15 Mar 2010 14:30:00 +0000
libreplan (20100324) karmic; urgency=low navalplan (20100324) karmic; urgency=low
* Initial release. * Initial release.

25
debian/control vendored
View file

@ -5,19 +5,32 @@ Maintainer: Adrian Perez <aperez@igalia.com>
Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils, Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils,
gettext (>= 0.17), default-jdk gettext (>= 0.17), default-jdk
Standards-Version: 3.8.4 Standards-Version: 3.8.4
Homepage: http://www.libreplan.org/en/ Homepage: http://www.libreplan.com/
Package: libreplan Package: libreplan
Architecture: any Architecture: any
Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf, Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf,
tomcat6, default-jre-headless | default-jre, libpg-java, ttf-freefont, tomcat6, default-jre-headless | default-jre, libpg-java, ttf-freefont,
${misc:Depends} ${misc:Depends}
Description: Web application for project management. Description: Web application for project planning, monitoring and control.
LibrePlan is a planning tool for users based on some concepts: company and LibrePlan is a collaborative tool to plan, monitor and control projects and has
a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Package: navalplan
Architecture: all
Pre-Depends: libreplan (>= 1.2.0-1)
Depends: ${misc:Depends}
Description: Web application for project management (transitional package)
NavalPlan is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control, management, resource allocation (specific and generic), company load control,
external integration, etc. external integration, etc.
. .
Although its name is clearly related to shipbuilding, LibrePlan is a fully This package can be safely deleted after Libreplan is successfully installed.
useful planning tool for any type of company whose workflow requires project
and order administration and scheduling.

27
debian/control.lucid vendored
View file

@ -3,21 +3,34 @@ Section: web
Priority: optional Priority: optional
Maintainer: Adrian Perez <aperez@igalia.com> Maintainer: Adrian Perez <aperez@igalia.com>
Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils, Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils,
gettext (>= 0.17), texlive-latex-recommended, pgf, openjdk-6-jdk gettext (>= 0.17), openjdk-6-jdk
Standards-Version: 3.8.4 Standards-Version: 3.8.4
Homepage: http://www.libreplan.org/en/ Homepage: http://www.libreplan.com/
Package: libreplan Package: libreplan
Architecture: any Architecture: any
Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf, Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf,
tomcat6, openjdk-6-jre-headless | openjdk-6-jre, libpg-java, ttf-freefont, tomcat6, openjdk-6-jre-headless | openjdk-6-jre, libpg-java, ttf-freefont,
${misc:Depends} ${misc:Depends}
Description: Web application for project management. Description: Web application for project planning, monitoring and control.
LibrePlan is a planning tool for users based on some concepts: company and LibrePlan is a collaborative tool to plan, monitor and control projects and has
a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Package: navalplan
Architecture: all
Pre-Depends: libreplan (>= 1.2.0-1)
Depends: ${misc:Depends}
Description: Web application for project management (transitional package)
NavalPlan is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control, management, resource allocation (specific and generic), company load control,
external integration, etc. external integration, etc.
. .
Although its name is clearly related to shipbuilding, LibrePlan is a fully This package can be safely deleted after Libreplan is successfully installed.
useful planning tool for any type of company whose workflow requires project
and order administration and scheduling.

View file

@ -3,21 +3,34 @@ Section: web
Priority: optional Priority: optional
Maintainer: Adrian Perez <aperez@igalia.com> Maintainer: Adrian Perez <aperez@igalia.com>
Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils, Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils,
gettext (>= 0.17), texlive-latex-recommended, pgf, openjdk-6-jdk gettext (>= 0.17), openjdk-6-jdk
Standards-Version: 3.8.4 Standards-Version: 3.8.4
Homepage: http://www.libreplan.org/en/ Homepage: http://www.libreplan.com/
Package: libreplan Package: libreplan
Architecture: any Architecture: any
Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf, Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf,
tomcat6, openjdk-6-jre-headless | openjdk-6-jre, libpg-java, ttf-freefont, tomcat6, openjdk-6-jre-headless | openjdk-6-jre, libpg-java, ttf-freefont,
${misc:Depends} ${misc:Depends}
Description: Web application for project management. Description: Web application for project planning, monitoring and control.
LibrePlan is a planning tool for users based on some concepts: company and LibrePlan is a collaborative tool to plan, monitor and control projects and has
a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Package: navalplan
Architecture: all
Pre-Depends: libreplan (>= 1.2.0-1)
Depends: ${misc:Depends}
Description: Web application for project management (transitional package)
NavalPlan is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control, management, resource allocation (specific and generic), company load control,
external integration, etc. external integration, etc.
. .
Although its name is clearly related to shipbuilding, LibrePlan is a fully This package can be safely deleted after Libreplan is successfully installed.
useful planning tool for any type of company whose workflow requires project
and order administration and scheduling.

View file

@ -3,4 +3,4 @@ debian/tmp/etc/tomcat6/policy.d/51libreplan.policy
debian/tmp/usr/share/dbconfig-common/data/libreplan/install/pgsql debian/tmp/usr/share/dbconfig-common/data/libreplan/install/pgsql
debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.0.0 debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.0.0
debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.1.0 debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.1.0
debian/tmp/usr/share/tomcat6/lib/postgresql-jdbc3.jar debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.0

View file

@ -68,6 +68,9 @@ then
fi fi
if [ ! -L /usr/share/tomcat6/lib/postgresql-jdbc3.jar ] ; then
ln -sf /usr/share/java/postgresql-jdbc3.jar /usr/share/tomcat6/lib/
fi
if [ -x /etc/init.d/tomcat6 ] ; then if [ -x /etc/init.d/tomcat6 ] ; then
if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then

26
debian/navalplan.postinst vendored Executable file
View file

@ -0,0 +1,26 @@
#! /bin/bash
if [[ $1 = configure ]]
then
# Remove old deployment directory as it's no longer necessary.
if [ -d /var/lib/tomcat6/webapps/navalplan/ ] ; then
rm -r /var/lib/tomcat6/webapps/navalplan/
fi
# Make sure the driver is there, as it might be removed when
# uninstalling older versions of the package.
if [ ! -L /usr/share/tomcat6/lib/postgresql-jdbc3.jar ] ; then
ln -sf /usr/share/java/postgresql-jdbc3.jar /usr/share/tomcat6/lib/
fi
# Start tomcat again
if [ -x /etc/init.d/tomcat6 ] ; then
if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then
invoke-rc.d tomcat6 start
else
/etc/init.d/tomcat6 start
fi
fi
fi
#DEBHELPER#

95
debian/navalplan.preinst vendored Executable file
View file

@ -0,0 +1,95 @@
#! /bin/bash
base_dbconfig_data_dir="/usr/share/dbconfig-common/data"
install_upgrade_to() {
upgrade_file="$base_dbconfig_data_dir/libreplan/upgrade/pgsql/$1"
echo "Applying SQL statements to upgrade to version $1..."
push_sql_from_file_as_user $upgrade_file $navalplan_user $navalplan_db
}
push_sql_from_file_as_user() {
filepath=$1
username=$2
database=$3
psql -U $username -h $database_host \
$database < $filepath > /dev/null 2>&1
}
execute_sql_as_admin() {
sql=$1
su - -s /bin/sh $navalplan_admin_user -c "psql -c \"$sql\"" > /dev/null
}
if [[ $1 = upgrade && -r /etc/dbconfig-common/libreplan.conf
&& -r /etc/dbconfig-common/navalplan.conf ]]
then
old_version=$2
. /etc/dbconfig-common/libreplan.conf
libreplan_user=${dbc_dbuser}
libreplan_passwd=${dbc_dbpass}
libreplan_db=${dbc_dbname}
. /etc/dbconfig-common/navalplan.conf
navalplan_user=${dbc_dbuser}
navalplan_passwd=${dbc_dbpass}
navalplan_db=${dbc_dbname}
navalplan_admin_user=${dbc_dbadmin}
if [ -z "${dbc_dbhost}" ] ; then
database_host='localhost'
else
database_host=${dbc_dbhost}
fi
export PGPASSFILE=`mktemp`
chmod 600 $PGPASSFILE
old_db_dump=`mktemp`
chown $navalplan_admin_user:root $old_db_dump;
chmod 660 $old_db_dump;
# Stop tomcat to flush active connections.
if [ -x /etc/init.d/tomcat6 ] ; then
if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then
invoke-rc.d tomcat6 stop
else
/etc/init.d/tomcat6 stop
fi
fi
echo "Dropping newly created empty database...";
execute_sql_as_admin "DROP DATABASE $libreplan_db;"
echo "Trying to apply upgrades to old database..."
echo "*:*:*:*:$navalplan_passwd" > $PGPASSFILE
dpkg --compare-versions $old_version "<<" "1.0.0-1"
if [ $? -eq 0 ]; then
install_upgrade_to "1.0.0"
fi
dpkg --compare-versions $old_version "<<" "1.1.0-1"
if [ $? -eq 0 ]; then
install_upgrade_to "1.1.0"
fi
dpkg --compare-versions $old_version "<<" "1.2.0-1"
if [ $? -eq 0 ]; then
install_upgrade_to "1.2.0"
fi
echo "Dumping old database..."
su - -s /bin/sh $navalplan_admin_user -c "pg_dump $navalplan_db >> $old_db_dump" > /dev/null
echo "Creating and populating new database...";
execute_sql_as_admin "CREATE DATABASE $libreplan_db;"
execute_sql_as_admin "GRANT ALL PRIVILEGES ON DATABASE $libreplan_db TO $libreplan_user;"
execute_sql_as_admin "ALTER DATABASE $libreplan_db OWNER TO $libreplan_user;"
echo "*:*:*:*:$libreplan_passwd" > $PGPASSFILE
push_sql_from_file_as_user $old_db_dump $libreplan_user $libreplan_db
rm $PGPASSFILE $old_db_dump
fi
#DEBHELPER#

7
debian/rules vendored
View file

@ -81,13 +81,16 @@ install:
# Copy SQL upgrade script for version 1.1.0 # Copy SQL upgrade script for version 1.1.0
$(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.1.0.sql \ $(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.1.0.sql \
$(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.1.0) $(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.1.0)
# Copy SQL upgrade script for version 1.2.0
$(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.2.0.sql \
$(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.0)
# Install Policy file # Install Policy file
$(call CMD,mkdir -p $(CURDIR)/debian/tmp/etc/tomcat6/policy.d) $(call CMD,mkdir -p $(CURDIR)/debian/tmp/etc/tomcat6/policy.d)
$(call CMD,cp $(CURDIR)/debian/51libreplan.policy \ $(call CMD,cp $(CURDIR)/debian/51libreplan.policy \
$(CURDIR)/debian/tmp/etc/tomcat6/policy.d/) $(CURDIR)/debian/tmp/etc/tomcat6/policy.d/)
# Link Java PostgreSQL library # Link Java PostgreSQL library
$(call CMD,mkdir -p $(CURDIR)/debian/tmp/usr/share/tomcat6/lib) #$(call CMD,mkdir -p $(CURDIR)/debian/tmp/usr/share/tomcat6/lib)
$(call CMD,ln -sf /usr/share/java/postgresql-jdbc3.jar $(CURDIR)/debian/tmp/usr/share/tomcat6/lib) #$(call CMD,ln -sf /usr/share/java/postgresql-jdbc3.jar $(CURDIR)/debian/tmp/usr/share/tomcat6/lib)
$(call CMD,dh_install) $(call CMD,dh_install)
binary-indep: build install binary-indep: build install

View file

@ -44,9 +44,9 @@ work as ``.zul`` page still does not exist.
If you want to run LibrePlan in development mode you need to follow the next If you want to run LibrePlan in development mode you need to follow the next
instructions: instructions:
* Create a PostgreSQL database called ``navaldev`` with permissions for a * Create a PostgreSQL database called ``libreplandev`` with permissions for a
user ``naval`` with password ``naval`` (see ``INSTALL`` file for other user ``libreplan`` with password ``libreplan`` (see ``INSTALL`` file for
databases and more info). other databases and more info).
* Compile LibrePlan with the following command from project root folder:: * Compile LibrePlan with the following command from project root folder::

View file

@ -82,9 +82,9 @@ this behaviour and use it in all the tasks they want.
If you want to run LibrePlan in development mode you need to follow the next If you want to run LibrePlan in development mode you need to follow the next
instructions: instructions:
* Create a PostgreSQL database called ``navaldev`` with permissions for a * Create a PostgreSQL database called ``libreplandev`` with permissions for a
user ``naval`` with password ``naval`` (see ``HACKING`` file for other user ``libreplan`` with password ``libreplan`` (see ``HACKING`` file for
databases and more info). other databases and more info).
* Compile LibrePlan with the following command from project root folder:: * Compile LibrePlan with the following command from project root folder::
@ -2637,7 +2637,7 @@ developing new web services. For each web service, some test scripts are
provided in order to check implementation. provided in order to check implementation.
.. _LibrePlan: http://www.libreplan.org/en/ .. _LibrePlan: http://www.libreplan.com/
.. _CRUD: http://en.wikipedia.org/wiki/Create,_read,_update_and_delete .. _CRUD: http://en.wikipedia.org/wiki/Create,_read,_update_and_delete
.. _Hibernate: http://www.hibernate.org/ .. _Hibernate: http://www.hibernate.org/
.. _`Optimistic Locking`: http://en.wikipedia.org/wiki/Optimistic_locking .. _`Optimistic Locking`: http://en.wikipedia.org/wiki/Optimistic_locking

View file

@ -5,9 +5,9 @@ $ sudo apt-get install postgresql
$ sudo su -c "psql" postgres $ sudo su -c "psql" postgres
<----------------- Executar os seguintes comandos SQL ---------- <----------------- Executar os seguintes comandos SQL ----------
create database navaldev; create database libreplandev;
create user naval with password 'naval'; create user libreplan with password 'libreplan';
grant all privileges on database navaldev to naval; grant all privileges on database libreplandev to libreplan;
\q \q
------------------------------------------------------------------ ------------------------------------------------------------------
@ -40,9 +40,9 @@ para permitir o acceso a base de datos
<Resource name="jdbc/libreplan-ds" auth="Container" <Resource name="jdbc/libreplan-ds" auth="Container"
type="javax.sql.DataSource" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" maxActive="100" maxIdle="30" maxWait="10000"
username="naval" password="naval" username="libreplan" password="libreplan"
driverClassName="org.postgresql.Driver" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost/navaldev"/> url="jdbc:postgresql://localhost/libreplandev"/>
... ...
</Context> </Context>
---------------------- --------------------------------------- ---------------------- ---------------------------------------
@ -96,4 +96,4 @@ Neste intre a aplicación debería estar accesible en : http://localhost:8080/li
------------------------------------------------------------------------ ------------------------------------------------------------------------
Se quixeramos facer un volcado da base de datos so precisariamos empregar o seguinte comando, isto non é necesario para a instalación. Se quixeramos facer un volcado da base de datos so precisariamos empregar o seguinte comando, isto non é necesario para a instalación.
$ pg_dump -h localhost -U naval -c -F p -v -f bdxestionproducion.dump navaldev $ pg_dump -h localhost -U libreplan -c -F p -v -f bdxestionproducion.dump libreplandev

View file

@ -6,7 +6,7 @@ Introduction
The purpose of this document is to describe the features of LibrePlan and provide user information on how to configure and use the application. The purpose of this document is to describe the features of LibrePlan and provide user information on how to configure and use the application.
LibrePlan is an opensource web application for project planning. Its main goal is to provide a complete solution for company project management. LibrePlan is an opensource web application for project planning. Its main goal is to provide a complete solution for company project management.
For any specific information you may need about this software, please contact the development team at http://www.libreplan.org/en/contact For any specific information you may need about this software, please contact the development team at http://www.libreplan.com/contact/
.. figure:: images/company_view.png .. figure:: images/company_view.png

View file

@ -4,16 +4,20 @@ Assignment of resources
.. asigacion_ .. asigacion_
.. contents:: .. contents::
The assignment of resources is one of the program's most important features, and can be carried out in two different ways: The assignment of resources is one of the program's most important features,
and can be carried out in two different ways:
* Specific assignment. * Specific assignment.
* Generic assignment. * Generic assignment.
Both types of assignment are explained in the following sections. Both types of assignment are explained in the following sections.
To carry out either of the two types of resource assignment, the following steps are necessary: To carry out either of the two types of resource assignment, the following
steps are necessary:
* Go to the planning of an order. * Go to the planning of an order.
* Right click on the task to be planned. * Right click on the task to be planned.
.. figure:: images/resource-assignment-planning.png .. figure:: images/resource-assignment-planning.png
@ -23,16 +27,37 @@ To carry out either of the two types of resource assignment, the following steps
* The program shows a screen in which the following information can be viewed: * The program shows a screen in which the following information can be viewed:
* List of criteria that must be fulfilled. For each hour group, a list of hour groups is shown, each of which requires a list of criteria. * List of criteria that must be fulfilled. For each hour group, a list of
* Task information: start and end date of the task. hour groups is shown, each of which requires a list of criteria.
* Type of calculation: The system allows users to choose the strategy to be used to calculate assignments:
* Calculate number of hours: This calculates the number of hours required to be devoted to the assigned resources, which are given an end date and a resource number per day. * Task information: start and end date of the task.
* Calculate end date: This calculates the end date of the task based on the number of task resources and the total number of hours to finish the task.
* Calculate number of resources: This calculates the number of resources required to finish the task on a specific date and devotes a known number of hours to them.
* Recommended assignment: This option allows the program to gather criteria that must be fulfilled and the total number of hours from all hour groups, and then recommends a generic assignment. If there was a prior assignment, the system deletes it and replaces it with the new one. * Type of calculation: The system allows users to choose the strategy to
* Assignments: A list of assignments that have been carried out. This list shows the generic assignments (the number will be the list of fulfilled criteria, and the number of hours and resources per day). Every assignment carried out can be explicitly removed by clicking the delete button. be used to calculate assignments:
* Calculate number of hours: This calculates the number of hours
required to be devoted to the assigned resources, which are given an
end date and a resource number per day.
* Calculate end date: This calculates the end date of the task based on
the number of task resources and the total number of hours to finish
the task.
* Calculate number of resources: This calculates the number of resources
required to finish the task on a specific date and devotes a known
number of hours to them.
* Recommended assignment: This option allows the program to gather
criteria that must be fulfilled and the total number of hours from all
hour groups, and then recommends a generic assignment. If there was
a prior assignment, the system deletes it and replaces it with the new
one.
* Assignments: A list of assignments that have been carried out. This list
shows the generic assignments (the number will be the list of fulfilled
criteria, and the number of hours and resources per day). Every
assignment carried out can be explicitly removed by clicking the delete
button.
.. figure:: images/resource-assignment.png .. figure:: images/resource-assignment.png
:scale: 50 :scale: 50
@ -40,7 +65,9 @@ To carry out either of the two types of resource assignment, the following steps
Resource assignment Resource assignment
* Users select "Search resources". * Users select "Search resources".
* The program shows a new screen consisting of a criteria tree and a list to the right of workers that fulfil the selected criteria:
* The program shows a new screen consisting of a criteria tree and a list to
the right of workers that fulfil the selected criteria:
.. figure:: images/resource-assignment-search.png .. figure:: images/resource-assignment-search.png
:scale: 50 :scale: 50
@ -49,22 +76,34 @@ To carry out either of the two types of resource assignment, the following steps
* Users can select: * Users can select:
* Specific assignment. See the "Specific assignment" section to find out what is involved when choosing this option. * Specific assignment. See the "Specific assignment" section to find out
* Generic assignment. See the "Generic assignment" section to find out what is involved when choosing this option. what is involved when choosing this option.
* Users select a list of criteria (generic) or a list of workers (specific). A multiple-choice selection is performed by pressing the "Ctrl" button when clicking each worker/criterion. * Generic assignment. See the "Generic assignment" section to find out
what is involved when choosing this option.
* Users then click the "Select" button. It is important to remember that if a generic assignment is not marked, users need to choose a worker or machine to perform an assignment. If this is not done, it is sufficient for users to choose one or several criteria. * Users select a list of criteria (generic) or a list of workers (specific).
A multiple-choice selection is performed by pressing the "Ctrl" button
when clicking each worker/criterion.
* The program then shows the selected criteria or resource list on the list of assignments from the original resource assignment screen. * Users then click the "Select" button. It is important to remember that if
a generic assignment is not marked, users need to choose a worker or
machine to perform an assignment. If this is not done, it is sufficient
for users to choose one or several criteria.
* Users must choose the hours or resources per day depending on the assignment method used on the program. * The program then shows the selected criteria or resource list on the list
of assignments from the original resource assignment screen.
* Users must choose the hours or resources per day depending on the
assignment method used on the program.
Specific assignment Specific assignment
=================== ===================
This is the specific assignment of a resource to a project task, i.e. the user decides which specific "name and surname(s)" or "machine" must be assigned to a task. This is the specific assignment of a resource to a project task, i.e. the
user decides which specific "name and surname(s)" or "machine" must be
assigned to a task.
Specific assignment can be carried out on the screen shown in this image: Specific assignment can be carried out on the screen shown in this image:
@ -74,20 +113,38 @@ Specific assignment can be carried out on the screen shown in this image:
Specific resource assignment Specific resource assignment
When a resource is specifically assigned, the program creates daily assignments in relation to the percentage of daily assigned resources selected, by previously comparing it with the available resource calendar. For example, an assignment of 0.5 resources for a 32-hour task means that 4 hours per day are assigned to the specific resource to fulfil the task (supposing a working calendar of 8 hours per day). When a resource is specifically assigned, the program creates daily
assignments in relation to the percentage of daily assigned resources
selected, by previously comparing it with the available resource calendar.
For example, an assignment of 0.5 resources for a 32-hour task means that
4 hours per day are assigned to the specific resource to fulfil the
task (supposing a working calendar of 8 hours per day).
Specific machine assignment Specific machine assignment
--------------------------- ---------------------------
Specific machine assignment functions in the same way as that for workers. When a machine is assigned a task, the system stores a specific assignment of hours for the chosen machine. The main difference is that the system searches the list of assigned workers or criteria at the moment the machine is assigned: Specific machine assignment functions in the same way as that for workers.
When a machine is assigned a task, the system stores a specific assignment
of hours for the chosen machine. The main difference is that the system
searches the list of assigned workers or criteria at the moment the machine
is assigned:
* If the machine has a list of assigned workers, the program chooses from those that are required by the machine for the assigned calendar. For example, if the machine calendar is 16 hours per day and the resource calendar is 8 hours, two resources are assigned from the list of available resources. * If the machine has a list of assigned workers, the program chooses from
* If the machine has one or several assigned criteria, generic assignments are carried out from among the resources that fulfil the criteria assigned to the machine. those that are required by the machine for the assigned calendar. For
example, if the machine calendar is 16 hours per day and the resource
calendar is 8 hours, two resources are assigned from the list of available
resources.
* If the machine has one or several assigned criteria, generic assignments
are carried out from among the resources that fulfil the criteria assigned
to the machine.
Generic assignment Generic assignment
================== ==================
Generic assignment occurs when users do not choose resources specifically, but leave the decision to the program, which distributes the loads among the company's available resources. Generic assignment occurs when users do not choose resources specifically,
but leave the decision to the program, which distributes the loads among the
company's available resources.
.. figure:: images/asignacion-xenerica.png .. figure:: images/asignacion-xenerica.png
:scale: 50 :scale: 50
@ -97,42 +154,77 @@ Generic assignment occurs when users do not choose resources specifically, but l
The assignment system uses the following assumptions as a basis: The assignment system uses the following assumptions as a basis:
* Tasks have criteria that are required from resources. * Tasks have criteria that are required from resources.
* Resources are configured to fulfil criteria. * Resources are configured to fulfil criteria.
However, the system does not fail when criteria have not been assigned, but when all resources fulfil the non-requirement of criteria. However, the system does not fail when criteria have not been assigned, but
when all resources fulfil the non-requirement of criteria.
The generic assignment algorithm functions in the following way: The generic assignment algorithm functions in the following way:
* All resources and days are treated as containers where daily assignment of hours fit, based on the maximum assignment capacity in the task calendar. * All resources and days are treated as containers where daily assignment of
hours fit, based on the maximum assignment capacity in the task calendar.
* The system searches for the resources that fulfil the criterion. * The system searches for the resources that fulfil the criterion.
* The system analyses which assignments currently have different resources that fulfil criteria.
* The resources that fulfil the criteria are chosen from those that have sufficient availability. * The system analyses which assignments currently have different resources
* If freer resources are not available, assignments are made to the resources that have less availability. that fulfil criteria.
* Over-assignment of resources only starts when all the resources that fulfil the respective criteria are 100% assigned until the total amount required to carry out the task is attained.
* The resources that fulfil the criteria are chosen from those that have
sufficient availability.
* If freer resources are not available, assignments are made to the
resources that have less availability.
* Over-assignment of resources only starts when all the resources that
fulfil the respective criteria are 100% assigned until the total amount
required to carry out the task is attained.
Generic machine assignment Generic machine assignment
-------------------------- --------------------------
Generic machine assignment functions in the same way as worker assignment. For example, when a machine is assigned to a task, the system stores a generic assignment of hours for all machines that fulfil the criteria as described for the resources in general. However, in addition, the system performs the following procedure for machines: Generic machine assignment functions in the same way as worker assignment.
For example, when a machine is assigned to a task, the system stores
a generic assignment of hours for all machines that fulfil the criteria as
described for the resources in general. However, in addition, the system
performs the following procedure for machines:
* For all machines chosen for generic assignment: * For all machines chosen for generic assignment:
* It collects the machine's configuration information: alpha value, assigned workers and criteria. * It collects the machine's configuration information: alpha value,
* If the machine has an assigned list of workers, the program chooses the number required by the machine depending on the assigned calendar. For example, if the machine calendar is 16 hours per day and the resource calendar is 8 hours, the program assigns two resources from the list of available resources. assigned workers and criteria.
* If the machine has one or several assigned criteria, the program makes generic assignments from among the resources that fulfil the criteria assigned to the machine.
* If the machine has an assigned list of workers, the program chooses the
number required by the machine depending on the assigned calendar. For
example, if the machine calendar is 16 hours per day and the resource
calendar is 8 hours, the program assigns two resources from the list of
available resources.
* If the machine has one or several assigned criteria, the program makes
generic assignments from among the resources that fulfil the criteria
assigned to the machine.
Advanced assignment Advanced assignment
=================== ===================
Advanced assignments allow users to design assignments that are automatically carried out by the application in order to personalise them. This procedure allows users to manually choose the daily hours that are dedicated by resources to tasks that are assigned or define a function that is applied to the assignment. Advanced assignments allow users to design assignments that are
automatically carried out by the application in order to personalise them.
This procedure allows users to manually choose the daily hours that are
dedicated by resources to tasks that are assigned or define a function that
is applied to the assignment.
The steps to follow in order to manage advanced assignments are: The steps to follow in order to manage advanced assignments are:
* Go to the advanced assignment window. There are two ways to access advanced assignments: * Go to the advanced assignment window. There are two ways to access advanced assignments:
* Go to a specific order and change the view to advanced assignment. In this case, all the tasks on the order and assigned resources (specific and generic) will be shown. * Go to a specific order and change the view to advanced assignment. In
* Go to the resource assignment window by clicking the "Advanced assignment" button. In this case, the assignments that show the resources (generic and specific) assigned for a task will be shown. this case, all the tasks on the order and assigned resources (specific
and generic) will be shown.
* Go to the resource assignment window by clicking the "Advanced
assignment" button. In this case, the assignments that show the
resources (generic and specific) assigned for a task will be shown.
.. figure:: images/advance-assignment.png .. figure:: images/advance-assignment.png
:scale: 45 :scale: 45
@ -141,25 +233,45 @@ The steps to follow in order to manage advanced assignments are:
* Users can choose the required zoom level they want: * Users can choose the required zoom level they want:
* If the chosen zoom is more than one day. If users change the assigned hour value to a week, month, four-month or six-month period, the system distributes the hours lineally for all days throughout the chosen period. * If the chosen zoom is more than one day. If users change the assigned
* If the chosen zoom is one day. If users change the assigned hour value to a day, these hours only apply to a day. Consequently, users can decide how many hours they want to assign per day to task resources. hour value to a week, month, four-month or six-month period, the system
distributes the hours lineally for all days throughout the chosen
period.
* If the chosen zoom is one day. If users change the assigned hour value
to a day, these hours only apply to a day. Consequently, users can
decide how many hours they want to assign per day to task resources.
* Users can choose to design an advanced assignment function. In order to do so, users have to: * Users can choose to design an advanced assignment function. In order to do so, users have to:
* Choose the function on the selection list that appears at the side of each resource and click "Configure". * Choose the function on the selection list that appears at the side of
* The system shows a new window if the chosen function needs to be specifically configured. Supported functions: each resource and click "Configure".
* Segments: A function that allows users to define segments to which a polynomial function is applied. The function per segment is configured as follows: * The system shows a new window if the chosen function needs to be
specifically configured. Supported functions:
* Segments: A function that allows users to define segments to which
a polynomial function is applied. The function per segment is
configured as follows:
* Date. Date on which the segment ends. If the following value is established (length), the date is calculated, alternatively, length is calculated. * Date. Date on which the segment ends. If the following value is
* Defining the length of each segment. This indicates what percentage of the task's duration is required for the segment. established (length), the date is calculated, alternatively, length is
* Defining the amount of work. This indicates what workload percentage is expected to be completed in this segment. The quantity of work must be incremental. For example, if there is a 10% segment, the next one must be larger (for example, 20%). calculated.
* Segment graphs and accumulated loads.
* Defining the length of each segment. This indicates what percentage of
the task's duration is required for the segment.
* Users then click "Accept". * Defining the amount of work. This indicates what workload percentage
* The program stores the function and applies it to the daily resource assignments. is expected to be completed in this segment. The quantity of work must
be incremental. For example, if there is a 10% segment, the next one
must be larger (for example, 20%).
* Segment graphs and accumulated loads.
* Users then click "Accept".
* The program stores the function and applies it to the daily resource
assignments.
.. figure:: images/stretches.png .. figure:: images/stretches.png
:scale: 40 :scale: 40

View file

@ -1,17 +1,21 @@
Reports Reports
######## #######
.. _informes: .. _informes:
.. contents:: .. contents::
Reports "LibrePlan" is integrated with *JasperReports* to manage reports, which allows users to enter various reports to analyse available data in the program.
=======
The defined reports are:
"LibrePlan" is integrated with *JasperReports* to manage reports, which allows users to enter various reports to analyse available data in the program.
.. raw:: html
The defined reports are:
<ul>
#. `Report on worked hours by resource <15-1-report-hours-worked-by-resource.html>`__ <li>
#. `Report on the total hours worked by resource in a month <15-2-total-hours-by-resource-month.html>`__ <a href="15-1-report-hours-worked-by-resource.html">Report on worked hours by resource</a>
#. `Report on the work and progress per report <15-3-work-progress-per-project.html>`__ </li><li>
<a href="15-2-total-hours-by-resource-month.html">Report on the total hours worked by resource in a month</a>
</li><li>
<a href="15-3-work-progress-per-project.html">Report on the work and progress per report</a>
</ul>

View file

@ -0,0 +1,83 @@
LDAP Configuration
##################
.. contents::
This screen allows to establish a connection with LDAP to delegate
authentication and/or authorization.
It is divided in four different areas related which are explained below:
Activation
==========
This area is used to set the properties about the way in which *LibrePlan* uses
LDAP.
If the field *Enable LDAP authentication* is checked, *LibrePlan* will look in
LDAP each time an user tries to login in the application.
The field *Use LDAP roles* checked means that a mapping between LDAP roles and
LibrePlan roles is established, so the permissions for an user in LibrePlan
will depend on the roles in LDAP that the user has.
Configuration
=============
This section has the parameter values for accessing LDAP.*Base, UserDN and
Password* are parameters used to connect to LDAP and search for the users, so
given user must have permission to do that operation in LDAP. At bottom part of
this section there is a button to check if LDAP connection is possible with the
given parameters. It is a good idea to try it before continuing the
configuration.
Authentication
==============
Here can be configured the property in LDAP nodes where should be found the
given login name. The property *UserId* must be filled with the name of the
property where the login name is stored in LDAP.
The checkbox *Save passwords in database* when it is checked, means that the
password is stored also in LibrePlan database. In this way, if LDAP is offline
or unreachable, LDAP users could authenticate against LibrePlan database. If it
is not checked, LDAP users can only be authenticated against LDAP.
Authorization
=============
This section allows to define an strategy for matching LDAP roles with
LibrePlan roles. In fact, the first choice is the strategy to use, depending on
LDAP implementation.
Group strategy
--------------
When this strategy is used, it means that LDAP has a role-group strategy. It
means that users in LDAP are nodes that hang directly from a branch which
represents the group. In this way, considering as example an LDAP with a branch
(group) called *Admin* and two nodes (users) in the branch called *John* and
*William*, an administrator could assign to both users a role in LibrePlan. The
only parameter needed in this case is the *Group path* that represents the path
in LDAP to find the branches with the groups.
Property strategy
-----------------
When administrator decides to use this strategy, it means that each user is a
LDAP node and in the node exists a property that represents the group(s) for
the user. In this case, the configuration needs two parameters:
* *Role property*. It represents the property in user's node in LDAP which
contains all the roles for that user.
* *Role search query*. It represents the path in LDAP to find the nodes of
the users; in this case, note that is important to know that string
"[USER_ID]" represents the place where the login name given in the login
form should be placed to get the correct user's node in LDAP.
At the bottom of this section there is a table with all the LibrePlan roles and
a text field next to each one. This is for matching roles. For instance, if
administrator decides that *Administration* LibrePlan role matches with *admin*
and *administrators* roles of LDAP, in the text field should appear:
"admin;administrators". The character for splitting roles is ";".

View file

@ -31,7 +31,7 @@ Written by
LibrePlan Team LibrePlan Team
-------------- --------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es> * Cristina Alvariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com> * Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com> * Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com> * Xavier Castaño García <xcastanho@igalia.com>
@ -79,6 +79,6 @@ Inside the global scope that LibrePlan is designed for regarding planning manage
This project was part of Plan Avanza: This project was part of Plan Avanza:
.. figure:: images/avanza.gif .. figure:: images/avanza.png
:scale: 100 :scale: 100

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -23,4 +23,5 @@
12-formularios-calidad Xavier Castaño (xcastanho@igalia.com) 12-formularios-calidad Xavier Castaño (xcastanho@igalia.com)
13-usuarios Xavier Castaño (xcastanho@igalia.com) 13-usuarios Xavier Castaño (xcastanho@igalia.com)
14-custos Xavier Castaño (xcastanho@igalia.com) 14-custos Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com) 15-informes Xavier Castaño (xcastanho@igalia.com)
16-ldap-authentication Ignacio Diaz Teijido (ignacio.diaz@cafedered.com)y Javier Moran Rua (jmoran@igalia.com)

View file

@ -12,7 +12,7 @@ proyectos. Su objetivo principal es proporcionar una solución completa para la
gestión de los proyectos de la empresa. gestión de los proyectos de la empresa.
Para cualquier información específica que necesites sobre este software, por Para cualquier información específica que necesites sobre este software, por
favor ponte en contacto con el equipo de desarrollo en favor ponte en contacto con el equipo de desarrollo en
http://www.libreplan.org/es/contacto http://www.libreplan.com/contact/
.. figure:: images/company_view.png .. figure:: images/company_view.png

View file

@ -0,0 +1,90 @@
Configuracion LDAP
##################
.. contents::
Esta pantalla permite establecer una conexión LDAP para delegar autenticación y/o autorización.
Está dividida en catro áreas diferentes relacionadas que se explican debajo:
Activación
==========
Esta área se usa para establecer las propiedades que configuran como *LibrePlan* usa LDAP.
Si el campo *Habilita autenticación LDAP* está marcado, *LibrePlan* utiliza el
LDAP para autenticar cada vez que el usuario intenta entrar en la aplicación.
El campo *Usar LDAP roles* marcado significa que el mapping entre el roles LDAP
y roles LibrePlan está establecido, de manera que los permisos en LibrePlan dependen
de los roles que el usuario tiene en el LDAP.
Configuración
=============
Esta sección tiene los parámentros para el acceso al LDAP. Los parámetros
*Base, UserDN y Password* son los parámetros para conectar al LDAP y buscar a
los usuarios. El usuario configurado debe tener permiso en
el LDAP. En la última parte de esta sección hay un botón para comprobar que la
conexión con el LDAP es posible con los parámetros configurados. Es una buena idea
probar la conexión antes de continuar con la configuración.
Autenticación
=============
En esta sección se configuran la propiedad de los nodos de LDAP donde se
encuentra almacenada el login del usuario. La propiedad *UserId* debe ser
rellenado con el nombre de la propiedad donde el login está almacenado en el
LDAP.
El checkbox *Almacenar contraseñas en la base de datos* cuando se encuentra
marcado, indica que la contraseña se almacena también en la base de datos
LibrePlan. De esta forma, si el LDAP está offline o no existe conectividad, los
usuarios del LDAP pueden autenticarse contra la base de datos de LibrePlan. Si
no está marcado, los usuario de LDAP sólo pueden ser autenticados contro el
LDAP.
Autorización
============
Esta sección permite definir la estrategia para asociar los roles de LDAP con
los roles de LibrePlan.
Estrategia de grupo
-------------------
Cuando se usa esta estrategia, implica que el LDAP está usando una estrageia de
grupo de rol. Significa que los usuarios en el LDAP son nodos que cuelgan
directamente de una rama que representa el grupo. Un ejemplo de ello sería tener
un LDAP con una rama (grupo) llamada *Admin* y que tuviera debajo dos nodos
(usuarios) llamados *John* y *William*. En este caso un administrador de
LibrePlan podría asignar ambos usuarios a un rol en LibrePlan.
El único parámetro en este caso es el *Path de grupo* que representa la ruta en
LDAP para encontras las ramas que representan los grupos.
Estrategia de propiedad
-----------------------
Cuando un usuario administrador decide usar esta estrategia, implica que cada
usuario es un nodo de LDAP y que en el nodo existe una propiedad que representa
el grupo o grupos al que pertenece el usuairo. En este caso, la configuración
necesita dos parámetros:
* *Propiedad del rol*. Representa la propiedad en el nodo del usuario que
contiene todos los roles para el mismo.
* *Consulta para la búsqueda de roles*. Representa la ruta en el LDAP para
encontrar los nodos de los usuarios. En este caso, hay que tener en cuenta que
la cadena "[USER_ID]" representa el lugar en el que el nombre del usuario
proporcionado en el formulario de entrada debe ser situado para obtener el
nodo apropiado correspondiente al usuario en el LDAP.
En el fondo de la pantalla de esta sección hay una tabla con todos los roles de
LibrePlan y un campo de texto anexo a cada uno de ellos. Esta área es para la
asociación de los roles. Por ejemplo, si un usuario administrador de LibrePlan
decide que rol de LibrePlan *Administración* se corresponde con los roles
*admin* y *administrators* del LDAP en el campo de texto hay que configurar:
"admin;administrators". El carácter de separación de roles es ";".

View file

@ -28,7 +28,7 @@ Escrito por
Equipo de LibrePlan Equipo de LibrePlan
------------------- -------------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es> * Cristina Alvariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com> * Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com> * Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com> * Xavier Castaño García <xcastanho@igalia.com>

View file

@ -23,4 +23,5 @@
12-formularios-calidad Xavier Castaño (xcastanho@igalia.com) 12-formularios-calidad Xavier Castaño (xcastanho@igalia.com)
13-usuarios Xavier Castaño (xcastanho@igalia.com) 13-usuarios Xavier Castaño (xcastanho@igalia.com)
14-custos Xavier Castaño (xcastanho@igalia.com) 14-custos Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com) 15-informes Xavier Castaño (xcastanho@igalia.com)
16-ldap-authentication Ignacio Diaz Teijido (ignacio.diaz@cafedered.com) y Javier Moran Rua (jmoran@igalia.com)

View file

@ -12,7 +12,7 @@ proxectos. O seu obxectivo principal é proporcionar unha solución completa par
xestión dos proxectos da empresa. xestión dos proxectos da empresa.
Para calquera información específica que necesites sobre este software, por Para calquera información específica que necesites sobre este software, por
favor ponte en contacto co equipo de desenvolvemento en favor ponte en contacto co equipo de desenvolvemento en
http://www.libreplan.org/contacto http://www.libreplan.com/contact/
.. figure:: images/company_view.png .. figure:: images/company_view.png

View file

@ -0,0 +1,90 @@
Configuracion LDAP
##################
.. contents::
Esta pantalla permite establecer unha conexión LDAP para delegar autenticación e/ou autorización.
Está dividida en catro áreas diferentes relacionadas que se explican debaixo:
Activación
==========
Esta área úsase para establecer as propiedades que configuran como *LibrePlan* usa LDAP.
Se o campo *Habilita autenticación LDAP* está marcado, *LibrePlan* utiliza o
LDAP para autenticar cada vez que o usuario tenta entrar na aplicación.
O campo *Usar LDAP roles* marcado significa que o mapping entre os roles LDAP
e os roles de LibrePlan está establecido, de maneira que os permisos en LibrePlan dependen
dos roles que o usuario ten no LDAP.
Configuración
=============
Esta sección ten os parámentros para o acceso ao LDAP. Os parámetros
*Basee, UserDN e Password* son os parámetros para conectar ao LDAP e buscar aos
usuarios. O usuario configurado debe ter permiso no
LDAP. Na última parte desta sección hai un botón para comprobar que a
conexión co LDAP é posible cos parámetros configurados. É unha boa idea
probar a conexión antes de continuar coa configuración.
Autenticación
=============
Nesta sección configúranse a propiedade dos nodos de LDAP onde se atopa
almacenada o login do usuario. A propiedade *UserId* debe ser
enchido co nome da propiedade onde o login está almacenado no
LDAP.
O checkbox *Almacenar contrasinais na base de datos* cando se atopa
marcado, indica que a contrasinal se almacena tamén na base de datos
LibrePlan. Desta forma, se o LDAP está offline ou non existe conectividad, os
usuarios do LDAP poden autenticarse contra a base de datos de LibrePlan. Se
non está marcado, o usuario de LDAP só poden ser autenticados contro o
LDAP.
Autorización
============
Esta sección permite definir a estratexia para asociar os roles de LDAP cos
roles de LibrePlan.
Estratexia de grupo
-------------------
Cando se usa esta estratexia, implica que o LDAP está a usar unha estratexia de grupo
de rol. Significa que os usuarios no LDAP son nodos que colgan
directamente dunha rama que representa o grupo. Un exemplo diso sería ter
un LDAP cunha rama (grupo) chamada *Admin* e que tivese debaixo dous nodos
(usuarios) chamados *John* e *William*. Neste caso un administrador de LibrePlan
podería asignar ambos usuarios a un rol en LibrePlan.
O único parámetro neste caso é o *Path de grupo* que representa a ruta en LDAP
para atopar as ramas que representan os grupos.
Estratexia de propiedade
------------------------
Cando un usuario administrador decide usar esta estratexia, implica que cada
usuario é un nodo de LDAP e que no nodo existe unha propiedade que representa
o grupo ou grupos ao que pertence o usuairo. Neste caso, a configuración
necesita dous parámetros:
* *Propiedade do rol*. Representa a propiedade no nodo do usuario que
contén todos os roles para o mesmo.
* *Consulta para a procura de roles*. Representa a ruta no LDAP para
atopar os nodos dos usuarios. Neste caso, hai que ter en conta que
a cadea "[USER_IDE]" representa o lugar no que o nome do usuario
proporcionado no formulario de entrada debe ser situado para obter o
nodo apropiado correspondente ao usuario no LDAP.
No fondo da pantalla desta sección hai unha táboa con todos os roles de LibrePlan
e un campo de texto anexo a cada un deles. Esta área é para a
asociación dos roles. Por exemplo, se un usuario administrador de LibrePlan
decide que rol de LibrePlan *Administración* correspóndese cos roles
*admin* e *administrators* do LDAP no campo de texto hai que configurar:
"admin;administrators". O carácter de separación de roles é ";".

View file

@ -28,7 +28,7 @@ Escrito por
Equipo de LibrePlan Equipo de LibrePlan
------------------- -------------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es> * Cristina Alvariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com> * Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com> * Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com> * Xavier Castaño García <xcastanho@igalia.com>

View file

@ -23,4 +23,5 @@
12-formularios-calidad Xavier Castaño (xcastanho@igalia.com) 12-formularios-calidad Xavier Castaño (xcastanho@igalia.com)
13-usuarios Xavier Castaño (xcastanho@igalia.com) 13-usuarios Xavier Castaño (xcastanho@igalia.com)
14-custos Xavier Castaño (xcastanho@igalia.com) 14-custos Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com) 15-informes Xavier Castaño (xcastanho@igalia.com)
16-ldap-authentication Ignacio Diaz Teijido (ignacio.diaz@cafedered.com) e Javier Moran Rua (jmoran@igalia.com)

View file

@ -3,6 +3,7 @@
import sys, shlex, subprocess import sys, shlex, subprocess
from optparse import OptionParser, OptionGroup from optparse import OptionParser, OptionGroup
from docutils.writers import latex2e from docutils.writers import latex2e
import re
try: try:
import locale import locale
@ -42,6 +43,23 @@ OPT.docinfo.add_option("-i", "--info", dest="docinfo",
help="Read project information from FILE") help="Read project information from FILE")
is_index_filename = re.compile(r'^[0-9]{2}-[a-zA-Z].*').match
def str_to_numeric_tuple(s):
r = []
for item in s.split("-"):
try:
r.append(int(item, 10))
except ValueError:
# Tried to convert a non-integer, bail out
break
return tuple(r)
def str_tuple_sort(a, b):
return cmp(str_to_numeric_tuple(a), str_to_numeric_tuple(b))
def optparser(*groups): def optparser(*groups):
parser.add_option_group(OPT.common) parser.add_option_group(OPT.common)
[parser.add_option_group(g) for g in groups] [parser.add_option_group(g) for g in groups]
@ -50,7 +68,12 @@ def optparser(*groups):
class DupRefsRemover(object): class DupRefsRemover(object):
def __init__(self, out): def __init__(self, out):
self.out = out if hasattr(out, "write"):
self.out = out.write
elif hasattr(out, "handle_line"):
self.out = out.handle_line
else:
raise ValueError("%r has no write/handle_line" % out)
self.ref = dict() self.ref = dict()
def handle_line(self, line): def handle_line(self, line):
@ -64,9 +87,35 @@ class DupRefsRemover(object):
else: else:
# Add reference and print it out # Add reference and print it out
self.ref[r[0]] = r[1] self.ref[r[0]] = r[1]
self.out.write(line) self.out(line)
else: else:
self.out.write(line) self.out(line)
class UnderlineXlate(object):
_XLATE = {
"#": "=",
"=": "-",
"-": "~",
"~": "^",
}
def __init__(self, out):
if hasattr(out, "write"):
self.out = out.write
elif hasattr(out, "handle_line"):
self.out = out.handle_line
else:
raise ValueError("%r has no write/handle_line" % out)
def handle_line(self, line):
sline = line.strip()
if len(sline):
if sline[0] in self._XLATE:
sline = sline.replace(sline[0], self._XLATE[sline[0]])
self.out(sline)
return
self.out(line)
@ -135,10 +184,10 @@ class LaTeXStandaloneTranslator(latex2e.LaTeXTranslator):
if self.d_class.document_class == "igaliabk": if self.d_class.document_class == "igaliabk":
self.d_class.document_class = "book" self.d_class.document_class = "book"
try: try:
del self.head_prefix[self.head_prefix.index(self.typearea)] del self.head_prefix[self.head_prefix.index(self.typearea)]
except AttributeError: except AttributeError:
pass pass
def __get_typearea(self): def __get_typearea(self):
if self._class == "igaliabk" or self._class.startswith("scr"): if self._class == "igaliabk" or self._class.startswith("scr"):
@ -239,13 +288,17 @@ class DocTool(object):
print print
out = DupRefsRemover(sys.stdout) out = DupRefsRemover(sys.stdout)
out_xlate = UnderlineXlate(out)
args = list(args)
args.sort(str_tuple_sort)
for name in args: for name in args:
if not name.endswith(".rst"): if not name.endswith(".rst"):
continue continue
f = file(name, "rU") f = file(name, "rU")
map(out.handle_line, map(is_index_filename(name) and out.handle_line or out_xlate.handle_line,
filter(lambda l: ".. contents::" not in l, filter(lambda l: ".. contents::" not in l,
f.readlines()) f.readlines())
) )
@ -263,9 +316,12 @@ class DocTool(object):
f.close() f.close()
print print
args = list(args)
args.sort(str_tuple_sort)
for name in args: for name in args:
# Skip non-RST inputs # Skip non-RST inputs
if not name.endswith(".rst"): if not name.endswith(".rst") or not is_index_filename(name):
continue continue
f = file(name, "rU") f = file(name, "rU")

View file

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.libreplan</groupId> <groupId>org.libreplan</groupId>
<artifactId>libreplan</artifactId> <artifactId>libreplan</artifactId>
<version>1.1.3</version> <version>1.2.0</version>
</parent> </parent>
<artifactId>ganttzk</artifactId> <artifactId>ganttzk</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View file

@ -1933,16 +1933,27 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
} }
public boolean hasVisibleIncomingDependencies(V task) { public boolean hasVisibleIncomingDependencies(V task) {
return isSomeVisible(graph.incomingEdgesOf(task)); return isSomeVisibleAndNotEndEnd(graph.incomingEdgesOf(task));
}
private boolean isSomeVisibleAndNotEndEnd(Set<D> dependencies) {
for (D each : dependencies) {
if (!each.getType().equals(DependencyType.END_END)
&& adapter.isVisible(each)) {
return true;
}
}
return false;
} }
public boolean hasVisibleOutcomingDependencies(V task) { public boolean hasVisibleOutcomingDependencies(V task) {
return isSomeVisible(graph.outgoingEdgesOf(task)); return isSomeVisibleAndNotStartStart(graph.outgoingEdgesOf(task));
} }
private boolean isSomeVisible(Set<D> dependencies) { private boolean isSomeVisibleAndNotStartStart(Set<D> dependencies) {
for (D each : dependencies) { for (D each : dependencies) {
if (adapter.isVisible(each)) { if (!each.getType().equals(DependencyType.START_START)
&& adapter.isVisible(each)) {
return true; return true;
} }
} }

View file

@ -58,11 +58,11 @@ resourcesLoadPanel = self;
<center border="0"> <center border="0">
<borderlayout sclass="resourcesload"> <borderlayout sclass="resourcesload">
<west size="250px" flex="true" collapsible="true" <west size="250px" flex="true" collapsible="true"
splittable="true" autoscroll="false"> splittable="true" autoscroll="false" border="0">
<borderlayout > <borderlayout>
<north border="0" height="35px" flex="true" collapsible="true"> <north border="0" height="35px" flex="true" collapsible="true">
<vbox pack="top" align="center"> <vbox pack="top" align="center">
<tree fixedLayout="true" hflex="true"> <tree fixedLayout="true" hflex="true" sclass="resourceloaddetailsContainer">
<treecols> <treecols>
<treecol label="${ganttzk_i18n:_('Name')}" height="29px"/> <treecol label="${ganttzk_i18n:_('Name')}" height="29px"/>
</treecols> </treecols>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>org.libreplan</groupId> <groupId>org.libreplan</groupId>
<artifactId>libreplan</artifactId> <artifactId>libreplan</artifactId>
<version>1.1.3</version> <version>1.2.0</version>
</parent> </parent>
<artifactId>libreplan-business</artifactId> <artifactId>libreplan-business</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View file

@ -22,12 +22,12 @@
package org.libreplan.business.calendars.daos; package org.libreplan.business.calendars.daos;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria; import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import org.libreplan.business.calendars.entities.BaseCalendar; import org.libreplan.business.calendars.entities.BaseCalendar;
import org.libreplan.business.calendars.entities.CalendarData; import org.libreplan.business.calendars.entities.CalendarData;
@ -60,6 +60,7 @@ public class BaseCalendarDAO extends IntegrationEntityDAO<BaseCalendar>
public List<BaseCalendar> getBaseCalendars() { public List<BaseCalendar> getBaseCalendars() {
List<BaseCalendar> list = list(BaseCalendar.class); List<BaseCalendar> list = list(BaseCalendar.class);
removeResourceCalendarInstances(list); removeResourceCalendarInstances(list);
Collections.sort(list);
return list; return list;
} }

View file

@ -23,7 +23,6 @@ package org.libreplan.business.calendars.entities;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -58,7 +57,7 @@ import org.libreplan.business.workingday.ResourcesPerDay;
* @author Manuel Rego Casasnovas <mrego@igalia.com> * @author Manuel Rego Casasnovas <mrego@igalia.com>
*/ */
public class BaseCalendar extends IntegrationEntity implements ICalendar, public class BaseCalendar extends IntegrationEntity implements ICalendar,
IHumanIdentifiable { IHumanIdentifiable, Comparable<BaseCalendar> {
private static final Capacity DEFAULT_VALUE = Capacity.zero() private static final Capacity DEFAULT_VALUE = Capacity.zero()
.overAssignableWithoutLimit(); .overAssignableWithoutLimit();
@ -83,23 +82,6 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar,
return calendar; return calendar;
} }
public static List<BaseCalendar> sortByName(List<BaseCalendar> baseCalendars) {
Collections.sort(baseCalendars, new Comparator<BaseCalendar>() {
@Override
public int compare(BaseCalendar o1, BaseCalendar o2) {
if (o2.getName() == null) {
return -1;
}
if (o1.getName() == null) {
return 1;
}
return o1.getName().compareTo(o2.getName());
}
});
return baseCalendars;
}
private static void resetDefaultCapacities(BaseCalendar calendar) { private static void resetDefaultCapacities(BaseCalendar calendar) {
CalendarData calendarData = calendar.getLastCalendarData(); CalendarData calendarData = calendar.getLastCalendarData();
if (calendarData != null) { if (calendarData != null) {
@ -1227,4 +1209,9 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar,
return name; return name;
} }
@Override
public int compareTo(BaseCalendar calendar) {
return this.getName().compareToIgnoreCase(calendar.getName());
}
} }

View file

@ -47,11 +47,11 @@ public class CalendarBootstrap implements ICalendarBootstrap {
@Override @Override
@Transactional @Transactional
public void loadRequiredData() { public void loadRequiredData() {
for (PredefinedCalendarExceptionTypes type : PredefinedCalendarExceptionTypes if (calendarExceptionTypeDAO.getAll().size() == 0) {
.values()) { for (PredefinedCalendarExceptionTypes type : PredefinedCalendarExceptionTypes
.values()) {
CalendarExceptionType calendarExceptionType = type CalendarExceptionType calendarExceptionType = type
.getCalendarExceptionType(); .getCalendarExceptionType();
if (!calendarExceptionTypeDAO.existsByName(calendarExceptionType)) {
calendarExceptionType calendarExceptionType
.setCode(entitySequenceDAO .setCode(entitySequenceDAO
.getNextEntityCodeWithoutTransaction(EntityNameEnum.CALENDAR_EXCEPTION_TYPE)); .getNextEntityCodeWithoutTransaction(EntityNameEnum.CALENDAR_EXCEPTION_TYPE));

View file

@ -291,7 +291,8 @@ public class Configuration extends BaseEntity {
} }
public ProgressType getProgressType() { public ProgressType getProgressType() {
return progressType; return (progressType == null) ? ProgressType.SPREAD_PROGRESS
: progressType;
} }
public void setCompanyLogoURL(String companyLogoURL) { public void setCompanyLogoURL(String companyLogoURL) {

View file

@ -45,11 +45,11 @@ public class TypeOfWorkHoursBootstrap implements ITypeOfWorkHoursBootstrap {
@Override @Override
@Transactional @Transactional
public void loadRequiredData() { public void loadRequiredData() {
for (PredefinedTypeOfWorkHours predefinedTypeOfWorkHours : PredefinedTypeOfWorkHours if (typeOfWorkHoursDAO.findAll().size() == 0) {
.values()) { for (PredefinedTypeOfWorkHours predefinedTypeOfWorkHours : PredefinedTypeOfWorkHours
TypeOfWorkHours typeOfWorkHours = predefinedTypeOfWorkHours .values()) {
.getTypeOfWorkHours(); TypeOfWorkHours typeOfWorkHours = predefinedTypeOfWorkHours
if (!typeOfWorkHoursDAO.existsByName(typeOfWorkHours)) { .getTypeOfWorkHours();
typeOfWorkHours.setCodeAutogenerated(true); typeOfWorkHours.setCodeAutogenerated(true);
typeOfWorkHours typeOfWorkHours
.setCode(entitySequenceDAO .setCode(entitySequenceDAO

View file

@ -36,7 +36,8 @@ import org.libreplan.business.users.entities.User;
* *
* @author Jacobo Aragunde Perez <jaragunde@igalia.com> * @author Jacobo Aragunde Perez <jaragunde@igalia.com>
*/ */
public class ExternalCompany extends BaseEntity implements IHumanIdentifiable{ public class ExternalCompany extends BaseEntity implements IHumanIdentifiable,
Comparable<ExternalCompany> {
private String name; private String name;
@ -195,4 +196,9 @@ public class ExternalCompany extends BaseEntity implements IHumanIdentifiable{
return name; return name;
} }
@Override
public int compareTo(ExternalCompany company) {
return this.getName().compareToIgnoreCase(company.getName());
}
} }

View file

@ -45,8 +45,8 @@ public class LabelBootstrap implements ILabelBootstrap {
@Override @Override
@Transactional @Transactional
public void loadRequiredData() { public void loadRequiredData() {
LabelType priorityType = LabelType.create("Priority"); if (labelTypeDAO.getAll().size() == 0) {
if (!labelTypeDAO.existsByName(priorityType)) { LabelType priorityType = LabelType.create("Priority");
priorityType.setCodeAutogenerated(true); priorityType.setCodeAutogenerated(true);
priorityType.setCode(entitySequenceDAO priorityType.setCode(entitySequenceDAO
.getNextEntityCodeWithoutTransaction(EntityNameEnum.LABEL)); .getNextEntityCodeWithoutTransaction(EntityNameEnum.LABEL));

View file

@ -394,6 +394,10 @@ public class QualityForm extends BaseEntity implements IHumanIdentifiable{
this.reportAdvance = BooleanUtils.toBoolean(reportAdvance); this.reportAdvance = BooleanUtils.toBoolean(reportAdvance);
} }
public boolean getReportAdvance() {
return this.reportAdvance;
}
public AdvanceType getAdvanceType() { public AdvanceType getAdvanceType() {
return advanceType; return advanceType;
} }

View file

@ -70,15 +70,16 @@ public class CriterionsBootstrap implements ICriterionsBootstrap {
@Override @Override
@Transactional @Transactional
public void loadRequiredData() { public void loadRequiredData() {
Map<CriterionType, List<String>> typesWithCriterions = getTypesWithCriterions(); if (criterionTypeDAO.findAll().isEmpty()) {
Map<CriterionType, List<String>> typesWithCriterions = getTypesWithCriterions();
// Insert predefined criterions // Insert predefined criterions
for (Entry<CriterionType, List<String>> entry : typesWithCriterions for (Entry<CriterionType, List<String>> entry : typesWithCriterions
.entrySet()) { .entrySet()) {
CriterionType criterionType = retrieveOrCreate(entry.getKey()); CriterionType criterionType = retrieveOrCreate(entry.getKey());
// Create predefined criterions for criterionType // Create predefined criterions for criterionType
for (String criterionName : entry.getValue()) { for (String criterionName : entry.getValue()) {
ensureCriterionExists(criterionName, criterionType); ensureCriterionExists(criterionName, criterionType);
}
} }
} }
} }

View file

@ -45,12 +45,11 @@ public class WorkReportTypeBootstrap implements IWorkReportTypeBootstrap {
@Override @Override
@Transactional @Transactional
public void loadRequiredData() { public void loadRequiredData() {
for (PredefinedWorkReportTypes predefinedWorkReportType : PredefinedWorkReportTypes if (workReportTypeDAO.getWorkReportTypes().size() == 0) {
.values()) { for (PredefinedWorkReportTypes predefinedWorkReportType : PredefinedWorkReportTypes
WorkReportType workReportType = predefinedWorkReportType .values()) {
.getWorkReportType(); WorkReportType workReportType = predefinedWorkReportType
if (!workReportTypeDAO .getWorkReportType();
.existsOtherWorkReportTypeByName(workReportType)) {
workReportType.setCodeAutogenerated(true); workReportType.setCodeAutogenerated(true);
workReportType workReportType
.setCode(entitySequenceDAO .setCode(entitySequenceDAO

View file

@ -28,12 +28,20 @@ import static org.libreplan.business.test.BusinessGlobalNames.BUSINESS_SPRING_CO
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.annotation.Resource;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.libreplan.business.IDataBootstrap;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.resources.bootstrap.ICriterionsBootstrap; import org.libreplan.business.resources.bootstrap.ICriterionsBootstrap;
import org.libreplan.business.resources.daos.ICriterionDAO; import org.libreplan.business.resources.daos.ICriterionDAO;
import org.libreplan.business.resources.daos.ICriterionTypeDAO;
import org.libreplan.business.resources.daos.IResourceDAO;
import org.libreplan.business.resources.entities.CategoryCriteria; import org.libreplan.business.resources.entities.CategoryCriteria;
import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.resources.entities.CriterionType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -45,14 +53,49 @@ import org.springframework.transaction.annotation.Transactional;
@Transactional @Transactional
public class CriterionsBootstrapTest { public class CriterionsBootstrapTest {
@Resource
private IDataBootstrap configurationBootstrap;
@Autowired @Autowired
private ICriterionsBootstrap criterionsBootstrap; private ICriterionsBootstrap criterionsBootstrap;
@Autowired @Autowired
private ICriterionDAO criterionDAO; private ICriterionDAO criterionDAO;
@Autowired
private IResourceDAO resourceDAO;
@Autowired
private ICriterionTypeDAO criterionTypeDAO;
private List<Criterion> somePredefinedCriterions; private List<Criterion> somePredefinedCriterions;
@Before
public void loadRequiredaData() {
// Load data
configurationBootstrap.loadRequiredData();
cleanCriteria();
}
private void cleanCriteria() {
try {
List<org.libreplan.business.resources.entities.Resource> resources = resourceDAO
.findAll();
for (org.libreplan.business.resources.entities.Resource resource : resources) {
resourceDAO.remove(resource.getId());
}
List<CriterionType> types = criterionTypeDAO.findAll();
for (CriterionType type : types) {
criterionTypeDAO.remove(type.getId());
}
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
public CriterionsBootstrapTest() { public CriterionsBootstrapTest() {
somePredefinedCriterions = getSomePredefinedCriterions(); somePredefinedCriterions = getSomePredefinedCriterions();
} }

View file

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>org.libreplan</groupId> <groupId>org.libreplan</groupId>
<artifactId>libreplan</artifactId> <artifactId>libreplan</artifactId>
<version>1.1.3</version> <version>1.2.0</version>
</parent> </parent>
<artifactId>libreplan-webapp</artifactId> <artifactId>libreplan-webapp</artifactId>
<packaging>war</packaging> <packaging>war</packaging>

View file

@ -128,9 +128,10 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
public void save() { public void save() {
try { try {
baseCalendarModel.generateCalendarCodes();
Util.reloadBindings(editWindow);
ConstraintChecker.isValid(editWindow); ConstraintChecker.isValid(editWindow);
validateCalendarExceptionCodes(); validateCalendarExceptionCodes();
baseCalendarModel.generateCalendarCodes();
baseCalendarModel.confirmSave(); baseCalendarModel.confirmSave();
messagesForUser.showMessage(Level.INFO, _( messagesForUser.showMessage(Level.INFO, _(
"Base calendar \"{0}\" saved", baseCalendarModel "Base calendar \"{0}\" saved", baseCalendarModel
@ -143,9 +144,10 @@ public class BaseCalendarCRUDController extends GenericForwardComposer {
public void saveAndContinue() { public void saveAndContinue() {
try { try {
baseCalendarModel.generateCalendarCodes();
Util.reloadBindings(editWindow);
ConstraintChecker.isValid(editWindow); ConstraintChecker.isValid(editWindow);
validateCalendarExceptionCodes(); validateCalendarExceptionCodes();
baseCalendarModel.generateCalendarCodes();
baseCalendarModel.confirmSaveAndContinue(); baseCalendarModel.confirmSaveAndContinue();
messagesForUser.showMessage(Level.INFO, _( messagesForUser.showMessage(Level.INFO, _(
"Base calendar \"{0}\" saved", baseCalendarModel "Base calendar \"{0}\" saved", baseCalendarModel

View file

@ -1048,8 +1048,7 @@ public abstract class BaseCalendarEditionController extends
} }
public List<BaseCalendar> getParentCalendars() { public List<BaseCalendar> getParentCalendars() {
return baseCalendarModel.getSortedBaseCalendars(baseCalendarModel return baseCalendarModel.getPossibleParentCalendars();
.getPossibleParentCalendars());
} }
public List<CalendarException> getCalendarExceptions() { public List<CalendarException> getCalendarExceptions() {

View file

@ -102,13 +102,6 @@ public class BaseCalendarModel extends IntegrationEntityModel implements
return baseCalendars; return baseCalendars;
} }
@Override
@Transactional(readOnly = true)
public List<BaseCalendar> getSortedBaseCalendars(
List<BaseCalendar> baseCalendars) {
return BaseCalendar.sortByName(baseCalendars);
}
/* /*
* Initial conversation steps * Initial conversation steps
*/ */

View file

@ -208,8 +208,6 @@ public interface IBaseCalendarModel extends IIntegrationEntityModel {
BaseCalendar getCurrentParent(); BaseCalendar getCurrentParent();
List<BaseCalendar> getSortedBaseCalendars(List<BaseCalendar> baseCalendars);
Date getCurrentStartDate(); Date getCurrentStartDate();
Date getCurrentExpiringDate(); Date getCurrentExpiringDate();

View file

@ -201,15 +201,21 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
for (CustomMenuItem c : child.children) { for (CustomMenuItem c : child.children) {
if (c.contains(requestPath)) { if (c.contains(requestPath)) {
c.setActive(true); c.setActive(true);
break; return;
} }
} }
break; return;
} }
} }
break; return;
} }
} }
if (requestPath.isEmpty()) {
CustomMenuItem item = this.firstLevel.get(0);
item.setActive(true);
item.children.get(0).setActive(true);
}
} }
private OnZKDesktopRegistry<IMenuItemsRegister> getLocator() { private OnZKDesktopRegistry<IMenuItemsRegister> getLocator() {
@ -308,7 +314,9 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
if (SecurityUtils.isUserInRole(UserRole.ROLE_ADMINISTRATION)) { if (SecurityUtils.isUserInRole(UserRole.ROLE_ADMINISTRATION)) {
topItem(_("Administration / Management"), "/advance/advanceTypes.zul", "", topItem(_("Administration / Management"), "/advance/advanceTypes.zul", "",
subItem(_("LibrePlan Configuration"), "/common/configuration.zul","03-calendarios.html#calendario-por-defecto"), subItem(_("LibrePlan Configuration"),
"/common/configuration.zul",
"16-ldap-authentication.html"),
subItem(_("Users"), "/users/users.zul","13-usuarios.html#administraci-n-de-usuarios", subItem(_("Users"), "/users/users.zul","13-usuarios.html#administraci-n-de-usuarios",
subItem(_("Accounts"), "/users/users.zul","13-usuarios.html#administraci-n-de-usuarios"), subItem(_("Accounts"), "/users/users.zul","13-usuarios.html#administraci-n-de-usuarios"),
subItem(_("Profiles"), "/users/profiles.zul","13-usuarios.html#administraci-n-de-perfiles")), subItem(_("Profiles"), "/users/profiles.zul","13-usuarios.html#administraci-n-de-perfiles")),
@ -339,7 +347,7 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
subItem(_("Task Scheduling Status In Project"),"/reports/workingArrangementsPerOrderReport.zul","15-informes.html"), subItem(_("Task Scheduling Status In Project"),"/reports/workingArrangementsPerOrderReport.zul","15-informes.html"),
subItem(_("Materials Needs At Date"),"/reports/timeLineMaterialReport.zul","15-informes.html")); subItem(_("Materials Needs At Date"),"/reports/timeLineMaterialReport.zul","15-informes.html"));
topItem(_("My account"), "", "", topItem(_("My account"), "/settings/settings.zul", "",
subItem(_("Settings"), "/settings/settings.zul", ""), subItem(_("Settings"), "/settings/settings.zul", ""),
subItem(_("Change Password"), "/settings/changePassword.zul", "")); subItem(_("Change Password"), "/settings/changePassword.zul", ""));
} }

View file

@ -38,12 +38,7 @@ public class EffortDurationBox extends Textbox {
@Override @Override
protected Object unmarshall(Object value) { protected Object unmarshall(Object value) {
EffortDuration result = EffortDuration return coerceFromString((String) value);
.parseFromFormattedString((String) value);
if (result == null) {
return EffortDuration.zero();
}
return result;
} }
@Override @Override

View file

@ -19,18 +19,17 @@
package org.libreplan.web.common; package org.libreplan.web.common;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DecimalFormatSymbols;
import org.zkoss.util.Locales;
import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zul.Decimalbox; import org.zkoss.zul.Decimalbox;
/** /**
* Same behavior as a {@link Decimalbox}, but it always interprets <b>,</b> and * Same behavior as a {@link Decimalbox}, but it always interprets <b>.</b> as
* <b>.</b> as decimals separators. So you can use both freely as decimal * decimal separator, even when the locale uses a different separator.
* separators. * We also reimplement coerceToString to workaround the bug
* http://tracker.zkoss.org/browse/ZK-629.
* *
* @author Óscar González Fernández <ogonzalez@igalia.com> * @author Óscar González Fernández <ogonzalez@igalia.com>
* @author Jacobo Aragunde Pérez <jaragunde@igalia.com>
* *
*/ */
public class LenientDecimalBox extends Decimalbox { public class LenientDecimalBox extends Decimalbox {
@ -43,4 +42,8 @@ public class LenientDecimalBox extends Decimalbox {
super(value); super(value);
} }
protected String coerceToString(Object value) {
return formatNumber(value, null);
}
} }

View file

@ -45,11 +45,16 @@ public class MatrixParameters {
return extract(request.getRequestURI()); return extract(request.getRequestURI());
} }
/**
* Extracts matrix parameters but skipping "jsessionid"
*/
public static Map<String, String> extract(String string) { public static Map<String, String> extract(String string) {
Map<String, String> result = new HashMap<String, String>(); Map<String, String> result = new HashMap<String, String>();
Matcher matcher = matrixParamPattern.matcher(string); Matcher matcher = matrixParamPattern.matcher(string);
while (matcher.find()) { while (matcher.find()) {
result.put(matcher.group(1), matcher.group(2)); if (!matcher.group(1).equals("jsessionid")) {
result.put(matcher.group(1), matcher.group(2));
}
} }
return result; return result;
} }

View file

@ -192,17 +192,8 @@ public class ManageOrderElementAdvancesController extends
} }
} }
private void resetScreenHeight() {
if ((tabboxOrderElement != null)
&& (!tabboxOrderElement.getHeight().equals("620px"))) {
tabboxOrderElement.setHeight("620px");
tabboxOrderElement.invalidate();
}
}
private void reloadAdvances() { private void reloadAdvances() {
Util.reloadBindings(self); Util.reloadBindings(self);
resetScreenHeight();
setSelectedAdvanceLine(); setSelectedAdvanceLine();
} }
@ -883,7 +874,6 @@ public class ManageOrderElementAdvancesController extends
} }
((AdvanceAssignment) item.getValue()).setReportGlobalAdvance(spread); ((AdvanceAssignment) item.getValue()).setReportGlobalAdvance(spread);
Util.reloadBindings(editAdvances); Util.reloadBindings(editAdvances);
resetScreenHeight();
setSelectedAdvanceLine(); setSelectedAdvanceLine();
} }

View file

@ -36,12 +36,9 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.InvalidValue; import org.hibernate.validator.InvalidValue;
import org.libreplan.business.calendars.entities.BaseCalendar; import org.libreplan.business.calendars.entities.BaseCalendar;
import org.libreplan.business.common.Registry;
import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.externalcompanies.entities.ExternalCompany; import org.libreplan.business.externalcompanies.entities.ExternalCompany;
import org.libreplan.business.materials.daos.IMaterialCategoryDAO;
import org.libreplan.business.materials.entities.MaterialCategory;
import org.libreplan.business.orders.daos.IOrderDAO; import org.libreplan.business.orders.daos.IOrderDAO;
import org.libreplan.business.orders.entities.HoursGroup; import org.libreplan.business.orders.entities.HoursGroup;
import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.Order;
@ -1440,7 +1437,9 @@ public class OrderCRUDController extends GenericForwardComposer {
*/ */
private void checkCreationPermissions() { private void checkCreationPermissions() {
if (!SecurityUtils.isUserInRole(UserRole.ROLE_CREATE_ORDER)) { if (!SecurityUtils.isUserInRole(UserRole.ROLE_CREATE_ORDER)) {
createOrderButton.setDisabled(true); if (createOrderButton != null) {
createOrderButton.setDisabled(true);
}
} }
} }

View file

@ -375,6 +375,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
if (readOnly) { if (readOnly) {
textBox.setDisabled(true); textBox.setDisabled(true);
} }
textBox.setConstraint("no empty:" + _("cannot be empty"));
addCell(cssClass, textBox); addCell(cssClass, textBox);
} }

View file

@ -26,6 +26,7 @@ import static org.libreplan.web.I18nHelper._;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -659,6 +660,7 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel {
private void loadExternalCompaniesAreClient() { private void loadExternalCompaniesAreClient() {
this.externalCompanies = externalCompanyDAO this.externalCompanies = externalCompanyDAO
.getExternalCompaniesAreClient(); .getExternalCompaniesAreClient();
Collections.sort(this.externalCompanies);
} }
@Override @Override

View file

@ -179,7 +179,9 @@ public class CompanyPlanningController implements Composer {
item.setValue(progressType); item.setValue(progressType);
item.setLabel(_(progressType.getValue())); item.setLabel(_(progressType.getValue()));
if (getProgressTypeFromConfiguration().equals(progressType)) { ProgressType configuredProgressType = getProgressTypeFromConfiguration();
if ((configuredProgressType != null)
&& configuredProgressType.equals(progressType)) {
cbProgressTypes.setSelectedItem(item); cbProgressTypes.setSelectedItem(item);
} }
} }

View file

@ -24,21 +24,16 @@ package org.libreplan.web.qualityforms;
import static org.libreplan.web.I18nHelper._; import static org.libreplan.web.I18nHelper._;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List; import java.util.List;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.InvalidValue;
import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.qualityforms.entities.QualityForm; import org.libreplan.business.qualityforms.entities.QualityForm;
import org.libreplan.business.qualityforms.entities.QualityFormItem; import org.libreplan.business.qualityforms.entities.QualityFormItem;
import org.libreplan.business.qualityforms.entities.QualityFormType; import org.libreplan.business.qualityforms.entities.QualityFormType;
import org.libreplan.business.users.entities.Profile;
import org.libreplan.web.common.BaseCRUDController; import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.Level;
import org.libreplan.web.common.Util; import org.libreplan.web.common.Util;
import org.libreplan.web.users.ProfileCRUDController;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.WrongValueException;
@ -47,13 +42,11 @@ import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Column; import org.zkoss.zul.Column;
import org.zkoss.zul.Combobox; import org.zkoss.zul.Combobox;
import org.zkoss.zul.Constraint; import org.zkoss.zul.Constraint;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Grid; import org.zkoss.zul.Grid;
import org.zkoss.zul.ListModelExt; import org.zkoss.zul.ListModelExt;
import org.zkoss.zul.Messagebox; import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Row; import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox; import org.zkoss.zul.Textbox;
import org.zkoss.zul.impl.InputElement;
/** /**
* CRUD Controller for {@link QualityForm} * CRUD Controller for {@link QualityForm}
@ -119,7 +112,8 @@ public class QualityFormCRUDController extends BaseCRUDController<QualityForm> {
@Override @Override
protected void beforeSaving() throws ValidationException { protected void beforeSaving() throws ValidationException {
validate(); super.beforeSaving();
validateReportProgress();
} }
@Override @Override
@ -127,99 +121,6 @@ public class QualityFormCRUDController extends BaseCRUDController<QualityForm> {
qualityFormModel.confirmSave(); qualityFormModel.confirmSave();
} }
/**
* Validates all {@link Textbox} in the form
*/
private void validate() {
Textbox boxName = (Textbox) editWindow
.getFellowIfAny("qualityFormName");
validate(boxName, boxName.getValue());
List<Row> rows = gridQualityFormItems.getRows().getChildren();
for (Row row : rows) {
validate(row);
}
}
@SuppressWarnings("unchecked")
private void validate(Row row) {
for (Iterator i = row.getChildren().iterator(); i.hasNext();) {
final Component comp = (Component) i.next();
if (comp instanceof Textbox) {
validate((Textbox) comp, ((Textbox) comp).getValue());
}
if (comp instanceof Decimalbox) {
validate((Decimalbox) comp, ((Decimalbox) comp).getValue());
}
}
}
/**
* Validates {@link Textbox} checking {@link Constraint}
* @param comp
*/
private void validate(InputElement comp, Object value) {
if (comp != null && comp.getConstraint() != null) {
final Constraint constraint = comp.getConstraint();
constraint.validate(comp, value);
}
}
private void showInvalidValues(ValidationException e) {
for (InvalidValue invalidValue : e.getInvalidValues()) {
Object value = invalidValue.getBean();
if (value instanceof QualityForm) {
validateQualityForm(invalidValue);
}
if (value instanceof QualityFormItem) {
validateQualityFormItem(invalidValue);
}
}
}
private void validateQualityForm(InvalidValue invalidValue) {
Component component = editWindow.getFellowIfAny("qualityFormName");
if (component != null) {
throw new WrongValueException(component, invalidValue.getMessage());
}
}
@SuppressWarnings("unchecked")
private void validateQualityFormItem(InvalidValue invalidValue) {
Row rowItem = findQualityFormItem(gridQualityFormItems.getRows()
.getChildren(), (QualityFormItem) invalidValue.getBean());
if (rowItem != null) {
InputElement inputElement = getInputText(rowItem, invalidValue
.getPropertyName());
if (inputElement != null) {
throw new WrongValueException(rowItem, invalidValue
.getMessage());
}
}
}
private Row findQualityFormItem(List<Row> rows, QualityFormItem item) {
for (Row row : rows) {
if (item.equals(row.getValue())) {
return row;
}
}
return null;
}
private InputElement getInputText(Row row, String property) {
if (property != null) {
if (property.equals(QualityFormItem.propertyName)) {
return (InputElement) row.getFirstChild();
}
if (property.equals(QualityFormItem.propertyPercentage)) {
return (InputElement) row.getChildren().get(2);
}
}
return null;
}
public void createQualityFormItem() { public void createQualityFormItem() {
qualityFormModel.addQualityFormItem(); qualityFormModel.addQualityFormItem();
Util.reloadBindings(gridQualityFormItems); Util.reloadBindings(gridQualityFormItems);
@ -410,16 +311,14 @@ public class QualityFormCRUDController extends BaseCRUDController<QualityForm> {
predicate = getSelectedName(); predicate = getSelectedName();
} }
public void validateReportProgress(Component comp) { public void validateReportProgress() {
Checkbox checkbox = (Checkbox) comp; if ((getQualityForm().getReportAdvance())
if (checkbox != null) { && (!hasItemWithTotalPercentage())) {
if ((checkbox.isChecked()) && (!hasItemWithTotalPercentage())) { Checkbox checkBoxReportProgress = (Checkbox) editWindow
disabledCheckbocReportProgress(checkbox); .getFellowIfAny("checkBoxReportProgress");
messagesForUser throw new WrongValueException(
.showMessage( checkBoxReportProgress,
Level.ERROR, _("The quality form must have an item with 100% value to report progress"));
_("The quality form must have an item with 100% value to report progress"));
}
} }
} }

View file

@ -215,7 +215,7 @@ public class QualityFormModel implements IQualityFormModel {
@Override @Override
public Boolean isTotalPercentage(QualityFormItem item) { public Boolean isTotalPercentage(QualityFormItem item) {
return (item.getPercentage() != null) ? (item.getPercentage() return (item.getPercentage() != null) ? (item.getPercentage()
.equals(totalPercentage)) : false; .compareTo(totalPercentage) == 0) : false;
} }
@Override @Override

View file

@ -31,6 +31,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.ClassValidator; import org.hibernate.validator.ClassValidator;
@ -214,6 +215,10 @@ public abstract class TreeController<T extends ITreeNode<T>> extends
Textbox name = (Textbox) cmp.getFellow("newOrderElementName"); Textbox name = (Textbox) cmp.getFellow("newOrderElementName");
Intbox hours = (Intbox) cmp.getFellow("newOrderElementHours"); Intbox hours = (Intbox) cmp.getFellow("newOrderElementHours");
if (StringUtils.isEmpty(name.getValue())) {
throw new WrongValueException(name, _("cannot be empty"));
}
if (hours.getValue() == null) { if (hours.getValue() == null) {
hours.setValue(0); hours.setValue(0);
} }

View file

@ -246,6 +246,7 @@ public class WorkReportTypeCRUDController extends BaseCRUDController<WorkReportT
private void appendTextboBoxNameDescriptionField(final Row row) { private void appendTextboBoxNameDescriptionField(final Row row) {
Textbox boxName = new Textbox(); Textbox boxName = new Textbox();
boxName.setHflex("1");
boxName.setParent(row); boxName.setParent(row);
boxName boxName
.setConstraint(validateIfExistTheSameFieldName((DescriptionField) row .setConstraint(validateIfExistTheSameFieldName((DescriptionField) row
@ -267,6 +268,7 @@ public class WorkReportTypeCRUDController extends BaseCRUDController<WorkReportT
private void appendIntBoxLengthDescriptionField(final Row row) { private void appendIntBoxLengthDescriptionField(final Row row) {
Intbox boxLength = new Intbox(); Intbox boxLength = new Intbox();
boxLength.setHflex("1");
boxLength.setReadonly(isReadOnly()); boxLength.setReadonly(isReadOnly());
boxLength.setParent(row); boxLength.setParent(row);
boxLength.setConstraint("no negative, no zero"); boxLength.setConstraint("no negative, no zero");

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -6,8 +6,9 @@ webcommon.LenientDecimalBox = zk.$extends(zul.inp.Decimalbox,{
if(!b) { if(!b) {
return null; return null;
} }
//replace decimal comma with dot //to allow using . as decimal separator, independently of the locale
b = b.replace(',','.'); //we replace . with the actual decimal separator of the current locale
b = b.replace('.', zk.DECIMAL);
//process normally //process normally
return this.$supers('coerceFromString_', arguments); return this.$supers('coerceFromString_', arguments);
} }

View file

@ -100,6 +100,11 @@ body .advancedallocationlayout .icono .z-button-cm {
border-right:0; border-right:0;
} }
.perspectives-column .global-commands {
margin-bottom: 0;
}
.toolbar-box { .toolbar-box {
border:0; border:0;
} }
@ -1008,7 +1013,8 @@ span.perspective, span.perspective-active {
display: none; display: none;
} }
.taskdetailsContainer { .taskdetailsContainer,
.resourceloaddetailsContainer {
border-left:0; border-left:0;
border-top:0; border-top:0;
} }
@ -1138,6 +1144,10 @@ span.perspective, span.perspective-active {
border-bottom:1px solid #9ECAD8; border-bottom:1px solid #9ECAD8;
} }
.orderslayout-area > .z-center-body {
height: auto !important;
}
.orderelements-tab { .orderelements-tab {
overflow-x: auto; overflow-x: auto;
} }

View file

@ -112,13 +112,13 @@ signature="java.lang.Boolean isDefaultPasswordsControl()"?>
<center border="none"> <center border="none">
<borderlayout width="auto" height="100%"> <borderlayout width="auto" height="100%">
<!-- borderlayout class="main-layout" height="2000px" width="2000px"--> <!-- borderlayout class="main-layout" height="2000px" width="2000px"-->
<west class="perspectives-column" width="90px"> <west class="perspectives-column" width="90px" >
<vbox> <vbox vflex="1" height="100%">
<hbox id="perspectiveButtonsInsertionPoint" sclass="toolbar-box global-commands" height="30px" width="100%"> <hbox id="perspectiveButtonsInsertionPoint" sclass="toolbar-box global-commands" height="30px" width="100%">
<button id="createOrderButton" image="/common/img/ico_add.png" sclass="planner-icon" <button id="createOrderButton" image="/common/img/ico_add.png" sclass="planner-icon"
tooltiptext="${i18n:_('Create New Project')}" /> tooltiptext="${i18n:_('Create New Project')}" />
</hbox> </hbox>
<vbox id="registeredItemsInsertionPoint" width="90px"/> <vbox id="registeredItemsInsertionPoint" width="90px" style="overflow-y:auto;overflow-x:hidden;display:block" vflex="1" />
</vbox> </vbox>
</west> </west>
<center self="@{insert(content)}" class="main-area" autoscroll="true" /> <center self="@{insert(content)}" class="main-area" autoscroll="true" />

View file

@ -29,7 +29,7 @@
<newdatasortablecolumn label="${i18n:_('Client')}" /> <newdatasortablecolumn label="${i18n:_('Client')}" />
<newdatasortablecolumn label="${i18n:_('Subcontractor')}" /> <newdatasortablecolumn label="${i18n:_('Subcontractor')}" />
<newdatasortablecolumn label="${i18n:_('Associated user')}" /> <newdatasortablecolumn label="${i18n:_('Associated user')}" />
<newdatasortablecolumn label="${i18n:_('Actions')}" /> <newdatasortablecolumn label="${i18n:_('Operations')}" />
</columns> </columns>
<rows> <rows>
<row self="@{each='company'}" value="@{company}" onClick="controller.goToEditForm(self.value)"> <row self="@{each='company'}" value="@{company}" onClick="controller.goToEditForm(self.value)">

View file

@ -35,12 +35,11 @@
title="@{i18n:_('Edit task')}" title="@{i18n:_('Edit task')}"
width="950px" width="950px"
left="50px" left="50px"
top="50px"
visible="false" visible="false"
closable="true" closable="true"
onClose="orderElementController.close(event)" > onClose="orderElementController.close(event)" >
<tabbox height="560px" id="tabboxOrderElement"> <tabbox id="tabboxOrderElement">
<tabs> <tabs>
<tab id="tabDetails" label="${i18n:_('Details')}" selected="true" <tab id="tabDetails" label="${i18n:_('Details')}" selected="true"
onSelect="orderElementController.clearAll();"/> onSelect="orderElementController.clearAll();"/>

View file

@ -28,7 +28,7 @@
<vbox width="100%"> <vbox width="100%">
<panel title="${i18n:_('Inherited labels')}" border="normal"> <panel title="${i18n:_('Inherited labels')}" border="normal">
<panelchildren> <panelchildren>
<grid id="inheritedLabels" height="150px" fixedLayout="true" <grid id="inheritedLabels" fixedLayout="true"
model="@{assignedLabelsController.inheritedLabels}"> model="@{assignedLabelsController.inheritedLabels}">
<columns> <columns>
<column label="${i18n:_('Label type')}" /> <column label="${i18n:_('Label type')}" />
@ -49,7 +49,7 @@
<vbox width="100%"> <vbox width="100%">
<panel title="${i18n:_('Direct labels')}" border="normal"> <panel title="${i18n:_('Direct labels')}" border="normal">
<panelchildren> <panelchildren>
<newdatasortablegrid id="directLabels" height="200px" fixedLayout="true" <newdatasortablegrid id="directLabels" fixedLayout="true"
model="@{assignedLabelsController.labels}"> model="@{assignedLabelsController.labels}">
<columns> <columns>
<newdatasortablecolumn label="${i18n:_('Label type')}" sort="auto(lower(type.name))"/> <newdatasortablecolumn label="${i18n:_('Label type')}" sort="auto(lower(type.name))"/>

View file

@ -81,9 +81,9 @@
<panelchildren> <panelchildren>
<toolbarbutton style="text-decoration: none" label="${i18n:_('Unselect')}" <toolbarbutton style="text-decoration: none" label="${i18n:_('Unselect')}"
onClick="assignedMaterialsController.clearSelectionAllCategoriesTree()" /> onClick="assignedMaterialsController.clearSelectionAllCategoriesTree()" />
<tree id="allCategoriesTree" rows="10" vflex="true" multiple="false"> <tree id="allCategoriesTree" width="100%" rows="10" sizedByContent="true" vflex="true" hflex="true" multiple="false">
<treecols> <treecols>
<treecol label="Name" /> <treecol label="Name" hflex="true"/>
</treecols> </treecols>
</tree> </tree>
</panelchildren> </panelchildren>

View file

@ -28,7 +28,7 @@
<vbox width="100%"> <vbox width="100%">
<hbox style="margin-bottom:4px;" width="100%" hflex="true"> <hbox style="margin-bottom:4px;" width="100%" hflex="true">
<hbox pack="center"> <hbox align="center" pack="center">
<templateFinderPopup id="templateFinderPopupAtTree" acceptButtonLabel="${i18n:_('Create Task')}" caption="${i18n:_('Choosing Template')}" /> <templateFinderPopup id="templateFinderPopupAtTree" acceptButtonLabel="${i18n:_('Create Task')}" caption="${i18n:_('Choosing Template')}" />
<label value="${i18n:_('New task')}" /> <label value="${i18n:_('New task')}" />
<textbox value="" id="newOrderElementName" width="150px" <textbox value="" id="newOrderElementName" width="150px"
@ -79,7 +79,7 @@
</vbox> </vbox>
<vbox width="100%"> <vbox width="100%">
<tree id="tree" height="440px" multiple="false" droppable="true" <tree id="tree" hflex="1" multiple="false" droppable="true"
onDrop="treeController.move(self, event.dragged)" onDrop="treeController.move(self, event.dragged)"
onSelect="treeController.updateControlButtons(event)" onSelect="treeController.updateControlButtons(event)"
mold="paging" pageSize="25" mold="paging" pageSize="25"

View file

@ -64,8 +64,7 @@
</row> </row>
<row> <row>
<label value="${i18n:_('Report progress')}" /> <label value="${i18n:_('Report progress')}" />
<checkbox id="checkBoxReportProgress" checked="@{controller.qualityForm.reportAdvance}" <checkbox id="checkBoxReportProgress" checked="@{controller.qualityForm.reportAdvance}" />
onCheck="controller.validateReportProgress(self);" />
</row> </row>
</rows> </rows>
</grid> </grid>
@ -78,7 +77,7 @@
<button label="${i18n:_('New quality form item')}" <button label="${i18n:_('New quality form item')}"
onClick="controller.createQualityFormItem()" /> onClick="controller.createQualityFormItem()" />
</hbox> </hbox>
<grid id="gridQualityFormItems" height="200px" <grid id="gridQualityFormItems"
model="@{controller.qualityFormItems}" fixedLayout="true"> model="@{controller.qualityFormItems}" fixedLayout="true">
<columns sizable="true"> <columns sizable="true">
<column label="${i18n:_('Name')}"/> <column label="${i18n:_('Name')}"/>

View file

@ -131,7 +131,7 @@
<newdatasortablegrid id="listDescriptionFields" mold="paging" pageSize="4" fixedLayout="true" <newdatasortablegrid id="listDescriptionFields" mold="paging" pageSize="4" fixedLayout="true"
model="@{controller.descriptionFields}" rowRenderer= "@{controller.descriptionFieldsRowRender}"> model="@{controller.descriptionFields}" rowRenderer= "@{controller.descriptionFieldsRowRender}">
<columns> <columns>
<newdatasortablecolumn label="${i18n:_('Name')}" width="300px" sort="auto(lower(fieldName))" sortDirection="ascending"/> <newdatasortablecolumn label="${i18n:_('Name')}" sort="auto(lower(fieldName))" sortDirection="ascending"/>
<newdatasortablecolumn label="${i18n:_('Length')}" width="200px" align="center"/> <newdatasortablecolumn label="${i18n:_('Length')}" width="200px" align="center"/>
<newdatasortablecolumn label="${ i18n:_('Position')}" width="200px" align="center"/> <newdatasortablecolumn label="${ i18n:_('Position')}" width="200px" align="center"/>
<newdatasortablecolumn visible = "@{controller.editable}" label="${i18n:_('Operations')}" width="150px" align="center"/> <newdatasortablecolumn visible = "@{controller.editable}" label="${i18n:_('Operations')}" width="150px" align="center"/>

View file

@ -246,12 +246,14 @@ public class BaseCalendarModelTest {
.getPossibleParentCalendars(); .getPossibleParentCalendars();
assertThat(possibleParentCalendars.size(), equalTo(previous + 1)); assertThat(possibleParentCalendars.size(), equalTo(previous + 1));
assertThat(possibleParentCalendars.get(previous).getId(), BaseCalendar calendarComparison = null;
for (BaseCalendar calendar : possibleParentCalendars)
if (calendar.getId().equals(parentNewVersion.getId()))
calendarComparison = calendar;
assertThat(calendarComparison.getId(),
equalTo(parentNewVersion.getId())); equalTo(parentNewVersion.getId()));
assertThat( assertThat(calendarComparison.getCalendarDataVersions().size(),
possibleParentCalendars.get(previous) equalTo(2));
.getCalendarDataVersions()
.size(), equalTo(2));
} }
} }

View file

@ -39,6 +39,7 @@ import static org.libreplan.web.test.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CO
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -51,6 +52,7 @@ import org.libreplan.business.advance.entities.AdvanceType;
import org.libreplan.business.advance.entities.DirectAdvanceAssignment; import org.libreplan.business.advance.entities.DirectAdvanceAssignment;
import org.libreplan.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException; import org.libreplan.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException;
import org.libreplan.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException; import org.libreplan.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.labels.entities.Label; import org.libreplan.business.labels.entities.Label;
import org.libreplan.business.labels.entities.LabelType; import org.libreplan.business.labels.entities.LabelType;
import org.libreplan.business.materials.entities.Material; import org.libreplan.business.materials.entities.Material;
@ -63,12 +65,18 @@ import org.libreplan.business.qualityforms.entities.QualityForm;
import org.libreplan.business.requirements.entities.CriterionRequirement; import org.libreplan.business.requirements.entities.CriterionRequirement;
import org.libreplan.business.requirements.entities.DirectCriterionRequirement; import org.libreplan.business.requirements.entities.DirectCriterionRequirement;
import org.libreplan.business.requirements.entities.IndirectCriterionRequirement; import org.libreplan.business.requirements.entities.IndirectCriterionRequirement;
import org.libreplan.business.resources.bootstrap.ICriterionsBootstrap;
import org.libreplan.business.resources.daos.ICriterionDAO; import org.libreplan.business.resources.daos.ICriterionDAO;
import org.libreplan.business.resources.daos.ICriterionTypeDAO;
import org.libreplan.business.resources.daos.IResourceDAO;
import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.resources.entities.CriterionType;
import org.libreplan.business.scenarios.bootstrap.PredefinedScenarios; import org.libreplan.business.scenarios.bootstrap.PredefinedScenarios;
import org.libreplan.business.scenarios.entities.OrderVersion; import org.libreplan.business.scenarios.entities.OrderVersion;
import org.libreplan.business.scenarios.entities.Scenario; import org.libreplan.business.scenarios.entities.Scenario;
import org.libreplan.business.templates.entities.OrderElementTemplate; import org.libreplan.business.templates.entities.OrderElementTemplate;
import org.libreplan.business.workreports.daos.IWorkReportDAO;
import org.libreplan.business.workreports.entities.WorkReport;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -96,7 +104,7 @@ public class OrderElementTreeModelTest {
private IDataBootstrap scenariosBootstrap; private IDataBootstrap scenariosBootstrap;
@Resource @Resource
private IDataBootstrap criterionsBootstrap; private ICriterionsBootstrap criterionsBootstrap;
@Resource @Resource
private IDataBootstrap configurationBootstrap; private IDataBootstrap configurationBootstrap;
@ -104,6 +112,15 @@ public class OrderElementTreeModelTest {
@Autowired @Autowired
private ICriterionDAO criterionDAO; private ICriterionDAO criterionDAO;
@Autowired
private IWorkReportDAO workReportDAO;
@Autowired
private IResourceDAO resourceDAO;
@Autowired
private ICriterionTypeDAO criterionTypeDAO;
private Order order; private Order order;
private OrderElementTreeModel model; private OrderElementTreeModel model;
@ -126,6 +143,8 @@ public class OrderElementTreeModelTest {
@Before @Before
public void loadRequiredaData() { public void loadRequiredaData() {
cleanCriteria(workReportDAO, resourceDAO, criterionTypeDAO);
// Load data // Load data
configurationBootstrap.loadRequiredData(); configurationBootstrap.loadRequiredData();
defaultAdvanceTypesBootstrapListener.loadRequiredData(); defaultAdvanceTypesBootstrapListener.loadRequiredData();
@ -136,6 +155,30 @@ public class OrderElementTreeModelTest {
givenModel(); givenModel();
} }
public static void cleanCriteria(IWorkReportDAO workReportDAO,
IResourceDAO resourceDAO, ICriterionTypeDAO criterionTypeDAO) {
try {
List<WorkReport> reports = workReportDAO.findAll();
for (WorkReport each : reports) {
workReportDAO.remove(each.getId());
}
List<org.libreplan.business.resources.entities.Resource> resources = resourceDAO
.findAll();
for (org.libreplan.business.resources.entities.Resource each : resources) {
resourceDAO.remove(each.getId());
}
List<CriterionType> types = criterionTypeDAO.findAll();
for (CriterionType each : types) {
criterionTypeDAO.remove(each.getId());
}
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
private void givenOrder() { private void givenOrder() {
order = Order.create(); order = Order.create();
order.setName("order"); order.setName("order");

View file

@ -94,9 +94,11 @@ public class CalendarServiceTest {
BaseCalendarListDTO baseCalendars = calendarService.getBaseCalendars(); BaseCalendarListDTO baseCalendars = calendarService.getBaseCalendars();
assertThat(baseCalendars.baseCalendars.size(), equalTo(previous + 1)); assertThat(baseCalendars.baseCalendars.size(), equalTo(previous + 1));
BaseCalendarDTO calendarDTO = baseCalendars.baseCalendars.get(previous); for (BaseCalendarDTO calendarDTO : baseCalendars.baseCalendars)
assertThat(calendarDTO.code, equalTo(calendar.getCode())); if (calendarDTO.code.equals(calendar.getCode())) {
assertThat(calendarDTO.name, equalTo(calendar.getName())); assertThat(calendarDTO.code, equalTo(calendar.getCode()));
assertThat(calendarDTO.name, equalTo(calendar.getName()));
}
} }
} }

View file

@ -69,9 +69,13 @@ import org.libreplan.business.orders.entities.OrderLine;
import org.libreplan.business.requirements.entities.CriterionRequirement; import org.libreplan.business.requirements.entities.CriterionRequirement;
import org.libreplan.business.requirements.entities.DirectCriterionRequirement; import org.libreplan.business.requirements.entities.DirectCriterionRequirement;
import org.libreplan.business.requirements.entities.IndirectCriterionRequirement; import org.libreplan.business.requirements.entities.IndirectCriterionRequirement;
import org.libreplan.business.resources.daos.ICriterionTypeDAO;
import org.libreplan.business.resources.daos.IResourceDAO;
import org.libreplan.business.resources.entities.PredefinedCriterionTypes; import org.libreplan.business.resources.entities.PredefinedCriterionTypes;
import org.libreplan.business.resources.entities.ResourceEnum; import org.libreplan.business.resources.entities.ResourceEnum;
import org.libreplan.business.scenarios.bootstrap.IScenariosBootstrap; import org.libreplan.business.scenarios.bootstrap.IScenariosBootstrap;
import org.libreplan.business.workreports.daos.IWorkReportDAO;
import org.libreplan.web.orders.OrderElementTreeModelTest;
import org.libreplan.ws.common.api.AdvanceMeasurementDTO; import org.libreplan.ws.common.api.AdvanceMeasurementDTO;
import org.libreplan.ws.common.api.ConstraintViolationDTO; import org.libreplan.ws.common.api.ConstraintViolationDTO;
import org.libreplan.ws.common.api.CriterionRequirementDTO; import org.libreplan.ws.common.api.CriterionRequirementDTO;
@ -129,8 +133,25 @@ public class OrderElementServiceTest {
@Autowired @Autowired
private IAdHocTransactionService transactionService; private IAdHocTransactionService transactionService;
@Autowired
private IWorkReportDAO workReportDAO;
@Autowired
private IResourceDAO resourceDAO;
@Autowired
private ICriterionTypeDAO criterionTypeDAO;
@Before @Before
public void loadRequiredaData() { public void loadRequiredaData() {
transactionService.runOnTransaction(new IOnTransaction<Void>() {
@Override
public Void execute() {
OrderElementTreeModelTest.cleanCriteria(workReportDAO,
resourceDAO, criterionTypeDAO);
return null;
}
});
transactionService.runOnAnotherTransaction(new IOnTransaction<Void>() { transactionService.runOnAnotherTransaction(new IOnTransaction<Void>() {
@Override @Override
public Void execute() { public Void execute() {
@ -423,12 +444,7 @@ public class OrderElementServiceTest {
.addOrders(orderListDTO).instanceConstraintViolationsList; .addOrders(orderListDTO).instanceConstraintViolationsList;
assertThat(instanceConstraintViolationsList.size(), equalTo(0)); assertThat(instanceConstraintViolationsList.size(), equalTo(0));
try { checkIfExistsByCodeInAnotherTransaction(code);
orderElementDAO.findByCode(code);
assertTrue(true);
} catch (InstanceNotFoundException e) {
fail();
}
} }
@Test @Test
@ -548,12 +564,7 @@ public class OrderElementServiceTest {
assertTrue(instanceConstraintViolationsList.toString(), assertTrue(instanceConstraintViolationsList.toString(),
instanceConstraintViolationsList.size() == 0); instanceConstraintViolationsList.size() == 0);
try { checkIfExistsByCodeInAnotherTransaction(code);
orderElementDAO.findByCode(code);
assertTrue(true);
} catch (InstanceNotFoundException e) {
fail();
}
} }
@Test @Test
@ -636,12 +647,7 @@ public class OrderElementServiceTest {
assertTrue(instanceConstraintViolationsList.toString(), assertTrue(instanceConstraintViolationsList.toString(),
instanceConstraintViolationsList.size() == 0); instanceConstraintViolationsList.size() == 0);
try { checkIfExistsByCodeInAnotherTransaction(code);
orderElementDAO.findByCode(code);
assertTrue(true);
} catch (InstanceNotFoundException e) {
fail();
}
} }
@Test @Test
@ -695,7 +701,11 @@ public class OrderElementServiceTest {
.addOrders(orderListDTO).instanceConstraintViolationsList; .addOrders(orderListDTO).instanceConstraintViolationsList;
assertThat(instanceConstraintViolationsList.size(), equalTo(0)); assertThat(instanceConstraintViolationsList.size(), equalTo(0));
transactionService.runOnTransaction(new IOnTransaction<Void>() { checkIfExistsByCodeInAnotherTransaction(code);
}
private void checkIfExistsByCodeInAnotherTransaction(final String code) {
transactionService.runOnAnotherTransaction(new IOnTransaction<Void>() {
@Override @Override
public Void execute() { public Void execute() {
try { try {

10
pom.xml
View file

@ -5,7 +5,7 @@
<groupId>org.libreplan</groupId> <groupId>org.libreplan</groupId>
<artifactId>libreplan</artifactId> <artifactId>libreplan</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>1.1.3</version> <version>1.2.0</version>
<name>LibrePlan</name> <name>LibrePlan</name>
<!-- <!--
@ -28,8 +28,8 @@
--> -->
<properties> <properties>
<!-- Data source properties --> <!-- Data source properties -->
<dataSource.user>naval</dataSource.user> <dataSource.user>libreplan</dataSource.user>
<dataSource.password>naval</dataSource.password> <dataSource.password>libreplan</dataSource.password>
<dataSource.jndiName>jdbc/libreplan-ds</dataSource.jndiName> <dataSource.jndiName>jdbc/libreplan-ds</dataSource.jndiName>
<testDataSource.user>${dataSource.user}</testDataSource.user> <testDataSource.user>${dataSource.user}</testDataSource.user>
<testDataSource.password>${dataSource.password}</testDataSource.password> <testDataSource.password>${dataSource.password}</testDataSource.password>
@ -113,7 +113,7 @@
<jdbcDriver.version>8.3-603.jdbc4</jdbcDriver.version> <jdbcDriver.version>8.3-603.jdbc4</jdbcDriver.version>
<jdbcDriver.className>org.postgresql.Driver</jdbcDriver.className> <jdbcDriver.className>org.postgresql.Driver</jdbcDriver.className>
<!-- Data source properties --> <!-- Data source properties -->
<dataSource.url>jdbc:postgresql://localhost/naval${libreplan.mode}</dataSource.url> <dataSource.url>jdbc:postgresql://localhost/libreplan${libreplan.mode}</dataSource.url>
<testDataSource.url>${dataSource.url}test</testDataSource.url> <testDataSource.url>${dataSource.url}test</testDataSource.url>
<!-- Hibernate properties --> <!-- Hibernate properties -->
<hibernate.dialect>org.hibernate.dialect.PostgreSQLDialect</hibernate.dialect> <hibernate.dialect>org.hibernate.dialect.PostgreSQLDialect</hibernate.dialect>
@ -131,7 +131,7 @@
<jdbcDriver.version>5.0.5</jdbcDriver.version> <jdbcDriver.version>5.0.5</jdbcDriver.version>
<jdbcDriver.className>com.mysql.jdbc.Driver</jdbcDriver.className> <jdbcDriver.className>com.mysql.jdbc.Driver</jdbcDriver.className>
<!-- Data source properties --> <!-- Data source properties -->
<dataSource.url>jdbc:mysql://localhost/naval${libreplan.mode}</dataSource.url> <dataSource.url>jdbc:mysql://localhost/libreplan${libreplan.mode}</dataSource.url>
<testDataSource.url>${dataSource.url}test</testDataSource.url> <testDataSource.url>${dataSource.url}test</testDataSource.url>
<!-- Hibernate properties --> <!-- Hibernate properties -->
<hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect> <hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect>

View file

@ -1843,3 +1843,296 @@ INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXEC
-- Release Database Lock -- Release Database Lock
-- Release Database Lock -- Release Database Lock
-- *********************************************************************
-- Update Database Script - LibrePlan 1.2.0
-- *********************************************************************
-- Change Log: src/main/resources/db.changelog.xml
-- Ran at: 11/25/11 11:26 AM
-- Against: naval@jdbc:postgresql://localhost/navaldev
-- Liquibase version: 2.0-rc7
-- *********************************************************************
-- Lock Database
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-host::calvarinop::(Checksum: 3:7984328274b0af25bf454a71f709a0dc)
-- Add new column to store ldap host
ALTER TABLE configuration ADD ldap_host VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap host', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-host', '2.0-rc7', '3:7984328274b0af25bf454a71f709a0dc', 341);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-port::calvarinop::(Checksum: 3:a698fd66dc9b58c8e7df0ffafc6f7d1c)
-- Add new column to store ldap port
ALTER TABLE configuration ADD ldap_port VARCHAR(5);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap port', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-port', '2.0-rc7', '3:a698fd66dc9b58c8e7df0ffafc6f7d1c', 342);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-base::calvarinop::(Checksum: 3:be1cce8488649e3d266a5df219713071)
-- Add new column to store ldap base
ALTER TABLE configuration ADD ldap_base VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap base', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-base', '2.0-rc7', '3:be1cce8488649e3d266a5df219713071', 343);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-userdn::calvarinop::(Checksum: 3:c4c93711bd374e215a65f6f45b6a5f44)
-- Add new column to store ldap userdn
ALTER TABLE configuration ADD ldap_userdn VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap userdn', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-userdn', '2.0-rc7', '3:c4c93711bd374e215a65f6f45b6a5f44', 344);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-password::calvarinop::(Checksum: 3:22761f7b110aec44930935cb79f179d5)
-- Add new column to store ldap password
ALTER TABLE configuration ADD ldap_password VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap password', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-password', '2.0-rc7', '3:22761f7b110aec44930935cb79f179d5', 345);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-userid::calvarinop::(Checksum: 3:b628b315f6a3d2266cb6d280f9525f5f)
-- Add new column to store ldap userid
ALTER TABLE configuration ADD ldap_userid VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap userid', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-userid', '2.0-rc7', '3:b628b315f6a3d2266cb6d280f9525f5f', 346);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-save-password-db::calvarinop::(Checksum: 3:b4447892b37ee903664f9b5bd54e7a2e)
-- Add new column to store ldap passwords in database
ALTER TABLE configuration ADD ldap_save_password_db BOOLEAN;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap passwords in database', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-save-password-db', '2.0-rc7', '3:b4447892b37ee903664f9b5bd54e7a2e', 347);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-auth-enabled::calvarinop::(Checksum: 3:979a11f6d147433ec84e6165927683fa)
-- Add new column to store ldap authentication enabled
ALTER TABLE configuration ADD ldap_auth_enabled BOOLEAN;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap authentication enabled', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-auth-enabled', '2.0-rc7', '3:979a11f6d147433ec84e6165927683fa', 348);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-navalplan-user::idiazt::(Checksum: 3:76c2b18d10554416d9ca9055d3c2e768)
-- Add new column to store if it is a navalplan user
ALTER TABLE user_table ADD navalplan_user BOOLEAN;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Add new column to store if it is a navalplan user', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-navalplan-user', '2.0-rc7', '3:76c2b18d10554416d9ca9055d3c2e768', 349);
-- Changeset src/main/resources/db.changelog-1.1.xml::delete-constraint-not-null-user-password::idiazt::(Checksum: 3:0470d6d460842219443027cdb633232c)
-- Delete constraint not null for user password
ALTER TABLE user_table ALTER COLUMN password DROP NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Delete constraint not null for user password', NOW(), 'Drop Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'delete-constraint-not-null-user-password', '2.0-rc7', '3:0470d6d460842219443027cdb633232c', 350);
-- Changeset src/main/resources/db.changelog-1.1.xml::set-default-value-navalplan-user::idiazt::(Checksum: 3:8935d0ba839c252967d398f0db3ed01d)
ALTER TABLE user_table ALTER COLUMN navalplan_user SET DEFAULT 'TRUE';
UPDATE user_table SET navalplan_user = 'TRUE' WHERE navalplan_user IS NULL;
ALTER TABLE user_table ALTER COLUMN navalplan_user SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', '', NOW(), 'Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'set-default-value-navalplan-user', '2.0-rc7', '3:8935d0ba839c252967d398f0db3ed01d', 351);
-- Changeset src/main/resources/db.changelog-1.1.xml::set-default-value-ldap-save-password-db::idiazt::(Checksum: 3:6bcb9c9c00f066bc7ef5e568abf2da6f)
ALTER TABLE configuration ALTER COLUMN ldap_save_password_db SET DEFAULT 'TRUE';
UPDATE configuration SET ldap_save_password_db = 'TRUE' WHERE ldap_save_password_db IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_save_password_db SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', '', NOW(), 'Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'set-default-value-ldap-save-password-db', '2.0-rc7', '3:6bcb9c9c00f066bc7ef5e568abf2da6f', 352);
-- Changeset src/main/resources/db.changelog-1.1.xml::set-default-value-ldap-auth-enabled::idiazt::(Checksum: 3:987742cd9637874021c47ad9388655d2)
ALTER TABLE configuration ALTER COLUMN ldap_auth_enabled SET DEFAULT 'FALSE';
UPDATE configuration SET ldap_auth_enabled = 'FALSE' WHERE ldap_auth_enabled IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_auth_enabled SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', '', NOW(), 'Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'set-default-value-ldap-auth-enabled', '2.0-rc7', '3:987742cd9637874021c47ad9388655d2', 353);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-save-roles-db::calvarinop::(Checksum: 3:e7fc821091b4d96786edf2aa98308f3b)
-- Add new column to store ldap roles in database
ALTER TABLE configuration ADD ldap_save_roles_db BOOLEAN;
ALTER TABLE configuration ALTER COLUMN ldap_save_roles_db SET DEFAULT 'FALSE';
UPDATE configuration SET ldap_save_roles_db = 'FALSE' WHERE ldap_save_roles_db IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_save_roles_db SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap roles in database', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-save-roles-db', '2.0-rc7', '3:e7fc821091b4d96786edf2aa98308f3b', 354);
-- Changeset src/main/resources/db.changelog-1.1.xml::create-new-table-matching-roles::calvarinop::(Checksum: 3:5afc1ada9ec4ae6bfd66368c2512e145)
-- Add new column to store ldap role property
CREATE TABLE configuration_roles_ldap (role_libreplan VARCHAR(255) NOT NULL, role_ldap VARCHAR(255) NOT NULL, id_configuration BIGINT NOT NULL, role_matching_id INT NOT NULL, CONSTRAINT PK_CONFIGURATION_ROLES_LDAP PRIMARY KEY (role_libreplan, role_ldap));
ALTER TABLE configuration_roles_ldap ADD CONSTRAINT id_configuration_fkey FOREIGN KEY (id_configuration) REFERENCES configuration(id) ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE configuration ADD ldap_group_path VARCHAR(255);
ALTER TABLE configuration ADD ldap_role_property VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap role property', NOW(), 'Create Table, Add Foreign Key Constraint, Add Column (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'create-new-table-matching-roles', '2.0-rc7', '3:5afc1ada9ec4ae6bfd66368c2512e145', 355);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-search-query::idiazt::(Checksum: 3:8e994641ada47323406f65d515ff00a0)
-- Add new column to store ldap role search query
ALTER TABLE configuration ADD ldap_search_query VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Add new column to store ldap role search query', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-search-query', '2.0-rc7', '3:8e994641ada47323406f65d515ff00a0', 356);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-enabled-autocomplete-login::smontes::(Checksum: 3:0542da97fbff41b95f9cf5ef10ffa322)
-- Add new column enabled_autocomplete_login with default value TRUE to configuration table
ALTER TABLE configuration ADD enabled_autocomplete_login BOOLEAN;
ALTER TABLE configuration ALTER COLUMN enabled_autocomplete_login SET DEFAULT 'TRUE';
UPDATE configuration SET enabled_autocomplete_login = 'TRUE' WHERE enabled_autocomplete_login IS NULL;
ALTER TABLE configuration ALTER COLUMN enabled_autocomplete_login SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('smontes', 'Add new column enabled_autocomplete_login with default value TRUE to configuration table', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-enabled-autocomplete-login', '2.0-rc7', '3:0542da97fbff41b95f9cf5ef10ffa322', 357);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-application-language::calvarinop::(Checksum: 3:f451e552cb7903c699c88ecde02e85c6)
-- Add new column to store the language of application for this user
ALTER TABLE user_table ADD application_language INT DEFAULT '0';
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store the language of application for this user', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-application-language', '2.0-rc7', '3:f451e552cb7903c699c88ecde02e85c6', 358);
-- Changeset src/main/resources/db.changelog-1.1.xml::move-columns-from-configuration-table::calvarinop::(Checksum: 3:7243259227df39ef2f0683d4b425d369)
-- Move columns from configuration table to user table
ALTER TABLE user_table ADD expand_company_planning_view_charts BOOLEAN;
ALTER TABLE user_table ALTER COLUMN expand_company_planning_view_charts SET DEFAULT 'FALSE';
UPDATE user_table SET expand_company_planning_view_charts = 'FALSE' WHERE expand_company_planning_view_charts IS NULL;
ALTER TABLE user_table ALTER COLUMN expand_company_planning_view_charts SET NOT NULL;
ALTER TABLE user_table ADD expand_order_planning_view_charts BOOLEAN;
ALTER TABLE user_table ALTER COLUMN expand_order_planning_view_charts SET DEFAULT 'TRUE';
UPDATE user_table SET expand_order_planning_view_charts = 'TRUE' WHERE expand_order_planning_view_charts IS NULL;
ALTER TABLE user_table ALTER COLUMN expand_order_planning_view_charts SET NOT NULL;
ALTER TABLE user_table ADD expand_resource_load_view_charts BOOLEAN;
ALTER TABLE user_table ALTER COLUMN expand_resource_load_view_charts SET DEFAULT 'TRUE';
UPDATE user_table SET expand_resource_load_view_charts = 'TRUE' WHERE expand_resource_load_view_charts IS NULL;
ALTER TABLE user_table ALTER COLUMN expand_resource_load_view_charts SET NOT NULL;
ALTER TABLE configuration DROP COLUMN expand_company_planning_view_charts;
ALTER TABLE configuration DROP COLUMN expand_order_planning_view_charts;
ALTER TABLE configuration DROP COLUMN expand_resource_load_view_charts;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Move columns from configuration table to user table', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint, Add Column, Add Default Value, Add Not-Null Constraint, Add Column, Add Default Value, Add Not-Null Constraint, Drop Column (x3)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'move-columns-from-configuration-table', '2.0-rc7', '3:7243259227df39ef2f0683d4b425d369', 359);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-fields::calvarinop::(Checksum: 3:6950443e7dca6f2af1e7d095abde62bc)
-- Add new column to store the first and last name for this user
ALTER TABLE user_table ADD first_name VARCHAR(255);
ALTER TABLE user_table ADD last_name VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store the first and last name for this user', NOW(), 'Add Column (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-fields', '2.0-rc7', '3:6950443e7dca6f2af1e7d095abde62bc', 360);
-- Changeset src/main/resources/db.changelog-1.1.xml::remove-configuration_roles_ldap::mrego::(Checksum: 3:88dacdfabdf225e6ed8b25e4807afeb8)
-- Remove column configuration_roles_ldap in role_matching_id
ALTER TABLE configuration_roles_ldap DROP COLUMN role_matching_id;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Remove column configuration_roles_ldap in role_matching_id', NOW(), 'Drop Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'remove-configuration_roles_ldap', '2.0-rc7', '3:88dacdfabdf225e6ed8b25e4807afeb8', 361);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-column-progress_all_by_num_hours-in-planning_data::mrego::(Checksum: 3:9410a670cf6cccd21638c8eddb6b8b36)
-- Add column progress_all_by_num_hours in planning_data
ALTER TABLE planning_data ADD progress_all_by_num_hours numeric(19,6);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Add column progress_all_by_num_hours in planning_data', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-column-progress_all_by_num_hours-in-planning_data', '2.0-rc7', '3:9410a670cf6cccd21638c8eddb6b8b36', 362);
-- Changeset src/main/resources/db.changelog-1.1.xml::update-color-in-calendar_exception_type-to-default::mrego::(Checksum: 3:2f5f94374b2021dca7bc4d8245807ae4)
-- Update color in calendar_exception_type to DEFAULT
UPDATE calendar_exception_type SET color = 'DEFAULT';
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Update color in calendar_exception_type to DEFAULT', NOW(), 'Update Data', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'update-color-in-calendar_exception_type-to-default', '2.0-rc7', '3:2f5f94374b2021dca7bc4d8245807ae4', 363);
-- Changeset src/main/resources/db.changelog-1.1.xml::create-table-manual_function::mrego::(Checksum: 3:aac963ac8a7a63814472c50edf8b367a)
CREATE TABLE manual_function (assignment_function_id BIGINT NOT NULL, CONSTRAINT manual_function_pkey PRIMARY KEY (assignment_function_id));
ALTER TABLE manual_function ADD CONSTRAINT mnual_function_assignment_function_fkey FOREIGN KEY (assignment_function_id) REFERENCES assignment_function(id) ON UPDATE NO ACTION ON DELETE NO ACTION;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', '', NOW(), 'Create Table, Add Foreign Key Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'create-table-manual_function', '2.0-rc7', '3:aac963ac8a7a63814472c50edf8b367a', 364);
-- Changeset src/main/resources/db.changelog-1.1.xml::change-numhours-to-effort-in-work-report-lines::idiazt::(Checksum: 3:824cfe1ec43c490e63bf2d8316f1255e)
-- Changing work_report_line numHours to effort
ALTER TABLE work_report_line RENAME COLUMN num_hours TO effort;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Changing work_report_line numHours to effort', NOW(), 'Rename Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'change-numhours-to-effort-in-work-report-lines', '2.0-rc7', '3:824cfe1ec43c490e63bf2d8316f1255e', 365);
-- Changeset src/main/resources/db.changelog-1.1.xml::update-numhours-values-to-effort-values::idiazt::(Checksum: 3:79a9659b3a77004c5fe13bbec8aad88c)
-- Updating numHours to effort (hours to seconds)
UPDATE work_report_line
SET effort = effort*3600;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Updating numHours to effort (hours to seconds)', NOW(), 'Custom SQL', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'update-numhours-values-to-effort-values', '2.0-rc7', '3:79a9659b3a77004c5fe13bbec8aad88c', 366);
-- Changeset src/main/resources/db.changelog-1.1.xml::change-sum_charged_hours-to-sum_charged_effort::mrego::(Checksum: 3:202833e32d386f5a3edf903b2d5a21b4)
-- Changing sum_charged_hours to sum_charged_effort
ALTER TABLE sum_charged_hours RENAME TO sum_charged_effort;
ALTER TABLE sum_charged_effort RENAME COLUMN direct_charged_hours TO direct_charged_effort;
ALTER TABLE sum_charged_effort RENAME COLUMN indirect_charged_hours TO indirect_charged_effort;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Changing sum_charged_hours to sum_charged_effort', NOW(), 'Rename Table, Rename Column (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'change-sum_charged_hours-to-sum_charged_effort', '2.0-rc7', '3:202833e32d386f5a3edf903b2d5a21b4', 367);
-- Changeset src/main/resources/db.changelog-1.1.xml::update-effort-values-in-sum_charged_effort::mrego::(Checksum: 3:6d7d2103e92b3ac55b9658931fc3ed65)
-- Updating effort values (hours to seconds) in sum_charged_effort table
UPDATE sum_charged_effort
SET direct_charged_effort = direct_charged_effort*3600;
UPDATE sum_charged_effort
SET indirect_charged_effort = indirect_charged_effort*3600;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Updating effort values (hours to seconds) in sum_charged_effort table', NOW(), 'Custom SQL (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'update-effort-values-in-sum_charged_effort', '2.0-rc7', '3:6d7d2103e92b3ac55b9658931fc3ed65', 368);
-- Changeset src/main/resources/db.changelog-1.1.xml::drop-foreign-key-sum_charged_hours_id-in-order_element::dmel::(Checksum: 3:288d757a697e34248fbb5dab4177c4a0)
ALTER TABLE order_element DROP CONSTRAINT fk92271f0b7ec17fa6;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('dmel', '', NOW(), 'Drop Foreign Key Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'drop-foreign-key-sum_charged_hours_id-in-order_element', '2.0-rc7', '3:288d757a697e34248fbb5dab4177c4a0', 369);
-- Changeset src/main/resources/db.changelog-1.1.xml::rename-sum_charged_hours_id-to-sum_charged_effort_id::mrego::(Checksum: 3:f8140dac93702c25f7fe75d9217ef9c5)
-- Rename sum_charged_hours_id to sum_charged_effort_id in order_element
ALTER TABLE order_element RENAME COLUMN sum_charged_hours_id TO sum_charged_effort_id;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Rename sum_charged_hours_id to sum_charged_effort_id in order_element', NOW(), 'Rename Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'rename-sum_charged_hours_id-to-sum_charged_effort_id', '2.0-rc7', '3:f8140dac93702c25f7fe75d9217ef9c5', 370);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-foreign-key-sum_charged_effort_id-in-order_element::dmel::(Checksum: 3:a8fa898f9cfaa1afa3afbab4c1c9f82b)
ALTER TABLE order_element ADD CONSTRAINT sum_charged_effort_id_fkey FOREIGN KEY (sum_charged_effort_id) REFERENCES sum_charged_effort(id) ON UPDATE NO ACTION ON DELETE NO ACTION;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('dmel', '', NOW(), 'Add Foreign Key Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-foreign-key-sum_charged_effort_id-in-order_element', '2.0-rc7', '3:a8fa898f9cfaa1afa3afbab4c1c9f82b', 371);
-- Changeset src/main/resources/db.changelog-1.1.xml::drop-column-date-in-stretches-table::mrego::(Checksum: 3:e0ed365c168583ff5c4c81c9ac79d644)
ALTER TABLE stretches DROP COLUMN date;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', '', NOW(), 'Drop Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'drop-column-date-in-stretches-table', '2.0-rc7', '3:e0ed365c168583ff5c4c81c9ac79d644', 372);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-version-to-planning-data::ogonzalez::(Checksum: 3:ae9dca1ca9cb3556cf5efdca689b8fc1)
ALTER TABLE planning_data ADD version BIGINT NOT NULL DEFAULT '0';
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('ogonzalez', '', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-version-to-planning-data', '2.0-rc7', '3:ae9dca1ca9cb3556cf5efdca689b8fc1', 373);
-- Changeset src/main/resources/db.changelog-1.1.xml::change-navalplan_user-to-libreplan_user-in-user_table::mrego::(Checksum: 3:82c71f38665f14d5d8ef9391a5c2487d)
-- Changing navalplan_user to libreplan_user in user_table
ALTER TABLE user_table RENAME COLUMN navalplan_user TO libreplan_user;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Changing navalplan_user to libreplan_user in user_table', NOW(), 'Rename Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'change-navalplan_user-to-libreplan_user-in-user_table', '2.0-rc7', '3:82c71f38665f14d5d8ef9391a5c2487d', 374);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-role-strategy::idiazt::(Checksum: 3:3145034f8fd26477ae1fac7da835a43e)
-- Add new column to store ldap role strategy
ALTER TABLE configuration ADD ldap_group_strategy BOOLEAN;
ALTER TABLE configuration ALTER COLUMN ldap_group_strategy SET DEFAULT 'TRUE';
UPDATE configuration SET ldap_group_strategy = 'TRUE' WHERE ldap_group_strategy IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_group_strategy SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Add new column to store ldap role strategy', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-role-strategy', '2.0-rc7', '3:3145034f8fd26477ae1fac7da835a43e', 375);
-- Release Database Lock
-- Release Database Lock

View file

@ -0,0 +1,291 @@
-- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: src/main/resources/db.changelog.xml
-- Ran at: 11/25/11 11:26 AM
-- Against: naval@jdbc:postgresql://localhost/navaldev
-- Liquibase version: 2.0-rc7
-- *********************************************************************
-- Lock Database
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-host::calvarinop::(Checksum: 3:7984328274b0af25bf454a71f709a0dc)
-- Add new column to store ldap host
ALTER TABLE configuration ADD ldap_host VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap host', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-host', '2.0-rc7', '3:7984328274b0af25bf454a71f709a0dc', 341);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-port::calvarinop::(Checksum: 3:a698fd66dc9b58c8e7df0ffafc6f7d1c)
-- Add new column to store ldap port
ALTER TABLE configuration ADD ldap_port VARCHAR(5);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap port', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-port', '2.0-rc7', '3:a698fd66dc9b58c8e7df0ffafc6f7d1c', 342);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-base::calvarinop::(Checksum: 3:be1cce8488649e3d266a5df219713071)
-- Add new column to store ldap base
ALTER TABLE configuration ADD ldap_base VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap base', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-base', '2.0-rc7', '3:be1cce8488649e3d266a5df219713071', 343);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-userdn::calvarinop::(Checksum: 3:c4c93711bd374e215a65f6f45b6a5f44)
-- Add new column to store ldap userdn
ALTER TABLE configuration ADD ldap_userdn VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap userdn', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-userdn', '2.0-rc7', '3:c4c93711bd374e215a65f6f45b6a5f44', 344);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-password::calvarinop::(Checksum: 3:22761f7b110aec44930935cb79f179d5)
-- Add new column to store ldap password
ALTER TABLE configuration ADD ldap_password VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap password', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-password', '2.0-rc7', '3:22761f7b110aec44930935cb79f179d5', 345);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-userid::calvarinop::(Checksum: 3:b628b315f6a3d2266cb6d280f9525f5f)
-- Add new column to store ldap userid
ALTER TABLE configuration ADD ldap_userid VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap userid', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-userid', '2.0-rc7', '3:b628b315f6a3d2266cb6d280f9525f5f', 346);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-save-password-db::calvarinop::(Checksum: 3:b4447892b37ee903664f9b5bd54e7a2e)
-- Add new column to store ldap passwords in database
ALTER TABLE configuration ADD ldap_save_password_db BOOLEAN;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap passwords in database', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-save-password-db', '2.0-rc7', '3:b4447892b37ee903664f9b5bd54e7a2e', 347);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-auth-enabled::calvarinop::(Checksum: 3:979a11f6d147433ec84e6165927683fa)
-- Add new column to store ldap authentication enabled
ALTER TABLE configuration ADD ldap_auth_enabled BOOLEAN;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap authentication enabled', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-auth-enabled', '2.0-rc7', '3:979a11f6d147433ec84e6165927683fa', 348);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-navalplan-user::idiazt::(Checksum: 3:76c2b18d10554416d9ca9055d3c2e768)
-- Add new column to store if it is a navalplan user
ALTER TABLE user_table ADD navalplan_user BOOLEAN;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Add new column to store if it is a navalplan user', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-navalplan-user', '2.0-rc7', '3:76c2b18d10554416d9ca9055d3c2e768', 349);
-- Changeset src/main/resources/db.changelog-1.1.xml::delete-constraint-not-null-user-password::idiazt::(Checksum: 3:0470d6d460842219443027cdb633232c)
-- Delete constraint not null for user password
ALTER TABLE user_table ALTER COLUMN password DROP NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Delete constraint not null for user password', NOW(), 'Drop Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'delete-constraint-not-null-user-password', '2.0-rc7', '3:0470d6d460842219443027cdb633232c', 350);
-- Changeset src/main/resources/db.changelog-1.1.xml::set-default-value-navalplan-user::idiazt::(Checksum: 3:8935d0ba839c252967d398f0db3ed01d)
ALTER TABLE user_table ALTER COLUMN navalplan_user SET DEFAULT 'TRUE';
UPDATE user_table SET navalplan_user = 'TRUE' WHERE navalplan_user IS NULL;
ALTER TABLE user_table ALTER COLUMN navalplan_user SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', '', NOW(), 'Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'set-default-value-navalplan-user', '2.0-rc7', '3:8935d0ba839c252967d398f0db3ed01d', 351);
-- Changeset src/main/resources/db.changelog-1.1.xml::set-default-value-ldap-save-password-db::idiazt::(Checksum: 3:6bcb9c9c00f066bc7ef5e568abf2da6f)
ALTER TABLE configuration ALTER COLUMN ldap_save_password_db SET DEFAULT 'TRUE';
UPDATE configuration SET ldap_save_password_db = 'TRUE' WHERE ldap_save_password_db IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_save_password_db SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', '', NOW(), 'Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'set-default-value-ldap-save-password-db', '2.0-rc7', '3:6bcb9c9c00f066bc7ef5e568abf2da6f', 352);
-- Changeset src/main/resources/db.changelog-1.1.xml::set-default-value-ldap-auth-enabled::idiazt::(Checksum: 3:987742cd9637874021c47ad9388655d2)
ALTER TABLE configuration ALTER COLUMN ldap_auth_enabled SET DEFAULT 'FALSE';
UPDATE configuration SET ldap_auth_enabled = 'FALSE' WHERE ldap_auth_enabled IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_auth_enabled SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', '', NOW(), 'Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'set-default-value-ldap-auth-enabled', '2.0-rc7', '3:987742cd9637874021c47ad9388655d2', 353);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-save-roles-db::calvarinop::(Checksum: 3:e7fc821091b4d96786edf2aa98308f3b)
-- Add new column to store ldap roles in database
ALTER TABLE configuration ADD ldap_save_roles_db BOOLEAN;
ALTER TABLE configuration ALTER COLUMN ldap_save_roles_db SET DEFAULT 'FALSE';
UPDATE configuration SET ldap_save_roles_db = 'FALSE' WHERE ldap_save_roles_db IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_save_roles_db SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap roles in database', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-save-roles-db', '2.0-rc7', '3:e7fc821091b4d96786edf2aa98308f3b', 354);
-- Changeset src/main/resources/db.changelog-1.1.xml::create-new-table-matching-roles::calvarinop::(Checksum: 3:5afc1ada9ec4ae6bfd66368c2512e145)
-- Add new column to store ldap role property
CREATE TABLE configuration_roles_ldap (role_libreplan VARCHAR(255) NOT NULL, role_ldap VARCHAR(255) NOT NULL, id_configuration BIGINT NOT NULL, role_matching_id INT NOT NULL, CONSTRAINT PK_CONFIGURATION_ROLES_LDAP PRIMARY KEY (role_libreplan, role_ldap));
ALTER TABLE configuration_roles_ldap ADD CONSTRAINT id_configuration_fkey FOREIGN KEY (id_configuration) REFERENCES configuration(id) ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE configuration ADD ldap_group_path VARCHAR(255);
ALTER TABLE configuration ADD ldap_role_property VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store ldap role property', NOW(), 'Create Table, Add Foreign Key Constraint, Add Column (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'create-new-table-matching-roles', '2.0-rc7', '3:5afc1ada9ec4ae6bfd66368c2512e145', 355);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-search-query::idiazt::(Checksum: 3:8e994641ada47323406f65d515ff00a0)
-- Add new column to store ldap role search query
ALTER TABLE configuration ADD ldap_search_query VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Add new column to store ldap role search query', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-search-query', '2.0-rc7', '3:8e994641ada47323406f65d515ff00a0', 356);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-enabled-autocomplete-login::smontes::(Checksum: 3:0542da97fbff41b95f9cf5ef10ffa322)
-- Add new column enabled_autocomplete_login with default value TRUE to configuration table
ALTER TABLE configuration ADD enabled_autocomplete_login BOOLEAN;
ALTER TABLE configuration ALTER COLUMN enabled_autocomplete_login SET DEFAULT 'TRUE';
UPDATE configuration SET enabled_autocomplete_login = 'TRUE' WHERE enabled_autocomplete_login IS NULL;
ALTER TABLE configuration ALTER COLUMN enabled_autocomplete_login SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('smontes', 'Add new column enabled_autocomplete_login with default value TRUE to configuration table', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-enabled-autocomplete-login', '2.0-rc7', '3:0542da97fbff41b95f9cf5ef10ffa322', 357);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-application-language::calvarinop::(Checksum: 3:f451e552cb7903c699c88ecde02e85c6)
-- Add new column to store the language of application for this user
ALTER TABLE user_table ADD application_language INT DEFAULT '0';
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store the language of application for this user', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-application-language', '2.0-rc7', '3:f451e552cb7903c699c88ecde02e85c6', 358);
-- Changeset src/main/resources/db.changelog-1.1.xml::move-columns-from-configuration-table::calvarinop::(Checksum: 3:7243259227df39ef2f0683d4b425d369)
-- Move columns from configuration table to user table
ALTER TABLE user_table ADD expand_company_planning_view_charts BOOLEAN;
ALTER TABLE user_table ALTER COLUMN expand_company_planning_view_charts SET DEFAULT 'FALSE';
UPDATE user_table SET expand_company_planning_view_charts = 'FALSE' WHERE expand_company_planning_view_charts IS NULL;
ALTER TABLE user_table ALTER COLUMN expand_company_planning_view_charts SET NOT NULL;
ALTER TABLE user_table ADD expand_order_planning_view_charts BOOLEAN;
ALTER TABLE user_table ALTER COLUMN expand_order_planning_view_charts SET DEFAULT 'TRUE';
UPDATE user_table SET expand_order_planning_view_charts = 'TRUE' WHERE expand_order_planning_view_charts IS NULL;
ALTER TABLE user_table ALTER COLUMN expand_order_planning_view_charts SET NOT NULL;
ALTER TABLE user_table ADD expand_resource_load_view_charts BOOLEAN;
ALTER TABLE user_table ALTER COLUMN expand_resource_load_view_charts SET DEFAULT 'TRUE';
UPDATE user_table SET expand_resource_load_view_charts = 'TRUE' WHERE expand_resource_load_view_charts IS NULL;
ALTER TABLE user_table ALTER COLUMN expand_resource_load_view_charts SET NOT NULL;
ALTER TABLE configuration DROP COLUMN expand_company_planning_view_charts;
ALTER TABLE configuration DROP COLUMN expand_order_planning_view_charts;
ALTER TABLE configuration DROP COLUMN expand_resource_load_view_charts;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Move columns from configuration table to user table', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint, Add Column, Add Default Value, Add Not-Null Constraint, Add Column, Add Default Value, Add Not-Null Constraint, Drop Column (x3)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'move-columns-from-configuration-table', '2.0-rc7', '3:7243259227df39ef2f0683d4b425d369', 359);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-fields::calvarinop::(Checksum: 3:6950443e7dca6f2af1e7d095abde62bc)
-- Add new column to store the first and last name for this user
ALTER TABLE user_table ADD first_name VARCHAR(255);
ALTER TABLE user_table ADD last_name VARCHAR(255);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('calvarinop', 'Add new column to store the first and last name for this user', NOW(), 'Add Column (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-fields', '2.0-rc7', '3:6950443e7dca6f2af1e7d095abde62bc', 360);
-- Changeset src/main/resources/db.changelog-1.1.xml::remove-configuration_roles_ldap::mrego::(Checksum: 3:88dacdfabdf225e6ed8b25e4807afeb8)
-- Remove column configuration_roles_ldap in role_matching_id
ALTER TABLE configuration_roles_ldap DROP COLUMN role_matching_id;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Remove column configuration_roles_ldap in role_matching_id', NOW(), 'Drop Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'remove-configuration_roles_ldap', '2.0-rc7', '3:88dacdfabdf225e6ed8b25e4807afeb8', 361);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-column-progress_all_by_num_hours-in-planning_data::mrego::(Checksum: 3:9410a670cf6cccd21638c8eddb6b8b36)
-- Add column progress_all_by_num_hours in planning_data
ALTER TABLE planning_data ADD progress_all_by_num_hours numeric(19,6);
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Add column progress_all_by_num_hours in planning_data', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-column-progress_all_by_num_hours-in-planning_data', '2.0-rc7', '3:9410a670cf6cccd21638c8eddb6b8b36', 362);
-- Changeset src/main/resources/db.changelog-1.1.xml::update-color-in-calendar_exception_type-to-default::mrego::(Checksum: 3:2f5f94374b2021dca7bc4d8245807ae4)
-- Update color in calendar_exception_type to DEFAULT
UPDATE calendar_exception_type SET color = 'DEFAULT';
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Update color in calendar_exception_type to DEFAULT', NOW(), 'Update Data', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'update-color-in-calendar_exception_type-to-default', '2.0-rc7', '3:2f5f94374b2021dca7bc4d8245807ae4', 363);
-- Changeset src/main/resources/db.changelog-1.1.xml::create-table-manual_function::mrego::(Checksum: 3:aac963ac8a7a63814472c50edf8b367a)
CREATE TABLE manual_function (assignment_function_id BIGINT NOT NULL, CONSTRAINT manual_function_pkey PRIMARY KEY (assignment_function_id));
ALTER TABLE manual_function ADD CONSTRAINT mnual_function_assignment_function_fkey FOREIGN KEY (assignment_function_id) REFERENCES assignment_function(id) ON UPDATE NO ACTION ON DELETE NO ACTION;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', '', NOW(), 'Create Table, Add Foreign Key Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'create-table-manual_function', '2.0-rc7', '3:aac963ac8a7a63814472c50edf8b367a', 364);
-- Changeset src/main/resources/db.changelog-1.1.xml::change-numhours-to-effort-in-work-report-lines::idiazt::(Checksum: 3:824cfe1ec43c490e63bf2d8316f1255e)
-- Changing work_report_line numHours to effort
ALTER TABLE work_report_line RENAME COLUMN num_hours TO effort;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Changing work_report_line numHours to effort', NOW(), 'Rename Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'change-numhours-to-effort-in-work-report-lines', '2.0-rc7', '3:824cfe1ec43c490e63bf2d8316f1255e', 365);
-- Changeset src/main/resources/db.changelog-1.1.xml::update-numhours-values-to-effort-values::idiazt::(Checksum: 3:79a9659b3a77004c5fe13bbec8aad88c)
-- Updating numHours to effort (hours to seconds)
UPDATE work_report_line
SET effort = effort*3600;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Updating numHours to effort (hours to seconds)', NOW(), 'Custom SQL', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'update-numhours-values-to-effort-values', '2.0-rc7', '3:79a9659b3a77004c5fe13bbec8aad88c', 366);
-- Changeset src/main/resources/db.changelog-1.1.xml::change-sum_charged_hours-to-sum_charged_effort::mrego::(Checksum: 3:202833e32d386f5a3edf903b2d5a21b4)
-- Changing sum_charged_hours to sum_charged_effort
ALTER TABLE sum_charged_hours RENAME TO sum_charged_effort;
ALTER TABLE sum_charged_effort RENAME COLUMN direct_charged_hours TO direct_charged_effort;
ALTER TABLE sum_charged_effort RENAME COLUMN indirect_charged_hours TO indirect_charged_effort;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Changing sum_charged_hours to sum_charged_effort', NOW(), 'Rename Table, Rename Column (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'change-sum_charged_hours-to-sum_charged_effort', '2.0-rc7', '3:202833e32d386f5a3edf903b2d5a21b4', 367);
-- Changeset src/main/resources/db.changelog-1.1.xml::update-effort-values-in-sum_charged_effort::mrego::(Checksum: 3:6d7d2103e92b3ac55b9658931fc3ed65)
-- Updating effort values (hours to seconds) in sum_charged_effort table
UPDATE sum_charged_effort
SET direct_charged_effort = direct_charged_effort*3600;
UPDATE sum_charged_effort
SET indirect_charged_effort = indirect_charged_effort*3600;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Updating effort values (hours to seconds) in sum_charged_effort table', NOW(), 'Custom SQL (x2)', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'update-effort-values-in-sum_charged_effort', '2.0-rc7', '3:6d7d2103e92b3ac55b9658931fc3ed65', 368);
-- Changeset src/main/resources/db.changelog-1.1.xml::drop-foreign-key-sum_charged_hours_id-in-order_element::dmel::(Checksum: 3:288d757a697e34248fbb5dab4177c4a0)
ALTER TABLE order_element DROP CONSTRAINT fk92271f0b7ec17fa6;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('dmel', '', NOW(), 'Drop Foreign Key Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'drop-foreign-key-sum_charged_hours_id-in-order_element', '2.0-rc7', '3:288d757a697e34248fbb5dab4177c4a0', 369);
-- Changeset src/main/resources/db.changelog-1.1.xml::rename-sum_charged_hours_id-to-sum_charged_effort_id::mrego::(Checksum: 3:f8140dac93702c25f7fe75d9217ef9c5)
-- Rename sum_charged_hours_id to sum_charged_effort_id in order_element
ALTER TABLE order_element RENAME COLUMN sum_charged_hours_id TO sum_charged_effort_id;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Rename sum_charged_hours_id to sum_charged_effort_id in order_element', NOW(), 'Rename Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'rename-sum_charged_hours_id-to-sum_charged_effort_id', '2.0-rc7', '3:f8140dac93702c25f7fe75d9217ef9c5', 370);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-foreign-key-sum_charged_effort_id-in-order_element::dmel::(Checksum: 3:a8fa898f9cfaa1afa3afbab4c1c9f82b)
ALTER TABLE order_element ADD CONSTRAINT sum_charged_effort_id_fkey FOREIGN KEY (sum_charged_effort_id) REFERENCES sum_charged_effort(id) ON UPDATE NO ACTION ON DELETE NO ACTION;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('dmel', '', NOW(), 'Add Foreign Key Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-foreign-key-sum_charged_effort_id-in-order_element', '2.0-rc7', '3:a8fa898f9cfaa1afa3afbab4c1c9f82b', 371);
-- Changeset src/main/resources/db.changelog-1.1.xml::drop-column-date-in-stretches-table::mrego::(Checksum: 3:e0ed365c168583ff5c4c81c9ac79d644)
ALTER TABLE stretches DROP COLUMN date;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', '', NOW(), 'Drop Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'drop-column-date-in-stretches-table', '2.0-rc7', '3:e0ed365c168583ff5c4c81c9ac79d644', 372);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-version-to-planning-data::ogonzalez::(Checksum: 3:ae9dca1ca9cb3556cf5efdca689b8fc1)
ALTER TABLE planning_data ADD version BIGINT NOT NULL DEFAULT '0';
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('ogonzalez', '', NOW(), 'Add Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-version-to-planning-data', '2.0-rc7', '3:ae9dca1ca9cb3556cf5efdca689b8fc1', 373);
-- Changeset src/main/resources/db.changelog-1.1.xml::change-navalplan_user-to-libreplan_user-in-user_table::mrego::(Checksum: 3:82c71f38665f14d5d8ef9391a5c2487d)
-- Changing navalplan_user to libreplan_user in user_table
ALTER TABLE user_table RENAME COLUMN navalplan_user TO libreplan_user;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('mrego', 'Changing navalplan_user to libreplan_user in user_table', NOW(), 'Rename Column', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'change-navalplan_user-to-libreplan_user-in-user_table', '2.0-rc7', '3:82c71f38665f14d5d8ef9391a5c2487d', 374);
-- Changeset src/main/resources/db.changelog-1.1.xml::add-new-column-ldap-role-strategy::idiazt::(Checksum: 3:3145034f8fd26477ae1fac7da835a43e)
-- Add new column to store ldap role strategy
ALTER TABLE configuration ADD ldap_group_strategy BOOLEAN;
ALTER TABLE configuration ALTER COLUMN ldap_group_strategy SET DEFAULT 'TRUE';
UPDATE configuration SET ldap_group_strategy = 'TRUE' WHERE ldap_group_strategy IS NULL;
ALTER TABLE configuration ALTER COLUMN ldap_group_strategy SET NOT NULL;
INSERT INTO databasechangelog (AUTHOR, COMMENTS, DATEEXECUTED, DESCRIPTION, EXECTYPE, FILENAME, ID, LIQUIBASE, MD5SUM, ORDEREXECUTED) VALUES ('idiazt', 'Add new column to store ldap role strategy', NOW(), 'Add Column, Add Default Value, Add Not-Null Constraint', 'EXECUTED', 'src/main/resources/db.changelog-1.1.xml', 'add-new-column-ldap-role-strategy', '2.0-rc7', '3:3145034f8fd26477ae1fac7da835a43e', 375);
-- Release Database Lock
-- Release Database Lock

View file

@ -60,7 +60,7 @@ function costCategoryForm($name, $hworkName) {
_click(_cell("Save")); _click(_cell("Save"));
} }
*/ */
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function costCategoryNotValid(){ function costCategoryNotValid(){
_assertExists(_div("checkConstraintUniqueName: the cost category name has to be unique. It is already used")); _assertExists(_div("checkConstraintUniqueName: the cost category name has to be unique. It is already used"));
_assert(_isVisible(_div("checkConstraintUniqueName: the cost category name has to be unique. It is already used"))); _assert(_isVisible(_div("checkConstraintUniqueName: the cost category name has to be unique. It is already used")));

View file

@ -41,7 +41,7 @@ function materialCreate($name) {
function materialCreateWithoutCategory(){ function materialCreateWithoutCategory(){
_click(_link("Materials")); _click(_link("Materials"));
_click(_cell("z-button-cm[3]")); _click(_cell("New"));
materialWithoutCategoryValidation(); materialWithoutCategoryValidation();
} }
@ -54,12 +54,12 @@ function materialCreateEmpty(){
function materialForm($description) { function materialForm($description) {
_click(_link("Materials")); _click(_link("Materials"));
_click(_span("z-dottree-ico z-dottree-firstspacer")); _click(_span("z-dottree-ico z-dottree-firstspacer"));
_click(_cell("z-button-cm[3]")); _click(_cell("New"));
_setValue(_textbox("z-textbox[2]"), $description); _setValue(_textbox("z-textbox[2]"), $description);
_click(_cell("Save")); _click(_cell("Save"));
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function materialNotValid($material){ function materialNotValid($material){
_assertExists(_div("There exists other Materials with the same name.")); _assertExists(_div("There exists other Materials with the same name."));
_assert(_isVisible(_div("There exists other Materials with the same name."))); _assert(_isVisible(_div("There exists other Materials with the same name.")));

View file

@ -101,7 +101,7 @@ function criteriaEdit($oldName, $newName, $cell){
_log("Edit a criterion", "custom1"); _log("Edit a criterion", "custom1");
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function criteriaNotValid(){ function criteriaNotValid(){
_assertExists(_div("checkConstraintUniqueCriterionTypeName: criterion type name is already being used")); _assertExists(_div("checkConstraintUniqueCriterionTypeName: criterion type name is already being used"));
_assert(_isVisible(_div("checkConstraintUniqueCriterionTypeName: criterion type name is already being used"))); _assert(_isVisible(_div("checkConstraintUniqueCriterionTypeName: criterion type name is already being used")));

View file

@ -64,7 +64,7 @@ function exceptDayForm($name, $standar, $color){
_click(_cell("Save")); _click(_cell("Save"));
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function exceptDayNotValid($ExceptDayName){ function exceptDayNotValid($ExceptDayName){
_assertExists(_span("checkConstraintUniqueName: name is already used")); _assertExists(_span("checkConstraintUniqueName: name is already used"));
_assert(_isVisible(_span("checkConstraintUniqueName: name is already used"))); _assert(_isVisible(_span("checkConstraintUniqueName: name is already used")));
@ -94,7 +94,7 @@ function exceptDayCheckCode($exceptDayName){
function exceptDayCreateWithoutCode($name){ function exceptDayCreateWithoutCode($name){
commonCreate("Exception Days"); commonCreate("Exception Days");
exceptDayForm($name); exceptDayForm($name,"","");
commonEmptyCodeValidation(); commonEmptyCodeValidation();
} }
@ -110,7 +110,7 @@ commonLogin("admin", "admin");
exceptDayCreate($exceptDayName, $exceptDaystandar, 2); exceptDayCreate($exceptDayName, $exceptDaystandar, 2);
exceptDayCreateDuplicateName($exceptDayName, $exceptDaystandar, 1); exceptDayCreateDuplicateName($exceptDayName, $exceptDaystandar, 1);
exceptDayCreateEmpty("", $exceptDaystandar); exceptDayCreateEmpty("", $exceptDaystandar,"");
exceptDayEdit($exceptDayName, $exceptDayNewName, 5); exceptDayEdit($exceptDayName, $exceptDayNewName, 5);

View file

@ -66,7 +66,7 @@ function labelCreateDuplicateName($type, $name){
_log("Do not allow create a label with duplicate name", "custom1"); _log("Do not allow create a label with duplicate name", "custom1");
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function labelNotValid($labelType){ function labelNotValid($labelType){
_assertExists(_div("name: "+$labelType+" already exists")); _assertExists(_div("name: "+$labelType+" already exists"));
_assert(_isVisible(_div("name: "+$labelType+" already exists"))); _assert(_isVisible(_div("name: "+$labelType+" already exists")));

View file

@ -54,7 +54,7 @@ function progressCreateEmpty() {
_log("Do not allow create a progress without name", "custom1"); _log("Do not allow create a progress without name", "custom1");
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function progressNotValid(){ function progressNotValid(){
_assertExists(_div("The name is not valid, there is another progress type with the same name.")); _assertExists(_div("The name is not valid, there is another progress type with the same name."));
_assert(_isVisible(_div("The name is not valid, there is another progress type with the same name."))); _assert(_isVisible(_div("The name is not valid, there is another progress type with the same name.")));

View file

@ -64,7 +64,7 @@ function unitMeasureForm($name){
_click(_cell("Save & Continue")); _click(_cell("Save & Continue"));
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function unitMeasureNotValidation(){ function unitMeasureNotValidation(){
_assertExists(_div("The meausure name is not valid. There is another unit type with the same measure name")); _assertExists(_div("The meausure name is not valid. There is another unit type with the same measure name"));
_assert(_isVisible(_div("The meausure name is not valid. There is another unit type with the same measure name"))); _assert(_isVisible(_div("The meausure name is not valid. There is another unit type with the same measure name")));

View file

@ -64,7 +64,7 @@ function workHourCreateEmpty(){
_log("Do not allow create a empty Work Hour", "custom1"); _log("Do not allow create a empty Work Hour", "custom1");
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function workHourNotValid($hWorkType){ function workHourNotValid($hWorkType){
_assertExists(_span("checkConstraintUniqueName: the type of work hours name has to be unique. It is already used")); _assertExists(_span("checkConstraintUniqueName: the type of work hours name has to be unique. It is already used"));
_assert(_isVisible(_span("checkConstraintUniqueName: the type of work hours name has to be unique. It is already used"))); _assert(_isVisible(_span("checkConstraintUniqueName: the type of work hours name has to be unique. It is already used")));
@ -81,7 +81,7 @@ function workHourAssign($hWorkNewName, $ModelName, $materialName, $materialDescr
commonWorkReportModelCreate($ModelName); commonWorkReportModelCreate($ModelName);
commonCreateProject("new project"); commonCreateProject("new project");
commonMachineCreate($materialName, $materialDescription); commonMachineCreate($materialName, $materialDescription);
workReportCreate($materialName, "new project", $hWorkNewName); workReportCreate($materialName, "new project", $hWorkNewName, $ModelName);
workHourTryDelete($hWorkNewName, "work report line"); workHourTryDelete($hWorkNewName, "work report line");
reportModelTryDelete($ModelName); reportModelTryDelete($ModelName);
commonTryDeleteProject("new project"); commonTryDeleteProject("new project");
@ -131,19 +131,20 @@ function reportModelTryDelete($ModelName){
* Functions of Work Report * Functions of Work Report
* */ * */
function workReportCreate($wReport, $project, $workHour) { function workReportCreate($wReport, $project, $workHour, $modelName) {
_click(_link("Work Reports")); _click(_link("Work Reports"));
workReportForm($wReport, $project, $workHour); workReportForm($wReport, $project, $workHour, $modelName);
_log("Create a Work Report", "custom1"); _log("Create a Work Report", "custom1");
} }
function workReportForm($machine, $project, $workHour) { function workReportForm($machine, $project, $workHour, $modelName) {
_setSelected(_select(0, _near(_span("Select type:"))), $modelName);
_click(_cell("New work report")); _click(_cell("New work report"));
_click(_cell("Add new row")); _click(_cell("Add new row"));
_setValue(_textbox(2, _near(_span("Work report lines"))), $machine); _setValue(_textbox(2, _near(_span("Work report lines"))), $machine);
_click(_italic(0, _near(_textbox(3, _near(_span("Work report lines")))))); _click(_italic(0, _near(_textbox(3, _near(_span("Work report lines"))))));
_click(_div($project+"[2]", _parentTable(_div("Project code[1]")))); _click(_div($project+"[2]", _parentTable(_div("Project code[1]"))));
_setValue(_textbox("z-textbox[1]"),"8"); _setValue(_textbox("z-textbox[1]"), "8");
_setSelected(_select(2), $workHour); _setSelected(_select(2), $workHour);
_click(_cell("Save")); _click(_cell("Save"));
_assertExists(_div("Work report saved")); _assertExists(_div("Work report saved"));

View file

@ -71,7 +71,7 @@ function workReportModelForm($name){
_click(_cell("Save")); _click(_cell("Save"));
} }
/* test to check a that naval plan give us a error */ /* test to check a that LibrePlan give us a error */
function workReportModelNotValid(){ function workReportModelNotValid(){
_assertExists(_div("There exists other workReportType with the same name.")); _assertExists(_div("There exists other workReportType with the same name."));
_assert(_isVisible(_div("There exists other workReportType with the same name."))); _assert(_isVisible(_div("There exists other workReportType with the same name.")));

View file

@ -133,7 +133,7 @@ function machineAssignProjectForm($machine){
_click(_cell($machine)); _click(_cell($machine));
_click(_cell("Add")); _click(_cell("Add"));
_setValue(_textbox(0, _near(_span("Sum of all rows"))), "1"); _setValue(_textbox(0, _near(_span("Sum of all rows"))), "1");
_click(_cell("z-button-cm[40]")); _click(_row("Accept[2]"));
_assertExists(_div("box standard-task assigned")); _assertExists(_div("box standard-task assigned"));
_log("Task assigned", "custom1"); _log("Task assigned", "custom1");
_click(_image("ico_save.png")); _click(_image("ico_save.png"));

View file

@ -52,7 +52,7 @@ function subcontractingTaskForSubcontractForm($company, $subProjectName){
_setValue(_textbox(0, _near(_span("Subcontract price"))), "6000"); _setValue(_textbox(0, _near(_span("Subcontract price"))), "6000");
_setValue(_textbox(0, _near(_span("Subcontracted code"))), $companyId); _setValue(_textbox(0, _near(_span("Subcontracted code"))), $companyId);
_click(_checkbox(0, _near(_span("Hours groups")))); _click(_checkbox(0, _near(_span("Hours groups"))));
_click(_cell("z-button-cm[39]")); _click(_row("Accept[2]"));
_click(_image("ico_save.png")); _click(_image("ico_save.png"));
_click(_cell("OK")); _click(_cell("OK"));
} }

View file

@ -137,7 +137,7 @@ function virtualWorkerAssignProjectForm($workerName){
_click(_div($workerName)); _click(_div($workerName));
_click(_cell($workerName)); _click(_cell($workerName));
_click(_cell("Add")); _click(_cell("Add"));
_click(_cell("z-button-cm[40]")); _click(_row("Accept[2]"));
_assertExists(_div("box standard-task assigned")); _assertExists(_div("box standard-task assigned"));
_log("Task assigned", "custom1"); _log("Task assigned", "custom1");
_click(_image("ico_save.png")); _click(_image("ico_save.png"));

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