namespace foodmarket.Application.Inventory; /// Скользящее средневзвешенное себестоимости товара при приёмке. /// /// Себестоимость пересчитывается так, чтобы отражать средневзвешенную цену /// всех закупленных единиц: (остаток·текущаяСебестоимость + приход·ценаЗакупки) /// / (остаток + приход). На первой приёмке (нет остатка и себестоимости) /// берётся цена закупки. Результат округляется до 4 знаков. /// /// Вынесено из SuppliesController.Post для юнит-тестируемости — /// контроллер вызывает этот метод. public static class MovingAverageCost { public static decimal Compute( decimal currentQty, decimal currentCost, decimal incomingQty, decimal incomingUnitPrice) { var totalQty = currentQty + incomingQty; // Порядок важен: && связывает крепче ||, т.е. // (totalQty==0) || ((currentCost==0) && (currentQty==0)). var newCost = totalQty == 0m || currentCost == 0m && currentQty == 0m ? incomingUnitPrice : (currentQty * currentCost + incomingQty * incomingUnitPrice) / totalQty; return Math.Round(newCost, 4, MidpointRounding.AwayFromZero); } }