First commit waiting for Budget Alert
This commit is contained in:
@ -0,0 +1,16 @@
|
||||
apply plugin: "com.axelor.app-module"
|
||||
|
||||
apply from: "../version.gradle"
|
||||
|
||||
apply {
|
||||
version = openSuiteVersion
|
||||
}
|
||||
|
||||
axelor {
|
||||
title "Axelor Supplier Management"
|
||||
description "Axelor Supplier Management Module"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile project(":modules:axelor-supplychain")
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package com.axelor.apps.suppliermanagement.db.repo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.axelor.apps.account.db.BudgetDistribution;
|
||||
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
|
||||
|
||||
public class PurchaseOrderSupplierLineManagementRepository extends PurchaseOrderSupplierLineRepository {
|
||||
|
||||
@Override
|
||||
public Map<String, Object> populate(Map<String, Object> json, Map<String, Object> context) {
|
||||
Long supplierLine = (Long) json.get("id");
|
||||
PurchaseOrderSupplierLine line = find(supplierLine);
|
||||
List<BudgetDistribution> budgetDistributiList = line.getPurchaseOrderLine().getBudgetDistributionList();
|
||||
BigDecimal totalBudgetAmountAvailable = BigDecimal.ZERO;
|
||||
for (BudgetDistribution budgetDistribution : budgetDistributiList) {
|
||||
totalBudgetAmountAvailable = totalBudgetAmountAvailable.add(budgetDistribution.getBudgetAmountAvailable());
|
||||
}
|
||||
json.put("budgetRemainingAmount", totalBudgetAmountAvailable);
|
||||
|
||||
return super.populate(json, context);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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.suppliermanagement.exceptions;
|
||||
|
||||
public interface IExceptionMessage {
|
||||
|
||||
/** Purchase order supplier line service */
|
||||
static final String CURRENCY_CONVERSION_2 = /*$$(*/
|
||||
"WARNING : To Date must be after or equals to From Date" /*)*/;
|
||||
|
||||
/** Purchase order Controller */
|
||||
static final String PURCHASE_ORDER_1 = /*$$(*/ "Supplier's consulting's request created" /*)*/;
|
||||
|
||||
static final String PURCHASE_ORDER_2 = /*$$(*/ "Suppliers orders' generation over" /*)*/;
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
package com.axelor.apps.suppliermanagement.module;
|
||||
|
||||
import com.axelor.app.AxelorModule;
|
||||
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineManagementRepository;
|
||||
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
|
||||
|
||||
public class SupplierManagementModule extends AxelorModule{
|
||||
@Override
|
||||
protected void configure() {
|
||||
bind(PurchaseOrderSupplierLineRepository.class).to(PurchaseOrderSupplierLineManagementRepository.class);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,384 @@
|
||||
/*
|
||||
* 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.suppliermanagement.service;
|
||||
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.base.db.repo.BlockingRepository;
|
||||
import com.axelor.apps.base.service.BlockingService;
|
||||
import com.axelor.apps.base.service.PriceListService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.message.service.MailAccountService;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderLineRepository;
|
||||
import com.axelor.apps.purchase.exception.IExceptionMessage;
|
||||
import com.axelor.apps.purchase.service.PurchaseOrderLineService;
|
||||
import com.axelor.apps.purchase.service.PurchaseOrderLineServiceImpl;
|
||||
import com.axelor.apps.purchase.service.app.AppPurchaseService;
|
||||
import com.axelor.apps.purchase.web.EmailUtil;
|
||||
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
|
||||
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
|
||||
import com.axelor.apps.supplychain.service.PurchaseOrderLineServiceSupplychainImpl;
|
||||
import com.axelor.auth.AuthUtils;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.exception.db.repo.TraceBackRepository;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class PurchaseOrderSupplierLineService {
|
||||
|
||||
@Inject PurchaseOrderSupplierLineRepository poSupplierLineRepo;
|
||||
|
||||
@Inject protected AppPurchaseService appPurchaseService;
|
||||
|
||||
@Inject private PurchaseOrderLineRepository purchaseOrderLineRepo;
|
||||
|
||||
@Inject private PurchaseOrderLineService purchaseOrderLineService;
|
||||
|
||||
@Inject protected AppBaseService appBaseService;
|
||||
|
||||
@Inject private MailAccountService mailAccountService;
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void accept(PurchaseOrderSupplierLine purchaseOrderSupplierLine) throws AxelorException {
|
||||
|
||||
PurchaseOrderLine purchaseOrderLine = purchaseOrderSupplierLine.getPurchaseOrderLine();
|
||||
|
||||
purchaseOrderLine.setEstimatedDelivDate(purchaseOrderSupplierLine.getEstimatedDelivDate());
|
||||
|
||||
Partner supplierPartner = purchaseOrderSupplierLine.getSupplierPartner();
|
||||
Company company = purchaseOrderLine.getPurchaseOrder().getCompany();
|
||||
if (Beans.get(BlockingService.class)
|
||||
.getBlocking(supplierPartner, company, BlockingRepository.PURCHASE_BLOCKING)
|
||||
!= null) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.TYPE_FUNCTIONNAL,
|
||||
I18n.get(IExceptionMessage.SUPPLIER_BLOCKED),
|
||||
supplierPartner);
|
||||
}
|
||||
purchaseOrderLine.setSupplierPartner(supplierPartner);
|
||||
// set tax from tco
|
||||
BigDecimal priceDiscounted = this.computeDiscount(purchaseOrderSupplierLine);
|
||||
|
||||
purchaseOrderLine.setQty(purchaseOrderSupplierLine.getAvailableQty());
|
||||
purchaseOrderLine.setTaxLine(purchaseOrderSupplierLine.getTaxLine());
|
||||
purchaseOrderLine.setPrice(purchaseOrderSupplierLine.getPrice());
|
||||
purchaseOrderLine.setExTaxTotal(
|
||||
PurchaseOrderLineServiceImpl.computeAmount(purchaseOrderLine.getQty(), priceDiscounted));
|
||||
purchaseOrderLine.setDiscountTypeSelect(
|
||||
purchaseOrderSupplierLine.getDiscountTypeSelect()); // sophal
|
||||
purchaseOrderLine.setDiscountAmount(purchaseOrderSupplierLine.getDiscountAmount()); // sophal
|
||||
purchaseOrderLine.setPriceDiscounted(purchaseOrderSupplierLine.getPriceDiscounted()); // sophal
|
||||
purchaseOrderSupplierLine.setStateSelect(PurchaseOrderSupplierLineRepository.STATE_ACCEPTED);
|
||||
// sophal add acceptedOn and By TCO
|
||||
purchaseOrderSupplierLine.setAcceptanceDate(appPurchaseService.getTodayDate());
|
||||
purchaseOrderSupplierLine.setAcceptedByUser(AuthUtils.getUser());
|
||||
|
||||
if(!purchaseOrderLine.getBudgetDistributionList().isEmpty()){
|
||||
Beans.get(PurchaseOrderLineServiceSupplychainImpl.class)
|
||||
.computeBudgetDistributionSumAmount(purchaseOrderLine, purchaseOrderLine.getPurchaseOrder());
|
||||
}
|
||||
|
||||
if(!purchaseOrderLine.getAnalyticMoveLineList().isEmpty()){
|
||||
Beans.get(PurchaseOrderLineServiceSupplychainImpl.class).computeAnalyticDistribution(purchaseOrderLine);
|
||||
}
|
||||
|
||||
poSupplierLineRepo.save(purchaseOrderSupplierLine);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void refuse(PurchaseOrderSupplierLine purchaseOrderSupplierLine) throws AxelorException {
|
||||
purchaseOrderSupplierLine.setStateSelect(
|
||||
PurchaseOrderSupplierLineRepository.STATE_NOT_ACCEPTED);
|
||||
// sophal add acceptedOn and By TCO
|
||||
purchaseOrderSupplierLine.setRefusalDate(appPurchaseService.getTodayDate());
|
||||
purchaseOrderSupplierLine.setRefusedByUser(AuthUtils.getUser());
|
||||
;
|
||||
|
||||
poSupplierLineRepo.save(purchaseOrderSupplierLine);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void approve(PurchaseOrderSupplierLine purchaseOrderSupplierLine) throws AxelorException {
|
||||
purchaseOrderSupplierLine.setStateSelect(PurchaseOrderSupplierLineRepository.STATE_APPROVED);
|
||||
purchaseOrderSupplierLine.setApprovalDate(appPurchaseService.getTodayDate());
|
||||
purchaseOrderSupplierLine.setApprovedByUser(AuthUtils.getUser());
|
||||
;
|
||||
poSupplierLineRepo.save(purchaseOrderSupplierLine);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void putStandBy(PurchaseOrderSupplierLine purchaseOrderSupplierLine, String raison)
|
||||
throws AxelorException {
|
||||
purchaseOrderSupplierLine.setStateSelect(PurchaseOrderSupplierLineRepository.STATE_STANDBY);
|
||||
purchaseOrderSupplierLine.setStandbyDate(appPurchaseService.getTodayDate());
|
||||
purchaseOrderSupplierLine.setStandbyByUser(AuthUtils.getUser());
|
||||
purchaseOrderSupplierLine.setStandbyRaison(raison);
|
||||
|
||||
poSupplierLineRepo.save(purchaseOrderSupplierLine);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void massPutStandBy(List<Long> requestIds, String raison) throws AxelorException {
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_MISSING_FIELD,
|
||||
"Please Select at least one PurchaseOrderSupplierLine");
|
||||
}
|
||||
|
||||
List<PurchaseOrderSupplierLine> purchaseOrderSupplierLines =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.all()
|
||||
.filter("self.id in (?1)", requestIds)
|
||||
.fetch();
|
||||
|
||||
if (requestIds != null || !requestIds.isEmpty()) {
|
||||
for (PurchaseOrderSupplierLine line : purchaseOrderSupplierLines) {
|
||||
this.putStandBy(line, raison);
|
||||
}
|
||||
}
|
||||
// PurchaseOrder po =
|
||||
// purchaseOrderSupplierLines.get(0).getPurchaseOrderLine().getPurchaseOrder();
|
||||
|
||||
Set<PurchaseOrder> purchaseOrderSet = new HashSet<>();
|
||||
|
||||
for (PurchaseOrderSupplierLine line : purchaseOrderSupplierLines) {
|
||||
purchaseOrderSet.add(line.getPurchaseOrderLine().getPurchaseOrder());
|
||||
}
|
||||
|
||||
for (PurchaseOrder pOrder : purchaseOrderSet) {
|
||||
// List<PurchaseOrderSupplierLine> pslines = purchaseOrderSupplierLines.stream().filter(arg0
|
||||
// -> arg0.getPurchaseOrderLine().getPurchaseOrder().getId() ==
|
||||
// pOrder.getId()).collect(Collectors.toList());
|
||||
String email = pOrder.getCreatedBy().getPartner().getEmailAddress().getAddress();
|
||||
String raisonTmp = raison != null ? raison : "";
|
||||
if (email != null) {
|
||||
EmailUtil.sendEmailWithCC(
|
||||
mailAccountService,
|
||||
email,
|
||||
"De(s) TCO(s) mis en attente(s) : " + pOrder.getPurchaseOrderSeq(),
|
||||
"Des TCO's ont été mis en anttentes de la CA : "
|
||||
+ pOrder.getPurchaseOrderSeq()
|
||||
+ " avec le motif suivant <br><b>"
|
||||
+ raisonTmp
|
||||
+ "</b>",
|
||||
"bachir.souldi@sophal.dz",
|
||||
"zakaria.hachemi@sophal.dz");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void massAccept(List<Long> requestIds) throws AxelorException {
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_MISSING_FIELD,
|
||||
"Please Select at least one PurchaseOrderSupplierLine");
|
||||
}
|
||||
|
||||
List<PurchaseOrderSupplierLine> purchaseOrderSupplierLines =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.all()
|
||||
.filter("self.id in (?1)", requestIds)
|
||||
.fetch();
|
||||
|
||||
if (requestIds != null || !requestIds.isEmpty()) {
|
||||
for (PurchaseOrderSupplierLine line : purchaseOrderSupplierLines) {
|
||||
this.accept(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void massRefuse(List<Long> requestIds) throws AxelorException {
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_MISSING_FIELD,
|
||||
"Please Select at least one PurchaseOrderSupplierLine");
|
||||
}
|
||||
List<PurchaseOrderSupplierLine> purchaseOrderSupplierLines =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.all()
|
||||
.filter("self.id in (?1)", requestIds)
|
||||
.fetch();
|
||||
|
||||
if (requestIds != null || !requestIds.isEmpty()) {
|
||||
for (PurchaseOrderSupplierLine line : purchaseOrderSupplierLines) {
|
||||
this.refuse(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void massApprove(List<Long> requestIds) throws AxelorException {
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_MISSING_FIELD,
|
||||
"Please Select at least one PurchaseOrderSupplierLine");
|
||||
}
|
||||
|
||||
List<PurchaseOrderSupplierLine> purchaseOrderSupplierLines =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.all()
|
||||
.filter("self.id in (?1)", requestIds)
|
||||
.fetch();
|
||||
|
||||
if (requestIds != null || !requestIds.isEmpty()) {
|
||||
for (PurchaseOrderSupplierLine line : purchaseOrderSupplierLines) {
|
||||
this.approve(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public PurchaseOrderSupplierLine create(Partner supplierPartner, BigDecimal price) {
|
||||
|
||||
return new PurchaseOrderSupplierLine(
|
||||
price, PurchaseOrderSupplierLineRepository.STATE_REQUESTED, supplierPartner);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void savePurchaseSupplierLine(PurchaseOrderSupplierLine purchaseOrderSupplierLine) {
|
||||
poSupplierLineRepo.save(purchaseOrderSupplierLine);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void calculateAmountsTco(PurchaseOrderSupplierLine purchaseOrderSupplierLine)
|
||||
throws AxelorException {
|
||||
|
||||
BigDecimal ExTaxTotal = BigDecimal.ZERO;
|
||||
BigDecimal taxTotal = BigDecimal.ZERO;
|
||||
BigDecimal inTaxTotal = BigDecimal.ZERO;
|
||||
|
||||
ExTaxTotal =
|
||||
purchaseOrderSupplierLine
|
||||
.getPrice()
|
||||
.multiply(purchaseOrderSupplierLine.getAvailableQty())
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_EVEN);
|
||||
purchaseOrderSupplierLine.setExTaxTotal(ExTaxTotal);
|
||||
|
||||
if (purchaseOrderSupplierLine.getTaxLine().getValue() != null) {
|
||||
|
||||
taxTotal =
|
||||
ExTaxTotal.multiply(purchaseOrderSupplierLine.getTaxLine().getValue())
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_EVEN);
|
||||
purchaseOrderSupplierLine.setTaxTotal(taxTotal);
|
||||
}
|
||||
|
||||
inTaxTotal =
|
||||
ExTaxTotal.add(taxTotal)
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_EVEN);
|
||||
;
|
||||
purchaseOrderSupplierLine.setInTaxTotal(inTaxTotal);
|
||||
|
||||
poSupplierLineRepo.save(purchaseOrderSupplierLine);
|
||||
}
|
||||
|
||||
public BigDecimal computeDiscount(PurchaseOrderSupplierLine purchaseOrderSupplierLine) {
|
||||
|
||||
BigDecimal price = purchaseOrderSupplierLine.getPrice();
|
||||
|
||||
return Beans.get(PriceListService.class)
|
||||
.computeDiscount(
|
||||
price,
|
||||
purchaseOrderSupplierLine.getDiscountTypeSelect(),
|
||||
purchaseOrderSupplierLine.getDiscountAmount());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void splitPurchaseOrderLinesSpecialInto2(
|
||||
PurchaseOrder purchaseOrder, PurchaseOrderLine purchaseOrderLine, BigDecimal splitQty)
|
||||
throws AxelorException {
|
||||
|
||||
BigDecimal totalQty = purchaseOrderLine.getQty();
|
||||
totalQty = totalQty.subtract(splitQty);
|
||||
|
||||
if (totalQty.compareTo(BigDecimal.ZERO) > 0) {
|
||||
|
||||
PurchaseOrderLine newLine = purchaseOrderLineRepo.copy(purchaseOrderLine, true);
|
||||
newLine.setQty(splitQty);
|
||||
purchaseOrderLineService.compute(newLine, purchaseOrder);
|
||||
List<PurchaseOrderSupplierLine> purchaseOrderSupplierLineList;
|
||||
purchaseOrderSupplierLineList = newLine.getPurchaseOrderSupplierLineList();
|
||||
if (purchaseOrderSupplierLineList != null) {
|
||||
for (PurchaseOrderSupplierLine purchaseOrderSupplierLine : purchaseOrderSupplierLineList) {
|
||||
purchaseOrderSupplierLine.setAvailableQty(splitQty);
|
||||
this.calculateAmountsTco(purchaseOrderSupplierLine);
|
||||
}
|
||||
}
|
||||
purchaseOrder.addPurchaseOrderLineListItem(newLine);
|
||||
|
||||
PurchaseOrderLine newLine2 = purchaseOrderLineRepo.copy(purchaseOrderLine, true);
|
||||
newLine2.setQty(totalQty);
|
||||
purchaseOrderLineService.compute(newLine2, purchaseOrder);
|
||||
List<PurchaseOrderSupplierLine> purchaseOrderSupplierLineList2;
|
||||
purchaseOrderSupplierLineList2 = newLine2.getPurchaseOrderSupplierLineList();
|
||||
if (purchaseOrderSupplierLineList2 != null) {
|
||||
for (PurchaseOrderSupplierLine purchaseOrderSupplierLine2 :
|
||||
purchaseOrderSupplierLineList2) {
|
||||
purchaseOrderSupplierLine2.setAvailableQty(totalQty);
|
||||
this.calculateAmountsTco(purchaseOrderSupplierLine2);
|
||||
}
|
||||
}
|
||||
purchaseOrder.addPurchaseOrderLineListItem(newLine2);
|
||||
|
||||
purchaseOrder.removePurchaseOrderLineListItem(purchaseOrderLine);
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, BigDecimal> compute(PurchaseOrderSupplierLine line) {
|
||||
|
||||
HashMap<String, BigDecimal> map = new HashMap<>();
|
||||
if (line == null || line.getPrice() == null || line.getTaxLine() == null) {
|
||||
return map;
|
||||
}
|
||||
|
||||
BigDecimal priceDiscounted = this.computeDiscount(line).setScale(5, RoundingMode.HALF_EVEN);
|
||||
|
||||
BigDecimal taxRate = line.getTaxLine().getValue();
|
||||
|
||||
BigDecimal exTaxTotal =
|
||||
PurchaseOrderLineServiceImpl.computeAmount(line.getAvailableQty(), priceDiscounted);
|
||||
BigDecimal taxTotal = exTaxTotal.multiply(taxRate);
|
||||
BigDecimal inTaxTotal = exTaxTotal.add(exTaxTotal.multiply(taxRate));
|
||||
|
||||
map.put("exTaxTotal", exTaxTotal);
|
||||
map.put("taxTotal", taxTotal);
|
||||
map.put("inTaxTotal", inTaxTotal);
|
||||
map.put("priceDiscounted", priceDiscounted);
|
||||
return map;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void setPurchaseOrderLinesPartner(
|
||||
List<PurchaseOrderLine> purchaseOrderLines, Partner partner) {
|
||||
for (PurchaseOrderLine purchaseOrderLine : purchaseOrderLines) {
|
||||
purchaseOrderLine.setSupplierPartner(partner);
|
||||
Beans.get(PurchaseOrderLineRepository.class).save(purchaseOrderLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,454 @@
|
||||
/*
|
||||
* 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.suppliermanagement.service;
|
||||
|
||||
import com.axelor.apps.base.db.Blocking;
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.base.db.Product;
|
||||
import com.axelor.apps.base.db.repo.BlockingRepository;
|
||||
import com.axelor.apps.base.db.repo.PriceListRepository;
|
||||
import com.axelor.apps.base.service.BlockingService;
|
||||
import com.axelor.apps.base.service.PartnerPriceListService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.PurchaseRequest;
|
||||
import com.axelor.apps.purchase.db.SupplierCatalog;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderLineRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseRequestRepository;
|
||||
import com.axelor.apps.purchase.service.PurchaseOrderLineService;
|
||||
import com.axelor.apps.purchase.service.app.AppPurchaseService;
|
||||
import com.axelor.apps.stock.service.StockLocationService;
|
||||
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
|
||||
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
|
||||
import com.axelor.apps.supplychain.exception.IExceptionMessage;
|
||||
import com.axelor.apps.supplychain.service.PurchaseOrderLineServiceSupplychainImpl;
|
||||
import com.axelor.apps.supplychain.service.PurchaseOrderServiceSupplychainImpl;
|
||||
import com.axelor.auth.AuthUtils;
|
||||
import com.axelor.dms.db.DMSFile;
|
||||
import com.axelor.dms.db.repo.DMSFileRepository;
|
||||
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.meta.db.MetaAttachment;
|
||||
import com.axelor.meta.db.repo.MetaAttachmentRepository;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class PurchaseOrderSupplierService {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||
|
||||
@Inject private PurchaseOrderSupplierLineService purchaseOrderSupplierLineService;
|
||||
|
||||
@Inject private PurchaseOrderServiceSupplychainImpl purchaseOrderServiceSupplychainImpl;
|
||||
|
||||
@Inject private PurchaseOrderLineServiceSupplychainImpl purchaseOrderLineServiceSupplychainImpl;
|
||||
|
||||
@Inject protected PurchaseOrderRepository poRepo;
|
||||
|
||||
@Inject private PurchaseRequestRepository purchaseRequestRepo;
|
||||
|
||||
@Inject private MetaAttachmentRepository metaAttachmentRepository;
|
||||
|
||||
@Inject private DMSFileRepository dmsFileRepository;
|
||||
|
||||
@Transactional
|
||||
public void generateAllSuppliersRequests(PurchaseOrder purchaseOrder) {
|
||||
|
||||
for (PurchaseOrderLine purchaseOrderLine : purchaseOrder.getPurchaseOrderLineList()) {
|
||||
|
||||
this.generateSuppliersRequests(purchaseOrderLine);
|
||||
}
|
||||
poRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate supplier requests for one PurchaseOrderLine. Make sure to only call this function when
|
||||
* you are sure the line passed as argument has a valid purchaseOrder. Else, use the
|
||||
* generateSuppliersRequests(PurchaseOrderLine purchaseOrderLine, PurchaseOrder purchaseOrder)
|
||||
* format below.
|
||||
*
|
||||
* @param purchaseOrderLine
|
||||
*/
|
||||
@Transactional
|
||||
public void generateSuppliersRequests(PurchaseOrderLine purchaseOrderLine) {
|
||||
this.generateSuppliersRequests(purchaseOrderLine, purchaseOrderLine.getPurchaseOrder());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void generateSuppliersRequests(
|
||||
PurchaseOrderLine purchaseOrderLine, PurchaseOrder purchaseOrder) {
|
||||
|
||||
if (purchaseOrder == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Product product = purchaseOrderLine.getProduct();
|
||||
Company company = purchaseOrder.getCompany();
|
||||
|
||||
if (Beans.get(AppPurchaseService.class).getAppPurchase().getManageSupplierCatalog()
|
||||
&& product != null
|
||||
&& product.getSupplierCatalogList() != null) {
|
||||
|
||||
for (SupplierCatalog supplierCatalog : product.getSupplierCatalogList()) {
|
||||
Partner supplierPartner = supplierCatalog.getSupplierPartner();
|
||||
Blocking blocking =
|
||||
Beans.get(BlockingService.class)
|
||||
.getBlocking(supplierPartner, company, BlockingRepository.PURCHASE_BLOCKING);
|
||||
if (blocking == null) {
|
||||
purchaseOrderLine.addPurchaseOrderSupplierLineListItem(
|
||||
purchaseOrderSupplierLineService.create(supplierPartner, supplierCatalog.getPrice()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Beans.get(PurchaseOrderLineRepository.class).save(purchaseOrderLine);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void generateSuppliersPurchaseOrder(PurchaseOrder purchaseOrder) throws AxelorException {
|
||||
|
||||
if (purchaseOrder.getPurchaseOrderLineList() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Map<Partner, List<PurchaseOrderLine>> purchaseOrderLinesBySupplierPartner =
|
||||
this.splitBySupplierPartner(purchaseOrder.getPurchaseOrderLineList());
|
||||
|
||||
// remove link purchase order purchase request
|
||||
PurchaseRequest purchaseRequest =
|
||||
Beans.get(PurchaseRequestRepository.class)
|
||||
.find(purchaseOrder.getPurchaseRequestOrigin().getId());
|
||||
|
||||
Set<PurchaseOrder> po =
|
||||
purchaseRequest
|
||||
.getPurchaseOrderSet()
|
||||
.stream()
|
||||
.filter((t) -> t.getId() != purchaseOrder.getId())
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
purchaseRequest.getPurchaseOrderSet().removeIf((t) -> t.getId() == purchaseOrder.getId());
|
||||
|
||||
Set<PurchaseOrder> hash_Set = new HashSet<PurchaseOrder>();
|
||||
hash_Set.addAll(po);
|
||||
for (Partner supplierPartner : purchaseOrderLinesBySupplierPartner.keySet()) {
|
||||
|
||||
PurchaseOrder PurchaseOrderNew =
|
||||
this.createPurchaseOrderSophal(
|
||||
supplierPartner,
|
||||
purchaseOrderLinesBySupplierPartner.get(supplierPartner),
|
||||
purchaseOrder);
|
||||
// sophal
|
||||
hash_Set.add(PurchaseOrderNew);
|
||||
|
||||
// start attachement heritage
|
||||
List<MetaAttachment> metaAttachments =
|
||||
metaAttachmentRepository
|
||||
.all()
|
||||
.filter("self.objectId = ?1", purchaseOrder.getId())
|
||||
.fetch();
|
||||
List<DMSFile> dmsFiles =
|
||||
dmsFileRepository.all().filter("self.relatedId = ?1", purchaseOrder.getId()).fetch();
|
||||
|
||||
Long idRoot =
|
||||
dmsFileRepository
|
||||
.all()
|
||||
.filter(
|
||||
"self.relatedId = ?1 and relatedModel = ?2",
|
||||
(long) 0,
|
||||
purchaseOrder.getClass().getCanonicalName())
|
||||
.fetchOne()
|
||||
.getId();
|
||||
|
||||
for (MetaAttachment metaAttach : metaAttachments) {
|
||||
MetaAttachment metaAttachment = new MetaAttachment();
|
||||
metaAttachment.setObjectId(PurchaseOrderNew.getId());
|
||||
metaAttachment.setObjectName(purchaseOrder.getClass().getCanonicalName());
|
||||
metaAttachment.setMetaFile(metaAttach.getMetaFile());
|
||||
metaAttachmentRepository.save(metaAttachment);
|
||||
}
|
||||
|
||||
for (DMSFile dmsFile : dmsFiles) {
|
||||
if (dmsFile.getIsDirectory() == true) {
|
||||
DMSFile dms = new DMSFile();
|
||||
dms.setFileName(dmsFile.getFileName());
|
||||
dms.setRelatedId(PurchaseOrderNew.getId());
|
||||
dms.setFileName(dmsFile.getFileName());
|
||||
dms.setIsDirectory(dmsFile.getIsDirectory());
|
||||
dms.setParent(dmsFileRepository.find(idRoot));
|
||||
dms.setRelatedModel(purchaseOrder.getClass().getCanonicalName());
|
||||
dmsFileRepository.save(dms);
|
||||
}
|
||||
}
|
||||
|
||||
for (DMSFile dmsFile : dmsFiles) {
|
||||
if (dmsFile.getIsDirectory() != true) {
|
||||
DMSFile dmsParent =
|
||||
dmsFileRepository
|
||||
.all()
|
||||
.filter(
|
||||
"self.relatedId = ?1 and self.isDirectory = true", PurchaseOrderNew.getId())
|
||||
.fetchOne();
|
||||
DMSFile dms = new DMSFile();
|
||||
dms.setFileName(dmsFile.getFileName());
|
||||
dms.setRelatedId(PurchaseOrderNew.getId());
|
||||
dms.setFileName(dmsFile.getFileName());
|
||||
dms.setMetaFile(dmsFile.getMetaFile());
|
||||
dms.setIsDirectory(dmsFile.getIsDirectory());
|
||||
dms.setRelatedModel(purchaseOrder.getClass().getCanonicalName());
|
||||
dms.setParent(dmsParent);
|
||||
|
||||
dmsFileRepository.save(dms);
|
||||
}
|
||||
}
|
||||
// PurchaseOrderNew.setStatusSelect(0);//Approuve
|
||||
createPurchaseOrderSupplierLineTCO(
|
||||
PurchaseOrderNew.getPurchaseOrderLineList(),
|
||||
purchaseOrderLinesBySupplierPartner.get(supplierPartner));
|
||||
}
|
||||
|
||||
purchaseRequest.setPurchaseOrderSet(hash_Set);
|
||||
purchaseRequestRepo.save(purchaseRequest);
|
||||
purchaseOrder.setArchived(true);
|
||||
poRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
public Map<Partner, List<PurchaseOrderLine>> splitBySupplierPartner(
|
||||
List<PurchaseOrderLine> purchaseOrderLineList) throws AxelorException {
|
||||
|
||||
Map<Partner, List<PurchaseOrderLine>> purchaseOrderLinesBySupplierPartner = new HashMap<>();
|
||||
|
||||
for (PurchaseOrderLine purchaseOrderLine : purchaseOrderLineList) {
|
||||
|
||||
Partner supplierPartner = purchaseOrderLine.getSupplierPartner();
|
||||
|
||||
if (supplierPartner == null) {
|
||||
throw new AxelorException(
|
||||
purchaseOrderLine,
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.SO_PURCHASE_1),
|
||||
purchaseOrderLine.getProductName());
|
||||
}
|
||||
|
||||
if (!purchaseOrderLinesBySupplierPartner.containsKey(supplierPartner)) {
|
||||
purchaseOrderLinesBySupplierPartner.put(
|
||||
supplierPartner, new ArrayList<PurchaseOrderLine>());
|
||||
}
|
||||
|
||||
purchaseOrderLinesBySupplierPartner.get(supplierPartner).add(purchaseOrderLine);
|
||||
}
|
||||
|
||||
return purchaseOrderLinesBySupplierPartner;
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void createPurchaseOrder(
|
||||
Partner supplierPartner,
|
||||
List<PurchaseOrderLine> purchaseOrderLineList,
|
||||
PurchaseOrder parentPurchaseOrder)
|
||||
throws AxelorException {
|
||||
|
||||
LOG.debug(
|
||||
"Création d'une commande fournisseur depuis le devis fournisseur : {} et le fournisseur : {}",
|
||||
parentPurchaseOrder.getPurchaseOrderSeq(),
|
||||
supplierPartner.getFullName());
|
||||
|
||||
PurchaseOrder purchaseOrder =
|
||||
purchaseOrderServiceSupplychainImpl.createPurchaseOrder(
|
||||
AuthUtils.getUser(),
|
||||
parentPurchaseOrder.getCompany(),
|
||||
null,
|
||||
supplierPartner.getCurrency(),
|
||||
null,
|
||||
parentPurchaseOrder.getPurchaseOrderSeq(),
|
||||
parentPurchaseOrder.getExternalReference(),
|
||||
"",
|
||||
Beans.get(StockLocationService.class)
|
||||
.getDefaultReceiptStockLocation(parentPurchaseOrder.getCompany()),
|
||||
Beans.get(AppBaseService.class).getTodayDate(),
|
||||
Beans.get(PartnerPriceListService.class)
|
||||
.getDefaultPriceList(supplierPartner, PriceListRepository.TYPE_PURCHASE),
|
||||
supplierPartner,
|
||||
parentPurchaseOrder.getTradingName());
|
||||
|
||||
purchaseOrder.setParentPurchaseOrder(parentPurchaseOrder);
|
||||
|
||||
for (PurchaseOrderLine purchaseOrderLine : purchaseOrderLineList) {
|
||||
|
||||
purchaseOrder.addPurchaseOrderLineListItem(
|
||||
this.createPurchaseOrderLine(purchaseOrder, purchaseOrderLine));
|
||||
}
|
||||
|
||||
purchaseOrderServiceSupplychainImpl.computePurchaseOrder(purchaseOrder);
|
||||
|
||||
purchaseOrder.setStatusSelect(PurchaseOrderRepository.STATUS_REQUESTED);
|
||||
purchaseOrder.setReceiptState(PurchaseOrderRepository.STATE_NOT_RECEIVED);
|
||||
|
||||
poRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
public PurchaseOrderLine createPurchaseOrderLine(
|
||||
PurchaseOrder purchaseOrder, PurchaseOrderLine purchaseOrderLine) throws AxelorException {
|
||||
|
||||
LOG.debug(
|
||||
"Création d'une ligne de commande fournisseur pour le produit : {}",
|
||||
new Object[] {purchaseOrderLine.getProductName()});
|
||||
|
||||
return purchaseOrderLineServiceSupplychainImpl.createPurchaseOrderLineFromSplit(purchaseOrderLine);
|
||||
}
|
||||
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public PurchaseOrder createPurchaseOrderSophal(
|
||||
Partner supplierPartner,
|
||||
List<PurchaseOrderLine> purchaseOrderLineList,
|
||||
PurchaseOrder parentPurchaseOrder)
|
||||
throws AxelorException {
|
||||
|
||||
LOG.debug(
|
||||
"Création d'une commande fournisseur depuis le devis fournisseur : {} et le fournisseur : {}",
|
||||
parentPurchaseOrder.getPurchaseOrderSeq(),
|
||||
supplierPartner.getFullName());
|
||||
|
||||
PurchaseOrder purchaseOrder =
|
||||
purchaseOrderServiceSupplychainImpl.createPurchaseOrder(
|
||||
AuthUtils.getUser(),
|
||||
parentPurchaseOrder.getCompany(),
|
||||
null,
|
||||
supplierPartner.getCurrency(),
|
||||
null,
|
||||
parentPurchaseOrder.getPurchaseOrderSeq(),
|
||||
parentPurchaseOrder.getExternalReference(),
|
||||
"",
|
||||
Beans.get(StockLocationService.class)
|
||||
.getDefaultReceiptStockLocation(parentPurchaseOrder.getCompany()),
|
||||
Beans.get(AppBaseService.class).getTodayDate(),
|
||||
Beans.get(PartnerPriceListService.class)
|
||||
.getDefaultPriceList(supplierPartner, PriceListRepository.TYPE_PURCHASE),
|
||||
supplierPartner,
|
||||
parentPurchaseOrder.getTradingName());
|
||||
|
||||
purchaseOrder.setParentPurchaseOrder(parentPurchaseOrder);
|
||||
|
||||
for (PurchaseOrderLine purchaseOrderLine : purchaseOrderLineList) {
|
||||
|
||||
// purchaseOrder.addPurchaseOrderLineListItem(
|
||||
// this.createPurchaseOrderLine(purchaseOrder, purchaseOrderLine));
|
||||
purchaseOrder.addPurchaseOrderLineListItem(
|
||||
this.createPurchaseOrderLineSophal(purchaseOrder, purchaseOrderLine));
|
||||
}
|
||||
|
||||
purchaseOrderServiceSupplychainImpl.computePurchaseOrder(purchaseOrder);
|
||||
|
||||
// purchaseOrder.setStatusSelect(PurchaseOrderRepository.STATUS_REQUESTED);
|
||||
purchaseOrder.setStatusSelect(parentPurchaseOrder.getStatusSelect());
|
||||
purchaseOrder.setReceiptState(PurchaseOrderRepository.STATE_NOT_RECEIVED);
|
||||
purchaseOrder.setPurchaseRequestOrigin(parentPurchaseOrder.getPurchaseRequestOrigin());
|
||||
purchaseOrder.setPurchaseType(parentPurchaseOrder.getPurchaseType());
|
||||
purchaseOrder.setStamp(parentPurchaseOrder.getStamp());
|
||||
purchaseOrder.setFixTax(parentPurchaseOrder.getFixTax());
|
||||
purchaseOrder.setDeliveryPartner(parentPurchaseOrder.getSupplierPartner());
|
||||
purchaseOrder.setPayerPartner(parentPurchaseOrder.getSupplierPartner());
|
||||
// copy description from parent po
|
||||
purchaseOrder.setNotes(parentPurchaseOrder.getNotes());
|
||||
;
|
||||
poRepo.save(purchaseOrder);
|
||||
|
||||
return purchaseOrder;
|
||||
}
|
||||
|
||||
public PurchaseOrderLine createPurchaseOrderLineSophal(
|
||||
PurchaseOrder purchaseOrder, PurchaseOrderLine purchaseOrderLine) throws AxelorException {
|
||||
|
||||
LOG.debug(
|
||||
"SOPHAL Création d'une ligne de commande fournisseur pour le produit : {}",
|
||||
new Object[] {purchaseOrderLine.getProductName()});
|
||||
|
||||
PurchaseOrderLine PurchaseOrderLineNew =
|
||||
purchaseOrderLineServiceSupplychainImpl.createPurchaseOrderLineFromSplit(purchaseOrderLine);
|
||||
|
||||
PurchaseOrderLineNew.setPrice(purchaseOrderLine.getPrice());
|
||||
PurchaseOrderLineNew.setInTaxPrice(purchaseOrderLine.getInTaxPrice());
|
||||
PurchaseOrderLineNew.setPriceDiscounted(purchaseOrderLine.getPriceDiscounted());
|
||||
PurchaseOrderLineNew.setExTaxTotal(purchaseOrderLine.getExTaxTotal());
|
||||
PurchaseOrderLineNew.setInTaxTotal(purchaseOrderLine.getInTaxTotal());
|
||||
PurchaseOrderLineNew.setDiscountAmount(purchaseOrderLine.getDiscountAmount());
|
||||
PurchaseOrderLineNew.setDiscountTypeSelect(purchaseOrderLine.getDiscountTypeSelect());
|
||||
PurchaseOrderLineNew.setSupplierPartner(purchaseOrderLine.getSupplierPartner());
|
||||
// set taxline to children
|
||||
PurchaseOrderLineNew.setTaxLine(purchaseOrderLine.getTaxLine());
|
||||
|
||||
return PurchaseOrderLineNew;
|
||||
}
|
||||
|
||||
public void createPurchaseOrderSupplierLineTCO(
|
||||
List<PurchaseOrderLine> purchaseOrderLN, List<PurchaseOrderLine> purchaseOrderLP)
|
||||
throws AxelorException {
|
||||
|
||||
int index = 0;
|
||||
List<PurchaseOrderLine> purchaseOrderLineNew = purchaseOrderLN;
|
||||
for (PurchaseOrderLine purchaseOrderLineParnet : purchaseOrderLP) {
|
||||
|
||||
List<PurchaseOrderSupplierLine> PurchaseOrderSupplierLineParnetList =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.all()
|
||||
.filter("self.purchaseOrderLine =?1 ", purchaseOrderLineParnet.getId())
|
||||
.fetch();
|
||||
|
||||
for (PurchaseOrderSupplierLine poLineSupplierParnet : PurchaseOrderSupplierLineParnetList) {
|
||||
|
||||
PurchaseOrderSupplierLine po = new PurchaseOrderSupplierLine();
|
||||
po.setPrice(poLineSupplierParnet.getPrice());
|
||||
po.setExTaxTotal(poLineSupplierParnet.getExTaxTotal());
|
||||
po.setInTaxTotal(poLineSupplierParnet.getInTaxTotal());
|
||||
po.setTaxTotal(poLineSupplierParnet.getTaxTotal());
|
||||
po.setAvailableQty(poLineSupplierParnet.getAvailableQty());
|
||||
po.setPurchaseOrderLine(purchaseOrderLineNew.get(index));
|
||||
po.setStateSelect(poLineSupplierParnet.getStateSelect());
|
||||
po.setTaxLine(poLineSupplierParnet.getTaxLine());
|
||||
po.setSupplierPartner(poLineSupplierParnet.getSupplierPartner());
|
||||
po.setComments(poLineSupplierParnet.getComments());
|
||||
po.setArchived(poLineSupplierParnet.getArchived());
|
||||
po.setEstimatedDelivDate(poLineSupplierParnet.getEstimatedDelivDate());
|
||||
po.setAcceptanceDate(poLineSupplierParnet.getAcceptanceDate());
|
||||
po.setAcceptedByUser(poLineSupplierParnet.getAcceptedByUser());
|
||||
po.setRefusalDate(poLineSupplierParnet.getRefusalDate());
|
||||
po.setRefusedByUser(poLineSupplierParnet.getRefusedByUser());
|
||||
po.setAttrs(poLineSupplierParnet.getAttrs());
|
||||
po.setCurrency(poLineSupplierParnet.getCurrency());
|
||||
po.setPriceDiscounted(poLineSupplierParnet.getPriceDiscounted());
|
||||
// LOG.debug("purchaseOrderLineNew.getId(): {}",purchaseOrderLineNew.get(index).getId());
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class).save(po);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* 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.suppliermanagement.web;
|
||||
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
import com.axelor.apps.base.db.repo.PartnerRepository;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderLineRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderRepository;
|
||||
import com.axelor.apps.suppliermanagement.exceptions.IExceptionMessage;
|
||||
import com.axelor.apps.suppliermanagement.service.PurchaseOrderSupplierLineService;
|
||||
import com.axelor.apps.suppliermanagement.service.PurchaseOrderSupplierService;
|
||||
import com.axelor.db.mapper.Mapper;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.google.inject.Singleton;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
@Singleton
|
||||
public class PurchaseOrderController {
|
||||
|
||||
public void generateSuppliersPurchaseOrder(ActionRequest request, ActionResponse response) {
|
||||
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
List<PurchaseOrder> purchaseOrders =
|
||||
Beans.get(PurchaseOrderRepository.class)
|
||||
.all()
|
||||
.filter("self.parentPurchaseOrder = ?1 ", purchaseOrder.getId())
|
||||
.fetch();
|
||||
|
||||
if (purchaseOrders.size() < 1) {
|
||||
try {
|
||||
Beans.get(PurchaseOrderSupplierService.class)
|
||||
.generateSuppliersPurchaseOrder(
|
||||
Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId()));
|
||||
response.setFlash(I18n.get(IExceptionMessage.PURCHASE_ORDER_1));
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
} else {
|
||||
response.setFlash("Vous avez deja genere les commandes fournisseurs associees");
|
||||
}
|
||||
}
|
||||
|
||||
public void generateSuppliersRequests(ActionRequest request, ActionResponse response) {
|
||||
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
|
||||
try {
|
||||
Beans.get(PurchaseOrderSupplierService.class)
|
||||
.generateAllSuppliersRequests(
|
||||
Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId()));
|
||||
response.setFlash(I18n.get(IExceptionMessage.PURCHASE_ORDER_2));
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
// sophal
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public void setPurchaseOrderLinesPartner(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
List<HashMap> selectedPurchaseOrderLineMapList =
|
||||
(List<HashMap>) request.getContext().get("purchaseOrderLineList");
|
||||
if (selectedPurchaseOrderLineMapList == null) {
|
||||
response.setFlash(I18n.get(IExceptionMessage.PURCHASE_ORDER_1));
|
||||
return;
|
||||
}
|
||||
|
||||
List<PurchaseOrderLine> purchaseOrderLineList = new ArrayList<>();
|
||||
PurchaseOrderLineRepository purchaseOrderLineRepo =
|
||||
Beans.get(PurchaseOrderLineRepository.class);
|
||||
for (HashMap map : selectedPurchaseOrderLineMapList) {
|
||||
PurchaseOrderLine purchaseOrderLine =
|
||||
(PurchaseOrderLine) Mapper.toBean(PurchaseOrderLine.class, map);
|
||||
purchaseOrderLineList.add(purchaseOrderLineRepo.find(purchaseOrderLine.getId()));
|
||||
}
|
||||
|
||||
if (purchaseOrderLineList.isEmpty()) {
|
||||
response.setFlash(I18n.get(IExceptionMessage.PURCHASE_ORDER_2));
|
||||
return;
|
||||
}
|
||||
|
||||
Long partnerId = 0L;
|
||||
|
||||
LinkedHashMap<String, Object> partnerHashMap =
|
||||
(LinkedHashMap<String, Object>) request.getContext().get("partner");
|
||||
if (partnerHashMap != null) {
|
||||
partnerId = Long.valueOf(partnerHashMap.get("id").toString());
|
||||
}
|
||||
Partner partner = Beans.get(PartnerRepository.class).find(partnerId);
|
||||
if (partner == null) {
|
||||
response.setFlash("No partners");
|
||||
return;
|
||||
}
|
||||
|
||||
Beans.get(PurchaseOrderSupplierLineService.class)
|
||||
.setPurchaseOrderLinesPartner(purchaseOrderLineList, partner);
|
||||
response.setCanClose(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* 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.suppliermanagement.web;
|
||||
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderLineRepository;
|
||||
import com.axelor.apps.suppliermanagement.service.PurchaseOrderSupplierService;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.axelor.rpc.Context;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class PurchaseOrderLineController {
|
||||
|
||||
public void generateSuppliersRequests(ActionRequest request, ActionResponse response) {
|
||||
|
||||
PurchaseOrderLine purchaseOrderLine =
|
||||
Beans.get(PurchaseOrderLineRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrderLine.class).getId());
|
||||
|
||||
try {
|
||||
if (purchaseOrderLine.getPurchaseOrder() == null) {
|
||||
PurchaseOrder purchaseOrder = request.getContext().getParent().asType(PurchaseOrder.class);
|
||||
Beans.get(PurchaseOrderSupplierService.class)
|
||||
.generateSuppliersRequests(purchaseOrderLine, purchaseOrder);
|
||||
} else {
|
||||
Beans.get(PurchaseOrderSupplierService.class).generateSuppliersRequests(purchaseOrderLine);
|
||||
}
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void defaultValuesSuppliersRequests(ActionRequest request, ActionResponse response) {
|
||||
|
||||
try {
|
||||
Context context = request.getContext().getParent();
|
||||
response.setValue("availableQty", context.get("qty"));
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,300 @@
|
||||
/*
|
||||
* 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.suppliermanagement.web;
|
||||
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.repo.BlockingRepository;
|
||||
import com.axelor.apps.base.service.BlockingService;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderLineRepository;
|
||||
import com.axelor.apps.purchase.service.PurchaseOrderService;
|
||||
import com.axelor.apps.purchase.service.app.AppPurchaseService;
|
||||
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
|
||||
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
|
||||
import com.axelor.apps.suppliermanagement.service.PurchaseOrderSupplierLineService;
|
||||
import com.axelor.apps.supplychain.service.PurchaseOrderServiceSupplychainImpl;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
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.common.base.Strings;
|
||||
import com.google.inject.Singleton;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Singleton
|
||||
public class PurchaseOrderSupplierLineController {
|
||||
|
||||
public void showPurchaseOrder(ActionRequest request, ActionResponse response) {
|
||||
PurchaseOrderSupplierLine purchaseOrderSupplierLine =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrderSupplierLine.class).getId());
|
||||
PurchaseOrder purchaseOrder =
|
||||
purchaseOrderSupplierLine.getPurchaseOrderLine().getPurchaseOrder();
|
||||
response.setView(
|
||||
ActionView.define("Devis fournisseur")
|
||||
.model(PurchaseOrder.class.getName())
|
||||
.add("form", "purchase-order-form")
|
||||
.param("show-toolbar", "false")
|
||||
.param("show-confirm", "false")
|
||||
.param("popup-save", "false")
|
||||
.param("show-toolbar", "true")
|
||||
.param("popup", "true")
|
||||
.context("_showRecord", String.valueOf(purchaseOrder.getId()))
|
||||
.map());
|
||||
}
|
||||
|
||||
public void accept(ActionRequest request, ActionResponse response) {
|
||||
|
||||
PurchaseOrderSupplierLine purchaseOrderSupplierLine =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrderSupplierLine.class).getId());
|
||||
|
||||
if (purchaseOrderSupplierLine.getPurchaseOrderLine() == null
|
||||
&& request.getContext().getParent() != null) {
|
||||
purchaseOrderSupplierLine.setPurchaseOrderLine(
|
||||
Beans.get(PurchaseOrderLineRepository.class)
|
||||
.find(request.getContext().getParent().asType(PurchaseOrderLine.class).getId()));
|
||||
}
|
||||
|
||||
// sophal refresh purchase order price
|
||||
PurchaseOrder order = purchaseOrderSupplierLine.getPurchaseOrderLine().getPurchaseOrder();
|
||||
|
||||
try {
|
||||
Beans.get(PurchaseOrderSupplierLineService.class).accept(purchaseOrderSupplierLine);
|
||||
// sophal refresh purchase order price
|
||||
Beans.get(PurchaseOrderService.class).computePurchaseOrder(order);
|
||||
Beans.get(PurchaseOrderService.class).updateCostPrice(order);
|
||||
// response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void refuse(ActionRequest request, ActionResponse response) {
|
||||
|
||||
PurchaseOrderSupplierLine purchaseOrderSupplierLine =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrderSupplierLine.class).getId());
|
||||
try {
|
||||
Beans.get(PurchaseOrderSupplierLineService.class).refuse(purchaseOrderSupplierLine);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void massPutStandBy(ActionRequest request, ActionResponse response) {
|
||||
|
||||
List<Long> requestIds = (List<Long>) request.getContext().get("_ids");
|
||||
System.out.println("****************");
|
||||
System.out.println(requestIds);
|
||||
System.out.println("****************");
|
||||
String raison = (String) request.getContext().get("standbyRaison");
|
||||
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (!requestIds.isEmpty()) {
|
||||
Beans.get(PurchaseOrderSupplierLineService.class).massPutStandBy(requestIds, raison);
|
||||
response.setReload(true);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void putStandBy(ActionRequest request, ActionResponse response) {
|
||||
|
||||
System.out.println(String.valueOf(request.getContext().get("_id")));
|
||||
Long id = new Long(String.valueOf(request.getContext().get("_id")));
|
||||
String raison = (String) request.getContext().get("standbyRaison");
|
||||
|
||||
try {
|
||||
PurchaseOrderSupplierLine purchaseOrderSupplierLine =
|
||||
Beans.get(PurchaseOrderSupplierLineRepository.class).find(id);
|
||||
Beans.get(PurchaseOrderSupplierLineService.class)
|
||||
.putStandBy(purchaseOrderSupplierLine, raison);
|
||||
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void massAccept(ActionRequest request, ActionResponse response) {
|
||||
|
||||
List<Long> requestIds = (List<Long>) request.getContext().get("_ids");
|
||||
System.out.println("*************************");
|
||||
System.out.println(requestIds);
|
||||
System.out.println("*************************");
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (!requestIds.isEmpty()) {
|
||||
Beans.get(PurchaseOrderSupplierLineService.class).massAccept(requestIds);
|
||||
response.setReload(true);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void massApprove(ActionRequest request, ActionResponse response) {
|
||||
|
||||
List<Long> requestIds = (List<Long>) request.getContext().get("_ids");
|
||||
System.out.println("*************************");
|
||||
System.out.println(requestIds);
|
||||
System.out.println("*************************");
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (!requestIds.isEmpty()) {
|
||||
Beans.get(PurchaseOrderSupplierLineService.class).massApprove(requestIds);
|
||||
response.setReload(true);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void massRefuse(ActionRequest request, ActionResponse response) {
|
||||
|
||||
List<Long> requestIds = (List<Long>) request.getContext().get("_ids");
|
||||
System.out.println("*************************");
|
||||
System.out.println(requestIds);
|
||||
System.out.println("*************************");
|
||||
if (requestIds == null || requestIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
if (!requestIds.isEmpty()) {
|
||||
Beans.get(PurchaseOrderSupplierLineService.class).massRefuse(requestIds);
|
||||
response.setReload(true);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called on supplier partner select. Set the domain for the field supplierPartner
|
||||
*
|
||||
* @param request
|
||||
* @param response
|
||||
*/
|
||||
public void supplierPartnerDomain(ActionRequest request, ActionResponse response) {
|
||||
PurchaseOrderSupplierLine purchaseOrderSupplierLine =
|
||||
request.getContext().asType(PurchaseOrderSupplierLine.class);
|
||||
|
||||
PurchaseOrderLine purchaseOrderLine = purchaseOrderSupplierLine.getPurchaseOrderLine();
|
||||
if (purchaseOrderLine == null) {
|
||||
purchaseOrderLine = request.getContext().getParent().asType(PurchaseOrderLine.class);
|
||||
}
|
||||
|
||||
PurchaseOrder purchaseOrder = purchaseOrderLine.getPurchaseOrder();
|
||||
if (purchaseOrder == null) {
|
||||
purchaseOrder = request.getContext().getParent().getParent().asType(PurchaseOrder.class);
|
||||
}
|
||||
Company company = purchaseOrder.getCompany();
|
||||
|
||||
String domain = "";
|
||||
if (Beans.get(AppPurchaseService.class).getAppPurchase().getManageSupplierCatalog()
|
||||
&& purchaseOrderLine.getProduct() != null
|
||||
&& !purchaseOrderLine.getProduct().getSupplierCatalogList().isEmpty()) {
|
||||
domain +=
|
||||
"self.id != "
|
||||
+ company.getPartner().getId()
|
||||
+ " AND self.id IN "
|
||||
+ purchaseOrderLine
|
||||
.getProduct()
|
||||
.getSupplierCatalogList()
|
||||
.stream()
|
||||
.map(s -> s.getSupplierPartner().getId())
|
||||
.collect(Collectors.toList())
|
||||
.toString()
|
||||
.replace('[', '(')
|
||||
.replace(']', ')');
|
||||
|
||||
String blockedPartnerQuery =
|
||||
Beans.get(BlockingService.class)
|
||||
.listOfBlockedPartner(company, BlockingRepository.PURCHASE_BLOCKING);
|
||||
|
||||
if (!Strings.isNullOrEmpty(blockedPartnerQuery)) {
|
||||
domain += String.format(" AND self.id NOT in (%s)", blockedPartnerQuery);
|
||||
}
|
||||
} else {
|
||||
domain += "self.id = 0";
|
||||
}
|
||||
|
||||
domain += " AND " + company.getId() + " in (SELECT id FROM self.companySet)";
|
||||
|
||||
response.setAttr("supplierPartner", "domain", domain);
|
||||
}
|
||||
|
||||
public void splitPurchaseOrderLinesInto2(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
Long Id = (Long) request.getContext().get("id");
|
||||
PurchaseOrderLineRepository purchaseOrderLineRepository =
|
||||
Beans.get(PurchaseOrderLineRepository.class);
|
||||
PurchaseOrderLine purchaseOrderLine = purchaseOrderLineRepository.find(Id);
|
||||
PurchaseOrder purchaseOrder = purchaseOrderLine.getPurchaseOrder();
|
||||
|
||||
BigDecimal splitQty = new BigDecimal(request.getContext().get("splitQty").toString());
|
||||
|
||||
Beans.get(PurchaseOrderSupplierLineService.class)
|
||||
.splitPurchaseOrderLinesSpecialInto2(purchaseOrder, purchaseOrderLine, splitQty);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void compute(ActionRequest request, ActionResponse response) {
|
||||
|
||||
try {
|
||||
Context context = request.getContext();
|
||||
PurchaseOrderSupplierLine line = context.asType(PurchaseOrderSupplierLine.class);
|
||||
|
||||
Map<String, BigDecimal> map = Beans.get(PurchaseOrderSupplierLineService.class).compute(line);
|
||||
response.setValues(map);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void computeBudgetDistribution(ActionRequest request, ActionResponse response){
|
||||
|
||||
PurchaseOrderSupplierLine purchaseOrderSupplierLine = Beans.get(PurchaseOrderSupplierLineRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrderSupplierLine.class).getId());
|
||||
Beans.get(PurchaseOrderServiceSupplychainImpl.class).computeBudgetDistribution(purchaseOrderSupplierLine.getPurchaseOrderLine());
|
||||
response.setReload(true);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
<?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="meta_metaMenu.csv" separator=";" type="com.axelor.meta.db.MetaMenu" search="self.name = :name" update="true" />
|
||||
|
||||
</csv-inputs>
|
||||
@ -0,0 +1,2 @@
|
||||
"name";"object";"can_read";"can_write";"can_create";"can_remove";"can_export";"condition";"conditionParams";"roleName"
|
||||
"perm.suppliermanagement.all";"com.axelor.apps.suppliermanagement.db.*";"x";"x";"x";"x";"x";;;"Admin"
|
||||
|
@ -0,0 +1,2 @@
|
||||
"name";"roles.name"
|
||||
"sc-root-purchase-order-supplier-lines-requests";"Admin"
|
||||
|
@ -0,0 +1,15 @@
|
||||
<?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="AppPurchase" lang="java" extends="App">
|
||||
<boolean name="supplierRequestMgt" title="Manage supplier consultations"/>
|
||||
|
||||
<track>
|
||||
<field name="supplierRequestMgt" on="UPDATE"/>
|
||||
</track>
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,18 @@
|
||||
<?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="purchase" package="com.axelor.apps.purchase.db"/>
|
||||
|
||||
<entity name="PurchaseOrder" lang="java">
|
||||
|
||||
|
||||
<!-- Champ du module Supplier Management -->
|
||||
<many-to-one name="parentPurchaseOrder" ref="com.axelor.apps.purchase.db.PurchaseOrder" title="Initial purchase order"/>
|
||||
<boolean name="isPurchaseParent" title="Purchase order"/>
|
||||
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,16 @@
|
||||
<?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="purchase" package="com.axelor.apps.purchase.db"/>
|
||||
|
||||
<entity name="PurchaseOrderLine" lang="java">
|
||||
|
||||
<!-- Champ du module Supplier Management -->
|
||||
<one-to-many name="purchaseOrderSupplierLineList" ref="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine" mappedBy="purchaseOrderLine" title="Suppliers requests"/>
|
||||
<many-to-one name="supplierPartner" ref="com.axelor.apps.base.db.Partner" title="Supplier"/>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,76 @@
|
||||
<?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="suppliermanagement" package="com.axelor.apps.suppliermanagement.db"/>
|
||||
|
||||
<entity name="PurchaseOrderSupplierLine" lang="java">
|
||||
|
||||
<many-to-one name="purchaseOrderLine" ref="com.axelor.apps.purchase.db.PurchaseOrderLine" title="Purchase order" index="idx_suppmanage_po_supp_line_po_line"/>
|
||||
|
||||
<decimal name="availableQty" title="Available qty" default="0"/>
|
||||
|
||||
<decimal name="price" title="Unit price" initParam="true"/>
|
||||
|
||||
<string name="comments" title="Comments" large="true"/>
|
||||
|
||||
<date name="estimatedDelivDate" title="Estim. delivery date"/>
|
||||
|
||||
<integer name="stateSelect" title="State" selection="isuppliermanagement.purchase.order.supplier.line.state.select" initParam="true"/>
|
||||
|
||||
<many-to-one name="supplierPartner" ref="com.axelor.apps.base.db.Partner" title="Supplier" initParam="true" index="idx_suppmanage_po_supp_line_supp_partner"/>
|
||||
|
||||
<!-- sophal -->
|
||||
<many-to-one name="taxLine" ref="com.axelor.apps.account.db.TaxLine" title="Tax"/>
|
||||
<!-- Total HT -->
|
||||
<decimal name="exTaxTotal" title="Total W.T." scale="2" precision="20" readonly="true"/>
|
||||
<!-- Total T.V.A. -->
|
||||
<decimal name="taxTotal" title="Total Tax" scale="2" precision="20" readonly="true"/>
|
||||
<!-- Total T.T.C -->
|
||||
<decimal name="inTaxTotal" title="Total A.T.I." scale="2" precision="20" readonly="true"/>
|
||||
<many-to-one name="currency" ref="com.axelor.apps.base.db.Currency" title="Currency"/>
|
||||
|
||||
<many-to-one name="acceptedByUser" ref="com.axelor.auth.db.User" readonly="true" title="Accepted by"/>
|
||||
<date name="acceptanceDate" title="Acceptance date" readonly="true"/>
|
||||
|
||||
<many-to-one name="refusedByUser" ref="com.axelor.auth.db.User" readonly="true" title="Refused by"/>
|
||||
<date name="refusalDate" title="refusal date" readonly="true"/>
|
||||
|
||||
<many-to-one name="standbyByUser" ref="com.axelor.auth.db.User" readonly="true" title="Standby by"/>
|
||||
<date name="standbyDate" title="Standby date" readonly="true"/>
|
||||
|
||||
<many-to-one name="approvedByUser" ref="com.axelor.auth.db.User" readonly="true" title="Approved by"/>
|
||||
<date name="approvalDate" title="Approval date" readonly="true"/>
|
||||
|
||||
<decimal name="discountAmount" title="Discount amount" precision="20" scale="10"/>
|
||||
<integer name="discountTypeSelect" title="Discount Type" selection="base.price.list.line.amount.type.select" default="0" />
|
||||
<decimal name="priceDiscounted" title="Unit price discounted" precision="20" scale="10"/>
|
||||
|
||||
<!-- sophal -->
|
||||
<string name="rejectionRaison" title="Rejection Raison" large="true"/>
|
||||
<string name="standbyRaison" title="Standby Raison" large="true"/>
|
||||
|
||||
<decimal name="budgetRemainingAmount" title="Budget remaining amount" precision="20" scale="10"/>
|
||||
|
||||
<extra-code><![CDATA[
|
||||
|
||||
//STATE SELECT
|
||||
public static final int STATE_REQUESTED = 1;
|
||||
public static final int STATE_SUBMITTED = 2;
|
||||
public static final int STATE_ACCEPTED = 3;
|
||||
public static final int STATE_NOT_ACCEPTED = 4;
|
||||
public static final int STATE_CANCELED = 5;
|
||||
public static final int STATE_STANDBY = 6;
|
||||
public static final int STATE_APPROVED = 7;
|
||||
]]>
|
||||
</extra-code>
|
||||
|
||||
<!-- sophal -->
|
||||
<track>
|
||||
<field name="stateSelect"/>
|
||||
</track>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept",,,
|
||||
"Accepted",,,
|
||||
"Actions",,,
|
||||
"Available qty",,,
|
||||
"Cancel",,,
|
||||
"Canceled",,,
|
||||
"Comments",,,
|
||||
"Estim. delivery date",,,
|
||||
"Generate all suppliers requests",,,
|
||||
"Generate suppliers purchase orders",,,
|
||||
"Initial purchase order",,,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.",,,
|
||||
"My R.F.Q. to complete",,,
|
||||
"My deliveries",,,
|
||||
"My purchase orders",,,
|
||||
"My space",,,
|
||||
"Not accept",,,
|
||||
"Not accepted",,,
|
||||
"Ordered quantity",,,
|
||||
"Purchase order",,,
|
||||
"Purchase order Details",,,
|
||||
"Receipt date",,,
|
||||
"Request",,,
|
||||
"Requested",,,
|
||||
"Show suppliers purchase orders",,,
|
||||
"State",,,
|
||||
"Status",,,
|
||||
"Stock move",,,
|
||||
"Stock move informations",,,
|
||||
"Stock move line",,,
|
||||
"Stock move lines",,,
|
||||
"Stock move reference",,,
|
||||
"Stock moves",,,
|
||||
"Submit",,,
|
||||
"Submitted",,,
|
||||
"Supplier",,,
|
||||
"Supplier RFQ/PO",,,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request",,,
|
||||
"Supplier's consulting's request created",,,
|
||||
"Suppliers orders' generation over",,,
|
||||
"Suppliers purchase",,,
|
||||
"Suppliers requests",,,
|
||||
"Tools",,,
|
||||
"Unit price",,,
|
||||
"WARNING : To Date must be after or equals to From Date",,,
|
||||
"Write to the supplier",,,
|
||||
"suppliers requests",,,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Akzeptieren",,
|
||||
"Accepted","Akzeptiert",,
|
||||
"Actions","Aktionen",,
|
||||
"Available qty","Verfügbare Menge",,
|
||||
"Cancel","Abbrechen",,
|
||||
"Canceled","Abgesagt",,
|
||||
"Comments","Kommentare",,
|
||||
"Estim. delivery date","Voraussichtlicher Liefertermin",,
|
||||
"Generate all suppliers requests","Generierung aller Lieferantenanfragen",,
|
||||
"Generate suppliers purchase orders","Lieferantenbestellungen generieren",,
|
||||
"Initial purchase order","Erstbestellung",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","My R.F.Q.",,
|
||||
"My R.F.Q. to complete","Mein R.F.Q. zum Ausfüllen",,
|
||||
"My deliveries","Meine Lieferungen",,
|
||||
"My purchase orders","Meine Bestellungen",,
|
||||
"My space","Mein Bereich",,
|
||||
"Not accept","Nicht akzeptieren",,
|
||||
"Not accepted","Nicht akzeptiert",,
|
||||
"Ordered quantity","Bestellmenge",,
|
||||
"Purchase order","Bestellung",,
|
||||
"Purchase order Details","Bestelldaten",,
|
||||
"Receipt date","Eingangsdatum",,
|
||||
"Request","Anfrage",,
|
||||
"Requested","Angefordert",,
|
||||
"Show suppliers purchase orders","Lieferantenbestellungen anzeigen",,
|
||||
"State","Zustand",,
|
||||
"Status","Status",,
|
||||
"Stock move","Lagerbewegung",,
|
||||
"Stock move informations","Informationen zur Lagerbewegung",,
|
||||
"Stock move line","Lagerbewegungslinie",,
|
||||
"Stock move lines","Lagerbewegungslinien",,
|
||||
"Stock move reference","Referenz zur Lagerbewegung",,
|
||||
"Stock moves","Lagerbewegungen",,
|
||||
"Submit","Absenden",,
|
||||
"Submitted","Eingereicht",,
|
||||
"Supplier","Lieferant",,
|
||||
"Supplier RFQ/PO","Lieferantenanfrage/PO",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Lieferantenanfrage",,
|
||||
"Supplier's consulting's request created","Anfrage der Lieferantenberatung erstellt",,
|
||||
"Suppliers orders' generation over","Generierung von Lieferantenaufträgen über die gesamte Laufzeit",,
|
||||
"Suppliers purchase","Lieferanten kaufen",,
|
||||
"Suppliers requests","Anfragen von Lieferanten",,
|
||||
"Tools","Werkzeuge",,
|
||||
"Unit price","Stückpreis",,
|
||||
"WARNING : To Date must be after or equals to From Date","WARNUNG: Bis-Datum muss nach oder gleich dem Von-Datum sein.",,
|
||||
"Write to the supplier","Schreiben Sie an den Lieferanten",,
|
||||
"suppliers requests","Lieferantenanfragen",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept",,,
|
||||
"Accepted",,,
|
||||
"Actions",,,
|
||||
"Available qty",,,
|
||||
"Cancel",,,
|
||||
"Canceled",,,
|
||||
"Comments",,,
|
||||
"Estim. delivery date",,,
|
||||
"Generate all suppliers requests",,,
|
||||
"Generate suppliers purchase orders",,,
|
||||
"Initial purchase order",,,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.",,,
|
||||
"My R.F.Q. to complete",,,
|
||||
"My deliveries",,,
|
||||
"My purchase orders",,,
|
||||
"My space",,,
|
||||
"Not accept",,,
|
||||
"Not accepted",,,
|
||||
"Ordered quantity",,,
|
||||
"Purchase order",,,
|
||||
"Purchase order Details",,,
|
||||
"Receipt date",,,
|
||||
"Request",,,
|
||||
"Requested",,,
|
||||
"Show suppliers purchase orders",,,
|
||||
"State",,,
|
||||
"Status",,,
|
||||
"Stock move",,,
|
||||
"Stock move informations",,,
|
||||
"Stock move line",,,
|
||||
"Stock move lines",,,
|
||||
"Stock move reference",,,
|
||||
"Stock moves",,,
|
||||
"Submit",,,
|
||||
"Submitted",,,
|
||||
"Supplier",,,
|
||||
"Supplier RFQ/PO",,,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request",,,
|
||||
"Supplier's consulting's request created",,,
|
||||
"Suppliers orders' generation over",,,
|
||||
"Suppliers purchase",,,
|
||||
"Suppliers requests",,,
|
||||
"Tools",,,
|
||||
"Unit price",,,
|
||||
"WARNING : To Date must be after or equals to From Date",,,
|
||||
"Write to the supplier",,,
|
||||
"suppliers requests",,,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Aceptar",,
|
||||
"Accepted","Aceptado",,
|
||||
"Actions","Acciones",,
|
||||
"Available qty","Cantidad disponible",,
|
||||
"Cancel","Cancelar",,
|
||||
"Canceled","Cancelado",,
|
||||
"Comments","Comentarios",,
|
||||
"Estim. delivery date","Fecha estimada de entrega",,
|
||||
"Generate all suppliers requests","Generar todas las solicitudes de los proveedores",,
|
||||
"Generate suppliers purchase orders","Generar órdenes de compra de proveedores",,
|
||||
"Initial purchase order","Pedido inicial",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","Mi R.F.Q.",,
|
||||
"My R.F.Q. to complete","Mi R.F.Q. para completar",,
|
||||
"My deliveries","Mis entregas",,
|
||||
"My purchase orders","Mis pedidos",,
|
||||
"My space","Mi espacio",,
|
||||
"Not accept","No aceptar",,
|
||||
"Not accepted","No se acepta",,
|
||||
"Ordered quantity","Cantidad pedida",,
|
||||
"Purchase order","Pedido",,
|
||||
"Purchase order Details","Detalles de la orden de compra",,
|
||||
"Receipt date","Fecha de entrada",,
|
||||
"Request","Solicitar",,
|
||||
"Requested","Solicitado",,
|
||||
"Show suppliers purchase orders","Mostrar pedidos de proveedores",,
|
||||
"State","Estado",,
|
||||
"Status","Estado",,
|
||||
"Stock move","Movimiento de stock",,
|
||||
"Stock move informations","Información de movimientos de acciones",,
|
||||
"Stock move line","Línea de movimiento",,
|
||||
"Stock move lines","Líneas de movimiento",,
|
||||
"Stock move reference","Referencia de movimiento de stock",,
|
||||
"Stock moves","Movimientos de stock",,
|
||||
"Submit","Enviar",,
|
||||
"Submitted","Presentado",,
|
||||
"Supplier","Proveedor",,
|
||||
"Supplier RFQ/PO","Petición de oferta/PO de proveedor",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Solicitud de proveedor",,
|
||||
"Supplier's consulting's request created","Creación de la solicitud de consultoría del proveedor",,
|
||||
"Suppliers orders' generation over","Generación de pedidos de proveedores a lo largo de",,
|
||||
"Suppliers purchase","Compra de proveedores",,
|
||||
"Suppliers requests","Solicitudes de proveedores",,
|
||||
"Tools","Herramientas",,
|
||||
"Unit price","Precio unitario",,
|
||||
"WARNING : To Date must be after or equals to From Date","ADVERTENCIA : Hasta la fecha debe ser posterior o igual a Desde la fecha",,
|
||||
"Write to the supplier","Escribir al proveedor",,
|
||||
"suppliers requests","solicitudes de proveedores",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Accepter",,
|
||||
"Accepted","Accepté",,
|
||||
"Actions","Actions",,
|
||||
"Available qty","Qté disponible",,
|
||||
"Cancel","Annuler",,
|
||||
"Canceled","Annulé",,
|
||||
"Comments","Commentaires",,
|
||||
"Estim. delivery date","Date de livr. Estimée",,
|
||||
"Generate all suppliers requests","Générer toutes les demandes aux fournisseurs",,
|
||||
"Generate suppliers purchase orders","Générer commandes fournisseurs",,
|
||||
"Initial purchase order","Cmde initiale",,
|
||||
"Manage supplier consultations","Gestion des consultations fournisseurs",,
|
||||
"My R.F.Q.","Mes demandes de cotations",,
|
||||
"My R.F.Q. to complete","Mes demandes de cotations à compléter",,
|
||||
"My deliveries","Mes livraisons",,
|
||||
"My purchase orders","Mes commandes",,
|
||||
"My space","Mon espace",,
|
||||
"Not accept","Ne pas retenir",,
|
||||
"Not accepted","Non retenu",,
|
||||
"Ordered quantity","Quantité commandée",,
|
||||
"Purchase order","Commande d'Achat",,
|
||||
"Purchase order Details","Informations sur la commande d'achat",,
|
||||
"Receipt date","Date de reception",,
|
||||
"Request","Demander",,
|
||||
"Requested","Demandé",,
|
||||
"Show suppliers purchase orders","Les commandes fournisseurs associées",,
|
||||
"State","Statut",,
|
||||
"Status",,,
|
||||
"Stock move","Mouvement de stock",,
|
||||
"Stock move informations","Informations sur Stocks Internes",,
|
||||
"Stock move line","Ligne mvt. de stock",,
|
||||
"Stock move lines","Lignes mvt. de stock",,
|
||||
"Stock move reference","Références mouvement de stock",,
|
||||
"Stock moves","Mouvements de stock",,
|
||||
"Submit","Envoyer",,
|
||||
"Submitted","Soumis(e)",,
|
||||
"Supplier","Fournisseur",,
|
||||
"Supplier RFQ/PO","Dv/Cmde Fourn.",,
|
||||
"Supplier consultations","Consultations fournisseur",,
|
||||
"Supplier request","Demande d'achat",,
|
||||
"Supplier's consulting's request created","Demande de consultations fournisseurs créées",,
|
||||
"Suppliers orders' generation over","Génération des devis fournisseurs terminée",,
|
||||
"Suppliers purchase","Achats fournisseurs",,
|
||||
"Suppliers requests","Demandes d'achat",,
|
||||
"Tools",,,
|
||||
"Unit price","Prix unitaire",,
|
||||
"WARNING : To Date must be after or equals to From Date","Attention : Date de fin doit être égale ou supérieure à Date de début",,
|
||||
"Write to the supplier","Ecrire au fournisseur",,
|
||||
"suppliers requests","Demandes de devis fournisseurs",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Accettare",,
|
||||
"Accepted","Accettati",,
|
||||
"Actions","Azioni",,
|
||||
"Available qty","Qtà disponibile",,
|
||||
"Cancel","Annulla",,
|
||||
"Canceled","Annullato",,
|
||||
"Comments","Commenti",,
|
||||
"Estim. delivery date","Data di consegna prevista",,
|
||||
"Generate all suppliers requests","Generare tutte le richieste dei fornitori",,
|
||||
"Generate suppliers purchase orders","Generare gli ordini di acquisto dei fornitori",,
|
||||
"Initial purchase order","Ordine di acquisto iniziale",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","Il mio Q.Q.R.F.F.",,
|
||||
"My R.F.Q. to complete","Il mio Q.Q.R.F.F. da completare",,
|
||||
"My deliveries","Le mie consegne",,
|
||||
"My purchase orders","I miei ordini di acquisto",,
|
||||
"My space","Il mio spazio",,
|
||||
"Not accept","Non accetto",,
|
||||
"Not accepted","Non accettata",,
|
||||
"Ordered quantity","Quantità ordinata",,
|
||||
"Purchase order","Ordine d'acquisto",,
|
||||
"Purchase order Details","Dettagli dell'ordine di acquisto",,
|
||||
"Receipt date","Data di ricezione",,
|
||||
"Request","Richiesta",,
|
||||
"Requested","Richiesto",,
|
||||
"Show suppliers purchase orders","Mostra gli ordini di acquisto dei fornitori",,
|
||||
"State","Stato",,
|
||||
"Status","Stato",,
|
||||
"Stock move","Spostamento delle scorte",,
|
||||
"Stock move informations","Informazioni sulla movimentazione delle azioni",,
|
||||
"Stock move line","Linea stock move line",,
|
||||
"Stock move lines","Linee di spostamento delle scorte",,
|
||||
"Stock move reference","Riferimento per lo spostamento delle scorte",,
|
||||
"Stock moves","Movimenti di magazzino",,
|
||||
"Submit","Invia",,
|
||||
"Submitted","Presentato",,
|
||||
"Supplier","Fornitore",,
|
||||
"Supplier RFQ/PO","Fornitore RFQ/PO",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Richiesta del fornitore",,
|
||||
"Supplier's consulting's request created","Creazione della richiesta di consulenza del fornitore",,
|
||||
"Suppliers orders' generation over","Generazione degli ordini dei fornitori nel corso dell'anno",,
|
||||
"Suppliers purchase","Acquisto fornitori",,
|
||||
"Suppliers requests","Richieste dei fornitori",,
|
||||
"Tools","Strumenti",,
|
||||
"Unit price","Prezzo unitario",,
|
||||
"WARNING : To Date must be after or equals to From Date","ATTENZIONE: la data deve essere successiva o uguale a quella della data.",,
|
||||
"Write to the supplier","Scrivere al fornitore",,
|
||||
"suppliers requests","richieste dei fornitori",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Keur goed",,
|
||||
"Accepted","Aanvaard",,
|
||||
"Actions","Acties",,
|
||||
"Available qty","Beschikbaar qty",,
|
||||
"Cancel","Annuleren",,
|
||||
"Canceled","Geannuleerd",,
|
||||
"Comments","Commentaar",,
|
||||
"Estim. delivery date","Vermoedelijke leveringsdatum",,
|
||||
"Generate all suppliers requests","Genereer alle verzoeken van leveranciers",,
|
||||
"Generate suppliers purchase orders","Leveranciers inkooporders genereren",,
|
||||
"Initial purchase order","Eerste bestelling",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","Mijn R.F.Q.",,
|
||||
"My R.F.Q. to complete","Mijn R.F.Q. in te vullen",,
|
||||
"My deliveries","Mijn leveringen",,
|
||||
"My purchase orders","Mijn bestellingen",,
|
||||
"My space","Mijn ruimte",,
|
||||
"Not accept","Niet accepteren",,
|
||||
"Not accepted","Niet geaccepteerd",,
|
||||
"Ordered quantity","Bestelde hoeveelheid",,
|
||||
"Purchase order","Aankooporder",,
|
||||
"Purchase order Details","Aankooporder Details",,
|
||||
"Receipt date","Ontvangstdatum",,
|
||||
"Request","Aanvraag",,
|
||||
"Requested","Gevraagd",,
|
||||
"Show suppliers purchase orders","Toon leveranciers inkooporders",,
|
||||
"State","Staat",,
|
||||
"Status","Status",,
|
||||
"Stock move","Voorraadverhuizing",,
|
||||
"Stock move informations","Informatie over voorraadverplaatsingen",,
|
||||
"Stock move line","Voorraadverplaatsingslijn",,
|
||||
"Stock move lines","Voorraadverplaatsingslijnen",,
|
||||
"Stock move reference","Voorraadverplaatsing referentie",,
|
||||
"Stock moves","Voorraad verhuizingen",,
|
||||
"Submit","Aanmelden",,
|
||||
"Submitted","Ingediend",,
|
||||
"Supplier","Leverancier",,
|
||||
"Supplier RFQ/PO","Leverancier RFQ/PO",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Aanvraag leverancier",,
|
||||
"Supplier's consulting's request created","Het verzoek van de leverancier om advies opgesteld",,
|
||||
"Suppliers orders' generation over","Leveranciers orders genereren meer dan",,
|
||||
"Suppliers purchase","Leveranciers kopen",,
|
||||
"Suppliers requests","Verzoeken van leveranciers",,
|
||||
"Tools","Gereedschap",,
|
||||
"Unit price","Eenheidsprijs",,
|
||||
"WARNING : To Date must be after or equals to From Date","WAARSCHUWING: Tot datum moet na of gelijk zijn aan Vanaf datum",,
|
||||
"Write to the supplier","Schrijf naar de leverancier",,
|
||||
"suppliers requests","leveranciersaanvragen",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Akceptacja",,
|
||||
"Accepted","Przyjęty",,
|
||||
"Actions","Działania",,
|
||||
"Available qty","Dostępna ilość",,
|
||||
"Cancel","Anulowanie",,
|
||||
"Canceled","Anulowany",,
|
||||
"Comments","Komentarze",,
|
||||
"Estim. delivery date","Szacowana data dostawy",,
|
||||
"Generate all suppliers requests","Generowanie wszystkich zapytań od dostawców",,
|
||||
"Generate suppliers purchase orders","Generowanie zamówień zakupu dla dostawców",,
|
||||
"Initial purchase order","Pierwsze zamówienie zakupu",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","Moje R.F.Q.",,
|
||||
"My R.F.Q. to complete","Moje R.F.Q. do ukończenia",,
|
||||
"My deliveries","Moje dostawy",,
|
||||
"My purchase orders","Moje zamówienia zakupu",,
|
||||
"My space","Moja przestrzeń",,
|
||||
"Not accept","Nie akceptuj.",,
|
||||
"Not accepted","Nie przyjęto.",,
|
||||
"Ordered quantity","Zamówiona ilość",,
|
||||
"Purchase order","Zamówienie zakupu",,
|
||||
"Purchase order Details","Zamówienie zakupu Szczegóły",,
|
||||
"Receipt date","Data otrzymania",,
|
||||
"Request","Żądanie",,
|
||||
"Requested","Wnioskowany",,
|
||||
"Show suppliers purchase orders","Pokaż dostawcom zamówienia zakupu",,
|
||||
"State","państwo",,
|
||||
"Status","Status",,
|
||||
"Stock move","Przenoszenie zapasów",,
|
||||
"Stock move informations","Informacje o przesunięciach magazynowych",,
|
||||
"Stock move line","Linia przesuwu zapasów",,
|
||||
"Stock move lines","Linie przesuwu zapasów",,
|
||||
"Stock move reference","Odniesienie do przeniesienia zapasów",,
|
||||
"Stock moves","Przeniesienia magazynowe",,
|
||||
"Submit","Zgłoś się",,
|
||||
"Submitted","Przedłożone",,
|
||||
"Supplier","Dostawca",,
|
||||
"Supplier RFQ/PO","Dostawca RFQ/PO",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Żądanie dostawcy",,
|
||||
"Supplier's consulting's request created","Stworzony wniosek dostawcy o konsultację",,
|
||||
"Suppliers orders' generation over","Generowanie zamówień dostawców ponad",,
|
||||
"Suppliers purchase","Zakupy przez dostawców",,
|
||||
"Suppliers requests","Wnioski dostawców",,
|
||||
"Tools","Narzędzia",,
|
||||
"Unit price","Cena jednostkowa",,
|
||||
"WARNING : To Date must be after or equals to From Date","OSTRZEŻENIE: Data musi być późniejsza lub równa dacie",,
|
||||
"Write to the supplier","Napisz do dostawcy",,
|
||||
"suppliers requests","wnioski dostawców",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Aceitar",,
|
||||
"Accepted","Aceite",,
|
||||
"Actions","Ações",,
|
||||
"Available qty","Quantidade disponível",,
|
||||
"Cancel","Cancelar",,
|
||||
"Canceled","Cancelado",,
|
||||
"Comments","Comentários",,
|
||||
"Estim. delivery date","Data estimada de entrega",,
|
||||
"Generate all suppliers requests","Gerar todas as solicitações de fornecedores",,
|
||||
"Generate suppliers purchase orders","Gerar pedidos de compra de fornecedores",,
|
||||
"Initial purchase order","Pedido inicial",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","O meu R.F.Q.",,
|
||||
"My R.F.Q. to complete","O meu R.F.Q. para completar",,
|
||||
"My deliveries","Minhas entregas",,
|
||||
"My purchase orders","Meus pedidos de compra",,
|
||||
"My space","Meu espaço",,
|
||||
"Not accept","Não aceitar",,
|
||||
"Not accepted","Não aceite",,
|
||||
"Ordered quantity","Quantidade pedida",,
|
||||
"Purchase order","Pedido de compra",,
|
||||
"Purchase order Details","Detalhes do pedido de compra",,
|
||||
"Receipt date","Data de recebimento",,
|
||||
"Request","Solicitar",,
|
||||
"Requested","Solicitado",,
|
||||
"Show suppliers purchase orders","Mostrar pedidos de compra de fornecedores",,
|
||||
"State","Estado",,
|
||||
"Status","Estado",,
|
||||
"Stock move","Movimento de estoque",,
|
||||
"Stock move informations","Informações sobre movimento de estoque",,
|
||||
"Stock move line","Linha de movimentação de estoque",,
|
||||
"Stock move lines","Linhas de movimentação de estoque",,
|
||||
"Stock move reference","Referência de movimento de estoque",,
|
||||
"Stock moves","Movimentos de estoque",,
|
||||
"Submit","Enviar",,
|
||||
"Submitted","Submetido",,
|
||||
"Supplier","Fornecedor",,
|
||||
"Supplier RFQ/PO","Solicitação de cotação/ordem de compra do fornecedor",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Solicitação de fornecedor",,
|
||||
"Supplier's consulting's request created","Solicitação de consultoria do fornecedor criada",,
|
||||
"Suppliers orders' generation over","Geração de encomendas de fornecedores ao longo de",,
|
||||
"Suppliers purchase","Compra de fornecedores",,
|
||||
"Suppliers requests","Pedidos de fornecedores",,
|
||||
"Tools","Ferramentas",,
|
||||
"Unit price","Preço unitário",,
|
||||
"WARNING : To Date must be after or equals to From Date","AVISO: A data até deve ser posterior ou igual à data de início",,
|
||||
"Write to the supplier","Escrever para o fornecedor",,
|
||||
"suppliers requests","solicitações de fornecedores",,
|
||||
|
@ -0,0 +1,50 @@
|
||||
"key","message","comment","context"
|
||||
"Accept","Принять",,
|
||||
"Accepted","Принято",,
|
||||
"Actions","Действия",,
|
||||
"Available qty","Доступно qty",,
|
||||
"Cancel","Отмена",,
|
||||
"Canceled","Отмена",,
|
||||
"Comments","Комментарии",,
|
||||
"Estim. delivery date","Смета. дата поставки",,
|
||||
"Generate all suppliers requests","Генерировать все запросы поставщиков",,
|
||||
"Generate suppliers purchase orders","Генерировать заказы на поставку от поставщиков",,
|
||||
"Initial purchase order","Первоначальный заказ на покупку",,
|
||||
"Manage supplier consultations",,,
|
||||
"My R.F.Q.","Мой R.F.Q.",,
|
||||
"My R.F.Q. to complete","Мой R.F.Q., чтобы закончить",,
|
||||
"My deliveries","Мои поставки",,
|
||||
"My purchase orders","Мои заказы",,
|
||||
"My space","Мое место",,
|
||||
"Not accept","Не принимаю",,
|
||||
"Not accepted","Не принято",,
|
||||
"Ordered quantity","Заказанное количество",,
|
||||
"Purchase order","Заказ на покупку",,
|
||||
"Purchase order Details","Заказ на поставку Детали",,
|
||||
"Receipt date","Дата получения",,
|
||||
"Request","Запрос",,
|
||||
"Requested","Запрошенный",,
|
||||
"Show suppliers purchase orders","Показать поставщикам заказы на поставку",,
|
||||
"State","Государство",,
|
||||
"Status","Статус",,
|
||||
"Stock move","Перемещение запасов",,
|
||||
"Stock move informations","Информация о движении запасов",,
|
||||
"Stock move line","Линия перемещения запасов",,
|
||||
"Stock move lines","Линии перемещения запасов",,
|
||||
"Stock move reference","Справочник по перемещению запасов",,
|
||||
"Stock moves","Перемещение запасов",,
|
||||
"Submit","Представить",,
|
||||
"Submitted","Представленный",,
|
||||
"Supplier","Поставщик",,
|
||||
"Supplier RFQ/PO","Поставщик RFQ/PO",,
|
||||
"Supplier consultations",,,
|
||||
"Supplier request","Запрос поставщика",,
|
||||
"Supplier's consulting's request created","Создан запрос поставщика на консультацию",,
|
||||
"Suppliers orders' generation over","Генерация заказов поставщиков свыше",,
|
||||
"Suppliers purchase","Покупка поставщиков",,
|
||||
"Suppliers requests","Запросы поставщиков",,
|
||||
"Tools","Инструменты",,
|
||||
"Unit price","Цена единицы",,
|
||||
"WARNING : To Date must be after or equals to From Date","ПРЕДУПРЕЖДЕНИЕ: Свидание должно быть после даты или равно дате от нее.",,
|
||||
"Write to the supplier","Напишите поставщику.",,
|
||||
"suppliers requests","запросы поставщиков",,
|
||||
|
@ -0,0 +1,18 @@
|
||||
<?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="supplychain_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="supplychain_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,2 @@
|
||||
"name";"roles.name"
|
||||
"sc-root-purchase-order-supplier-lines-requests";"Supplychain Manager|Supplychain User|Supplychain Read"
|
||||
|
@ -0,0 +1,4 @@
|
||||
"name";"object";"can_read";"can_write";"can_create";"can_remove";"can_export";"condition";"conditionParams";"roleName"
|
||||
"perm.suppliermanagement.PurchaseOrderSupplierLine.r";"com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine";"x";;;;;;;"Supplychain Read"
|
||||
"perm.suppliermanagement.PurchaseOrderSupplierLine.rwc";"com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine";"x";"x";"x";;;;;"Supplychain User"
|
||||
"perm.suppliermanagement.PurchaseOrderSupplierLine.rwcde";"com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine";"x";"x";"x";"x";"x";;;"Supplychain Manager"
|
||||
|
@ -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">
|
||||
|
||||
|
||||
<menuitem name="sc-root-purchase-order-supplier-lines-requests" title="Supplier consultations" order="30" if="__config__.app.getApp('purchase') && __config__.app.getApp('purchase').getSupplierRequestMgt()"
|
||||
action="sc.root.purchase.orders.supplier.lines.requests" parent="sc-root-purchase"/>
|
||||
|
||||
<action-view name="sc.root.purchase.orders.supplier.lines.requests" title="Supplier consultations"
|
||||
model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine" >
|
||||
<view type="grid" name="purchase-order-supplier-line-grid" />
|
||||
<view type="form" name="purchase-order-supplier-line-form" />
|
||||
</action-view>
|
||||
|
||||
|
||||
</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">
|
||||
|
||||
<form name="purchase-order-supplier-form" title="Supplier RFQ/PO" model="com.axelor.apps.purchase.db.PurchaseOrder" >
|
||||
<panel name="mainPanel" colSpan="12">
|
||||
<field name="isPurchaseParent"/>
|
||||
<field name="parentPurchaseOrder" hideIf="isPurchaseParent" form-view="purchase-order-form" grid-view="purchase-order-grid"/>
|
||||
<button name="generateSuppliersPurchaseOrderBtn" title="Generate suppliers purchase orders" onClick="save,action-purchase-order-method-generate-suppliers-purchase-order,save"/>
|
||||
<button name="showSuppliersPurchaseOrderBtn" title="Show suppliers purchase orders" onClick="action-purchase-order-view-show-suppliers-purchase-order"/>
|
||||
<button name="generatePurchaseOrderSupplierLineBtn" title="Generate all suppliers requests" onClick="save,action-purchase-order-method-generate-purchase-order-supplier-line,save"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<action-method name="action-purchase-order-method-generate-suppliers-purchase-order">
|
||||
<call class="com.axelor.apps.suppliermanagement.web.PurchaseOrderController" method="generateSuppliersPurchaseOrder"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-purchase-order-method-generate-purchase-order-supplier-line">
|
||||
<call class="com.axelor.apps.suppliermanagement.web.PurchaseOrderController" method="generateSuppliersRequests"/>
|
||||
</action-method>
|
||||
|
||||
<action-view name="action-purchase-order-view-show-suppliers-purchase-order" model="com.axelor.apps.purchase.db.PurchaseOrder" title="Suppliers purchase">
|
||||
<view type="grid" name="purchase-order-grid"/>
|
||||
<view type="form" name="purchase-order-form"/>
|
||||
<domain>self.parentPurchaseOrder.id = :_parentPurchaseOrderId</domain>
|
||||
<context name="_parentPurchaseOrderId" expr="eval: __this__.id"/>
|
||||
</action-view>
|
||||
|
||||
|
||||
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,115 @@
|
||||
<?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="purchase-order-supplier-line-grid" title="suppliers requests" canNew="false" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<hilite if="stateSelect == 1" color="info" />
|
||||
<hilite if="stateSelect == 2" color="primary" />
|
||||
<hilite if="stateSelect == 3" color="success" />
|
||||
<hilite if="stateSelect == 4" color="warning" />
|
||||
<hilite if="stateSelect == 5" color="danger" />
|
||||
<field name="supplierPartner" form-view="partner-form" grid-view="partner-grid"/>
|
||||
<field name="purchaseOrderLine.product" form-view="product-form" grid-view="product-grid" />
|
||||
<field name="availableQty" aggregate="sum"/>
|
||||
<field name="purchaseOrderLine.unit" form-view="unit-form" grid-view="unit-grid"/>
|
||||
<field name="price"/>
|
||||
<field name="estimatedDelivDate"/>
|
||||
<field name="stateSelect"/>
|
||||
</grid>
|
||||
|
||||
<form name="purchase-order-supplier-line-form" title="Supplier request" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine"
|
||||
onNew="action-purchase-order-supplier-line-record-request,action-purchase-order-supplier-line-attrs-new" canNew="false">
|
||||
<menubar>
|
||||
<menu name="purchaseOrderSupplierLineToolsMenu" title="Tools">
|
||||
<item name="writeToSupplierItem" title="Write to the supplier" action="save,action-send-by-email-with-template"/>
|
||||
</menu>
|
||||
</menubar>
|
||||
|
||||
<panel name="statusPanel" title="Status">
|
||||
<field name="stateSelect" showTitle="false" readonly="true" colSpan="12" widget="NavSelect"/>
|
||||
</panel>
|
||||
<panel name="mainPanel" >
|
||||
<field name="supplierPartner" onSelect="action-purchase-order-supplier-line-method-supplier-partner-domain" form-view="partner-form" grid-view="partner-grid"/>
|
||||
<field name="availableQty"/>
|
||||
<field name="purchaseOrderLine.unit" form-view="unit-form" grid-view="unit-grid"/>
|
||||
<field name="price"/>
|
||||
<field name="estimatedDelivDate"/>
|
||||
</panel>
|
||||
<panel name="purchaseOrderDetailsPanel" title="Purchase order Details" readOnly="true">
|
||||
<field name="purchaseOrderLine"/>
|
||||
<field name="purchaseOrderLine.product"/>
|
||||
<field name="purchaseOrderLine.qty" title="Ordered quantity"/>
|
||||
<field name="purchaseOrderLine.price"/>
|
||||
<field name="purchaseOrderLine.desiredDelivDate"/>
|
||||
</panel>
|
||||
<panel name="commentsPanel">
|
||||
<field name="comments" colSpan="12"/>
|
||||
</panel>
|
||||
<panel sidebar="true" name="actionsPanel" title="Actions">
|
||||
<button name="acceptBtn" title="Accept" showIf="stateSelect == 1 || stateSelect == 2" onClick="save,action-purchase-order-supplier-line-method-accept,save"/>
|
||||
<button name="notAcceptBtn" title="Not accept" showIf="stateSelect == 1 || stateSelect == 2" onClick="save,action-purchase-order-supplier-line-record-not-accept,save"/>
|
||||
<button name="cancelBtn" title="Cancel" hideIf="stateSelect == 5" onClick="save,action-purchase-order-supplier-line-record-cancel,save"/>
|
||||
<button name="requestBtn" title="Request" showIf="stateSelect == 5" onClick="save,action-purchase-order-supplier-line-record-request,save"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<grid name="purchase-order-supplier-line-supplier-grid" title="Suppliers requests" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<field name="purchaseOrderLine.product" form-view="product-form" grid-view="product-grid"/>
|
||||
<field name="purchaseOrderLine.qty"/>
|
||||
<field name="purchaseOrderLine.desiredDelivDate"/>
|
||||
<field name="availableQty" aggregate="sum"/>
|
||||
<field name="purchaseOrderLine.unit" form-view="unit-form" grid-view="unit-grid"/>
|
||||
<field name="price"/>
|
||||
<field name="estimatedDelivDate"/>
|
||||
<field name="comments"/>
|
||||
<field name="stateSelect"/>
|
||||
</grid>
|
||||
|
||||
<form name="purchase-order-supplier-line-supplier-form" title="Supplier request" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine" width="large">
|
||||
<panel name="mainPanel" >
|
||||
<field name="stateSelect" showTitle="false" readonly="true" colSpan="12" widget="NavSelect"/>
|
||||
<field name="purchaseOrderLine.purchaseOrder.purchaseOrderSeq"/>
|
||||
<field name="purchaseOrderLine.product" form-view="product-form" grid-view="product-grid"/>
|
||||
<field name="purchaseOrderLine.qty"/>
|
||||
<field name="purchaseOrderLine.unit" form-view="unit-form" grid-view="unit-grid"/>
|
||||
<field name="availableQty" readonlyIf="stateSelect != 1"/>
|
||||
<field name="purchaseOrderLine.desiredDelivDate"/>
|
||||
<field name="price" readonlyIf="stateSelect != 1"/>
|
||||
<field name="estimatedDelivDate" readonlyIf="stateSelect != 1"/>
|
||||
<button name="submit" title="Submit" showIf="stateSelect == 1" onClick="save,action-purchase-order-supplier-line-record-submit,save"/>
|
||||
</panel>
|
||||
<panel name="commentsPanel">
|
||||
<field name="comments" colSpan="12"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<action-record name="action-purchase-order-supplier-line-record-request" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<field name="stateSelect" expr="1"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-purchase-order-supplier-line-record-submit" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<field name="stateSelect" expr="2"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-purchase-order-supplier-line-record-not-accept" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<field name="stateSelect" expr="4"/>
|
||||
</action-record>
|
||||
|
||||
<action-record name="action-purchase-order-supplier-line-record-cancel" model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<field name="stateSelect" expr="5"/>
|
||||
</action-record>
|
||||
|
||||
<action-method name="action-purchase-order-supplier-line-method-accept">
|
||||
<call class="com.axelor.apps.suppliermanagement.web.PurchaseOrderSupplierLineController" method="accept"/>
|
||||
</action-method>
|
||||
|
||||
<action-method name="action-purchase-order-supplier-line-method-supplier-partner-domain">
|
||||
<call class="com.axelor.apps.suppliermanagement.web.PurchaseOrderSupplierLineController" method="supplierPartnerDomain"/>
|
||||
</action-method>
|
||||
|
||||
<action-attrs name="action-purchase-order-supplier-line-attrs-new">
|
||||
<attribute name="readonly" for="supplierPartner" expr="eval: false"/>
|
||||
</action-attrs>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,18 @@
|
||||
<?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">
|
||||
|
||||
|
||||
<!-- Nomenclature : * name : "interfaceName" + "fieldName" + ".select" -->
|
||||
|
||||
<selection name="isuppliermanagement.purchase.order.supplier.line.state.select">
|
||||
<option value="1">Requested</option>
|
||||
<option value="2">Submitted</option>
|
||||
<option value="3">Accepted</option>
|
||||
<option value="4">Not accepted</option>
|
||||
<option value="5">Canceled</option>
|
||||
</selection>
|
||||
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,101 @@
|
||||
<?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-view name="wizard-supplier-view" title="My space" model="com.axelor.apps.base.db.Wizard">
|
||||
<view type="form" name="wizard-supplier-form"/>
|
||||
<view-param name="show-toolbar" value="false"/>
|
||||
</action-view>
|
||||
|
||||
<form name="wizard-supplier-form" title="My space" model="com.axelor.apps.base.db.Wizard">
|
||||
<panel name="mainPanel" hidden="true">
|
||||
<field name="id"/>
|
||||
</panel>
|
||||
<panel name="actionsPanel">
|
||||
<button name="myPurchaseOrderBtn" title="My purchase orders" onClick="wizard-supplier-form-open-my-purchase-order" css="img-button client-img-menu" icon="img/128px/clientMenuSo_128px.jpg"/>
|
||||
<button name="myRFQToCompleteBtn" title="My R.F.Q. to complete" onClick="wizard-supplier-form-open-my-rfq-to-complete" css="img-button client-img-menu" icon="img/128px/clientMenuInvoice_128px.jpg"/>
|
||||
<button name="myRFQBtn" title="My R.F.Q." onClick="wizard-supplier-form-open-my-rfq" css="img-button client-img-menu" icon="img/128px/clientMenuTicket_128px.jpg"/>
|
||||
<button name="myStockMoveBtn" title="My deliveries" onClick="wizard-supplier-form-open-stock-move" css="img-button client-img-menu" icon="img/128px/clientMenuTicket_128px.jpg"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
<action-view name="wizard-supplier-form-open-my-purchase-order" title="My purchase orders"
|
||||
model="com.axelor.apps.purchase.db.PurchaseOrder">
|
||||
<view type="grid" name="purchase-order-grid"/>
|
||||
<view type="form" name="purchase-order-form"/>
|
||||
<domain>self.supplierPartner = :_myPartner AND self.statusSelect in (2,3,4,5)</domain>
|
||||
<context name="_myPartner" expr="call:com.axelor.apps.base.service.user.UserService:getUserPartner()"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="wizard-supplier-form-open-my-rfq-to-complete" title="My R.F.Q. to complete"
|
||||
model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<view type="grid" name="purchase-order-supplier-line-supplier-grid"/>
|
||||
<view type="form" name="purchase-order-supplier-line-supplier-form"/>
|
||||
<domain>self.supplierPartner = :_myPartner AND self.stateSelect = 1</domain>
|
||||
<context name="_myPartner" expr="call:com.axelor.apps.base.service.user.UserService:getUserPartner()"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="wizard-supplier-form-open-my-rfq" title="My R.F.Q."
|
||||
model="com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine">
|
||||
<view type="grid" name="purchase-order-supplier-line-supplier-grid"/>
|
||||
<view type="form" name="purchase-order-supplier-line-supplier-form"/>
|
||||
<domain>self.supplierPartner = :_myPartner AND self.stateSelect in (2,3,4)</domain>
|
||||
<context name="_myPartner" expr="call:com.axelor.apps.base.service.user.UserService:getUserPartner()"/>
|
||||
</action-view>
|
||||
|
||||
<action-view name="wizard-supplier-form-open-stock-move" title="My deliveries"
|
||||
model="com.axelor.apps.stock.db.StockMove">
|
||||
<view type="grid" name="stock-move-supplier-grid"/>
|
||||
<view type="form" name="stock-move-supplier-form"/>
|
||||
<domain>self.typeSelect = 3 AND self.partner = :_myPartner</domain>
|
||||
<context name="_myPartner" expr="call:com.axelor.apps.base.service.user.UserService:getUserPartner()"/>
|
||||
</action-view>
|
||||
|
||||
<grid name="stock-move-supplier-grid" title="Stock moves" model="com.axelor.apps.stock.db.StockMove" orderBy="-estimatedDate" canNew="false" canDelete="false">
|
||||
<field name="stockMoveSeq"/>
|
||||
<field name="estimatedDate"/>
|
||||
<field name="realDate"/>
|
||||
<field name="toAddress"/>
|
||||
<field name="company" if="__config__.app.getApp('base').getEnableMultiCompany()"/>
|
||||
<field name="partner"/>
|
||||
<field name="statusSelect"/>
|
||||
</grid>
|
||||
|
||||
<form name="stock-move-supplier-form" title="Stock move" model="com.axelor.apps.stock.db.StockMove" canNew="false" canDelete="false" canCopy="false">
|
||||
<panel name="statusPanel" >
|
||||
<field name="statusSelect" readonly="true" widget="NavSelect" colSpan="12"/>
|
||||
</panel>
|
||||
<panel name="generalInfoPanel" readonly="true">
|
||||
<panel name="detailsPanel" title="Stock move reference">
|
||||
<field name="stockMoveSeq" colSpan="12"/>
|
||||
<field name="name" colSpan="12"/>
|
||||
<field name="company" widget="SuggestBox" form-view="company-form" colSpan="12"/>
|
||||
<field name="partner" domain="self.isContact = false" form-view="partner-form" grid-view="partner-grid" colSpan="12"/>
|
||||
</panel>
|
||||
<panel name="stockMoveInformationsPanel" title="Stock move informations">
|
||||
<field name="estimatedDate" colSpan="12"/>
|
||||
<field name="realDate" title="Receipt date" colSpan="12"/>
|
||||
<field name="fromAddress" showIf="typeSelect == 3" colSpan="12"/>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel-related name="stockMoveLineListPanel" field="stockMoveLineList" readonlyIf="company == null || fromStockLocation == null" colSpan="12" canNew="false" canRemove="false" form-view="stock-move-line-supplier-form" grid-view="stock-move-line-supplier-grid"/>
|
||||
</form>
|
||||
|
||||
<grid name="stock-move-line-supplier-grid" title="Stock move lines" model="com.axelor.apps.stock.db.StockMoveLine" editable="true">
|
||||
<field name="product" readonly="true"/>
|
||||
<field name="shippedQty"/>
|
||||
<field name="unit" readonly="true"/>
|
||||
<field name="shippedDate"/>
|
||||
</grid>
|
||||
|
||||
<form name="stock-move-line-supplier-form" title="Stock move line" model="com.axelor.apps.stock.db.StockMoveLine">
|
||||
<panel name="mainPanel" >
|
||||
<field name="product" readonly="true"/>
|
||||
<field name="shippedQty"/>
|
||||
<field name="unit" readonly="true"/>
|
||||
<field name="shippedDate"/>
|
||||
</panel>
|
||||
</form>
|
||||
|
||||
</object-views>
|
||||
@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
|
||||
<persistence-unit name="testUnit" transaction-type="RESOURCE_LOCAL">
|
||||
<provider>org.hibernate.ejb.HibernatePersistence</provider>
|
||||
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
|
||||
<properties>
|
||||
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
|
||||
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
|
||||
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/axelor-erp" />
|
||||
|
||||
<property name="javax.persistence.jdbc.user" value="axelor" />
|
||||
<property name="javax.persistence.jdbc.password" value="" />
|
||||
|
||||
<!--
|
||||
value="create" to build a new database on each run;
|
||||
value="update" to modify an existing database;
|
||||
value="create-drop" means the same as "create" but also drops tables when Hibernate closes;
|
||||
value="validate" makes no changes to the database
|
||||
-->
|
||||
<property name="hibernate.hbm2ddl.auto" value="none" />
|
||||
|
||||
<!--
|
||||
<property name="hibernate.show_sql" value="true"/>
|
||||
-->
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
</persistence>
|
||||
Reference in New Issue
Block a user