Проектирование системы расчета заработной платы, бизнес-логика в SP или уровне приложений (C#.Net), ремонтопригодность — репост
-
03-07-2019 - |
Вопрос
Мы разрабатываем систему расчета заработной платы для клиента.
Организация, на которую мы ориентируемся, имеет следующую иерархию:Компания -> Кластер -> Бизнес-единица (БЕ) -> Подразделение -> Сотрудник
Заработная плата работника складывается из различных составляющих заработной платы.С каждым компонентом зарплаты связано 3 правила: правило расчета (рассчитывать компонент как % от другого компонента или как % от фиксированного числа или фиксированного числа), правило приемлемости (имеет ли сотрудник/отдел право на получение компонента) и Правило ограничений, которое ограничивает максимум и минимум компонента.
****Эти правила доступны для редактирования и могут быть изменены конечным пользователем**.Кроме того, эти правила наследуются сверху вниз, но если они определены на более низком уровне, правило более низкого уровня имеет приоритет.**
У нас есть база данных, в которой есть таблицы «Посещаемость», «Отпуски», «Бонусы», и эти правила также должны взаимодействовать с этими таблицами.
Клиент будет генерировать заработную плату для нескольких клиентов, каждый из которых размещает отдельный экземпляр базы данных.Каждый из них может иметь разную интерпретацию каждого компонента и может иметь разные компоненты.
Мы хотим поддерживать только SQL Server, а создание расчетов заработной платы будет осуществляться в автономном режиме.
Мы разделились во мнениях относительно того, где разместить логику, которая использует эти правила для создания отдельных налоговых компонентов (которые будут включать налоговые вычеты, налоговые списания, льготы и т. д.).
Некоторые люди выступают за волшебные SP, которые будут брать идентификатор сотрудника и генерировать заработную плату за этот месяц.Другие хотят, чтобы логика была разбита на отдельные компоненты, которые будут получать зависимые данные для сотрудника на уровне приложения и вычислять эти компоненты там.
Порядок наших приоритетов:1.Способность быстро адаптировать изменения к новым клиентам 2.Долгосрочная обслуживание 3.Производительность
1 и 2 здесь значительно перевешивают 3, поскольку это будет офлайн-действие.
Удобство сопровождения и быстрая настройка очень важны, мы будем развертывать приложение для разных клиентов.Клиент A может иметь правило компонента заработной платы как ((0,3 * базовый) + 800) и клиент B как (0,2 * Основная) + (0,1 * БОНУС АНЕНДАНДА)
Не вызовут ли здесь беспорядка поставщики услуг, поскольку предложенные выше правила будут определяться конечным пользователем и их необходимо будет настраивать через веб-интерфейс.Нам придется разбирать формулы из SQL.Насколько это будет сложно или легко?Какое преимущество это будет иметь на прикладном уровне (C# .Net) по сравнению с использованием SP?
Оригинальный пост здесь:Советы по дизайну, система расчета заработной платы... репост...но ни на один из вопросов не было дано должного ответа.
Предложения и указания по архитектуре существующих систем будут очень полезны....и да, мы используем LINQ to SQL в другом месте системы.
С уважением, Ашиш Шарма
Решение
Я всегда стараюсь избегать размещения бизнес-логики на уровне БД.Его сложнее писать, отлаживать и поддерживать.Кроме того, БД, как правило, является самым дорогим уровнем для масштабирования.Если вам в конечном итоге потребуется расширить свою систему для поддержки большего количества пользователей, добавить в систему новые веб-серверы относительно дешево и легко, но добавление экземпляров БД становится дорогостоящим, поскольку каждая БД требует лицензии и дополнительной поддержки.
Другие советы
Если вы храните формулы, например, в JEP (для Java), это не является большой проблемой.Просто сохраните полную формулу в виде строки:то есть:"pay=((0,3 * Basic) + 800), а затем разобрать его в дерево.
Вы можете просмотреть некоторую документацию jep для получения информации и почерпнуть оттуда идеи.Не должно быть проблем с реализацией простых решателей для формул, которые вы разместили здесь.
Мое предложение:
- Храните его в строке в базе данных.
- Создайте небольшую библиотеку для оценки и парсера.
- Разберите его в бинарное дерево.(например, «+» указывает на 800, а также указывает на «') тогда '' указывает на «базовый» и на «0,3»
- После этого вам просто понадобится простая рекурсивная функция для ее решения.
Если сложность этих формул невелика, вы можете сделать это с любой стороны, поскольку вам не потребуется много времени для их обработки.
Если вы ищете решение .Net, которое будет оценивать формулу, представленную в строках, вот отличная статья, в которой подробно описано использование ANTLR и C# создать вычислительную машину.Существует полнофункциональный интерпретатор формул, который анализирует строки, создает AST, а затем оценивает выражение.Кроме того, механизм вычислений реализован с использованием шаблона Посетитель, поэтому, если у вас есть функции, которые вы хотите выполнять, например поиск в базе данных, вы можете легко включить настройку в свое решение.
Слышали ли вы об Relection или делегатах?