First commit (wating to add alerts in budget)

This commit is contained in:
BACHIR SOULDI
2025-09-04 13:21:24 +01:00
parent f70bf3341b
commit 9eb959f07a
192 changed files with 51034 additions and 4992 deletions

View File

@@ -0,0 +1,26 @@
package com.axelor.apps.suppliermanagement.db.repo;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.axelor.apps.account.db.BudgetDistribution;
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
public class PurchaseOrderSupplierLineManagementRepository extends PurchaseOrderSupplierLineRepository {
@Override
public Map<String, Object> populate(Map<String, Object> json, Map<String, Object> context) {
Long supplierLine = (Long) json.get("id");
PurchaseOrderSupplierLine line = find(supplierLine);
List<BudgetDistribution> budgetDistributiList = line.getPurchaseOrderLine().getBudgetDistributionList();
BigDecimal totalBudgetAmountAvailable = BigDecimal.ZERO;
for (BudgetDistribution budgetDistribution : budgetDistributiList) {
totalBudgetAmountAvailable = totalBudgetAmountAvailable.add(budgetDistribution.getBudgetAmountAvailable());
}
json.put("budgetRemainingAmount", totalBudgetAmountAvailable);
return super.populate(json, context);
}
}

View File

@@ -0,0 +1,13 @@
package com.axelor.apps.suppliermanagement.module;
import com.axelor.app.AxelorModule;
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineManagementRepository;
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
public class SupplierManagementModule extends AxelorModule{
@Override
protected void configure() {
bind(PurchaseOrderSupplierLineRepository.class).to(PurchaseOrderSupplierLineManagementRepository.class);
}
}

View File

@@ -34,6 +34,7 @@ import com.axelor.apps.purchase.service.app.AppPurchaseService;
import com.axelor.apps.purchase.web.EmailUtil;
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
import com.axelor.apps.supplychain.service.PurchaseOrderLineServiceSupplychainImpl;
import com.axelor.auth.AuthUtils;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.repo.TraceBackRepository;
@@ -44,8 +45,10 @@ import com.google.inject.persist.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class PurchaseOrderSupplierLineService {
@@ -61,7 +64,6 @@ public class PurchaseOrderSupplierLineService {
@Inject private MailAccountService mailAccountService;
@Transactional(rollbackOn = {Exception.class})
public void accept(PurchaseOrderSupplierLine purchaseOrderSupplierLine) throws AxelorException {
@@ -83,6 +85,7 @@ public class PurchaseOrderSupplierLineService {
// set tax from tco
BigDecimal priceDiscounted = this.computeDiscount(purchaseOrderSupplierLine);
purchaseOrderLine.setQty(purchaseOrderSupplierLine.getAvailableQty());
purchaseOrderLine.setTaxLine(purchaseOrderSupplierLine.getTaxLine());
purchaseOrderLine.setPrice(purchaseOrderSupplierLine.getPrice());
purchaseOrderLine.setExTaxTotal(
@@ -95,7 +98,15 @@ public class PurchaseOrderSupplierLineService {
// sophal add acceptedOn and By TCO
purchaseOrderSupplierLine.setAcceptanceDate(appPurchaseService.getTodayDate());
purchaseOrderSupplierLine.setAcceptedByUser(AuthUtils.getUser());
;
if(!purchaseOrderLine.getBudgetDistributionList().isEmpty()){
Beans.get(PurchaseOrderLineServiceSupplychainImpl.class)
.computeBudgetDistributionSumAmount(purchaseOrderLine, purchaseOrderLine.getPurchaseOrder());
}
if(!purchaseOrderLine.getAnalyticMoveLineList().isEmpty()){
Beans.get(PurchaseOrderLineServiceSupplychainImpl.class).computeAnalyticDistribution(purchaseOrderLine);
}
poSupplierLineRepo.save(purchaseOrderSupplierLine);
}
@@ -151,11 +162,34 @@ public class PurchaseOrderSupplierLineService {
this.putStandBy(line, raison);
}
}
PurchaseOrder po = purchaseOrderSupplierLines.get(0).getPurchaseOrderLine().getPurchaseOrder();
String email = purchaseOrderSupplierLines.get(0).getPurchaseOrderLine().getCreatedBy().getPartner().getEmailAddress().getAddress();
String raisonTmp = raison != null ? raison : "";
if(email != null){
EmailUtil.sendEmail(mailAccountService, email, "TCO En Attente "+po.getPurchaseOrderSeq(),po.getPurchaseOrderSeq()+ " a été mis en anttente avec le motif suivant <br><b>"+raisonTmp+"</b>");
// PurchaseOrder po =
// purchaseOrderSupplierLines.get(0).getPurchaseOrderLine().getPurchaseOrder();
Set<PurchaseOrder> purchaseOrderSet = new HashSet<>();
for (PurchaseOrderSupplierLine line : purchaseOrderSupplierLines) {
purchaseOrderSet.add(line.getPurchaseOrderLine().getPurchaseOrder());
}
for (PurchaseOrder pOrder : purchaseOrderSet) {
// List<PurchaseOrderSupplierLine> pslines = purchaseOrderSupplierLines.stream().filter(arg0
// -> arg0.getPurchaseOrderLine().getPurchaseOrder().getId() ==
// pOrder.getId()).collect(Collectors.toList());
String email = pOrder.getCreatedBy().getPartner().getEmailAddress().getAddress();
String raisonTmp = raison != null ? raison : "";
if (email != null) {
EmailUtil.sendEmailWithCC(
mailAccountService,
email,
"De(s) TCO(s) mis en attente(s) : " + pOrder.getPurchaseOrderSeq(),
"Des TCO's ont été mis en anttentes de la CA : "
+ pOrder.getPurchaseOrderSeq()
+ " avec le motif suivant <br><b>"
+ raisonTmp
+ "</b>",
"bachir.souldi@sophal.dz",
"zakaria.hachemi@sophal.dz");
}
}
}
@@ -323,12 +357,12 @@ public class PurchaseOrderSupplierLineService {
return map;
}
BigDecimal priceDiscounted = this.computeDiscount(line).setScale(5,RoundingMode.HALF_EVEN);
BigDecimal priceDiscounted = this.computeDiscount(line).setScale(5, RoundingMode.HALF_EVEN);
BigDecimal taxRate = line.getTaxLine().getValue();
BigDecimal exTaxTotal = PurchaseOrderLineServiceImpl.computeAmount(line.getAvailableQty(), priceDiscounted);
BigDecimal exTaxTotal =
PurchaseOrderLineServiceImpl.computeAmount(line.getAvailableQty(), priceDiscounted);
BigDecimal taxTotal = exTaxTotal.multiply(taxRate);
BigDecimal inTaxTotal = exTaxTotal.add(exTaxTotal.multiply(taxRate));

View File

@@ -39,6 +39,7 @@ import com.axelor.apps.stock.service.StockLocationService;
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
import com.axelor.apps.supplychain.exception.IExceptionMessage;
import com.axelor.apps.supplychain.service.PurchaseOrderLineServiceSupplychainImpl;
import com.axelor.apps.supplychain.service.PurchaseOrderServiceSupplychainImpl;
import com.axelor.auth.AuthUtils;
import com.axelor.dms.db.DMSFile;
@@ -70,7 +71,7 @@ public class PurchaseOrderSupplierService {
@Inject private PurchaseOrderServiceSupplychainImpl purchaseOrderServiceSupplychainImpl;
@Inject private PurchaseOrderLineService purchaseOrderLineService;
@Inject private PurchaseOrderLineServiceSupplychainImpl purchaseOrderLineServiceSupplychainImpl;
@Inject protected PurchaseOrderRepository poRepo;
@@ -322,13 +323,7 @@ public class PurchaseOrderSupplierService {
"Création d'une ligne de commande fournisseur pour le produit : {}",
new Object[] {purchaseOrderLine.getProductName()});
return purchaseOrderLineService.createPurchaseOrderLine(
purchaseOrder,
purchaseOrderLine.getProduct(),
purchaseOrderLine.getProductName(),
purchaseOrderLine.getDescription(),
purchaseOrderLine.getQty(),
purchaseOrderLine.getUnit());
return purchaseOrderLineServiceSupplychainImpl.createPurchaseOrderLineFromSplit(purchaseOrderLine);
}
@Transactional(rollbackOn = {Exception.class})
@@ -398,13 +393,7 @@ public class PurchaseOrderSupplierService {
new Object[] {purchaseOrderLine.getProductName()});
PurchaseOrderLine PurchaseOrderLineNew =
purchaseOrderLineService.createPurchaseOrderLine(
purchaseOrder,
purchaseOrderLine.getProduct(),
purchaseOrderLine.getProductName(),
purchaseOrderLine.getDescription(),
purchaseOrderLine.getQty(),
purchaseOrderLine.getUnit());
purchaseOrderLineServiceSupplychainImpl.createPurchaseOrderLineFromSplit(purchaseOrderLine);
PurchaseOrderLineNew.setPrice(purchaseOrderLine.getPrice());
PurchaseOrderLineNew.setInTaxPrice(purchaseOrderLine.getInTaxPrice());
@@ -455,6 +444,7 @@ public class PurchaseOrderSupplierService {
po.setRefusedByUser(poLineSupplierParnet.getRefusedByUser());
po.setAttrs(poLineSupplierParnet.getAttrs());
po.setCurrency(poLineSupplierParnet.getCurrency());
po.setPriceDiscounted(poLineSupplierParnet.getPriceDiscounted());
// LOG.debug("purchaseOrderLineNew.getId(): {}",purchaseOrderLineNew.get(index).getId());
Beans.get(PurchaseOrderSupplierLineRepository.class).save(po);
}

View File

@@ -28,6 +28,7 @@ import com.axelor.apps.purchase.service.app.AppPurchaseService;
import com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine;
import com.axelor.apps.suppliermanagement.db.repo.PurchaseOrderSupplierLineRepository;
import com.axelor.apps.suppliermanagement.service.PurchaseOrderSupplierLineService;
import com.axelor.apps.supplychain.service.PurchaseOrderServiceSupplychainImpl;
import com.axelor.exception.service.TraceBackService;
import com.axelor.inject.Beans;
import com.axelor.meta.schema.actions.ActionView;
@@ -287,4 +288,13 @@ public class PurchaseOrderSupplierLineController {
TraceBackService.trace(response, e);
}
}
public void computeBudgetDistribution(ActionRequest request, ActionResponse response){
PurchaseOrderSupplierLine purchaseOrderSupplierLine = Beans.get(PurchaseOrderSupplierLineRepository.class)
.find(request.getContext().asType(PurchaseOrderSupplierLine.class).getId());
Beans.get(PurchaseOrderServiceSupplychainImpl.class).computeBudgetDistribution(purchaseOrderSupplierLine.getPurchaseOrderLine());
response.setReload(true);
}
}

View File

@@ -51,6 +51,8 @@
<string name="rejectionRaison" title="Rejection Raison" large="true"/>
<string name="standbyRaison" title="Standby Raison" large="true"/>
<decimal name="budgetRemainingAmount" title="Budget remaining amount" precision="20" scale="10"/>
<extra-code><![CDATA[
//STATE SELECT