temporary branch

This commit is contained in:
BACHIR SOULDI
2024-10-17 11:30:20 +01:00
parent cd115a234b
commit 742ec3e75e
212 changed files with 18396 additions and 1899 deletions

View File

@@ -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" /*)*/;
}

View File

@@ -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";
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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();
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}
}
}
}
}

View File

@@ -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"/>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>