Проектирование системы расчета заработной платы, бизнес-логика в SP или уровне приложений (C#.Net), ремонтопригодность — репост

StackOverflow https://stackoverflow.com/questions/209770

Вопрос

Мы разрабатываем систему расчета заработной платы для клиента.

Организация, на которую мы ориентируемся, имеет следующую иерархию:Компания -> Кластер -> Бизнес-единица (БЕ) -> Подразделение -> Сотрудник

Заработная плата работника складывается из различных составляющих заработной платы.С каждым компонентом зарплаты связано 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 или делегатах?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top