temporary branch
This commit is contained in:
@@ -45,6 +45,8 @@ public interface IExceptionMessage {
|
||||
"The company is required and must be the same for all purchase orders" /*)*/;
|
||||
public static final String PURCHASE_ORDER_MERGE_ERROR_TRADING_NAME = /*$$(*/
|
||||
"The trading name must be the same for all purchase orders" /*)*/;
|
||||
public static final String PURCHASE_ORDER_MERGE_ERROR_STATUS_SELECT = /*$$(*/
|
||||
"The status select name must be the same for all purchase orders" /*)*/;
|
||||
|
||||
/** Blocking supplier */
|
||||
String SUPPLIER_BLOCKED = /*$$(*/ "This supplier is blocked:" /*)*/;
|
||||
@@ -70,8 +72,6 @@ public interface IExceptionMessage {
|
||||
"There is no sequence set for the purchase requests for the company %s" /*)*/;
|
||||
public static final String PURCHASE_REQUEST_MISSING_SUPPLIER_USER = /*$$(*/
|
||||
"Please enter supplier for following purchase request : %s" /*)*/;
|
||||
public static final String TCO = /*$$(*/
|
||||
"CTO not validated for products : %s" /*)*/;
|
||||
public static final String NO_TCO = /*$$(*/
|
||||
"CTO not present for products : %s" /*)*/;
|
||||
public static final String TCO = /*$$(*/ "CTO not validated for products : %s" /*)*/;
|
||||
public static final String NO_TCO = /*$$(*/ "CTO not present for products : %s" /*)*/;
|
||||
}
|
||||
|
||||
@@ -21,4 +21,5 @@ public interface IReport {
|
||||
|
||||
public static final String PURCHASE_ORDER = "PurchaseOrder.rptdesign";
|
||||
public static final String PURCHASE_REQUEST = "PurchaseRequest.rptdesign";
|
||||
public static final String COST_PRICE_SHEET = "CostPriceSheet.rptdesign";
|
||||
}
|
||||
|
||||
@@ -1,94 +1,117 @@
|
||||
package com.axelor.apps.purchase.service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.List;
|
||||
|
||||
import com.axelor.apps.base.db.Currency;
|
||||
import com.axelor.apps.base.db.repo.CurrencyRepository;
|
||||
import com.axelor.apps.base.service.CurrencyConversionService;
|
||||
import com.axelor.apps.base.service.CurrencyService;
|
||||
import com.axelor.apps.base.service.administration.SequenceService;
|
||||
import com.axelor.apps.purchase.db.ImportationFolder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.repo.ImportationFolderRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderLineRepository;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import java.math.BigDecimal;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import wslite.json.JSONException;
|
||||
|
||||
import com.axelor.inject.Beans;
|
||||
|
||||
|
||||
public class ImportationFolderServiceImpl implements ImportationFolderService {
|
||||
|
||||
@Inject
|
||||
protected ImportationFolderRepository importationFolderRepository;
|
||||
@Inject protected ImportationFolderRepository importationFolderRepository;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void draftImportationFolder(ImportationFolder importationFolder) {
|
||||
// TODO Auto-generated method stub
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_DRAFT);
|
||||
@Override
|
||||
@Transactional
|
||||
public void draftImportationFolder(ImportationFolder importationFolder) {
|
||||
// TODO Auto-generated method stub
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_DRAFT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void openImportationFolder(ImportationFolder importationFolder) throws AxelorException {
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_OPEND);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void closeImportationFolder(ImportationFolder importationFolder) {
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_CLOSED);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void cancelImportationFolder(ImportationFolder importationFolder) {
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_CANCELED);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void calculateSum(List<PurchaseOrder> purchaseOrders, ImportationFolder importationFolder)
|
||||
throws MalformedURLException, JSONException, AxelorException {
|
||||
BigDecimal amount = BigDecimal.ZERO;
|
||||
BigDecimal taxAmount = BigDecimal.ZERO;
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
|
||||
for (PurchaseOrder purchaseOrder : purchaseOrders) {
|
||||
if (purchaseOrder.getCurrency().getId() == 148 || purchaseOrder.getCurrency().getId() == 46) {
|
||||
Currency currency =
|
||||
Beans.get(CurrencyRepository.class).find(purchaseOrder.getCurrency().getId());
|
||||
Currency currencyDzd = Beans.get(CurrencyRepository.class).findByCode("DZD");
|
||||
BigDecimal currencyAmount =
|
||||
Beans.get(CurrencyService.class).getCurrencyConversionRate(currency, currencyDzd);
|
||||
|
||||
currencyAmount = currencyAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
BigDecimal finalAmount = purchaseOrder.getExTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTaxAmount = purchaseOrder.getTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTotalAmount = purchaseOrder.getInTaxTotal().multiply(currencyAmount);
|
||||
|
||||
amount = amount.add(finalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
taxAmount = taxAmount.add(finalTaxAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
totalAmount = totalAmount.add(finalTotalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
} else {
|
||||
amount = amount.add(purchaseOrder.getExTaxTotal());
|
||||
taxAmount = taxAmount.add(purchaseOrder.getTaxTotal());
|
||||
totalAmount = totalAmount.add(purchaseOrder.getInTaxTotal());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void openImportationFolder(ImportationFolder importationFolder) throws AxelorException {
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_OPEND);
|
||||
}
|
||||
importationFolder.setAmount(amount);
|
||||
importationFolder.setTaxAmount(taxAmount);
|
||||
importationFolder.setTotalAmount(totalAmount);
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void closeImportationFolder(ImportationFolder importationFolder) {
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_CLOSED);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void cancelImportationFolder(ImportationFolder importationFolder) {
|
||||
// importationFolder.setStatusSelect(ImportationFolderRepository.STATUS_CANCELED);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void calculateSum(List<PurchaseOrder> purchaseOrders,ImportationFolder importationFolder) throws MalformedURLException, JSONException, AxelorException {
|
||||
BigDecimal amount = BigDecimal.ZERO;
|
||||
BigDecimal taxAmount = BigDecimal.ZERO;
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
importationFolderRepository.save(importationFolder);
|
||||
}
|
||||
|
||||
|
||||
for (PurchaseOrder purchaseOrder : purchaseOrders) {
|
||||
if(purchaseOrder.getCurrency().getId() == 148 || purchaseOrder.getCurrency().getId() == 46){
|
||||
Currency currency = Beans.get(CurrencyRepository.class).find(purchaseOrder.getCurrency().getId());
|
||||
Currency currencyDzd = Beans.get(CurrencyRepository.class).findByCode("DZD");
|
||||
BigDecimal currencyAmount = Beans.get(CurrencyService.class).getCurrencyConversionRate(currency, currencyDzd);
|
||||
@Transactional
|
||||
public void calculateAvgPrice(List<PurchaseOrderLine> purchaseOrderLines, ImportationFolder importationFolder)
|
||||
throws MalformedURLException, JSONException, AxelorException {
|
||||
|
||||
currencyAmount = currencyAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
BigDecimal finalAmount = purchaseOrder.getExTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTaxAmount = purchaseOrder.getTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTotalAmount = purchaseOrder.getInTaxTotal().multiply(currencyAmount);
|
||||
|
||||
amount = amount.add(finalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
taxAmount = taxAmount.add(finalTaxAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
totalAmount = totalAmount.add(finalTotalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
}else{
|
||||
amount = amount.add(purchaseOrder.getExTaxTotal());
|
||||
taxAmount = taxAmount.add(purchaseOrder.getTaxTotal());
|
||||
totalAmount = totalAmount.add(purchaseOrder.getInTaxTotal());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
importationFolder.setAmount(amount);
|
||||
importationFolder.setTaxAmount(taxAmount);
|
||||
importationFolder.setTotalAmount(totalAmount);
|
||||
for (PurchaseOrderLine purchaseOrderLine : purchaseOrderLines) {
|
||||
|
||||
importationFolderRepository.save(importationFolder);
|
||||
purchaseOrderLine.setPrice(purchaseOrderLine.getPrice().multiply(importationFolder.getCurrencyRate()));
|
||||
|
||||
BigDecimal qty = purchaseOrderLine.getQty();
|
||||
purchaseOrderLine.setQty(purchaseOrderLine.getReceivedQty());
|
||||
Map<String, BigDecimal> map = Beans.get(PurchaseOrderLineService.class).compute(purchaseOrderLine, purchaseOrderLine.getPurchaseOrder());
|
||||
purchaseOrderLine.setExTaxTotal(map.get("exTaxTotal"));
|
||||
purchaseOrderLine.setInTaxTotal(map.get("inTaxTotal"));
|
||||
purchaseOrderLine.setQty(qty);
|
||||
Beans.get(PurchaseOrderLineRepository.class).save(purchaseOrderLine);
|
||||
|
||||
|
||||
}
|
||||
|
||||
importationFolderRepository.save(importationFolder);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ public class PurchaseOrderLineServiceImpl implements PurchaseOrderLineService {
|
||||
BigDecimal amount =
|
||||
quantity
|
||||
.multiply(price)
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_EVEN);
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS_SUPPLIER_LINE, RoundingMode.HALF_EVEN);
|
||||
|
||||
LOG.debug(
|
||||
"Calcul du montant HT avec une quantité de {} pour {} : {}",
|
||||
@@ -457,7 +457,7 @@ public class PurchaseOrderLineServiceImpl implements PurchaseOrderLineService {
|
||||
purchaseOrder.getCompany().getCurrency(),
|
||||
exTaxTotal,
|
||||
purchaseOrder.getOrderDate())
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS, RoundingMode.HALF_UP);
|
||||
.setScale(AppBaseService.DEFAULT_NB_DECIMAL_DIGITS_SUPPLIER_LINE, RoundingMode.HALF_UP);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
package com.axelor.apps.purchase.service;
|
||||
|
||||
import com.axelor.apps.base.db.CancelReason;
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Currency;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
@@ -27,12 +28,10 @@ import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import com.axelor.apps.base.db.CancelReason;
|
||||
import wslite.json.JSONException;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import wslite.json.JSONException;
|
||||
|
||||
public interface PurchaseOrderService {
|
||||
|
||||
@@ -77,6 +76,7 @@ public interface PurchaseOrderService {
|
||||
LocalDate deliveryDate,
|
||||
String internalReference,
|
||||
String externalReference,
|
||||
String notes,
|
||||
LocalDate orderDate,
|
||||
PriceList priceList,
|
||||
Partner supplierPartner,
|
||||
@@ -108,19 +108,24 @@ public interface PurchaseOrderService {
|
||||
|
||||
public void draftPurchaseOrder(PurchaseOrder purchaseOrder);
|
||||
|
||||
public void validatePurchaseOrder(PurchaseOrder purchaseOrder) throws AxelorException, MalformedURLException, JSONException;
|
||||
public void validatePurchaseOrder(PurchaseOrder purchaseOrder)
|
||||
throws AxelorException, MalformedURLException, JSONException;
|
||||
|
||||
public void checkTcoToApprove(PurchaseOrder purchaseOrder) throws AxelorException;
|
||||
|
||||
public void finishPurchaseOrder(PurchaseOrder purchaseOrder);
|
||||
public void finishPurchaseOrder(PurchaseOrder purchaseOrder, String cancelReasonStr);
|
||||
|
||||
public void setStandByPurchaseOrder(PurchaseOrder purchaseOrder, String standByReasonStr);
|
||||
|
||||
public void cancelPurchaseOrder(PurchaseOrder purchaseOrder);
|
||||
|
||||
public void cancelReasonPurchaseOrder(PurchaseOrder purchaseOrder, CancelReason cancelReason, String cancelReasonStr);
|
||||
|
||||
public void calculateSum(List<PurchaseOrder> purchaseOrders,ImportationFolder importationFolder) throws AxelorException;
|
||||
|
||||
public void cancelReasonPurchaseOrder(
|
||||
PurchaseOrder purchaseOrder, CancelReason cancelReason, String cancelReasonStr);
|
||||
|
||||
public void calculateSum(List<PurchaseOrder> purchaseOrders, ImportationFolder importationFolder)
|
||||
throws AxelorException;
|
||||
|
||||
void setPurchaseOrderBarCodeSeq(PurchaseOrder purchaseOrder) throws AxelorException;
|
||||
|
||||
|
||||
void createPurchaseOrderBarCodeSeq(PurchaseOrder purchaseOrder) throws AxelorException;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,10 @@
|
||||
package com.axelor.apps.purchase.service;
|
||||
|
||||
import com.axelor.apps.ReportFactory;
|
||||
import com.axelor.apps.account.db.TaxLine;
|
||||
import com.axelor.apps.account.db.repo.TaxLineRepository;
|
||||
import com.axelor.apps.base.db.Blocking;
|
||||
import com.axelor.apps.base.db.CancelReason;
|
||||
import com.axelor.apps.base.db.Company;
|
||||
import com.axelor.apps.base.db.Currency;
|
||||
import com.axelor.apps.base.db.Partner;
|
||||
@@ -26,11 +29,14 @@ import com.axelor.apps.base.db.PriceList;
|
||||
import com.axelor.apps.base.db.Product;
|
||||
import com.axelor.apps.base.db.TradingName;
|
||||
import com.axelor.apps.base.db.Unit;
|
||||
import com.axelor.apps.base.db.Wizard;
|
||||
import com.axelor.apps.base.db.repo.BlockingRepository;
|
||||
import com.axelor.apps.base.db.repo.CurrencyRepository;
|
||||
import com.axelor.apps.base.db.repo.PartnerRepository;
|
||||
import com.axelor.apps.base.db.repo.ProductRepository;
|
||||
import com.axelor.apps.base.db.repo.SequenceRepository;
|
||||
import com.axelor.apps.base.db.repo.UnitRepository;
|
||||
import com.axelor.apps.base.service.BarcodeGeneratorService;
|
||||
import com.axelor.apps.base.service.BlockingService;
|
||||
import com.axelor.apps.base.service.CurrencyService;
|
||||
import com.axelor.apps.base.service.ProductService;
|
||||
@@ -38,32 +44,39 @@ import com.axelor.apps.base.service.ShippingCoefService;
|
||||
import com.axelor.apps.base.service.TradingNameService;
|
||||
import com.axelor.apps.base.service.UnitConversionService;
|
||||
import com.axelor.apps.base.service.administration.SequenceService;
|
||||
import com.axelor.apps.base.service.BarcodeGeneratorService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.purchase.db.ImportationFolder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLineTax;
|
||||
import com.axelor.apps.purchase.db.PurchaseRequest;
|
||||
import com.axelor.apps.purchase.db.repo.ImportationFolderRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderRepository;
|
||||
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.exception.IExceptionMessage;
|
||||
import com.axelor.apps.purchase.report.IReport;
|
||||
import com.axelor.apps.purchase.service.app.AppPurchaseService;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.report.engine.ReportSettings;
|
||||
import com.axelor.auth.AuthUtils;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.db.JPA;
|
||||
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.MetaFiles;
|
||||
import com.axelor.meta.db.MetaFile;
|
||||
import com.axelor.meta.db.repo.MetaAttachmentRepository;
|
||||
import com.axelor.meta.schema.actions.ActionView;
|
||||
import com.axelor.meta.schema.actions.ActionView.ActionViewBuilder;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.persist.Transactional;
|
||||
import com.axelor.apps.base.db.CancelReason;
|
||||
import wslite.json.JSONException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
@@ -73,11 +86,10 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import javax.validation.ValidationException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import wslite.json.JSONException;
|
||||
|
||||
public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
|
||||
@@ -93,11 +105,17 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
|
||||
@Inject protected PurchaseOrderRepository purchaseOrderRepo;
|
||||
@Inject protected ImportationFolderRepository importationFolderRepo;
|
||||
|
||||
|
||||
@Inject protected BarcodeGeneratorService barcodeGeneratorService;
|
||||
@Inject protected AppBaseService appBaseService;
|
||||
@Inject private MetaFiles metaFiles;
|
||||
|
||||
@Inject private PurchaseRequestRepository purchaseRequestRepo;
|
||||
|
||||
@Inject private MetaAttachmentRepository metaAttachmentRepository;
|
||||
|
||||
@Inject private DMSFileRepository dmsFileRepository;
|
||||
|
||||
@Override
|
||||
public PurchaseOrder _computePurchaseOrderLines(PurchaseOrder purchaseOrder)
|
||||
throws AxelorException {
|
||||
@@ -185,7 +203,13 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
purchaseOrder.getTaxTotal().add(purchaseOrderLineVat.getTaxTotal()));
|
||||
}
|
||||
|
||||
purchaseOrder.setInTaxTotal(purchaseOrder.getExTaxTotal().add(purchaseOrder.getTaxTotal().add(purchaseOrder.getStamp().add(purchaseOrder.getFixTax()))));
|
||||
purchaseOrder.setInTaxTotal(
|
||||
purchaseOrder
|
||||
.getExTaxTotal()
|
||||
.add(
|
||||
purchaseOrder
|
||||
.getTaxTotal()
|
||||
.add(purchaseOrder.getStamp().add(purchaseOrder.getFixTax()))));
|
||||
|
||||
logger.debug(
|
||||
"Montant de la facture: HTT = {}, HT = {}, TVA = {}, TTC = {}",
|
||||
@@ -218,6 +242,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
LocalDate deliveryDate,
|
||||
String internalReference,
|
||||
String externalReference,
|
||||
String notes,
|
||||
LocalDate orderDate,
|
||||
PriceList priceList,
|
||||
Partner supplierPartner,
|
||||
@@ -236,6 +261,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
purchaseOrder.setDeliveryDate(deliveryDate);
|
||||
purchaseOrder.setInternalReference(internalReference);
|
||||
purchaseOrder.setExternalReference(externalReference);
|
||||
purchaseOrder.setNotes(notes);
|
||||
purchaseOrder.setOrderDate(orderDate);
|
||||
purchaseOrder.setPriceList(priceList);
|
||||
purchaseOrder.setTradingName(tradingName);
|
||||
@@ -310,7 +336,11 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
|
||||
Boolean checkTcoEnabled = Beans.get(AppBaseService.class).getAppBase().getEnableCheckTco();
|
||||
|
||||
if(checkTcoEnabled){
|
||||
if (checkTcoEnabled
|
||||
&& !appPurchaseService
|
||||
.getAppPurchase()
|
||||
.getUsersExludedFromTco()
|
||||
.contains(AuthUtils.getUser())) {
|
||||
this.checkTcoToApprove(purchaseOrder);
|
||||
}
|
||||
|
||||
@@ -353,11 +383,18 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
|
||||
String numSeq = "";
|
||||
String externalRef = "";
|
||||
String description = "";
|
||||
int statusSelect = 1;
|
||||
|
||||
for (PurchaseOrder purchaseOrderLocal : purchaseOrderList) {
|
||||
if (!numSeq.isEmpty()) {
|
||||
numSeq += "-";
|
||||
}
|
||||
numSeq += purchaseOrderLocal.getPurchaseOrderSeq();
|
||||
numSeq +=
|
||||
purchaseOrderLocal.getPurchaseOrderSeq()
|
||||
+ (purchaseOrderLocal.getInternalReference() == null
|
||||
? ""
|
||||
: purchaseOrderLocal.getInternalReference() + "-");
|
||||
|
||||
if (!externalRef.isEmpty()) {
|
||||
externalRef += "|";
|
||||
@@ -365,6 +402,10 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
if (purchaseOrderLocal.getExternalReference() != null) {
|
||||
externalRef += purchaseOrderLocal.getExternalReference();
|
||||
}
|
||||
if (purchaseOrderLocal.getNotes() != null) {
|
||||
description += purchaseOrderLocal.getNotes() + " ";
|
||||
}
|
||||
statusSelect = purchaseOrderLocal.getStatusSelect();
|
||||
}
|
||||
|
||||
PurchaseOrder purchaseOrderMerged =
|
||||
@@ -376,6 +417,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
null,
|
||||
numSeq,
|
||||
externalRef,
|
||||
description,
|
||||
LocalDate.now(),
|
||||
priceList,
|
||||
supplierPartner,
|
||||
@@ -385,13 +427,43 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
|
||||
this.computePurchaseOrder(purchaseOrderMerged);
|
||||
|
||||
purchaseOrderMerged.setStatusSelect(statusSelect);
|
||||
|
||||
purchaseOrderRepo.save(purchaseOrderMerged);
|
||||
|
||||
this.attachAttachment(purchaseOrderList, purchaseOrderMerged);
|
||||
|
||||
this.removeOldPurchaseOrders(purchaseOrderList);
|
||||
|
||||
return purchaseOrderMerged;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void attachAttachment(List<PurchaseOrder> ancientPOs, PurchaseOrder newPO) {
|
||||
// start attachement heritage
|
||||
DMSFile dmsP = new DMSFile();
|
||||
dmsP.setFileName(newPO.getPurchaseOrderSeq());
|
||||
dmsP.setRelatedId(newPO.getId());
|
||||
dmsP.setIsDirectory(true);
|
||||
dmsP.setParent(dmsFileRepository.find(Long.parseLong("1")));
|
||||
dmsP.setRelatedModel(newPO.getClass().getCanonicalName());
|
||||
DMSFile dmsFileP = dmsFileRepository.save(dmsP);
|
||||
|
||||
for (PurchaseOrder purchaseOrder : ancientPOs) {
|
||||
List<DMSFile> dmsFiles =
|
||||
dmsFileRepository
|
||||
.all()
|
||||
.filter("self.relatedId = ?1 and self.isDirectory = false", purchaseOrder.getId())
|
||||
.fetch();
|
||||
|
||||
for (DMSFile dmsFile : dmsFiles) {
|
||||
dmsFile.setParent(dmsFileP);
|
||||
dmsFile.setRelatedId(newPO.getId());
|
||||
dmsFileRepository.save(dmsFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Attachment of all purchase order lines to new purchase order
|
||||
public void attachToNewPurchaseOrder(
|
||||
List<PurchaseOrder> purchaseOrderList, PurchaseOrder purchaseOrderMerged) {
|
||||
@@ -405,10 +477,30 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void attachPurchaseRequestToNewOrder(
|
||||
Set<PurchaseRequest> purchaseRequestSet,
|
||||
PurchaseOrder purchaseOrderMerged,
|
||||
List<PurchaseOrder> purchaseOrderList) {
|
||||
for (PurchaseRequest purchaseRequest : purchaseRequestSet) {
|
||||
|
||||
List<Long> ids =
|
||||
purchaseOrderList.stream().map(PurchaseOrder::getId).collect(Collectors.toList());
|
||||
Set<PurchaseOrder> purchaseOrders = purchaseRequest.getPurchaseOrderSet();
|
||||
purchaseRequest.getPurchaseOrderSet().removeIf(t -> ids.contains(t.getId()));
|
||||
purchaseOrders.add(purchaseOrderMerged);
|
||||
purchaseRequest.setPurchaseOrderSet(purchaseOrders);
|
||||
Beans.get(PurchaseRequestRepository.class).save(purchaseRequest);
|
||||
}
|
||||
purchaseOrderMerged.setPurchaseRequestSet(purchaseRequestSet);
|
||||
}
|
||||
|
||||
// Remove old purchase orders after merge
|
||||
public void removeOldPurchaseOrders(List<PurchaseOrder> purchaseOrderList) {
|
||||
for (PurchaseOrder purchaseOrder : purchaseOrderList) {
|
||||
purchaseOrderRepo.remove(purchaseOrder);
|
||||
// purchaseOrderRepo.remove(purchaseOrder);
|
||||
purchaseOrder.setArchived(true);
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,10 +571,16 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackOn = {Exception.class})
|
||||
public void validatePurchaseOrder(PurchaseOrder purchaseOrder) throws AxelorException, MalformedURLException, JSONException {
|
||||
Boolean checkTcoAcceptedEnabled = Beans.get(AppBaseService.class).getAppBase().getEnableCheckTcoAccpeted();
|
||||
|
||||
if(checkTcoAcceptedEnabled){
|
||||
public void validatePurchaseOrder(PurchaseOrder purchaseOrder)
|
||||
throws AxelorException, MalformedURLException, JSONException {
|
||||
Boolean checkTcoAcceptedEnabled =
|
||||
Beans.get(AppBaseService.class).getAppBase().getEnableCheckTcoAccpeted();
|
||||
// && appPurchaseService.getAppPurchase().getUsersExludedFromTcoList()
|
||||
if (checkTcoAcceptedEnabled
|
||||
&& !appPurchaseService
|
||||
.getAppPurchase()
|
||||
.getUsersExludedFromTco()
|
||||
.contains(AuthUtils.getUser())) {
|
||||
checkAllTco(purchaseOrder);
|
||||
}
|
||||
computePurchaseOrder(purchaseOrder);
|
||||
@@ -492,20 +590,51 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
purchaseOrder.setValidatedByUser(AuthUtils.getUser());
|
||||
|
||||
purchaseOrder.setSupplierPartner(validateSupplier(purchaseOrder));
|
||||
|
||||
|
||||
updateCostPrice(purchaseOrder);
|
||||
|
||||
if(purchaseOrder.getImportationFolder() != null){
|
||||
List<PurchaseOrder> purchaseOrders = purchaseOrder.getImportationFolder().getPurchaseOrderList();
|
||||
ImportationFolder importationFolder = purchaseOrder.getImportationFolder();
|
||||
calculateSum(purchaseOrders, importationFolder);
|
||||
if (purchaseOrder.getImportationFolder() != null) {
|
||||
List<PurchaseOrder> purchaseOrders =
|
||||
purchaseOrder.getImportationFolder().getPurchaseOrderList();
|
||||
ImportationFolder importationFolder = purchaseOrder.getImportationFolder();
|
||||
calculateSum(purchaseOrders, importationFolder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public void addFareToImportationFolder(PurchaseOrder purchaseOrder,BigDecimal amount) throws AxelorException, MalformedURLException, JSONException {
|
||||
|
||||
Product product = Beans.get(ProductRepository.class).find(new Long("8931"));
|
||||
Unit unit = Beans.get(UnitRepository.class).find(new Long("4"));
|
||||
TaxLine taxLine = Beans.get(TaxLineRepository.class).find(new Long("27"));
|
||||
|
||||
PurchaseOrderLine purchaseOrderLine = Beans.get(PurchaseOrderLineService.class)
|
||||
.createPurchaseOrderLine(
|
||||
purchaseOrder,
|
||||
product,
|
||||
product.getName(),
|
||||
"",
|
||||
BigDecimal.ONE,
|
||||
unit
|
||||
);
|
||||
purchaseOrderLine.setPrice(amount);
|
||||
purchaseOrderLine.setPriceDiscounted(amount);
|
||||
purchaseOrderLine.setExTaxTotal(amount);
|
||||
purchaseOrderLine.setInTaxTotal(amount);
|
||||
purchaseOrderLine.setCompanyExTaxTotal(amount);
|
||||
purchaseOrderLine.setCompanyInTaxTotal(amount);
|
||||
purchaseOrderLine.setTaxLine(taxLine);
|
||||
purchaseOrder.addPurchaseOrderLineListItem(purchaseOrderLine);
|
||||
|
||||
validatePurchaseOrder(purchaseOrder);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void finishPurchaseOrder(PurchaseOrder purchaseOrder) {
|
||||
public void finishPurchaseOrder(PurchaseOrder purchaseOrder, String cancelReasonStr) {
|
||||
purchaseOrder.setStatusSelect(PurchaseOrderRepository.STATUS_FINISHED);
|
||||
purchaseOrder.setFinishReasonStr(cancelReasonStr);
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
@@ -517,163 +646,19 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void calculateSum(List<PurchaseOrder> purchaseOrders,ImportationFolder importationFolder) throws AxelorException {
|
||||
BigDecimal amount = BigDecimal.ZERO;
|
||||
BigDecimal taxAmount = BigDecimal.ZERO;
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
|
||||
|
||||
for (PurchaseOrder purchaseOrder : purchaseOrders) {
|
||||
if(purchaseOrder.getCurrency().getId() == 148 || purchaseOrder.getCurrency().getId() == 46){
|
||||
Currency currency = Beans.get(CurrencyRepository.class).find(purchaseOrder.getCurrency().getId());
|
||||
Currency currencyDzd = Beans.get(CurrencyRepository.class).findByCode("DZD");
|
||||
BigDecimal currencyAmount = Beans.get(CurrencyService.class).getCurrencyConversionRate(currency, currencyDzd);
|
||||
|
||||
currencyAmount = currencyAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
BigDecimal finalAmount = purchaseOrder.getExTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTaxAmount = purchaseOrder.getTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTotalAmount = purchaseOrder.getInTaxTotal().multiply(currencyAmount);
|
||||
|
||||
amount = amount.add(finalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
taxAmount = taxAmount.add(finalTaxAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
totalAmount = totalAmount.add(finalTotalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
}else{
|
||||
amount = amount.add(purchaseOrder.getExTaxTotal());
|
||||
taxAmount = taxAmount.add(purchaseOrder.getTaxTotal());
|
||||
totalAmount = totalAmount.add(purchaseOrder.getInTaxTotal());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
importationFolder.setAmount(amount);
|
||||
importationFolder.setTaxAmount(taxAmount);
|
||||
importationFolder.setTotalAmount(totalAmount);
|
||||
|
||||
importationFolderRepo.save(importationFolder);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void cancelReasonPurchaseOrder(
|
||||
PurchaseOrder purchaseOrder, CancelReason cancelReason, String cancelReasonStr){
|
||||
|
||||
purchaseOrder.setStatusSelect(PurchaseOrderRepository.STATUS_CANCELED);
|
||||
purchaseOrder.setCancelReason(cancelReason);
|
||||
if (Strings.isNullOrEmpty(cancelReasonStr)) {
|
||||
purchaseOrder.setCancelReasonStr(cancelReason.getName());
|
||||
} else {
|
||||
purchaseOrder.setCancelReasonStr(cancelReasonStr);
|
||||
}
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
|
||||
public void checkAllTco(PurchaseOrder purchaseOrder) throws AxelorException{
|
||||
/*vérifier si tous les tco sont validées */
|
||||
PurchaseOrderLineService purchaseOrderLineService = Beans.get(PurchaseOrderLineService.class);
|
||||
javax.persistence.Query dateQuery =
|
||||
com.axelor
|
||||
.db
|
||||
.JPA
|
||||
.em()
|
||||
.createNativeQuery(
|
||||
"SELECT a.id FROM purchase_purchase_order_line as a "+
|
||||
"left join public.suppliermanagement_purchase_order_supplier_line as b on a.id = b.purchase_order_line "+
|
||||
"where a.purchase_order = "+purchaseOrder.getId()+" and b.state_select = 3 and ( a.archived is not true or b.archived is not true ) "+
|
||||
"group by a.id , b.state_select ");
|
||||
List<BigInteger> purchaseOrdeLineAccepted = dateQuery.getResultList();
|
||||
|
||||
javax.persistence.Query dateQueryTow =
|
||||
com.axelor
|
||||
.db
|
||||
.JPA
|
||||
.em()
|
||||
.createNativeQuery(
|
||||
"SELECT a.id FROM purchase_purchase_order_line as a "+
|
||||
"left join public.suppliermanagement_purchase_order_supplier_line as b on a.id = b.purchase_order_line "+
|
||||
"where a.purchase_order = "+purchaseOrder.getId()+" and ( a.archived is not true or b.archived is not true ) "+
|
||||
"group by a.id");
|
||||
List<BigInteger> purchaseOrdeLineAll = dateQueryTow.getResultList();
|
||||
|
||||
// subtracting Lists
|
||||
Set<BigInteger> purchaseOrdeLineIdsDiff = purchaseOrdeLineAll.stream()
|
||||
.filter(item -> !purchaseOrdeLineAccepted.contains(item))
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<String> Products = new ArrayList<>();
|
||||
for (BigInteger id : purchaseOrdeLineIdsDiff) {
|
||||
PurchaseOrderLine purchaseOrderLine = Beans.get(PurchaseOrderLineRepository.class).find(id.longValue());
|
||||
Products.add(purchaseOrderLine.getProductName());
|
||||
}
|
||||
|
||||
if(purchaseOrdeLineAccepted.size() != purchaseOrdeLineAll.size()){
|
||||
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.TCO),
|
||||
Products);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void checkTcoToApprove(PurchaseOrder purchaseOrder) throws AxelorException{
|
||||
/*vérifier si tous les tco sont validées */
|
||||
javax.persistence.Query dateQuery =
|
||||
com.axelor
|
||||
.db
|
||||
.JPA
|
||||
.em()
|
||||
.createNativeQuery("SELECT A.product "+
|
||||
"FROM PURCHASE_PURCHASE_ORDER_LINE AS A "+
|
||||
"LEFT JOIN PUBLIC.SUPPLIERMANAGEMENT_PURCHASE_ORDER_SUPPLIER_LINE AS B "+
|
||||
"ON A.ID = B.PURCHASE_ORDER_LINE "+
|
||||
"WHERE A.PURCHASE_ORDER = "+purchaseOrder.getId()+" AND (A.ARCHIVED IS NOT TRUE OR B.ARCHIVED IS NOT TRUE) and B.ID is null "+
|
||||
"GROUP BY A.ID, B.ID");
|
||||
List<BigInteger> productsResult = dateQuery.getResultList();
|
||||
|
||||
|
||||
List<String> products = new ArrayList<>();
|
||||
for (BigInteger id : productsResult) {
|
||||
Product product = Beans.get(ProductRepository.class).find(id.longValue());
|
||||
products.add(product.getFullName());
|
||||
}
|
||||
|
||||
if(products.size() > 0){
|
||||
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.NO_TCO),products);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Transactional
|
||||
public ImportationFolder generateImportationFolder(PurchaseOrder purchaseOrder) throws AxelorException {
|
||||
ImportationFolder importationFolder = new ImportationFolder();
|
||||
List<PurchaseOrder> purchaseOrders = new ArrayList<PurchaseOrder>();
|
||||
purchaseOrders.add(purchaseOrder);
|
||||
importationFolder.setPurchaseOrderList(purchaseOrders);
|
||||
importationFolder.setCurrency(purchaseOrder.getCurrency());
|
||||
importationFolder.setProgress(10);
|
||||
importationFolder.setSupplierPartner(purchaseOrder.getSupplierPartner());
|
||||
|
||||
|
||||
public void calculateSum(List<PurchaseOrder> purchaseOrders, ImportationFolder importationFolder)
|
||||
throws AxelorException {
|
||||
BigDecimal amount = BigDecimal.ZERO;
|
||||
BigDecimal taxAmount = BigDecimal.ZERO;
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
|
||||
|
||||
|
||||
if(purchaseOrder.getCurrency().getId() != 41){
|
||||
Currency currency = Beans.get(CurrencyRepository.class).find(purchaseOrder.getCurrency().getId());
|
||||
for (PurchaseOrder purchaseOrder : purchaseOrders) {
|
||||
if (purchaseOrder.getCurrency().getId() == 148 || purchaseOrder.getCurrency().getId() == 46) {
|
||||
Currency currency =
|
||||
Beans.get(CurrencyRepository.class).find(purchaseOrder.getCurrency().getId());
|
||||
Currency currencyDzd = Beans.get(CurrencyRepository.class).findByCode("DZD");
|
||||
BigDecimal currencyAmount = Beans.get(CurrencyService.class).getCurrencyConversionRate(currency, currencyDzd);
|
||||
BigDecimal currencyAmount =
|
||||
Beans.get(CurrencyService.class).getCurrencyConversionRate(currency, currencyDzd);
|
||||
|
||||
currencyAmount = currencyAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
@@ -685,43 +670,202 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
taxAmount = taxAmount.add(finalTaxAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
totalAmount = totalAmount.add(finalTotalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
}else{
|
||||
} else {
|
||||
amount = amount.add(purchaseOrder.getExTaxTotal());
|
||||
taxAmount = taxAmount.add(purchaseOrder.getTaxTotal());
|
||||
totalAmount = totalAmount.add(purchaseOrder.getInTaxTotal());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
importationFolder.setAmount(amount);
|
||||
importationFolder.setTaxAmount(taxAmount);
|
||||
importationFolder.setTotalAmount(totalAmount);
|
||||
|
||||
|
||||
importationFolderRepo.save(importationFolder);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void setStandByPurchaseOrder(PurchaseOrder purchaseOrder, String standByReasonStr) {
|
||||
|
||||
purchaseOrder.setStatusSelect(PurchaseOrderRepository.STATUS_STANDBY);
|
||||
purchaseOrder.setStandbyRaison(standByReasonStr);
|
||||
purchaseOrder.setStandbyByUser(AuthUtils.getUser());
|
||||
purchaseOrder.setStandbyDate(Beans.get(AppBaseService.class).getTodayDate());
|
||||
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void cancelReasonPurchaseOrder(
|
||||
PurchaseOrder purchaseOrder, CancelReason cancelReason, String cancelReasonStr) {
|
||||
|
||||
purchaseOrder.setStatusSelect(PurchaseOrderRepository.STATUS_CANCELED);
|
||||
purchaseOrder.setCancelReason(cancelReason);
|
||||
if (Strings.isNullOrEmpty(cancelReasonStr)) {
|
||||
purchaseOrder.setCancelReasonStr(cancelReason.getName());
|
||||
} else {
|
||||
purchaseOrder.setCancelReasonStr(cancelReasonStr);
|
||||
}
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
public void checkAllTco(PurchaseOrder purchaseOrder) throws AxelorException {
|
||||
/*vérifier si tous les tco sont validées */
|
||||
PurchaseOrderLineService purchaseOrderLineService = Beans.get(PurchaseOrderLineService.class);
|
||||
javax.persistence.Query dateQuery =
|
||||
com.axelor
|
||||
.db
|
||||
.JPA
|
||||
.em()
|
||||
.createNativeQuery(
|
||||
"SELECT a.id FROM purchase_purchase_order_line as a "
|
||||
+ "left join public.suppliermanagement_purchase_order_supplier_line as b on a.id = b.purchase_order_line "
|
||||
+ "where a.purchase_order = "
|
||||
+ purchaseOrder.getId()
|
||||
+ " and ((b.state_select = 3 and b.currency = 41) or (b.state_select = 7 and b.currency != 41)) and ( a.archived is not true or b.archived is not true ) "
|
||||
+ "group by a.id , b.state_select ");
|
||||
List<BigInteger> purchaseOrdeLineAccepted = dateQuery.getResultList();
|
||||
|
||||
javax.persistence.Query dateQueryTow =
|
||||
com.axelor
|
||||
.db
|
||||
.JPA
|
||||
.em()
|
||||
.createNativeQuery(
|
||||
"SELECT a.id FROM purchase_purchase_order_line as a "
|
||||
+ "left join public.suppliermanagement_purchase_order_supplier_line as b on a.id = b.purchase_order_line "
|
||||
+ "where a.purchase_order = "
|
||||
+ purchaseOrder.getId()
|
||||
+ " and ( a.archived is not true or b.archived is not true ) "
|
||||
+ "group by a.id");
|
||||
List<BigInteger> purchaseOrdeLineAll = dateQueryTow.getResultList();
|
||||
|
||||
// subtracting Lists
|
||||
Set<BigInteger> purchaseOrdeLineIdsDiff =
|
||||
purchaseOrdeLineAll
|
||||
.stream()
|
||||
.filter(item -> !purchaseOrdeLineAccepted.contains(item))
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<String> Products = new ArrayList<>();
|
||||
for (BigInteger id : purchaseOrdeLineIdsDiff) {
|
||||
PurchaseOrderLine purchaseOrderLine =
|
||||
Beans.get(PurchaseOrderLineRepository.class).find(id.longValue());
|
||||
Products.add(purchaseOrderLine.getProductName());
|
||||
}
|
||||
|
||||
if (purchaseOrdeLineAccepted.size() != purchaseOrdeLineAll.size()) {
|
||||
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.TCO),
|
||||
Products);
|
||||
}
|
||||
}
|
||||
|
||||
public void checkTcoToApprove(PurchaseOrder purchaseOrder) throws AxelorException {
|
||||
/*vérifier si tous les tco sont validées */
|
||||
javax.persistence.Query dateQuery =
|
||||
com.axelor
|
||||
.db
|
||||
.JPA
|
||||
.em()
|
||||
.createNativeQuery(
|
||||
"SELECT A.product "
|
||||
+ "FROM PURCHASE_PURCHASE_ORDER_LINE AS A "
|
||||
+ "LEFT JOIN PUBLIC.SUPPLIERMANAGEMENT_PURCHASE_ORDER_SUPPLIER_LINE AS B "
|
||||
+ "ON A.ID = B.PURCHASE_ORDER_LINE "
|
||||
+ "WHERE A.PURCHASE_ORDER = "
|
||||
+ purchaseOrder.getId()
|
||||
+ " AND (A.ARCHIVED IS NOT TRUE OR B.ARCHIVED IS NOT TRUE) and B.ID is null "
|
||||
+ "GROUP BY A.ID, B.ID");
|
||||
List<BigInteger> productsResult = dateQuery.getResultList();
|
||||
|
||||
List<String> products = new ArrayList<>();
|
||||
for (BigInteger id : productsResult) {
|
||||
Product product = Beans.get(ProductRepository.class).find(id.longValue());
|
||||
products.add(product.getFullName());
|
||||
}
|
||||
|
||||
if (products.size() > 0) {
|
||||
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.NO_TCO),
|
||||
products);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public ImportationFolder generateImportationFolder(PurchaseOrder purchaseOrder)
|
||||
throws AxelorException {
|
||||
ImportationFolder importationFolder = new ImportationFolder();
|
||||
List<PurchaseOrder> purchaseOrders = new ArrayList<PurchaseOrder>();
|
||||
purchaseOrders.add(purchaseOrder);
|
||||
importationFolder.setPurchaseOrderList(purchaseOrders);
|
||||
importationFolder.setCurrency(purchaseOrder.getCurrency());
|
||||
importationFolder.setProgress(10);
|
||||
importationFolder.setSupplierPartner(purchaseOrder.getSupplierPartner());
|
||||
|
||||
BigDecimal amount = BigDecimal.ZERO;
|
||||
BigDecimal taxAmount = BigDecimal.ZERO;
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
|
||||
if (purchaseOrder.getCurrency().getId() != 41) {
|
||||
Currency currency =
|
||||
Beans.get(CurrencyRepository.class).find(purchaseOrder.getCurrency().getId());
|
||||
Currency currencyDzd = Beans.get(CurrencyRepository.class).findByCode("DZD");
|
||||
BigDecimal currencyAmount =
|
||||
Beans.get(CurrencyService.class).getCurrencyConversionRate(currency, currencyDzd);
|
||||
|
||||
currencyAmount = currencyAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
BigDecimal finalAmount = purchaseOrder.getExTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTaxAmount = purchaseOrder.getTaxTotal().multiply(currencyAmount);
|
||||
BigDecimal finalTotalAmount = purchaseOrder.getInTaxTotal().multiply(currencyAmount);
|
||||
|
||||
amount = amount.add(finalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
taxAmount = taxAmount.add(finalTaxAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
totalAmount = totalAmount.add(finalTotalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN);
|
||||
|
||||
} else {
|
||||
amount = amount.add(purchaseOrder.getExTaxTotal());
|
||||
taxAmount = taxAmount.add(purchaseOrder.getTaxTotal());
|
||||
totalAmount = totalAmount.add(purchaseOrder.getInTaxTotal());
|
||||
}
|
||||
|
||||
importationFolder.setAmount(amount);
|
||||
importationFolder.setTaxAmount(taxAmount);
|
||||
importationFolder.setTotalAmount(totalAmount);
|
||||
|
||||
ImportationFolder imp = importationFolderRepo.save(importationFolder);
|
||||
purchaseOrder.setImportationFolder(imp);
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
|
||||
return importationFolder;
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public void setPurchaseOrderBarCodeSeq(PurchaseOrder purchaseOrder) throws AxelorException{
|
||||
|
||||
if (purchaseOrder.getBarCodeSeq() == null
|
||||
public void setPurchaseOrderBarCodeSeq(PurchaseOrder purchaseOrder) throws AxelorException {
|
||||
|
||||
if (purchaseOrder.getBarCodeSeq() == null
|
||||
&& purchaseOrder.getStatusSelect() != PurchaseOrderRepository.STATUS_DRAFT) {
|
||||
try {
|
||||
boolean addPadding = false;
|
||||
InputStream inStream = null;
|
||||
|
||||
inStream =
|
||||
barcodeGeneratorService.createBarCode(
|
||||
|
||||
inStream =
|
||||
barcodeGeneratorService.createBarCode(
|
||||
purchaseOrder.getPurchaseOrderSeq(),
|
||||
appBaseService.getAppBase().getBarcodeTypeConfigPurchaseOrderSeq(),
|
||||
addPadding);
|
||||
|
||||
appBaseService.getAppBase().getBarcodeTypeConfigPurchaseOrderSeq(),
|
||||
addPadding);
|
||||
|
||||
if (inStream != null) {
|
||||
MetaFile barcodeFile =
|
||||
metaFiles.upload(inStream, String.format("PurchaseOrderSeqBarCode%d.png",purchaseOrder.getId()));
|
||||
purchaseOrder.setBarCodeSeq(barcodeFile);
|
||||
metaFiles.upload(
|
||||
inStream, String.format("PurchaseOrderSeqBarCode%d.png", purchaseOrder.getId()));
|
||||
purchaseOrder.setBarCodeSeq(barcodeFile);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -729,14 +873,11 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
|
||||
throw new ValidationException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void createPurchaseOrderBarCodeSeq(PurchaseOrder purchaseOrder) throws AxelorException{
|
||||
public void createPurchaseOrderBarCodeSeq(PurchaseOrder purchaseOrder) throws AxelorException {
|
||||
this.setPurchaseOrderBarCodeSeq(purchaseOrder);
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseRequest;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
public interface PurchaseRequestService {
|
||||
@@ -28,8 +29,9 @@ public interface PurchaseRequestService {
|
||||
public void confirmCart();
|
||||
|
||||
public void acceptRequest(List<PurchaseRequest> purchaseRequests);
|
||||
|
||||
public void purchaseRequestsAssignedToUser(List<Long> requestIds, User user);
|
||||
|
||||
public void purchaseRequestsAssignedToUser(
|
||||
List<Long> requestIds, HashSet<User> user, Boolean canDuplicatePO, int limitPo);
|
||||
|
||||
public List<PurchaseOrder> generatePo(
|
||||
List<PurchaseRequest> purchaseRequests, Boolean groupBySupplier, Boolean groupByProduct)
|
||||
|
||||
@@ -91,25 +91,25 @@ public class PurchaseRequestServiceImpl implements PurchaseRequestService {
|
||||
purchaseOrder = purchaseOrderMap.get(key);
|
||||
} else {
|
||||
purchaseOrder = createPurchaseOrder(purchaseRequest);
|
||||
// SOPHAL
|
||||
setProjectPurchaseOrder(purchaseOrder, purchaseRequest);
|
||||
// SOPHAL
|
||||
setProjectPurchaseOrder(purchaseOrder, purchaseRequest);
|
||||
purchaseOrder.setNotes(purchaseRequest.getDescription());
|
||||
// sophal set purchase request
|
||||
// purchaseOrder.setPurchaseRequest(purchaseRequest.getId());
|
||||
// purchaseOrder.setPurchaseRequest(purchaseRequest.getId());
|
||||
// sophal
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
// SOPHAL
|
||||
// SOPHAL
|
||||
key = key == null ? purchaseRequest.getId().toString() : key;
|
||||
purchaseOrderMap.put(key, purchaseOrder);
|
||||
}
|
||||
|
||||
if (purchaseOrder == null) {
|
||||
purchaseOrder = createPurchaseOrder(purchaseRequest);
|
||||
// SOPHAL
|
||||
setProjectPurchaseOrder(purchaseOrder, purchaseRequest);
|
||||
// SOPHAL
|
||||
setProjectPurchaseOrder(purchaseOrder, purchaseRequest);
|
||||
purchaseOrder.setNotes(purchaseRequest.getDescription());
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
// SOPHAL
|
||||
// SOPHAL
|
||||
}
|
||||
|
||||
for (PurchaseRequestLine purchaseRequestLine : purchaseRequest.getPurchaseRequestLineList()) {
|
||||
@@ -142,8 +142,9 @@ public class PurchaseRequestServiceImpl implements PurchaseRequestService {
|
||||
purchaseOrderRepo.save(purchaseOrder);
|
||||
Set<PurchaseOrder> hash_Set = new HashSet<PurchaseOrder>();
|
||||
hash_Set.add(purchaseOrder);
|
||||
purchaseRequest.setPurchaseOrderSet(hash_Set);
|
||||
purchaseRequest.addPurchaseOrderSetItem(purchaseOrder);
|
||||
purchaseRequest.setAssignedToUser(AuthUtils.getUser());
|
||||
purchaseRequest.addBuyer(AuthUtils.getUser());
|
||||
purchaseRequestRepo.save(purchaseRequest);
|
||||
}
|
||||
List<PurchaseOrder> purchaseOrders =
|
||||
@@ -177,6 +178,7 @@ public class PurchaseRequestServiceImpl implements PurchaseRequestService {
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
"", // notes
|
||||
LocalDate.now(),
|
||||
null,
|
||||
purchaseRequest.getSupplierUser(),
|
||||
@@ -186,7 +188,7 @@ public class PurchaseRequestServiceImpl implements PurchaseRequestService {
|
||||
protected String getPurchaseOrderGroupBySupplierKey(PurchaseRequest purchaseRequest) {
|
||||
return purchaseRequest.getSupplierUser().getId().toString();
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
protected void setProjectPurchaseOrder(
|
||||
PurchaseOrder purchaseOrder, PurchaseRequest purchaseRequest) {
|
||||
@@ -213,15 +215,19 @@ public class PurchaseRequestServiceImpl implements PurchaseRequestService {
|
||||
update.executeUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void purchaseRequestsAssignedToUser(List<Long> requestIds, User user) {
|
||||
public void purchaseRequestsAssignedToUser(
|
||||
List<Long> requestIds, HashSet<User> users, Boolean canDuplicatePO, int limitPo) {
|
||||
|
||||
for (int i = 0; i < requestIds.size(); i++) {
|
||||
long requestId = ((Number) requestIds.get(i)).longValue();
|
||||
PurchaseRequest purchaseRequest = purchaseRequestRepo.find(requestId);
|
||||
purchaseRequest.setAssignedToUser(user);
|
||||
// purchaseRequest.setAssignedToUser(user);
|
||||
purchaseRequest.setBuyers(users.stream().collect(Collectors.toSet()));
|
||||
purchaseRequest.setLimitPo(limitPo);
|
||||
purchaseRequest.setCanDuplicatePo(canDuplicatePO);
|
||||
purchaseRequestRepo.save(purchaseRequest);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.axelor.apps.purchase.service.print;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.axelor.apps.ReportFactory;
|
||||
import com.axelor.apps.base.exceptions.IExceptionMessage;
|
||||
import com.axelor.apps.base.service.app.AppBaseService;
|
||||
import com.axelor.apps.purchase.db.ImportationFolder;
|
||||
import com.axelor.apps.purchase.report.IReport;
|
||||
import com.axelor.apps.report.engine.ReportSettings;
|
||||
|
||||
import com.axelor.apps.tool.ModelTool;
|
||||
import com.axelor.apps.tool.ThrowConsumer;
|
||||
import com.axelor.apps.tool.file.PdfTool;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.exception.db.repo.TraceBackRepository;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
|
||||
public class ImportationFolderPrintService {
|
||||
|
||||
public String printCostPriceSheet(ImportationFolder importationFolder, String formatPdf)
|
||||
throws AxelorException {
|
||||
|
||||
String fileName = getImportationFolderName(false, formatPdf);
|
||||
|
||||
return PdfTool.getFileLinkFromPdfFile(print(importationFolder, formatPdf), fileName);
|
||||
}
|
||||
|
||||
public String printImportationfolders(List<Long> ids) throws IOException {
|
||||
List<File> importationFolders = new ArrayList<>();
|
||||
ModelTool.apply(
|
||||
ImportationFolder.class,
|
||||
ids,
|
||||
new ThrowConsumer<ImportationFolder>() {
|
||||
|
||||
|
||||
public void accept(ImportationFolder importationFolder) throws Exception {
|
||||
importationFolders.add(print(importationFolder, ReportSettings.FORMAT_PDF));
|
||||
}
|
||||
});
|
||||
String fileName = getImportationFolderName(true, ReportSettings.FORMAT_PDF);
|
||||
return PdfTool.mergePdfToFileLink(importationFolders, fileName);
|
||||
}
|
||||
|
||||
public File print(ImportationFolder importationFolder, String formatPdf) throws AxelorException {
|
||||
ReportSettings reportSettings = prepareReportSettings(importationFolder, formatPdf);
|
||||
return reportSettings.generate().getFile();
|
||||
}
|
||||
|
||||
public ReportSettings prepareReportSettings(ImportationFolder importationFolder, String formatPdf)
|
||||
throws AxelorException {
|
||||
if (importationFolder.getPrintingSettings() == null) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_MISSING_FIELD,
|
||||
String.format(
|
||||
I18n.get(IExceptionMessage.UNIT_CONVERSION_2),
|
||||
importationFolder.getName()),
|
||||
importationFolder);
|
||||
}
|
||||
String locale = ReportSettings.getPrintingLocale(null);
|
||||
String title = getFileName(importationFolder);
|
||||
ReportSettings reportSetting =
|
||||
ReportFactory.createReport(IReport.COST_PRICE_SHEET, title + " - ${date}");
|
||||
|
||||
|
||||
return reportSetting
|
||||
.addParam("importationFolderId", importationFolder.getId())
|
||||
.addParam("Locale", locale)
|
||||
.addParam("HeaderHeight", importationFolder.getPrintingSettings().getPdfHeaderHeight())
|
||||
.addParam("FooterHeight", importationFolder.getPrintingSettings().getPdfFooterHeight())
|
||||
.addFormat(formatPdf);
|
||||
}
|
||||
|
||||
protected String getImportationFolderName(boolean plural, String formatPdf) {
|
||||
return I18n.get(plural ? "Importation folders" : "Importation folder")
|
||||
+ " - "
|
||||
+ Beans.get(AppBaseService.class).getTodayDate().format(DateTimeFormatter.BASIC_ISO_DATE)
|
||||
+ "."
|
||||
+ formatPdf;
|
||||
}
|
||||
|
||||
public String getFileName(ImportationFolder importationFolder) {
|
||||
return I18n.get("Importation folder")
|
||||
+ " "
|
||||
+ importationFolder.getName();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -33,7 +33,8 @@ public interface PurchaseRequestPrintService {
|
||||
*/
|
||||
String printPurchaseRequests(List<Long> ids) throws IOException;
|
||||
|
||||
String printPurchaseRequest(PurchaseRequest purchaseRequest, String formatPdf) throws AxelorException;
|
||||
String printPurchaseRequest(PurchaseRequest purchaseRequest, String formatPdf)
|
||||
throws AxelorException;
|
||||
|
||||
String getFileName(PurchaseRequest purchaseRequest);
|
||||
}
|
||||
|
||||
@@ -1,75 +1,69 @@
|
||||
package com.axelor.apps.purchase.web;
|
||||
|
||||
import com.axelor.apps.message.service.MailAccountService;
|
||||
import java.util.Date;
|
||||
|
||||
import java.util.Properties;
|
||||
import javax.mail.Authenticator;
|
||||
import javax.mail.Message;
|
||||
import javax.mail.PasswordAuthentication;
|
||||
import javax.mail.Session;
|
||||
import javax.mail.Transport;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
|
||||
import com.axelor.apps.message.service.MailAccountService;
|
||||
|
||||
import javax.json.JsonObject;
|
||||
import javax.mail.Authenticator;
|
||||
import javax.mail.PasswordAuthentication;
|
||||
import javax.mail.Session;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
public class EmailUtil {
|
||||
|
||||
/**
|
||||
* Utility method to send simple HTML email
|
||||
* @param session
|
||||
* @param toEmail
|
||||
* @param subject
|
||||
* @param body
|
||||
*/
|
||||
public static void sendEmail(MailAccountService mailAccountService, String toEmail, String subject, String body){
|
||||
System.out.println("TLSEmail Start");
|
||||
Properties props = new Properties();
|
||||
|
||||
|
||||
final String fromEmail = mailAccountService.getDefaultSender().getLogin().toString();
|
||||
final String password = mailAccountService.getDefaultSender().getPassword().toString();
|
||||
props.put("mail.smtp.host", mailAccountService.getDefaultSender().getHost());
|
||||
props.put("mail.smtp.port", mailAccountService.getDefaultSender().getPort());
|
||||
props.put("mail.smtp.auth", "true");
|
||||
props.put("mail.smtp.starttls.enable", "true");
|
||||
|
||||
Authenticator auth = new Authenticator() {
|
||||
/**
|
||||
* Utility method to send simple HTML email
|
||||
*
|
||||
* @param session
|
||||
* @param toEmail
|
||||
* @param subject
|
||||
* @param body
|
||||
*/
|
||||
public static void sendEmail(
|
||||
MailAccountService mailAccountService, String toEmail, String subject, String body) {
|
||||
System.out.println("TLSEmail Start");
|
||||
Properties props = new Properties();
|
||||
|
||||
final String fromEmail = mailAccountService.getDefaultSender().getLogin().toString();
|
||||
final String password = mailAccountService.getDefaultSender().getPassword().toString();
|
||||
props.put("mail.smtp.host", mailAccountService.getDefaultSender().getHost());
|
||||
props.put("mail.smtp.port", mailAccountService.getDefaultSender().getPort());
|
||||
props.put("mail.smtp.auth", "true");
|
||||
props.put("mail.smtp.starttls.enable", "true");
|
||||
|
||||
Authenticator auth =
|
||||
new Authenticator() {
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(fromEmail, password);
|
||||
}
|
||||
};
|
||||
Session session = Session.getInstance(props, auth);
|
||||
try
|
||||
{
|
||||
MimeMessage msg = new MimeMessage(session);
|
||||
//set message headers
|
||||
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
|
||||
msg.addHeader("format", "flowed");
|
||||
msg.addHeader("Content-Transfer-Encoding", "8bit");
|
||||
|
||||
msg.setFrom(new InternetAddress(fromEmail, "ERP SOPHAL"));
|
||||
Session session = Session.getInstance(props, auth);
|
||||
try {
|
||||
MimeMessage msg = new MimeMessage(session);
|
||||
// set message headers
|
||||
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
|
||||
msg.addHeader("format", "flowed");
|
||||
msg.addHeader("Content-Transfer-Encoding", "8bit");
|
||||
|
||||
msg.setReplyTo(InternetAddress.parse(fromEmail, false));
|
||||
msg.setFrom(new InternetAddress(fromEmail, "ERP SOPHAL"));
|
||||
|
||||
msg.setSubject(subject, "UTF-8");
|
||||
msg.setReplyTo(InternetAddress.parse(fromEmail, false));
|
||||
|
||||
msg.setText(body, "UTF-8");
|
||||
msg.setSubject(subject, "UTF-8");
|
||||
|
||||
msg.setSentDate(new Date());
|
||||
msg.setContent(body, "text/html; charset=utf-8");
|
||||
|
||||
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
|
||||
System.out.println("Message is ready");
|
||||
Transport.send(msg);
|
||||
msg.setSentDate(new Date());
|
||||
|
||||
System.out.println("EMail Sent Successfully!!");
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
|
||||
System.out.println("Message is ready");
|
||||
Transport.send(msg);
|
||||
|
||||
System.out.println("EMail Sent Successfully!!");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
package com.axelor.apps.purchase.web;
|
||||
|
||||
import com.axelor.apps.base.db.Currency;
|
||||
import com.axelor.apps.base.db.repo.CurrencyRepository;
|
||||
import com.axelor.apps.base.service.CurrencyConversionService;
|
||||
import com.axelor.apps.purchase.db.ImportationFolder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrderLine;
|
||||
import com.axelor.apps.purchase.db.repo.ImportationFolderRepository;
|
||||
import com.axelor.apps.purchase.service.ImportationFolderService;
|
||||
import com.axelor.apps.purchase.service.ImportationFolderServiceImpl;
|
||||
@@ -13,45 +11,54 @@ import com.axelor.inject.Beans;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.google.inject.Singleton;
|
||||
import wslite.json.JSONException;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.List;
|
||||
import wslite.json.JSONException;
|
||||
|
||||
@Singleton
|
||||
public class ImportationFolderController {
|
||||
public void draftImportationFolder(ActionRequest request, ActionResponse response) {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).draftImportationFolder(importationFolder);
|
||||
}
|
||||
public void draftImportationFolder(ActionRequest request, ActionResponse response) {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).draftImportationFolder(importationFolder);
|
||||
}
|
||||
|
||||
public void openImportationFolder(ActionRequest request, ActionResponse response) throws AxelorException {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).openImportationFolder(importationFolder);
|
||||
}
|
||||
public void openImportationFolder(ActionRequest request, ActionResponse response)
|
||||
throws AxelorException {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).openImportationFolder(importationFolder);
|
||||
}
|
||||
|
||||
public void closeImportationFolder(ActionRequest request, ActionResponse response) {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).closeImportationFolder(importationFolder);
|
||||
}
|
||||
public void closeImportationFolder(ActionRequest request, ActionResponse response) {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).closeImportationFolder(importationFolder);
|
||||
}
|
||||
|
||||
public void cancelImportationFolder(ActionRequest request, ActionResponse response) {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).cancelImportationFolder(importationFolder);
|
||||
}
|
||||
public void cancelImportationFolder(ActionRequest request, ActionResponse response) {
|
||||
ImportationFolder importationFolder = request.getContext().asType(ImportationFolder.class);
|
||||
Beans.get(ImportationFolderService.class).cancelImportationFolder(importationFolder);
|
||||
}
|
||||
|
||||
public void calculateSum(ActionRequest request, ActionResponse response)
|
||||
throws MalformedURLException, JSONException, AxelorException {
|
||||
|
||||
ImportationFolder iimportationFolder = (ImportationFolder) request.getContext().asType(ImportationFolder.class);
|
||||
ImportationFolder importationFolder = Beans.get(ImportationFolderRepository.class)
|
||||
.find(iimportationFolder.getId());
|
||||
List<PurchaseOrder> purchaseOrders = importationFolder.getPurchaseOrderList();
|
||||
public void calculateSum(ActionRequest request, ActionResponse response)
|
||||
throws MalformedURLException, JSONException, AxelorException {
|
||||
|
||||
ImportationFolder iimportationFolder =
|
||||
(ImportationFolder) request.getContext().asType(ImportationFolder.class);
|
||||
ImportationFolder importationFolder =
|
||||
Beans.get(ImportationFolderRepository.class).find(iimportationFolder.getId());
|
||||
List<PurchaseOrder> purchaseOrders = importationFolder.getPurchaseOrderList();
|
||||
|
||||
Beans.get(ImportationFolderServiceImpl.class).calculateSum(purchaseOrders,
|
||||
importationFolder);
|
||||
Beans.get(ImportationFolderServiceImpl.class).calculateSum(purchaseOrders, importationFolder);
|
||||
}
|
||||
|
||||
public void calculateAvgPrice(ActionRequest request, ActionResponse response)
|
||||
throws MalformedURLException, JSONException, AxelorException {
|
||||
|
||||
}
|
||||
ImportationFolder iimportationFolder =
|
||||
(ImportationFolder) request.getContext().asType(ImportationFolder.class);
|
||||
ImportationFolder importationFolder =
|
||||
Beans.get(ImportationFolderRepository.class).find(iimportationFolder.getId());
|
||||
List<PurchaseOrderLine> purchaseOrderLines = importationFolder.getPurchaseOrderLineList();
|
||||
|
||||
Beans.get(ImportationFolderServiceImpl.class).calculateAvgPrice(purchaseOrderLines, importationFolder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ import com.axelor.apps.base.service.TradingNameService;
|
||||
import com.axelor.apps.purchase.db.ImportationFolder;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseRequest;
|
||||
import com.axelor.apps.purchase.db.repo.ImportationFolderRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseOrderRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseRequestRepository;
|
||||
import com.axelor.apps.purchase.exception.IExceptionMessage;
|
||||
@@ -62,13 +61,18 @@ import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
|
||||
import wslite.json.JSONException;
|
||||
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.math.BigDecimal;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -115,6 +119,14 @@ public class PurchaseOrderController {
|
||||
"supplierPartner", Beans.get(PurchaseOrderService.class).validateSupplier(purchaseOrder));
|
||||
}
|
||||
|
||||
public void setStandByPurchaseOrder(ActionRequest request, ActionResponse response) {
|
||||
|
||||
String raison = (String) request.getContext().get("standbyRaison");
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
Beans.get(PurchaseOrderService.class).setStandByPurchaseOrder(purchaseOrder, raison);
|
||||
response.setReload(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called from grid or form purchase order view, print selected purchase order.
|
||||
*
|
||||
@@ -229,6 +241,8 @@ public class PurchaseOrderController {
|
||||
boolean existPriceListDiff = false;
|
||||
PurchaseOrder purchaseOrderTemp;
|
||||
boolean allTradingNamesAreNull = true;
|
||||
boolean eqStatusSelect = true;
|
||||
int statusSelect = -1;
|
||||
int count = 1;
|
||||
for (Long purchaseOrderId : purchaseOrderIdList) {
|
||||
purchaseOrderTemp = JPA.em().find(PurchaseOrder.class, purchaseOrderId);
|
||||
@@ -241,8 +255,12 @@ public class PurchaseOrderController {
|
||||
commonPriceList = purchaseOrderTemp.getPriceList();
|
||||
commonTradingName = purchaseOrderTemp.getTradingName();
|
||||
allTradingNamesAreNull = commonTradingName == null;
|
||||
statusSelect = purchaseOrderTemp.getStatusSelect();
|
||||
|
||||
} else {
|
||||
if (purchaseOrderTemp.getStatusSelect() != statusSelect) {
|
||||
eqStatusSelect = false;
|
||||
}
|
||||
if (commonCurrency != null && !commonCurrency.equals(purchaseOrderTemp.getCurrency())) {
|
||||
commonCurrency = null;
|
||||
}
|
||||
@@ -289,6 +307,9 @@ public class PurchaseOrderController {
|
||||
if (commonTradingName == null && !allTradingNamesAreNull) {
|
||||
fieldErrors.append(I18n.get(IExceptionMessage.PURCHASE_ORDER_MERGE_ERROR_TRADING_NAME));
|
||||
}
|
||||
if (!eqStatusSelect) {
|
||||
fieldErrors.append(I18n.get(IExceptionMessage.PURCHASE_ORDER_MERGE_ERROR_STATUS_SELECT));
|
||||
}
|
||||
|
||||
if (fieldErrors.length() > 0) {
|
||||
response.setFlash(fieldErrors.toString());
|
||||
@@ -397,6 +418,7 @@ public class PurchaseOrderController {
|
||||
try {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId());
|
||||
|
||||
Beans.get(PurchaseOrderService.class).validatePurchaseOrder(purchaseOrder);
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
@@ -404,6 +426,74 @@ public class PurchaseOrderController {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void showFare(ActionRequest request, ActionResponse response) {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId());
|
||||
|
||||
if(purchaseOrder.getImportationType() == 2 ){
|
||||
|
||||
ActionViewBuilder confirmView =
|
||||
ActionView.define("Confirm rejection")
|
||||
.model(Wizard.class.getName())
|
||||
.add("form", "amount-to-pay-fare-form")
|
||||
.param("popup", "true")
|
||||
.param("show-toolbar", "false")
|
||||
.param("show-confirm", "false")
|
||||
.param("popup-save", "false")
|
||||
.param("forceEdit", "true");
|
||||
|
||||
confirmView.context("purchaseOrderId", purchaseOrder.getId());
|
||||
response.setView(confirmView.map());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void validateImportationPurchaseOrder(ActionRequest request, ActionResponse response) throws AxelorException, MalformedURLException, JSONException {
|
||||
|
||||
if(request.getContext().get("val") == null){
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_MISSING_FIELD,
|
||||
I18n.get(IExceptionMessage.NO_PURCHASE_ORDER_SELECTED_FOR_PRINTING));
|
||||
}
|
||||
|
||||
BigDecimal val = new BigDecimal(request.getContext().get("val").toString());
|
||||
BigDecimal purchaseOrderId = new BigDecimal(request.getContext().get("purchaseOrderId").toString());
|
||||
|
||||
PurchaseOrder purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(new Long(purchaseOrderId.toString()));
|
||||
|
||||
Beans.get(PurchaseOrderServiceImpl.class).addFareToImportationFolder(purchaseOrder, val);
|
||||
|
||||
ImportationFolder importationFolder =
|
||||
Beans.get(PurchaseOrderServiceImpl.class).generateImportationFolder(purchaseOrder);
|
||||
|
||||
// Beans.get(PurchaseOrderRepository.class).save(purchaseOrder);
|
||||
|
||||
response.setView(
|
||||
ActionView.define("Importation folder")
|
||||
.model(ImportationFolder.class.getName())
|
||||
.add("grid", "importation-folder-grid")
|
||||
.add("form", "importation-folder-form")
|
||||
.param("forceEdit", "true")
|
||||
.domain("self.id = " + importationFolder.getId())
|
||||
.map());
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void validateFromFare(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
|
||||
BigDecimal purchaseOrderId = new BigDecimal(request.getContext().get("purchaseOrderId").toString());
|
||||
PurchaseOrder purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(new Long(purchaseOrderId.toString()));
|
||||
Beans.get(PurchaseOrderService.class).validatePurchaseOrder(purchaseOrder);
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void cancel(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
@@ -510,7 +600,8 @@ public class PurchaseOrderController {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId());
|
||||
|
||||
Beans.get(PurchaseOrderService.class).finishPurchaseOrder(purchaseOrder);
|
||||
Beans.get(PurchaseOrderService.class)
|
||||
.finishPurchaseOrder(purchaseOrder, purchaseOrder.getCancelReasonStr());
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
@@ -545,19 +636,19 @@ public class PurchaseOrderController {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void cancelReasonPurchaseOrder(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
Beans.get(PurchaseOrderService.class)
|
||||
.cancelReasonPurchaseOrder(
|
||||
Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId()),
|
||||
purchaseOrder.getCancelReason(),
|
||||
purchaseOrder.getCancelReasonStr());
|
||||
|
||||
response.setFlash(I18n.get("The purchase order was canceled"));
|
||||
response.setCanClose(true);
|
||||
} catch (Exception e) {
|
||||
public void cancelReasonPurchaseOrder(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
Beans.get(PurchaseOrderService.class)
|
||||
.cancelReasonPurchaseOrder(
|
||||
Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId()),
|
||||
purchaseOrder.getCancelReason(),
|
||||
purchaseOrder.getCancelReasonStr());
|
||||
|
||||
response.setFlash(I18n.get("The purchase order was canceled"));
|
||||
response.setCanClose(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
@@ -566,71 +657,76 @@ public class PurchaseOrderController {
|
||||
* @param request
|
||||
* @param response
|
||||
*/
|
||||
public void showPurchaseRequest(ActionRequest request, ActionResponse response){
|
||||
PurchaseOrder purchaseOrder = Beans.get(PurchaseOrderRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrder.class).getId());
|
||||
public void showPurchaseRequest(ActionRequest request, ActionResponse response) {
|
||||
PurchaseOrder purchaseOrder =
|
||||
Beans.get(PurchaseOrderRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrder.class).getId());
|
||||
|
||||
List<PurchaseRequest> purchaseRequests = Beans.get(PurchaseRequestRepository.class).all().fetch();
|
||||
List<PurchaseRequest> purchaseRequests =
|
||||
Beans.get(PurchaseRequestRepository.class).all().fetch();
|
||||
List<Long> tempPurchaseRequest = new ArrayList<>();
|
||||
|
||||
for (PurchaseRequest purchaseRequest : purchaseRequests) {
|
||||
List<PurchaseOrder> pOrder = purchaseRequest.getPurchaseOrderSet().stream().filter((po) -> po.getId() == purchaseOrder.getId()).collect(Collectors.toList());
|
||||
if(pOrder.size() > 0){
|
||||
List<PurchaseOrder> pOrder =
|
||||
purchaseRequest
|
||||
.getPurchaseOrderSet()
|
||||
.stream()
|
||||
.filter((po) -> po.getId() == purchaseOrder.getId())
|
||||
.collect(Collectors.toList());
|
||||
if (pOrder.size() > 0) {
|
||||
tempPurchaseRequest.add(purchaseRequest.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
response.setView(
|
||||
ActionView.define("Purchase requests")
|
||||
.model(PurchaseRequest.class.getName())
|
||||
.add("grid", "purchase-request-grid")
|
||||
.add("form", "purchase-request-form")
|
||||
.param("show-toolbar", "false")
|
||||
.param("show-confirm", "false")
|
||||
.param("popup-save", "false")
|
||||
.param("popup", "false")
|
||||
.context("_ids", tempPurchaseRequest)
|
||||
.domain("self.id in (" + Joiner.on(",").join(tempPurchaseRequest) + ")")
|
||||
.map());
|
||||
ActionView.define("Purchase requests")
|
||||
.model(PurchaseRequest.class.getName())
|
||||
.add("grid", "purchase-request-grid")
|
||||
.add("form", "purchase-request-form")
|
||||
.param("show-toolbar", "false")
|
||||
.param("show-confirm", "false")
|
||||
.param("popup-save", "false")
|
||||
.param("popup", "false")
|
||||
.context("_ids", tempPurchaseRequest)
|
||||
.domain("self.id in (" + Joiner.on(",").join(tempPurchaseRequest) + ")")
|
||||
.map());
|
||||
}
|
||||
|
||||
public void generateImportationFolder(ActionRequest request, ActionResponse response)
|
||||
throws AxelorException {
|
||||
|
||||
}
|
||||
PurchaseOrder purchaseOrder =
|
||||
Beans.get(PurchaseOrderRepository.class)
|
||||
.find(request.getContext().asType(PurchaseOrder.class).getId());
|
||||
|
||||
// if (purchaseOrder.getImportationType() == 2 && purchaseOrder.getCurrency().getId() != 41){
|
||||
|
||||
public void generateImportationFolder(ActionRequest request,ActionResponse response) throws AxelorException {
|
||||
// ImportationFolder importationFolder =
|
||||
// Beans.get(PurchaseOrderServiceImpl.class).generateImportationFolder(purchaseOrder);
|
||||
|
||||
PurchaseOrder purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(request.getContext().asType(PurchaseOrder.class).getId());
|
||||
|
||||
if(purchaseOrder.getImportationType() == 2){
|
||||
// purchaseOrder.setImportationFolder(importationFolder);
|
||||
|
||||
ImportationFolder importationFolder = Beans.get(PurchaseOrderServiceImpl.class).generateImportationFolder(purchaseOrder);
|
||||
|
||||
purchaseOrder.setImportationFolder(importationFolder);
|
||||
|
||||
// Beans.get(PurchaseOrderRepository.class).save(purchaseOrder);
|
||||
|
||||
response.setView(
|
||||
ActionView.define("Importation folder")
|
||||
.model(ImportationFolder.class.getName())
|
||||
.add("grid", "importation-folder-grid")
|
||||
.add("form", "importation-folder-form")
|
||||
.param("forceEdit", "true")
|
||||
.domain("self.id = " + importationFolder.getId())
|
||||
.map());
|
||||
|
||||
}
|
||||
// // Beans.get(PurchaseOrderRepository.class).save(purchaseOrder);
|
||||
|
||||
// response.setView(
|
||||
// ActionView.define("Importation folder")
|
||||
// .model(ImportationFolder.class.getName())
|
||||
// .add("grid", "importation-folder-grid")
|
||||
// .add("form", "importation-folder-form")
|
||||
// .param("forceEdit", "true")
|
||||
// .domain("self.id = " + importationFolder.getId())
|
||||
// .map());
|
||||
// }
|
||||
}
|
||||
|
||||
public void createPurchaseOrderBarCodeSeq(ActionRequest request, ActionResponse response) {
|
||||
try {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId());
|
||||
Beans.get(PurchaseOrderService.class).createPurchaseOrderBarCodeSeq(purchaseOrder);
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
|
||||
public void createPurchaseOrderBarCodeSeq(ActionRequest request, ActionResponse response){
|
||||
try {
|
||||
PurchaseOrder purchaseOrder = request.getContext().asType(PurchaseOrder.class);
|
||||
purchaseOrder = Beans.get(PurchaseOrderRepository.class).find(purchaseOrder.getId());
|
||||
Beans.get(PurchaseOrderService.class).createPurchaseOrderBarCodeSeq(purchaseOrder);
|
||||
response.setReload(true);
|
||||
} catch (Exception e) {
|
||||
TraceBackService.trace(response, e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,16 +21,20 @@ import com.axelor.apps.message.service.MailAccountService;
|
||||
import com.axelor.apps.purchase.db.PurchaseOrder;
|
||||
import com.axelor.apps.purchase.db.PurchaseRequest;
|
||||
import com.axelor.apps.purchase.db.PurchaseRequestLine;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseRequestRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseRequestLineRepository;
|
||||
import com.axelor.apps.purchase.db.repo.PurchaseRequestRepository;
|
||||
import com.axelor.apps.purchase.exception.IExceptionMessage;
|
||||
import com.axelor.apps.purchase.service.PurchaseRequestService;
|
||||
import com.axelor.apps.purchase.service.print.PurchaseRequestPrintService;
|
||||
import com.axelor.apps.report.engine.ReportSettings;
|
||||
import com.axelor.apps.tool.StringTool;
|
||||
import com.axelor.auth.AuthUtils;
|
||||
import com.axelor.auth.db.User;
|
||||
import com.axelor.auth.db.repo.UserRepository;
|
||||
import com.axelor.common.ObjectUtils;
|
||||
import com.axelor.exception.AxelorException;
|
||||
import com.axelor.exception.db.repo.TraceBackRepository;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.axelor.i18n.I18n;
|
||||
import com.axelor.inject.Beans;
|
||||
import com.axelor.mail.db.repo.MailFollowerRepository;
|
||||
@@ -39,30 +43,20 @@ import com.axelor.meta.schema.actions.ActionView;
|
||||
import com.axelor.meta.schema.actions.ActionView.ActionViewBuilder;
|
||||
import com.axelor.rpc.ActionRequest;
|
||||
import com.axelor.rpc.ActionResponse;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
import wslite.json.JSONException;
|
||||
import wslite.json.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import com.axelor.apps.purchase.service.print.PurchaseRequestPrintService;
|
||||
import com.axelor.common.ObjectUtils;
|
||||
import com.axelor.rpc.Context;
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.json.JsonObject;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import com.axelor.apps.report.engine.ReportSettings;
|
||||
import com.axelor.exception.service.TraceBackService;
|
||||
import com.google.common.collect.Lists;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
|
||||
|
||||
import wslite.json.JSONException;
|
||||
import wslite.json.JSONObject;
|
||||
|
||||
@Singleton
|
||||
public class PurchaseRequestController {
|
||||
@@ -111,72 +105,77 @@ public class PurchaseRequestController {
|
||||
.all()
|
||||
.filter("self.id in (?1)", requestIds)
|
||||
.fetch();
|
||||
// sophal
|
||||
int condition = 0;
|
||||
// sophal
|
||||
int condition = 0;
|
||||
String message = "";
|
||||
for (PurchaseRequest result : purchaseRequests) {
|
||||
if(result.getStatusSelect() != 5){
|
||||
for (PurchaseRequest result : purchaseRequests) {
|
||||
if (result.getStatusSelect() != 5) {
|
||||
condition = 1;
|
||||
message = "purchase request not approved";
|
||||
break;
|
||||
break;
|
||||
}
|
||||
if(result.getPurchaseOrderSet().size() > 0){
|
||||
// int limitPo = result.getLimitPo();
|
||||
|
||||
if (!result.getCanDuplicatePo() && result.getPurchaseOrderSet().size() > 0) {
|
||||
condition = 1;
|
||||
message = "you have already generated this purchase request";
|
||||
break;
|
||||
message = "you have already generated this purchase request";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( condition == 0){
|
||||
List<String> purchaseRequestSeqs =
|
||||
purchaseRequests
|
||||
.stream()
|
||||
.filter(pr -> pr.getSupplierUser() == null)
|
||||
.map(PurchaseRequest::getPurchaseRequestSeq)
|
||||
.collect(Collectors.toList());
|
||||
if (purchaseRequestSeqs != null && !purchaseRequestSeqs.isEmpty()) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.PURCHASE_REQUEST_MISSING_SUPPLIER_USER),
|
||||
purchaseRequestSeqs.toString());
|
||||
|
||||
if (condition == 0) {
|
||||
List<String> purchaseRequestSeqs =
|
||||
purchaseRequests
|
||||
.stream()
|
||||
.filter(pr -> pr.getSupplierUser() == null)
|
||||
.map(PurchaseRequest::getPurchaseRequestSeq)
|
||||
.collect(Collectors.toList());
|
||||
if (purchaseRequestSeqs != null && !purchaseRequestSeqs.isEmpty()) {
|
||||
throw new AxelorException(
|
||||
TraceBackRepository.CATEGORY_CONFIGURATION_ERROR,
|
||||
I18n.get(IExceptionMessage.PURCHASE_REQUEST_MISSING_SUPPLIER_USER),
|
||||
purchaseRequestSeqs.toString());
|
||||
}
|
||||
response.setCanClose(true);
|
||||
List<PurchaseOrder> purchaseOrderList =
|
||||
Beans.get(PurchaseRequestService.class)
|
||||
.generatePo(purchaseRequests, groupBySupplier, groupByProduct);
|
||||
ActionViewBuilder actionViewBuilder =
|
||||
ActionView.define(
|
||||
String.format(
|
||||
"Purchase Order%s generated", (purchaseOrderList.size() > 1 ? "s" : "")))
|
||||
.model(PurchaseOrder.class.getName())
|
||||
.add("grid", "purchase-order-quotation-grid")
|
||||
.add("form", "purchase-order-form")
|
||||
.context("_showSingle", true)
|
||||
.domain(
|
||||
String.format(
|
||||
"self.id in (%s)", StringTool.getIdListString(purchaseOrderList)));
|
||||
response.setView(actionViewBuilder.map());
|
||||
|
||||
} else {
|
||||
response.setAlert(I18n.get(message));
|
||||
}
|
||||
response.setCanClose(true);
|
||||
List<PurchaseOrder> purchaseOrderList =
|
||||
Beans.get(PurchaseRequestService.class)
|
||||
.generatePo(purchaseRequests, groupBySupplier, groupByProduct);
|
||||
ActionViewBuilder actionViewBuilder =
|
||||
ActionView.define(
|
||||
String.format(
|
||||
"Purchase Order%s generated", (purchaseOrderList.size() > 1 ? "s" : "")))
|
||||
.model(PurchaseOrder.class.getName())
|
||||
.add("grid", "purchase-order-quotation-grid")
|
||||
.add("form", "purchase-order-form")
|
||||
.context("_showSingle", true)
|
||||
.domain(
|
||||
String.format(
|
||||
"self.id in (%s)", StringTool.getIdListString(purchaseOrderList)));
|
||||
response.setView(actionViewBuilder.map());
|
||||
|
||||
}else{
|
||||
response.setAlert(I18n.get(message));
|
||||
}
|
||||
|
||||
|
||||
} catch (AxelorException e) {
|
||||
response.setFlash(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void purchaseRequestsAssignedToUser(ActionRequest request, ActionResponse response) {
|
||||
|
||||
List<Long> requestIds = (List<Long>) request.getContext().get("_ids");
|
||||
User user = (User) request.getContext().get("assignedToUser");
|
||||
// User user = (User) request.getContext().get("assignedToUser");
|
||||
HashSet<User> users = (HashSet<User>) request.getContext().get("buyers");
|
||||
Boolean canDuplicatePO = (Boolean) request.getContext().get("canDuplicatePO");
|
||||
int limitPo = (int) request.getContext().get("limitPo");
|
||||
|
||||
if (requestIds != null && !requestIds.isEmpty()) {
|
||||
Beans.get(PurchaseRequestService.class).purchaseRequestsAssignedToUser(requestIds, user);
|
||||
response.setCanClose(true);
|
||||
}
|
||||
|
||||
if (requestIds != null && !requestIds.isEmpty()) {
|
||||
Beans.get(PurchaseRequestService.class)
|
||||
.purchaseRequestsAssignedToUser(requestIds, users, canDuplicatePO, limitPo);
|
||||
response.setCanClose(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -213,7 +212,8 @@ public class PurchaseRequestController {
|
||||
PurchaseRequest purchaseRequest = request.getContext().asType(PurchaseRequest.class);
|
||||
title = purchaseRequestPrintService.getFileName(purchaseRequest);
|
||||
fileLink =
|
||||
purchaseRequestPrintService.printPurchaseRequest(purchaseRequest, ReportSettings.FORMAT_PDF);
|
||||
purchaseRequestPrintService.printPurchaseRequest(
|
||||
purchaseRequest, ReportSettings.FORMAT_PDF);
|
||||
logger.debug("Printing " + title);
|
||||
} else {
|
||||
throw new AxelorException(
|
||||
@@ -226,11 +226,12 @@ public class PurchaseRequestController {
|
||||
}
|
||||
}
|
||||
|
||||
public void followPurchaseRequest(ActionRequest request, ActionResponse response) throws JSONException{
|
||||
public void followPurchaseRequest(ActionRequest request, ActionResponse response)
|
||||
throws JSONException {
|
||||
Long id = request.getContext().asType(PurchaseRequest.class).getId();
|
||||
PurchaseRequest purchaseRequest = Beans.get(PurchaseRequestRepository.class).find(id);
|
||||
Beans.get(MailFollowerRepository.class).follow(purchaseRequest, AuthUtils.getUser());
|
||||
|
||||
|
||||
JSONObject obj = new JSONObject(purchaseRequest.getAttrs());
|
||||
JSONObject superiorId = obj.getJSONObject("superior_user");
|
||||
|
||||
@@ -240,42 +241,51 @@ public class PurchaseRequestController {
|
||||
}
|
||||
|
||||
@CallMethod
|
||||
public void sendEmail(String email,String subject,String body){
|
||||
EmailUtil.sendEmail(mailAccountService, email,subject, body);
|
||||
public void sendEmail(String email, String subject, String body) {
|
||||
EmailUtil.sendEmail(mailAccountService, email, subject, body);
|
||||
}
|
||||
|
||||
public void checkProductFamily(ActionRequest request, ActionResponse response) throws AxelorException {
|
||||
|
||||
Long id = request.getContext().asType(PurchaseRequest.class).getId();
|
||||
PurchaseRequest purchaseRequest = Beans.get(PurchaseRequestRepository.class).find(id);
|
||||
String productFamily = purchaseRequest.getFamilleProduit().getName().toString();
|
||||
Integer size = 0;
|
||||
|
||||
List<PurchaseRequestLine> purchaseRequestLines =
|
||||
public void checkProductFamily(ActionRequest request, ActionResponse response)
|
||||
throws AxelorException {
|
||||
|
||||
Long id = request.getContext().asType(PurchaseRequest.class).getId();
|
||||
PurchaseRequest purchaseRequest = Beans.get(PurchaseRequestRepository.class).find(id);
|
||||
String productFamily = purchaseRequest.getFamilleProduit().getName().toString();
|
||||
Integer size = 0;
|
||||
|
||||
List<PurchaseRequestLine> purchaseRequestLines =
|
||||
Beans.get(PurchaseRequestLineRepository.class)
|
||||
.all()
|
||||
.filter("self.newProduct = ?1 and self.purchaseRequest = ?2",false,id)
|
||||
.fetch();
|
||||
.all()
|
||||
.filter("self.newProduct = ?1 and self.purchaseRequest = ?2", false, id)
|
||||
.fetch();
|
||||
|
||||
if (purchaseRequestLines != null){
|
||||
|
||||
size = purchaseRequestLines.stream()
|
||||
.collect(Collectors.groupingBy(fa -> fa.getProduct().getFamilleProduit())).size();
|
||||
if (purchaseRequestLines != null) {
|
||||
|
||||
}
|
||||
if (size > 1){
|
||||
response.setError(I18n.get("Lines of expression of needs are not of the same family :") +productFamily);
|
||||
//return;
|
||||
size =
|
||||
purchaseRequestLines
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(fa -> fa.getProduct().getFamilleProduit()))
|
||||
.size();
|
||||
}
|
||||
if (size > 1) {
|
||||
response.setError(
|
||||
I18n.get("Lines of expression of needs are not of the same family :") + productFamily);
|
||||
// return;
|
||||
}
|
||||
if (size == 1) {
|
||||
long idOfFamily =
|
||||
purchaseRequestLines
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(fa -> fa.getProduct().getFamilleProduit().getId()))
|
||||
.keySet()
|
||||
.stream()
|
||||
.collect(Collectors.toList())
|
||||
.get(0);
|
||||
|
||||
if (purchaseRequest.getFamilleProduit().getId() != idOfFamily) {
|
||||
response.setError(
|
||||
I18n.get("Lines of expression of needs are not of the same family :") + productFamily);
|
||||
}
|
||||
if (size == 1){
|
||||
long idOfFamily = purchaseRequestLines.stream()
|
||||
.collect(Collectors.groupingBy(fa -> fa.getProduct().getFamilleProduit().getId()))
|
||||
.keySet().stream().collect(Collectors.toList()).get(0);
|
||||
|
||||
if (purchaseRequest.getFamilleProduit().getId() != idOfFamily){
|
||||
response.setError(I18n.get("Lines of expression of needs are not of the same family :") +productFamily);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
<boolean name="isEnabledProductDescriptionCopy" title="Enable product description copy"/>
|
||||
<boolean name="manageSupplierCatalog" title="Manage supplier catalog"/>
|
||||
<boolean name="isDisplayPurchaseOrderLineNumber" title="Display purchase order line number"/>
|
||||
|
||||
<one-to-many name="usersExludedFromTco" ref="com.axelor.auth.db.User" title="Users Exluded From Tco" />
|
||||
|
||||
<track>
|
||||
<field name="managePurchaseOrderVersion" on="UPDATE"/>
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<?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="BookingService" lang="java">
|
||||
<string name="eventName" />
|
||||
<date name="eventDate" />
|
||||
<string name="eventAddress" />
|
||||
<decimal name="estimatedParticipantNumber" />
|
||||
|
||||
<string name="missionName" />
|
||||
<string name="missionAddress" />
|
||||
<string name="tripPurpose" />
|
||||
|
||||
|
||||
<string name="phoneNumber"/>
|
||||
<string name="emailAddress" title="Email"/>
|
||||
|
||||
<integer name="numberOfRoom" default="1"/>
|
||||
<integer name="roomType" title="Room type" selection="ipurchase.booking.room.type.select" default="1"/>
|
||||
<integer name="accommodationType" title="Accomodation type" selection="ipurchase.booking.accommodation.type.select" default="1"/>
|
||||
<date name="checkInDate" />
|
||||
<date name="checkOutDate" />
|
||||
|
||||
|
||||
<integer name="numberOfTicket" default="1"/>
|
||||
<string name="departurePoint" title="Departure point"/>
|
||||
<date name="departureDate" />
|
||||
<string name="destination" title="Destination"/>
|
||||
|
||||
<!-- <string name="destination" title="Destination"/> -->
|
||||
|
||||
<date name="returnDate" />
|
||||
<string name="returnPoint" title="Return point"/>
|
||||
|
||||
|
||||
|
||||
<integer name="statusSelect" title="Status" readonly="true" selection="ipurchase.booking.status.select" default="1"/>
|
||||
<integer name="serviceType" title="Service type" readonly="true" selection="ipurchase.booking.service.type.select" default="1"/>
|
||||
|
||||
<date name="serviceDate" title="Service date" />
|
||||
|
||||
<many-to-one name="requestedBy" title="Requested By" ref="com.axelor.auth.db.User"/>
|
||||
<date name="requestDate" title="Request date" />
|
||||
<many-to-one name="validatedBy" title="Validated By" ref="com.axelor.auth.db.User"/>
|
||||
<date name="validationDate" title="Validation date" />
|
||||
<many-to-one name="approvedBy" title="Approved By" ref="com.axelor.auth.db.User"/>
|
||||
<date name="approvalDate" title="Approval date" />
|
||||
|
||||
|
||||
<track>
|
||||
<field name="serviceType"/>
|
||||
<field name="statusSelect"/>
|
||||
<field name="requestedBy" />
|
||||
<field name="requestDate" />
|
||||
<field name="validatedBy" />
|
||||
<field name="validationDate" />
|
||||
<field name="approvedBy" />
|
||||
<field name="approvalDate" />
|
||||
</track>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@@ -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="purchase" package="com.axelor.apps.purchase.db"/>
|
||||
|
||||
<entity name="ImportationDocumentExtra" sequential="true" lang="java">
|
||||
|
||||
<many-to-one name="docFile" ref="com.axelor.meta.db.MetaFile" title="Doc file" />
|
||||
<integer name="docType" selection="purchase.importation.folder.doc.extra.type.select" />
|
||||
<string name="notes" large="true" multiline="true" title="Description To Display"/>
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@@ -10,6 +10,7 @@
|
||||
<string name="name" sequence="importation.seq" title="Ref."/>
|
||||
<integer name="statusSelect" selection="purchase.importation.folder.status.select" readonly="true" default="1" />
|
||||
<one-to-many name="purchaseOrderList" ref="PurchaseOrder" mappedBy="importationFolder" title="Purchase order"/>
|
||||
<one-to-many name="purchaseOrderLineList" ref="PurchaseOrderLine" title="Purchase order line"/>
|
||||
<many-to-one name="forwardingPartner" ref="com.axelor.apps.base.db.Partner" title="Forwarding Partner"/>
|
||||
<many-to-one name="supplierPartner" ref="com.axelor.apps.base.db.Partner" title="Supplier"/>
|
||||
<string name="containerNumber" title="Number Container."/>
|
||||
@@ -31,10 +32,12 @@
|
||||
<date name="arrivalNoticeDate" title="Arrival notice date"/>
|
||||
|
||||
<many-to-one name="arrivalNoticeFile" ref="com.axelor.meta.db.MetaFile" title="Arrival notice file" />
|
||||
<one-to-many name="arrivalNoticeFiles" ref="com.axelor.meta.db.MetaFile" title="Arrival notice files" />
|
||||
|
||||
|
||||
<date name="d_10_date" title="Date D10"/>
|
||||
<many-to-one name="d10File" ref="com.axelor.meta.db.MetaFile" title="D10 File" />
|
||||
<one-to-many name="d10Files" ref="com.axelor.meta.db.MetaFile" title="D10 Files" />
|
||||
|
||||
|
||||
<many-to-one name="currency" ref="com.axelor.apps.base.db.Currency" title="Currency"/>
|
||||
@@ -98,6 +101,25 @@
|
||||
|
||||
<string name="file_type" selection="purchase.importation.folder.file.type" title="File type" />
|
||||
|
||||
<many-to-many name="importationDocumentExtraList" ref="ImportationDocumentExtra" title="Information document extra" />
|
||||
|
||||
<decimal name="CFR" title="CFR" />
|
||||
|
||||
<decimal name="freight" title="Freight" />
|
||||
|
||||
<decimal name="currencyRate" title="Currency Rate" scale="6" precision="20" />
|
||||
|
||||
<boolean name="invoicedFolder" title="Invoiced folder" />
|
||||
|
||||
<boolean name="rejected" default="false" title="Rejected" />
|
||||
<date name="rejectedDate" title="Rejected Date" />
|
||||
<many-to-one name="rejectedByUser" ref="com.axelor.auth.db.User" readonly="true" title="Rejected by"/>
|
||||
<integer name="rejectedInstanceSelect" title="Status" selection="purchase.importation.folder.status.select" />
|
||||
<string name="rejectionRaison" large="true"/>
|
||||
<many-to-one name="printingSettings" ref="com.axelor.apps.base.db.PrintingSettings"/>
|
||||
<!-- <many-to-one name="invoiceTemplate" ref="com.axelor.apps.account.db.InvoiceTemplate"/> -->
|
||||
|
||||
|
||||
<extra-code>
|
||||
<![CDATA[
|
||||
/** Static importation folder status select */
|
||||
@@ -105,6 +127,8 @@
|
||||
public static final int STATUS_OPEND = 2;
|
||||
public static final int STATUS_CLOSED = 3;
|
||||
public static final int STATUS_CANCELED = 4;
|
||||
public static final int STATUS_REJECTED = 9;
|
||||
public static final int STATUS_VALIDATED = 10;
|
||||
]]>
|
||||
</extra-code>
|
||||
|
||||
|
||||
@@ -76,6 +76,8 @@
|
||||
<many-to-one name="purchaseRequestOrigin" ref="com.axelor.apps.purchase.db.PurchaseRequest" title="Purchase Request" />
|
||||
<many-to-one name="cancelReason" title="Cancel reason" ref="com.axelor.apps.base.db.CancelReason"/>
|
||||
<string name="cancelReasonStr" title="Cancel Reason" large="true"/>
|
||||
|
||||
<string name="finishReasonStr" title="Finish Reason" large="true"/>
|
||||
|
||||
<many-to-many name="purchaseRequestSet" ref="com.axelor.apps.purchase.db.PurchaseRequest" mappedBy="purchaseOrderSet" title="Purchase Request" />
|
||||
|
||||
@@ -90,13 +92,21 @@
|
||||
<many-to-one name="approvedByUser" ref="com.axelor.auth.db.User" readonly="true" title="Approved by"/>
|
||||
<date name="approvalDate" title="Approval 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"/>
|
||||
<string name="standbyRaison" title="Standby Raison" large="true"/>
|
||||
<boolean name="isStandBy" title="Is standby" default="0" />
|
||||
|
||||
<many-to-one name="barCodeSeq" title="Barcode" ref="com.axelor.meta.db.MetaFile" />
|
||||
|
||||
<boolean name="isWithoutPayment" title="Is Without Payment"/>
|
||||
|
||||
<unique-constraint columns="purchaseOrderSeq,company"/>
|
||||
|
||||
<extra-code>
|
||||
<![CDATA[
|
||||
/** Static purchase order status select */
|
||||
public static final int STATUS_STANDBY = -1;
|
||||
public static final int STATUS_DRAFT = 1;
|
||||
|
||||
public static final int STATUS_REQUESTED = 2;
|
||||
@@ -119,12 +129,15 @@
|
||||
</extra-code>
|
||||
|
||||
<track>
|
||||
<field name="buyerUser" />
|
||||
<field name="cancelReason" />
|
||||
<field name="cancelReasonStr" />
|
||||
<field name="finishReasonStr" />
|
||||
<field name="purchaseOrderSeq" />
|
||||
<field name="supplierPartner" />
|
||||
<field name="statusSelect" on="UPDATE"/>
|
||||
<message if="true" on="CREATE">Purchase order created</message>
|
||||
<message if="statusSelect == 0" tag="important">Approved</message>
|
||||
<message if="statusSelect == 1" tag="important">Draft</message>
|
||||
<message if="statusSelect == 2" tag="important">Requested</message>
|
||||
<message if="statusSelect == 3" tag="info">Validated</message>
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
<decimal name="salePrice" precision="20" scale="10"/>
|
||||
|
||||
<boolean name="isTitleLine" title="Title Line"/>
|
||||
|
||||
<one-to-many name="purchaseOrderLineFileList" ref="PurchaseOrderLineFile" mappedBy="purchaseOrderLine" title="PurchaseOrderLine Files"/>
|
||||
|
||||
</entity>
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
<?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="PurchaseOrderLineFile" lang="java">
|
||||
<many-to-one name="coaFile" ref="com.axelor.meta.db.MetaFile" title="coa file" />
|
||||
<string name="noteCOA" large="true" multiline="true" title="Comment on coa"/>
|
||||
<string name="file_type" selection="purchase.importation.folder.file.type" title="File type" />
|
||||
<datetime name="coa_validation_date" title="Coa validation date" />
|
||||
<many-to-one name="coa_validator_user" ref="com.axelor.auth.db.User" />
|
||||
<integer name="statusSelect" title="Status" selection="purchase.order.line.file.status.select" readonly="true"/>
|
||||
<many-to-one name="purchaseOrderLine" ref="com.axelor.apps.purchase.db.PurchaseOrderLine" title="Purchase order" />
|
||||
|
||||
|
||||
<track>
|
||||
<field name="statusSelect" />
|
||||
</track>
|
||||
|
||||
|
||||
</entity>
|
||||
|
||||
</domain-models>
|
||||
@@ -37,6 +37,12 @@
|
||||
|
||||
<integer name="orderByState"/>
|
||||
|
||||
<many-to-many name="buyers" ref="com.axelor.auth.db.User" title="Buyers" />
|
||||
|
||||
<boolean name="canDuplicatePo" title="Can duplicate PO" default="false"/>
|
||||
|
||||
<integer name="limitPo" title="limit Po" default="1"/>
|
||||
|
||||
<unique-constraint columns="purchaseRequestSeq"/>
|
||||
|
||||
<extra-code>
|
||||
@@ -54,6 +60,7 @@
|
||||
</extra-code>
|
||||
|
||||
<track>
|
||||
<field name="statusSelect"/>
|
||||
<field name="supplierUser"/>
|
||||
<field name="purchaseRequestSeq" />
|
||||
</track>
|
||||
|
||||
Reference in New Issue
Block a user