First commit waiting for Budget Alert

This commit is contained in:
2025-09-04 13:37:35 +01:00
commit 2d681f27f5
4563 changed files with 1061534 additions and 0 deletions

View File

@ -0,0 +1,18 @@
apply plugin: "com.axelor.app-module"
apply from: "../version.gradle"
apply {
version = openSuiteVersion
}
axelor {
title "Axelor Client Portal"
description "Axelor Client Portal Module"
}
dependencies {
compile project(":modules:axelor-supplychain")
compile project(":modules:axelor-helpdesk")
compile project(":modules:axelor-project")
}

View File

@ -0,0 +1,30 @@
/*
* 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.portal.module;
import com.axelor.app.AxelorModule;
import com.axelor.apps.portal.service.ClientViewService;
import com.axelor.apps.portal.service.ClientViewServiceImpl;
public class ClientPortalModule extends AxelorModule {
@Override
protected void configure() {
bind(ClientViewService.class).to(ClientViewServiceImpl.class);
}
}

View File

@ -0,0 +1,71 @@
/*
* 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.portal.service;
import com.axelor.auth.db.User;
import java.util.Map;
public interface ClientViewService {
public User getClientUser();
public Map<String, Object> updateClientViewIndicators();
/* Project */
public String getTotalProjectsOfUser(User user);
public String getNewTasksOfUser(User user);
public String getTasksInProgressOfUser(User user);
public String getTasksDueOfUser(User user);
/* SaleOrder */
public String getOrdersInProgressOfUser(User user);
public String getQuotationsOfUser(User user);
public String getLastOrderOfUser(User user);
/* StockMove */
public String getLastDeliveryOfUser(User user);
public String getNextDeliveryOfUser(User user);
public String getPlannedDeliveriesOfUser(User user);
public String getReversionsOfUser(User user);
/* Invoice */
public String getOverdueInvoicesOfUser(User user);
public String getAwaitingInvoicesOfUser(User user);
public String getTotalRemainingOfUser(User user);
public String getRefundOfUser(User user);
/* Ticket */
public String getTicketsOfUser(User user);
public String getCompanyTicketsOfUser(User user);
public String getResolvedTicketsOfUser(User user);
public String getLateTicketsOfUser(User user);
}

View File

@ -0,0 +1,501 @@
/*
* 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.portal.service;
import com.axelor.apps.account.db.Invoice;
import com.axelor.apps.account.db.repo.InvoiceRepository;
import com.axelor.apps.base.service.user.UserService;
import com.axelor.apps.helpdesk.db.Ticket;
import com.axelor.apps.helpdesk.db.repo.TicketRepository;
import com.axelor.apps.project.db.Project;
import com.axelor.apps.project.db.repo.ProjectRepository;
import com.axelor.apps.sale.db.SaleOrder;
import com.axelor.apps.sale.db.repo.SaleOrderRepository;
import com.axelor.apps.stock.db.StockMove;
import com.axelor.apps.stock.db.repo.StockMoveRepository;
import com.axelor.auth.db.User;
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.inject.Inject;
import java.math.BigDecimal;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ClientViewServiceImpl implements ClientViewService {
protected SaleOrderRepository saleOrderRepo;
protected StockMoveRepository stockMoveRepo;
protected ProjectRepository projectRepo;
protected TicketRepository ticketRepo;
protected InvoiceRepository invoiceRepo;
protected TeamTaskRepository teamTaskRepo;
protected static final DateTimeFormatter DATE_FORMATTER =
DateTimeFormatter.ofPattern("dd/MM/yyyy");
static final String CLIENT_PORTAL_NO_DATE = /*$$(*/ "None" /*)*/;
@Inject
public ClientViewServiceImpl(
SaleOrderRepository saleOrderRepo,
StockMoveRepository stockMoveRepo,
ProjectRepository projectRepo,
TicketRepository ticketRepo,
InvoiceRepository invoiceRepo,
TeamTaskRepository teamTaskRepo) {
this.saleOrderRepo = saleOrderRepo;
this.stockMoveRepo = stockMoveRepo;
this.projectRepo = projectRepo;
this.ticketRepo = ticketRepo;
this.invoiceRepo = invoiceRepo;
this.teamTaskRepo = teamTaskRepo;
}
@Override
public User getClientUser() {
return Beans.get(UserService.class).getUser();
}
@Override
public Map<String, Object> updateClientViewIndicators() {
Map<String, Object> map = new HashMap<>();
User user = getClientUser();
/* SaleOrder */
map.put("$ordersInProgress", getOrdersInProgressIndicator(user));
map.put("$myQuotation", getQuotationsIndicator(user));
map.put("$lastOrder", getLastOrderIndicator(user));
/* StockMove */
map.put("$lastDelivery", getLastDeliveryIndicator(user));
map.put("$nextDelivery", getNextDeliveryIndicator(user));
map.put("$plannedDeliveries", getPlannedDeliveriesIndicator(user));
map.put("$myReversions", getReversionsIndicator(user));
/* Invoice */
map.put("$overdueInvoices", getOverdueInvoicesIndicator(user));
map.put("$awaitingInvoices", getAwaitingInvoicesIndicator(user));
map.put("$totalRemaining", getTotalRemainingIndicator(user));
map.put("$myRefund", getRefundIndicator(user));
/* Helpdesk */
map.put("$customerTickets", getCustomerTicketsIndicator(user));
map.put("$companyTickets", getCompanyTicketsIndicator(user));
map.put("$resolvedTickets", getResolvedTicketsIndicator(user));
map.put("$lateTickets", getLateTicketsIndicator(user));
/* Project */
map.put("$totalProjects", getTotalProjectsIndicator(user));
map.put("$newTasks", getNewTasksIndicator(user));
map.put("$tasksInProgress", getTasksInProgressIndicator(user));
map.put("$tasksDue", getTasksDueIndicator(user));
return map;
}
/* SaleOrder Indicators */
protected Integer getOrdersInProgressIndicator(User user) {
List<SaleOrder> saleOrderList =
saleOrderRepo.all().filter(getOrdersInProgressOfUser(user)).fetch();
return !saleOrderList.isEmpty() ? saleOrderList.size() : 0;
}
protected Integer getQuotationsIndicator(User user) {
List<SaleOrder> saleOrderList = saleOrderRepo.all().filter(getQuotationsOfUser(user)).fetch();
return !saleOrderList.isEmpty() ? saleOrderList.size() : 0;
}
protected String getLastOrderIndicator(User user) {
SaleOrder saleOrder = saleOrderRepo.all().filter(getLastOrderOfUser(user)).fetchOne();
if (saleOrder == null) {
return I18n.get(CLIENT_PORTAL_NO_DATE);
}
return saleOrder.getConfirmationDateTime() != null
? saleOrder.getConfirmationDateTime().format(DATE_FORMATTER)
: I18n.get(CLIENT_PORTAL_NO_DATE);
}
/* StockMove Indicators */
protected String getLastDeliveryIndicator(User user) {
StockMove stockMove = stockMoveRepo.all().filter(getLastDeliveryOfUser(user)).fetchOne();
if (stockMove == null) {
return I18n.get(CLIENT_PORTAL_NO_DATE);
}
return stockMove.getRealDate() != null
? stockMove.getRealDate().format(DATE_FORMATTER)
: I18n.get(CLIENT_PORTAL_NO_DATE);
}
protected String getNextDeliveryIndicator(User user) {
StockMove stockMove = stockMoveRepo.all().filter(getNextDeliveryOfUser(user)).fetchOne();
if (stockMove == null) {
return I18n.get(CLIENT_PORTAL_NO_DATE);
}
return stockMove.getEstimatedDate() != null
? stockMove.getEstimatedDate().format(DATE_FORMATTER)
: I18n.get(CLIENT_PORTAL_NO_DATE);
}
protected Integer getPlannedDeliveriesIndicator(User user) {
List<StockMove> stockMoveList =
stockMoveRepo.all().filter(getPlannedDeliveriesOfUser(user)).fetch();
return !stockMoveList.isEmpty() ? stockMoveList.size() : 0;
}
protected Integer getReversionsIndicator(User user) {
List<StockMove> stockMoveList = stockMoveRepo.all().filter(getReversionsOfUser(user)).fetch();
return !stockMoveList.isEmpty() ? stockMoveList.size() : 0;
}
/* Invoice Indicators */
protected Integer getOverdueInvoicesIndicator(User user) {
List<Invoice> invoiceList = invoiceRepo.all().filter(getOverdueInvoicesOfUser(user)).fetch();
return !invoiceList.isEmpty() ? invoiceList.size() : 0;
}
protected Integer getAwaitingInvoicesIndicator(User user) {
List<Invoice> invoiceList = invoiceRepo.all().filter(getAwaitingInvoicesOfUser(user)).fetch();
return !invoiceList.isEmpty() ? invoiceList.size() : 0;
}
protected String getTotalRemainingIndicator(User user) {
List<Invoice> invoiceList = invoiceRepo.all().filter(getTotalRemainingOfUser(user)).fetch();
if (!invoiceList.isEmpty()) {
BigDecimal total =
invoiceList
.stream()
.map(Invoice::getAmountRemaining)
.reduce((x, y) -> x.add(y))
.orElse(BigDecimal.ZERO);
return total.toString() + invoiceList.get(0).getCurrency().getSymbol();
}
return BigDecimal.ZERO.toString();
}
protected Integer getRefundIndicator(User user) {
List<Invoice> invoiceList = invoiceRepo.all().filter(getRefundOfUser(user)).fetch();
return !invoiceList.isEmpty() ? invoiceList.size() : 0;
}
/* Helpdesk Indicators */
protected Integer getCustomerTicketsIndicator(User user) {
List<Ticket> ticketList = ticketRepo.all().filter(getTicketsOfUser(user)).fetch();
return !ticketList.isEmpty() ? ticketList.size() : 0;
}
protected Integer getCompanyTicketsIndicator(User user) {
List<Ticket> ticketList = ticketRepo.all().filter(getCompanyTicketsOfUser(user)).fetch();
return !ticketList.isEmpty() ? ticketList.size() : 0;
}
protected Integer getResolvedTicketsIndicator(User user) {
List<Ticket> ticketList = ticketRepo.all().filter(getResolvedTicketsOfUser(user)).fetch();
return !ticketList.isEmpty() ? ticketList.size() : 0;
}
protected Object getLateTicketsIndicator(User user) {
List<Ticket> ticketList = ticketRepo.all().filter(getLateTicketsOfUser(user)).fetch();
return !ticketList.isEmpty() ? ticketList.size() : 0;
}
/* Project Indicators */
protected Integer getTotalProjectsIndicator(User user) {
List<Project> projectList = projectRepo.all().filter(getTotalProjectsOfUser(user)).fetch();
return !projectList.isEmpty() ? projectList.size() : 0;
}
protected Integer getNewTasksIndicator(User user) {
List<TeamTask> teamTaskList = teamTaskRepo.all().filter(getNewTasksOfUser(user)).fetch();
return !teamTaskList.isEmpty() ? teamTaskList.size() : 0;
}
protected Integer getTasksInProgressIndicator(User user) {
List<TeamTask> teamTaskList = teamTaskRepo.all().filter(getTasksInProgressOfUser(user)).fetch();
return !teamTaskList.isEmpty() ? teamTaskList.size() : 0;
}
protected Integer getTasksDueIndicator(User user) {
List<TeamTask> teamTaskList = teamTaskRepo.all().filter(getTasksDueOfUser(user)).fetch();
return !teamTaskList.isEmpty() ? teamTaskList.size() : 0;
}
/* SaleOrder Query */
@Override
public String getOrdersInProgressOfUser(User user) {
String query =
"self.clientPartner.id = "
+ user.getPartner().getId()
+ " AND self.statusSelect = "
+ SaleOrderRepository.STATUS_ORDER_CONFIRMED;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getQuotationsOfUser(User user) {
String query =
"self.clientPartner.id = "
+ user.getPartner().getId()
+ " AND self.statusSelect IN ("
+ SaleOrderRepository.STATUS_DRAFT_QUOTATION
+ ","
+ SaleOrderRepository.STATUS_FINALIZED_QUOTATION
+ ")";
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getLastOrderOfUser(User user) {
String query =
"self.clientPartner.id = "
+ user.getPartner().getId()
+ " AND self.statusSelect = "
+ SaleOrderRepository.STATUS_ORDER_COMPLETED;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
query = query + " ORDER BY self.confirmationDateTime DESC";
return query;
}
/* StockMove Query */
@Override
public String getLastDeliveryOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.typeSelect = "
+ StockMoveRepository.TYPE_OUTGOING
+ " AND self.statusSelect = "
+ StockMoveRepository.STATUS_REALIZED
+ " AND self.isReversion != true";
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
query = query + " ORDER BY self.realDate DESC";
return query;
}
@Override
public String getNextDeliveryOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.typeSelect = "
+ StockMoveRepository.TYPE_OUTGOING
+ " AND self.statusSelect = "
+ StockMoveRepository.STATUS_PLANNED
+ " AND self.isReversion != true";
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
query = query + " ORDER BY self.estimatedDate ASC";
return query;
}
@Override
public String getPlannedDeliveriesOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.typeSelect = "
+ StockMoveRepository.TYPE_OUTGOING
+ " AND self.statusSelect = "
+ StockMoveRepository.STATUS_PLANNED
+ " AND self.isReversion != true";
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getReversionsOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.typeSelect = "
+ StockMoveRepository.TYPE_OUTGOING
+ " AND self.isReversion = true";
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
/* Invoice Query */
@Override
public String getOverdueInvoicesOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.dueDate < current_date() "
+ " AND self.amountRemaining != 0 AND self.statusSelect != "
+ InvoiceRepository.STATUS_DRAFT
+ " AND self.statusSelect != "
+ InvoiceRepository.STATUS_CANCELED;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getAwaitingInvoicesOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.amountRemaining != 0 AND self.statusSelect != "
+ InvoiceRepository.STATUS_DRAFT
+ " AND self.statusSelect != "
+ InvoiceRepository.STATUS_CANCELED;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getTotalRemainingOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.amountRemaining != 0 AND self.statusSelect != "
+ InvoiceRepository.STATUS_DRAFT
+ " AND self.statusSelect != "
+ InvoiceRepository.STATUS_CANCELED;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getRefundOfUser(User user) {
String query =
"self.partner.id = "
+ user.getPartner().getId()
+ " AND self.operationTypeSelect = "
+ InvoiceRepository.OPERATION_TYPE_CLIENT_REFUND;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
/* Helpdesk Query */
@Override
public String getTicketsOfUser(User user) {
return "self.customer.id = "
+ user.getPartner().getId()
+ " AND self.assignedToUser.id = "
+ user.getId();
}
@Override
public String getCompanyTicketsOfUser(User user) {
return "self.customer.id = "
+ user.getPartner().getId()
+ " AND self.assignedToUser.id = "
+ user.getActiveCompany().getId();
}
@Override
public String getResolvedTicketsOfUser(User user) {
return "self.customer.id = "
+ user.getPartner().getId()
+ " AND self.assignedToUser.id = "
+ user.getId()
+ " AND self.statusSelect IN ("
+ TicketRepository.STATUS_RESOLVED
+ ", "
+ TicketRepository.STATUS_CLOSED
+ ")";
}
@Override
public String getLateTicketsOfUser(User user) {
return "self.customer.id = "
+ user.getPartner().getId()
+ " AND self.assignedToUser.id = "
+ user.getId()
+ " AND ((self.endDateT != null AND self.endDateT > self.deadlineDateT) "
+ " OR (self.endDateT = null and self.deadlineDateT < current_date() ) )";
}
/* Project Query */
@Override
public String getTotalProjectsOfUser(User user) {
String query =
"self.isProject = true AND self.clientPartner.id = "
+ user.getPartner().getId()
+ " AND self.statusSelect != "
+ ProjectRepository.STATE_CANCELED;
if (user.getActiveCompany() != null) {
query = query + " AND self.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getNewTasksOfUser(User user) {
String query =
"self.status = 'new' "
+ " AND self.typeSelect = '"
+ TeamTaskRepository.TYPE_TASK
+ "' AND self.project.clientPartner.id = "
+ user.getPartner().getId();
if (user.getActiveCompany() != null) {
query = query + " AND self.project.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getTasksInProgressOfUser(User user) {
String query =
"self.status = 'in-progress'"
+ " AND self.typeSelect = '"
+ TeamTaskRepository.TYPE_TASK
+ "' AND self.project.clientPartner.id = "
+ user.getPartner().getId();
if (user.getActiveCompany() != null) {
query = query + " AND self.project.company.id = " + user.getActiveCompany().getId();
}
return query;
}
@Override
public String getTasksDueOfUser(User user) {
String query =
"self.status IN ('in-progress','new')"
+ " AND self.project.clientPartner.id = "
+ user.getPartner().getId()
+ " AND self.typeSelect = '"
+ TeamTaskRepository.TYPE_TASK
+ "' AND self.taskEndDate < current_date() ";
if (user.getActiveCompany() != null) {
query = query + " AND self.project.company.id = " + user.getActiveCompany().getId();
}
return query;
}
}

View File

@ -0,0 +1,23 @@
/*
* 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.portal.translation;
public interface ITranslation {
public static final String PORTAL_APP_NAME = /*$$(*/ "value:Portal"; /*)*/
}

View File

@ -0,0 +1,386 @@
/*
* 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.portal.web;
import com.axelor.apps.account.db.Invoice;
import com.axelor.apps.helpdesk.db.Ticket;
import com.axelor.apps.portal.service.ClientViewService;
import com.axelor.apps.project.db.Project;
import com.axelor.apps.sale.db.SaleOrder;
import com.axelor.apps.sale.db.repo.SaleOrderRepository;
import com.axelor.apps.stock.db.StockMove;
import com.axelor.apps.stock.db.repo.StockMoveRepository;
import com.axelor.auth.db.User;
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.team.db.TeamTask;
import java.util.Map;
public class ClientViewController {
public void completeClientViewIndicators(ActionRequest request, ActionResponse response) {
try {
Map<String, Object> map;
map = Beans.get(ClientViewService.class).updateClientViewIndicators();
response.setValues(map);
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
/* SALEORDER OnCLick */
public void showClientMyOrdersInProgress(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getOrdersInProgressOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Orders in progress"))
.model(SaleOrder.class.getName())
.add("grid", "sale-order-grid-client")
.add("form", "sale-order-form-client")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyQuotation(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getQuotationsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("My quotations"))
.model(SaleOrder.class.getName())
.add("grid", "sale-order-grid")
.add("form", "sale-order-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyLastOrder(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getLastOrderOfUser(clientUser);
SaleOrder saleOrder = Beans.get(SaleOrderRepository.class).all().filter(domain).fetchOne();
if (saleOrder != null) {
response.setView(
ActionView.define(I18n.get("Last order"))
.model(SaleOrder.class.getName())
.add("form", "sale-order-form-client")
.context("_showRecord", saleOrder.getId())
.map());
}
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
/* PROJECT OnClick */
public void showClientMyTotalProjects(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getTotalProjectsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Total projects"))
.model(Project.class.getName())
.add("grid", "project-grid")
.add("form", "project-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyNewTasks(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getNewTasksOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("New tasks"))
.model(TeamTask.class.getName())
.add("grid", "team-task-grid")
.add("form", "team-task-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyTasksInProgress(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getTasksInProgressOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Tasks in progress"))
.model(TeamTask.class.getName())
.add("grid", "team-task-grid")
.add("form", "team-task-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyTasksDue(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getTasksDueOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Tasks due"))
.model(TeamTask.class.getName())
.add("grid", "team-task-grid")
.add("form", "team-task-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
/* STOCKMOVE OnClick */
public void showClientMyLastDelivery(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getLastDeliveryOfUser(clientUser);
StockMove stockMove = Beans.get(StockMoveRepository.class).all().filter(domain).fetchOne();
if (stockMove != null) {
response.setView(
ActionView.define(I18n.get("Last delivery"))
.model(StockMove.class.getName())
.add("form", "stock-move-form")
.context("_showRecord", stockMove.getId())
.domain(domain)
.map());
}
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyNextDelivery(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getNextDeliveryOfUser(clientUser);
StockMove stockMove = Beans.get(StockMoveRepository.class).all().filter(domain).fetchOne();
if (stockMove != null) {
response.setView(
ActionView.define(I18n.get("Next delivery"))
.model(StockMove.class.getName())
.add("form", "stock-move-form")
.context("_showRecord", stockMove.getId())
.domain(domain)
.map());
}
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyPlannedDeliveries(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getPlannedDeliveriesOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Planned deliveries"))
.model(StockMove.class.getName())
.add("grid", "stock-move-grid")
.add("form", "stock-move-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientReversions(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getReversionsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("My reversions"))
.model(StockMove.class.getName())
.add("grid", "stock-move-grid")
.add("form", "stock-move-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
/* INVOICE OnClick */
public void showClientMyOverdueInvoices(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getOverdueInvoicesOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Overdue invoices"))
.model(Invoice.class.getName())
.add("grid", "invoice-grid")
.add("form", "invoice-client-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyAwaitingInvoices(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getAwaitingInvoicesOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Awaiting invoices"))
.model(Invoice.class.getName())
.add("grid", "invoice-grid")
.add("form", "invoice-client-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyTotalRemaining(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getTotalRemainingOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Total remaining"))
.model(Invoice.class.getName())
.add("grid", "invoice-grid")
.add("form", "invoice-client-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyRefund(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getRefundOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("My refund"))
.model(Invoice.class.getName())
.add("grid", "invoice-refund-grid")
.add("form", "invoice-client-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
/* TICKETS OnClick */
public void showClientMyCustomerTickets(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getTicketsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Customer tickets"))
.model(Ticket.class.getName())
.add("grid", "ticket-grid")
.add("form", "ticket-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyCompanyTickets(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getCompanyTicketsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Company tickets"))
.model(Ticket.class.getName())
.add("grid", "ticket-grid")
.add("form", "ticket-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyResolvedTickets(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getResolvedTicketsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Resolved tickets"))
.model(Ticket.class.getName())
.add("grid", "ticket-grid")
.add("form", "ticket-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
public void showClientMyLateTickets(ActionRequest request, ActionResponse response) {
try {
ClientViewService clientViewService = Beans.get(ClientViewService.class);
User clientUser = clientViewService.getClientUser();
String domain = clientViewService.getLateTicketsOfUser(clientUser);
response.setView(
ActionView.define(I18n.get("Late tickets"))
.model(Ticket.class.getName())
.add("grid", "ticket-grid")
.add("form", "ticket-form")
.domain(domain)
.map());
} catch (Exception e) {
TraceBackService.trace(response, e);
}
}
}

View File

@ -0,0 +1,19 @@
<?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_appPortal.csv" separator=";" type="com.axelor.apps.base.db.AppPortal" call="com.axelor.csv.script.ImportApp:importApp">
<bind column="dependsOn" to="dependsOnSet" search="self.code in :dependsOn" eval="dependsOn.split(',') as List"/>
</input>
</csv-inputs>

View File

@ -0,0 +1,2 @@
"name";"object";"can_read";"can_write";"can_create";"can_remove";"can_export";"condition";"conditionParams";"roleName"
"perm.client.portal.all";"com.axelor.apps.client.portal.db.*";"x";"x";"x";"x";"x";;;"Admin"
1 name object can_read can_write can_create can_remove can_export condition conditionParams roleName
2 perm.client.portal.all com.axelor.apps.client.portal.db.* x x x x x Admin

View File

@ -0,0 +1,2 @@
"name";"code";"installOrder";"description";"imagePath";"modules";"dependsOn";"sequence"
"Portal";"portal";27;"Portal configuration";"app-portal.png";"axelor-client-portal";"base";31
1 name code installOrder description imagePath modules dependsOn sequence
2 Portal portal 27 Portal configuration app-portal.png axelor-client-portal base 31

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,40 @@
<?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="AppPortal" lang="java" extends="App">
<boolean name="manageSaleOrders" title="Manage sale orders" default="true"/>
<boolean name="manageInvoices" title="Manage invoices" default="true"/>
<boolean name="manageTickets" title="Manage tickets" default="true"/>
<boolean name="manageProjects" title="Manage projects" default="true"/>
<boolean name="manageDelivery" title="Manage delivery" default="true"/>
<boolean name="canConfirmOnline" title="Can confirm online" default="true"/>
<boolean name="showCatalog" title="Display product catalog" default="true"/>
<boolean name="canPayOnline" title="Can pay online" default="false"/>
<many-to-many name="onlinePaymentMethodSet" ref="com.axelor.apps.client.portal.db.OnlinePaymentMethod" title="Online payment methods"/>
<integer name="portalSelect" title="Portal" selection="clientportal.extern.or.intern" default="1"/>
<extra-code><![CDATA[
// STATUS SELECT
public static final int ABS_PORTAL = 1;
public static final int EXTERNAL_PORTAL = 2;
]]></extra-code>
<track>
<field name="manageSaleOrders" on="UPDATE"/>
<field name="manageInvoices" on="UPDATE"/>
<field name="manageTickets" on="UPDATE"/>
<field name="manageProjects" on="UPDATE"/>
<field name="manageDelivery" on="UPDATE"/>
<field name="canConfirmOnline" on="UPDATE"/>
<field name="canPayOnline" on="UPDATE"/>
<field name="portalSelect" on="UPDATE"/>
</track>
</entity>
</domain-models>

View File

@ -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="client-portal" package="com.axelor.apps.client.portal.db"/>
<entity name="OnlinePaymentMethod" lang="java" cacheable="true">
<string name="name" title="Name" required="true"/>
<string name="code" title="Code" required="true"/>
</entity>
</domain-models>

View File

@ -0,0 +1,12 @@
<?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="Partner" lang="java">
<string name="password" title="Password"/>
</entity>
</domain-models>

View File

@ -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="sale" package="com.axelor.apps.sale.db"/>
<entity name="SaleOrder" lang="java">
<many-to-one name="electronicSignature" ref="com.axelor.meta.db.MetaFile" title="Electronic signature" />
</entity>
</domain-models>

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal",,,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online",,,
"Can pay online",,,
"Catalog",,,
"Code",,,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature",,,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices",,,
"Manage projects",,,
"Manage sale orders",,,
"Manage tickets",,,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name",,,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method",,,
"Online payment methods",,,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password",,,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal",,,
1 key message comment context
2 ABS portal
3 App Portal
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online
8 Can pay online
9 Catalog
10 Code
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices
25 Manage projects
26 Manage sale orders
27 Manage tickets
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name
39 New tasks
40 Next delivery
41 None
42 Online payment method
43 Online payment methods
44 Order
45 Orders in progress
46 Overdue invoices
47 Password
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","App Portal",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Kann online bestätigen",,
"Can pay online","Kann online bezahlen",,
"Catalog",,,
"Code","Code",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Elektronische Unterschrift",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Rechnungen verwalten",,
"Manage projects",,,
"Manage sale orders","Verwalten von Verkaufsaufträgen",,
"Manage tickets","Tickets verwalten",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Name",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Online-Zahlungsmethode",,
"Online payment methods","Online-Zahlungsmethoden",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","Passwort",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","Wert:Portal",,
1 key message comment context
2 ABS portal
3 App Portal App Portal
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Kann online bestätigen
8 Can pay online Kann online bezahlen
9 Catalog
10 Code Code
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Elektronische Unterschrift
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Rechnungen verwalten
25 Manage projects
26 Manage sale orders Verwalten von Verkaufsaufträgen
27 Manage tickets Tickets verwalten
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Name
39 New tasks
40 Next delivery
41 None
42 Online payment method Online-Zahlungsmethode
43 Online payment methods Online-Zahlungsmethoden
44 Order
45 Orders in progress
46 Overdue invoices
47 Password Passwort
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal Wert:Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal",,,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online",,,
"Can pay online",,,
"Catalog",,,
"Code",,,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature",,,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices",,,
"Manage projects",,,
"Manage sale orders",,,
"Manage tickets",,,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name",,,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method",,,
"Online payment methods",,,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password",,,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal",,,
1 key message comment context
2 ABS portal
3 App Portal
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online
8 Can pay online
9 Catalog
10 Code
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices
25 Manage projects
26 Manage sale orders
27 Manage tickets
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name
39 New tasks
40 Next delivery
41 None
42 Online payment method
43 Online payment methods
44 Order
45 Orders in progress
46 Overdue invoices
47 Password
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","Portal de aplicaciones",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Puede confirmar en línea",,
"Can pay online","Puede pagar en línea",,
"Catalog",,,
"Code","Código",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Firma electrónica",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Gestionar facturas",,
"Manage projects",,,
"Manage sale orders","Gestionar los pedidos de venta",,
"Manage tickets","Gestión de tickets",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Nombre",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Método de pago en línea",,
"Online payment methods","Métodos de pago en línea",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","Contraseña",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","valor:Portal",,
1 key message comment context
2 ABS portal
3 App Portal Portal de aplicaciones
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Puede confirmar en línea
8 Can pay online Puede pagar en línea
9 Catalog
10 Code Código
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Firma electrónica
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Gestionar facturas
25 Manage projects
26 Manage sale orders Gestionar los pedidos de venta
27 Manage tickets Gestión de tickets
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Nombre
39 New tasks
40 Next delivery
41 None
42 Online payment method Método de pago en línea
43 Online payment methods Métodos de pago en línea
44 Order
45 Orders in progress
46 Overdue invoices
47 Password Contraseña
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal valor:Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal","Portail ABS",,
"App Portal","App Portail",,
"Assign to customer","Assigné au client",,
"Assign to supplier","Assigné au fournisseur",,
"Awaiting invoices","En attente de paiement",,
"Can confirm online","Peut confimer en ligne",,
"Can pay online","Peut payer en ligne",,
"Catalog","Catalogue produit",,
"Code",,,
"Company tickets","Tickets société",,
"Customer helpdesk","Support client",,
"Customer tickets","Tickets clients",,
"Delivery","Livraison",,
"Display product catalog","Afficher le catalogue produit",,
"Electronic signature","Signature électronique",,
"External portal","Portail externe",,
"Helpdesk","Support client",,
"Invoicing","Facturation",,
"Last delivery","Dernière livraison",,
"Last order","Dernière commande",,
"Late tickets","Tickets en retard",,
"Manage delivery","Gérer les livraisons",,
"Manage invoices","Gérer les factures",,
"Manage projects","Gérer les projets",,
"Manage sale orders","Gérer les devis/cmdes client",,
"Manage tickets","Gérer les tickets",,
"Modules",,,
"Months","Mois",,
"My deliveries","Mes livraisons",,
"My invoices","Mes factures",,
"My projects","Mes projets",,
"My quotations","Mes devis",,
"My refund","Mes avoirs",,
"My reversions","Mes retours",,
"My space","Mon espace",,
"My tickets","Mes tickets",,
"Name","Nom",,
"New tasks","Nouvelles tâches",,
"Next delivery","Prochaine livraison",,
"None","Aucune",,
"Online payment method","Méthode de paiement en ligne",,
"Online payment methods","Méthodes de paiement en ligne",,
"Order","Commande",,
"Orders in progress","Commandes en cours",,
"Overdue invoices","En retard de paiement",,
"Password","Mot de passe",,
"Planned deliveries","Livraisons prévues",,
"Portal","Portail",,
"Project","Projet",,
"Projects","Projets",,
"Resolved tickets","Tickets résolus",,
"Sale order","Commande",,
"Sum","Somme",,
"Sum of last 4 months invoices","Somme des factures des 4 derniers mois",,
"Tasks due","Tâches en retard",,
"Tasks in progress","Tâches en cours",,
"Total projects","Total des projets",,
"Total remaining","Total restant",,
"chart",,,
"value:Portal","Portal",,
1 key message comment context
2 ABS portal Portail ABS
3 App Portal App Portail
4 Assign to customer Assigné au client
5 Assign to supplier Assigné au fournisseur
6 Awaiting invoices En attente de paiement
7 Can confirm online Peut confimer en ligne
8 Can pay online Peut payer en ligne
9 Catalog Catalogue produit
10 Code
11 Company tickets Tickets société
12 Customer helpdesk Support client
13 Customer tickets Tickets clients
14 Delivery Livraison
15 Display product catalog Afficher le catalogue produit
16 Electronic signature Signature électronique
17 External portal Portail externe
18 Helpdesk Support client
19 Invoicing Facturation
20 Last delivery Dernière livraison
21 Last order Dernière commande
22 Late tickets Tickets en retard
23 Manage delivery Gérer les livraisons
24 Manage invoices Gérer les factures
25 Manage projects Gérer les projets
26 Manage sale orders Gérer les devis/cmdes client
27 Manage tickets Gérer les tickets
28 Modules
29 Months Mois
30 My deliveries Mes livraisons
31 My invoices Mes factures
32 My projects Mes projets
33 My quotations Mes devis
34 My refund Mes avoirs
35 My reversions Mes retours
36 My space Mon espace
37 My tickets Mes tickets
38 Name Nom
39 New tasks Nouvelles tâches
40 Next delivery Prochaine livraison
41 None Aucune
42 Online payment method Méthode de paiement en ligne
43 Online payment methods Méthodes de paiement en ligne
44 Order Commande
45 Orders in progress Commandes en cours
46 Overdue invoices En retard de paiement
47 Password Mot de passe
48 Planned deliveries Livraisons prévues
49 Portal Portail
50 Project Projet
51 Projects Projets
52 Resolved tickets Tickets résolus
53 Sale order Commande
54 Sum Somme
55 Sum of last 4 months invoices Somme des factures des 4 derniers mois
56 Tasks due Tâches en retard
57 Tasks in progress Tâches en cours
58 Total projects Total des projets
59 Total remaining Total restant
60 chart
61 value:Portal Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","Portale delle applicazioni",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Può confermare online",,
"Can pay online","Può pagare online",,
"Catalog",,,
"Code","Codice",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Firma elettronica",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Gestire le fatture",,
"Manage projects",,,
"Manage sale orders","Gestire gli ordini di vendita",,
"Manage tickets","Gestire i biglietti",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Nome",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Metodo di pagamento online",,
"Online payment methods","Metodi di pagamento online",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","La password",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","valore:Portale",,
1 key message comment context
2 ABS portal
3 App Portal Portale delle applicazioni
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Può confermare online
8 Can pay online Può pagare online
9 Catalog
10 Code Codice
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Firma elettronica
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Gestire le fatture
25 Manage projects
26 Manage sale orders Gestire gli ordini di vendita
27 Manage tickets Gestire i biglietti
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Nome
39 New tasks
40 Next delivery
41 None
42 Online payment method Metodo di pagamento online
43 Online payment methods Metodi di pagamento online
44 Order
45 Orders in progress
46 Overdue invoices
47 Password La password
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal valore:Portale

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","App Portal",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Kan online bevestigen",,
"Can pay online","Kan online betalen",,
"Catalog",,,
"Code","Code",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Elektronische handtekening",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Facturen beheren",,
"Manage projects",,,
"Manage sale orders","Verkooporders beheren",,
"Manage tickets","Beheer tickets",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Naam",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Online betaalmethode",,
"Online payment methods","Online betaalmethoden",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","Wachtwoord",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","waarde: Portaal",,
1 key message comment context
2 ABS portal
3 App Portal App Portal
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Kan online bevestigen
8 Can pay online Kan online betalen
9 Catalog
10 Code Code
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Elektronische handtekening
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Facturen beheren
25 Manage projects
26 Manage sale orders Verkooporders beheren
27 Manage tickets Beheer tickets
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Naam
39 New tasks
40 Next delivery
41 None
42 Online payment method Online betaalmethode
43 Online payment methods Online betaalmethoden
44 Order
45 Orders in progress
46 Overdue invoices
47 Password Wachtwoord
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal waarde: Portaal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","Portal App Portal",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Potwierdź online",,
"Can pay online","Może płacić online",,
"Catalog",,,
"Code","Kod",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Podpis elektroniczny",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Zarządzanie fakturami",,
"Manage projects",,,
"Manage sale orders","Zarządzanie zleceniami sprzedaży",,
"Manage tickets","Zarządzaj biletami",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Nazwa",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Metoda płatności online",,
"Online payment methods","Metody płatności online",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","Hasło",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","wartość: Portal",,
1 key message comment context
2 ABS portal
3 App Portal Portal App Portal
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Potwierdź online
8 Can pay online Może płacić online
9 Catalog
10 Code Kod
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Podpis elektroniczny
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Zarządzanie fakturami
25 Manage projects
26 Manage sale orders Zarządzanie zleceniami sprzedaży
27 Manage tickets Zarządzaj biletami
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Nazwa
39 New tasks
40 Next delivery
41 None
42 Online payment method Metoda płatności online
43 Online payment methods Metody płatności online
44 Order
45 Orders in progress
46 Overdue invoices
47 Password Hasło
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal wartość: Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","Portal de Aplicações",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Pode confirmar online",,
"Can pay online","Pode pagar online",,
"Catalog",,,
"Code","Código",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Assinatura electrónica",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Administrar faturas",,
"Manage projects",,,
"Manage sale orders","Administrar ordens de venda",,
"Manage tickets","Gerir bilhetes",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Nome e Sobrenome",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Método de pagamento online",,
"Online payment methods","Métodos de pagamento online",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","Senha",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","valor:Portal",,
1 key message comment context
2 ABS portal
3 App Portal Portal de Aplicações
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Pode confirmar online
8 Can pay online Pode pagar online
9 Catalog
10 Code Código
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Assinatura electrónica
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Administrar faturas
25 Manage projects
26 Manage sale orders Administrar ordens de venda
27 Manage tickets Gerir bilhetes
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Nome e Sobrenome
39 New tasks
40 Next delivery
41 None
42 Online payment method Método de pagamento online
43 Online payment methods Métodos de pagamento online
44 Order
45 Orders in progress
46 Overdue invoices
47 Password Senha
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal valor:Portal

View File

@ -0,0 +1,61 @@
"key","message","comment","context"
"ABS portal",,,
"App Portal","App Portal",,
"Assign to customer",,,
"Assign to supplier",,,
"Awaiting invoices",,,
"Can confirm online","Может подтвердить онлайн",,
"Can pay online","Можно оплатить онлайн",,
"Catalog",,,
"Code","Код",,
"Company tickets",,,
"Customer helpdesk",,,
"Customer tickets",,,
"Delivery",,,
"Display product catalog",,,
"Electronic signature","Электронная подпись",,
"External portal",,,
"Helpdesk",,,
"Invoicing",,,
"Last delivery",,,
"Last order",,,
"Late tickets",,,
"Manage delivery",,,
"Manage invoices","Управление счетами-фактурами",,
"Manage projects",,,
"Manage sale orders","Управление заказами на продажу",,
"Manage tickets","Управлять билетами",,
"Modules",,,
"Months",,,
"My deliveries",,,
"My invoices",,,
"My projects",,,
"My quotations",,,
"My refund",,,
"My reversions",,,
"My space",,,
"My tickets",,,
"Name","Имя",,
"New tasks",,,
"Next delivery",,,
"None",,,
"Online payment method","Онлайн-оплата",,
"Online payment methods","Способы оплаты онлайн",,
"Order",,,
"Orders in progress",,,
"Overdue invoices",,,
"Password","Пароль",,
"Planned deliveries",,,
"Portal",,,
"Project",,,
"Projects",,,
"Resolved tickets",,,
"Sale order",,,
"Sum",,,
"Sum of last 4 months invoices",,,
"Tasks due",,,
"Tasks in progress",,,
"Total projects",,,
"Total remaining",,,
"chart",,,
"value:Portal","значение:Портал",,
1 key message comment context
2 ABS portal
3 App Portal App Portal
4 Assign to customer
5 Assign to supplier
6 Awaiting invoices
7 Can confirm online Может подтвердить онлайн
8 Can pay online Можно оплатить онлайн
9 Catalog
10 Code Код
11 Company tickets
12 Customer helpdesk
13 Customer tickets
14 Delivery
15 Display product catalog
16 Electronic signature Электронная подпись
17 External portal
18 Helpdesk
19 Invoicing
20 Last delivery
21 Last order
22 Late tickets
23 Manage delivery
24 Manage invoices Управление счетами-фактурами
25 Manage projects
26 Manage sale orders Управление заказами на продажу
27 Manage tickets Управлять билетами
28 Modules
29 Months
30 My deliveries
31 My invoices
32 My projects
33 My quotations
34 My refund
35 My reversions
36 My space
37 My tickets
38 Name Имя
39 New tasks
40 Next delivery
41 None
42 Online payment method Онлайн-оплата
43 Online payment methods Способы оплаты онлайн
44 Order
45 Orders in progress
46 Overdue invoices
47 Password Пароль
48 Planned deliveries
49 Portal
50 Project
51 Projects
52 Resolved tickets
53 Sale order
54 Sum
55 Sum of last 4 months invoices
56 Tasks due
57 Tasks in progress
58 Total projects
59 Total remaining
60 chart
61 value:Portal значение:Портал

View File

@ -0,0 +1,17 @@
<?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="portal_role.csv" separator=";" type="com.axelor.auth.db.Role" search="self.name = :name"/>
<input file="portal_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>
</csv-inputs>

View File

@ -0,0 +1,4 @@
"name";"object";"can_read";"can_write";"can_create";"can_remove";"can_export";"condition";"conditionParams";"roleName"
"perm.client.portal.OnlinePaymentMethod;r";"com.axelor.apps.client.portal.db.OnlinePaymentMethod";"x";;;;;;;"Portal Read"
"perm.client.portal.OnlinePaymentMethod;rwc";"com.axelor.apps.client.portal.db.OnlinePaymentMethod";"x";"x";"x";;;;;"Portal User"
"perm.client.portal.OnlinePaymentMethod;rwcde";"com.axelor.apps.client.portal.db.OnlinePaymentMethod";"x";"x";"x";"x";"x";;;"Portal Manager"
1 name object can_read can_write can_create can_remove can_export condition conditionParams roleName
2 perm.client.portal.OnlinePaymentMethod;r com.axelor.apps.client.portal.db.OnlinePaymentMethod x Portal Read
3 perm.client.portal.OnlinePaymentMethod;rwc com.axelor.apps.client.portal.db.OnlinePaymentMethod x x x Portal User
4 perm.client.portal.OnlinePaymentMethod;rwcde com.axelor.apps.client.portal.db.OnlinePaymentMethod x x x x x Portal Manager

View File

@ -0,0 +1,4 @@
"name";"description"
"Portal Read";
"Portal User";
"Portal Manager";
1 name description
2 Portal Read
3 Portal User
4 Portal Manager

View File

@ -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">
<form name="app-portal-config-form" title="App Portal" model="com.axelor.apps.base.db.AppPortal" canDelete="false" canNew="false" width="large">
<panel name="appPortalConfigPanel" colSpan="12">
<panel name="moduleManager" colSpan="12" title="Modules">
<field name="manageSaleOrders" widget="boolean-switch"/>
<field name="manageInvoices" widget="boolean-switch"/>
<field name="manageDelivery" widget="boolean-switch"/>
<field name="manageTickets" widget="boolean-switch"/>
<field name="manageProjects" widget="boolean-switch"/>
<field name="showCatalog" widget="boolean-switch"/>
</panel>
<panel name="portalSelectConfigPanel" colSpan="12">
<field name="portalSelect"/>
<panel name="onlineActionPanel" colSpan="12">
<field name="canConfirmOnline" widget="boolean-switch" showIf="portalSelect == 2"/>
<field name="canPayOnline" widget="boolean-switch" showIf="portalSelect == 2"/>
<field name="onlinePaymentMethodSet" colSpan="12" showIf="manageInvoices &amp;&amp; canPayOnline"/>
</panel>
</panel>
</panel>
<panel-mail name="mailPanel">
<mail-messages limit="4"/>
<mail-followers/>
</panel-mail>
</form>
</object-views>

View File

@ -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">
<chart name="chart.client.portal.sum.invoices.four.months" title="Sum of last 4 months invoices">
<dataset type="jpql">
<![CDATA[
SELECT
SUM(self.inTaxTotal) AS amount,
MONTH(self.invoiceDate) AS month
FROM
Invoice self
WHERE
self.invoiceDate >= :fromDate
GROUP BY
MONTH(self.invoiceDate)
ORDER BY
month
]]>
</dataset>
<category key="month" type="month" title="Months" />
<series key="amount" type="bar" title="Sum" />
</chart>
<action-view name="dashlet.client.portal.sum.invoices.four.months" title="chart">
<view type="chart" name="chart.client.portal.sum.invoices.four.months"/>
<context name="fromDate" expr="eval: java.time.LocalDate.now().minusMonths(3)"/>
</action-view>
</object-views>

View File

@ -0,0 +1,215 @@
<?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="wizard-client-form" title="My space" model="com.axelor.apps.base.db.Wizard" onNew="action-group-client-view-onnew" width="large" editable="false" canDelete="false" canEdit="false" canNew="false" canSave="false" canCopy="false" canArchive="false" canAttach="false">
<panel name="moduleIconPanel" colSpan="12">
<panel name="mainModulePanel" colSpan="10" itemSpan="2" colOffset="2">
<button name="myProjectsBtn" title="Project" onClick="wizard-client-form-open-my-projects" css="img-button client-img-menu btn-default" icon="img/128px/app-project.png" if-module="axelor-project" />
<button name="myQuotationsBtn" title="Sale order" onClick="wizard-client-form-open-my-quotations" css="img-button client-img-menu btn-default" icon="img/128px/app-sale.png" if-module="axelor-sale" />
<button name="myInvoicesBtn" title="Invoicing" onClick="wizard-client-form-open-my-invoices" css="img-button client-img-menu btn-default" icon="img/128px/app-invoice.png" if-module="axelor-account" />
<button name="myDeliveriesBtn" title="Delivery" onClick="wizard-client-form-open-my-deliveries" css="img-button client-img-menu btn-default" icon="img/128px/app-stock.png" if-module="axelor-stock" />
<button name="myTicketsBtn" title="Helpdesk" onClick="wizard-client-form-open-my-tickets" css="img-button client-img-menu btn-default" icon="img/128px/app-helpdesk.png" if-module="axelor-helpdesk" />
<button name="myCatalogBtn" title="Catalog" onClick="wizard-client-form-open-my-catalog" css="img-button client-img-menu btn-default" icon="img/128px/product-default_100.png" />
</panel>
</panel>
<panel name="indicatorsPanel" colSpan="12">
<panel name="mainDashboardPanel" colSpan="10" itemSpan="2" colOffset="2">
<panel name="projectPanel" title="Project" if-module="axelor-project" itemSpan="12" hidden="true">
<button name="$totalProjects" title="Projects" width="190px" widget="info-button" onClick="action-method-show-client-view-total-projects" />
<button name="$newTasks" title="New tasks" width="190px" widget="info-button" onClick="action-method-show-client-view-new-tasks"/>
<button name="$tasksInProgress" title="Tasks in progress" width="190px" widget="info-button" onClick="action-method-show-client-view-tasks-progress"/>
<button name="$tasksDue" title="Tasks due" width="190px" widget="info-button" onClick="action-method-show-client-view-tasks-due"/>
</panel>
<panel name="saleOrderPanel" title="Order" if-module="axelor-sale" itemSpan="12" hidden="true">
<button name="$myQuotation" title="My quotations" width="190px" widget="info-button" onClick="action-method-show-client-view-my-quotation"/>
<button name="$ordersInProgress" title="Orders in progress" width="190px" widget="info-button" onClick="action-method-show-client-view-orders-in-progress" />
<button name="$lastOrder" title="Last order" width="190px" widget="info-button" onClick="action-method-show-client-view-last-order"/>
</panel>
<panel name="invoicePanel" title="Invoicing" if-module="axelor-account" itemSpan="12" hidden="true">
<button name="$overdueInvoices" title="Overdue invoices" width="190px" widget="info-button" onClick="action-method-show-client-view-overdue-invoices"/>
<button name="$awaitingInvoices" title="Awaiting invoices" width="190px" widget="info-button" onClick="action-method-show-client-view-awaiting-invoices"/>
<button name="$totalRemaining" title="Total remaining" width="190px" widget="info-button" onClick="action-method-show-client-view-total-remaining"/>
<button name="$myRefund" title="My refund" width="190px" widget="info-button" onClick="action-method-show-client-view-refund"/>
</panel>
<panel name="deliveryPanel" title="Delivery" if-module="axelor-stock" itemSpan="12" hidden="true">
<button name="$lastDelivery" title="Last delivery" width="190px" widget="info-button" onClick="action-method-show-client-view-last-delivery"/>
<button name="$nextDelivery" title="Next delivery" width="190px" widget="info-button" onClick="action-method-show-client-view-next-delivery"/>
<button name="$plannedDeliveries" title="Planned deliveries" width="190px" widget="info-button" onClick="action-method-show-client-view-planned-deliveries"/>
<button name="$myReversions" title="My reversions" width="190px" widget="info-button" onClick="action-method-show-client-view-reversions"/>
</panel>
<panel name="ticketPanel" title="Customer helpdesk" if-module="axelor-helpdesk" itemSpan="12" hidden="true">
<button name="$customerTickets" title="Assign to customer" width="190px" widget="info-button" onClick="action-method-show-client-view-customer-tickets"/>
<button name="$companyTickets" title="Assign to supplier" width="190px" widget="info-button" onClick="action-method-show-client-view-company-tickets"/>
<button name="$resolvedTickets" title="Resolved tickets" width="190px" height="100px" widget="info-button" onClick="action-method-show-client-view-resolved-tickets" />
<button name="$lateTickets" title="Late tickets" width="190px" height="100px" widget="info-button" onClick="action-method-show-client-view-late-tickets" />
</panel>
</panel>
<panel-dashlet colSpan="12" name="dashletSumInvoices" action="dashlet.client.portal.sum.invoices.four.months" hidden="true"/>
</panel>
</form>
<action-group name="action-group-client-view-onnew">
<action name="action-method-complete-client-view-indicators"/>
<action name="action-attrs-client-view-hide-modules"/>
</action-group>
<action-attrs name="action-attrs-client-view-hide-modules">
<attribute name="hidden" for="myQuotationsBtn" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageSaleOrders())"/>
<attribute name="hidden" for="saleOrderPanel" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageSaleOrders())"/>
<attribute name="hidden" for="myInvoicesBtn" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageInvoices())"/>
<attribute name="hidden" for="invoicePanel" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageInvoices())"/>
<attribute name="hidden" for="dashletSumInvoices" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageInvoices())"/>
<attribute name="hidden" for="myTicketsBtn" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageTickets())"/>
<attribute name="hidden" for="ticketPanel" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageTickets())"/>
<attribute name="hidden" for="myProjectsBtn" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageProjects())"/>
<attribute name="hidden" for="projectPanel" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageProjects())"/>
<attribute name="hidden" for="myDeliveriesBtn" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageDelivery())"/>
<attribute name="hidden" for="deliveryPanel" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getManageDelivery())"/>
<attribute name="hidden" for="myCatalogBtn" expr="eval: !(__config__.app.isApp('portal') &amp;&amp; __config__.app.getApp('portal').getShowCatalog())"/>
</action-attrs>
<action-view name="wizard-client-form-open-my-catalog" title="Catalog"
model="com.axelor.apps.base.db.Product" >
<view type="cards" name="product-cards" />
<view type="grid" name="product-grid" />
<view type="form" name="product-form" />
<domain>self.sellable = true</domain>
</action-view>
<action-view name="wizard-client-form-open-my-tickets" title="My tickets"
model="com.axelor.apps.helpdesk.db.Ticket" >
<view type="grid" name="ticket-grid"/>
<view type="form" name="ticket-form" />
<domain>self.customer = :_myPartner or self.assignedToUser =:_user</domain>
<context name="_myPartner" expr="eval:__user__.partner"/>
<context name="_user" expr="eval:__user__"/>
</action-view>
<action-view name="wizard-client-form-open-my-projects" title="My projects"
model="com.axelor.apps.project.db.Project" >
<view type="grid" name="business-project-grid"/>
<view type="form" name="project-form" />
<domain>self.clientPartner = :_myPartner</domain>
<context name="_myPartner" expr="eval:__user__.partner"/>
</action-view>
<action-view name="wizard-client-form-open-my-quotations" title="My quotations"
model="com.axelor.apps.sale.db.SaleOrder" >
<view type="grid" name="sale-order-grid-client"/>
<view type="form" name="sale-order-form-client" />
<domain>self.clientPartner = :_myPartner</domain>
<context name="_myPartner" expr="eval:__user__.partner"/>
</action-view>
<action-view name="wizard-client-form-open-my-invoices" title="My invoices"
model="com.axelor.apps.account.db.Invoice" >
<view type="grid" name="invoice-grid"/>
<view type="form" name="invoice-client-form" />
<domain>self.partner = :_myPartner</domain>
<context name="_myPartner" expr="eval:__user__.partner"/>
</action-view>
<action-view name="wizard-client-form-open-my-deliveries" title="My deliveries"
model="com.axelor.apps.stock.db.StockMove" >
<view type="grid" name="stock-move-grid"/>
<view type="form" name="stock-move-form" />
<domain>self.partner = :_myPartner</domain>
<context name="_myPartner" expr="eval:__user__.partner"/>
</action-view>
<action-method name="action-method-complete-client-view-indicators" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="completeClientViewIndicators"/>
</action-method>
<!-- Project OnClick -->
<action-method name="action-method-show-client-view-total-projects" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyTotalProjects"/>
</action-method>
<action-method name="action-method-show-client-view-new-tasks" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyNewTasks"/>
</action-method>
<action-method name="action-method-show-client-view-tasks-progress" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyTasksInProgress"/>
</action-method>
<action-method name="action-method-show-client-view-tasks-due" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyTasksDue"/>
</action-method>
<!-- SaleOrder OnClick -->
<action-method name="action-method-show-client-view-orders-in-progress" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyOrdersInProgress"/>
</action-method>
<action-method name="action-method-show-client-view-my-quotation" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyQuotation"/>
</action-method>
<action-method name="action-method-show-client-view-last-order" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyLastOrder"/>
</action-method>
<!-- StockMove OnClick -->
<action-method name="action-method-show-client-view-last-delivery" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyLastDelivery"/>
</action-method>
<action-method name="action-method-show-client-view-next-delivery" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyNextDelivery"/>
</action-method>
<action-method name="action-method-show-client-view-planned-deliveries" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyPlannedDeliveries"/>
</action-method>
<action-method name="action-method-show-client-view-reversions" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientReversions"/>
</action-method>
<!-- Invoice OnClick -->
<action-method name="action-method-show-client-view-overdue-invoices" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyOverdueInvoices"/>
</action-method>
<action-method name="action-method-show-client-view-awaiting-invoices" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyAwaitingInvoices"/>
</action-method>
<action-method name="action-method-show-client-view-total-remaining" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyTotalRemaining"/>
</action-method>
<action-method name="action-method-show-client-view-refund" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyRefund"/>
</action-method>
<!-- Ticket OnClick -->
<action-method name="action-method-show-client-view-customer-tickets" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyCustomerTickets"/>
</action-method>
<action-method name="action-method-show-client-view-company-tickets" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyCompanyTickets"/>
</action-method>
<action-method name="action-method-show-client-view-resolved-tickets" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyResolvedTickets"/>
</action-method>
<action-method name="action-method-show-client-view-late-tickets" model="com.axelor.apps.base.db.Wizard">
<call class="com.axelor.apps.portal.web.ClientViewController" method="showClientMyLateTickets"/>
</action-method>
<action-view name="wizard-client-view" model="com.axelor.apps.base.db.Wizard" title="My space">
<view name="wizard-client-form" type="form"/>
</action-view>
</object-views>

View File

@ -0,0 +1,17 @@
<?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="online-payment-method-grid" title="Online payment methods" model="com.axelor.apps.client.portal.db.OnlinePaymentMethod">
<field name="name"/>
<field name="code" x-bind="{{code|unaccent|uppercase}}"/>
</grid>
<form name="online-payment-method-form" title="Online payment method" model="com.axelor.apps.client.portal.db.OnlinePaymentMethod">
<panel name="mainPanel" >
<field name="name"/>
<field name="code" x-bind="{{code|unaccent|uppercase}}"/>
</panel>
</form>
</object-views>

View File

@ -0,0 +1,12 @@
<?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='clientportal.extern.or.intern'>
<option value='1'>ABS portal</option>
<option value='2'>External portal</option>
</selection>
</object-views>