feat(falukant): add transport cost option to product price calculations
All checks were successful
Deploy to production / deploy (push) Successful in 2m49s

- Updated the `getProductPricesInCitiesBatch` method in FalukantService to accept an options parameter for including transport costs in price calculations.
- Modified the tax calculation logic to conditionally apply transport costs based on the new parameter, enhancing the accuracy of pricing based on regional differences.
- Adjusted the FalukantController to pass the includeTransportCosts option from the request body, improving flexibility in pricing queries.
This commit is contained in:
Torsten Schulz (local)
2026-04-13 16:11:53 +02:00
parent b50d2a9a93
commit 9deda3147e
2 changed files with 12 additions and 3 deletions

View File

@@ -262,11 +262,17 @@ class FalukantController {
const body = req.body || {};
const items = Array.isArray(body.items) ? body.items : [];
const currentRegionId = body.currentRegionId != null ? parseInt(body.currentRegionId, 10) : null;
const includeTransportCosts = body.includeTransportCosts === true || body.includeTransportCosts === 'true';
const valid = items.map(i => ({
productId: parseInt(i.productId, 10),
currentPrice: parseFloat(i.currentPrice)
})).filter(i => !Number.isNaN(i.productId) && !Number.isNaN(i.currentPrice));
return this.service.getProductPricesInCitiesBatch(userId, valid, Number.isNaN(currentRegionId) ? null : currentRegionId);
return this.service.getProductPricesInCitiesBatch(
userId,
valid,
Number.isNaN(currentRegionId) ? null : currentRegionId,
{ includeTransportCosts }
);
});
this.renovate = this._wrapWithUser((userId, req) => this.service.renovate(userId, req.body.element), { blockInDebtorsPrison: true });
this.renovateAll = this._wrapWithUser((userId) => this.service.renovateAll(userId), { blockInDebtorsPrison: true });

View File

@@ -7079,8 +7079,9 @@ class FalukantService extends BaseService {
* @param {number|null} currentRegionId
* @returns {Promise<Record<number, Array<{ regionId, regionName, price, branchType }>>>}
*/
async getProductPricesInCitiesBatch(hashedUserId, items, currentRegionId = null) {
async getProductPricesInCitiesBatch(hashedUserId, items, currentRegionId = null, options = {}) {
if (!items || items.length === 0) return {};
const includeTransportCosts = Boolean(options?.includeTransportCosts);
const productIds = [...new Set(items.map(i => i.productId))];
const priceByProduct = new Map(items.map(i => [i.productId, i.currentPrice]));
@@ -7189,7 +7190,9 @@ ORDER BY r.id`,
const grossPrice = calcRegionalSellPriceSync(product, knowledgeFactor, worthPercent);
if (grossPrice == null) continue;
const taxPercent = Number(taxByCity.get(city.id) || 0);
const transportPerPiece = currentRegionId && city.id !== currentRegionId ? (grossPrice * 0.01) : 0;
const transportPerPiece = includeTransportCosts && currentRegionId && city.id !== currentRegionId
? (grossPrice * 0.01)
: 0;
const taxableProfit = Math.max(0, grossPrice - pieceCost - transportPerPiece);
const taxPerPiece = taxableProfit * (taxPercent / 100);
const netPerPiece = grossPrice - pieceCost - taxPerPiece - transportPerPiece;