First commit waiting for Budget Alert
This commit is contained in:
25
modules/axelor-open-suite/axelor-project/build.gradle
Normal file
25
modules/axelor-open-suite/axelor-project/build.gradle
Normal file
@ -0,0 +1,25 @@
|
||||
apply plugin: "com.axelor.app-module"
|
||||
|
||||
apply from: "../version.gradle"
|
||||
|
||||
apply {
|
||||
version = openSuiteVersion
|
||||
}
|
||||
|
||||
axelor {
|
||||
title "Axelor Project"
|
||||
description "Axelor Project Module"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile project(":modules:axelor-base")
|
||||
}
|
||||
|
||||
task copyWebapp(type: Copy) {
|
||||
destinationDir = file(rootProject.buildDir)
|
||||
into("webapp/project") {
|
||||
from "src/main/webapp"
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.tasks.war.dependsOn copyWebapp
|
||||
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.csv.script;
|
||||
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import com.axelor.team.db.repo.TeamTaskRepository;
|
||||
import java.util.Map;
|
||||
|
||||
public class TeamTaskScript {
|
||||
|
||||
public Object computeFullname(Object bean, Map<String, Object> values) {
|
||||
TeamTask task = ((TeamTask) bean);
|
||||
Beans.get(TeamTaskRepository.class).save(task);
|
||||
return task;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.db.repo;
|
||||
|
||||
import com.axelor.apps.base.db.AppProject;
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.repo.SequenceRepository;
|
||||
import com.axelor.apps.base.service.administration.SequenceService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.apps.project.exception.IExceptionMessage;
|
||||
import com.axelor.apps.project.service.app.AppProjectService;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.exception.db.repo.TraceBackRepository;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.team.db.Team;
|
||||
import com.google.common.base.Strings;
|
||||
import java.math.BigDecimal;
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
public class ProjectManagementRepository extends ProjectRepository {
|
||||
|
||||
private void setAllProjectFullName(Project project) {
|
||||
String projectCode =
|
||||
(Strings.isNullOrEmpty(project.getCode())) ? "" : project.getCode() + " - ";
|
||||
project.setFullName(projectCode + project.getName());
|
||||
if (project.getChildProjectList() != null && !project.getChildProjectList().isEmpty()) {
|
||||
for (Project child : project.getChildProjectList()) {
|
||||
String code = (Strings.isNullOrEmpty(child.getCode())) ? "" : child.getCode() + " - ";
|
||||
child.setFullName(code + child.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void setAllProjectMembersUserSet(Project project) {
|
||||
if (project.getParentProject() == null && project.getChildProjectList() != null) {
|
||||
project
|
||||
.getChildProjectList()
|
||||
.stream()
|
||||
.filter(Project::getExtendsMembersFromParent)
|
||||
.peek(p -> project.getMembersUserSet().forEach(p::addMembersUserSetItem))
|
||||
.forEach(p -> p.setTeam(project.getTeam()));
|
||||
} else if (project.getParentProject() != null
|
||||
&& project.getExtendsMembersFromParent()
|
||||
&& !project.getSynchronize()) {
|
||||
project.getParentProject().getMembersUserSet().forEach(project.getMembersUserSet()::add);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project save(Project project) {
|
||||
|
||||
ProjectManagementRepository.setAllProjectMembersUserSet(project);
|
||||
|
||||
if (project.getSynchronize()) {
|
||||
Team team = project.getTeam();
|
||||
if (team != null) {
|
||||
team.clearMembers();
|
||||
project.getMembersUserSet().forEach(team::addMember);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
AppProject appProject = Beans.get(AppProjectService.class).getAppProject();
|
||||
|
||||
if (Strings.isNullOrEmpty(project.getCode()) && appProject.getGenerateProjectSequence()) {
|
||||
Company company = project.getCompany();
|
||||
String seq =
|
||||
Beans.get(SequenceService.class)
|
||||
.getSequenceNumber(SequenceRepository.PROJECT_SEQUENCE, company);
|
||||
|
||||
if (seq == null) {
|
||||
throw new AxelorException(
|
||||
company,
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.PROJECT_SEQUENCE_ERROR),
|
||||
company.getName());
|
||||
}
|
||||
|
||||
project.setCode(seq);
|
||||
}
|
||||
} catch (AxelorException e) {
|
||||
throw new PersistenceException(e.getLocalizedMessage());
|
||||
}
|
||||
setAllProjectFullName(project);
|
||||
|
||||
project.setEstimatedTimeHrs(
|
||||
project
|
||||
.getEstimatedTimeDays()
|
||||
.multiply(Beans.get(AppBaseService.class).getAppBase().getDailyWorkHours()));
|
||||
|
||||
return super.save(project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project copy(Project entity, boolean deep) {
|
||||
Project project = super.copy(entity, false);
|
||||
project.setStatusSelect(STATE_NEW);
|
||||
project.setProgress(BigDecimal.ZERO);
|
||||
return project;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.db.repo;
|
||||
|
||||
import com.axelor.apps.project.db.ProjectTemplate;
|
||||
import com.google.common.base.Strings;
|
||||
|
||||
public class ProjectTemplateManagementRepository extends ProjectTemplateRepository {
|
||||
|
||||
private void setProjectTemplateFullName(ProjectTemplate entity) {
|
||||
String projectCode = (Strings.isNullOrEmpty(entity.getCode())) ? "" : entity.getCode() + " - ";
|
||||
entity.setFullName(projectCode + entity.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProjectTemplate save(ProjectTemplate entity) {
|
||||
this.setProjectTemplateFullName(entity);
|
||||
|
||||
return super.save(entity);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.db.repo;
|
||||
|
||||
import com.axelor.apps.project.db.ResourceBooking;
|
||||
import com.google.common.base.Strings;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ResourceBookingRepository extends AbstractResourceBookingRepository {
|
||||
|
||||
public String computeName(ResourceBooking resourceBooking) {
|
||||
List<String> list = new ArrayList<>();
|
||||
|
||||
if (resourceBooking.getResource() != null) {
|
||||
if (resourceBooking.getResource().getResourceType() != null
|
||||
&& !Strings.isNullOrEmpty(resourceBooking.getResource().getResourceType().getName())) {
|
||||
list.add(resourceBooking.getResource().getResourceType().getName());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(resourceBooking.getResource().getName())) {
|
||||
list.add(resourceBooking.getResource().getName());
|
||||
}
|
||||
}
|
||||
|
||||
if (resourceBooking.getProject() != null
|
||||
&& !Strings.isNullOrEmpty(resourceBooking.getProject().getFullName())) {
|
||||
list.add(resourceBooking.getProject().getFullName());
|
||||
}
|
||||
|
||||
if (resourceBooking.getTask() != null
|
||||
&& !Strings.isNullOrEmpty(resourceBooking.getTask().getFullName())) {
|
||||
list.add(resourceBooking.getTask().getFullName());
|
||||
}
|
||||
|
||||
return String.join(" - ", list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceBooking save(ResourceBooking entity) {
|
||||
if (Strings.isNullOrEmpty(entity.getName())) {
|
||||
entity.setName(computeName(entity));
|
||||
}
|
||||
return super.save(entity);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.db.repo;
|
||||
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.db.JPA;
|
||||
import com.axelor.team.db.Team;
|
||||
import com.axelor.team.db.repo.TeamRepository;
|
||||
import java.util.List;
|
||||
|
||||
public class TeamProjectRepository extends TeamRepository {
|
||||
@Override
|
||||
public Team save(Team team) {
|
||||
List<Project> projects =
|
||||
JPA.all(Project.class)
|
||||
.filter("self.team = :team AND self.synchronize = true")
|
||||
.bind("team", team)
|
||||
.fetch();
|
||||
projects
|
||||
.stream()
|
||||
.peek(Project::clearMembersUserSet)
|
||||
.peek(p -> team.getMembers().forEach(p::addMembersUserSetItem))
|
||||
.forEach(ProjectManagementRepository::setAllProjectMembersUserSet);
|
||||
return super.save(team);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.db.repo;
|
||||
|
||||
import com.axelor.apps.base.db.repo.TeamTaskBaseRepository;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class TeamTaskProjectRepository extends TeamTaskBaseRepository {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||
|
||||
@Override
|
||||
public TeamTask save(TeamTask teamTask) {
|
||||
List<String> composedNames = new ArrayList<>();
|
||||
if (teamTask.getId() != null) {
|
||||
composedNames.add("#" + teamTask.getId());
|
||||
}
|
||||
composedNames.add(teamTask.getName());
|
||||
teamTask.setFullName(String.join(" ", composedNames));
|
||||
return super.save(teamTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> validate(Map<String, Object> json, Map<String, Object> context) {
|
||||
|
||||
logger.debug("Validate team task:{}", json);
|
||||
|
||||
logger.debug(
|
||||
"Planned progress:{}, ProgressSelect: {}, DurationHours: {}, TaskDuration: {}",
|
||||
json.get("plannedProgress"),
|
||||
json.get("progressSelect"),
|
||||
json.get("durationHours"),
|
||||
json.get("taskDuration"));
|
||||
|
||||
if (json.get("id") != null) {
|
||||
|
||||
TeamTask savedTask = find(Long.parseLong(json.get("id").toString()));
|
||||
if (json.get("plannedProgress") != null) {
|
||||
BigDecimal plannedProgress = new BigDecimal(json.get("plannedProgress").toString());
|
||||
if (plannedProgress != null
|
||||
&& savedTask.getPlannedProgress().intValue() != plannedProgress.intValue()) {
|
||||
logger.debug(
|
||||
"Updating progressSelect: {}", ((int) (plannedProgress.intValue() * 0.10)) * 10);
|
||||
json.put("progressSelect", ((int) (plannedProgress.intValue() * 0.10)) * 10);
|
||||
}
|
||||
} else if (json.get("progressSelect") != null) {
|
||||
Integer progressSelect = new Integer(json.get("progressSelect").toString());
|
||||
logger.debug("Updating plannedProgress: {}", progressSelect);
|
||||
json.put("plannedProgress", new BigDecimal(progressSelect));
|
||||
}
|
||||
if (json.get("durationHours") != null) {
|
||||
BigDecimal durationHours = new BigDecimal(json.get("durationHours").toString());
|
||||
if (durationHours != null
|
||||
&& savedTask.getDurationHours().intValue() != durationHours.intValue()) {
|
||||
logger.debug(
|
||||
"Updating taskDuration: {}",
|
||||
durationHours.divide(new BigDecimal(24), RoundingMode.HALF_EVEN).intValue());
|
||||
json.put("taskDuration", durationHours.multiply(new BigDecimal(3600)).intValue());
|
||||
}
|
||||
} else if (json.get("taskDuration") != null) {
|
||||
Integer taskDuration = new Integer(json.get("taskDuration").toString());
|
||||
logger.debug("Updating durationHours: {}", taskDuration / 3600);
|
||||
json.put("durationHours", new BigDecimal(taskDuration / 3600));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (json.get("progressSelect") != null) {
|
||||
Integer progressSelect = new Integer(json.get("progressSelect").toString());
|
||||
json.put("plannedProgress", new BigDecimal(progressSelect));
|
||||
}
|
||||
if (json.get("taskDuration") != null) {
|
||||
Integer taskDuration = new Integer(json.get("taskDuration").toString());
|
||||
json.put("durationHours", new BigDecimal(taskDuration / 3600));
|
||||
}
|
||||
}
|
||||
|
||||
return super.validate(json, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TeamTask copy(TeamTask entity, boolean deep) {
|
||||
entity.setProgressSelect(null);
|
||||
entity.setTaskEndDate(null);
|
||||
entity.setMetaFile(null);
|
||||
return super.copy(entity, deep);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.exception;
|
||||
|
||||
/**
|
||||
* Interface of Exceptions. Enum all exception of axelor-account.
|
||||
*
|
||||
* @author dubaux
|
||||
*/
|
||||
public interface IExceptionMessage {
|
||||
|
||||
static final String PROJECT_PLANNING_NO_TASK = /*$$(*/
|
||||
"You have no projects or tasks bound to you, your planning can't be generated." /*)*/;
|
||||
static final String PROJECT_PLANNING_NO_TASK_TEAM = /*$$(*/
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated." /*)*/;
|
||||
static final String PROJECT_CUSTOMER_PARTNER = /*$$(*/
|
||||
"The selected project/task doesn't contain any customers" /*)*/;
|
||||
static final String PROJECT_DEEP_LIMIT_REACH = /*$$(*/
|
||||
"The deep limit of the project is too high" /*)*/;
|
||||
static final String PROJECT_NO_ACTIVE_TEAM = /*$$(*/
|
||||
"You have no active team, the planning can't be generated" /*)*/;
|
||||
static final String PROJECT_NO_TEAM = /*$$(*/ "You have selected no team for this project" /*)*/;
|
||||
static final String PROJECT_SEQUENCE_ERROR = /*$$(*/
|
||||
"The company %s doesn't have any configured sequence for Project" /*)*/;
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.module;
|
||||
|
||||
import com.axelor.app.AxelorModule;
|
||||
import com.axelor.apps.base.db.repo.TeamTaskBaseRepository;
|
||||
import com.axelor.apps.base.service.TeamTaskServiceImpl;
|
||||
import com.axelor.apps.project.db.repo.AbstractResourceBookingRepository;
|
||||
import com.axelor.apps.project.db.repo.ProjectManagementRepository;
|
||||
import com.axelor.apps.project.db.repo.ProjectRepository;
|
||||
import com.axelor.apps.project.db.repo.ProjectTemplateManagementRepository;
|
||||
import com.axelor.apps.project.db.repo.ProjectTemplateRepository;
|
||||
import com.axelor.apps.project.db.repo.ResourceBookingRepository;
|
||||
import com.axelor.apps.project.db.repo.TeamProjectRepository;
|
||||
import com.axelor.apps.project.db.repo.TeamTaskProjectRepository;
|
||||
import com.axelor.apps.project.service.ProjectService;
|
||||
import com.axelor.apps.project.service.ProjectServiceImpl;
|
||||
import com.axelor.apps.project.service.TeamTaskProjectService;
|
||||
import com.axelor.apps.project.service.TeamTaskProjectServiceImpl;
|
||||
import com.axelor.apps.project.service.TimerTeamTaskService;
|
||||
import com.axelor.apps.project.service.TimerTeamTaskServiceImpl;
|
||||
import com.axelor.apps.project.service.app.AppProjectService;
|
||||
import com.axelor.apps.project.service.app.AppProjectServiceImpl;
|
||||
import com.axelor.team.db.repo.TeamRepository;
|
||||
|
||||
public class ProjectModule extends AxelorModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
bind(ProjectRepository.class).to(ProjectManagementRepository.class);
|
||||
bind(ProjectTemplateRepository.class).to(ProjectTemplateManagementRepository.class);
|
||||
bind(AppProjectService.class).to(AppProjectServiceImpl.class);
|
||||
bind(TeamTaskBaseRepository.class).to(TeamTaskProjectRepository.class);
|
||||
bind(ProjectService.class).to(ProjectServiceImpl.class);
|
||||
bind(TeamTaskProjectService.class).to(TeamTaskProjectServiceImpl.class);
|
||||
bind(TeamTaskServiceImpl.class).to(TeamTaskProjectServiceImpl.class);
|
||||
bind(TeamRepository.class).to(TeamProjectRepository.class);
|
||||
bind(TimerTeamTaskService.class).to(TimerTeamTaskServiceImpl.class);
|
||||
bind(AbstractResourceBookingRepository.class).to(ResourceBookingRepository.class);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service;
|
||||
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.apps.project.db.ProjectTemplate;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public interface ProjectService {
|
||||
Project generateProject(
|
||||
Project parentProject,
|
||||
String fullName,
|
||||
User assignedTo,
|
||||
Company company,
|
||||
Partner clientPartner);
|
||||
|
||||
Partner getClientPartnerFromProject(Project project) throws AxelorException;
|
||||
|
||||
BigDecimal computeDurationFromChildren(Long projectId);
|
||||
|
||||
/**
|
||||
* Generate a project from a partner.
|
||||
*
|
||||
* @param partner
|
||||
* @return
|
||||
*/
|
||||
Project generateProject(Partner partner);
|
||||
|
||||
public Project createProjectFromTemplate(
|
||||
ProjectTemplate projectTemplate, String projectCode, Partner clientPartner)
|
||||
throws AxelorException;
|
||||
}
|
||||
@ -0,0 +1,304 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service;
|
||||
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.apps.project.db.ProjectTemplate;
|
||||
import com.axelor.apps.project.db.TaskTemplate;
|
||||
import com.axelor.apps.project.db.Wiki;
|
||||
import com.axelor.apps.project.db.repo.ProjectRepository;
|
||||
import com.axelor.apps.project.db.repo.WikiRepository;
|
||||
import com.axelor.apps.project.exception.IExceptionMessage;
|
||||
import com.axelor.apps.project.translation.ITranslation;
|
||||
import com.axelor.auth.AuthUtils;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.common.ObjectUtils;
|
||||
import com.axelor.db.JPA;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.exception.db.repo.TraceBackRepository;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import com.axelor.team.db.repo.TeamTaskRepository;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import javax.persistence.TypedQuery;
|
||||
|
||||
public class ProjectServiceImpl implements ProjectService {
|
||||
|
||||
public static final int MAX_LEVEL_OF_PROJECT = 10;
|
||||
|
||||
private ProjectRepository projectRepository;
|
||||
|
||||
@Inject
|
||||
public ProjectServiceImpl(ProjectRepository projectRepository) {
|
||||
this.projectRepository = projectRepository;
|
||||
}
|
||||
|
||||
@Inject WikiRepository wikiRepo;
|
||||
@Inject TeamTaskProjectService teamTaskProjectService;
|
||||
|
||||
@Override
|
||||
public Project generateProject(
|
||||
Project parentProject,
|
||||
String fullName,
|
||||
User assignedTo,
|
||||
Company company,
|
||||
Partner clientPartner) {
|
||||
Project project;
|
||||
project = projectRepository.findByName(fullName);
|
||||
if (project != null) {
|
||||
return project;
|
||||
}
|
||||
project = new Project();
|
||||
project.setStatusSelect(ProjectRepository.STATE_NEW);
|
||||
project.setParentProject(parentProject);
|
||||
if (parentProject != null) {
|
||||
parentProject.addChildProjectListItem(project);
|
||||
project.setProjectTypeSelect(ProjectRepository.TYPE_PHASE);
|
||||
} else {
|
||||
project.setProjectTypeSelect(ProjectRepository.TYPE_PROJECT);
|
||||
}
|
||||
if (Strings.isNullOrEmpty(fullName)) {
|
||||
fullName = "project";
|
||||
}
|
||||
project.setName(fullName);
|
||||
project.setFullName(project.getName());
|
||||
project.setCompany(company);
|
||||
project.setClientPartner(clientPartner);
|
||||
project.setAssignedTo(assignedTo);
|
||||
project.setProgress(BigDecimal.ZERO);
|
||||
return project;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Project generateProject(Partner partner) {
|
||||
Preconditions.checkNotNull(partner);
|
||||
User user = AuthUtils.getUser();
|
||||
Project project =
|
||||
Beans.get(ProjectService.class)
|
||||
.generateProject(
|
||||
null, getUniqueProjectName(partner), user, user.getActiveCompany(), partner);
|
||||
return projectRepository.save(project);
|
||||
}
|
||||
|
||||
private String getUniqueProjectName(Partner partner) {
|
||||
String baseName = String.format(I18n.get("%s project"), partner.getName());
|
||||
long count =
|
||||
projectRepository.all().filter(String.format("self.name LIKE '%s%%'", baseName)).count();
|
||||
|
||||
if (count == 0) {
|
||||
return baseName;
|
||||
}
|
||||
|
||||
String name;
|
||||
|
||||
do {
|
||||
name = String.format("%s %d", baseName, ++count);
|
||||
} while (projectRepository.findByName(name) != null);
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Partner getClientPartnerFromProject(Project project) throws AxelorException {
|
||||
return this.getClientPartnerFromProject(project, 0);
|
||||
}
|
||||
|
||||
private Partner getClientPartnerFromProject(Project project, int counter) throws AxelorException {
|
||||
if (project.getParentProject() == null) {
|
||||
// it is a root project, can get the client partner
|
||||
if (project.getClientPartner() == null) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.PROJECT_CUSTOMER_PARTNER));
|
||||
} else {
|
||||
return project.getClientPartner();
|
||||
}
|
||||
} else {
|
||||
if (counter > MAX_LEVEL_OF_PROJECT) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.PROJECT_DEEP_LIMIT_REACH));
|
||||
} else {
|
||||
return this.getClientPartnerFromProject(project.getParentProject(), counter + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BigDecimal computeDurationFromChildren(Long projectId) {
|
||||
String query =
|
||||
"SELECT SUM(pt.duration)" + " FROM Project as pt" + " WHERE pt.project.id = :projectId";
|
||||
|
||||
TypedQuery<BigDecimal> q = JPA.em().createQuery(query, BigDecimal.class);
|
||||
q.setParameter("projectId", projectId);
|
||||
return q.getSingleResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Project createProjectFromTemplate(
|
||||
ProjectTemplate projectTemplate, String projectCode, Partner clientPartner)
|
||||
throws AxelorException {
|
||||
|
||||
Project project = new Project();
|
||||
project.setName(projectTemplate.getName());
|
||||
|
||||
if (projectRepository.all().filter("self.code = ?", projectCode).count() > 0) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_INCONSISTENCY, ITranslation.PROJECT_CODE_ERROR);
|
||||
} else {
|
||||
|
||||
project.setCode(projectCode);
|
||||
project.setClientPartner(clientPartner);
|
||||
if (clientPartner != null
|
||||
&& clientPartner.getContactPartnerSet() != null
|
||||
&& !clientPartner.getContactPartnerSet().isEmpty()) {
|
||||
project.setContactPartner(clientPartner.getContactPartnerSet().iterator().next());
|
||||
}
|
||||
project.setDescription(projectTemplate.getDescription());
|
||||
project.setTeam(projectTemplate.getTeam());
|
||||
project.setProjectFolderSet(new HashSet<>(projectTemplate.getProjectFolderSet()));
|
||||
project.setAssignedTo(projectTemplate.getAssignedTo());
|
||||
project.setTeamTaskCategorySet(new HashSet<>(projectTemplate.getTeamTaskCategorySet()));
|
||||
project.setSynchronize(projectTemplate.getSynchronize());
|
||||
project.setMembersUserSet(new HashSet<>(projectTemplate.getMembersUserSet()));
|
||||
project.setImputable(projectTemplate.getImputable());
|
||||
project.setCompany(projectTemplate.getCompany());
|
||||
project.setProductSet(new HashSet<>(projectTemplate.getProductSet()));
|
||||
project.setExcludePlanning(projectTemplate.getExcludePlanning());
|
||||
project.setProjectTypeSelect(ProjectRepository.TYPE_PROJECT);
|
||||
|
||||
List<Wiki> wikiList = projectTemplate.getWikiList();
|
||||
|
||||
if (wikiList != null && !wikiList.isEmpty()) {
|
||||
|
||||
for (Wiki wiki : wikiList) {
|
||||
wiki = wikiRepo.copy(wiki, false);
|
||||
wiki.setProjectTemplate(null);
|
||||
project.addWikiListItem(wiki);
|
||||
}
|
||||
}
|
||||
|
||||
projectRepository.save(project);
|
||||
|
||||
Set<TaskTemplate> taskTemplateSet = projectTemplate.getTaskTemplateSet();
|
||||
if (ObjectUtils.isEmpty(taskTemplateSet)) {
|
||||
return project;
|
||||
}
|
||||
List<TaskTemplate> taskTemplateList = new ArrayList<TaskTemplate>(taskTemplateSet);
|
||||
Collections.sort(
|
||||
taskTemplateList,
|
||||
new Comparator<TaskTemplate>() {
|
||||
|
||||
@Override
|
||||
public int compare(TaskTemplate taskTemplatet1, TaskTemplate taskTemplate2) {
|
||||
return taskTemplatet1.getParentTaskTemplate() == null || taskTemplate2 == null
|
||||
? 1
|
||||
: taskTemplatet1.getParentTaskTemplate().equals(taskTemplate2) ? -1 : 1;
|
||||
}
|
||||
});
|
||||
|
||||
if (taskTemplateList != null) {
|
||||
for (TaskTemplate taskTemplate : taskTemplateList) {
|
||||
createTask(taskTemplate, project, taskTemplateSet);
|
||||
}
|
||||
}
|
||||
|
||||
return project;
|
||||
}
|
||||
}
|
||||
|
||||
public TeamTask createTask(TaskTemplate taskTemplate, Project project) {
|
||||
System.out.println("***********No parent*******************");
|
||||
System.out.println(project.getId());
|
||||
TeamTask task =
|
||||
teamTaskProjectService.create(
|
||||
taskTemplate.getName(), project, taskTemplate.getAssignedTo());
|
||||
task.setDescription(taskTemplate.getDescription());
|
||||
task.setTaskTemplate(taskTemplate);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public TeamTask createTask(
|
||||
TaskTemplate taskTemplate, TaskTemplate parentTaskTemplate, Project project) {
|
||||
|
||||
System.out.println("***********parent*******************");
|
||||
System.out.println(project.getId());
|
||||
TeamTask task =
|
||||
teamTaskProjectService.create(
|
||||
taskTemplate.getName(), project, taskTemplate.getAssignedTo());
|
||||
|
||||
TeamTask parent =
|
||||
Beans.get(TeamTaskRepository.class)
|
||||
.all()
|
||||
.fetch()
|
||||
.stream()
|
||||
.filter(
|
||||
t -> {
|
||||
return t.getProject().getId() == project.getId()
|
||||
&& t.getTaskTemplate().getId() == parentTaskTemplate.getId();
|
||||
})
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
task.setDescription(taskTemplate.getDescription());
|
||||
task.setTaskTemplate(taskTemplate);
|
||||
task.setParentTask(parent);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public TeamTask createTask(
|
||||
TaskTemplate taskTemplate, Project project, Set<TaskTemplate> taskTemplateSet) {
|
||||
|
||||
if (!ObjectUtils.isEmpty(project.getTeamTaskList())) {
|
||||
for (TeamTask projectTask : project.getTeamTaskList()) {
|
||||
if (projectTask.getName().equals(taskTemplate.getName())) {
|
||||
return projectTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
TeamTask task =
|
||||
teamTaskProjectService.create(
|
||||
taskTemplate.getName(), project, taskTemplate.getAssignedTo());
|
||||
task.setDescription(taskTemplate.getDescription());
|
||||
|
||||
TaskTemplate parentTaskTemplate = taskTemplate.getParentTaskTemplate();
|
||||
|
||||
if (parentTaskTemplate != null && taskTemplateSet.contains(parentTaskTemplate)) {
|
||||
task.setParentTask(this.createTask(parentTaskTemplate, project, taskTemplateSet));
|
||||
return task;
|
||||
}
|
||||
return task;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service;
|
||||
|
||||
import com.axelor.apps.base.service.TeamTaskService;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
|
||||
public interface TeamTaskProjectService extends TeamTaskService {
|
||||
TeamTask create(String subject, Project project, User assignedTo);
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service;
|
||||
|
||||
import com.axelor.apps.base.service.TeamTaskServiceImpl;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import com.axelor.team.db.repo.TeamTaskRepository;
|
||||
import com.google.inject.Inject;
|
||||
import java.time.LocalDate;
|
||||
|
||||
public class TeamTaskProjectServiceImpl extends TeamTaskServiceImpl
|
||||
implements TeamTaskProjectService {
|
||||
|
||||
@Inject
|
||||
public TeamTaskProjectServiceImpl(TeamTaskRepository teamTaskRepo) {
|
||||
super(teamTaskRepo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TeamTask create(String subject, Project project, User assignedTo) {
|
||||
TeamTask task = new TeamTask();
|
||||
task.setName(subject);
|
||||
task.setAssignedTo(assignedTo);
|
||||
task.setTaskDate(LocalDate.now());
|
||||
task.setStatus("new");
|
||||
task.setPriority("normal");
|
||||
project.addTeamTaskListItem(task);
|
||||
return task;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setModuleFields(TeamTask teamTask, LocalDate date, TeamTask newTeamTask) {
|
||||
super.setModuleFields(teamTask, date, newTeamTask);
|
||||
|
||||
// Module 'project' fields
|
||||
newTeamTask.setProgressSelect(0);
|
||||
newTeamTask.setTaskEndDate(date);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateModuleFields(TeamTask teamTask, TeamTask nextTeamTask) {
|
||||
super.updateModuleFields(teamTask, nextTeamTask);
|
||||
|
||||
// Module 'project' fields
|
||||
nextTeamTask.setFullName(teamTask.getFullName());
|
||||
nextTeamTask.setProject(teamTask.getProject());
|
||||
nextTeamTask.setTeamTaskCategory(teamTask.getTeamTaskCategory());
|
||||
nextTeamTask.setProgressSelect(0);
|
||||
|
||||
teamTask.getMembersUserSet().forEach(nextTeamTask::addMembersUserSetItem);
|
||||
|
||||
nextTeamTask.setTeam(teamTask.getTeam());
|
||||
nextTeamTask.setParentTask(teamTask.getParentTask());
|
||||
nextTeamTask.setProduct(teamTask.getProduct());
|
||||
nextTeamTask.setUnit(teamTask.getUnit());
|
||||
nextTeamTask.setQuantity(teamTask.getQuantity());
|
||||
nextTeamTask.setUnitPrice(teamTask.getUnitPrice());
|
||||
nextTeamTask.setTaskEndDate(teamTask.getTaskEndDate());
|
||||
nextTeamTask.setBudgetedTime(teamTask.getBudgetedTime());
|
||||
nextTeamTask.setCurrency(teamTask.getCurrency());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service;
|
||||
|
||||
import com.axelor.apps.base.db.Timer;
|
||||
import com.axelor.apps.base.db.TimerHistory;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public interface TimerTeamTaskService {
|
||||
|
||||
Timer find(TeamTask task);
|
||||
|
||||
TimerHistory start(TeamTask task, LocalDateTime dateTime) throws AxelorException;
|
||||
|
||||
TimerHistory stop(TeamTask task, LocalDateTime dateTime) throws AxelorException;
|
||||
|
||||
void cancel(TeamTask task) throws AxelorException;
|
||||
|
||||
Duration compute(TeamTask task);
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service;
|
||||
|
||||
import com.axelor.apps.base.db.Timer;
|
||||
import com.axelor.apps.base.db.TimerHistory;
|
||||
import com.axelor.apps.base.db.repo.TimerHistoryRepository;
|
||||
import com.axelor.apps.base.db.repo.TimerRepository;
|
||||
import com.axelor.apps.base.service.timer.AbstractTimerService;
|
||||
import com.axelor.apps.base.service.user.UserService;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.db.Model;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class TimerTeamTaskServiceImpl extends AbstractTimerService implements TimerTeamTaskService {
|
||||
|
||||
@Inject
|
||||
public TimerTeamTaskServiceImpl(
|
||||
TimerRepository timerRepository,
|
||||
TimerHistoryRepository timerHistoryRepository,
|
||||
UserService userService) {
|
||||
super(timerRepository, timerHistoryRepository, userService);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Timer find(Model model) {
|
||||
User user = userService.getUser();
|
||||
TeamTask task = (TeamTask) model;
|
||||
|
||||
return task.getTimerList()
|
||||
.stream()
|
||||
.filter(t -> t.getAssignedToUser() == user)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public TimerHistory start(Model model, Timer timer, LocalDateTime dateTime)
|
||||
throws AxelorException {
|
||||
TeamTask task = (TeamTask) model;
|
||||
|
||||
boolean isNewTimer = timer == null;
|
||||
timer = tryStartOrCreate(timer);
|
||||
if (isNewTimer) {
|
||||
task.addTimerListItem(timer);
|
||||
}
|
||||
|
||||
TimerHistory history = new TimerHistory();
|
||||
history.setStartDateT(dateTime);
|
||||
history.setTimer(timer);
|
||||
timer.addTimerHistoryListItem(history);
|
||||
|
||||
return timerHistoryRepository.save(history);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Timer find(TeamTask task) {
|
||||
return find((Model) task);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimerHistory start(TeamTask task, LocalDateTime dateTime) throws AxelorException {
|
||||
Timer timer = find(task);
|
||||
return start(task, timer, dateTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimerHistory stop(TeamTask task, LocalDateTime dateTime) throws AxelorException {
|
||||
Timer timer = find(task);
|
||||
return stop(task, timer, dateTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel(TeamTask task) {
|
||||
Timer timer = find(task);
|
||||
cancel(timer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Duration compute(TeamTask task) {
|
||||
Duration total = Duration.ZERO;
|
||||
for (Timer timer : task.getTimerList()) {
|
||||
total = total.plus(compute(timer));
|
||||
}
|
||||
return total;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service.app;
|
||||
|
||||
import com.axelor.apps.base.db.AppProject;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
|
||||
public interface AppProjectService extends AppBaseService {
|
||||
|
||||
public AppProject getAppProject();
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.service.app;
|
||||
|
||||
import com.axelor.apps.base.db.AppProject;
|
||||
import com.axelor.apps.base.db.repo.AppProjectRepository;
|
||||
import com.axelor.apps.base.service.app.AppBaseServiceImpl;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class AppProjectServiceImpl extends AppBaseServiceImpl implements AppProjectService {
|
||||
|
||||
@Inject private AppProjectRepository appProjectRepo;
|
||||
|
||||
@Override
|
||||
public AppProject getAppProject() {
|
||||
return appProjectRepo.all().fetchOne();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.translation;
|
||||
|
||||
public interface ITranslation {
|
||||
|
||||
public static final String PROJECTS_APP_NAME = /* $$( */ "value:Projects"; /* ) */
|
||||
|
||||
public static final String PROJECT_CODE_ERROR =
|
||||
/* $$( */ "Project code is already used. Please provide unique code"; /* ) */
|
||||
}
|
||||
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.web;
|
||||
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.base.db.repo.PartnerRepository;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.apps.project.service.ProjectService;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.meta.schema.actions.ActionView;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class PartnerController {
|
||||
|
||||
public void generateProject(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
Partner partner = request.getContext().asType(Partner.class);
|
||||
partner = Beans.get(PartnerRepository.class).find(partner.getId());
|
||||
Project project = Beans.get(ProjectService.class).generateProject(partner);
|
||||
|
||||
response.setView(
|
||||
ActionView.define(I18n.get("Generated project"))
|
||||
.model(Project.class.getName())
|
||||
.add("form", "project-form")
|
||||
.add("grid", "project-grid")
|
||||
.param("forceTitle", "true")
|
||||
.param("forceEdit", "true")
|
||||
.context("_showRecord", project.getId())
|
||||
.map());
|
||||
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.web;
|
||||
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class ProjectController {
|
||||
|
||||
public void importMembers(ActionRequest request, ActionResponse response) {
|
||||
Project project = request.getContext().asType(Project.class);
|
||||
if (project.getTeam() != null) {
|
||||
project.getTeam().getMembers().forEach(project::addMembersUserSetItem);
|
||||
response.setValue("membersUserSet", project.getMembersUserSet());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.web;
|
||||
|
||||
import com.axelor.apps.base.db.AppProject;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.base.db.Wizard;
|
||||
import com.axelor.apps.base.db.repo.PartnerRepository;
|
||||
import com.axelor.apps.project.db.Project;
|
||||
import com.axelor.apps.project.db.ProjectTemplate;
|
||||
import com.axelor.apps.project.db.repo.ProjectTemplateRepository;
|
||||
import com.axelor.apps.project.service.ProjectService;
|
||||
import com.axelor.apps.project.service.app.AppProjectService;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.meta.schema.actions.ActionView;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.axelor.rpc.Context;
|
||||
import com.google.inject.Singleton;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
@Singleton
|
||||
public class ProjectTemplateController {
|
||||
|
||||
public void createProjectFromTemplate(ActionRequest request, ActionResponse response) {
|
||||
|
||||
ProjectTemplate projectTemplate = request.getContext().asType(ProjectTemplate.class);
|
||||
AppProject appProject = Beans.get(AppProjectService.class).getAppProject();
|
||||
|
||||
if (appProject.getGenerateProjectSequence() && !projectTemplate.getIsBusinessProject()) {
|
||||
|
||||
Project project;
|
||||
try {
|
||||
project =
|
||||
Beans.get(ProjectService.class).createProjectFromTemplate(projectTemplate, null, null);
|
||||
response.setView(
|
||||
ActionView.define(I18n.get("Project"))
|
||||
.model(Project.class.getName())
|
||||
.add("form", "project-form")
|
||||
.add("grid", "project-grid")
|
||||
.context("_showRecord", project.getId())
|
||||
.map());
|
||||
|
||||
} catch (AxelorException e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
|
||||
} else {
|
||||
response.setView(
|
||||
ActionView.define(I18n.get("Create project from this template"))
|
||||
.model(Wizard.class.getName())
|
||||
.add("form", "project-template-wizard-form")
|
||||
.param("popup", "reload")
|
||||
.param("show-toolbar", "false")
|
||||
.param("show-confirm", "false")
|
||||
.param("width", "large")
|
||||
.param("popup-save", "false")
|
||||
.context("_projectTemplate", projectTemplate)
|
||||
.context("_businessProject", projectTemplate.getIsBusinessProject())
|
||||
.map());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void createProjectFromWizard(ActionRequest request, ActionResponse response) {
|
||||
|
||||
Context context = request.getContext();
|
||||
|
||||
String projectTemplateId =
|
||||
((LinkedHashMap<String, Object>) context.get("_projectTemplate")).get("id").toString();
|
||||
ProjectTemplate projectTemplate =
|
||||
Beans.get(ProjectTemplateRepository.class).find(Long.parseLong(projectTemplateId));
|
||||
|
||||
String projectCode = (String) context.get("code");
|
||||
|
||||
Object clientPartnerContext = context.get("clientPartner");
|
||||
Partner clientPartner = null;
|
||||
|
||||
if (clientPartnerContext != null) {
|
||||
String clientPartnerId =
|
||||
((LinkedHashMap<String, Object>) clientPartnerContext).get("id").toString();
|
||||
clientPartner = Beans.get(PartnerRepository.class).find(Long.parseLong(clientPartnerId));
|
||||
}
|
||||
|
||||
Project project;
|
||||
try {
|
||||
project =
|
||||
Beans.get(ProjectService.class)
|
||||
.createProjectFromTemplate(projectTemplate, projectCode, clientPartner);
|
||||
response.setCanClose(true);
|
||||
|
||||
response.setView(
|
||||
ActionView.define(I18n.get("Project"))
|
||||
.model(Project.class.getName())
|
||||
.add("form", "project-form")
|
||||
.add("grid", "project-grid")
|
||||
.context("_showRecord", project.getId())
|
||||
.map());
|
||||
} catch (AxelorException e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.axelor.apps.project.web;
|
||||
|
||||
import com.axelor.apps.base.db.Timer;
|
||||
import com.axelor.apps.base.db.repo.TimerRepository;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.project.service.TimerTeamTaskService;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.axelor.team.db.TeamTask;
|
||||
import java.time.Duration;
|
||||
|
||||
public class TeamTaskController {
|
||||
|
||||
private static final String HIDDEN_ATTR = "hidden";
|
||||
|
||||
public void manageTimerButtons(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
TeamTask task = request.getContext().asType(TeamTask.class);
|
||||
TimerTeamTaskService service = Beans.get(TimerTeamTaskService.class);
|
||||
if (task.getId() == null) {
|
||||
return;
|
||||
}
|
||||
Timer timer = service.find(task);
|
||||
|
||||
boolean hideStart = false;
|
||||
boolean hideCancel = true;
|
||||
if (timer != null) {
|
||||
hideStart = timer.getStatusSelect() == TimerRepository.TIMER_STARTED;
|
||||
hideCancel = timer.getTimerHistoryList().isEmpty();
|
||||
}
|
||||
|
||||
response.setAttr("startTimerBtn", HIDDEN_ATTR, hideStart);
|
||||
response.setAttr("stopTimerBtn", HIDDEN_ATTR, !hideStart);
|
||||
response.setAttr("cancelTimerBtn", HIDDEN_ATTR, hideCancel);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void computeTotalTimerDuration(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
TeamTask task = request.getContext().asType(TeamTask.class);
|
||||
if (task.getId() == null) {
|
||||
return;
|
||||
}
|
||||
Duration duration = Beans.get(TimerTeamTaskService.class).compute(task);
|
||||
response.setValue("$_totalTimerDuration", duration.toMinutes() / 60F);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void startTimer(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
TeamTask task = request.getContext().asType(TeamTask.class);
|
||||
Beans.get(TimerTeamTaskService.class)
|
||||
.start(task, Beans.get(AppBaseService.class).getTodayDateTime().toLocalDateTime());
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void stopTimer(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
TeamTask task = request.getContext().asType(TeamTask.class);
|
||||
Beans.get(TimerTeamTaskService.class)
|
||||
.stop(task, Beans.get(AppBaseService.class).getTodayDateTime().toLocalDateTime());
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void cancelTimer(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
TeamTask task = request.getContext().asType(TeamTask.class);
|
||||
Beans.get(TimerTeamTaskService.class).cancel(task);
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.2.xsd">
|
||||
|
||||
<input file="auth_permission.csv" separator=";" type="com.axelor.auth.db.Permission" search="self.name = :name" call="com.axelor.csv.script.ImportPermission:importPermissionToRole">
|
||||
<bind to="canRead" eval="can_read == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canWrite" eval="can_write == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canCreate" eval="can_create == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canRemove" eval="can_remove == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canExport" eval="can_export == 'x' ? 'true' : 'false'"/>
|
||||
</input>
|
||||
|
||||
<input file="base_appProject.csv" separator=";" type="com.axelor.apps.base.db.AppProject" call="com.axelor.csv.script.ImportApp:importApp">
|
||||
<bind column="dependsOn" to="dependsOnSet" search="self.code in :dependsOn" eval="dependsOn.split(',') as List"/>
|
||||
</input>
|
||||
|
||||
<input file="meta_helpEN.csv" separator=";" type="com.axelor.meta.db.MetaHelp">
|
||||
<bind to="language" eval="'en'" />
|
||||
<bind to="type" eval="'tooltip'" />
|
||||
<bind to="model" eval="com.axelor.inject.Beans.get(com.axelor.meta.db.repo.MetaModelRepository.class).findByName(object)?.getFullName()" column="object" />
|
||||
</input>
|
||||
|
||||
<input file="meta_helpFR.csv" separator=";" type="com.axelor.meta.db.MetaHelp">
|
||||
<bind to="language" eval="'fr'" />
|
||||
<bind to="type" eval="'tooltip'" />
|
||||
<bind to="model" eval="com.axelor.inject.Beans.get(com.axelor.meta.db.repo.MetaModelRepository.class).findByName(object)?.getFullName()" column="object" />
|
||||
</input>
|
||||
|
||||
<input file="meta_metaMenu.csv" separator=";" type="com.axelor.meta.db.MetaMenu" search="self.name = :name" update="true" />
|
||||
|
||||
<input file="base_sequence.csv" separator=";" type="com.axelor.apps.base.db.Sequence" search="self.importId = :importId">
|
||||
<bind to="yearlyResetOk" column="yearlyResetOk" eval="yearlyResetOk == '1' ? true : false"/>
|
||||
<bind to="nextNum" column="nextNum" eval="nextNum?.empty ? '1' : nextNum"/>
|
||||
<bind to="padding" column="padding" eval="padding?.empty ? '1' : padding"/>
|
||||
<bind to="toBeAdded" column="toBeAdded" eval="toBeAdded?.empty ? '1' : toBeAdded"/>
|
||||
<bind to="resetDate" eval="call:com.axelor.apps.base.service.app.AppBaseService:getTodayDate()"/>
|
||||
</input>
|
||||
|
||||
</csv-inputs>
|
||||
@ -0,0 +1,2 @@
|
||||
"name";"object";"can_read";"can_write";"can_create";"can_remove";"can_export";"condition";"conditionParams";"roleName"
|
||||
"perm.project.all";"com.axelor.apps.project.db.*";"x";"x";"x";"x";"x";;;"Admin"
|
||||
|
@ -0,0 +1,2 @@
|
||||
"name";"code";"installOrder";"description";"imagePath";"modules";"dependsOn";"sequence"
|
||||
"Projects";"project";7;"Project management";"app-project.png";"axelor-project";"base";11
|
||||
|
@ -0,0 +1,2 @@
|
||||
"importId";"code";"name";"nextNum";"padding";"prefixe";"suffixe";"toBeAdded";"yearlyResetOk"
|
||||
175;"project";"Project";1;5;"PRJ";;1;0
|
||||
|
Binary file not shown.
|
After Width: | Height: | Size: 467 B |
@ -0,0 +1,2 @@
|
||||
"module";"object";"view";"field";"help"
|
||||
"axelor-project";"AppProject";"app-project-config-form";"resourceManagement";"This option enables resource reservation on projects. You can create resources that can be booked on projects."
|
||||
|
@ -0,0 +1,2 @@
|
||||
"module";"object";"view";"field";"help"
|
||||
"axelor-project";"AppProject";"app-project-config-form";"resourceManagement";"Cette option permet d'activer la réservation de ressources sur les projets. Vous pourrez créer des ressources qui pourront ensuite être réservées sur les projets."
|
||||
|
@ -0,0 +1,17 @@
|
||||
"name";"roles.name"
|
||||
"menu-project-root";"Admin"
|
||||
"project-folder";"Admin"
|
||||
"project-all";"Admin"
|
||||
"project-phases";"Admin"
|
||||
"project-tasks";"Admin"
|
||||
"project-open-tasks";"Admin"
|
||||
"project-task-history";"Admin"
|
||||
"project-wiki";"Admin"
|
||||
"project-dasbhoard";"Admin"
|
||||
"project-resource";"Admin"
|
||||
"project-resource-booking";"Admin"
|
||||
"project-configurations";"Admin"
|
||||
"project-category";"Admin"
|
||||
"project-resource-type";"Admin"
|
||||
"project-historical";"Admin"
|
||||
"project-reporting";"Admin"
|
||||
|
@ -0,0 +1,2 @@
|
||||
"importId";"company.importId"
|
||||
175;1
|
||||
|
@ -0,0 +1,2 @@
|
||||
importId;imputable
|
||||
1;true
|
||||
|
@ -0,0 +1,2 @@
|
||||
importId;name;clientPartner.importId;code;membersUserSet.importId;typeSelect;company.importId;statusSelect;projInvTypeSelect;assignedTo.importId;fullName;fromDate;duration
|
||||
1;123Service Project;88;123SP;1;project;1;1;3;1;123SP - 123Service Project;TODAY;50
|
||||
|
@ -0,0 +1,5 @@
|
||||
importId;name;status;priority;project.importId;assignedTo.importId;taskDate;taskDuration
|
||||
2;Prepare offer for tender;new;normal;1;1;TODAY;10
|
||||
3;Audit;new;normal;1;2;TODAY[+10d];20
|
||||
4;Document preparation;new;normal;1;3;TODAY[+20d];20
|
||||
5;Presentation;new;normal;1;4;TODAY[+30d];10
|
||||
|
@ -0,0 +1,2 @@
|
||||
"importId";"company.importId"
|
||||
175;1
|
||||
|
@ -0,0 +1,2 @@
|
||||
importId;imputable
|
||||
1;true
|
||||
|
@ -0,0 +1,2 @@
|
||||
importId;name;clientPartner.importId;code;membersUserSet.importId;typeSelect;company.importId;statusSelect;assignedTo.importId;fullName;fromDate;duration
|
||||
1;123Service Project;88;123SP;1;project;1;1;1;123SP - 123Service Project;TODAY;50
|
||||
|
@ -0,0 +1,5 @@
|
||||
importId;name;status;priority;project.importId;assignedTo.importId;taskDate;taskDuration
|
||||
2;Prepare offer for tender;new;normal;1;1;TODAY;10
|
||||
3;Audit;new;normal;1;2;TODAY[+10d];20
|
||||
4;Document preparation;new;normal;1;3;TODAY[+20d];20
|
||||
5;Presentation;new;normal;1;4;TODAY[+30d];10
|
||||
|
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.2.xsd">
|
||||
|
||||
<input file="project_project.csv" type="com.axelor.apps.project.db.Project" separator=";" search="self.importId = :importId">
|
||||
<bind to="fromDate" column="fromDate" eval="call:com.axelor.csv.script.ImportDateTime:importDate(fromDate)" />
|
||||
</input>
|
||||
|
||||
<input file="business_project_project.csv" type="com.axelor.apps.project.db.Project" separator=";" search="self.importId = :importId"/>
|
||||
|
||||
<input file="team_task.csv" type="com.axelor.team.db.TeamTask" separator=";" search="self.importId = :importId" call="com.axelor.apps.csv.script.TeamTaskScript:computeFullname">
|
||||
<bind to="taskDate" column="taskDate" eval="call:com.axelor.csv.script.ImportDateTime:importDate(taskDate)" />
|
||||
</input>
|
||||
|
||||
<input file="base_sequence.csv" separator=";" type="com.axelor.apps.base.db.Sequence" search="self.importId = :importId" call="com.axelor.csv.script.SequenceScript:computeFullname">
|
||||
<bind to="yearlyResetOk" column="yearlyResetOk" eval="yearlyResetOk == '1' ? true : false"/>
|
||||
<bind to="nextNum" column="nextNum" eval="nextNum?.empty ? '1' : nextNum"/>
|
||||
<bind to="padding" column="padding" eval="padding?.empty ? '1' : padding"/>
|
||||
<bind to="toBeAdded" column="toBeAdded" eval="toBeAdded?.empty ? '1' : toBeAdded"/>
|
||||
<bind to="resetDate" eval="call:com.axelor.apps.base.service.app.AppBaseService:getTodayDate()"/>
|
||||
</input>
|
||||
|
||||
</csv-inputs>
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="base" package="com.axelor.apps.base.db"/>
|
||||
|
||||
<entity name="AppProject" lang="java" extends="App">
|
||||
<string name="projectLabel" title="Project Label"/>
|
||||
<boolean name="resourceManagement" title="Resource management" />
|
||||
<boolean name="isEnableSignature" title="Enable task signature" />
|
||||
<boolean name="generateProjectSequence" title="Generate sequence for project"/>
|
||||
|
||||
<track>
|
||||
<field name="projectLabel" on="UPDATE"/>
|
||||
<field name="resourceManagement" on="UPDATE"/>
|
||||
</track>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="Project">
|
||||
|
||||
<string name="name"/>
|
||||
<string name="description" multiline="true" large="true"/>
|
||||
<many-to-one name="team" ref="com.axelor.team.db.Team"/>
|
||||
<many-to-many name="projectFolderSet" ref="com.axelor.apps.project.db.ProjectFolder" title="Project Folders"/>
|
||||
<one-to-many name="childProjectList" ref="com.axelor.apps.project.db.Project" title="Child Projects" mappedBy="parentProject"/>
|
||||
<many-to-one name="assignedTo" ref="com.axelor.auth.db.User" title="Assigned to"/>
|
||||
<integer name="statusSelect" selection="project.status.select" title="Status" default="1"/>
|
||||
<many-to-many name="teamTaskCategorySet" ref="com.axelor.apps.project.db.TeamTaskCategory" title="Type of authorized categories"/>
|
||||
<one-to-many name="teamTaskList" ref="com.axelor.team.db.TeamTask" title="Tasks" mappedBy="project"/>
|
||||
<boolean name="synchronize"/>
|
||||
<boolean name="extendsMembersFromParent" default="false"/>
|
||||
<many-to-one name="parentProject" ref="com.axelor.apps.project.db.Project" title="Parent project"/>
|
||||
<one-to-many name="wikiList" ref="com.axelor.apps.project.db.Wiki" title="Wiki" mappedBy="project"/>
|
||||
<one-to-many name="resourceBookingList" ref="com.axelor.apps.project.db.ResourceBooking" title="Resource booking" mappedBy="project"/>
|
||||
|
||||
<string name="code" title="Code" unique="true"/>
|
||||
<many-to-many name="membersUserSet" ref="com.axelor.auth.db.User" title="Membres"/>
|
||||
<many-to-one name="clientPartner" ref="com.axelor.apps.base.db.Partner" title="Customer"/>
|
||||
<many-to-one name="contactPartner" ref="com.axelor.apps.base.db.Partner" title="Customer Contact"/>
|
||||
|
||||
<datetime name="fromDate" title="From Date"/>
|
||||
<datetime name="toDate" title="To Date"/>
|
||||
<datetime name="dueDate" title="Due Date"/>
|
||||
|
||||
<decimal name="estimatedTimeDays" title="Estimated time (in days)" />
|
||||
<decimal name="estimatedTimeHrs" title="Estimated time (in hours)" />
|
||||
|
||||
<decimal name="timeSpent" title="Time Spent"/>
|
||||
|
||||
<decimal name="progress" title="Progress (%)"/>
|
||||
<decimal name="sequence" title="Sequence" />
|
||||
<integer name="orderByState"/>
|
||||
|
||||
<boolean name="imputable" default="true" massUpdate="true"/>
|
||||
|
||||
<many-to-many name="finishToStartTaskSet" ref="com.axelor.apps.project.db.Project" title="Finish tasks to start"/>
|
||||
<many-to-many name="startToStartTaskSet" ref="com.axelor.apps.project.db.Project" title="Start tasks to start"/>
|
||||
<many-to-many name="finishToFinishTaskSet" ref="com.axelor.apps.project.db.Project" title="Finish tasks to finish"/>
|
||||
<many-to-many name="startToFinishTaskSet" ref="com.axelor.apps.project.db.Project" title="Start tasks to finish"/>
|
||||
|
||||
<many-to-one name="company" ref="com.axelor.apps.base.db.Company" title="Company"/>
|
||||
|
||||
<many-to-many name="productSet" ref="com.axelor.apps.base.db.Product" title="Type of authorized activities"/>
|
||||
|
||||
<boolean name="excludePlanning" title="Exclude planning" />
|
||||
|
||||
<string name="fullName" namecolumn="true" title="Name"/>
|
||||
|
||||
<boolean name="isProject" title="Project/Phase" default="true" />
|
||||
<boolean name="isShowPhasesElements" title="Show phases elements" default="true" />
|
||||
|
||||
<integer name="projectTypeSelect" selection="project.project.project.type.select" default="1"/>
|
||||
<enum name="genProjTypePerOrderLine" ref="GenProjTypePerOrderLine" default="BUSINESS_PROJECT"/>
|
||||
|
||||
<finder-method name="findAllByParentProject" using="parentProject" all="true"/>
|
||||
<finder-method name="findByName" using="name"/>
|
||||
|
||||
<extra-code>
|
||||
<![CDATA[
|
||||
public static final Integer TYPE_PROJECT = 1;
|
||||
public static final Integer TYPE_PHASE = 2;
|
||||
|
||||
public static final Integer STATE_NEW = 1;
|
||||
public static final Integer STATE_IN_PROGRESS = 2;
|
||||
public static final Integer STATE_FINISHED = 3;
|
||||
public static final Integer STATE_CANCELED = 4;
|
||||
]]>
|
||||
</extra-code>
|
||||
</entity>
|
||||
|
||||
<enum name="GenProjTypePerOrderLine">
|
||||
<item name="BUSINESS_PROJECT" title="Business project"/>
|
||||
<item name="PHASE_BY_LINE" title="Phase by line"/>
|
||||
<item name="TASK_BY_LINE" title="Task by line"/>
|
||||
<item name="PROJECT_ALONE" title="Project alone"/>
|
||||
</enum>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="ProjectFolder">
|
||||
<string name="name"/>
|
||||
<string name="description" large="true"/>
|
||||
<many-to-many name="projectSet" ref="com.axelor.apps.project.db.Project" mappedBy="projectFolderSet"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="ProjectStatus">
|
||||
<string name="name"/>
|
||||
<boolean name="defaultStatus"/>
|
||||
<boolean name="isOpen"/>
|
||||
<boolean name="isClose"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="ProjectTemplate">
|
||||
<string name="name" required="true"/>
|
||||
<string name="description" multiline="true" large="true"/>
|
||||
<many-to-one name="team" ref="com.axelor.team.db.Team"/>
|
||||
<many-to-many name="projectFolderSet" ref="com.axelor.apps.project.db.ProjectFolder" title="Project Folders"/>
|
||||
<many-to-one name="assignedTo" ref="com.axelor.auth.db.User" title="Assigned to"/>
|
||||
<many-to-many name="teamTaskCategorySet" ref="com.axelor.apps.project.db.TeamTaskCategory" title="Type of authorized categories"/>
|
||||
<boolean name="synchronize"/>
|
||||
<one-to-many name="wikiList" ref="com.axelor.apps.project.db.Wiki" title="Wiki" mappedBy="projectTemplate"/>
|
||||
<string name="code" title="Code" unique="true"/>
|
||||
<many-to-many name="membersUserSet" ref="com.axelor.auth.db.User" title="Membres"/>
|
||||
<boolean name="imputable" default="true" massUpdate="true"/>
|
||||
<many-to-one name="company" ref="com.axelor.apps.base.db.Company" title="Company"/>
|
||||
<many-to-many name="productSet" ref="com.axelor.apps.base.db.Product" title="Type of authorized activities"/>
|
||||
<string name="fullName" namecolumn="true" title="Name"/>
|
||||
<boolean name="excludePlanning" title="Exclude planning"/>
|
||||
<boolean name="isBusinessProject" title="Business project"/>
|
||||
<many-to-many name="taskTemplateSet" ref="com.axelor.apps.project.db.TaskTemplate" title="Task templates"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="Resource">
|
||||
<string name="name" required="true"/>
|
||||
<many-to-one name="resourceType" ref="ResourceType" title="Type" />
|
||||
<string name="batchNo" title="Serial/batch number"/>
|
||||
<many-to-one name="resourceImage" title="Image" ref="com.axelor.meta.db.MetaFile" />
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="ResourceBooking" repository="abstract">
|
||||
<string name="name"/>
|
||||
<many-to-one name="resource" ref="Resource" title="Resource" column="project_resource" required="true"/>
|
||||
<many-to-one name="project" ref="Project" title="Project" required="true"/>
|
||||
<many-to-one name="task" ref="com.axelor.team.db.TeamTask" title="Task" />
|
||||
<boolean name="updateTaskFromPeriod" title="Update period according to task" />
|
||||
<many-to-one name="user" ref="com.axelor.auth.db.User" column="user_id"/>
|
||||
<datetime name="fromDate" title="From date"/>
|
||||
<datetime name="toDate" title="To date"/>
|
||||
<string name="notes" title="Notes" large="true" />
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="ResourceType">
|
||||
<string name="name" required="true"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="base" package="com.axelor.apps.base.db"/>
|
||||
|
||||
<entity name="Sequence" lang="java">
|
||||
|
||||
<extra-code><![CDATA[
|
||||
|
||||
//SEQUENCE SELECT
|
||||
public static final String PROJECT_SEQUENCE = "project";
|
||||
|
||||
]]></extra-code>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="TaskTemplate">
|
||||
<string name="name" namecolumn="true" title="Name" search="id,name"/>
|
||||
<decimal name="delayToStart" default="0" title="Delay to start (Hours)"/>
|
||||
<decimal name="duration" title="Duration (Hours)"/>
|
||||
<decimal name="totalPlannedHrs" title="Total planned hours"/>
|
||||
<many-to-one name="parentTaskTemplate" ref="com.axelor.apps.project.db.TaskTemplate"
|
||||
title="Parent task"/>
|
||||
<one-to-many name="taskTemplateList" ref="com.axelor.apps.project.db.TaskTemplate"
|
||||
mappedBy="parentTaskTemplate" orphanRemoval="true"/>
|
||||
<many-to-one name="assignedTo" ref="com.axelor.auth.db.User" title="Assigned to"/>
|
||||
<many-to-one name="team" ref="com.axelor.team.db.Team"/>
|
||||
<boolean name="isUniqueTaskForMultipleQuantity"/>
|
||||
<string name="description" title="Description" large="true"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.team.db"/>
|
||||
|
||||
|
||||
<entity name="TeamTask">
|
||||
<many-to-one name="project" ref="com.axelor.apps.project.db.Project" title="Project"/>
|
||||
|
||||
<string name="fullName" namecolumn="true" title="Name" search="id,name"/>
|
||||
|
||||
<many-to-one name="parentTask" ref="com.axelor.team.db.TeamTask" title="Parent task"/>
|
||||
<many-to-one name="teamTaskCategory" ref="com.axelor.apps.project.db.TeamTaskCategory" title="Category"/>
|
||||
<integer name="progressSelect" title="Progress" selection="project.task.progress.select"/>
|
||||
<many-to-one name="team" ref="com.axelor.team.db.Team" title="Team"/>
|
||||
<one-to-many name="teamTaskList" ref="com.axelor.team.db.TeamTask" mappedBy="parentTask"/>
|
||||
|
||||
<many-to-many name="membersUserSet" ref="com.axelor.auth.db.User" title="Followers"/>
|
||||
<string name="description" title="Description" large="true"/>
|
||||
<many-to-one name="product" ref="com.axelor.apps.base.db.Product" title="Product"/>
|
||||
<many-to-one name="unit" ref="com.axelor.apps.base.db.Unit" title="Unit"/>
|
||||
<decimal name="quantity" title="Quantity"/>
|
||||
<decimal name="unitPrice" title="Unit price" />
|
||||
<many-to-one name="currency" ref="com.axelor.apps.base.db.Currency" title="Currency" index="false"/>
|
||||
<many-to-one name="taskTemplate" title="Task Template" ref="com.axelor.apps.project.db.TaskTemplate" />
|
||||
|
||||
<!-- Gantt view fields -->
|
||||
|
||||
<decimal name="plannedProgress" title="Planned progress" />
|
||||
<many-to-many name="finishToStartSet" title="Predecessors tasks" ref="TeamTask" />
|
||||
<many-to-many name="startToStartSet" title="Tasks to start before start" ref="TeamTask"/>
|
||||
<many-to-many name="finishToFinishSet" title="Tasks to finish before finish" ref="TeamTask"/>
|
||||
<decimal name="durationHours" title="Duration hours" />
|
||||
<date name="taskEndDate" title="Task end" />
|
||||
|
||||
<one-to-many name="timerList" ref="com.axelor.apps.base.db.Timer"/>
|
||||
|
||||
<decimal name="budgetedTime" title="Estimated time"/>
|
||||
<many-to-one name="metaFile" title="Signature" ref="com.axelor.meta.db.MetaFile" />
|
||||
|
||||
<track replace="true">
|
||||
<field name="status"/>
|
||||
<field name="teamTaskCategory"/>
|
||||
<field name="progressSelect"/>
|
||||
<field name="assignedTo"/>
|
||||
<message if="true" on="UPDATE">Task updated</message>
|
||||
</track>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="TeamTaskCategory">
|
||||
<string name="name" title="Name" required="true"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="auth" package="com.axelor.auth.db"/>
|
||||
|
||||
<entity name="User" sequential="true" lang="java">
|
||||
|
||||
<many-to-many name="projectSet" title="Projects" ref="com.axelor.apps.project.db.Project" mappedBy="membersUserSet"/>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" ?>
|
||||
<domain-models xmlns="http://axelor.com/xml/ns/domain-models"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/domain-models http://axelor.com/xml/ns/domain-models/domain-models_5.2.xsd">
|
||||
|
||||
<module name="project" package="com.axelor.apps.project.db"/>
|
||||
|
||||
<entity name="Wiki">
|
||||
<string name="title"/>
|
||||
<string name="content" large="true"/>
|
||||
<boolean name="isImport" title="Is import" default="false" />
|
||||
<many-to-one name="project" ref="com.axelor.apps.project.db.Project" title="Project"/>
|
||||
<many-to-one name="projectTemplate" ref="com.axelor.apps.project.db.ProjectTemplate" title="Project template"/>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,277 @@
|
||||
"key","message","comment","context"
|
||||
"%s project",,,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>",,,
|
||||
"Accept Order",,,
|
||||
"Actions",,,
|
||||
"Add multiple lines",,,
|
||||
"Add selected lines",,,
|
||||
"All phase tasks",,,
|
||||
"All phases",,,
|
||||
"All tasks",,,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project",,,
|
||||
"Assigned to",,,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource",,,
|
||||
"Business",,,
|
||||
"Business project",,,
|
||||
"Cancel",,,
|
||||
"Canceled",,,
|
||||
"Category",,,
|
||||
"Characteristics",,,
|
||||
"Child Projects",,,
|
||||
"Code",,,
|
||||
"Company",,,
|
||||
"Configuration",,,
|
||||
"Configurations",,,
|
||||
"Content",,,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project",,,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency",,,
|
||||
"Customer",,,
|
||||
"Customer Contact",,,
|
||||
"Customer Invoice lines",,,
|
||||
"Customer contracts",,,
|
||||
"Daily planned charge in a month in an average per employee",,,
|
||||
"Daily planned charge in a month per employee",,,
|
||||
"Daily planned charge in a month per project",,,
|
||||
"Dates",,,
|
||||
"Deadline",,,
|
||||
"Deadline Today",,,
|
||||
"Deadline Tomorrow",,,
|
||||
"Deadline Yesterday",,,
|
||||
"Default status",,,
|
||||
"Delay to start (Hours)",,,
|
||||
"Description",,,
|
||||
"Due Date",,,
|
||||
"Duration (Hours)",,,
|
||||
"Duration hours",,,
|
||||
"Employee",,,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Estimated time",,,
|
||||
"Estimated time (in days)",,,
|
||||
"Estimated time (in hours)",,,
|
||||
"Exclude planning",,,
|
||||
"Expense lines",,,
|
||||
"Expenses",,,
|
||||
"Extends members from parent",,,
|
||||
"Financial Data",,,
|
||||
"Financial Report",,,
|
||||
"Finish",,,
|
||||
"Finish tasks to finish",,,
|
||||
"Finish tasks to start",,,
|
||||
"Finished",,,
|
||||
"Follow-up",,,
|
||||
"Followers",,,
|
||||
"Frequency",,,
|
||||
"From Date",,,
|
||||
"From date",,,
|
||||
"Gantt",,,
|
||||
"Gantt with project",,,
|
||||
"Gantt with user",,,
|
||||
"Gen proj type per order line",,,
|
||||
"Generate quotation",,,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project",,,
|
||||
"High",,,
|
||||
"Historical",,,
|
||||
"Image",,,
|
||||
"Import all members",,,
|
||||
"Imputable",,,
|
||||
"In Progress",,,
|
||||
"Internal Description",,,
|
||||
"Invoiced",,,
|
||||
"Invoices",,,
|
||||
"Invoicing",,,
|
||||
"Is close",,,
|
||||
"Is open",,,
|
||||
"Is unique task for multiple quantity",,,
|
||||
"Log Times",,,
|
||||
"Low",,,
|
||||
"Manage lines",,,
|
||||
"Members",,,
|
||||
"Membres",,,
|
||||
"My projects",,,
|
||||
"My tasks due",,,
|
||||
"My tasks to do",,,
|
||||
"My today planning",,,
|
||||
"My upcoming planning",,,
|
||||
"Name",,,
|
||||
"New",,,
|
||||
"New line",,,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal",,,
|
||||
"Not invoiced",,,
|
||||
"Not specified",,,
|
||||
"Notes",,,
|
||||
"Open gantt",,,
|
||||
"Open phase",,,
|
||||
"Open task",,,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state",,,
|
||||
"Package",,,
|
||||
"Parent project",,,
|
||||
"Parent task",,,
|
||||
"Person In Charge",,,
|
||||
"Phase by line",,,
|
||||
"Phase tasks",,,
|
||||
"Phases",,,
|
||||
"Plan project",,,
|
||||
"Planification and costs",,,
|
||||
"Planned Time Planning",,,
|
||||
"Planned charge",,,
|
||||
"Planned progress",,,
|
||||
"Planning",,,
|
||||
"Please select project",,,
|
||||
"Please select user",,,
|
||||
"Predecessors tasks",,,
|
||||
"Product",,,
|
||||
"Production",,,
|
||||
"Progress",,,
|
||||
"Progress (%)",,,
|
||||
"Project",,,
|
||||
"Project Calendar",,,
|
||||
"Project Folder",,,
|
||||
"Project Folders",,,
|
||||
"Project Gantt",,,
|
||||
"Project Label",,,
|
||||
"Project Phase",,,
|
||||
"Project Task",,,
|
||||
"Project Task Tree",,,
|
||||
"Project Tasks",,,
|
||||
"Project Wiki",,,
|
||||
"Project alone",,,
|
||||
"Project phase",,,
|
||||
"Project phases",,,
|
||||
"Project planning",,,
|
||||
"Project set",,,
|
||||
"Project template",,,
|
||||
"Project type select",,,
|
||||
"Project.toInvoice",,,
|
||||
"Project/Business (Project)",,,
|
||||
"Project/Phase",,,
|
||||
"Projects",,,
|
||||
"Projects Financial Report",,,
|
||||
"Projects Folder",,,
|
||||
"Projects Planification and costs",,,
|
||||
"Purchase order lines",,,
|
||||
"Purchases",,,
|
||||
"Quantity",,,
|
||||
"Related Projects",,,
|
||||
"Related tasks",,,
|
||||
"Remove lines",,,
|
||||
"Remove selected lines",,,
|
||||
"Reportings",,,
|
||||
"Reports",,,
|
||||
"Reset to New",,,
|
||||
"Resource",,,
|
||||
"Resource booking",,,
|
||||
"Resource bookings",,,
|
||||
"Resource management",,,
|
||||
"Resource type",,,
|
||||
"Resource types",,,
|
||||
"Resources",,,
|
||||
"Roadmap",,,
|
||||
"Sale order lines",,,
|
||||
"Sales",,,
|
||||
"Select Projects",,,
|
||||
"Select Users",,,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines",,,
|
||||
"Sequence",,,
|
||||
"Serial/batch number",,,
|
||||
"Show expense lines",,,
|
||||
"Show phases elements",,,
|
||||
"Show production orders",,,
|
||||
"Show purchase order lines",,,
|
||||
"Show sale order lines",,,
|
||||
"Signature",,,
|
||||
"Start",,,
|
||||
"Start tasks to finish",,,
|
||||
"Start tasks to start",,,
|
||||
"Status",,,
|
||||
"Stop",,,
|
||||
"Subject",,,
|
||||
"Supplier Invoice lines",,,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize",,,
|
||||
"Take charge",,,
|
||||
"Task",,,
|
||||
"Task Invoicing",,,
|
||||
"Task Tree",,,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line",,,
|
||||
"Task date",,,
|
||||
"Task deadline",,,
|
||||
"Task end",,,
|
||||
"Task history",,,
|
||||
"Task template",,,
|
||||
"Task template list",,,
|
||||
"Task templates",,,
|
||||
"Task updated",,,
|
||||
"Tasks",,,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team",,,
|
||||
"Team Task Category",,,
|
||||
"Team task list",,,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high",,,
|
||||
"The selected project/task doesn't contain any customers",,,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent",,,
|
||||
"Timer",,,
|
||||
"Timer list",,,
|
||||
"Title",,,
|
||||
"To Date",,,
|
||||
"To Invoice",,,
|
||||
"To date",,,
|
||||
"Tools",,,
|
||||
"Total duration (Hours)",,,
|
||||
"Total planned hours",,,
|
||||
"Tree view",,,
|
||||
"Type",,,
|
||||
"Type of authorized activities",,,
|
||||
"Type of authorized categories",,,
|
||||
"Unit",,,
|
||||
"Unit price",,,
|
||||
"Unlink selected lines",,,
|
||||
"Update period according to task",,,
|
||||
"Urgent",,,
|
||||
"User",,,
|
||||
"User Gantt",,,
|
||||
"User Task",,,
|
||||
"Users",,,
|
||||
"Validated Timesheet lines",,,
|
||||
"Waiting Timesheet lines",,,
|
||||
"Wiki",,,
|
||||
"You have no active team, the planning can't be generated",,,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.",,,
|
||||
"You have selected no team for this project",,,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.",,,
|
||||
"hours",,,
|
||||
"project-Resources",,,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","%s Projekt",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label label-info'>Automatisch berechnet, wenn leer gelassen</span>",,
|
||||
"Accept Order",,,
|
||||
"Actions","Aktionen",,
|
||||
"Add multiple lines","Mehrere Zeilen hinzufügen",,
|
||||
"Add selected lines","Hinzufügen ausgewählter Zeilen",,
|
||||
"All phase tasks","Alle Phasenaufgaben",,
|
||||
"All phases","Alle Phasen",,
|
||||
"All tasks","Alle Aufgaben",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","App-Projekt",,
|
||||
"Assigned to","Zugeordnet zu",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Ressource buchen",,
|
||||
"Budgeted time",,,
|
||||
"Business","Business",,
|
||||
"Business project","Geschäftsprojekt",,
|
||||
"Cancel","Abbrechen",,
|
||||
"Canceled","Abgesagt",,
|
||||
"Category","Kategorie",,
|
||||
"Characteristics","Merkmale",,
|
||||
"Child Projects","Kinderprojekte",,
|
||||
"Code","Code",,
|
||||
"Company","Unternehmen",,
|
||||
"Configuration","Konfiguration",,
|
||||
"Configurations","Konfigurationen",,
|
||||
"Content","Inhalt",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Fakturierungsprojekt erstellen",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Währung",,
|
||||
"Customer","Kunde",,
|
||||
"Customer Contact","Kundenkontakt",,
|
||||
"Customer Invoice lines","Kundenrechnungszeilen",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Daten",,
|
||||
"Deadline","Deadline",,
|
||||
"Deadline Today","Deadline heute",,
|
||||
"Deadline Tomorrow","Deadline morgen",,
|
||||
"Deadline Yesterday","Deadline gestern",,
|
||||
"Default status","Standardstatus",,
|
||||
"Delay to start (Hours)","Startverzögerung (Stunden)",,
|
||||
"Description","Beschreibung",,
|
||||
"Due Date","Fälligkeitsdatum",,
|
||||
"Duration (Hours)","Dauer (Stunden)",,
|
||||
"Duration hours","Dauer Stunden",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Planung ausschließen",,
|
||||
"Expense lines","Ausgabenzeilen",,
|
||||
"Expenses","Aufwendungen",,
|
||||
"Extends members from parent","Erweitert Mitglieder von parent",,
|
||||
"Financial Data","Finanzdaten",,
|
||||
"Financial Report","Finanzbericht",,
|
||||
"Finish","Ende",,
|
||||
"Finish tasks to finish","Aufgaben beenden, um sie zu erledigen",,
|
||||
"Finish tasks to start","Aufgaben beenden, um zu starten",,
|
||||
"Finished","Fertiggestellt",,
|
||||
"Follow-up","Nachbereitung",,
|
||||
"Followers","Anhänger",,
|
||||
"Frequency",,,
|
||||
"From Date","Von-Datum",,
|
||||
"From date","Von-Datum",,
|
||||
"Gantt","Gantt",,
|
||||
"Gantt with project","Gantt mit Projekt",,
|
||||
"Gantt with user","Gantt mit Benutzer",,
|
||||
"Gen proj type per order line","Projekttyp pro Auftragszeile generieren",,
|
||||
"Generate quotation","Angebot erstellen",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Generiertes Projekt",,
|
||||
"High","Hoch",,
|
||||
"Historical","Historisch",,
|
||||
"Image","Bild",,
|
||||
"Import all members","Alle Mitglieder importieren",,
|
||||
"Imputable","Vertretbar",,
|
||||
"In Progress","In Bearbeitung",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Rechnungsstellung",,
|
||||
"Invoices",,,
|
||||
"Invoicing","Rechnungsstellung",,
|
||||
"Is close","Ist nah",,
|
||||
"Is open","Ist offen",,
|
||||
"Is unique task for multiple quantity","Ist eine eindeutige Aufgabe für mehrere Mengen",,
|
||||
"Log Times","Protokollzeiten",,
|
||||
"Low","Niedrig",,
|
||||
"Manage lines","Linien verwalten",,
|
||||
"Members","Mitglieder",,
|
||||
"Membres","Membres",,
|
||||
"My projects","Meine Projekte",,
|
||||
"My tasks due","Meine Aufgaben sind fällig",,
|
||||
"My tasks to do","Meine Aufgaben",,
|
||||
"My today planning","Meine heutige Planung",,
|
||||
"My upcoming planning","Meine bevorstehende Planung",,
|
||||
"Name","Name",,
|
||||
"New","Neu",,
|
||||
"New line","Neue Linie",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Normal",,
|
||||
"Not invoiced","Nicht fakturiert",,
|
||||
"Not specified","Nicht spezifiziert",,
|
||||
"Notes","Notizen",,
|
||||
"Open gantt","Offenes Portal",,
|
||||
"Open phase","Offene Phase",,
|
||||
"Open task","Aufgabe öffnen",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Nach Bundesland sortieren",,
|
||||
"Package",,,
|
||||
"Parent project","Übergeordnetes Projekt",,
|
||||
"Parent task","Übergeordnete Aufgabe",,
|
||||
"Person In Charge","Verantwortlicher",,
|
||||
"Phase by line","Phase für Phase",,
|
||||
"Phase tasks","Phasenaufgaben",,
|
||||
"Phases","Phasen",,
|
||||
"Plan project","Projekt planen",,
|
||||
"Planification and costs","Planung und Kosten",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Geplanter Fortschritt",,
|
||||
"Planning","Planung",,
|
||||
"Please select project","Bitte wählen Sie ein Projekt",,
|
||||
"Please select user","Bitte Benutzer auswählen",,
|
||||
"Predecessors tasks","Aufgaben des Vorgängers",,
|
||||
"Product","Produkt",,
|
||||
"Production","Produktion",,
|
||||
"Progress","Fortschritte",,
|
||||
"Progress (%)","Fortschritt (%)",,
|
||||
"Project","Projekt",,
|
||||
"Project Calendar","Projektkalender",,
|
||||
"Project Category","Projektkategorie",,
|
||||
"Project Folder","Projektordner",,
|
||||
"Project Folders","Projektordner",,
|
||||
"Project Gantt","Projekt Gantt",,
|
||||
"Project Label","Projekt-Label",,
|
||||
"Project Phase","Projektphase",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Projektaufgabe",,
|
||||
"Project Task Tree","Projektaufgabenbaum",,
|
||||
"Project Tasks","Projektaufgaben",,
|
||||
"Project Wiki","Projekt-Wiki",,
|
||||
"Project alone","Projekt alleine",,
|
||||
"Project phase","Projektphase",,
|
||||
"Project phases","Projektphasen",,
|
||||
"Project planning","Projektplanung",,
|
||||
"Project set","Projektset",,
|
||||
"Project template",,,
|
||||
"Project type select","Projekttyp auswählen",,
|
||||
"Project/Business (Project)","Projekt/Geschäft (Projekt)",,
|
||||
"Project/Phase","Projekt/Phase",,
|
||||
"Projects","Projekte",,
|
||||
"Projects Folder","Projektordner",,
|
||||
"Purchase order lines","Bestellzeilen",,
|
||||
"Purchases","Einkäufe",,
|
||||
"Quantity","Menge",,
|
||||
"Related Projects","Verwandte Projekte",,
|
||||
"Related tasks","Verwandte Aufgaben",,
|
||||
"Remove lines","Linien entfernen",,
|
||||
"Remove selected lines","Markierte Zeilen entfernen",,
|
||||
"Reportings","Berichte",,
|
||||
"Reports","Berichte",,
|
||||
"Reset to New","Zurücksetzen auf neu",,
|
||||
"Resource","Ressource",,
|
||||
"Resource booking","Ressourcenbuchung",,
|
||||
"Resource bookings","Ressourcenbuchungen",,
|
||||
"Resource management","Ressourcenmanagement",,
|
||||
"Resource type","Ressourcentyp",,
|
||||
"Resource types","Ressourcentypen",,
|
||||
"Resources","Ressourcen",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Verkaufsauftragszeilen",,
|
||||
"Sales","Umsatz",,
|
||||
"Select Projects","Projekte auswählen",,
|
||||
"Select Users","Benutzer auswählen",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Neue Zeilen auswählen",,
|
||||
"Sequence","Sequenz",,
|
||||
"Serial/batch number","Serien-/Chargennummer",,
|
||||
"Show expense lines","Spesenzeilen anzeigen",,
|
||||
"Show phases elements","Phasenelemente anzeigen",,
|
||||
"Show production orders","Fertigungsaufträge anzeigen",,
|
||||
"Show purchase order lines","Bestellzeilen anzeigen",,
|
||||
"Show sale order lines","Verkaufsauftragszeilen anzeigen",,
|
||||
"Signature",,,
|
||||
"Start","Start",,
|
||||
"Start tasks to finish","Aufgaben starten, um sie zu beenden",,
|
||||
"Start tasks to start","Aufgaben zum Starten starten",,
|
||||
"Status","Status",,
|
||||
"Stop","Stopp",,
|
||||
"Subject","Betreff",,
|
||||
"Supplier Invoice lines","Lieferantenrechnungszeilen",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Synchronisieren",,
|
||||
"Take charge","Übernehmen Sie die Verantwortung",,
|
||||
"Task","Aufgabe",,
|
||||
"Task Invoicing","Aufgabe Fakturierung",,
|
||||
"Task Tree","Aufgabenbaum",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Aufgabe pro Zeile",,
|
||||
"Task date","Aufgabendatum",,
|
||||
"Task deadline","Aufgaben-Deadline",,
|
||||
"Task end","Aufgabenende",,
|
||||
"Task history","Aufgabenhistorie",,
|
||||
"Task template",,,
|
||||
"Task template list","Aufgabenvorlagenliste",,
|
||||
"Task templates",,,
|
||||
"Task updated","Aufgabe aktualisiert",,
|
||||
"Tasks","Aufgaben",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Team",,
|
||||
"Team task list","Teamaufgabenliste",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","Die tiefe Grenze des Projekts ist zu hoch.",,
|
||||
"The selected project/task doesn't contain any customers","Das ausgewählte Projekt/Aufgabe enthält keine Kunden.",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Zeitaufwand",,
|
||||
"Timer","Timer",,
|
||||
"Timer list","Timerliste",,
|
||||
"Title","Titel",,
|
||||
"To Date","Bis heute",,
|
||||
"To Invoice","Zur Rechnung",,
|
||||
"To date","Bis heute",,
|
||||
"Tools","Werkzeuge",,
|
||||
"Total duration (Hours)","Gesamtdauer (Stunden)",,
|
||||
"Total planned hours","Summe der geplanten Stunden",,
|
||||
"Tree view","Strukturansicht",,
|
||||
"Type","Typ",,
|
||||
"Type of authorized activities","Art der autorisierten Aktivitäten",,
|
||||
"Type of authorized categories","Art der autorisierten Kategorien",,
|
||||
"Unit","Einheit",,
|
||||
"Unit price","Stückpreis",,
|
||||
"Unlink selected lines","Löscht die Verknüpfung ausgewählter Leitungen",,
|
||||
"Update period according to task","Aktualisierungszeitraum je nach Aufgabe",,
|
||||
"Urgent","Dringend",,
|
||||
"User","Benutzer",,
|
||||
"User Gantt","Benutzer-Gantt",,
|
||||
"User Task","Benutzeraufgabe",,
|
||||
"Users","Benutzer",,
|
||||
"Validated Timesheet lines","Validierte Stundenzettelzeilen",,
|
||||
"Waiting Timesheet lines","Wartende Stundenzettelzeilen",,
|
||||
"Wiki","Wiki",,
|
||||
"You have no active team, the planning can't be generated","Du hast kein aktives Team, die Planung kann nicht generiert werden.",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","Sie haben keine Projekte oder Aufgaben an sich gebunden, Ihre Planung kann nicht generiert werden.",,
|
||||
"You have selected no team for this project","Sie haben kein Team für dieses Projekt ausgewählt.",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","Ihr Team hat keine Projekte oder Aufgaben, an die es gebunden ist, die Planung kann nicht generiert werden.",,
|
||||
"hours","Stunden",,
|
||||
"project-Resources","Projekt-Ressourcen",,
|
||||
|
@ -0,0 +1,277 @@
|
||||
"key","message","comment","context"
|
||||
"%s project",,,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>",,,
|
||||
"Accept Order",,,
|
||||
"Actions",,,
|
||||
"Add multiple lines",,,
|
||||
"Add selected lines",,,
|
||||
"All phase tasks",,,
|
||||
"All phases",,,
|
||||
"All tasks",,,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project",,,
|
||||
"Assigned to",,,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource",,,
|
||||
"Business",,,
|
||||
"Business project",,,
|
||||
"Cancel",,,
|
||||
"Canceled",,,
|
||||
"Category",,,
|
||||
"Characteristics",,,
|
||||
"Child Projects",,,
|
||||
"Code",,,
|
||||
"Company",,,
|
||||
"Configuration",,,
|
||||
"Configurations",,,
|
||||
"Content",,,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project",,,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency",,,
|
||||
"Customer",,,
|
||||
"Customer Contact",,,
|
||||
"Customer Invoice lines",,,
|
||||
"Customer contracts",,,
|
||||
"Daily planned charge in a month in an average per employee",,,
|
||||
"Daily planned charge in a month per employee",,,
|
||||
"Daily planned charge in a month per project",,,
|
||||
"Dates",,,
|
||||
"Deadline",,,
|
||||
"Deadline Today",,,
|
||||
"Deadline Tomorrow",,,
|
||||
"Deadline Yesterday",,,
|
||||
"Default status",,,
|
||||
"Delay to start (Hours)",,,
|
||||
"Description",,,
|
||||
"Due Date",,,
|
||||
"Duration (Hours)",,,
|
||||
"Duration hours",,,
|
||||
"Employee",,,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Estimated time",,,
|
||||
"Estimated time (in days)",,,
|
||||
"Estimated time (in hours)",,,
|
||||
"Exclude planning",,,
|
||||
"Expense lines",,,
|
||||
"Expenses",,,
|
||||
"Extends members from parent",,,
|
||||
"Financial Data",,,
|
||||
"Financial Report",,,
|
||||
"Finish",,,
|
||||
"Finish tasks to finish",,,
|
||||
"Finish tasks to start",,,
|
||||
"Finished",,,
|
||||
"Follow-up",,,
|
||||
"Followers",,,
|
||||
"Frequency",,,
|
||||
"From Date",,,
|
||||
"From date",,,
|
||||
"Gantt",,,
|
||||
"Gantt with project",,,
|
||||
"Gantt with user",,,
|
||||
"Gen proj type per order line",,,
|
||||
"Generate quotation",,,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project",,,
|
||||
"High",,,
|
||||
"Historical",,,
|
||||
"Image",,,
|
||||
"Import all members",,,
|
||||
"Imputable",,,
|
||||
"In Progress",,,
|
||||
"Internal Description",,,
|
||||
"Invoiced",,,
|
||||
"Invoices",,,
|
||||
"Invoicing",,,
|
||||
"Is close",,,
|
||||
"Is open",,,
|
||||
"Is unique task for multiple quantity",,,
|
||||
"Log Times",,,
|
||||
"Low",,,
|
||||
"Manage lines",,,
|
||||
"Members",,,
|
||||
"Membres",,,
|
||||
"My projects",,,
|
||||
"My tasks due",,,
|
||||
"My tasks to do",,,
|
||||
"My today planning",,,
|
||||
"My upcoming planning",,,
|
||||
"Name",,,
|
||||
"New",,,
|
||||
"New line",,,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal",,,
|
||||
"Not invoiced",,,
|
||||
"Not specified",,,
|
||||
"Notes",,,
|
||||
"Open gantt",,,
|
||||
"Open phase",,,
|
||||
"Open task",,,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state",,,
|
||||
"Package",,,
|
||||
"Parent project",,,
|
||||
"Parent task",,,
|
||||
"Person In Charge",,,
|
||||
"Phase by line",,,
|
||||
"Phase tasks",,,
|
||||
"Phases",,,
|
||||
"Plan project",,,
|
||||
"Planification and costs",,,
|
||||
"Planned Time Planning",,,
|
||||
"Planned charge",,,
|
||||
"Planned progress",,,
|
||||
"Planning",,,
|
||||
"Please select project",,,
|
||||
"Please select user",,,
|
||||
"Predecessors tasks",,,
|
||||
"Product",,,
|
||||
"Production",,,
|
||||
"Progress",,,
|
||||
"Progress (%)",,,
|
||||
"Project",,,
|
||||
"Project Calendar",,,
|
||||
"Project Folder",,,
|
||||
"Project Folders",,,
|
||||
"Project Gantt",,,
|
||||
"Project Label",,,
|
||||
"Project Phase",,,
|
||||
"Project Task",,,
|
||||
"Project Task Tree",,,
|
||||
"Project Tasks",,,
|
||||
"Project Wiki",,,
|
||||
"Project alone",,,
|
||||
"Project phase",,,
|
||||
"Project phases",,,
|
||||
"Project planning",,,
|
||||
"Project set",,,
|
||||
"Project template",,,
|
||||
"Project type select",,,
|
||||
"Project.toInvoice","To invoice",,
|
||||
"Project/Business (Project)",,,
|
||||
"Project/Phase",,,
|
||||
"Projects",,,
|
||||
"Projects Financial Report",,,
|
||||
"Projects Folder",,,
|
||||
"Projects Planification and costs",,,
|
||||
"Purchase order lines",,,
|
||||
"Purchases",,,
|
||||
"Quantity",,,
|
||||
"Related Projects",,,
|
||||
"Related tasks",,,
|
||||
"Remove lines",,,
|
||||
"Remove selected lines",,,
|
||||
"Reportings",,,
|
||||
"Reports",,,
|
||||
"Reset to New",,,
|
||||
"Resource",,,
|
||||
"Resource booking",,,
|
||||
"Resource bookings",,,
|
||||
"Resource management",,,
|
||||
"Resource type",,,
|
||||
"Resource types",,,
|
||||
"Resources",,,
|
||||
"Roadmap",,,
|
||||
"Sale order lines",,,
|
||||
"Sales",,,
|
||||
"Select Projects",,,
|
||||
"Select Users",,,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines",,,
|
||||
"Sequence",,,
|
||||
"Serial/batch number",,,
|
||||
"Show expense lines",,,
|
||||
"Show phases elements",,,
|
||||
"Show production orders",,,
|
||||
"Show purchase order lines",,,
|
||||
"Show sale order lines",,,
|
||||
"Signature",,,
|
||||
"Start",,,
|
||||
"Start tasks to finish",,,
|
||||
"Start tasks to start",,,
|
||||
"Status",,,
|
||||
"Stop",,,
|
||||
"Subject",,,
|
||||
"Supplier Invoice lines",,,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize",,,
|
||||
"Take charge",,,
|
||||
"Task",,,
|
||||
"Task Invoicing",,,
|
||||
"Task Tree",,,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line",,,
|
||||
"Task date",,,
|
||||
"Task deadline",,,
|
||||
"Task end",,,
|
||||
"Task history",,,
|
||||
"Task template",,,
|
||||
"Task template list",,,
|
||||
"Task templates",,,
|
||||
"Task updated",,,
|
||||
"Tasks",,,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team",,,
|
||||
"Team Task Category",,,
|
||||
"Team task list",,,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high",,,
|
||||
"The selected project/task doesn't contain any customers",,,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent",,,
|
||||
"Timer",,,
|
||||
"Timer list",,,
|
||||
"Title",,,
|
||||
"To Date",,,
|
||||
"To Invoice",,,
|
||||
"To date",,,
|
||||
"Tools",,,
|
||||
"Total duration (Hours)",,,
|
||||
"Total planned hours",,,
|
||||
"Tree view",,,
|
||||
"Type",,,
|
||||
"Type of authorized activities",,,
|
||||
"Type of authorized categories",,,
|
||||
"Unit",,,
|
||||
"Unit price",,,
|
||||
"Unlink selected lines",,,
|
||||
"Update period according to task",,,
|
||||
"Urgent",,,
|
||||
"User",,,
|
||||
"User Gantt",,,
|
||||
"User Task",,,
|
||||
"Users",,,
|
||||
"Validated Timesheet lines",,,
|
||||
"Waiting Timesheet lines",,,
|
||||
"Wiki",,,
|
||||
"You have no active team, the planning can't be generated",,,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.",,,
|
||||
"You have selected no team for this project",,,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.",,,
|
||||
"hours",,,
|
||||
"project-Resources",,,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","proyecto %s",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<class='label label-info'>Calculada automáticamente si se deja vacía </span>",,
|
||||
"Accept Order",,,
|
||||
"Actions","Acciones",,
|
||||
"Add multiple lines","Añadir varias líneas",,
|
||||
"Add selected lines","Añadir líneas seleccionadas",,
|
||||
"All phase tasks","Todas las tareas de fase",,
|
||||
"All phases","Todas las fases",,
|
||||
"All tasks","Todas las tareas",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","Proyecto de aplicación",,
|
||||
"Assigned to","Asignado a",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Recursos de libros",,
|
||||
"Budgeted time",,,
|
||||
"Business","Negocios",,
|
||||
"Business project","Proyecto empresarial",,
|
||||
"Cancel","Cancelar",,
|
||||
"Canceled","Cancelado",,
|
||||
"Category","Categoría",,
|
||||
"Characteristics","Características",,
|
||||
"Child Projects","Proyectos para niños",,
|
||||
"Code","Código",,
|
||||
"Company","Empresa",,
|
||||
"Configuration","Configuración",,
|
||||
"Configurations","Configuraciones",,
|
||||
"Content","Contenido",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Crear proyecto de facturación",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Moneda",,
|
||||
"Customer","Cliente",,
|
||||
"Customer Contact","Contacto con el cliente",,
|
||||
"Customer Invoice lines","Líneas de Factura de Cliente",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Fechas",,
|
||||
"Deadline","Fecha límite",,
|
||||
"Deadline Today","Fecha límite hoy",,
|
||||
"Deadline Tomorrow","Fecha límite mañana",,
|
||||
"Deadline Yesterday","Fecha límite: Ayer",,
|
||||
"Default status","Status por defecto",,
|
||||
"Delay to start (Hours)","Retraso en el arranque (Horas)",,
|
||||
"Description","Descripción",,
|
||||
"Due Date","Fecha de vencimiento",,
|
||||
"Duration (Hours)","Duración (Horas)",,
|
||||
"Duration hours","Duración horas",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Excluir la planificación",,
|
||||
"Expense lines","Líneas de gastos",,
|
||||
"Expenses","Gastos",,
|
||||
"Extends members from parent","Extiende a los miembros de los padres",,
|
||||
"Financial Data","Datos financieros",,
|
||||
"Financial Report","Informe financiero",,
|
||||
"Finish","Acabado",,
|
||||
"Finish tasks to finish","Finalizar tareas a finalizar",,
|
||||
"Finish tasks to start","Finalizar tareas para iniciar",,
|
||||
"Finished","Acabado",,
|
||||
"Follow-up","Seguimiento",,
|
||||
"Followers","Seguidores",,
|
||||
"Frequency",,,
|
||||
"From Date","Desde la fecha",,
|
||||
"From date","Desde la fecha",,
|
||||
"Gantt","Gantt",,
|
||||
"Gantt with project","Gantt con proyecto",,
|
||||
"Gantt with user","Gantt con el usuario",,
|
||||
"Gen proj type per order line","Tipo de proyecto por línea de pedido",,
|
||||
"Generate quotation","Generar oferta",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Proyecto generado",,
|
||||
"High","Alto",,
|
||||
"Historical","Histórico",,
|
||||
"Image","Imagen",,
|
||||
"Import all members","Importar todos los miembros",,
|
||||
"Imputable","Imputable",,
|
||||
"In Progress","En progreso",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Facturado",,
|
||||
"Invoices",,,
|
||||
"Invoicing","Facturación",,
|
||||
"Is close","Está cerca",,
|
||||
"Is open","Está abierto",,
|
||||
"Is unique task for multiple quantity","Es una tarea única para cantidades múltiples",,
|
||||
"Log Times","Tiempos de registro",,
|
||||
"Low","Baja",,
|
||||
"Manage lines","Administrar líneas",,
|
||||
"Members","Miembros",,
|
||||
"Membres","Membres",,
|
||||
"My projects","Mis proyectos",,
|
||||
"My tasks due","Mis tareas",,
|
||||
"My tasks to do","Mis tareas a realizar",,
|
||||
"My today planning","Mi planificación de hoy",,
|
||||
"My upcoming planning","Mi próxima planificación",,
|
||||
"Name","Nombre",,
|
||||
"New","Nuevo",,
|
||||
"New line","Nueva línea",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Normal",,
|
||||
"Not invoiced","No facturado",,
|
||||
"Not specified","No especificado",,
|
||||
"Notes","Notas",,
|
||||
"Open gantt","Gantt abierto",,
|
||||
"Open phase","Fase abierta",,
|
||||
"Open task","Tarea abierta",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Ordenar por estado",,
|
||||
"Package",,,
|
||||
"Parent project","Proyecto para padres",,
|
||||
"Parent task","Tarea de los padres",,
|
||||
"Person In Charge","Persona a Cargo",,
|
||||
"Phase by line","Fase por línea",,
|
||||
"Phase tasks","Tareas de la fase",,
|
||||
"Phases","Fases",,
|
||||
"Plan project","Planificar el proyecto",,
|
||||
"Planification and costs","Planificación y costes",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Progreso previsto",,
|
||||
"Planning","Planificación",,
|
||||
"Please select project","Por favor, seleccione el proyecto",,
|
||||
"Please select user","Por favor, seleccione un usuario",,
|
||||
"Predecessors tasks","Tareas de los predecesores",,
|
||||
"Product","Producto",,
|
||||
"Production","Producción",,
|
||||
"Progress","Progreso",,
|
||||
"Progress (%)","Progreso (%)",,
|
||||
"Project","Proyecto",,
|
||||
"Project Calendar","Calendario del proyecto",,
|
||||
"Project Category","Categoría del proyecto",,
|
||||
"Project Folder","Carpeta de proyectos",,
|
||||
"Project Folders","Carpetas de proyectos",,
|
||||
"Project Gantt","Proyecto Gantt",,
|
||||
"Project Label","Etiqueta del proyecto",,
|
||||
"Project Phase","Fase del proyecto",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Tarea del proyecto",,
|
||||
"Project Task Tree","Árbol de tareas del proyecto",,
|
||||
"Project Tasks","Tareas del proyecto",,
|
||||
"Project Wiki","Proyecto Wiki",,
|
||||
"Project alone","Proyecto solo",,
|
||||
"Project phase","Fase de proyecto",,
|
||||
"Project phases","Fases del proyecto",,
|
||||
"Project planning","Planificación de proyectos",,
|
||||
"Project set","Conjunto de proyectos",,
|
||||
"Project template",,,
|
||||
"Project type select","Selección del tipo de proyecto",,
|
||||
"Project/Business (Project)","Proyecto/Negocio (Proyecto)",,
|
||||
"Project/Phase","Proyecto/Fase",,
|
||||
"Projects","Proyectos",,
|
||||
"Projects Folder","Carpeta de proyectos",,
|
||||
"Purchase order lines","Líneas de pedido",,
|
||||
"Purchases","Compras",,
|
||||
"Quantity","Cantidad",,
|
||||
"Related Projects","Proyectos relacionados",,
|
||||
"Related tasks","Tareas relacionadas",,
|
||||
"Remove lines","Eliminar líneas",,
|
||||
"Remove selected lines","Eliminar líneas seleccionadas",,
|
||||
"Reportings","Reportajes",,
|
||||
"Reports","Informes",,
|
||||
"Reset to New","Reiniciar a Nuevo",,
|
||||
"Resource","Recurso",,
|
||||
"Resource booking","Inscripción de recursos",,
|
||||
"Resource bookings","Reservas de recursos",,
|
||||
"Resource management","Gestión de recursos",,
|
||||
"Resource type","Tipo de recurso",,
|
||||
"Resource types","Tipos de recursos",,
|
||||
"Resources","Recursos de la campaña",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Líneas de pedidos de venta",,
|
||||
"Sales","Ventas",,
|
||||
"Select Projects","Seleccione Proyectos",,
|
||||
"Select Users","Seleccione Usuarios",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Seleccionar nuevas líneas",,
|
||||
"Sequence","Secuencia",,
|
||||
"Serial/batch number","Número de serie/de lote",,
|
||||
"Show expense lines","Mostrar líneas de gastos",,
|
||||
"Show phases elements","Mostrar elementos de fases",,
|
||||
"Show production orders","Mostrar órdenes de fabricación",,
|
||||
"Show purchase order lines","Mostrar líneas de pedido",,
|
||||
"Show sale order lines","Mostrar líneas de pedidos de venta",,
|
||||
"Signature",,,
|
||||
"Start","Inicio",,
|
||||
"Start tasks to finish","Iniciar tareas para terminar",,
|
||||
"Start tasks to start","Iniciar tareas para iniciar",,
|
||||
"Status","Estado",,
|
||||
"Stop","Parar",,
|
||||
"Subject","Tema",,
|
||||
"Supplier Invoice lines","Proveedores Líneas de facturación",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Sincronizar",,
|
||||
"Take charge","Hágase cargo",,
|
||||
"Task","Tarea",,
|
||||
"Task Invoicing","Facturación de tareas",,
|
||||
"Task Tree","Árbol de tareas",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Tarea por línea",,
|
||||
"Task date","Fecha de la tarea",,
|
||||
"Task deadline","Plazo de la tarea",,
|
||||
"Task end","Fin de la tarea",,
|
||||
"Task history","Historial de tareas",,
|
||||
"Task template",,,
|
||||
"Task template list","Plantilla de tareas",,
|
||||
"Task templates",,,
|
||||
"Task updated","Tarea actualizada",,
|
||||
"Tasks","Tareas",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Equipo",,
|
||||
"Team task list","Lista de tareas del equipo",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","El límite profundo del proyecto es demasiado alto",,
|
||||
"The selected project/task doesn't contain any customers","El proyecto/tarea seleccionado no contiene clientes",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Tiempo Pasado",,
|
||||
"Timer","Temporizador",,
|
||||
"Timer list","Lista de temporizadores",,
|
||||
"Title","Título",,
|
||||
"To Date","Hasta la fecha",,
|
||||
"To Invoice","Para Facturar",,
|
||||
"To date","Hasta la fecha",,
|
||||
"Tools","Herramientas",,
|
||||
"Total duration (Hours)","Duración total (Horas)",,
|
||||
"Total planned hours","Horas teóricas totales",,
|
||||
"Tree view","Vista de árbol",,
|
||||
"Type","Tipo",,
|
||||
"Type of authorized activities","Tipo de actividades autorizadas",,
|
||||
"Type of authorized categories","Tipo de categorías autorizadas",,
|
||||
"Unit","Unidad",,
|
||||
"Unit price","Precio unitario",,
|
||||
"Unlink selected lines","Desenlazar líneas seleccionadas",,
|
||||
"Update period according to task","Período de actualización según la tarea",,
|
||||
"Urgent","Urgente",,
|
||||
"User","Usuario",,
|
||||
"User Gantt","Usuario Gantt",,
|
||||
"User Task","Tarea del usuario",,
|
||||
"Users","Usuarios",,
|
||||
"Validated Timesheet lines","Líneas de hoja de horas validadas",,
|
||||
"Waiting Timesheet lines","Líneas de espera de la hoja de tiempos",,
|
||||
"Wiki","Wiki",,
|
||||
"You have no active team, the planning can't be generated","No tienes un equipo activo, la planificación no puede ser generada",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","No tienes proyectos ni tareas ligadas a ti, tu planificación no puede ser generada.",,
|
||||
"You have selected no team for this project","No ha seleccionado ningún equipo para este proyecto",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","Su equipo no tiene proyectos o tareas vinculadas a él, la planificación no puede ser generada.",,
|
||||
"hours","horario",,
|
||||
"project-Resources","proyectos-Recursos",,
|
||||
|
@ -0,0 +1,277 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","Projet %s",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label label-info'>Calculé automatiquement si laissé vide</span>",,
|
||||
"Accept Order","Accepter devis",,
|
||||
"Actions",,,
|
||||
"Add multiple lines","Ajouter plusieurs lignes",,
|
||||
"Add selected lines","Ajouter les lignes sélectionnées",,
|
||||
"All phase tasks","Toutes les tâches de phase",,
|
||||
"All phases","Toutes les phases",,
|
||||
"All tasks","Toutes les tâches",,
|
||||
"Analytic","Analytique",,
|
||||
"Announcement",,,
|
||||
"App project","App Projet",,
|
||||
"Assigned to","Assigné à",,
|
||||
"Assigning to the customer","Affecter au client",,
|
||||
"Assigning to the provider","Affecter au prestataire",,
|
||||
"Book resource","Réserver une ressource",,
|
||||
"Business","Affaire",,
|
||||
"Business project","Affaire",,
|
||||
"Cancel","Annuler",,
|
||||
"Canceled","Annuler",,
|
||||
"Category",,,
|
||||
"Characteristics","Caractéristiques",,
|
||||
"Child Projects","Projets enfants",,
|
||||
"Code",,,
|
||||
"Company","Société",,
|
||||
"Configuration",,,
|
||||
"Configurations",,,
|
||||
"Content","Contenu",,
|
||||
"Contracts","Contrats",,
|
||||
"Create business project from this template","Créer affaire à partir ce de modèle",,
|
||||
"Create invoicing project","Facturer l'affaire",,
|
||||
"Create new customer contract","Créer un nouveau contrat client",,
|
||||
"Create new supplier contract","Créer un nouveau contrat fournisseur",,
|
||||
"Create project from this template","Créer projet à partir ce de modèle",,
|
||||
"Currency",,,
|
||||
"Customer","Client",,
|
||||
"Customer Contact","Contact client",,
|
||||
"Customer Invoice lines","Lignes de factures client",,
|
||||
"Customer contracts","Contrats clients",,
|
||||
"Daily planned charge in a month in an average per employee",,,
|
||||
"Daily planned charge in a month per employee",,,
|
||||
"Daily planned charge in a month per project",,,
|
||||
"Dates",,,
|
||||
"Deadline","Date d'échéance",,
|
||||
"Deadline Today","Echéance aujourd'hui",,
|
||||
"Deadline Tomorrow","Echéance demain",,
|
||||
"Deadline Yesterday","Echéance hier",,
|
||||
"Default status","Statut par défaut",,
|
||||
"Delay to start (Hours)","Délai pour commencer (Heures)",,
|
||||
"Description",,,
|
||||
"Due Date","Date d'échéance",,
|
||||
"Duration (Hours)","Durée (Heures)",,
|
||||
"Duration hours","Durée (Heures)",,
|
||||
"Employee",,,
|
||||
"Enable task signature","Activer la signature de tâche",,
|
||||
"Enter Time spent","Saisir temps passé",,
|
||||
"Estimated time","Temps estimé",,
|
||||
"Estimated time (in days)","Temps estimé (en jours)",,
|
||||
"Estimated time (in hours)","Temps estimé (en heures)",,
|
||||
"Exclude planning","Exclure planification",,
|
||||
"Expense lines",,,
|
||||
"Expenses",,,
|
||||
"Extends members from parent","Hériter des membres du projet parent",,
|
||||
"Financial Data","Informations financières",,
|
||||
"Financial Report","Rapport financier",,
|
||||
"Finish","Terminer",,
|
||||
"Finish tasks to finish",,,
|
||||
"Finish tasks to start",,,
|
||||
"Finished","Terminé",,
|
||||
"Follow-up",,,
|
||||
"Followers",,,
|
||||
"Frequency","Fréquence",,
|
||||
"From Date","Du",,
|
||||
"From date",,,
|
||||
"Gantt",,,
|
||||
"Gantt with project","Gantt avec le projet",,
|
||||
"Gantt with user","Gantt avec l'utilisateur",,
|
||||
"Gen proj type per order line","Type d'élément généré par ligne de commande",,
|
||||
"Generate quotation","Générer un devis",,
|
||||
"Generate sequence for project","Générer une séquence pour les projets",,
|
||||
"Generated project","Projet généré",,
|
||||
"High",,,
|
||||
"Historical",,,
|
||||
"Image",,,
|
||||
"Import all members","Importer tous les membres",,
|
||||
"Imputable",,,
|
||||
"In Progress","En Cours",,
|
||||
"Internal Description","Description interne",,
|
||||
"Invoiced",,,
|
||||
"Invoices","Factures",,
|
||||
"Invoicing","Facturation",,
|
||||
"Is close",,,
|
||||
"Is open",,,
|
||||
"Is unique task for multiple quantity","Est une tâche unique pour plusieurs quantité",,
|
||||
"Log Times","Temps passés",,
|
||||
"Low",,,
|
||||
"Manage lines","Gérer les lignes",,
|
||||
"Members","Membres",,
|
||||
"Membres","Membres",,
|
||||
"My projects","Mes projets",,
|
||||
"My tasks due","Mes tâches en retard",,
|
||||
"My tasks to do","Mes tâches en cours",,
|
||||
"My today planning","Mon planning du jour",,
|
||||
"My upcoming planning","Mon planning à venir",,
|
||||
"Name","Nom",,
|
||||
"New","Nouveau",,
|
||||
"New line","Nouvelle ligne",,
|
||||
"New task","Nouvelle tâche",,
|
||||
"New ticket","Nouveau ticket",,
|
||||
"Normal",,,
|
||||
"Not invoiced",,,
|
||||
"Not specified","Non spécifié",,
|
||||
"Notes",,,
|
||||
"Open gantt",,,
|
||||
"Open phase","Ouvrir la phase",,
|
||||
"Open task","Ouvrir tâche",,
|
||||
"Order Accepted","Devis accepté",,
|
||||
"Order Proposed","Devis proposé",,
|
||||
"Order by state","Trier par statut",,
|
||||
"Package","Forfait",,
|
||||
"Parent project","Projet parent",,
|
||||
"Parent task","Tâche parent",,
|
||||
"Person In Charge","Responsable",,
|
||||
"Phase by line","Phase par ligne",,
|
||||
"Phase tasks",,,
|
||||
"Phases",,,
|
||||
"Plan project","Planifier des temps",,
|
||||
"Planification and costs","Planification et coûts",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned charge",,,
|
||||
"Planned progress","Avancement planifié",,
|
||||
"Planning","Planification",,
|
||||
"Please select project","Veuillez sélectionner un projet",,
|
||||
"Please select user","Veuillez sélectionner un utilisateur",,
|
||||
"Predecessors tasks","Tâches précédentes",,
|
||||
"Product","Produit",,
|
||||
"Production",,,
|
||||
"Progress","Progression",,
|
||||
"Progress (%)","Progression(%)",,
|
||||
"Project","Projet",,
|
||||
"Project Calendar","Calendrier projet",,
|
||||
"Project Folder","Dossier",,
|
||||
"Project Folders","Dossiers du projet",,
|
||||
"Project Gantt","Projet Gantt",,
|
||||
"Project Label","Libellé projet",,
|
||||
"Project Phase","Phase projet",,
|
||||
"Project Task","Tâche",,
|
||||
"Project Task Tree","Arborescence des tâches",,
|
||||
"Project Tasks","Tâches",,
|
||||
"Project Wiki","Wiki des projets",,
|
||||
"Project alone","Projet seul",,
|
||||
"Project phase","Phase de projet",,
|
||||
"Project phases","Phases de projet",,
|
||||
"Project planning","Planning projet",,
|
||||
"Project set","Projets",,
|
||||
"Project template","Modèle de projet",,
|
||||
"Project type select","Type de projet",,
|
||||
"Project.toInvoice","Facturer",,
|
||||
"Project/Business (Project)",,,
|
||||
"Project/Phase","Projet/Phase",,
|
||||
"Projects","Projets",,
|
||||
"Projects Financial Report",,,
|
||||
"Projects Folder","Dossier de projets",,
|
||||
"Projects Planification and costs",,,
|
||||
"Purchase order lines","Lignes de commandes d'achat",,
|
||||
"Purchases",,,
|
||||
"Quantity","Quantité",,
|
||||
"Related Projects","Projets rattachés",,
|
||||
"Related tasks",,,
|
||||
"Remove lines","Retirer des lignes",,
|
||||
"Remove selected lines","Retirer les lignes sélectionnées",,
|
||||
"Reportings",,,
|
||||
"Reports",,,
|
||||
"Reset to New","Repasser à nouveau",,
|
||||
"Resource",,,
|
||||
"Resource booking","Réservation ressources",,
|
||||
"Resource bookings","Réservation ressources",,
|
||||
"Resource management","Management des ressources",,
|
||||
"Resource type","Type de ressources",,
|
||||
"Resource types","Types de ressources",,
|
||||
"Resources",,,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Lignes de commande",,
|
||||
"Sales",,,
|
||||
"Select Projects","Projets",,
|
||||
"Select Users","Utilisateurs",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Ajouter des lignes",,
|
||||
"Sequence","Séquence",,
|
||||
"Serial/batch number",,,
|
||||
"Show expense lines","Voir les lignes de note de frais",,
|
||||
"Show phases elements","Voir les éléments de phase",,
|
||||
"Show production orders","Voir les ordres de production",,
|
||||
"Show purchase order lines","Voir les lignes d'achat",,
|
||||
"Show sale order lines","Voir les lignes de commande ",,
|
||||
"Signature",,,
|
||||
"Start","Démarrer",,
|
||||
"Start tasks to finish",,,
|
||||
"Start tasks to start",,,
|
||||
"Status","Statut",,
|
||||
"Stop","Arrêter",,
|
||||
"Subject",,,
|
||||
"Supplier Invoice lines","Lignes de factures fournisseur",,
|
||||
"Supplier contracts","Contrats fournisseurs",,
|
||||
"Synchronize","Synchroniser",,
|
||||
"Take charge","Prendre en charge",,
|
||||
"Task","Tâche",,
|
||||
"Task Invoicing","Facturation des tâches",,
|
||||
"Task Tree","Arborescence des tâches",,
|
||||
"Task assigned to","Tâche Assignée à",,
|
||||
"Task assigned to the client","Tâche assignée au client",,
|
||||
"Task assigned to the provider","Tâche Assignée au prestataire",,
|
||||
"Task by line","Tâche par ligne",,
|
||||
"Task date","Date",,
|
||||
"Task deadline","Date limite",,
|
||||
"Task end","Fin de tâche",,
|
||||
"Task history","Historique des tâches",,
|
||||
"Task template","Modèle de tâche",,
|
||||
"Task template list","Liste de modèle de tâche",,
|
||||
"Task templates","Modèles de tâches",,
|
||||
"Task updated","Tâche mise à jour",,
|
||||
"Tasks","Tâches",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Équipe",,
|
||||
"Team Task Category",,,
|
||||
"Team task list","List des tâches",,
|
||||
"Template","Modèle",,
|
||||
"The company %s doesn't have any configured sequence for Project","La société %s n'a pas de séquence configurer pour les projets",,
|
||||
"The deep limit of the project is too high","La limite de ce project est trop élevée",,
|
||||
"The selected project/task doesn't contain any customers","Le projet/tâche sélectionné(e) ne contient pas de client",,
|
||||
"Ticket",,,
|
||||
"Tickets","Les Tickets",,
|
||||
"Time Spent","Temps passés",,
|
||||
"Timer","Chronomètre",,
|
||||
"Timer list","Liste de chronomètre",,
|
||||
"Title","Titre",,
|
||||
"To Date","A",,
|
||||
"To Invoice","A facturer",,
|
||||
"To date",,,
|
||||
"Tools",,,
|
||||
"Total duration (Hours)","Durée total (Heures)",,
|
||||
"Total planned hours","Temps total planifié",,
|
||||
"Tree view","Arborescence des tâches",,
|
||||
"Type",,,
|
||||
"Type of authorized activities","Type d’activités autorisées",,
|
||||
"Type of authorized categories","Type de catégories autorisées",,
|
||||
"Unit",,,
|
||||
"Unit price",,,
|
||||
"Unlink selected lines","Délier les lignes selectionnées",,
|
||||
"Update period according to task","Mettre à jour la période par rapport à la tâche",,
|
||||
"Urgent",,,
|
||||
"User",,,
|
||||
"User Gantt","Gantt utilisateur",,
|
||||
"User Task","Tâche utilisateur",,
|
||||
"Users",,,
|
||||
"Validated Timesheet lines","Lignes de feuilles de temps validées",,
|
||||
"Waiting Timesheet lines","Lignes de feuilles de temps en attente",,
|
||||
"Wiki",,,
|
||||
"You have no active team, the planning can't be generated","Vous n'avez pas d'équipe active, le planning ne sera pas généré",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","Vous n'êtes sur aucun projet ou aucune tâche, votre planning ne sera pas généré",,
|
||||
"You have selected no team for this project","Vous n'avez sélectionné aucune équipe pour ce projet.",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","Votre équipe n'est sur aucun projet ou aucune tâche, votre planning ne sera pas généré.",,
|
||||
"hours",,,
|
||||
"project-Resources",,,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","%s progetto",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label-info'>Conta automaticamente se lasciato vuoto</span>.",,
|
||||
"Accept Order",,,
|
||||
"Actions","Azioni",,
|
||||
"Add multiple lines","Aggiungere più righe",,
|
||||
"Add selected lines","Aggiungi linee selezionate",,
|
||||
"All phase tasks","Tutti i compiti di fase",,
|
||||
"All phases","Tutte le fasi",,
|
||||
"All tasks","Tutti i compiti",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","Progetto App",,
|
||||
"Assigned to","Assegnato a",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Prenota risorsa",,
|
||||
"Budgeted time",,,
|
||||
"Business","Affari",,
|
||||
"Business project","Progetto imprenditoriale",,
|
||||
"Cancel","Annulla",,
|
||||
"Canceled","Annullato",,
|
||||
"Category","Categoria",,
|
||||
"Characteristics","Caratteristiche",,
|
||||
"Child Projects","Progetti per bambini",,
|
||||
"Code","Codice",,
|
||||
"Company","L'azienda",,
|
||||
"Configuration","Configurazione",,
|
||||
"Configurations","Configurazioni",,
|
||||
"Content","Contenuto",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Crea progetto di fatturazione",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Valuta",,
|
||||
"Customer","Cliente",,
|
||||
"Customer Contact","Contatto con il cliente",,
|
||||
"Customer Invoice lines","Linee di fatturazione clienti",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Le date",,
|
||||
"Deadline","Scadenza",,
|
||||
"Deadline Today","Scadenza Oggi",,
|
||||
"Deadline Tomorrow","Scadenza Domani",,
|
||||
"Deadline Yesterday","Scadenza Ieri",,
|
||||
"Default status","Stato di default",,
|
||||
"Delay to start (Hours)","Ritardo alla partenza (ore)",,
|
||||
"Description","Descrizione",,
|
||||
"Due Date","Data di scadenza",,
|
||||
"Duration (Hours)","Durata (ore)",,
|
||||
"Duration hours","Durata",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Escludere la pianificazione",,
|
||||
"Expense lines","Linee di spesa",,
|
||||
"Expenses","Spese",,
|
||||
"Extends members from parent","Estende i membri dei genitori",,
|
||||
"Financial Data","Dati finanziari",,
|
||||
"Financial Report","Relazione finanziaria",,
|
||||
"Finish","Finitura",,
|
||||
"Finish tasks to finish","Finire i compiti da completare",,
|
||||
"Finish tasks to start","Terminare i compiti da avviare",,
|
||||
"Finished","Finito",,
|
||||
"Follow-up","Seguito",,
|
||||
"Followers","Seguaci",,
|
||||
"Frequency",,,
|
||||
"From Date","Da Data",,
|
||||
"From date","Dalla data",,
|
||||
"Gantt","Gantt",,
|
||||
"Gantt with project","Gantt con progetto",,
|
||||
"Gantt with user","Gantt con utente",,
|
||||
"Gen proj type per order line","Gen tipo di progetto per linea d'ordine",,
|
||||
"Generate quotation","Genera preventivo",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Progetto generato",,
|
||||
"High","Alto",,
|
||||
"Historical","Storico",,
|
||||
"Image","Immagine",,
|
||||
"Import all members","Importa tutti i membri",,
|
||||
"Imputable","Imputabile",,
|
||||
"In Progress","In corso",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Fatturato",,
|
||||
"Invoices",,,
|
||||
"Invoicing","Fatturazione",,
|
||||
"Is close","E' vicino",,
|
||||
"Is open","È aperto",,
|
||||
"Is unique task for multiple quantity","È compito unico per quantità multiple",,
|
||||
"Log Times","Tempi di registrazione",,
|
||||
"Low","Basso",,
|
||||
"Manage lines","Gestire le linee",,
|
||||
"Members","Membri",,
|
||||
"Membres","Membri",,
|
||||
"My projects","I miei progetti",,
|
||||
"My tasks due","I miei compiti",,
|
||||
"My tasks to do","I miei compiti da svolgere",,
|
||||
"My today planning","La mia pianificazione di oggi",,
|
||||
"My upcoming planning","La mia prossima pianificazione",,
|
||||
"Name","Nome",,
|
||||
"New","Nuovo",,
|
||||
"New line","Nuova linea",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Normale",,
|
||||
"Not invoiced","Non fatturata",,
|
||||
"Not specified","Non specificato",,
|
||||
"Notes","Note",,
|
||||
"Open gantt","Aprire gantt",,
|
||||
"Open phase","Fase aperta",,
|
||||
"Open task","Compito aperto",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Ordine per stato",,
|
||||
"Package",,,
|
||||
"Parent project","Progetto del genitore",,
|
||||
"Parent task","Compito del genitore",,
|
||||
"Person In Charge","Persona in carica",,
|
||||
"Phase by line","Fase per linea",,
|
||||
"Phase tasks","Compiti di fase",,
|
||||
"Phases","Fasi",,
|
||||
"Plan project","Pianificare il progetto",,
|
||||
"Planification and costs","Pianificazione e costi",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Progressi previsti",,
|
||||
"Planning","Pianificazione",,
|
||||
"Please select project","Selezionare il progetto",,
|
||||
"Please select user","Selezionare l'utente",,
|
||||
"Predecessors tasks","Compiti precedenti",,
|
||||
"Product","Prodotto",,
|
||||
"Production","Produzione",,
|
||||
"Progress","Progressi",,
|
||||
"Progress (%)","Progressi (%)",,
|
||||
"Project","Il progetto",,
|
||||
"Project Calendar","Calendario del progetto",,
|
||||
"Project Category","Categoria del progetto",,
|
||||
"Project Folder","Cartella del progetto",,
|
||||
"Project Folders","Cartelle di progetto",,
|
||||
"Project Gantt","Progetto Gantt",,
|
||||
"Project Label","Etichetta del progetto",,
|
||||
"Project Phase","Fase del progetto",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Compito del progetto",,
|
||||
"Project Task Tree","Albero dei compiti del progetto",,
|
||||
"Project Tasks","Compiti del progetto",,
|
||||
"Project Wiki","Progetto Wiki",,
|
||||
"Project alone","Progetto da solo",,
|
||||
"Project phase","Fase del progetto",,
|
||||
"Project phases","Fasi del progetto",,
|
||||
"Project planning","Pianificazione del progetto",,
|
||||
"Project set","Set di progetti",,
|
||||
"Project template",,,
|
||||
"Project type select","Selezione del tipo di progetto",,
|
||||
"Project/Business (Project)","Progetto/Business (Progetto)",,
|
||||
"Project/Phase","Progetto/Fase del progetto",,
|
||||
"Projects","Progetti",,
|
||||
"Projects Folder","Cartella Progetti",,
|
||||
"Purchase order lines","Linee d'ordine d'acquisto",,
|
||||
"Purchases","Acquisti",,
|
||||
"Quantity","Quantità",,
|
||||
"Related Projects","Progetti correlati",,
|
||||
"Related tasks","Compiti correlati",,
|
||||
"Remove lines","Rimuovere le linee",,
|
||||
"Remove selected lines","Rimuovi linee selezionate",,
|
||||
"Reportings","Rapporti",,
|
||||
"Reports","Rapporti",,
|
||||
"Reset to New","Ripristina a Nuovo",,
|
||||
"Resource","Risorsa",,
|
||||
"Resource booking","Prenotazione delle risorse",,
|
||||
"Resource bookings","Prenotazioni di risorse",,
|
||||
"Resource management","Gestione delle risorse",,
|
||||
"Resource type","Tipo di risorsa",,
|
||||
"Resource types","Tipi di risorse",,
|
||||
"Resources","Risorse",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Linee d'ordine di vendita",,
|
||||
"Sales","Vendite",,
|
||||
"Select Projects","Seleziona i progetti",,
|
||||
"Select Users","Seleziona Utenti",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Seleziona nuove linee",,
|
||||
"Sequence","Sequenza",,
|
||||
"Serial/batch number","Numero di serie/numero di lotto",,
|
||||
"Show expense lines","Mostra linee di spesa",,
|
||||
"Show phases elements","Mostra gli elementi delle fasi",,
|
||||
"Show production orders","Mostra ordini di produzione",,
|
||||
"Show purchase order lines","Mostra linee d'ordine d'acquisto",,
|
||||
"Show sale order lines","Mostra linee d'ordine di vendita",,
|
||||
"Signature",,,
|
||||
"Start","Inizio",,
|
||||
"Start tasks to finish","Compiti dall'inizio alla fine",,
|
||||
"Start tasks to start","Avviare le attività da avviare",,
|
||||
"Status","Stato",,
|
||||
"Stop","Fermo",,
|
||||
"Subject","Oggetto",,
|
||||
"Supplier Invoice lines","Linee di fatturazione dei fornitori",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Sincronizzare",,
|
||||
"Take charge","Prendere in carico",,
|
||||
"Task","Compito",,
|
||||
"Task Invoicing","Compito Fatturazione",,
|
||||
"Task Tree","Albero dei compiti",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Compito per linea",,
|
||||
"Task date","Data del compito",,
|
||||
"Task deadline","Scadenza del compito",,
|
||||
"Task end","Fine compito",,
|
||||
"Task history","Cronologia delle attività",,
|
||||
"Task template",,,
|
||||
"Task template list","Elenco dei modelli di attività",,
|
||||
"Task templates",,,
|
||||
"Task updated","Aggiornato il compito",,
|
||||
"Tasks","Compiti",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Squadra",,
|
||||
"Team task list","Elenco delle attività di squadra",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","Il limite profondo del progetto è troppo alto",,
|
||||
"The selected project/task doesn't contain any customers","Il progetto/attività selezionata non contiene clienti",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Tempo trascorso",,
|
||||
"Timer","Timer",,
|
||||
"Timer list","Elenco dei timer",,
|
||||
"Title","Titolo",,
|
||||
"To Date","Fino ad oggi",,
|
||||
"To Invoice","Alla Fattura",,
|
||||
"To date","Ad oggi",,
|
||||
"Tools","Strumenti",,
|
||||
"Total duration (Hours)","Durata totale (ore)",,
|
||||
"Total planned hours","Totale ore pianificate",,
|
||||
"Tree view","Vista sull'albero",,
|
||||
"Type","Tipo",,
|
||||
"Type of authorized activities","Tipo di attività autorizzate",,
|
||||
"Type of authorized categories","Tipo di categorie autorizzate",,
|
||||
"Unit","Unità",,
|
||||
"Unit price","Prezzo unitario",,
|
||||
"Unlink selected lines","Scollegamento delle linee selezionate",,
|
||||
"Update period according to task","Periodo di aggiornamento secondo il compito",,
|
||||
"Urgent","Urgente",,
|
||||
"User","Utente",,
|
||||
"User Gantt","Gantt utente",,
|
||||
"User Task","Attività dell'utente",,
|
||||
"Users","Utenti",,
|
||||
"Validated Timesheet lines","Linee dei fogli di lavoro convalidate",,
|
||||
"Waiting Timesheet lines","Linee dei fogli di attesa",,
|
||||
"Wiki","Wiki",,
|
||||
"You have no active team, the planning can't be generated","Non hai un team attivo, la pianificazione non può essere generata.",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","Non hai progetti o compiti legati a te, la tua pianificazione non puo' essere generata.",,
|
||||
"You have selected no team for this project","Non hai selezionato nessun team per questo progetto",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","Il tuo team non ha progetti o compiti ad esso legati, la pianificazione non può essere generata.",,
|
||||
"hours","orario",,
|
||||
"project-Resources","progetto-Risorse",,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","%s project",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label-label-info'> Automatisch berekend indien leeg gelaten</span>",,
|
||||
"Accept Order",,,
|
||||
"Actions","Acties",,
|
||||
"Add multiple lines","Meerdere regels toevoegen",,
|
||||
"Add selected lines","Geselecteerde lijnen toevoegen",,
|
||||
"All phase tasks","Alle fase taken",,
|
||||
"All phases","Alle fasen",,
|
||||
"All tasks","Alle taken",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","App project",,
|
||||
"Assigned to","Toegewezen aan",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Boek bron",,
|
||||
"Budgeted time",,,
|
||||
"Business","Bedrijf",,
|
||||
"Business project","Bedrijfsproject",,
|
||||
"Cancel","Annuleren",,
|
||||
"Canceled","Geannuleerd",,
|
||||
"Category","Categorie",,
|
||||
"Characteristics","Kenmerken",,
|
||||
"Child Projects","Kind Projecten",,
|
||||
"Code","Code",,
|
||||
"Company","Bedrijf",,
|
||||
"Configuration","Configuratie",,
|
||||
"Configurations","Configuraties",,
|
||||
"Content","Inhoud",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Factureringsproject aanmaken",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Valuta",,
|
||||
"Customer","Klant",,
|
||||
"Customer Contact","Contact met de klant",,
|
||||
"Customer Invoice lines","Factuurlijnen voor klanten",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Data",,
|
||||
"Deadline","Uiterste datum",,
|
||||
"Deadline Today","Uiterste datum Vandaag",,
|
||||
"Deadline Tomorrow","Deadline Morgen",,
|
||||
"Deadline Yesterday","Deadline Gisteren",,
|
||||
"Default status","Standaard status",,
|
||||
"Delay to start (Hours)","Vertraging om te beginnen (uren)",,
|
||||
"Description","Beschrijving",,
|
||||
"Due Date","Vervaldatum",,
|
||||
"Duration (Hours)","Duur (uren)",,
|
||||
"Duration hours","Duur uren",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Planning uitsluiten",,
|
||||
"Expense lines","Uitgavenlijnen",,
|
||||
"Expenses","Uitgaven",,
|
||||
"Extends members from parent","Breidt de leden van de ouders uit",,
|
||||
"Financial Data","Financiële gegevens",,
|
||||
"Financial Report","Financieel verslag",,
|
||||
"Finish","Afwerking",,
|
||||
"Finish tasks to finish","Voltooien van taken om af te maken",,
|
||||
"Finish tasks to start","Voltooien van taken om te beginnen",,
|
||||
"Finished","Afgewerkt",,
|
||||
"Follow-up","Follow-up",,
|
||||
"Followers","Volgelingen",,
|
||||
"Frequency",,,
|
||||
"From Date","Vanaf datum",,
|
||||
"From date","Vanaf datum",,
|
||||
"Gantt","Gantt",,
|
||||
"Gantt with project","Gantt met project",,
|
||||
"Gantt with user","Gantt met gebruiker",,
|
||||
"Gen proj type per order line","Gen projecttype per orderregel",,
|
||||
"Generate quotation","Genereer offerte",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Gegenereerd project",,
|
||||
"High","Hoog",,
|
||||
"Historical","Historisch",,
|
||||
"Image","Beeld",,
|
||||
"Import all members","Alle leden importeren",,
|
||||
"Imputable","Veranderlijk",,
|
||||
"In Progress","In uitvoering",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Gefactureerd",,
|
||||
"Invoices",,,
|
||||
"Invoicing","Facturatie",,
|
||||
"Is close","Is dichtbij",,
|
||||
"Is open","Is open",,
|
||||
"Is unique task for multiple quantity","Is een unieke taak voor meerdere hoeveelheden",,
|
||||
"Log Times","Logtijden",,
|
||||
"Low","Laag",,
|
||||
"Manage lines","Beheer lijnen",,
|
||||
"Members","Leden",,
|
||||
"Membres","Membres",,
|
||||
"My projects","Mijn projecten",,
|
||||
"My tasks due","Mijn taken",,
|
||||
"My tasks to do","Mijn taken",,
|
||||
"My today planning","Mijn planning voor vandaag",,
|
||||
"My upcoming planning","Mijn aanstaande planning",,
|
||||
"Name","Naam",,
|
||||
"New","Nieuw",,
|
||||
"New line","Nieuwe lijn",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Normaal",,
|
||||
"Not invoiced","Niet gefactureerd",,
|
||||
"Not specified","Niet gespecificeerd",,
|
||||
"Notes","Opmerkingen",,
|
||||
"Open gantt","Open gangpad",,
|
||||
"Open phase","Open fase",,
|
||||
"Open task","Open taak",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Volgorde per staat",,
|
||||
"Package",,,
|
||||
"Parent project","Ouderproject",,
|
||||
"Parent task","Ouderlijke taak",,
|
||||
"Person In Charge","Verantwoordelijke persoon",,
|
||||
"Phase by line","Fase voor fase per lijn",,
|
||||
"Phase tasks","Fase taken",,
|
||||
"Phases","Fasen",,
|
||||
"Plan project","Plan project",,
|
||||
"Planification and costs","Planificatie en kosten",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Geplande vooruitgang",,
|
||||
"Planning","Planning",,
|
||||
"Please select project","Selecteer een project",,
|
||||
"Please select user","Selecteer gebruiker",,
|
||||
"Predecessors tasks","Taken van de voorgangers",,
|
||||
"Product","Product",,
|
||||
"Production","Productie",,
|
||||
"Progress","Vooruitgang",,
|
||||
"Progress (%)","Vooruitgang (%)",,
|
||||
"Project","Project",,
|
||||
"Project Calendar","Project Kalender",,
|
||||
"Project Category","Project Categorie",,
|
||||
"Project Folder","Projectmap",,
|
||||
"Project Folders","Projectmappen",,
|
||||
"Project Gantt","Project Gantt",,
|
||||
"Project Label","Projectetiket",,
|
||||
"Project Phase","Projectfase",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Project Taak",,
|
||||
"Project Task Tree","Project Taak Boom",,
|
||||
"Project Tasks","Project Taken",,
|
||||
"Project Wiki","Project Wiki",,
|
||||
"Project alone","Project alleen",,
|
||||
"Project phase","Projectfase",,
|
||||
"Project phases","Projectfasen",,
|
||||
"Project planning","Projectplanning",,
|
||||
"Project set","Projectreeks",,
|
||||
"Project template",,,
|
||||
"Project type select","Projecttype selecteren",,
|
||||
"Project/Business (Project)","Project/bedrijf (Project)",,
|
||||
"Project/Phase","Project/Fase",,
|
||||
"Projects","Projecten",,
|
||||
"Projects Folder","Projecten Map",,
|
||||
"Purchase order lines","Bestellijnen kopen",,
|
||||
"Purchases","Aankopen",,
|
||||
"Quantity","Hoeveelheid",,
|
||||
"Related Projects","Verwante projecten",,
|
||||
"Related tasks","Gerelateerde taken",,
|
||||
"Remove lines","Lijnen verwijderen",,
|
||||
"Remove selected lines","Geselecteerde lijnen verwijderen",,
|
||||
"Reportings","Meldingen",,
|
||||
"Reports","Rapporten",,
|
||||
"Reset to New","Reset naar nieuw",,
|
||||
"Resource","Hulpbron",,
|
||||
"Resource booking","Resource boeken",,
|
||||
"Resource bookings","Resource boekingen",,
|
||||
"Resource management","Beheer van hulpbronnen",,
|
||||
"Resource type","Type bron",,
|
||||
"Resource types","Soorten bronnen",,
|
||||
"Resources","Hulpmiddelen",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Verkooporderregels",,
|
||||
"Sales","Verkoop",,
|
||||
"Select Projects","Selecteer projecten",,
|
||||
"Select Users","Selecteer Gebruikers",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Selecteer nieuwe lijnen",,
|
||||
"Sequence","Volgorde",,
|
||||
"Serial/batch number","Serienummer/batchnummer",,
|
||||
"Show expense lines","Uitgavenlijnen tonen",,
|
||||
"Show phases elements","Fase elementen tonen",,
|
||||
"Show production orders","Toon productieorders",,
|
||||
"Show purchase order lines","Toon bestelregels",,
|
||||
"Show sale order lines","Toon verkooporderregels",,
|
||||
"Signature",,,
|
||||
"Start","Begin",,
|
||||
"Start tasks to finish","Taken beginnen om af te ronden",,
|
||||
"Start tasks to start","Taken starten om te beginnen",,
|
||||
"Status","Status",,
|
||||
"Stop","Stoppen",,
|
||||
"Subject","Onderwerp",,
|
||||
"Supplier Invoice lines","Factuurlijnen voor leveranciers",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Synchroniseren",,
|
||||
"Take charge","Neem de leiding",,
|
||||
"Task","Taak",,
|
||||
"Task Invoicing","Facturering van taken",,
|
||||
"Task Tree","Taakboom",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Taak per lijn",,
|
||||
"Task date","Taak datum",,
|
||||
"Task deadline","Termijn van de taak",,
|
||||
"Task end","Taakeinde",,
|
||||
"Task history","Taak geschiedenis",,
|
||||
"Task template",,,
|
||||
"Task template list","Taaksjabloonlijst",,
|
||||
"Task templates",,,
|
||||
"Task updated","Taak bijgewerkt",,
|
||||
"Tasks","Taken",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Team",,
|
||||
"Team task list","Team takenlijst",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","De diepe grens van het project is te hoog",,
|
||||
"The selected project/task doesn't contain any customers","Het geselecteerde project/taak bevat geen klanten",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Bestede tijd",,
|
||||
"Timer","Timer",,
|
||||
"Timer list","Timer lijst",,
|
||||
"Title","Titel",,
|
||||
"To Date","Tot op heden",,
|
||||
"To Invoice","Naar factuur",,
|
||||
"To date","Tot op heden",,
|
||||
"Tools","Gereedschap",,
|
||||
"Total duration (Hours)","Totale duur (uren)",,
|
||||
"Total planned hours","Totaal aantal geplande uren",,
|
||||
"Tree view","Boomaanzicht",,
|
||||
"Type","Type",,
|
||||
"Type of authorized activities","Soort geautoriseerde activiteiten",,
|
||||
"Type of authorized categories","Type geautoriseerde categorieën",,
|
||||
"Unit","Eenheid",,
|
||||
"Unit price","Eenheidsprijs",,
|
||||
"Unlink selected lines","Geselecteerde lijnen ontkoppelen",,
|
||||
"Update period according to task","Update periode volgens taak",,
|
||||
"Urgent","Dringend",,
|
||||
"User","Gebruiker",,
|
||||
"User Gantt","Gebruiker Gantt",,
|
||||
"User Task","Gebruikers Taak",,
|
||||
"Users","Gebruikers",,
|
||||
"Validated Timesheet lines","Gevalideerde urenregistratielijnen",,
|
||||
"Waiting Timesheet lines","Wachten Timesheet lijnen",,
|
||||
"Wiki","Wiki",,
|
||||
"You have no active team, the planning can't be generated","Je hebt geen actief team, de planning kan niet worden gegenereerd.",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","U heeft geen projecten of taken aan u gebonden, uw planning kan niet worden gegenereerd.",,
|
||||
"You have selected no team for this project","U heeft geen team geselecteerd voor dit project",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","Uw team heeft er geen projecten of taken aan verbonden, de planning kan niet worden gegenereerd.",,
|
||||
"hours","uren",,
|
||||
"project-Resources","project-bronnen",,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","projekt %s",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label label-info'>Compute automatically if left empty</span>",,
|
||||
"Accept Order",,,
|
||||
"Actions","Działania",,
|
||||
"Add multiple lines","Dodaj wiele wierszy",,
|
||||
"Add selected lines","Dodaj wybrane linie",,
|
||||
"All phase tasks","Wszystkie zadania fazowe",,
|
||||
"All phases","Wszystkie fazy",,
|
||||
"All tasks","Wszystkie zadania",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","Projekt aplikacji",,
|
||||
"Assigned to","Przypisany do",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Zasoby książki",,
|
||||
"Budgeted time",,,
|
||||
"Business","Działalność gospodarcza",,
|
||||
"Business project","Projekt biznesowy",,
|
||||
"Cancel","Anulowanie",,
|
||||
"Canceled","Anulowany",,
|
||||
"Category","Kategoria",,
|
||||
"Characteristics","Charakterystyka",,
|
||||
"Child Projects","Projekty na rzecz dzieci",,
|
||||
"Code","Kod",,
|
||||
"Company","Firma",,
|
||||
"Configuration","Konfiguracja",,
|
||||
"Configurations","Konfiguracje",,
|
||||
"Content","Zawartość",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Stwórz projekt fakturowania",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Waluta",,
|
||||
"Customer","Klient",,
|
||||
"Customer Contact","Kontakt z klientem",,
|
||||
"Customer Invoice lines","Linie faktur klienta",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Daty",,
|
||||
"Deadline","Ostateczny termin",,
|
||||
"Deadline Today","Termin dzisiaj",,
|
||||
"Deadline Tomorrow","Nieprzekraczalny termin Jutro",,
|
||||
"Deadline Yesterday","Termin wczorajszy",,
|
||||
"Default status","Status domyślny",,
|
||||
"Delay to start (Hours)","Opóźnienie rozpoczęcia (godziny)",,
|
||||
"Description","Opis",,
|
||||
"Due Date","Termin płatności",,
|
||||
"Duration (Hours)","Czas trwania (godziny)",,
|
||||
"Duration hours","Czas trwania pomocy Godziny trwania pomocy",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Wyłącz planowanie",,
|
||||
"Expense lines","Linie wydatków",,
|
||||
"Expenses","Wydatki",,
|
||||
"Extends members from parent","Rozszerza członkostwo członków z rodzica",,
|
||||
"Financial Data","Dane finansowe",,
|
||||
"Financial Report","Sprawozdanie finansowe",,
|
||||
"Finish","Finisz",,
|
||||
"Finish tasks to finish","Zakończyć zadania do końca",,
|
||||
"Finish tasks to start","Zakończyć zadania do rozpoczęcia",,
|
||||
"Finished","Gotowe",,
|
||||
"Follow-up","Działania następcze",,
|
||||
"Followers","Zwolennicy",,
|
||||
"Frequency",,,
|
||||
"From Date","Od daty",,
|
||||
"From date","Od daty",,
|
||||
"Gantt","Gantta",,
|
||||
"Gantt with project","Gantta z projektem",,
|
||||
"Gantt with user","Gantta z użytkownikiem",,
|
||||
"Gen proj type per order line","Gen proj type na linię zamówienia",,
|
||||
"Generate quotation","Generowanie notowań",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Projekt wygenerowany",,
|
||||
"High","Wysoki",,
|
||||
"Historical","Historyczny",,
|
||||
"Image","Obrazek",,
|
||||
"Import all members","Przywóz wszystkich członków",,
|
||||
"Imputable","Przypisywalny",,
|
||||
"In Progress","W toku",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Zafakturowany",,
|
||||
"Invoices",,,
|
||||
"Invoicing","Fakturowanie",,
|
||||
"Is close","Jest blisko",,
|
||||
"Is open","Jest otwarty",,
|
||||
"Is unique task for multiple quantity","Jest to unikalne zadanie dla wielu ilości",,
|
||||
"Log Times","Czasy rejestru",,
|
||||
"Low","Niskie",,
|
||||
"Manage lines","Zarządzaj liniami",,
|
||||
"Members","Członkowie",,
|
||||
"Membres","Membrany",,
|
||||
"My projects","Moje projekty",,
|
||||
"My tasks due","Moje zadania do wykonania",,
|
||||
"My tasks to do","Moje zadania do wykonania",,
|
||||
"My today planning","Moje dzisiejsze planowanie",,
|
||||
"My upcoming planning","Moje najbliższe plany",,
|
||||
"Name","Nazwa",,
|
||||
"New","Nowy",,
|
||||
"New line","Nowa linia",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Normalny",,
|
||||
"Not invoiced","Nie zafakturowane",,
|
||||
"Not specified","Nie określono.",,
|
||||
"Notes","Uwagi",,
|
||||
"Open gantt","Otwarty przepustnica",,
|
||||
"Open phase","Faza otwarta",,
|
||||
"Open task","Otwarte zadanie",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Zarządzenie według państwa",,
|
||||
"Package",,,
|
||||
"Parent project","Projekt macierzysty",,
|
||||
"Parent task","Zadanie rodzicielskie",,
|
||||
"Person In Charge","Osoba odpowiedzialna",,
|
||||
"Phase by line","Etapy po kolei",,
|
||||
"Phase tasks","Zadania fazowe",,
|
||||
"Phases","Fazy",,
|
||||
"Plan project","Planuj projekt",,
|
||||
"Planification and costs","Planowanie i koszty",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Planowany postęp",,
|
||||
"Planning","Planowanie",,
|
||||
"Please select project","Proszę wybrać projekt",,
|
||||
"Please select user","Proszę wybrać użytkownika",,
|
||||
"Predecessors tasks","Zadania poprzedników",,
|
||||
"Product","Produkt",,
|
||||
"Production","Produkcja",,
|
||||
"Progress","Postępy",,
|
||||
"Progress (%)","Postępy (%)",,
|
||||
"Project","Projekt",,
|
||||
"Project Calendar","Kalendarz projektu",,
|
||||
"Project Category","Kategoria projektu",,
|
||||
"Project Folder","Folder projektu",,
|
||||
"Project Folders","Foldery projektów",,
|
||||
"Project Gantt","Projekt Gantta",,
|
||||
"Project Label","Etykieta projektu",,
|
||||
"Project Phase","Faza projektu",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Zadanie projektu",,
|
||||
"Project Task Tree","Drzewo zadań projektu",,
|
||||
"Project Tasks","Zadania projektu",,
|
||||
"Project Wiki","Projekt Wiki",,
|
||||
"Project alone","Sam projekt",,
|
||||
"Project phase","Faza projektu",,
|
||||
"Project phases","Etapy projektu",,
|
||||
"Project planning","Planowanie projektu",,
|
||||
"Project set","Zestaw projektów",,
|
||||
"Project template",,,
|
||||
"Project type select","Wybór typu projektu",,
|
||||
"Project/Business (Project)","Projekt/Biznes (Projekt)",,
|
||||
"Project/Phase","Projekt/faza",,
|
||||
"Projects","Projekty",,
|
||||
"Projects Folder","Folder projektów",,
|
||||
"Purchase order lines","Linie zamówień zakupu",,
|
||||
"Purchases","Zakupy",,
|
||||
"Quantity","Ilość",,
|
||||
"Related Projects","Projekty powiązane",,
|
||||
"Related tasks","Zadania powiązane",,
|
||||
"Remove lines","Usuń linie",,
|
||||
"Remove selected lines","Usuń wybrane linie",,
|
||||
"Reportings","Sprawozdania",,
|
||||
"Reports","Sprawozdania",,
|
||||
"Reset to New","Przywróćmy do nowego",,
|
||||
"Resource","Zasoby",,
|
||||
"Resource booking","Rezerwacja zasobów",,
|
||||
"Resource bookings","Rezerwacje zasobów",,
|
||||
"Resource management","Zarządzanie zasobami",,
|
||||
"Resource type","Rodzaj zasobów",,
|
||||
"Resource types","Rodzaje zasobów",,
|
||||
"Resources","Zasoby",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Linie zamówień sprzedaży",,
|
||||
"Sales","Sprzedaż",,
|
||||
"Select Projects","Wybór projektów",,
|
||||
"Select Users","Wybierz użytkowników",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Wybierz nowe linie",,
|
||||
"Sequence","Kolejność",,
|
||||
"Serial/batch number","Numer seryjny/numer partii",,
|
||||
"Show expense lines","Pokaż linie wydatków",,
|
||||
"Show phases elements","Pokaż elementy fazowe",,
|
||||
"Show production orders","Pokaż zamówienia produkcyjne",,
|
||||
"Show purchase order lines","Pokaż linie zamówień zakupu",,
|
||||
"Show sale order lines","Pokaż linie zamówień sprzedaży",,
|
||||
"Signature",,,
|
||||
"Start","Start",,
|
||||
"Start tasks to finish","Rozpocząć zadania do końca",,
|
||||
"Start tasks to start","Rozpocząć zadania do rozpoczęcia",,
|
||||
"Status","Status",,
|
||||
"Stop","Zatrzymanie",,
|
||||
"Subject","Przedmiot",,
|
||||
"Supplier Invoice lines","Linie faktur dostawcy",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Synchronizacja",,
|
||||
"Take charge","Przejmij obowiązki",,
|
||||
"Task","Zadanie",,
|
||||
"Task Invoicing","Fakturowanie zadań",,
|
||||
"Task Tree","Drzewo zadań",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Zadanie według linii",,
|
||||
"Task date","Data zadania",,
|
||||
"Task deadline","Termin realizacji zadań",,
|
||||
"Task end","Zakończenie zadania",,
|
||||
"Task history","Historia zadań",,
|
||||
"Task template",,,
|
||||
"Task template list","Lista szablonów zadań",,
|
||||
"Task templates",,,
|
||||
"Task updated","Aktualizacja zadania",,
|
||||
"Tasks","Zadania",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Zespół",,
|
||||
"Team task list","Lista zadań zespołu",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","Głęboka granica projektu jest zbyt wysoka",,
|
||||
"The selected project/task doesn't contain any customers","Wybrany projekt/zadanie nie zawiera żadnych klientów",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Czas spędzony",,
|
||||
"Timer","Timer",,
|
||||
"Timer list","Lista timerów",,
|
||||
"Title","Tytuł",,
|
||||
"To Date","Do daty",,
|
||||
"To Invoice","Do faktury",,
|
||||
"To date","Do dnia dzisiejszego",,
|
||||
"Tools","Narzędzia",,
|
||||
"Total duration (Hours)","Całkowity czas trwania (godziny)",,
|
||||
"Total planned hours","Planowane godziny ogółem",,
|
||||
"Tree view","Widok drzewa",,
|
||||
"Type","Typ",,
|
||||
"Type of authorized activities","Rodzaj dozwolonej działalności",,
|
||||
"Type of authorized categories","Typ dozwolonych kategorii",,
|
||||
"Unit","Jednostka",,
|
||||
"Unit price","Cena jednostkowa",,
|
||||
"Unlink selected lines","Połącz wybrane linie",,
|
||||
"Update period according to task","Okres aktualizacji w zależności od zadania",,
|
||||
"Urgent","Pilny",,
|
||||
"User","Użytkownik",,
|
||||
"User Gantt","Gantta użytkownika",,
|
||||
"User Task","Zadanie użytkownika",,
|
||||
"Users","Użytkownicy",,
|
||||
"Validated Timesheet lines","Zatwierdzone linie arkusza kalkulacyjnego",,
|
||||
"Waiting Timesheet lines","Oczekiwanie Linie timesheetów",,
|
||||
"Wiki","Wiki",,
|
||||
"You have no active team, the planning can't be generated","Nie masz aktywnego zespołu, nie można wygenerować planu.",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","Nie masz żadnych projektów lub zadań związanych z tobą, twoje planowanie nie może być generowane.",,
|
||||
"You have selected no team for this project","Nie wybrałeś żadnego zespołu do tego projektu",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","Twój zespół nie ma projektów ani zadań z nim związanych, planowanie nie może być generowane.",,
|
||||
"hours","godziny",,
|
||||
"project-Resources","projekty-źródła",,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","%s projeto",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label label-info'>Computado automaticamente se deixado vazio</span>",,
|
||||
"Accept Order",,,
|
||||
"Actions","Ações",,
|
||||
"Add multiple lines","Adicionar várias linhas",,
|
||||
"Add selected lines","Adicionar linhas selecionadas",,
|
||||
"All phase tasks","Todas as tarefas de fase",,
|
||||
"All phases","Todas as fases",,
|
||||
"All tasks","Todas as tarefas",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","Projeto do aplicativo",,
|
||||
"Assigned to","Atribuído a",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Recurso de livro",,
|
||||
"Budgeted time",,,
|
||||
"Business","Negócios",,
|
||||
"Business project","Projeto empresarial",,
|
||||
"Cancel","Cancelar",,
|
||||
"Canceled","Cancelado",,
|
||||
"Category","Categoria: Categoria",,
|
||||
"Characteristics","Características",,
|
||||
"Child Projects","Projetos infantis",,
|
||||
"Code","Código",,
|
||||
"Company","Empresa",,
|
||||
"Configuration","Configuração",,
|
||||
"Configurations","Configurações",,
|
||||
"Content","Conteúdo",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Criar projeto de faturamento",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Moeda",,
|
||||
"Customer","Cliente",,
|
||||
"Customer Contact","Contato com o cliente",,
|
||||
"Customer Invoice lines","Linhas de fatura do cliente",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Datas",,
|
||||
"Deadline","Prazo de entrega",,
|
||||
"Deadline Today","Prazo de entrega hoje",,
|
||||
"Deadline Tomorrow","Prazo Final Amanhã",,
|
||||
"Deadline Yesterday","Data-limite Ontem",,
|
||||
"Default status","Status padrão",,
|
||||
"Delay to start (Hours)","Atraso de partida (horas)",,
|
||||
"Description","Descrição do produto",,
|
||||
"Due Date","Data de vencimento",,
|
||||
"Duration (Hours)","Duração (Horas)",,
|
||||
"Duration hours","Duração horas",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Excluir planejamento",,
|
||||
"Expense lines","Linhas de despesas",,
|
||||
"Expenses","Despesas",,
|
||||
"Extends members from parent","Amplia o número de membros dos pais",,
|
||||
"Financial Data","Dados Financeiros",,
|
||||
"Financial Report","Relatório financeiro",,
|
||||
"Finish","Acabamento",,
|
||||
"Finish tasks to finish","Terminar tarefas para terminar",,
|
||||
"Finish tasks to start","Terminar tarefas para iniciar",,
|
||||
"Finished","Acabado",,
|
||||
"Follow-up","Acompanhamento",,
|
||||
"Followers","Seguidores",,
|
||||
"Frequency",,,
|
||||
"From Date","Data de início",,
|
||||
"From date","Data de início",,
|
||||
"Gantt","Gantt",,
|
||||
"Gantt with project","Gantt com projeto",,
|
||||
"Gantt with user","Gantt com usuário",,
|
||||
"Gen proj type per order line","Gerar tipo de projeto por linha de ordem",,
|
||||
"Generate quotation","Gerar cotação",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Projeto gerado",,
|
||||
"High","Alto",,
|
||||
"Historical","Histórico",,
|
||||
"Image","Imagem",,
|
||||
"Import all members","Importar todos os membros",,
|
||||
"Imputable","Imputáveis",,
|
||||
"In Progress","Em andamento",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Faturação",,
|
||||
"Invoices",,,
|
||||
"Invoicing","Facturação",,
|
||||
"Is close","Está perto",,
|
||||
"Is open","Está aberto",,
|
||||
"Is unique task for multiple quantity","É uma tarefa única para múltiplas quantidades",,
|
||||
"Log Times","Tempos de registo",,
|
||||
"Low","Baixo",,
|
||||
"Manage lines","Gerir linhas",,
|
||||
"Members","Membros",,
|
||||
"Membres","Membranas",,
|
||||
"My projects","Meus projetos",,
|
||||
"My tasks due","Minhas tarefas vencidas",,
|
||||
"My tasks to do","Minhas tarefas para fazer",,
|
||||
"My today planning","Meu planejamento de hoje",,
|
||||
"My upcoming planning","Meu planejamento futuro",,
|
||||
"Name","Nome e Sobrenome",,
|
||||
"New","Novo",,
|
||||
"New line","Nova linha",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Normal",,
|
||||
"Not invoiced","Não faturado",,
|
||||
"Not specified","Não especificado",,
|
||||
"Notes","Notas",,
|
||||
"Open gantt","Gantt aberto",,
|
||||
"Open phase","Fase aberta",,
|
||||
"Open task","Tarefa em aberto",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Ordem por estado",,
|
||||
"Package",,,
|
||||
"Parent project","Projeto pai",,
|
||||
"Parent task","Tarefa dos pais",,
|
||||
"Person In Charge","Pessoa Responsável",,
|
||||
"Phase by line","Fase por linha",,
|
||||
"Phase tasks","Tarefas de fase",,
|
||||
"Phases","Fases",,
|
||||
"Plan project","Planejar projeto",,
|
||||
"Planification and costs","Planificação e custos",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Progresso planejado",,
|
||||
"Planning","Planeamento",,
|
||||
"Please select project","Por favor, selecione o projeto",,
|
||||
"Please select user","Por favor, selecione o usuário",,
|
||||
"Predecessors tasks","Tarefas anteriores",,
|
||||
"Product","Produto",,
|
||||
"Production","Produção",,
|
||||
"Progress","Progresso",,
|
||||
"Progress (%)","Progresso (%)",,
|
||||
"Project","Projeto",,
|
||||
"Project Calendar","Calendário de Projetos",,
|
||||
"Project Category","Categoria do projeto",,
|
||||
"Project Folder","Pasta do projeto",,
|
||||
"Project Folders","Pastas de projetos",,
|
||||
"Project Gantt","Gantt de projetos",,
|
||||
"Project Label","Etiqueta do Projeto",,
|
||||
"Project Phase","Fase de Projecto",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Tarefa do Projeto",,
|
||||
"Project Task Tree","Árvore de tarefas do projeto",,
|
||||
"Project Tasks","Tarefas do projeto",,
|
||||
"Project Wiki","Projeto Wiki",,
|
||||
"Project alone","Projeto sozinho",,
|
||||
"Project phase","Fase de projecto",,
|
||||
"Project phases","Fases do projeto",,
|
||||
"Project planning","Planejamento de projetos",,
|
||||
"Project set","Set de projeto",,
|
||||
"Project template",,,
|
||||
"Project type select","Tipo de projeto marcar",,
|
||||
"Project/Business (Project)","Projeto/Negócio (Projeto)",,
|
||||
"Project/Phase","Projeto/Fase",,
|
||||
"Projects","Projetos",,
|
||||
"Projects Folder","Pasta de Projetos",,
|
||||
"Purchase order lines","Linhas de pedido de compra",,
|
||||
"Purchases","Compras",,
|
||||
"Quantity","Quantidade",,
|
||||
"Related Projects","Projetos Relacionados",,
|
||||
"Related tasks","Tarefas relacionadas",,
|
||||
"Remove lines","Remover linhas",,
|
||||
"Remove selected lines","Remover linhas selecionadas",,
|
||||
"Reportings","Relatórios",,
|
||||
"Reports","Relatórios",,
|
||||
"Reset to New","Redefinir para Novo",,
|
||||
"Resource","Recurso",,
|
||||
"Resource booking","Atribuição de recursos",,
|
||||
"Resource bookings","Reservas de recursos",,
|
||||
"Resource management","Gestão de recursos",,
|
||||
"Resource type","Tipo de recurso",,
|
||||
"Resource types","Tipos de recurso",,
|
||||
"Resources","Recursos",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Linhas de ordens de venda",,
|
||||
"Sales","Vendas",,
|
||||
"Select Projects","Selecionar projetos",,
|
||||
"Select Users","Selecione Usuários",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Selecionar novas linhas",,
|
||||
"Sequence","Seqüência",,
|
||||
"Serial/batch number","Número de série/de lote",,
|
||||
"Show expense lines","Mostrar linhas de despesas",,
|
||||
"Show phases elements","Mostrar elementos das fases",,
|
||||
"Show production orders","Mostrar ordens de produção",,
|
||||
"Show purchase order lines","Mostrar linhas de pedido de compra",,
|
||||
"Show sale order lines","Mostrar linhas de ordem de venda",,
|
||||
"Signature",,,
|
||||
"Start","Início",,
|
||||
"Start tasks to finish","Iniciar tarefas para terminar",,
|
||||
"Start tasks to start","Iniciar tarefas para iniciar",,
|
||||
"Status","Estado",,
|
||||
"Stop","Parar",,
|
||||
"Subject","Assunto",,
|
||||
"Supplier Invoice lines","Linhas de fatura do fornecedor",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Sincronizar",,
|
||||
"Take charge","Assumir o comando",,
|
||||
"Task","Tarefa",,
|
||||
"Task Invoicing","Tarefa Faturamento",,
|
||||
"Task Tree","Árvore de tarefas",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Tarefa por linha",,
|
||||
"Task date","Data da tarefa",,
|
||||
"Task deadline","Prazo da tarefa",,
|
||||
"Task end","Fim da tarefa",,
|
||||
"Task history","Histórico de tarefas",,
|
||||
"Task template",,,
|
||||
"Task template list","Lista de modelos de tarefas",,
|
||||
"Task templates",,,
|
||||
"Task updated","Tarefa atualizada",,
|
||||
"Tasks","Tarefas",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Equipe",,
|
||||
"Team task list","Lista de tarefas da equipe",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","O limite profundo do projeto é muito alto",,
|
||||
"The selected project/task doesn't contain any customers","O projeto/tarefa selecionado não contém nenhum cliente",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Tempo gasto",,
|
||||
"Timer","Temporizador",,
|
||||
"Timer list","Lista de Temporizadores",,
|
||||
"Title","Título",,
|
||||
"To Date","Até à data",,
|
||||
"To Invoice","Para fatura",,
|
||||
"To date","Até à data",,
|
||||
"Tools","Ferramentas",,
|
||||
"Total duration (Hours)","Duração total (horas)",,
|
||||
"Total planned hours","Total de horas teóricas",,
|
||||
"Tree view","Vista em árvore",,
|
||||
"Type","Tipo de",,
|
||||
"Type of authorized activities","Tipo de actividades autorizadas",,
|
||||
"Type of authorized categories","Tipo de categorias autorizadas",,
|
||||
"Unit","Unidade",,
|
||||
"Unit price","Preço unitário",,
|
||||
"Unlink selected lines","Desvinculação de linhas selecionadas",,
|
||||
"Update period according to task","Período de atualização de acordo com a tarefa",,
|
||||
"Urgent","Urgente",,
|
||||
"User","Usuário",,
|
||||
"User Gantt","Gantt do usuário",,
|
||||
"User Task","Tarefa do usuário",,
|
||||
"Users","Usuários",,
|
||||
"Validated Timesheet lines","Linhas da folha de tempos validadas",,
|
||||
"Waiting Timesheet lines","Linhas da folha de tempos de espera",,
|
||||
"Wiki","Wiki",,
|
||||
"You have no active team, the planning can't be generated","Você não tem nenhuma equipe ativa, o planejamento não pode ser gerado",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","Não tens projectos ou tarefas ligadas a ti, o teu planeamento não pode ser gerado.",,
|
||||
"You have selected no team for this project","Você não selecionou nenhuma equipe para este projeto",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","A sua equipa não tem projectos ou tarefas ligadas a ela, o planeamento não pode ser gerado.",,
|
||||
"hours","horas",,
|
||||
"project-Resources","projeto-Recursos",,
|
||||
|
@ -0,0 +1,268 @@
|
||||
"key","message","comment","context"
|
||||
"%s project","проект %s",,
|
||||
"0 %",,,
|
||||
"10 %",,,
|
||||
"100 %",,,
|
||||
"20 %",,,
|
||||
"30 %",,,
|
||||
"40 %",,,
|
||||
"50 %",,,
|
||||
"60 %",,,
|
||||
"70 %",,,
|
||||
"80 %",,,
|
||||
"90 %",,,
|
||||
"<span class='label label-info'>Computed automatically if left empty</span>","<span class='label-info'>Считается автоматически, если оставить пустым</span>.",,
|
||||
"Accept Order",,,
|
||||
"Actions","Действия",,
|
||||
"Add multiple lines","Добавить несколько строк",,
|
||||
"Add selected lines","Добавить выбранные строки",,
|
||||
"All phase tasks","Все фазовые задачи",,
|
||||
"All phases","Все фазы",,
|
||||
"All tasks","Все задачи",,
|
||||
"Analytic",,,
|
||||
"Announcement",,,
|
||||
"App project","Проект приложений",,
|
||||
"Assigned to","Назначенный",,
|
||||
"Assigning to the customer",,,
|
||||
"Assigning to the provider",,,
|
||||
"Book resource","Бронировочный ресурс",,
|
||||
"Budgeted time",,,
|
||||
"Business","Бизнес",,
|
||||
"Business project","Бизнес-проект",,
|
||||
"Cancel","Отмена",,
|
||||
"Canceled","Отмена",,
|
||||
"Category","Категория",,
|
||||
"Characteristics","Характеристики",,
|
||||
"Child Projects","Детские проекты",,
|
||||
"Code","Код",,
|
||||
"Company","Компания",,
|
||||
"Configuration","Конфигурация",,
|
||||
"Configurations","Конфигурации",,
|
||||
"Content","Содержание",,
|
||||
"Contracts",,,
|
||||
"Create business project from this template",,,
|
||||
"Create invoicing project","Создать проект выставления счетов",,
|
||||
"Create new customer contract",,,
|
||||
"Create new supplier contract",,,
|
||||
"Create project from this template",,,
|
||||
"Currency","Валюта",,
|
||||
"Customer","Клиент",,
|
||||
"Customer Contact","Контакт с клиентом",,
|
||||
"Customer Invoice lines","Счета-фактуры клиентов",,
|
||||
"Customer contracts",,,
|
||||
"Dates","Даты",,
|
||||
"Deadline","Крайний срок",,
|
||||
"Deadline Today","Крайний срок Сегодня",,
|
||||
"Deadline Tomorrow","Крайний срок - завтра.",,
|
||||
"Deadline Yesterday","Крайний срок Вчерашний день",,
|
||||
"Default status","Статус по умолчанию",,
|
||||
"Delay to start (Hours)","Задержка начала работы (в часах)",,
|
||||
"Description","Описание",,
|
||||
"Due Date","Срок выполнения",,
|
||||
"Duration (Hours)","Продолжительность (часы)",,
|
||||
"Duration hours","Продолжительность часов",,
|
||||
"Enable task signature",,,
|
||||
"Enter Time spent",,,
|
||||
"Exclude planning","Исключить планирование",,
|
||||
"Expense lines","Статьи расходов",,
|
||||
"Expenses","Расходы",,
|
||||
"Extends members from parent","Расширяет членство от родителей",,
|
||||
"Financial Data","Финансовые данные",,
|
||||
"Financial Report","Финансовый отчет",,
|
||||
"Finish","Готово",,
|
||||
"Finish tasks to finish","Закончить задания, чтобы закончить",,
|
||||
"Finish tasks to start","Завершение заданий для начала работы",,
|
||||
"Finished","Готово",,
|
||||
"Follow-up","Последующая деятельность",,
|
||||
"Followers","Подписчики",,
|
||||
"Frequency",,,
|
||||
"From Date","С даты",,
|
||||
"From date","С даты",,
|
||||
"Gantt","Гант",,
|
||||
"Gantt with project","Гантт с проектом",,
|
||||
"Gantt with user","Гантт с пользователем",,
|
||||
"Gen proj type per order line","Gen тип проекта в каждой строке заказа",,
|
||||
"Generate quotation","Сгенерировать котировку",,
|
||||
"Generate sequence for project",,,
|
||||
"Generated project","Генерируемый проект",,
|
||||
"High","Высоко",,
|
||||
"Historical","Исторический",,
|
||||
"Image","Изображение",,
|
||||
"Import all members","Импортировать всех участников",,
|
||||
"Imputable","Импортируемый",,
|
||||
"In Progress","В процессе",,
|
||||
"Internal Description",,,
|
||||
"Invoiced","Счета",,
|
||||
"Invoices",,,
|
||||
"Invoicing","выставление счетов",,
|
||||
"Is close","близко",,
|
||||
"Is open","Открыто",,
|
||||
"Is unique task for multiple quantity","Уникальная задача для многократного количества",,
|
||||
"Log Times","Время регистрации",,
|
||||
"Low","Низкий",,
|
||||
"Manage lines","Управление линиями",,
|
||||
"Members","Члены",,
|
||||
"Membres","Мембры",,
|
||||
"My projects","Мои проекты",,
|
||||
"My tasks due","Мои задачи",,
|
||||
"My tasks to do","Мои задачи",,
|
||||
"My today planning","Мое сегодняшнее планирование",,
|
||||
"My upcoming planning","Мое предстоящее планирование",,
|
||||
"Name","Имя",,
|
||||
"New","Новый",,
|
||||
"New line","Новая линия",,
|
||||
"New task",,,
|
||||
"New ticket",,,
|
||||
"Normal","Нормальный",,
|
||||
"Not invoiced","Не выставлен счет",,
|
||||
"Not specified","Не указано",,
|
||||
"Notes","Примечания",,
|
||||
"Open gantt","Открытый бандит",,
|
||||
"Open phase","Открытая фаза",,
|
||||
"Open task","Открытое задание",,
|
||||
"Order Accepted",,,
|
||||
"Order Proposed",,,
|
||||
"Order by state","Государственный заказ",,
|
||||
"Package",,,
|
||||
"Parent project","Родительский проект",,
|
||||
"Parent task","Родительская задача",,
|
||||
"Person In Charge","Ответственное лицо",,
|
||||
"Phase by line","Постепенно",,
|
||||
"Phase tasks","поэтапные задачи",,
|
||||
"Phases","этапы",,
|
||||
"Plan project","План проекта",,
|
||||
"Planification and costs","Планирование и затраты",,
|
||||
"Planned Time Planning",,,
|
||||
"Planned progress","Запланированный прогресс",,
|
||||
"Planning","Планирование",,
|
||||
"Please select project","Пожалуйста, выберите проект",,
|
||||
"Please select user","Пожалуйста, выберите пользователя",,
|
||||
"Predecessors tasks","Задачи предшественников",,
|
||||
"Product","Продукт",,
|
||||
"Production","Производство",,
|
||||
"Progress","Прогресс",,
|
||||
"Progress (%)","Прогресс (%)",,
|
||||
"Project","Проект",,
|
||||
"Project Calendar","Календарь проектов",,
|
||||
"Project Category","Категория проекта",,
|
||||
"Project Folder","Папка проекта",,
|
||||
"Project Folders","Папки проектов",,
|
||||
"Project Gantt","Проект Гант",,
|
||||
"Project Label","Маркировка проекта",,
|
||||
"Project Phase","Этап проекта",,
|
||||
"Project Planning Time Spent",,,
|
||||
"Project Task","Задача проекта",,
|
||||
"Project Task Tree","Дерево задач проекта",,
|
||||
"Project Tasks","Задачи проекта",,
|
||||
"Project Wiki","Проект Вики",,
|
||||
"Project alone","Один проект",,
|
||||
"Project phase","этап проекта",,
|
||||
"Project phases","Этапы проекта",,
|
||||
"Project planning","Проектирование",,
|
||||
"Project set","Набор проектов",,
|
||||
"Project template",,,
|
||||
"Project type select","Выбор типа проекта",,
|
||||
"Project/Business (Project)","Проект/Бизнес (проект)",,
|
||||
"Project/Phase","Проект/Фазовый этап",,
|
||||
"Projects","Проекты",,
|
||||
"Projects Folder","Папка проектов",,
|
||||
"Purchase order lines","Линии заказов на поставку",,
|
||||
"Purchases","Покупки",,
|
||||
"Quantity","Количество",,
|
||||
"Related Projects","Похожие проекты",,
|
||||
"Related tasks","Связанные задачи",,
|
||||
"Remove lines","Снимите линии",,
|
||||
"Remove selected lines","Удалить выделенные линии",,
|
||||
"Reportings","Отчеты",,
|
||||
"Reports","Отчеты",,
|
||||
"Reset to New","Сброс на новый",,
|
||||
"Resource","Ресурс",,
|
||||
"Resource booking","Бронирование ресурсов",,
|
||||
"Resource bookings","Бронирование ресурсов",,
|
||||
"Resource management","Управление ресурсами",,
|
||||
"Resource type","Тип ресурса",,
|
||||
"Resource types","Типы ресурсов",,
|
||||
"Resources","Ресурсы",,
|
||||
"Roadmap",,,
|
||||
"Sale order lines","Линии заказов на продажу",,
|
||||
"Sales","Продажи",,
|
||||
"Select Projects","Выбрать проекты",,
|
||||
"Select Users","Выберите пользователей",,
|
||||
"Select lines to remove",,,
|
||||
"Select new lines","Выберите новые строки",,
|
||||
"Sequence","Последовательность",,
|
||||
"Serial/batch number","Серийный номер/номер партии",,
|
||||
"Show expense lines","Показать статьи расходов",,
|
||||
"Show phases elements","Показать элементы фаз",,
|
||||
"Show production orders","Показать производственные заказы",,
|
||||
"Show purchase order lines","Показать линии заказов на поставку",,
|
||||
"Show sale order lines","Показать линии заказов на продажу",,
|
||||
"Signature",,,
|
||||
"Start","Начать",,
|
||||
"Start tasks to finish","Запуск заданий для завершения",,
|
||||
"Start tasks to start","Запуск заданий для запуска",,
|
||||
"Status","Статус",,
|
||||
"Stop","Остановись",,
|
||||
"Subject","Предмет",,
|
||||
"Supplier Invoice lines","Поставщик Линии счетов-фактур",,
|
||||
"Supplier contracts",,,
|
||||
"Synchronize","Синхронизировать",,
|
||||
"Take charge","Возьмите на себя ответственность",,
|
||||
"Task","Задача",,
|
||||
"Task Invoicing","Оформление счетов-фактур",,
|
||||
"Task Tree","Дерево задач",,
|
||||
"Task assigned to",,,
|
||||
"Task assigned to the client",,,
|
||||
"Task assigned to the provider",,,
|
||||
"Task by line","Построчно",,
|
||||
"Task date","Дата задания",,
|
||||
"Task deadline","Срок выполнения задачи",,
|
||||
"Task end","Конец задачи",,
|
||||
"Task history","История задач",,
|
||||
"Task template",,,
|
||||
"Task template list","Список шаблонов",,
|
||||
"Task templates",,,
|
||||
"Task updated","Обновленная задача",,
|
||||
"Tasks","Задачи",,
|
||||
"Tasks to finish before finish",,,
|
||||
"Tasks to start before start",,,
|
||||
"Team","Команда",,
|
||||
"Team task list","Список задач группы",,
|
||||
"Template",,,
|
||||
"The company %s doesn't have any configured sequence for Project",,,
|
||||
"The deep limit of the project is too high","Глубокий предел проекта слишком велик.",,
|
||||
"The selected project/task doesn't contain any customers","Выбранный проект/задача не содержит клиентов.",,
|
||||
"Ticket",,,
|
||||
"Tickets",,,
|
||||
"Time Spent","Время, потраченное",,
|
||||
"Timer","Таймер",,
|
||||
"Timer list","Список таймеров",,
|
||||
"Title","Название",,
|
||||
"To Date","На свидание",,
|
||||
"To Invoice","К счету-фактуре",,
|
||||
"To date","На сегодняшний день",,
|
||||
"Tools","Инструменты",,
|
||||
"Total duration (Hours)","Общая продолжительность (в часах)",,
|
||||
"Total planned hours","Общее количество запланированных часов",,
|
||||
"Tree view","Вид на дерево",,
|
||||
"Type","Тип",,
|
||||
"Type of authorized activities","Вид разрешенной деятельности",,
|
||||
"Type of authorized categories","Тип разрешенных категорий",,
|
||||
"Unit","Подразделение",,
|
||||
"Unit price","Цена единицы",,
|
||||
"Unlink selected lines","Разорвать выделенные линии",,
|
||||
"Update period according to task","Обновить период обновления в соответствии с задачей",,
|
||||
"Urgent","Срочно",,
|
||||
"User","Пользователь",,
|
||||
"User Gantt","Пользователь Гант",,
|
||||
"User Task","Задача пользователя",,
|
||||
"Users","Пользователи",,
|
||||
"Validated Timesheet lines","Проверенные строки табеля учета рабочего времени",,
|
||||
"Waiting Timesheet lines","Строки табеля ожидания",,
|
||||
"Wiki","Вики",,
|
||||
"You have no active team, the planning can't be generated","У вас нет активной команды, планирование не может быть сформировано.",,
|
||||
"You have no projects or tasks bound to you, your planning can't be generated.","У вас нет привязанных к вам проектов или задач, ваше планирование не может быть сгенерировано.",,
|
||||
"You have selected no team for this project","Вы не выбрали ни одну команду для этого проекта.",,
|
||||
"Your team has no projects or tasks bound to it, the planning can't be generated.","У вашей команды нет проектов или задач, связанных с этим, планирование не может быть сформировано.",,
|
||||
"hours","часы",,
|
||||
"project-Resources","проект-ресурсы",,
|
||||
|
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/data-import http://axelor.com/xml/ns/data-import/data-import_5.2.xsd">
|
||||
|
||||
<input file="project_role.csv" separator=";" type="com.axelor.auth.db.Role" search="self.name = :name"/>
|
||||
|
||||
<input file="project_permission.csv" separator=";" type="com.axelor.auth.db.Permission" search="self.name = :name" call="com.axelor.csv.script.ImportPermission:importPermissionToRole">
|
||||
<bind to="canRead" eval="can_read == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canWrite" eval="can_write == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canCreate" eval="can_create == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canRemove" eval="can_remove == 'x' ? 'true' : 'false'"/>
|
||||
<bind to="canExport" eval="can_export == 'x' ? 'true' : 'false'"/>
|
||||
</input>
|
||||
|
||||
<input file="project_metaMenu.csv" separator=";" type="com.axelor.meta.db.MetaMenu" search="self.name = :name" update="true">
|
||||
<bind column="roles" to="roles" search="self.name in :roles" eval="roles.split('\\|') as List"/>
|
||||
</input>
|
||||
|
||||
</csv-inputs>
|
||||
@ -0,0 +1,15 @@
|
||||
"name";"roles"
|
||||
"menu-project-root";"Project Manager|Project User|Project Read"
|
||||
"project-folder";"Project Manager|Project User|Project Read"
|
||||
"project-all";"Project Manager|Project User|Project Read"
|
||||
"project-phases";"Project Manager|Project User|Project Read"
|
||||
"project-tasks";"Project Manager|Project User|Project Read"
|
||||
"project-open-tasks";"Project Manager|Project User|Project Read"
|
||||
"project-task-history";"Project Manager|Project User|Project Read"
|
||||
"project-wiki";"Project Manager|Project User|Project Read"
|
||||
"project-dasbhoard";"Project Manager|Project User|Project Read"
|
||||
"project-resource";"Project Manager|Project User|Project Read"
|
||||
"project-resource-booking";"Project Manager|Project User|Project Read"
|
||||
"project-configurations";"Project Manager"
|
||||
"project-category";"Project Manager"
|
||||
"project-resource-type";"Project Manager"
|
||||
|
@ -0,0 +1,31 @@
|
||||
"name";"object";"can_read";"can_write";"can_create";"can_remove";"can_export";"condition";"conditionParams";"roleName"
|
||||
"perm.project.Project.r";"com.axelor.apps.project.db.Project";"x";;;;;"self.company.id in (?)";"__user__.companySet.id.plus(0)";"Project Read"
|
||||
"perm.project.ProjectPlanning.r";"com.axelor.apps.project.db.ProjectPlanning";"x";;;;;;;"Project Read"
|
||||
"perm.project.TeamTaskCategory.r";"com.axelor.apps.project.db.TeamTaskCategory";"x";;;;;;;"Project Read"
|
||||
"perm.project.ResourceType.r";"com.axelor.apps.project.db.ResourceType";"x";;;;;;;"Project Read"
|
||||
"perm.project.ProjectFolder.r";"com.axelor.apps.project.db.ProjectFolder";"x";;;;;;;"Project Read"
|
||||
"perm.project.ResourceBooking.r";"com.axelor.apps.project.db.ResourceBooking";"x";;;;;;;"Project Read"
|
||||
"perm.project.Wiki.r";"com.axelor.apps.project.db.Wiki";"x";;;;;;;"Project Read"
|
||||
"perm.project.ProjectStatus.r";"com.axelor.apps.project.db.ProjectStatus";"x";;;;;;;"Project Read"
|
||||
"perm.project.Resource.r";"com.axelor.apps.project.db.Resource";"x";;;;;;;"Project Read"
|
||||
"perm.project.ProjectPlanningTime.r";"com.axelor.apps.project.db.ProjectPlanningTime";"x";;;;;;;"Project Read"
|
||||
"perm.project.Project.rwc";"com.axelor.apps.project.db.Project";"x";"x";"x";;;"self.company.id in (?)";"__user__.companySet.id.plus(0)";"Project User"
|
||||
"perm.project.ProjectPlanning.rwc";"com.axelor.apps.project.db.ProjectPlanning";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.TeamTaskCategory.rwc";"com.axelor.apps.project.db.TeamTaskCategory";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.ResourceType.rwc";"com.axelor.apps.project.db.ResourceType";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.ProjectFolder.rwc";"com.axelor.apps.project.db.ProjectFolder";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.ResourceBooking.rwc";"com.axelor.apps.project.db.ResourceBooking";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.Wiki.rwc";"com.axelor.apps.project.db.Wiki";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.ProjectStatus.rwc";"com.axelor.apps.project.db.ProjectStatus";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.Resource.rwc";"com.axelor.apps.project.db.Resource";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.ProjectPlanningTime.rwc";"com.axelor.apps.project.db.ProjectPlanningTime";"x";"x";"x";;;;;"Project User"
|
||||
"perm.project.Project.rwcde";"com.axelor.apps.project.db.Project";"x";"x";"x";"x";"x";"self.company.id in (?)";"__user__.companySet.id.plus(0)";"Project Manager"
|
||||
"perm.project.ProjectPlanning.rwcde";"com.axelor.apps.project.db.ProjectPlanning";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.TeamTaskCategory.rwcde";"com.axelor.apps.project.db.TeamTaskCategory";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.ResourceType.rwcde";"com.axelor.apps.project.db.ResourceType";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.ProjectFolder.rwcde";"com.axelor.apps.project.db.ProjectFolder";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.ResourceBooking.rwcde";"com.axelor.apps.project.db.ResourceBooking";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.Wiki.rwcde";"com.axelor.apps.project.db.Wiki";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.ProjectStatus.rwcde";"com.axelor.apps.project.db.ProjectStatus";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.Resource.rwcde";"com.axelor.apps.project.db.Resource";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
"perm.project.ProjectPlanningTime.rwcde";"com.axelor.apps.project.db.ProjectPlanningTime";"x";"x";"x";"x";"x";;;"Project Manager"
|
||||
|
@ -0,0 +1,4 @@
|
||||
"name";"description"
|
||||
"Project Read";
|
||||
"Project User";
|
||||
"Project Manager";
|
||||
|
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<form name="app-project-config-form" title="App project" model="com.axelor.apps.base.db.AppProject" canDelete="false" canNew="false" width="large">
|
||||
<panel name="mainPanel">
|
||||
<field name="projectLabel"/>
|
||||
<field name="resourceManagement" widget="boolean-switch" />
|
||||
<field name="isEnableSignature" widget="boolean-switch" />
|
||||
<field name="generateProjectSequence" widget="boolean-switch"/>
|
||||
</panel>
|
||||
|
||||
<panel-mail name="mailPanel">
|
||||
<mail-messages limit="4"/>
|
||||
<mail-followers/>
|
||||
</panel-mail>
|
||||
</form>
|
||||
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<chart name="chart.daily.planned.charge.in.month.per.project" title="Daily planned charge in a month per project">
|
||||
<dataset type="jpql">
|
||||
<![CDATA[
|
||||
select sum(e.hourlyRate*t.plannedHours) as charge, p.name as project
|
||||
FROM Project p
|
||||
INNER JOIN ProjectPlanningTime t ON t.project = p.id
|
||||
INNER JOIN User u ON t.user = u.id
|
||||
INNER JOIN Employee e ON u.employee = e.id
|
||||
WHERE MONTH(t.date) = MONTH(CURRENT_DATE)
|
||||
GROUP BY p.id
|
||||
]]>
|
||||
</dataset>
|
||||
<category key="project" title="Project"/>
|
||||
<series key="charge" type="bar" title="Planned charge"/>
|
||||
</chart>
|
||||
|
||||
<chart name="chart.daily.planned.charge.in.month.per.employee" title="Daily planned charge in a month per employee">
|
||||
<dataset type="jpql">
|
||||
<![CDATA[
|
||||
select sum(e.hourlyRate*t.plannedHours) as charge, p.name as project , e.name as employee
|
||||
FROM Project p
|
||||
INNER JOIN ProjectPlanningTime t ON t.project = p.id
|
||||
INNER JOIN User u ON t.user = u.id
|
||||
INNER JOIN Employee e ON u.employee = e.id
|
||||
WHERE MONTH(t.date) = MONTH(CURRENT_DATE)
|
||||
GROUP BY p.id,e.id
|
||||
]]>
|
||||
</dataset>
|
||||
<category key="employee" title="Employee"/>
|
||||
<series key="charge" type="bar" title="Planned charge"/>
|
||||
</chart>
|
||||
|
||||
<chart name="chart.average.daily.planned.charge.in.month.per.employee" title="Daily planned charge in a month in an average per employee">
|
||||
<dataset type="jpql">
|
||||
<![CDATA[
|
||||
select avg(e.hourlyRate*t.plannedHours) as charge , e.name as employee
|
||||
FROM Project p
|
||||
INNER JOIN ProjectPlanningTime t ON t.project = p.id
|
||||
INNER JOIN User u ON t.user = u.id
|
||||
INNER JOIN Employee e ON u.employee = e.id
|
||||
WHERE MONTH(t.date) = MONTH(CURRENT_DATE)
|
||||
GROUP BY e.id
|
||||
]]>
|
||||
</dataset>
|
||||
<category key="employee" title="Employee"/>
|
||||
<series key="charge" type="bar" title="Planned charge"/>
|
||||
</chart>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<dashboard name="project-my-projects" title="My projects">
|
||||
<dashlet action="action-project-db-my-tasks-to-do"/>
|
||||
<dashlet action="action-project-db-my-tasks-due"/>
|
||||
<dashlet action="action-project-db-my-today-planning"/>
|
||||
<dashlet action="action-project-db-my-upcomming-planning"/>
|
||||
</dashboard>
|
||||
|
||||
<dashboard name="project-planned-charge" title="Planned charge">
|
||||
<dashlet action="chart:chart.daily.planned.charge.in.month.per.project" colSpan="12"/>
|
||||
<dashlet action="chart:chart.daily.planned.charge.in.month.per.employee" colSpan="12"/>
|
||||
<dashlet action="chart:chart.average.daily.planned.charge.in.month.per.employee" colSpan="12"/>
|
||||
</dashboard>
|
||||
|
||||
<action-view name="action-project-db-my-tasks-to-do" title="My tasks to do" model="com.axelor.team.db.TeamTask">
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain><![CDATA[
|
||||
(self.assignedTo = :__user__ AND self.status NOT IN :closed_status) AND
|
||||
(self.taskDeadline <= current_date OR self.taskDate <= current_date)
|
||||
]]></domain>
|
||||
<context name="closed_status" expr="#{['closed', 'canceled']}"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-db-my-tasks-due" title="My tasks due" model="com.axelor.team.db.TeamTask">
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain><![CDATA[
|
||||
(self.assignedTo = :__user__ AND self.status NOT IN :closed_status) AND
|
||||
(self.taskDeadline <= current_date)
|
||||
]]></domain>
|
||||
<context name="closed_status" expr="#{['closed', 'canceled']}"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-db-my-today-planning" title="My today planning" model="com.axelor.apps.project.db.ProjectPlanningTime">
|
||||
<view type="grid" name="project-planning-db-grid" />
|
||||
<view type="form" name="project-planning-time-form" />
|
||||
<domain>self.date = :__datetime__ AND self.user = :__user__</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-db-my-upcomming-planning" title="My upcoming planning" model="com.axelor.apps.project.db.ProjectPlanningTime">
|
||||
<view type="grid" name="project-planning-db-grid" />
|
||||
<view type="form" name="project-planning-time-form" />
|
||||
<domain>self.date > :__datetime__ AND self.user = :__user__</domain>
|
||||
</action-view>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<menuitem name="menu-project-root" order="-103" title="Projects" icon="fa-tasks" if="__config__.app.isApp('project')"
|
||||
icon-background="#3f6bb9"/>
|
||||
|
||||
<menuitem name="project-folder" parent="menu-project-root" title="Project Folder" action="project.folder" order="5"/>
|
||||
<action-view name="project.folder" title="Project Folder" model="com.axelor.apps.project.db.ProjectFolder">
|
||||
<view type="grid" name="project-folder-grid"/>
|
||||
<view type="form" name="project-folder-form"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-all" parent="menu-project-root" order="10"
|
||||
title="Projects"
|
||||
action="project.all"/>
|
||||
<action-view name="project.all" title="Projects" model="com.axelor.apps.project.db.Project">
|
||||
<view type="grid" name="project-grid"/>
|
||||
<view type="form" name="project-form"/>
|
||||
<view type="kanban" name="project-kanban"/>
|
||||
<domain>self.isProject = true and (self.projectTypeSelect = :_xProjectTypeSelect or self.projectTypeSelect = 0 or self.projectTypeSelect = null)</domain>
|
||||
<context name="_fromProject" expr="eval:true"/>
|
||||
<context name="_xProjectTypeSelect" expr="eval: __repo__(Project).TYPE_PROJECT"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-phases" parent="menu-project-root" title="Project phases" action="all.phases" order="15"/>
|
||||
<action-view name="all.phases" title="Project phases" model="com.axelor.apps.project.db.Project">
|
||||
<view type="grid" name="project-grid"/>
|
||||
<view type="form" name="project-form"/>
|
||||
<view type="kanban" name="project-kanban"/>
|
||||
<domain>self.isProject = true and self.projectTypeSelect = :_xProjectTypeSelect</domain>
|
||||
<context name="_fromProject" expr="eval:true"/>
|
||||
<context name="_xProjectTypeSelect" expr="eval: __repo__(Project).TYPE_PHASE"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-open-tasks" parent="menu-project-root" title="Tasks" order="20" action="all.open.project.tasks"/>
|
||||
<action-view name="all.open.project.tasks" title="Project Tasks" model="com.axelor.team.db.TeamTask">
|
||||
<view type="kanban" name="team-task-kanban"/>
|
||||
<view type="grid" name="team-task-grid"/>
|
||||
<view type="form" name="team-task-form"/>
|
||||
<domain>self.project.statusSelect IN (1,2) and self.typeSelect = 'task'</domain>
|
||||
<context name="_typeSelect" expr="eval: com.axelor.team.db.repo.TeamTaskRepository.TYPE_TASK"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-open-tickets" parent="menu-project-root" title="Tickets" order="21" action="all.open.project.tickets" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
<action-view name="all.open.project.tickets" title="Ticket" model="com.axelor.team.db.TeamTask">
|
||||
<view type="kanban" name="team-task-kanban"/>
|
||||
<view type="grid" name="team-task-grid"/>
|
||||
<view type="form" name="team-task-form"/>
|
||||
<view-param name="forceTitle" value="true"/>
|
||||
<domain>self.project.statusSelect IN (1,2) and self.typeSelect = 'ticket'</domain>
|
||||
<context name="_typeSelect" expr="eval: com.axelor.team.db.repo.TeamTaskRepository.TYPE_TICKET"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-wiki" parent="menu-project-root" title="Wiki" action="all.wiki" order="30"/>
|
||||
<action-view name="all.wiki" title="Project Wiki" model="com.axelor.apps.project.db.Wiki">
|
||||
<view type="grid" name="wiki-grid"/>
|
||||
<view type="form" name="wiki-form"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-template" parent="menu-project-root" order="38" title="Template"/>
|
||||
|
||||
<menuitem name="project-task-template" parent="project-template" title="Task template" action="project.task.template"/>
|
||||
<action-view name="project.task.template" title="Task template" model="com.axelor.apps.project.db.TaskTemplate">
|
||||
<view type="grid" name="task-template-grid"/>
|
||||
<view type="form" name="task-template-form"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-project-template" parent="project-template" title="Project template" action="project.project.template"/>
|
||||
<action-view name="project.project.template" title="Project template" model="com.axelor.apps.project.db.ProjectTemplate">
|
||||
<view type="grid" name="project-template-grid"/>
|
||||
<view type="form" name="project-template-form"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem title="Historical" name="project-historical" parent="menu-project-root" order="39" icon="fa-clock-o"/>
|
||||
|
||||
<menuitem name="project-task-history" parent="project-historical" title="Task history" action="all.tasks.history"/>
|
||||
<action-view name="all.tasks.history" title="Task history" model="com.axelor.team.db.TeamTask">
|
||||
<view type="grid" name="team-task-grid"/>
|
||||
<view type="form" name="team-task-form"/>
|
||||
<domain>self.status = 'closed' or self.status = 'canceled'</domain>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-reporting" parent="menu-project-root" order="40" title="Reportings" icon="fa-bar-chart"/>
|
||||
|
||||
<menuitem name="project-reporting-my-projects" parent="project-reporting" order="31" title="My projects" action="project.my.projects"/>
|
||||
<action-view name="project.my.projects" title="My projects">
|
||||
<view type="dashboard" name="project-my-projects"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-reporting-planned-charge" parent="project-reporting" order="32" title="Planned charge" action="project.planned.charge"/>
|
||||
<action-view name="project.planned.charge" title="Planned charge">
|
||||
<view type="dashboard" name="project-planned-charge"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-resource-booking" title="Resource bookings" order="35" parent="menu-project-root" action="project.resource.booking" if="__config__.app.getApp('project').getResourceManagement()" />
|
||||
<action-view name="project.resource.booking" title="Resource bookings" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<view type="grid" name="resource-booking-grid" />
|
||||
<view type="form" name="resource-booking-form" />
|
||||
<view type="calendar" name="resource-booking-calendar" />
|
||||
</action-view>
|
||||
|
||||
<!-- PROJECT CONFIGURATION -->
|
||||
<menuitem name="project-configurations" parent="menu-project-root" title="Configuration" order="41" icon="fa-cog"/>
|
||||
|
||||
<menuitem name="team-task-category" parent="project-configurations" title="Category" action="team.task.category"/>
|
||||
<action-view name="team.task.category" title="Team Task Category" model="com.axelor.apps.project.db.TeamTaskCategory">
|
||||
<view type="grid" name="team-task-category-grid"/>
|
||||
<view type="form" name="team-task-category-form"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-resource-type" parent="project-configurations" title="Resource types" action="project.resource.types" if="__config__.app.getApp('project').getResourceManagement()" />
|
||||
<action-view name="project.resource.types" title="Resource types" model="com.axelor.apps.project.db.ResourceType">
|
||||
<view type="grid" name="resource-type-grid"/>
|
||||
<view type="form" name="resource-type-form"/>
|
||||
</action-view>
|
||||
|
||||
<menuitem name="project-resource" title="project-Resources" order="32" parent="project-configurations" action="project.resource" if="__config__.app.getApp('project').getResourceManagement()" />
|
||||
<action-view name="project.resource" title="Resources" model="com.axelor.apps.project.db.Resource">
|
||||
<view type="grid" name="resource-grid" />
|
||||
<view type="form" name="resource-form" />
|
||||
</action-view>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<action-method name="action-partner-method-generate-project">
|
||||
<call class="com.axelor.apps.project.web.PartnerController" method="generateProject"/>
|
||||
</action-method>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,837 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<grid name="project-grid" title="Projects" model="com.axelor.apps.project.db.Project">
|
||||
<toolbar>
|
||||
<button name="projectPlanningBtn" title="Project planning" onClick="action-project-view-project-planning-wizard" if="__config__.app.isApp('employee')" if-module="axelor-human-resource"/>
|
||||
</toolbar>
|
||||
<menubar>
|
||||
<menu name="projectToolsMenu" title="Tools" icon="fa-wrench" showTitle="true">
|
||||
<item name="ganttWithUserItem" title="Gantt with user" action="action-project-open-popup-select-users"/>
|
||||
<item name="ganttWithProjectItem" title="Gantt with project" action="action-project-open-popup-select-projects"/>
|
||||
</menu>
|
||||
</menubar>
|
||||
<hilite background="primary" if="isProject && projectTypeSelect == 1"/>
|
||||
<hilite background="info" if="isProject && projectTypeSelect == 2"/>
|
||||
<field name="code"/>
|
||||
<field name="name"/>
|
||||
<field name="parentProject"/>
|
||||
<field name="clientPartner"/>
|
||||
<field name="assignedTo"/>
|
||||
<field name="fromDate" />
|
||||
<field name="toDate" />
|
||||
<field name="dueDate" />
|
||||
<field name="imputable" width="90"/>
|
||||
<button name="openGanttBtn" title="Gantt" icon="fa-tasks" onClick="action-project-open-gantt"/>
|
||||
<field name="isProject" hidden="true"/>
|
||||
<field name="projectTypeSelect" hidden="true"/>
|
||||
</grid>
|
||||
|
||||
<grid name="folder-project-grid" title="Projects" model="com.axelor.apps.project.db.Project">
|
||||
<field name="fullName"/>
|
||||
<field name="company" if="__config__.app.getApp('base').getEnableMultiCompany()"/>
|
||||
<field name="clientPartner"/>
|
||||
</grid>
|
||||
|
||||
<form name="project-form" title="Project"
|
||||
model="com.axelor.apps.project.db.Project" onLoad="action-project-on-load-group"
|
||||
onNew="action-project-group-on-new-project">
|
||||
<menubar>
|
||||
<menu name="projectReportsMenu" title="Reports" showTitle="true" icon="fa-files-o">
|
||||
<item if-module="axelor-business-project" name="planificationAndCostsItem" title="Planification and costs"
|
||||
action="save,action-project-method-print-planif-and-cost" />
|
||||
<item if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
name="financialReportItem" title="Financial Report" showIf="isBusinessProject"
|
||||
action="save,action-project-method-print-project" />
|
||||
</menu>
|
||||
<menu name="projectToolsMenu" title="Tools" showTitle="true" icon="fa-wrench">
|
||||
<item name="ganttItem" title="Gantt" showIf="isProject" action="action-project-open-gantt" />
|
||||
<item name="bookResourceItem" title="Book resource" showIf="isProject" if=" __config__.app.getApp('project')?.resourceManagement"
|
||||
action="save,action-project-book-resource" />
|
||||
</menu>
|
||||
</menubar>
|
||||
<panel name="mainPanel">
|
||||
<panel name="detailsPanel" colSpan="12">
|
||||
<field name="statusSelect" showTitle="false" readonly="true"
|
||||
colSpan="8" widget="NavSelect" />
|
||||
<field name="$viewerProjectTags" showTitle="false" colSpan="4"
|
||||
readonly="true">
|
||||
<viewer
|
||||
depends="isBusinessProject,isProject,projectTypeSelect,$toInvoiceCounter,id">
|
||||
<![CDATA[
|
||||
<h4 style="text-align: right;">
|
||||
<span class="label label-default" style="background-color: #FD6217; margin: 5px 0 !important; display: inline-table; line-height: initial; border-top-right-radius: 0; border-bottom-right-radius: 0; padding-right: 0.4em;" ng-show="record.isBusinessProject" x-translate>To Invoice</span><span class="label label-default" style="background-color: #FFAA00; margin: 5px 0 !important; display: inline-table; line-height: initial; border-top-left-radius: 0; border-bottom-left-radius: 0;" ng-show="record.isBusinessProject && record.id">{{record.$toInvoiceCounter}}</span>
|
||||
<span class="label label-default" style="background-color: #86BC25; margin: 5px 0 !important; display: inline-table; line-height: initial;" ng-show="record.isProject && record.projectTypeSelect == 1" x-translate>Project</span>
|
||||
<span class="label label-default" style="background-color: #86BC25; margin: 5px 0 !important; display: inline-table; line-height: initial;" ng-show="record.isProject && record.projectTypeSelect == 2" x-translate>Project phase</span>
|
||||
<span class="label label-default" style="background-color: #2185D0; margin: 5px 0 !important; display: inline-table; line-height: initial;" ng-show="record.isBusinessProject" x-translate>Business</span>
|
||||
</h4>
|
||||
]]>
|
||||
</viewer>
|
||||
</field>
|
||||
</panel>
|
||||
|
||||
<panel name="informationPanel" colSpan="10">
|
||||
<field name="fullName" showTitle="false" colSpan="12"
|
||||
css="label-bold bold large">
|
||||
<editor x-show-titles="false">
|
||||
<panel name="seq" colSpan="3">
|
||||
<field name="code" showTitle="false" colSpan="12" required="true" if="__config__.app.getApp('project')?.generateProjectSequence"
|
||||
css="label-bold bold large" x-bind="{{code|unaccent|uppercase}}" />
|
||||
<field name="code" showTitle="false" colSpan="12" required="true" if="!__config__.app.getApp('project')?.generateProjectSequence"
|
||||
css="label-bold bold large" x-bind="{{code|unaccent|uppercase}}" />
|
||||
</panel>
|
||||
<field name="name" showTitle="false" colSpan="6" required="true"
|
||||
css="label-bold bold large" />
|
||||
</editor>
|
||||
</field>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="detailsPanel">
|
||||
<panel name="generalInfoPanel" colSpan="12">
|
||||
<field name="company" form-view="company-form" grid-view="company-grid"
|
||||
colSpan="3" canEdit="false"/>
|
||||
<field name="clientPartner" domain="self.isCustomer = true AND :company member of self.companySet" onChange="action-project-method-get-partner-data"
|
||||
requiredIf="isBusinessProject" form-view="partner-form" grid-view="partner-grid"
|
||||
colSpan="3" if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
showIf="isBusinessProject" />
|
||||
<field name="currency" colSpan="3"
|
||||
if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
showIf="isBusinessProject" canEdit="false"/>
|
||||
<field name="priceList" colSpan="3"
|
||||
if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
showIf="isBusinessProject" canEdit="false"/>
|
||||
<field name="contactPartner" onSelect="action-attrs-domain-on-contact-partner"
|
||||
form-view="partner-form" grid-view="partner-grid" colSpan="6"
|
||||
if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
showIf="isBusinessProject" />
|
||||
<field name="customerAddress" grid-view="address-grid" form-view="address-form"
|
||||
if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
showIf="isBusinessProject" domain="self IN (SELECT address FROM PartnerAddress where partner = :clientPartner)"/>
|
||||
</panel>
|
||||
<field name="progress" showIf="isProject" widget="Progress" colSpan="12">
|
||||
<editor>
|
||||
<field name="progress" showTitle="false" colSpan="3" />
|
||||
</editor>
|
||||
</field>
|
||||
<field name="description" colSpan="12" widget="html" />
|
||||
</panel>
|
||||
|
||||
<panel-tabs name="mainPanelTab">
|
||||
<panel title="Task Tree" name="taskTreePanel" showIf="isProject">
|
||||
<panel title="Phases" name="phasesPanel"
|
||||
showIf="isProject && childProjectList.length > 0" colSpan="12" showTitle="false">
|
||||
<button name="addPhaseBtn" title="New" colSpan="2"
|
||||
css="btn-custom text-left" icon="fa-plus" onClick="save,action-project-view-phase-new" />
|
||||
<button name="allPhasesBtn" title="All phases" colSpan="4"
|
||||
css="btn-custom text-left" icon="fa-tasks" onClick="save,action-project-view-phase-all" />
|
||||
<button name="allPhaseTasksBtn" title="All phase tasks" colSpan="6"
|
||||
css="btn-custom text-left" icon="fa-tasks"
|
||||
onClick="save,action-project-phase-view-show-phase-task" />
|
||||
<panel-dashlet name="projectPhaseTreeDashletPanel" title="Phases" colSpan="12"
|
||||
action="tree:project-phase-tree" />
|
||||
</panel>
|
||||
<button name="addTaskBtn" title="New task" colSpan="2"
|
||||
css="btn-custom text-left" icon="fa-plus" onClick="save,action-project-add-task" />
|
||||
<button name="addTicketBtn" title="New ticket" colSpan="2" css="btn-custom text-left" icon="fa-plus" onClick="save,action-project-add-ticket" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
<button name="allTaskBtn" title="All tasks" colSpan="2"
|
||||
css="btn-custom text-left" icon="fa-tasks"
|
||||
onClick="action-project-view-show-related-tasks" />
|
||||
<panel-dashlet name="projectTaskTreeDashletPanel" title="Task Tree" colSpan="12"
|
||||
action="action-view-show-project-task-tree" />
|
||||
<panel-dashlet name="taskInvoicingDashletPanel" title="Task Invoicing" colSpan="12"
|
||||
action="action-dashlet-project-show-all-invoicing-task" if="__config__.app.isApp('business-project')" canSearch="true"/>
|
||||
</panel>
|
||||
<panel title="Members" name="membersPanel">
|
||||
<field name="team" title="Team"
|
||||
readonlyIf="synchronize || extendsMembersFromParent" colSpan="6"
|
||||
canNew="false" canEdit="false" />
|
||||
<field name="synchronize" readonlyIf="extendsMembersFromParent"
|
||||
colSpan="2" widget="boolean-switch" />
|
||||
<field name="extendsMembersFromParent" hidden="true"
|
||||
showIf="projectTypeSelect == 2" colSpan="3" widget="boolean-switch" />
|
||||
<field name="membersUserSet" colSpan="12"
|
||||
widget="TagSelect" canNew="false" form-view="user-form" grid-view="user-grid" />
|
||||
<button name="importMemberBtn" title="Import all members"
|
||||
showIf="team != null" readonlyIf="extendsMembersFromParent" colSpan="3"
|
||||
onClick="action-project-method-import-members" />
|
||||
<panel title="Planning" name="planningPanel" colSpan="12"
|
||||
if="__config__.app.isApp('employee')" if-module="axelor-human-resource">
|
||||
<field name="totalPlannedHrs" readonly="true">
|
||||
<viewer><![CDATA[
|
||||
<span>{{record.totalPlannedHrs}} </span><span x-translate>hours</span>
|
||||
]]></viewer>
|
||||
</field>
|
||||
<spacer name="totalPlannedHrsSpacer" colSpan="6" />
|
||||
<button name="planPlanningBtn" title="Plan project" css="btn-custom text-left" onClick="save,action-project-view-project-planning-wizard" hideIf="$popup()" colSpan="3"/>
|
||||
<button name="addMultipleLinesBtn" title="Add multiple lines" css="btn-custom text-left" onClick="save,action-project-view-add-multiple-project-planning-time" colSpan="3" hideIf="$popup()"/>
|
||||
<button name="addProjectPlanningTimeLineBtn" title="New line" css="btn-custom text-left" colSpan="3" onClick="save,action-project-view-project-planning-time-add-new,save" />
|
||||
<button name="removeProjectPlanningTimeLineBtn" title="Remove lines" css="btn-custom text-left" colSpan="3" onClick="save,action-project-attrs-project-planning-time-remove,save" />
|
||||
<field name="$projectPlanningTimeSet" hidden="true" type="many-to-many" widget="TagSelect" title="Planned Time Planning"
|
||||
colSpan="12" target="com.axelor.apps.project.db.ProjectPlanningTime" canEdit="false" canNew="false"
|
||||
grid-view="project-planning-time-grid" form-view="project-planning-time-form"/>
|
||||
<button name="removeSelectedPlanningTimeBtn" colSpan="4" hidden="true" title="Remove selected lines" onClick="action-project-validate-remove-project-planning-time,action-project-planning-time-method-remove-project-planning-time"/>
|
||||
<button name="cancelRemovePlanningTimeBtn" colSpan="4" hidden="true" title="Cancel" onClick="action-project-attrs-project-planning-time-cancel-remove" />
|
||||
<panel-dashlet name="projectPlanningTimePanel" title="Planned Time Planning" action="action-project-dashlet-project-planning-time" colSpan="12" canSearch="true"/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
||||
<panel title="Log Times" name="logTimesPanel"
|
||||
if="__config__.app.isApp('timesheet')" if-module="axelor-human-resource">
|
||||
<field name="timeSpent" title="Time Spent" readonly="true"
|
||||
colSpan="3" />
|
||||
<panel-dashlet name="validatedTimesheetsPanel" action="action-project-dashlet-validated-timeshet-lines" title="Validated Timesheet lines" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="waitingTimesheetLinesPanel" action="action-project-dashlet-project-waiting-timeshet-lines" title="Waiting Timesheet lines" colSpan="12" canSearch="true"/>
|
||||
</panel>
|
||||
<panel title="Sales" name="salesPanel" showIf="isBusinessProject"
|
||||
if="__config__.app.isApp('business-project')
|
||||
&& __config__.app.getApp('business-project').getShowSaleOrderLineRelatedToProject()"
|
||||
if-module="axelor-business-project">
|
||||
<button name="generateQuotationBtn" title="Generate quotation"
|
||||
onClick="action-project-method-generate-quotation" css="btn-custom text-left" />
|
||||
<button name="showSaleOrderLinesBtn" title="Show sale order lines"
|
||||
css="btn-custom" icon="fa-line-chart" onClick="action-project-view-show-sale-order-lines" />
|
||||
<panel-dashlet name="saleQuotationPanel" action="action-project-dashlet-sale-quotation" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="saleOrderPanel" action="action-project-dashlet-sale-order" colSpan="12" canSearch="true"/>
|
||||
<button name="selectNewSOLinesBtn" title="Select new lines" css="btn-custom text-left" onClick="save,action-project-attrs-sales-order-line-select-lines" hideIf="$popup() || $readonly()" colSpan="3"/>
|
||||
<button name="manageSOLinesBtn" title="Manage lines" css="btn-custom text-left" onClick="save,action-project-attrs-sales-order-line-manage-lines" hideIf="$popup() || $readonly()" colSpan="3"/>
|
||||
<field name="$salesOrderLineSet" hidden="true" type="many-to-many" widget="TagSelect" title="Sale order lines"
|
||||
colSpan="12" target="com.axelor.apps.sale.db.SaleOrderLine" canEdit="false" canNew="false"
|
||||
grid-view="sale-order-line-project-grid" form-view="sale-order-line-form"/>
|
||||
<button-group name="SOLinesBtnGroup" colSpan="4">
|
||||
<button name="addSelectedSOLinesBtn" hidden="true" title="Add selected lines" onClick="action-sale-order-line-method-set-project"/>
|
||||
<button name="unlinkSelectedSOLinesBtn" hidden="true" title="Unlink selected lines" onClick="action-validate-unset-project,action-sale-order-line-method-unset-project"/>
|
||||
</button-group>
|
||||
<button name="cancelManageSOLinesBtn" colSpan="4" hidden="true" title="Cancel" onClick="action-project-attrs-sales-order-line-cancel-manage-lines" />
|
||||
<panel-dashlet name="saleOrderLinePanel" action="action-project-view-show-confirmed-sale-order-lines" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="customerDeliveriesPanel" action="action-project-dashlet-customer-deliveries" colSpan="12"/>
|
||||
</panel>
|
||||
<panel title="Purchases" name="purchasesPanel" showIf="isBusinessProject"
|
||||
if="__config__.app.isApp('business-project')
|
||||
&& __config__.app.getApp('business-project').getShowPurchaseOrderLineRelatedToProject()"
|
||||
if-module="axelor-business-project">
|
||||
<button name="generatePurchaseQuotationBtn" title="Generate quotation"
|
||||
onClick="action-project-method-generate-purchase-quotation" css="btn-custom text-left" />
|
||||
<button name="showPurchaseOrderLinesBtn" title="Show purchase order lines"
|
||||
css="btn-custom" icon="fa-shopping-cart"
|
||||
onClick="action-project-view-show-purchase-order-lines" />
|
||||
<panel-dashlet name="purchaseQuotationPanel" action="action-project-project-purchase-quotation" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="purchaseOrderPanel" action="action-project-dashlet-purchase-order" colSpan="12" canSearch="true"/>
|
||||
<button name="selectNewPOLinesBtn" title="Select new lines" css="btn-custom text-left" onClick="save,action-project-attrs-purchase-order-line-select-lines" hideIf="$popup() || $readonly()" colSpan="3"/>
|
||||
<button name="managePOLinesBtn" title="Manage lines" css="btn-custom text-left" onClick="save,action-project-attrs-purchase-order-line-manage-lines" hideIf="$popup() || $readonly()" colSpan="3"/>
|
||||
<field name="$purchaseOrderLineSet" hidden="true" type="many-to-many" widget="TagSelect" title="Purchase order lines"
|
||||
colSpan="12" target="com.axelor.apps.purchase.db.PurchaseOrderLine" canEdit="false" canNew="false"
|
||||
grid-view="purchase-order-line-project-grid" form-view="purchase-order-line-form"/>
|
||||
<button-group name="POLinesBtnGroup" colSpan="4">
|
||||
<button name="addSelectedPOLinesBtn" hidden="true" title="Add selected lines" onClick="action-purchase-order-line-method-set-project"/>
|
||||
<button name="unlinkSelectedPOLinesBtn" hidden="true" title="Unlink selected lines" onClick="action-validate-unset-project,action-purchase-order-line-method-unset-project"/>
|
||||
</button-group>
|
||||
<button name="cancelManagePOLinesBtn" colSpan="4" hidden="true" title="Cancel" onClick="action-project-attrs-purchase-order-line-cancel-manage-lines" />
|
||||
<panel-dashlet name="purchaseOrderLinePanel" action="action-project-view-show-confirmed-purchase-order-lines" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="supplierArrivalsPanel" action="action-project-dashlet-supplier-arrivals" colSpan="12"/>
|
||||
</panel>
|
||||
<panel name="resourceBookingListPanel" title="Resource booking" if="__config__.app.getApp('project').resourceManagement">
|
||||
<panel-related name="resourceBookingListPanel" field="resourceBookingList" form-view="resource-booking-form" grid-view="resource-booking-grid-incl-project" colSpan="12"/>
|
||||
</panel>
|
||||
<panel title="Expenses" name="expensesPanel" showIf="isBusinessProject"
|
||||
if="__config__.app.isApp('business-project')
|
||||
&& __config__.app.getApp('business-project').getShowExpenseLineRelatedToProject()"
|
||||
if-module="axelor-business-project">
|
||||
<button name="showExpenseLinesBtn" title="Show expense lines" css="btn-custom text-left"
|
||||
icon="fa-credit-card" onClick="action-project-view-show-expense-lines" />
|
||||
<panel-dashlet name="expenseWaitingPanel" action="action-project-dashlet-expense-waiting" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="expensePanel" action="action-project-dashlet-expense-validated" colSpan="12" canSearch="true"/>
|
||||
<button name="selectNewExpenseLinesBtn" title="Select new lines" css="btn-custom text-left" onClick="save,action-project-attrs-expense-line-select-lines" hideIf="$popup() || $readonly()" colSpan="3"/>
|
||||
<button name="manageExpenseLinesBtn" title="Manage lines" css="btn-custom text-left" onClick="save,action-project-attrs-expense-line-manage-lines" hideIf="$popup() || $readonly()" colSpan="3"/>
|
||||
<field name="$expenseLineSet" hidden="true" type="many-to-many" widget="TagSelect" title="Expense lines"
|
||||
colSpan="12" target="com.axelor.apps.hr.db.ExpenseLine" canEdit="false" canNew="false"
|
||||
grid-view="expense-line-project-grid" form-view="expense-line-form"/>
|
||||
<button-group name="expenseLinesBtnGroup" colSpan="4">
|
||||
<button name="addSelectedExpenseLinesBtn" hidden="true" title="Add selected lines" onClick="action-expense-line-method-set-project"/>
|
||||
<button name="unlinkSelectedExpenseLinesBtn" hidden="true" title="Unlink selected lines" onClick="action-validate-unset-project,action-expense-line-method-unset-project"/>
|
||||
</button-group>
|
||||
<button name="cancelManageExpenseLinesBtn" colSpan="4" hidden="true" title="Cancel" onClick="action-project-attrs-expense-line-cancel-manage-lines" />
|
||||
<panel-dashlet name="expenseLinePanel" action="action-project-view-show-validated-expense-lines" colSpan="12" canSearch="true"/>
|
||||
</panel>
|
||||
<panel title="Production" name="productionPanel" showIf="isBusinessProject"
|
||||
if-module="axelor-business-production"
|
||||
if="__config__.app.isApp('business-project')
|
||||
&& __config__.app.getApp('business-project').getShowProductionOrderRelatedToProject()">
|
||||
<button
|
||||
name="showProductionOrdersBtn"
|
||||
title="Show production orders" css="btn-custom text-left" icon="fa-cogs"
|
||||
onClick="action-project-view-show-production-orders" />
|
||||
<panel-related
|
||||
colSpan="12" field="productionOrderList"
|
||||
canSelect="true" canNew="false" canEdit="false" canSearch="true" name="productionOrderList"/>
|
||||
</panel>
|
||||
<panel title="Invoicing" name="invoicingPanel" showIf="isBusinessProject"
|
||||
if="__config__.app.isApp('business-project')" if-module="axelor-business-project">
|
||||
<field name="toInvoice" title="Project.toInvoice" colSpan="3" onChange="action-project-attrs-set-invoicing-sequence"/>
|
||||
<field name="isInvoicingTimesheet" colSpan="3"/>
|
||||
<field name="isInvoicingExpenses" colSpan="3" />
|
||||
<field name="isInvoicingPurchases" colSpan="3" />
|
||||
<field name="invoicingSequenceSelect" showIf="toInvoice" requiredIf="toInvoice" selection-in="[1,2]" colSpan="6"/>
|
||||
<spacer name="invoicingSequenceSelectSpacer" colSpan="6"/>
|
||||
<button name="showInvoicingProjectsBtn" title="Create invoicing project"
|
||||
css="btn-custom" icon="fa-file-text-o"
|
||||
onClick="save,action-project-view-show-invoicing-projects"/>
|
||||
<field name="invoicingComment" colSpan="12" />
|
||||
<panel-related name="manualElementListPanel" colSpan="12" field="manualElementList" form-view="manual-element-form" grid-view="manual-element-grid"/>
|
||||
<panel-dashlet name="allinvoicingProjectsPanel" action="action-dashlet-project-show-all-invoicing-project" colSpan="12" />
|
||||
<panel-dashlet name="customerInvoicePanel" action="action-project-dashlet-customer-invoices" colSpan="12" if="__config__.app.getApp('business-project').getShowSaleInvoiceLineRelatedToProject()" canSearch="true"/>
|
||||
<button name="selectNewCustomerInvoiceLinesBtn" title="Select new lines" css="btn-custom text-left" onClick="save,action-project-attrs-customer-invoice-line-select-lines" hideIf="$popup() || $readonly()" colSpan="3" if="__config__.app.getApp('business-project').getShowSaleInvoiceLineRelatedToProject()" />
|
||||
<button name="manageCustomerInvoiceLinesBtn" title="Manage lines" css="btn-custom text-left" onClick="save,action-project-attrs-customer-invoice-line-manage-lines" hideIf="$popup() || $readonly()" colSpan="3" if="__config__.app.getApp('business-project').getShowSaleInvoiceLineRelatedToProject()" />
|
||||
<field name="$customerInvoiceLineSet" hidden="true" type="many-to-many" widget="TagSelect" title="Customer Invoice lines"
|
||||
colSpan="12" target="com.axelor.apps.account.db.InvoiceLine" canEdit="false" canNew="false"
|
||||
grid-view="invoice-line-project-grid" form-view="invoice-line-form"/>
|
||||
<button-group name="customerInvoiceLinesBtnGroup" colSpan="4">
|
||||
<button name="addSelectedCustomerInvoiceLinesBtn" hidden="true" title="Add selected lines" onClick="action-invoice-line-method-set-customer-invoice-line-project"/>
|
||||
<button name="unlinkSelectedCustomerInvoiceLinesBtn" hidden="true" title="Unlink selected lines" onClick="action-validate-unset-project,action-invoice-line-method-unset-customer-invoice-line-project"/>
|
||||
</button-group>
|
||||
<button name="cancelManageCustomerInvoiceLinesBtn" colSpan="4" hidden="true" title="Cancel" onClick="action-project-attrs-customer-invoice-line-cancel-manage-lines" />
|
||||
<panel-dashlet name="customerInvoiceLinePanel" action="action-project-view-show-sale-invoice-lines" colSpan="12" if="__config__.app.getApp('business-project').getShowSaleInvoiceLineRelatedToProject()" canSearch="true"/>
|
||||
<panel-dashlet name="supplierInvoicePanel" action="action-project-dashlet-supplier-invoices" colSpan="12" if="__config__.app.getApp('business-project').getShowPurchaseInvoiceLineRelatedToProject()" canSearch="true"/>
|
||||
<button name="selectNewSupplierInvoiceLinesBtn" title="Select new lines" css="btn-custom text-left" onClick="save,action-project-attrs-supplier-invoice-line-select-lines" hideIf="$popup() || $readonly()" colSpan="3" if="__config__.app.getApp('business-project').getShowPurchaseInvoiceLineRelatedToProject()"/>
|
||||
<button name="manageSupplierInvoiceLinesBtn" title="Manage lines" css="btn-custom text-left" onClick="save,action-project-attrs-supplier-invoice-line-manage-lines" hideIf="$popup() || $readonly()" colSpan="3" if="__config__.app.getApp('business-project').getShowPurchaseInvoiceLineRelatedToProject()" />
|
||||
<field name="$supplierInvoiceLineSet" hidden="true" type="many-to-many" widget="TagSelect" title="Supplier Invoice lines"
|
||||
colSpan="12" target="com.axelor.apps.account.db.InvoiceLine" canEdit="false" canNew="false"
|
||||
grid-view="invoice-line-project-grid" form-view="invoice-line-form"/>
|
||||
<button-group name="supplierInvoiceLinesBtnGroup" colSpan="4">
|
||||
<button name="addSelectedSupplierInvoiceLinesBtn" hidden="true" title="Add selected lines" onClick="action-invoice-line-method-set-supplier-invoice-line-project"/>
|
||||
<button name="unlinkSelectedSupplierInvoiceLinesBtn" hidden="true" title="Unlink selected lines" onClick="action-validate-unset-project,action-invoice-line-method-unset-supplier-invoice-line-project"/>
|
||||
</button-group>
|
||||
<button name="cancelManageSupplierInvoiceLinesBtn" colSpan="4" hidden="true" title="Cancel" onClick="action-project-attrs-supplier-invoice-line-cancel-manage-lines" />
|
||||
<panel-dashlet name="supplierInvoiceLinePanel" action="action-project-view-show-purchase-invoice-lines" colSpan="12" if="__config__.app.getApp('business-project').getShowPurchaseInvoiceLineRelatedToProject()" canSearch="true"/>
|
||||
<panel-dashlet name="advancePaymentInvoicesDashletPanel" action="action-project-dashlet-advance-payment-invoices" colSpan="12"
|
||||
if="__config__.app.getApp('business-project').getShowPurchaseInvoiceLineRelatedToProject() || __config__.app.getApp('business-project').getShowSaleInvoiceLineRelatedToProject()" canSearch="true"/>
|
||||
</panel>
|
||||
<panel title="Analytic" name="analyticPanel" showIf="isBusinessProject"
|
||||
if="__config__.app.isApp('business-project')" if-module="axelor-business-project">
|
||||
<panel-dashlet name="analyticDashletPanel" action="action-project-dashlet-analytic-move-lines" colSpan="12"/>
|
||||
</panel>
|
||||
<panel title="Wiki" name="wikiPanel" >
|
||||
<panel-related name="wikiListPanel" field="wikiList" colSpan="12" form-view="wiki-form" grid-view="wiki-grid-incl-project"/>
|
||||
</panel>
|
||||
<panel title="Roadmap" name="roadmapPanel" if-module="axelor-business-support" if="__config__.app.isApp('business-support')">
|
||||
<panel-related name="roadmapListPanel" field="roadmapList" colSpan="12" form-view="project-version-form">
|
||||
<field name="title"/>
|
||||
<field name="statusSelect"/>
|
||||
<field name="testingServerDate"/>
|
||||
<field name="productionServerDate"/>
|
||||
</panel-related>
|
||||
</panel>
|
||||
<panel name="announcementPanel" title="Announcement" if-module="axelor-business-support" if="__config__.app.isApp('business-support')">
|
||||
<panel-related name="announcementListPanel" field="announcementList" colSpan="12" form-view="project-announcement-form">
|
||||
<field name="title"/>
|
||||
<field name="date"/>
|
||||
<field name="content"/>
|
||||
</panel-related>
|
||||
</panel>
|
||||
<panel title="Configurations" name="configurationsPanel" >
|
||||
<field if="__config__.app.isApp('employee')" if-module="axelor-human-resource"
|
||||
name="productSet" colSpan="12" widget="TagSelect" canEdit="false"
|
||||
domain="self.isActivity = true" form-view="product-activity-form"
|
||||
grid-view="product-activity-grid" />
|
||||
<field name="teamTaskCategorySet" colSpan="12" widget="TagSelect" />
|
||||
<field name="projectFolderSet" colSpan="12" widget="TagSelect" />
|
||||
<field name="excludeTimesheetEditor" />
|
||||
<field name="childProjectList" hidden="true" />
|
||||
<field name="sequence" hidden="true" />
|
||||
<field name="excludePlanning" if-module="axelor-business-project"
|
||||
showIf="isProject" />
|
||||
<field name="imputable" colSpan="4" widget="boolean-switch"
|
||||
if="__config__.app.isApp('employee')" if-module="axelor-human-resource" />
|
||||
</panel>
|
||||
<panel title="Contracts" name="contractPanel" if="__config__.app.isApp('business-project')" if-module="axelor-business-project">
|
||||
<button name="createNewCustomerContract" title="Create new customer contract" colSpan="6" onClick="save,action-project-view-create-new-customer-contract"/>
|
||||
<button name="createNewSupplierContract" title="Create new supplier contract" colSpan="6" onClick="save,action-project-view-create-new-supplier-contract"/>
|
||||
<panel-dashlet name="customerContractPanel" title="Customer contracts" action="action-project-dashlet-customer-contracts" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="supplierContractPanel" title="Supplier contracts" action="action-project-dashlet-supplier-contracts" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="contractInvoicePanel" title="Invoices" action="action-project-dashlet-contract-invoices" colSpan="12"/>
|
||||
</panel>
|
||||
</panel-tabs>
|
||||
<panel name="attrsPanel">
|
||||
<field name="attrs" colSpan="12" hidden="true" />
|
||||
</panel>
|
||||
<panel name="actionsPanel" colSpan="2" sidebar="true">
|
||||
<button name="startBtn" title="Start" hidden="true" showIf="statusSelect == 1"
|
||||
colSpan="12" icon="fa-play" onClick="action-project-record-status-in-progress,save" />
|
||||
<button name="finishBtn" title="Finish" hidden="true" showIf="statusSelect == 2"
|
||||
colSpan="12" icon="fa-check" onClick="action-project-record-status-finished,save" />
|
||||
<button name="cancelBtn" title="Cancel" hidden="true"
|
||||
showIf="statusSelect != 4" colSpan="12" css="btn-danger"
|
||||
icon="fa-times-circle" onClick="action-project-record-status-canceled,save" />
|
||||
<button name="newStatusBtn" title="Reset to New" hidden="true"
|
||||
showIf="statusSelect == 4" colSpan="12" css="btn-danger"
|
||||
icon="fa-file" onClick="action-project-record-status-new,save" />
|
||||
</panel>
|
||||
<panel name="characteristicsPanel" title="Characteristics" colSpan="12"
|
||||
sidebar="true" canCollapse="true">
|
||||
<panel name="configPanel" colSpan="12">
|
||||
<field if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
name="isProject" colSpan="6" widget="boolean-switch" />
|
||||
<field if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
name="isBusinessProject" colSpan="6" widget="boolean-switch" />
|
||||
<field name="isShowPhasesElements" hideIf="projectTypeSelect == 2" colSpan="12" widget="boolean-switch" />
|
||||
<field if="__config__.app.isApp('business-project')" if-module="axelor-business-project"
|
||||
name="$toInvoiceCounter" showTitle="false" hidden="true" colSpan="6" />
|
||||
</panel>
|
||||
<panel if-module="axelor-business-project" name="project"
|
||||
showIf="isProject" colSpan="12">
|
||||
<field name="projectTypeSelect" onChange="action-project-record-empty-parent-project"
|
||||
requiredIf="isProject" />
|
||||
<field name="parentProject" showIf="projectTypeSelect == 2" canEdit="false"
|
||||
form-view="project-form" grid-view="project-grid"
|
||||
onSelect="action-project-attrs-set-parent-project-domain"
|
||||
requiredIf="projectTypeSelect == 2" />
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="followUpPanel" colSpan="12" title="Follow-up" sidebar="true" canCollapse="true">
|
||||
<field name="assignedTo" title="Person In Charge" canNew="false"
|
||||
canView="false" canEdit="false" onChange="action-attrs-project-add-member"
|
||||
form-view="user-form" grid-view="user-grid" />
|
||||
</panel>
|
||||
<panel name="datePanel" title="Dates" colSpan="12" sidebar="true"
|
||||
canCollapse="true">
|
||||
<field name="fromDate" colSpan="6" />
|
||||
<field name="toDate" colSpan="6" />
|
||||
<field name="dueDate" showIf="isProject" colSpan="6" />
|
||||
<field name="estimatedTimeDays" colSpan="6" />
|
||||
</panel>
|
||||
<panel-mail name="mailPanel">
|
||||
<mail-messages limit="4" />
|
||||
<mail-followers />
|
||||
</panel-mail>
|
||||
</form>
|
||||
|
||||
|
||||
<form name="project-select-wizard-form" title="Select Projects" model="com.axelor.apps.base.db.Wizard">
|
||||
<panel name="mainPanel">
|
||||
<field name="projectSet" title="Projects" type="many-to-many" colSpan="12" target="com.axelor.apps.project.db.Project" canNew="false"/>
|
||||
<button name="ganttBtn" title="Open gantt" onClick="action-wizard-validate-project-select,action-open-project-gantt,close" colSpan="3" />
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<form name="user-select-wizard-form" title="Select Users" model="com.axelor.apps.base.db.Wizard">
|
||||
<panel name="mainPanel">
|
||||
<field name="userSet" title="Users" type="many-to-many" colSpan="12" target="com.axelor.auth.db.User" canNew="false"/>
|
||||
<button name="ganttBtn" title="Open gantt" onClick="action-wizard-validate-user-select,action-open-user-gantt,close" colSpan="3" />
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<kanban columnBy="statusSelect" sequenceBy="orderByState" limit="10"
|
||||
name="project-kanban" title="Projects" model="com.axelor.apps.project.db.Project">
|
||||
<field name="fullName"/>
|
||||
<field name="description"/>
|
||||
<field name="progress"/>
|
||||
<field name="dueDate"/>
|
||||
<field name="statusSelect"/>
|
||||
<field name="sequence"/>
|
||||
<hilite color="danger" if="dueDate.isAfter(__datetime__) && statusSelect < 3"/>
|
||||
<hilite color="success" if="(dueDate.isBefore(__datetime__) || dueDate.equals(__datetime__)) && statusSelect < 3"/>
|
||||
<hilite color="warning" if="(dueDate.isBefore(__datetime__) || dueDate.equals(__datetime__)) && statusSelect < 3"/>
|
||||
<template>
|
||||
<h4>{{fullName}}</h4>
|
||||
<div class="card-body">{{description}}</div>
|
||||
<div class="card-footer">
|
||||
<i class='fa fa-clock-o'></i> <span>{{dueDate|date:'dd/MM/yyyy'}}</span>
|
||||
</div>
|
||||
</template>
|
||||
</kanban>
|
||||
|
||||
<kanban columnBy="statusSelect" sequenceBy="statusSelect" limit="10"
|
||||
name="task-kanban" title="Tasks" model="com.axelor.apps.project.db.Project">
|
||||
<field name="fullName"/>
|
||||
<field name="description"/>
|
||||
<field name="progress"/>
|
||||
<field name="dueDate"/>
|
||||
<field name="statusSelect"/>
|
||||
<field name="sequence"/>
|
||||
<hilite color="danger" if="dueDate.isAfter(__datetime__) && statusSelect < 3"/>
|
||||
<hilite color="success" if="(dueDate.isBefore(__datetime__) || dueDate.equals(__datetime__)) && statusSelect < 3"/>
|
||||
<hilite color="warning" if="(dueDate.isBefore(__datetime__) || dueDate.equals(__datetime__)) && statusSelect < 3"/>
|
||||
<template>
|
||||
<h4>{{fullName}}</h4>
|
||||
<div class="card-body">{{description}}</div>
|
||||
<div class="card-footer">
|
||||
<i class='fa fa-clock-o'></i> <span>{{dueDate|date:'dd/MM/yyyy'}}</span>
|
||||
</div>
|
||||
</template>
|
||||
</kanban>
|
||||
|
||||
<calendar name="project-calendar"
|
||||
model="com.axelor.apps.project.db.Project"
|
||||
title="Project Calendar"
|
||||
eventStart="fromDate"
|
||||
eventStop="toDate"
|
||||
eventLength="1"
|
||||
colorBy="statusSelect"
|
||||
mode="month"
|
||||
>
|
||||
<field name="fullName"/>
|
||||
</calendar>
|
||||
|
||||
<action-view name="action-view-show-project-task-tree" title="Project Task Tree" model="com.axelor.team.db.TeamTask">
|
||||
<view type="tree" name="project-task-tree"/>
|
||||
<view type="form" name="team-task-form"/>
|
||||
<domain>self.project.id = :_id AND self.parentTask = null</domain>
|
||||
<context name="_id" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
|
||||
|
||||
<tree name="project-task-tree" title="Tasks">
|
||||
|
||||
<column name="name" type="string"/>
|
||||
<column name="taskDate" type="date"/>
|
||||
<column name="assignedTo" type="reference"/>
|
||||
<column name="progress" type="integer"/>
|
||||
<column name="openTask" type="button"/>
|
||||
|
||||
<node model="com.axelor.team.db.TeamTask" domain="self.project.id = :_id" onClick="action-team-task-view-task" orderBy="taskDate">
|
||||
<field name="name" as="name"/>
|
||||
<field name="taskDate" as="taskDate"/>
|
||||
<field name="assignedTo" as="assignedTo"/>
|
||||
<field name="progressSelect" as="progress"/>
|
||||
<button name="openTaskBtn" title="Open task" onClick="action-team-task-open-task"/>
|
||||
</node>
|
||||
|
||||
<node model="com.axelor.team.db.TeamTask" parent="parentTask" draggable="true" onClick="action-team-task-view-task" orderBy="taskDate">
|
||||
<field name="name" as="name"/>
|
||||
<field name="taskDate" as="taskDate"/>
|
||||
<field name="assignedTo" as="assignedTo"/>
|
||||
<field name="progressSelect" as="progress"/>
|
||||
<button name="openTaskBtn" title="Open task" onClick="action-team-task-open-task"/>
|
||||
</node>
|
||||
|
||||
</tree>
|
||||
|
||||
<tree name="project-phase-tree" title="Phases">
|
||||
|
||||
<column name="name" type="string"/>
|
||||
<column name="assignedTo" type="reference"/>
|
||||
<column name="progress" type="integer"/>
|
||||
<column name="openTask" type="button"/>
|
||||
|
||||
<node model="com.axelor.apps.project.db.Project" domain="self.parentProject.id = :id" onClick="action-project-view-phase">
|
||||
<field name="name" as="name"/>
|
||||
<field name="assignedTo" as="assignedTo"/>
|
||||
<field name="progress" as="progress"/>
|
||||
<button name="openTaskBtn" title="Open phase" onClick="action-project-view-phase"/>
|
||||
</node>
|
||||
|
||||
<node model="com.axelor.team.db.TeamTask" parent="project" draggable="true" onClick="action-team-task-view-task">
|
||||
<field name="name" as="name"/>
|
||||
<field name="assignedTo" as="assignedTo"/>
|
||||
<field name="progressSelect" as="progress"/>
|
||||
<button name="openTaskBtn" title="Open task" onClick="action-team-task-open-task"/>
|
||||
</node>
|
||||
|
||||
</tree>
|
||||
|
||||
<action-group name="action-project-group-on-new-project">
|
||||
<action name="action-project-defaults"/>
|
||||
<action name="action-project-attrs-scale-and-precision"/>
|
||||
<action name="action-attrs-project-set-project-type" if="__config__.app.isApp('business-project')" />
|
||||
<action name="action-project-record-init-type"/>
|
||||
</action-group>
|
||||
|
||||
<action-group name="action-project-on-load-group">
|
||||
<action name="action-project-attrs-scale-and-precision" />
|
||||
<action name="action-attrs-project-set-project-type" if="__config__.app.isApp('business-project')" />
|
||||
<action name="action-project-method-count-to-invoice" if="__config__.app.isApp('business-project')"/>
|
||||
<action name="action-project-attrs-project-planning-time-cancel-remove" />
|
||||
</action-group>
|
||||
|
||||
<action-attrs name="action-task-attrs-assigned-to-domain">
|
||||
<attribute name="domain" for="assignedTo" expr="eval:"self.id in (${(project?.membersUserSet?.collect{it->it.id}+[0,0]).join(',')}) ""
|
||||
if="(typeSelect == 'task')&&(project?.membersUserSet)&&(!project.membersUserSet.isEmpty())" />
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-project-defaults" model="com.axelor.apps.project.db.Project">
|
||||
<attribute name="value" for="fromDate" expr="eval: __datetime__"/>
|
||||
<attribute name="value" for="company" expr="eval:__user__.activeCompany"/>
|
||||
<attribute name="value" for="assignedTo" expr="eval: __user__"/>
|
||||
<attribute name="value:add" for="membersUserSet" expr="eval: __user__"/>
|
||||
<attribute name="value" for="isProject" expr="eval:_fromProject"/>
|
||||
<attribute name="value" for="isBusinessProject" expr="eval:_fromBusinessProject"/>
|
||||
<attribute name="value" for="parentProject" expr="eval:__repo__(Project).find(_parentProjectId)" if="_parentProjectId != null" />
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-attrs-project-add-member" model="com.axelor.apps.project.db.Project">
|
||||
<attribute name="value:add" for="membersUserSet" expr="eval: assignedTo"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-attrs-project-set-project-type" model="com.axelor.apps.project.db.Project">
|
||||
<attribute name="readonly" for="isProject" expr="eval:_fromProject"/>
|
||||
<attribute name="readonly" for="isBusinessProject" expr="eval:_fromBusinessProject"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-project-attrs-set-parent-project-domain" model="com.axelor.apps.project.db.Project">
|
||||
<attribute name="domain" for="parentProject" expr="eval:"self.isProject = true AND self.projectTypeSelect = 1 AND self.id != :id"" if="id != null"/>
|
||||
<attribute name="domain" for="parentProject" expr="eval:"self.isProject = true AND self.projectTypeSelect = 1"" if="id == null"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-record name="action-project-record-init-type" model="com.axelor.apps.project.db.Project">
|
||||
<field name="projectTypeSelect" expr="eval: _xProjectTypeSelect"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-project-record-empty-parent-project" model="com.axelor.apps.project.db.Project">
|
||||
<field name="parentProject" expr="eval: null"/>
|
||||
</action-record>
|
||||
|
||||
<action-view name="action-project-task-view" title="Tasks" model="com.axelor.team.db.TeamTask">
|
||||
<view type="form" name="team-task-form"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="show-confirm" value="false" />
|
||||
<view-param name="popup-save" value="false"/>
|
||||
<context name="_showRecord" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-show-project" title="Related Projects" model="com.axelor.apps.project.db.Project">
|
||||
<view type="grid" name="project-grid" />
|
||||
<view type="form" name="project-form" />
|
||||
<domain>self.typeSelect = 'project' AND self.project.id = :id</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-show-task" title="Tasks" model="com.axelor.apps.project.db.Project">
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain>self.typeSelect = 'task' AND self.project.id = :id</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-show-related-tasks" title="Related tasks" model="com.axelor.team.db.TeamTask">
|
||||
<view type="kanban" name="team-task-kanban"/>
|
||||
<view type="grid" name="team-task-grid"/>
|
||||
<view type="form" name="team-task-form"/>
|
||||
<domain>(self.project.id = :_id OR self.project.parentProject.id = :_id)</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-create-team" model="com.axelor.team.db.Team" title="Team">
|
||||
<view name="team-grid" type="grid"/>
|
||||
<view name="team-form" type="form"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="show-confirm" value="true"/>
|
||||
<view-param name="popup-save" value="true"/>
|
||||
<view-param name="forceEdit" value="true"/>
|
||||
<context name="_showRecord" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-open-gantt" title="Gantt" model="com.axelor.team.db.TeamTask">
|
||||
<view type="gantt" name="task-gantt" />
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain>self.project.id = :_id OR self.project.parentProject.id = :_id</domain>
|
||||
<context name="_project" expr="eval:__this__"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-book-resource" title="Book resource" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<view type="form" name="resource-booking-form" />
|
||||
<view type="grid" name="resource-booking-grid" />
|
||||
<view type="calendar" name="resource-booking-calendar" />
|
||||
<context name="_project" expr="eval:__self__"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-add-task" model="com.axelor.team.db.TeamTask" title="Task">
|
||||
<view name="team-task-form" type="form"/>
|
||||
<view name="team-task-grid" type="grid"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="popup-save" value="true"/>
|
||||
<view-param name="show-confirm" value="true"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<context name="_project" expr="eval:__this__"/>
|
||||
<context name="_typeSelect" expr="eval: com.axelor.team.db.repo.TeamTaskRepository.TYPE_TASK"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-add-ticket" model="com.axelor.team.db.TeamTask" title="Ticket">
|
||||
<view name="team-task-form" type="form"/>
|
||||
<view name="team-task-grid" type="grid"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="popup-save" value="true"/>
|
||||
<view-param name="show-confirm" value="true"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="forceTitle" value="true"/>
|
||||
<context name="_project" expr="eval:__this__"/>
|
||||
<context name="_typeSelect" expr="eval: com.axelor.team.db.repo.TeamTaskRepository.TYPE_TICKET"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-open-popup-select-users" title="Select Users" model="com.axelor.apps.base.db.Wizard">
|
||||
<view type="form" name="user-select-wizard-form"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="show-confirm" value="false"/>
|
||||
<view-param name="popup-save" value="false"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-open-popup-select-projects" title="Select Projects" model="com.axelor.apps.base.db.Wizard">
|
||||
<view type="form" name="project-select-wizard-form"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="show-confirm" value="false"/>
|
||||
<view-param name="popup-save" value="false"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-open-project-gantt" title="Project Gantt" model="com.axelor.team.db.TeamTask">
|
||||
<view type="gantt" name="project-task-gantt" />
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain>self.project.id IN (:_projectIds) OR self.project.parentProject.id IN (:_projectIds)</domain>
|
||||
<context name="_projectIds" expr="eval: projectSet.collect{it.id}"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-open-user-gantt" title="User Gantt" model="com.axelor.team.db.TeamTask">
|
||||
<view type="gantt" name="user-task-gantt" />
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain>self.assignedTo.id IN (:_userIds) </domain>
|
||||
<context name="_userIds" expr="eval: userSet.collect{it.id}"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-phase" title="Project phase" model="com.axelor.apps.project.db.Project">
|
||||
<view type="form" name="project-form"/>
|
||||
<view type="grid" name="project-grid"/>
|
||||
<view type="calendar" name="project-calendar"/>
|
||||
<view type="kanban" name="project-kanban"/>
|
||||
<domain>self.isProject = true and self.projectTypeSelect = :_xProjectTypeSelect and self.parentProject.id = :_parentId</domain>
|
||||
<context name="_fromProject" expr="eval:true"/>
|
||||
<context name="_xProjectTypeSelect" expr="eval: __repo__(Project).TYPE_PHASE"/>
|
||||
<context name="_parentId" expr="eval:_id" />
|
||||
<context name="_showRecord" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-phase-new" title="Project phase" model="com.axelor.apps.project.db.Project">
|
||||
<view type="form" name="project-form"/>
|
||||
<view type="grid" name="project-grid"/>
|
||||
<view type="calendar" name="project-calendar"/>
|
||||
<view type="kanban" name="project-kanban"/>
|
||||
<domain>self.isProject = true and self.projectTypeSelect = :_xProjectTypeSelect and self.parentProject.id = :_parentProjectId</domain>
|
||||
<context name="_fromProject" expr="eval:true"/>
|
||||
<context name="_xProjectTypeSelect" expr="eval: __repo__(Project).TYPE_PHASE"/>
|
||||
<context name="_parentProjectId" expr="eval:id" />
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-phase-all" title="Project phases" model="com.axelor.apps.project.db.Project">
|
||||
<view type="grid" name="project-grid"/>
|
||||
<view type="form" name="project-form"/>
|
||||
<view type="calendar" name="project-calendar"/>
|
||||
<view type="kanban" name="project-kanban"/>
|
||||
<domain>self.isProject = true and self.projectTypeSelect = :_xProjectTypeSelect and self.parentProject.id = :_parentProjectId</domain>
|
||||
<context name="_fromProject" expr="eval:true"/>
|
||||
<context name="_xProjectTypeSelect" expr="eval: __repo__(Project).TYPE_PHASE"/>
|
||||
<context name="_parentProjectId" expr="eval:id" />
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-phase-view-show-phase-task" title="Phase tasks" model="com.axelor.team.db.TeamTask">
|
||||
<view type="grid" name="team-task-grid" />
|
||||
<view type="form" name="team-task-form" />
|
||||
<domain>self.project.parentProject.id = :_projectId</domain>
|
||||
<context name="_projectId" expr="eval:id" />
|
||||
</action-view>
|
||||
|
||||
<action-record name="action-project-record-bind-customer-project" model="com.axelor.apps.project.db.Project">
|
||||
<field name="clientPartner" expr="eval: project?.clientPartner"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-project-record-bind-customer-parent" model="com.axelor.apps.project.db.Project">
|
||||
<field name="clientPartner" expr="eval: _parent?.clientPartner"/>
|
||||
</action-record>
|
||||
|
||||
<action-method name="action-method-project-compute-progress">
|
||||
<call class="com.axelor.apps.businessproject.web.ProjectController" method="computeProgress"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-project-method-count-to-invoice">
|
||||
<call class="com.axelor.apps.businessproject.web.ProjectController" method="countToInvoice"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-project-view-show-invoicing-projects">
|
||||
<call class="com.axelor.apps.businessproject.web.ProjectController" method="showInvoicingProjects"/>
|
||||
</action-method>
|
||||
|
||||
<action-attrs name="action-project-attrs-scale-and-precision">
|
||||
<attribute name="scale" for="price" expr="eval: __config__.app.getNbDecimalDigitForUnitPrice()"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-attrs-domain-on-contact-partner">
|
||||
<attribute for="contactPartner" if="clientPartner != null && !clientPartner.contactPartnerSet.empty" name="domain" expr="eval: "self.id IN (${clientPartner.contactPartnerSet?.collect{it.id}.join(',')})""/>
|
||||
<attribute for="contactPartner" if="clientPartner != null && clientPartner.contactPartnerSet.empty" name="domain" expr="eval: "self.id IN (0)""/>
|
||||
<attribute for="contactPartner" if="clientPartner == null" name="domain" expr="eval: "self.isContact = true AND :company member of self.companySet""/>
|
||||
</action-attrs>
|
||||
|
||||
<action-method name="action-project-method-import-members">
|
||||
<call class="com.axelor.apps.project.web.ProjectController" method="importMembers"/>
|
||||
</action-method>
|
||||
|
||||
<action-record name="action-project-record-status-in-progress" model="com.axelor.apps.project.db.Project">
|
||||
<field name="statusSelect" expr="eval: __repo__(Project).STATE_IN_PROGRESS"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-project-record-status-finished" model="com.axelor.apps.project.db.Project">
|
||||
<field name="statusSelect" expr="eval: __repo__(Project).STATE_FINISHED"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-project-record-status-canceled" model="com.axelor.apps.project.db.Project">
|
||||
<field name="statusSelect" expr="eval: __repo__(Project).STATE_CANCELED"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-project-record-status-new" model="com.axelor.apps.project.db.Project">
|
||||
<field name="statusSelect" expr="eval: __repo__(Project).STATE_NEW"/>
|
||||
</action-record>
|
||||
|
||||
<action-validate name="action-wizard-validate-user-select">
|
||||
<error message="Please select user" if="eval: userSet == null || userSet == 0"/>
|
||||
</action-validate>
|
||||
|
||||
<action-validate name="action-wizard-validate-project-select">
|
||||
<error message="Please select project" if="eval: projectSet == null || projectSet == 0"/>
|
||||
</action-validate>
|
||||
|
||||
<action-view name="action-project-view-project-planning-wizard" title="Project planning" model="com.axelor.apps.base.db.Wizard">
|
||||
<view type="form" name="project-planning-user-select-wizard-form"/>
|
||||
<view-param name="show-confirm" value="false"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<context name="_project" expr="eval:__this__"/>
|
||||
</action-view>
|
||||
|
||||
<action-attrs name="action-business-support-attrs-project-default">
|
||||
<attribute name="hidden" for="project" expr="eval:true" if="_parent && (_parent?._model == 'com.axelor.apps.project.db.Project' || _parent?._model == 'com.axelor.apps.project.db.ProjectTemplate')"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-view name="action-project-view-create-new-customer-contract" title="Create new customer contract" model="com.axelor.apps.contract.db.Contract">
|
||||
<view type="form" name="contract-form"/>
|
||||
<context name="_xTargetType" expr="eval:1"/>
|
||||
<context name="_project" expr="eval:__self__"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-view-create-new-supplier-contract" title="Create new supplier contract" model="com.axelor.apps.contract.db.Contract">
|
||||
<view type="form" name="contract-form"/>
|
||||
<context name="_xTargetType" expr="eval:2"/>
|
||||
<context name="_project" expr="eval:__self__"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-dashlet-customer-contracts" title="Customer contracts" model="com.axelor.apps.contract.db.Contract">
|
||||
<view type="grid" name="contract-grid"/>
|
||||
<view type="form" name="contract-form"/>
|
||||
<domain>self.project.id = :id AND self.targetTypeSelect = 1 AND self.statusSelect != 3</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-dashlet-supplier-contracts" title="Supplier contracts" model="com.axelor.apps.contract.db.Contract">
|
||||
<view type="grid" name="contract-grid"/>
|
||||
<view type="form" name="contract-form"/>
|
||||
<domain>self.project.id = :id AND self.targetTypeSelect = 2 AND self.statusSelect != 3</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-project-dashlet-contract-invoices" title="Invoices" model="com.axelor.apps.account.db.Invoice">
|
||||
<view type="grid" name="invoice-grid"/>
|
||||
<view type="form" name="invoice-form"/>
|
||||
<domain>self.contract.project.id = :_id</domain>
|
||||
</action-view>
|
||||
|
||||
<action-view name="dashlet.task" title="Tasks" model="com.axelor.apps.project.db.Project">
|
||||
<view type="grid" name="task-grid" />
|
||||
<view type="form" name="task-form" />
|
||||
</action-view>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
|
||||
<grid name="project-folder-grid" title="Projects Folder" model="com.axelor.apps.project.db.ProjectFolder">
|
||||
<field name="name"/>
|
||||
<field name="description" widget="html"/>
|
||||
</grid>
|
||||
|
||||
<form title="Project Folder" name="project-folder-form" model="com.axelor.apps.project.db.ProjectFolder" width="large">
|
||||
<menubar>
|
||||
<menu title="Reports" showTitle="true" icon="fa-files-o">
|
||||
<item title="Projects Planification and costs" action="action-project-folder-method-print-projects-planification-and-costs-report"/>
|
||||
<item title="Projects Financial Report" action="action-project-folder-method-print-projects-financial-report"/>
|
||||
</menu>
|
||||
</menubar>
|
||||
<panel name="mainPanel">
|
||||
<field name="name" showTitle="false" colSpan="12" css="label-bold bold large"/>
|
||||
<field name="description" colSpan="12" widget="html"/>
|
||||
<field name="projectSet" colSpan="12" edit-window="blank" form-view="project-form" grid-view="folder-project-grid" canNew="false" canEdit="false"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<action-method name="action-project-folder-method-print-projects-planification-and-costs-report">
|
||||
<call class="com.axelor.apps.businessproject.web.ProjectFolderController" method="printProjectsPlanificationAndCost"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-project-folder-method-print-projects-financial-report">
|
||||
<call class="com.axelor.apps.businessproject.web.ProjectFolderController" method="printProjectsFinancialReport"/>
|
||||
</action-method>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
|
||||
<grid name="project-status-grid" title="Status" model="com.axelor.apps.project.db.ProjectStatus">
|
||||
<field name="name"/>
|
||||
<field name="defaultStatus"/>
|
||||
<field name="isOpen"/>
|
||||
<field name="isClose"/>
|
||||
</grid>
|
||||
|
||||
<form title="Status" name="project-status-form" model="com.axelor.apps.project.db.ProjectStatus">
|
||||
<panel name="mainPanel">
|
||||
<field name="name"/>
|
||||
<field name="defaultStatus"/>
|
||||
<field name="isOpen" readonlyIf="isClose == 1"/>
|
||||
<field name="isClose" readonlyIf="isOpen == 1"/>
|
||||
</panel>
|
||||
|
||||
</form>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<grid name="project-template-grid" model="com.axelor.apps.project.db.ProjectTemplate" title="Project template">
|
||||
<field name="name"/>
|
||||
<field name="assignedTo"/>
|
||||
</grid>
|
||||
|
||||
<form name="project-template-form" title="Project template" model="com.axelor.apps.project.db.ProjectTemplate" onNew="action-project-group-on-new-project">
|
||||
|
||||
<panel name="mainPanel">
|
||||
<panel name="informationPanel" colSpan="12">
|
||||
<field name="fullName" showTitle="false" colSpan="12" css="label-bold bold large">
|
||||
<editor x-show-titles="false">
|
||||
<field name="name" showTitle="false" colSpan="9" css="label-bold bold large" />
|
||||
</editor>
|
||||
</field>
|
||||
</panel>
|
||||
<panel name="actionPanel" colSpan="6">
|
||||
<button name="createProjectBtn" icon="fa-copy" title="Create project from this template" onClick="save,action-project-template-method-generate-project" hidden="true" showIf="!isBusinessProject" colSpan="12"/>
|
||||
<button name="createBusinessProjectBtn" icon="fa-copy" title="Create business project from this template" onClick="save,action-project-template-method-generate-project" hidden="true" showIf="isBusinessProject" colSpan="12"/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
||||
<panel name="detailsPanel">
|
||||
<panel name="generalInfoPanel" colSpan="12">
|
||||
<field name="company" form-view="company-form" grid-view="company-grid" colSpan="3" canEdit="false"/>
|
||||
</panel>
|
||||
<field name="description" colSpan="12" widget="html" />
|
||||
</panel>
|
||||
|
||||
<panel-tabs name="mainPanelTab">
|
||||
<panel title="Task template" name="taskPanel">
|
||||
<field name="taskTemplateSet" widget="TagSelect" colSpan="12"/>
|
||||
</panel>
|
||||
|
||||
<panel title="Members" name="membersPanel">
|
||||
<field name="team" title="Team" readonlyIf="synchronize" colSpan="6" canNew="false" canEdit="false" />
|
||||
<field name="synchronize" colSpan="2" widget="boolean-switch" />
|
||||
<field name="membersUserSet" colSpan="12" widget="TagSelect" canNew="false" form-view="user-form" grid-view="user-grid" hideIf="synchronize" />
|
||||
</panel>
|
||||
|
||||
<panel title="Invoicing" name="invoicingPanel" showIf="isBusinessProject" if="__config__.app.isApp('business-project')" if-module="axelor-business-project">
|
||||
<field name="isInvoicingExpenses" colSpan="4" />
|
||||
<field name="isInvoicingPurchases" colSpan="4" />
|
||||
<field name="invoicingTypeSelect" colSpan="6"/>
|
||||
<field name="invoicingComment" colSpan="12" />
|
||||
</panel>
|
||||
|
||||
<panel title="Wiki" name="wikiPanel" >
|
||||
<panel-related name="wikiListPanel" field="wikiList" colSpan="12" form-view="wiki-form" grid-view="wiki-grid-incl-project"/>
|
||||
</panel>
|
||||
|
||||
<panel title="Configurations" name="configurationsPanel" >
|
||||
<field if="__config__.app.isApp('employee')" if-module="axelor-human-resource" name="productSet" colSpan="12" widget="TagSelect" canEdit="false" domain="self.isActivity = true" form-view="product-activity-form" grid-view="product-activity-grid" />
|
||||
<field name="teamTaskCategorySet" colSpan="12" widget="TagSelect" />
|
||||
<field name="projectFolderSet" colSpan="12" widget="TagSelect" />
|
||||
<field name="imputable" colSpan="4" widget="boolean-switch" if="__config__.app.isApp('employee')" if-module="axelor-human-resource" />
|
||||
<field name="excludePlanning" if-module="axelor-business-project"/>
|
||||
</panel>
|
||||
</panel-tabs>
|
||||
|
||||
<panel name="characteristicsPanel" title="Characteristics" if="__config__.app.isApp('business-project')" if-module="axelor-business-project" colSpan="12" sidebar="true" canCollapse="true">
|
||||
<field name="isBusinessProject" colSpan="6" widget="boolean-switch"/>
|
||||
<field name="$toInvoiceCounter" showTitle="false" hidden="true" colSpan="6" />
|
||||
</panel>
|
||||
|
||||
<panel name="followUpPanel" colSpan="12" title="Follow-up" sidebar="true" canCollapse="true">
|
||||
<field name="assignedTo" title="Person In Charge" canNew="false" canView="false" canEdit="false" onChange="action-attrs-project-add-member" form-view="user-form" grid-view="user-grid" />
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
|
||||
<form model="com.axelor.apps.base.db.Wizard" title="Create project from this template" name="project-template-wizard-form" onNew="action-attrs-project-template-set-wizard-hidden" onLoad="action-attrs-project-template-set-wizard-hidden">
|
||||
<panel name="mainPanel" colSpan="12">
|
||||
<panel name="infoPanel" colSpan="12">
|
||||
<field name="code" title="Code" type="string" required="true"/>
|
||||
<field name="clientPartner" title="Customer" type="many-to-one" target="com.axelor.apps.base.db.Partner" domain="self.isCustomer = true" required="true"/>
|
||||
</panel>
|
||||
<button name="createBusinessProjectBtn" title="Create business project from this template" colSpan="5" readonlyIf="!clientPartner" onClick="action-project-template-method-generate-project-from-wizard"/>
|
||||
<spacer name="createProjectBtnSpacer" />
|
||||
<button name="createProjectBtn" title="Create project from this template" colSpan="5" readonlyIf="!code" onClick="action-project-template-method-generate-project-from-wizard"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<action-method name="action-project-template-method-generate-project">
|
||||
<call class="com.axelor.apps.project.web.ProjectTemplateController" method="createProjectFromTemplate"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-project-template-method-generate-project-from-wizard">
|
||||
<call class="com.axelor.apps.project.web.ProjectTemplateController" method="createProjectFromWizard"/>
|
||||
</action-method>
|
||||
|
||||
<action-attrs name="action-attrs-project-template-set-wizard-hidden">
|
||||
<attribute name="hidden" expr="eval:!_businessProject" for="clientPartner"/>
|
||||
<attribute name="hidden" expr="eval:__config__.app.getApp('project')?.generateProjectSequence" for="code"/>
|
||||
<attribute name="hidden" expr="eval:!_businessProject" for="createBusinessProjectBtn"/>
|
||||
<attribute name="hidden" expr="eval:_businessProject" for="createProjectBtn"/>
|
||||
</action-attrs>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<grid name="resource-grid" title="Resources" model="com.axelor.apps.project.db.Resource">
|
||||
<field name="name"/>
|
||||
<field name="resourceType"/>
|
||||
<field name="batchNo"/>
|
||||
</grid>
|
||||
|
||||
<form name="resource-form" title="Resource" model="com.axelor.apps.project.db.Resource" width="large">
|
||||
<toolbar>
|
||||
<button name="bookResourceBtn" title="Book resource" onClick="save,action-resource-book-resource"/>
|
||||
</toolbar>
|
||||
<panel name="mainPanel">
|
||||
<panel name="imagePanel" colSpan="2" itemSpan="12">
|
||||
<field name="resourceImage" widget="Image"/>
|
||||
</panel>
|
||||
<panel name="detailsPanel" colSpan="6" itemSpan="12">
|
||||
<field name="name"/>
|
||||
<field name="resourceType"/>
|
||||
<field name="batchNo" />
|
||||
</panel>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<action-view name="action-resource-book-resource" title="Book resource" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<view type="form" name="resource-booking-form" />
|
||||
<view type="grid" name="resource-booking-grid" />
|
||||
<view type="calendar" name="resource-booking-calendar" />
|
||||
<context name="_resource" expr="eval:__self__"/>
|
||||
</action-view>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<grid name="resource-booking-grid" title="Resource bookings" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<field name="name"/>
|
||||
<field name="resource"/>
|
||||
<field name="project"/>
|
||||
<field name="task"/>
|
||||
<field name="user"/>
|
||||
<field name="fromDate"/>
|
||||
<field name="toDate"/>
|
||||
</grid>
|
||||
|
||||
<form name="resource-booking-form" title="Resource booking" model="com.axelor.apps.project.db.ResourceBooking" width="large" onNew="action-resource-booking-defaults">
|
||||
<panel name="mainPanel">
|
||||
<panel name="namePanel" colSpan="12">
|
||||
<field name="name" colSpan="12" css="label-bold bold large"/>
|
||||
<static name="nameLabel" hideIf="id" colSpan="12"><![CDATA[<span class='label label-info'>Computed automatically if left empty</span>]]></static>
|
||||
</panel>
|
||||
<field name="resource" canEdit="false"/>
|
||||
<field name="user" canEdit="false"/>
|
||||
<field name="project" canEdit="false"/>
|
||||
<field name="task" canEdit="false" onChange="action-resource-booking-attrs-update-period" domain="self.project = :project"/>
|
||||
<field name="fromDate" colSpan="4"/>
|
||||
<field name="toDate" colSpan="4"/>
|
||||
<field name="updateTaskFromPeriod" onChange="action-resource-booking-attrs-update-period" colSpan="4"/>
|
||||
<field name="notes" colSpan="12"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<grid name="resource-booking-grid-incl-project" title="Resource booking" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<field name="name"/>
|
||||
<field name="resource"/>
|
||||
<field name="task"/>
|
||||
<field name="user"/>
|
||||
<field name="fromDate"/>
|
||||
<field name="toDate"/>
|
||||
</grid>
|
||||
|
||||
<calendar name="resource-booking-calendar" model="com.axelor.apps.project.db.ResourceBooking" eventStart="fromDate" title="Resource booking" eventStop="toDate" colorBy="resource">
|
||||
<field name="project"/>
|
||||
</calendar>
|
||||
|
||||
<action-record name="action-resource-booking-defaults" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<field name="project" expr="eval:_project" if="_project != null"/>
|
||||
<field name="task" expr="eval:_task" if="_task != null"/>
|
||||
<field name="resource" expr="eval:_resource" if="_resource != null"/>
|
||||
<field name="user" expr="eval:__user__" />
|
||||
</action-record>
|
||||
|
||||
<action-attrs name="action-resource-booking-attrs-update-period" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<attribute name="value" expr="#{updateTaskFromPeriod ? task.taskDate.atStartOfDay() : null}" for="fromDate"/>
|
||||
<attribute name="readonly" expr="#{updateTaskFromPeriod}" for="fromDate"/>
|
||||
<attribute name="value" expr="#{updateTaskFromPeriod ? task.taskEndDate.atStartOfDay() : null}" for="toDate"/>
|
||||
<attribute name="readonly" expr="#{updateTaskFromPeriod}" for="toDate"/>
|
||||
</action-attrs>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
|
||||
<grid name="resource-type-grid" title="Resource types" model="com.axelor.apps.project.db.ResourceType" width="large">
|
||||
<field name="name"/>
|
||||
</grid>
|
||||
|
||||
<form name="resource-type-form" title="Resource type" model="com.axelor.apps.project.db.ResourceType">
|
||||
<panel name="namePanel">
|
||||
<field name="name"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<selection name="project.type.select">
|
||||
<option value="1">Project</option>
|
||||
<option value="2">Project Phase</option>
|
||||
</selection>
|
||||
|
||||
<selection name="project.status.select">
|
||||
<option value="1">New</option>
|
||||
<option value="2">In Progress</option>
|
||||
<option value="3">Finished</option>
|
||||
<option value="4">Canceled</option>
|
||||
</selection>
|
||||
|
||||
<selection name="message.related.to.select" id="project.message.related.to.select">
|
||||
<option value="com.axelor.apps.project.db.Project">Project</option>
|
||||
</selection>
|
||||
|
||||
<selection name="crm.event.related.to.select" id="project.crm.event.related.to.select">
|
||||
<option value="com.axelor.apps.project.db.Project">Project/Business (Project)</option>
|
||||
</selection>
|
||||
|
||||
<selection name="project.task.progress.select">
|
||||
<option value="0">0 %</option>
|
||||
<option value="10">10 %</option>
|
||||
<option value="20">20 %</option>
|
||||
<option value="30">30 %</option>
|
||||
<option value="40">40 %</option>
|
||||
<option value="50">50 %</option>
|
||||
<option value="60">60 %</option>
|
||||
<option value="70">70 %</option>
|
||||
<option value="80">80 %</option>
|
||||
<option value="90">90 %</option>
|
||||
<option value="100">100 %</option>
|
||||
</selection>
|
||||
|
||||
<selection name="project.project.project.type.select">
|
||||
<option value="1">Project</option>
|
||||
<option value="2">Project phase</option>
|
||||
</selection>
|
||||
|
||||
<selection name="sequence.generic.code.select" id="project.sequence.generic.code.select">
|
||||
<option value="project">Project</option>
|
||||
</selection>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<grid name="task-template-grid" title="Task template" model="com.axelor.apps.project.db.TaskTemplate">
|
||||
<field name="name"/>
|
||||
<field name="assignedTo"/>
|
||||
<field name="team"/>
|
||||
<field name="delayToStart"/>
|
||||
<field name="duration"/>
|
||||
<field name="totalPlannedHrs"/>
|
||||
<field name="isUniqueTaskForMultipleQuantity"/>
|
||||
</grid>
|
||||
|
||||
<form name="task-template-form" title="Task template" model="com.axelor.apps.project.db.TaskTemplate" width="large">
|
||||
<panel name="mainPanel">
|
||||
<field name="name" colSpan="12" css="label-bold bold large"/>
|
||||
<field name="delayToStart"/>
|
||||
<field name="duration"/>
|
||||
<field name="totalPlannedHrs"/>
|
||||
<field name="assignedTo" canEdit="false"/>
|
||||
<field name="team" canEdit="false"/>
|
||||
<field name="isUniqueTaskForMultipleQuantity" widget="boolean-switch"/>
|
||||
</panel>
|
||||
<panel name="contentPanel" title="Description" colSpan="12">
|
||||
<field name="description" showTitle="false" colSpan="12" widget="html"/>
|
||||
</panel>
|
||||
<panel if="__config__.app.isApp('business-support')" if-module="axelor-business-support" name="internalDescriptionPanel" title="Internal Description">
|
||||
<field name="internalDescription" colSpan="12" widget="html"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,532 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
<grid id="project-team-task-grid" name="team-task-grid" title="Tasks" model="com.axelor.team.db.TeamTask" edit-icon="true" orderBy="taskDate, priority">
|
||||
<hilite if="status == 'closed'" color="success"/>
|
||||
<hilite if="$moment(taskEndDate).diff(todayDate,'days') < 0" color="danger"/>
|
||||
<hilite if="priority == 'urgent'" color="warning"/>
|
||||
<field name="name"/>
|
||||
<field name="project"/>
|
||||
<field name="taskDate"/>
|
||||
<field name="taskEndDate" hidden="true"/>
|
||||
<field name="status"/>
|
||||
<field name="priority"/>
|
||||
<field name="teamTaskCategory"/>
|
||||
<field name="targetVersion" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
<button name="timeSpentBtn" title="Enter Time spent" icon="fa-clock-o" onClick="action-team-task-view-time-spent" />
|
||||
</grid>
|
||||
|
||||
<form name="team-task-form" id="project-team-task-form" title="Task" model="com.axelor.team.db.TeamTask"
|
||||
onNew="action-team-task-group-onnew"
|
||||
onLoad="action-team-task-group-timer-process" width="large">
|
||||
<toolbar>
|
||||
<button name="grabEventBtn" icon="fa-suitcase" help="Take charge" onClick="action-team-task-record-assigned-yourself,save"/>
|
||||
<button name="startBtn" icon="fa-play" onClick="action-team-task-record-status-in-progress,save"/>
|
||||
<button name="acceptBtn" icon="fa-check" onClick="action-team-task-record-status-closed,save"/>
|
||||
<button name="stopBtn" icon="fa-power-off" onClick="action-team-task-record-status-canceled,save"/>
|
||||
</toolbar>
|
||||
<menubar>
|
||||
<menu name="teamTaskMenu" title="Tools">
|
||||
<item name="bookResourceItem" title="Book resource" action="save,action-task-book-resource"/>
|
||||
</menu>
|
||||
</menubar>
|
||||
|
||||
<panel showIf="nextTeamTask">
|
||||
<field name="doApplyToAllNextTasks" widget="InlineCheckbox" colSpan="12"/>
|
||||
</panel>
|
||||
|
||||
<panel name="mainPanel" colSpan="12">
|
||||
<field name="status" colSpan="6" required="true" widget="NavSelect" showTitle="false"/>
|
||||
<panel name="viewerTagsPanel" colSpan="4">
|
||||
<field name="$viewerTags" showTitle="false" readonly="true" showIf="typeSelect == 'ticket' && $readonly()" colSpan="12" if-module="axelor-business-support" if="__config__.app.isApp('business-support')" hidden="true">
|
||||
<viewer>
|
||||
<![CDATA[
|
||||
<h4 class="text-right">
|
||||
<span class="label label-important" ng-show="record.assignment == 1" x-translate>Task assigned to the client</span>
|
||||
<span class="label label-success" ng-show="record.assignment == 2 && record.$provider == null" x-translate>Task assigned to the provider</span>
|
||||
<span class="label label-success" style="background-color: #5cb85c; margin: 5px 0 !important; display: inline-table; line-height: initial; border-top-right-radius: 0; border-bottom-right-radius: 0; padding-right: 0.3em;" ng-show="record.assignment == 2 && record.$provider != null" x-translate>Task assigned to</span><span class="label label-success" style="background-color: #5cb85c; margin: 5px 0 !important; display: inline-table; line-height: initial; border-top-left-radius: 0; border-bottom-left-radius: 0; padding-left: 0.0em;" ng-show="record.assignment == 2 && record.$provider != null">{{record.$provider}}</span>
|
||||
|
||||
<span class="label label-important" ng-show="(!record.isOrderAccepted && record.invoicingType == 2 && record.exTaxTotal != 0) || (!record.isOrderAccepted && record.invoicingType == 1)" x-translate>Order Proposed</span>
|
||||
<span class="label label-success" ng-show="record.isOrderAccepted" x-translate>Order Accepted</span>
|
||||
</h4>
|
||||
]]>
|
||||
</viewer>
|
||||
</field>
|
||||
</panel>
|
||||
<button name="timeSpentBtn" title="Enter Time spent" onClick="save,action-team-task-view-time-spent" colSpan="2"/>
|
||||
<field name="$provider" hidden="true" type="string"/>
|
||||
<panel name="projectDetailsPanel" colSpan="12">
|
||||
<panel name="detailsPanel" colSpan="8">
|
||||
<field name="fullName" showTitle="false" colSpan="12">
|
||||
<viewer depends="name">
|
||||
<![CDATA[
|
||||
<h3>
|
||||
<span style="margin: 5px 0 !important; display: inline-table; line-height: initial;">{{record.name}}</span>
|
||||
</h3>
|
||||
]]>
|
||||
</viewer>
|
||||
<editor>
|
||||
<field name="name" title="Subject" colSpan="12" css="label-bold bold large" required="true"/>
|
||||
</editor>
|
||||
</field>
|
||||
<field name="project" colSpan="6" onChange="action-team-task-group-project-onchange" required="true"/>
|
||||
<field name="parentTask" readonlyIf="project == null" colSpan="6" onSelect="action-task-attrs-project-parent-task-configurations"/>
|
||||
<field name="assignedTo" readonlyIf="project == null" colSpan="6" canNew="false" canView="false" canEdit="false" onSelect="action-task-attrs-project-assigned-to-configurations" required="true" form-view="user-form" grid-view="user-grid"/>
|
||||
<field name="team" readonly="true" colSpan="6" form-view="team-form" grid-view="team-grid" if="!__config__.app.isApp('business-support')"/>
|
||||
<field name="customerReferral" onSelect="action-task-attrs-customer-referral-domain" hidden="true" showIf="typeSelect == 'ticket'" if="__config__.app.isApp('business-project')"/>
|
||||
<field name="isPrivate" hidden="true" showIf="typeSelect == 'ticket'" colSpan="6" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
<field name="isOrderAccepted" colSpan="3" hidden="true" showIf="typeSelect == 'ticket'" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
<field name="isOrderProposed" hidden="true" colSpan="3" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
</panel>
|
||||
<panel name="actionPanel" colSpan="4">
|
||||
<button name="acceptOrderBtn" title="Accept Order" hidden="true" hideIf="invoicingType != 1 || isOrderAccepted || typeSelect != 'ticket'" onClick="action-task-attrs-onclick-order-accepted,save" colSpan="12" if-module="axelor-business-support" if="__config__.app.isApp('business-support')"/>
|
||||
<button name="assigningProviderBtn" colSpan="12" title="Assigning to the provider" hidden="true" onClick="action-team-task-attrs-assginment-provider,save" if-module="axelor-business-support" if="__config__.app.isApp('business-support')" showIf="assignment == 1 && typeSelect == 'ticket'"/>
|
||||
<button name="assigningCustomerBtn" colSpan="12" title="Assigning to the customer" hidden="true" onClick="action-team-task-attrs-assginment-customer,save" if-module="axelor-business-support" if="__config__.app.isApp('business-support')" showIf="assignment == 2 && typeSelect == 'ticket'"/>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="characteristicsPanel" title="Characteristics" colSpan="12">
|
||||
<field name="teamTaskCategory" colSpan="4" onSelect="action-task-attrs-team-task-category-configurations" onChange="action-team-task-group-project-category-onchange"/>
|
||||
<field name="priority" colSpan="4" required="true"/>
|
||||
<field name="targetVersion" if-module="axelor-business-support" if="__config__.app.isApp('business-support')" domain="self.project = :project OR self.project.parentProject = :project" colSpan="4" form-view="project-version-form" grid-view="project-version-grid"/>
|
||||
<field name="assignment" hidden="true" showIf="typeSelect == 'ticket'" if-module="axelor-business-support" if="__config__.app.isApp('business-support')" colSpan="4"/>
|
||||
<field name="taskDate" title="Task date" colSpan="4" onChange="action-task-attrs-set-task-duration,action-team-task-record-set-date-or-frequency-changed" required="true"/>
|
||||
<field name="taskEndDate" colSpan="4" onChange="action-task-attrs-set-task-duration"/>
|
||||
<field name="taskDeadline" title="Task deadline" colSpan="4" if="!__config__.app.isApp('business-support')"/>
|
||||
<field name="progressSelect" colSpan="12" widget="SelectProgress" onChange="action-task-update-planned-progress"/>
|
||||
</panel>
|
||||
|
||||
<field name="typeSelect" hidden="true"/>
|
||||
</panel>
|
||||
<panel-tabs name="mainPanelTab">
|
||||
<panel name="contentPanel" title="Description" colSpan="12">
|
||||
<field name="description" showTitle="false" colSpan="12" widget="html"/>
|
||||
</panel>
|
||||
|
||||
<panel name="internalDescriptionPanel" title="Internal Description" if="__config__.app.isApp('business-support')" if-module="axelor-business-support">
|
||||
<field name="internalDescription" colSpan="12" widget="html"/>
|
||||
</panel>
|
||||
|
||||
<panel name="planningPanel" title="Planning" if="__config__.app.isApp('employee')" if-module="axelor-human-resource">
|
||||
<field name="totalPlannedHrs" readonly="true" colSpan="4">
|
||||
<viewer><![CDATA[
|
||||
<span>{{record.totalPlannedHrs}} </span><span x-translate>hours</span>
|
||||
]]></viewer>
|
||||
</field>
|
||||
<field name="budgetedTime" colSpan="4">
|
||||
<viewer><![CDATA[
|
||||
<span>{{record.budgetedTime}} </span><span x-translate>hours</span>
|
||||
]]></viewer>
|
||||
</field>
|
||||
<spacer name="budgetedTimeSpacer" colSpan="4" />
|
||||
<button name="addMultipleLinesBtn" title="Add multiple lines" css="btn-custom text-left" onClick="save,action-project-view-add-multiple-project-planning-time" colSpan="3" hideIf="$popup()"/>
|
||||
<button name="projectPlanningTimeLineBtn" title="New line" colSpan="3" css="btn-custom text-left" onClick="save,action-team-task-view-time-planned,save"/>
|
||||
<button name="removeProjectPlanningTimeLineBtn" title="Remove lines" css="btn-custom text-left" colSpan="3" onClick="save,action-team-task-attrs-project-planning-time-remove,save" />
|
||||
<field name="$projectPlanningTimeSet" hidden="true" type="many-to-many" widget="TagSelect" title="Planned Time Planning"
|
||||
colSpan="12" target="com.axelor.apps.project.db.ProjectPlanningTime" canEdit="false" canNew="false" grid-view="project-planning-time-grid" form-view="project-planning-time-form"/>
|
||||
<button name="removeSelectedPlanningTimeBtn" colSpan="3" hidden="true" title="Remove selected lines" onClick="action-project-validate-remove-project-planning-time,action-project-planning-time-method-remove-project-planning-time"/>
|
||||
<button name="cancelRemovePlanningTimeBtn" colSpan="3" hidden="true" title="Cancel" onClick="action-project-attrs-project-planning-time-cancel-remove" />
|
||||
<panel-dashlet name="projectPlanningTimePanel" title="Planned Time Planning" action="action-team-task-dashlet-project-planning-time" colSpan="12" canSearch="true"/>
|
||||
|
||||
<field name="plannedProgress" hidden="true" colSpan="12" widget="progress"/>
|
||||
</panel>
|
||||
<panel name="treeViewPanel" title="Tree view" colSpan="12">
|
||||
<panel-dashlet name="taskTreePanel" title="Task Tree" colSpan="12" action="action-view-show-task-tree"/>
|
||||
<panel-related name="finishToStartSetPanel" field="finishToStartSet" colSpan="12">
|
||||
<field name="name"/>
|
||||
</panel-related>
|
||||
</panel>
|
||||
<panel name="financialDataPanel" title="Financial Data" colSpan="12">
|
||||
<field name="invoicingType" colspan="6" if="__config__.app.isApp('business-project')" if-module="axelor-business-project" onChange="action-team-task-attrs-invoice-type-on-change"/>
|
||||
<field name="toInvoice" colSpan="2" readonlyIf="invoiced" if="__config__.app.isApp('business-project')" if-module="axelor-business-project"/>
|
||||
<field name="isPaid" showIf="project.invoicingSequenceSelect == 1" if="__config__.app.isApp('business-project')" if-module="axelor-business-project" colSpan="1"/>
|
||||
<field name="isTaskRefused" if="__config__.app.isApp('business-project')" if-module="axelor-business-project" colSpan="1"/>
|
||||
<field if="__config__.app.isApp('business-project')" if-module="axelor-business-project" name="invoiced" showIf="id && !($readonly())" colSpan="1"/>
|
||||
<field if="__config__.app.isApp('business-project')" if-module="axelor-business-project" name="invoiced" showIf="id && $readonly()" showTitle="false" colSpan="1" >
|
||||
<viewer><![CDATA[
|
||||
<h4 class="text-right">
|
||||
<span class="label label-success" ng-show="record.invoiced" x-translate>Invoiced</span>
|
||||
<span class="label label-important" ng-show="!record.invoiced" x-translate>Not invoiced</span>
|
||||
</h4>
|
||||
]]></viewer>
|
||||
</field>
|
||||
<field name="project.invoicingSequenceSelect" hidden="true"/>
|
||||
<field name="saleOrderLine" readonly="true" showIf="saleOrderLine" form-view="sale-order-line-form" grid-view="sale-order-line-grid"/>
|
||||
<field name="invoiceLine" readonly="true" showIf="invoiceLine" form-view="invoice-line-form" grid-view="invoice-line-grid"/>
|
||||
<panel name="packagePanel" title="Package" colSpan="12" showIf="invoicingType == 2">
|
||||
<field name="product" colSpan="6" canEdit="false" onChange="action-team-task-group-product-onchange" domain="self.unit.unitTypeSelect=3" form-view="product-form" grid-view="product-grid"/>
|
||||
<field name="quantity" colSpan="3" onChange="action-team-task-group-qty-onchange"/>
|
||||
<field name="unit" colSpan="3" domain="self.unitTypeSelect=3" form-view="unit-form" grid-view="unit-grid" canEdit="false"/>
|
||||
<field name="unitPrice" colSpan="3" onChange="action-team-task-group-unit-price-onchange"/>
|
||||
<field name="currency" colSpan="3" grid-view="currency-grid" form-view="currency-form" canEdit="false"/>
|
||||
<panel name="discountPanel" readonly="true" colSpan="12" hideIf="discountTypeSelect == 3 || discountTypeSelect == 0" if="__config__.app.isApp('business-project')" if-module="axelor-business-project">
|
||||
<field name="discountTypeSelect" colSpan="3" onChange="action-sale-order-line-attrs-discountamount-title"/>
|
||||
<field name="discountAmount" colSpan="3"/>
|
||||
<field name="priceDiscounted" colSpan="3"/>
|
||||
</panel>
|
||||
<field name="exTaxTotal" readonly="true" colSpan="3"/>
|
||||
</panel>
|
||||
<field if="__config__.app.getApp('project').isEnableSignature" name="metaFile" width="120" widget="Image" />
|
||||
</panel>
|
||||
|
||||
<panel name="frequencyPanel" title="Frequency">
|
||||
<field name="frequency" onChange="action-team-task-record-set-date-or-frequency-changed" domain="1 <> 1" canNew="true" grid-view="frequency-grid" form-view="frequency-form"/>
|
||||
<field name="nextTeamTask" hidden="true" showIf="nextTeamTask"/>
|
||||
<field name="isFirst" hidden="true"/>
|
||||
<field name="doUpdateNextTasks" hidden="true"/>
|
||||
<field name="hasDateOrFrequencyChanged" hidden="true"/>
|
||||
</panel>
|
||||
|
||||
<panel name="timeSpentPanel" title="Time Spent">
|
||||
<field name="totalRealHrs" readonly="true" colSpan="4">
|
||||
<viewer><![CDATA[
|
||||
<span>{{record.totalRealHrs}} </span><span x-translate>hours</span>
|
||||
]]></viewer>
|
||||
</field>
|
||||
<panel-dashlet name="validatedTimesheetLinesPanel" action="action-teamtask-dashlet-validated-timeshet-lines" title="Validated Timesheet lines" colSpan="12" canSearch="true"/>
|
||||
<panel-dashlet name="waitingTimesheetLinesPanel" action="action-teamtask-dashlet-waiting-timeshet-lines" title="Waiting Timesheet lines" colSpan="12" canSearch="true"/>
|
||||
</panel>
|
||||
|
||||
<panel name="timerPanel" title="Timer" showIf="id" hidden="true">
|
||||
<panel name="actionsPanel" title="Actions">
|
||||
<button name="startTimerBtn" title="Start" icon="fa-play" colSpan="12" hidden="true"
|
||||
onClick="action-team-task-method-start-timer"/>
|
||||
<button name="stopTimerBtn" title="Stop" icon="fa-pause" colSpan="12" hidden="true"
|
||||
onClick="action-team-task-method-stop-timer"/>
|
||||
<button name="cancelTimerBtn" title="Cancel" icon="fa-times-circle" colSpan="12"
|
||||
hidden="true" onClick="action-team-task-method-cancel-timer"/>
|
||||
</panel>
|
||||
<panel name="durationPanel">
|
||||
<field name="$_totalTimerDuration" type="decimal" readonly="true"
|
||||
title="Total duration (Hours)"
|
||||
colSpan="12"/>
|
||||
</panel>
|
||||
</panel>
|
||||
</panel-tabs>
|
||||
<panel-mail name="mailPanel">
|
||||
<mail-messages/>
|
||||
<mail-followers/>
|
||||
</panel-mail>
|
||||
</form>
|
||||
|
||||
<gantt name="task-gantt" title="Tasks" model="com.axelor.team.db.TeamTask"
|
||||
taskStart="taskDate" taskEnd="taskEndDate" taskDuration="durationHours" taskParent="parentTask" taskSequence="sequence"
|
||||
taskProgress="plannedProgress" x-start-to-start="startToStartSet" x-finish-to-start="finishToStartSet"
|
||||
x-finish-to-finish="finishToFinishSet"
|
||||
taskUser="assignedTo">
|
||||
<field name="name"/>
|
||||
</gantt>
|
||||
|
||||
<gantt name="project-task-gantt" title="Project Task"
|
||||
model="com.axelor.team.db.TeamTask" taskStart="taskDate" taskEnd="taskEndDate" taskDuration="durationHours" taskParent="parentTask" taskSequence="sequence"
|
||||
taskProgress="plannedProgress" x-start-to-start="startToStartSet" x-finish-to-start="finishToStartSet"
|
||||
x-finish-to-finish="finishToFinishSet">
|
||||
<field name="name" />
|
||||
<field name="project"/>
|
||||
</gantt>
|
||||
|
||||
<gantt name="user-task-gantt" title="User Task"
|
||||
model="com.axelor.team.db.TeamTask" taskStart="taskDate" taskEnd="taskEndDate" taskDuration="durationHours" taskParent="parentTask" taskSequence="sequence"
|
||||
taskProgress="plannedProgress" x-start-to-start="startToStartSet" x-finish-to-start="finishToStartSet"
|
||||
x-finish-to-finish="finishToFinishSet">
|
||||
<field name="name" />
|
||||
<field name="assignedTo" />
|
||||
</gantt>
|
||||
|
||||
<action-view name="action-view-show-task-tree" title="Task Tree" model="com.axelor.team.db.TeamTask">
|
||||
<view type="tree" name="task-tree"/>
|
||||
<view type="form" name="team-task-form"/>
|
||||
<domain>self.id = :_id</domain>
|
||||
<context name="_id" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<tree name="task-tree" title="Tasks">
|
||||
|
||||
<column name="name" type="string"/>
|
||||
<column name="assignedTo" type="reference"/>
|
||||
<column name="progress" type="decimal"/>
|
||||
|
||||
<node model="com.axelor.team.db.TeamTask" domain="self.id = :_id" onClick="action-team-task-view-task">
|
||||
<field name="name" as="name"/>
|
||||
<field name="assignedTo" as="assignedTo"/>
|
||||
<field name="progressSelect" as="progress" />
|
||||
</node>
|
||||
|
||||
<node model="com.axelor.team.db.TeamTask" parent="parentTask" draggable="true" onClick="action-team-task-view-task">
|
||||
<field name="name" as="name"/>
|
||||
<field name="assignedTo" as="assignedTo"/>
|
||||
<field name="progressSelect" as="progress"/>
|
||||
</node>
|
||||
|
||||
|
||||
</tree>
|
||||
|
||||
<kanban name="team-task-kanban" columnBy="status" title="Tasks" limit="30" sequenceBy="sequence" model="com.axelor.team.db.TeamTask">
|
||||
<field name="name"/>
|
||||
<field name="project"/>
|
||||
<field name="status"/>
|
||||
<field name="assignedTo"/>
|
||||
<field name="taskDate"/>
|
||||
<field name="taskDeadline"/>
|
||||
<field name="priority"/>
|
||||
<field name="progressSelect"/>
|
||||
<hilite color="success" if="(taskDeadline == null || $moment(taskDeadline).diff(todayDate,'days') >= 0) && status != 'closed'"/>
|
||||
<hilite color="danger" if="$moment(taskDeadline).diff(todayDate,'days') < 0 && status != 'closed'"/>
|
||||
<hilite color="info" if="status == 'closed'"/>
|
||||
<template>
|
||||
<![CDATA[
|
||||
<h4>{{name}}</h4>
|
||||
<h4><span style="font-weight:normal;">{{project.fullName}}</span></h4>
|
||||
<img ng-if="assignedTo" ng-src="{{$image('assignedTo', 'image')}}">
|
||||
<div class="card-body">
|
||||
<div>
|
||||
<i class="fa fa-calendar" aria-hidden="true"></i>
|
||||
<span ng-if="!taskDeadline"> <span x-translate>Not specified</span> </span>
|
||||
<span ng-if="$moment(taskDeadline).isSame($moment().subtract(1, 'days'), 'day')"> <span x-translate>Deadline Yesterday</span> </span>
|
||||
<span ng-if="$moment(taskDeadline).isSame($moment(), 'day')"> <span x-translate>Deadline Today</span> </span>
|
||||
<span ng-if="$moment(taskDeadline).isSame($moment().add(1, 'days'), 'day')"> <span x-translate>Deadline Tomorrow</span> </span>
|
||||
<span ng-if="$moment(taskDeadline).isAfter($moment().add(1, 'days'), 'days')"> <span x-translate>Deadline</span> {{ $moment().to($moment(taskDeadline), false) }}</span>
|
||||
<span ng-if="$moment(taskDeadline).isBefore($moment().subtract(1, 'days'), 'days')"> <span x-translate>Deadline</span> {{ $moment(taskDeadline).from($moment(), false) }}</span>
|
||||
|
||||
<span class="label label-success pull-right" ng-if="priority == 'low'" x-translate>Low</span>
|
||||
<span class="label label-info pull-right" ng-if="priority == 'normal'" x-translate>Normal</span>
|
||||
<span class="label label-warning pull-right" ng-if="priority == 'high'" x-translate>High</span>
|
||||
<span class="label label-important pull-right" ng-if="priority == 'urgent'" x-translate>Urgent</span>
|
||||
|
||||
</div>
|
||||
<div class="progress kanban-progress">
|
||||
<span ng-if="progressSelect == 0">{{ progressSelect }}%</span>
|
||||
<div class="bar" style="width: {{ progressSelect }}%;">{{ progressSelect }}%</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<i class='fa fa-clock-o'></i> <span ng-if="taskDate">{{taskDate | date:'dd/MM/yyyy'}}</span><span ng-if="!taskDate" x-translate>Not specified</span>
|
||||
</div>
|
||||
]]>
|
||||
</template>
|
||||
</kanban>
|
||||
|
||||
<action-group name="action-team-task-group-onnew" id="action-team-task-group-project-onnew">
|
||||
<action name="action-task-defaults"/>
|
||||
<action name="action-team-task-record-set-default"/>
|
||||
<action name="action-team-task-attrs-scale-and-precision" if="__config__.app.isApp('business-project')"/>
|
||||
<action name="action-task-record-project-configurations" if="project != null"/>
|
||||
<action name="action-team-task-business-support-provider" if="__config__.app.isApp('business-support')"/>
|
||||
</action-group>
|
||||
|
||||
<action-group name="action-team-task-group-project-onchange">
|
||||
<action name="action-task-record-project-configurations"/>
|
||||
<action name="action-team-task-method-update-discount" if="__config__.app.isApp('business-project')"/>
|
||||
<action name="action-team-task-method-compute" if="__config__.app.isApp('business-project')"/>
|
||||
</action-group>
|
||||
|
||||
<action-group name="action-team-task-group-product-onchange">
|
||||
<action name="action-team-task-record-product-selected"/>
|
||||
<action name="action-team-task-method-update-discount" if="__config__.app.isApp('business-project')"/>
|
||||
<action name="action-team-task-method-compute" if="__config__.app.isApp('business-project')"/>
|
||||
</action-group>
|
||||
|
||||
<action-group name="action-team-task-group-qty-onchange">
|
||||
<action name="action-team-task-method-update-discount" if="__config__.app.isApp('business-project')"/>
|
||||
<action name="action-team-task-method-compute" if="__config__.app.isApp('business-project')"/>
|
||||
</action-group>
|
||||
|
||||
<action-group name="action-team-task-group-unit-price-onchange">
|
||||
<action name="action-team-task-method-compute" if="__config__.app.isApp('business-project')"/>
|
||||
</action-group>
|
||||
|
||||
<action-view name="action-team-task-view-task" title="Tasks" model="com.axelor.team.db.TeamTask">
|
||||
<view type="form" name="team-task-form"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="show-toolbar" value="true"/>
|
||||
<view-param name="show-confirm" value="true" />
|
||||
<context name="_showRecord" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-team-task-open-task" title="Task" model="com.axelor.team.db.TeamTask">
|
||||
<view type="form" name="team-task-form"/>
|
||||
<context name="_showRecord" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-team-task-edit-task" title="Task" model="com.axelor.team.db.TeamTask">
|
||||
<view type="form" name="team-task-form"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="show-toolbar" value="true"/>
|
||||
<view-param name="forceEdit" value="true" />
|
||||
<context name="_showRecord" expr="eval: id"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="action-team-task-view-time-planned" title="Planned Time Planning" model="com.axelor.apps.project.db.ProjectPlanningTime">
|
||||
<view type="form" name="project-planning-time-form"/>
|
||||
<view-param name="popup" value="reload"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
<view-param name="forceEdit" value="true"/>
|
||||
<view-param name="forceTitle" value="true"/>
|
||||
<context name="_timePlannedPopup" expr="eval: true"/>
|
||||
<context name="_task" expr="eval: __self__"/>
|
||||
<context name="_project" expr="eval: project"/>
|
||||
</action-view>
|
||||
|
||||
<action-record name="action-task-record-project-configurations" model="com.axelor.team.db.TeamTask">
|
||||
<field name="teamTaskCategory" expr="eval: null"/>
|
||||
<field name="assignedTo" expr="eval:(project?.membersUserSet ? project?.membersUserSet?.collect{it.id}.contains(assignedTo.id) : __repo__(Project).find(project?.id).membersUserSet?.collect{it.id}.contains(assignedTo.id)) ? assignedTo : null" if="project != null && assignedTo != null"/>
|
||||
<field name="membersUserSet" expr="eval: null"/>
|
||||
<field name="team" expr="eval: project?.team" if="project?.synchronize && project.team != null"/>
|
||||
<field name="team" expr="eval: __repo__(Project).find(project?.parentProject?.id)?.team" if="(!project?.synchronize || project.team == null) && project?.extendsMembersFromParent && __repo__(Project).find(project?.parentProject?.id)?.synchronize"/>
|
||||
<field name="invoicingType" expr="eval: 2" if="project?.invoicingSequenceSelect == 1"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-task-defaults" model="com.axelor.team.db.TeamTask">
|
||||
<field name="name" expr="eval: _value" if="_value"/>
|
||||
<field name="assignedTo" expr="eval:__user__" />
|
||||
<field name="priority" expr="normal" />
|
||||
<field name="status" expr="new" />
|
||||
<field name="taskDate" expr="#{__date__}" />
|
||||
<field name="project" expr="eval:_project" />
|
||||
<field name="customerReferral" expr="eval: __user__" if="__user__?.roles.contains(__repo__(Role).all().filter('self.name=?','role.customer').fetchOne())"/>
|
||||
<field name="assignment" expr="eval:2"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-team-task-business-support-provider" model="com.axelor.team.db.TeamTask">
|
||||
<field name="$provider" expr="eval: __config__.app.getApp('business-support').providerCompany.name" if="__config__.app.getApp('business-support').providerCompany"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-task-update-planned-progress" model="com.axelor.team.db.TeamTask">
|
||||
<field name="plannedProgress" expr="eval: progressSelect"/>
|
||||
</action-record>
|
||||
|
||||
<action-attrs name="action-task-attrs-team-task-category-configurations" model="com.axelor.team.db.TeamTask">
|
||||
<attribute name="domain" for="teamTaskCategory" expr="eval: (project?.teamTaskCategorySet != null && project?.teamTaskCategorySet?.size() > 0) ? "self.id IN (${project?.teamTaskCategorySet?.collect{it.id}?.join(',')})" : "self.id IN (null)""/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-project-assigned-to-configurations" model="com.axelor.team.db.TeamTask">
|
||||
<attribute name="domain" expr="eval: (project?.membersUserSet != null && project?.membersUserSet?.size() > 0) ? "self.id IN(${project?.membersUserSet?.collect{it.id}?.join(',')})" : "self.id IN (null)"" for="assignedTo"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-project-parent-task-configurations" model="com.axelor.team.db.TeamTask">
|
||||
<attribute name="domain" expr="eval: (project?.teamTaskList !=null && project?.teamTaskList?.size() > 0 ) ? "self.id != ${id} AND self.id IN(${project?.teamTaskList?.collect{it.id}?.join(',')})" : "self.id IN (null)"" for="parentTask"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-project-members-user-set-configurations" model="com.axelor.team.db.TeamTask">
|
||||
<attribute name="domain" expr="eval: (project?.membersUserSet != null && project?.membersUserSet?.size() > 0) ? "self.id IN (${project?.membersUserSet?.collect{it.id}?.join(',')})" : "self.id IN (null)"" for="membersUserSet"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-set-task-duration">
|
||||
<attribute name="value" for="taskDuration" expr="eval:java.time.temporal.ChronoUnit.DAYS.between(taskDate, taskEndDate)*86400" if="taskDate != null && taskEndDate != null"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-set-dates">
|
||||
<attribute name="value" for="taskEndDate" expr="eval:taskDate.plus((taskDuration/86400).longValue(), java.time.temporal.ChronoUnit.DAYS)" if="taskDate != null"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-onclick-order-accepted">
|
||||
<attribute name="value" for="isOrderAccepted" expr="eval:true"/>
|
||||
<attribute name="value" for="assignment" expr="eval:2"/>
|
||||
<attribute name="hidden" for="acceptOrderBtn" expr="eval:true"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-task-attrs-customer-referral-domain">
|
||||
<attribute name="domain" for="customerReferral" expr="eval: " (SELECT role FROM Role role WHERE role.name='role.customer') MEMBER OF self.roles AND self.id IN (SELECT userSet.id FROM Project p INNER JOIN p.membersUserSet userSet WHERE p.id = ${project?.id}) ""/>
|
||||
</action-attrs>
|
||||
|
||||
<action-view name="action-task-book-resource" title="Book resource" model="com.axelor.apps.project.db.ResourceBooking">
|
||||
<view type="form" name="resource-booking-form" />
|
||||
<view type="grid" name="resource-booking-grid" />
|
||||
<view type="calendar" name="resource-booking-calendar" />
|
||||
<context name="_project" expr="eval:__self__.project"/>
|
||||
<context name="_task" expr="eval:__self__"/>
|
||||
</action-view>
|
||||
|
||||
<action-record name="action-team-task-record-assigned-yourself" model="com.axelor.team.db.TeamTask">
|
||||
<field name="assignedTo" expr="eval: __user__"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-team-task-record-status-in-progress" model="com.axelor.team.db.TeamTask">
|
||||
<field name="status" expr="in-progress"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-team-task-record-status-closed" model="com.axelor.team.db.TeamTask">
|
||||
<field name="status" expr="closed"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-team-task-record-status-canceled" model="com.axelor.team.db.TeamTask">
|
||||
<field name="status" expr="canceled"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-team-task-record-product-selected" model="com.axelor.team.db.TeamTask">
|
||||
<field name="quantity" expr="1"/>
|
||||
<field name="unit" expr="eval: product?.salesUnit ?: product?.unit"/>
|
||||
<field name="unitPrice" expr="eval: product?.salePrice"/>
|
||||
<field name="currency" expr="eval: product?.saleCurrency"/>
|
||||
</action-record>
|
||||
|
||||
<action-method name="action-team-task-method-manage-timer-buttons">
|
||||
<call class="com.axelor.apps.project.web.TeamTaskController" method="manageTimerButtons"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-team-task-method-compute-total-timer-duration">
|
||||
<call class="com.axelor.apps.project.web.TeamTaskController"
|
||||
method="computeTotalTimerDuration"/>
|
||||
</action-method>
|
||||
|
||||
<action-group name="action-team-task-group-timer-process">
|
||||
<action name="action-team-task-method-manage-timer-buttons" if="timerList != null && !timerList.isEmpty()"/>
|
||||
<action name="action-team-task-method-compute-total-timer-duration" if="timerList != null && !timerList.isEmpty()"/>
|
||||
<action name="action-team-task-attrs-scale-and-precision" if="__config__.app.isApp('business-project')"/>
|
||||
<action name="action-team-task-business-support-provider" if="__config__.app.isApp('business-support')"/>
|
||||
<action name="action-project-attrs-project-planning-time-cancel-remove"/>
|
||||
</action-group>
|
||||
|
||||
<action-group name="action-team-task-group-project-category-onchange">
|
||||
<action name="action-team-task-method-onchange-category" if="__config__.app.isApp('business-project')" />
|
||||
</action-group>
|
||||
|
||||
<action-method name="action-team-task-method-start-timer">
|
||||
<call class="com.axelor.apps.project.web.TeamTaskController" method="startTimer"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-team-task-method-stop-timer">
|
||||
<call class="com.axelor.apps.project.web.TeamTaskController" method="stopTimer"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-team-task-method-cancel-timer">
|
||||
<call class="com.axelor.apps.project.web.TeamTaskController" method="cancelTimer"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-team-task-method-onchange-category">
|
||||
<call class="com.axelor.apps.businessproject.web.TeamTaskController" method="onChangeCategory"/>
|
||||
</action-method>
|
||||
|
||||
<action-attrs name="action-team-task-attrs-invoice-type-on-change">
|
||||
<attribute name="value" for="toInvoice" expr="eval: true" if="invoicingType == 1"/>
|
||||
<attribute name="value" for="toInvoice" expr="eval: false" if="invoicingType != 1"/>
|
||||
<attribute name="value" for="isOrderProposed" expr="eval: true" if="invoicingType == 1"/>
|
||||
<attribute name="value" for="isOrderProposed" expr="eval: false" if="invoicingType != 1"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-team-task-attrs-assginment-customer">
|
||||
<attribute name="value" for="assignment" expr="eval: 1"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-attrs name="action-team-task-attrs-assginment-provider">
|
||||
<attribute name="value" for="assignment" expr="eval: 2"/>
|
||||
</action-attrs>
|
||||
|
||||
<action-view name="action-team-task-dashlet-project-planning-time" title="Planned Time Planning" model="com.axelor.apps.project.db.ProjectPlanningTime">
|
||||
<view type="grid" name="project-planning-time-grid"/>
|
||||
<view type="form" name="project-planning-time-form"/>
|
||||
<view-param name="popup" value="true"/>
|
||||
<domain>self.task.id = :id</domain>
|
||||
</action-view>
|
||||
|
||||
<action-attrs name="action-team-task-attrs-project-planning-time-remove">
|
||||
<attribute name="readonly" for="removeProjectPlanningTimeLineBtn" expr="eval:true"/>
|
||||
<attribute name="hidden" for="cancelRemovePlanningTimeBtn" expr="eval:false"/>
|
||||
<attribute name="hidden" for="removeSelectedPlanningTimeBtn" expr="eval:false"/>
|
||||
<attribute name="hidden" for="$projectPlanningTimeSet" expr="eval:false"/>
|
||||
<attribute name="value" for="$projectPlanningTimeSet" expr="eval:null"/>
|
||||
<attribute name="title" for="$projectPlanningTimeSet" expr="eval:com.axelor.i18n.I18n.get('Select lines to remove')"/>
|
||||
<attribute name="domain" for="$projectPlanningTimeSet" expr="eval:"self.task.id = :id""/>
|
||||
</action-attrs>
|
||||
</object-views>
|
||||
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
|
||||
<grid name="team-task-category-grid" title="Category" model="com.axelor.apps.project.db.TeamTaskCategory">
|
||||
<field name="name"/>
|
||||
<field name="defaultInvoicingType" if="__config__.app.isApp('business-project')" if-module="axelor-business-project"/>
|
||||
</grid>
|
||||
|
||||
<form title="Category" name="team-task-category-form" model="com.axelor.apps.project.db.TeamTaskCategory">
|
||||
<panel name="mainPanel">
|
||||
<field name="name"/>
|
||||
<field name="defaultProduct" domain="self.unit.unitTypeSelect=3" form-view="product-form" grid-view="product-grid" if="__config__.app.isApp('business-project')" if-module="axelor-business-project"/>
|
||||
<field name="defaultInvoicingType" if="__config__.app.isApp('business-project')" if-module="axelor-business-project" validIf="$number(defaultInvoicingType) > 0"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<object-views xmlns="http://axelor.com/xml/ns/object-views" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://axelor.com/xml/ns/object-views http://axelor.com/xml/ns/object-views/object-views_5.2.xsd">
|
||||
|
||||
|
||||
<grid name="wiki-grid" title="Wiki" model="com.axelor.apps.project.db.Wiki">
|
||||
<field name="title"/>
|
||||
<field name="content"/>
|
||||
<field name="project"/>
|
||||
</grid>
|
||||
|
||||
<grid title="Wiki" name="wiki-grid-incl-project" model="com.axelor.apps.project.db.Wiki">
|
||||
<field name="title"/>
|
||||
<field name="content"/>
|
||||
</grid>
|
||||
|
||||
<form name="wiki-form" title="Wiki" model="com.axelor.apps.project.db.Wiki" width="large" onNew="action-business-support-attrs-project-default">
|
||||
<panel name="mainPanel">
|
||||
<field name="title" colSpan="6"/>
|
||||
<field name="project" colSpan="6" canEdit="false"/>
|
||||
<field name="content" widget="HTML" colSpan="12"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,6 @@
|
||||
{
|
||||
"main.css": "static/css/main.1db85911.css",
|
||||
"main.css.map": "static/css/main.1db85911.css.map",
|
||||
"main.js": "static/js/main.22f4edf5.js",
|
||||
"main.js.map": "static/js/main.22f4edf5.js.map"
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
<!DOCTYPE html><html lang="en" style="height:100%"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"><script src="../../js/messages.js"></script><script src="../../lib/jquery.ui/js/jquery.js"></script><script src="../../js/axelor.ns.js"></script><script src="../../js/lib/i18n.js"></script><title>Project Planning</title><link href="./static/css/main.1db85911.css" rel="stylesheet"></head><body><div id="root"></div><script type="text/javascript" src="./static/js/main.22f4edf5.js"></script></body></html>
|
||||
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Axelor Business Solutions
|
||||
*
|
||||
* Copyright (C) 2019 Axelor (<http://axelor.com>).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
.App{text-align:center}.App-logo{-webkit-animation:App-logo-spin infinite 20s linear;animation:App-logo-spin infinite 20s linear;height:80px}.App-header{background-color:#222;height:150px;padding:20px;color:#fff}.App-intro{font-size:large}@-webkit-keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.navbar{margin-bottom:0}.nonActive{background-color:transparent;color:gray}.activeLabel{background-color:#eeedee}.mode-label{padding:12px;font-size:12px;float:left;cursor:pointer;color:#0275d8}.mode-label:hover{background-color:#f1f1f1;color:#0275d8}.show-grid{border-top:1px solid #ddd}.duration-content{width:3600px;height:100%}.cell-height{height:25px}.task-content{width:30%;border-left:1px solid #ddd}.footer-content,.task-content{display:inline-block;background-color:#fff;border-bottom:1px solid #ddd}.footer-content{border-right:1px solid #ddd}.collapseIcon{margin-right:5px;font-size:13px;cursor:pointer}.duration-input{background-color:#fff;width:100%;border:0;text-align:center}.duration-input:hover{border-radius:3px}.task-footer{background-color:#fff;text-align:end;height:50px}.text-content{text-align:left}.cell-height:focus{border:1px solid #000}.timesheet-content{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 3% 0 0}.content-view{padding:10px}.cell-header{background-color:#fff}.footer-context{text-align:center}.addLine{padding:5px 10px;margin-left:10px;float:left}.addLine,.navigation{background-color:#0275d8;border:none}.navigation{padding:7px 12px}.loader{border:16px solid #f3f3f3;border-top:16px solid #3498db;border-radius:50%;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.normal{color:#000!important}.success{color:green!important}.danger{color:red!important}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@media only screen and (max-width:992px){.task-content{max-width:30%;-webkit-box-flex:1;-ms-flex:1;flex:1}}body{margin:0;padding:0;font-family:sans-serif}
|
||||
/*# sourceMappingURL=main.1db85911.css.map*/
|
||||
@ -0,0 +1 @@
|
||||
{"version":3,"sources":[],"names":[],"mappings":"","file":"static/css/main.1db85911.css","sourceRoot":""}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user