Я создал приложение, которое отслеживает продажи книг и, будем надеяться, рассчитает авторские гонорары.
Прямо сейчас я отслеживаю продажи в заказах. Каждый заказ имеет_много: line_items. При сохранении новой позиции я вычисляю общие продажи данного продукта, поэтому у меня есть общее количество продаж.
Каждый автор имеет несколько правил роялти, основанных на их контракте. Например, продано от 0 до 5000 копий, они получают 10 процентов. 5001 до 10000, они получают 20 процентов. Сначала я рассчитывал долю автора на каждую позицию. Это работало хорошо, но потом я понял, что мое приложение выбирает, какое правило роялти применять на основе общих продаж. Если я размещу большой заказ, возможно, что авторские гонорары будут рассчитываться по высокой ставке роялти для всей позиции, тогда как на самом деле роялти следует рассчитывать как на основе более низкой, так и высокой ставки роялти (как в одной строке). пункт толкает общий объем продаж, превышающий точку прорыва правила роялти).
Итак, мой вопрос, как лучше всего это сделать. Я исследовал использование диапазонов, но все это немного ново для меня, и код становится немного сложнее. Вот, по общему признанию, неуклюжий код, который я использую для переноса всех правил роялти для данного контракта в массив:
def royalty_rate
@product = Product.find_by_id(product_id)
@total_sold = @product.total_sold
@rules = Contract.find_by_product_id(@product).royalties
... where next?
end
@ rules имеет: нижний и верхний для каждого правила роялти, поэтому для этого продукта первое: нижнее будет 0, а верхнее будет 5000, затем второе нижнее будет 5001, а второе верхнее будет 10000 и т. Д.
Любая помощь или идеи с этим будут оценены. На самом деле это последний шаг для меня, чтобы получить полностью рабочую версию, с которой я могу играть.
Я использовал этот код ниже, чтобы выбрать конкретное правило, основанное на значении total_sold, но опять-таки, это дает эффект кумулятивных продаж и выбора самой высокой ставки роялти вместо их разделения.
@rules = @contract.royalties.where("lower <= :total_sold AND upper >= :total_sold", {:total_sold => @total_sold}).limit(1)
Заранее спасибо.