Diseño del sistema de nómina, lógica de negocios en SP o capa de aplicación (C # .Net), mantenimiento - repost

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

Pregunta

Estamos diseñando un sistema de generación de nómina para un cliente.

La organización a la que nos dirigimos tiene una jerarquía de la siguiente manera: Empresa - > Cluster - > Unidad de Negocio (BU) - > Departamento - > Empleado

El salario de un empleado se compone de varios componentes salariales. Cada componente de salario tiene 3 reglas asociadas, una Regla de cálculo (Calcular componente como% de otro componente, o% de un número fijo o un número fijo), una Regla de elegibilidad (si un Empleado / Departamento es elegible para un componente) y una regla de restricción que limita el máximo y el mínimo de un componente.

**** Estas reglas son editables y pueden ser editadas por un usuario final **. Además, estas reglas se heredan de arriba hacia abajo, pero si se definen en un nivel inferior, la regla de nivel inferior tiene prioridad. **

Tenemos una base de datos que tiene tablas de Asistencia, Hojas, Bonificaciones y se supone que estas reglas también interactúan con estas tablas.

El cliente generará nómina para varios clientes, cada uno de los cuales aloja una instancia de base de datos separada. Cada uno puede tener una interpretación diferente de cada componente y pueden tener componentes diferentes.

Solo buscamos ser compatible con SQL Server, y la generación de nóminas será una actividad sin conexión.

Estamos divididos sobre dónde colocar la lógica que utiliza estas reglas para generar los componentes fiscales individuales (que incluirán deducciones fiscales, deducciones fiscales, deducciones, etc.).

Algunas personas abogan por SP mágicos que tomarán la identificación de un empleado y generarán una nómina para ese mes. Otros quieren que la lógica se divida en componentes separados que obtendrán los datos dependientes para un empleado en la capa de aplicación y calcularán estos componentes allí.

El orden de nuestras prioridades son: 1. La capacidad de adaptar cambios a nuevos clientes rápidamente. 2. Mantenibilidad a largo plazo. 3. Rendimiento

1 y 2 superan a 3 aquí por un factor importante, ya que esta será una actividad fuera de línea.

La capacidad de mantenimiento y la personalización rápida son muy importantes, estaremos implementando la aplicación para diferentes clientes. El cliente A puede tener una regla de componente de salario como ((0.3 * Básico) + 800) y el Cliente B como (0.2 * Básico) + (0.1 * Bono de Asistencia)

Los SP causarán un desastre aquí, ya que las reglas sugeridas anteriormente serán especificadas por el usuario final y deberán ser personalizables a través de una interfaz de usuario web. Tendremos que analizar las fórmulas de SQL. ¿Qué tan difícil o fácil será? ¿Qué ventaja tendrá hacer esto en la capa de aplicación (C # .Net) sobre el uso de SP?

La publicación original está aquí: Sugerencias de diseño, sistema de nómina ... repost ... pero ninguna de las preguntas se respondió correctamente.

Las sugerencias y punteros a la arquitectura de los sistemas existentes serán muy útiles. ... y sí, estamos usando LINQ to SQL en otras partes del sistema.

Saludos cordiales, Ashish Sharma

¿Fue útil?

Solución

Siempre trato de evitar poner lógica de negocios en la capa DB. Es más difícil escribir, depurar y mantener. Además, el DB es generalmente la capa más cara para escalar. Si terminas necesitando reforzar tu sistema para admitir a más usuarios, es relativamente barato y fácil agregar nuevos servidores web a un sistema, pero agregar instancias de base de datos es costoso ya que cada base de datos requiere una licencia y soporte adicional.

Otros consejos

Si almacena las fórmulas como, por ejemplo, JEP (para java), no es un gran problema. Simplemente mantenga la fórmula completa como una cadena: es decir, " pay = ((0.3 * Basic) + 800) y luego analícela en un árbol.

Puede ver parte de la documentación de jep para obtener información y tomar las ideas a partir de ahí. No debería ser problemático implementar implementadores simples para las fórmulas que ha publicado aquí.

Mi sugestión:

  • Manténgalo en una cadena, en la base de datos
  • Cree una pequeña biblioteca para la evaluación y el analizador.
  • Analízalo en un árbol binario. (como '+' apunta a 800 y también apunta a ''), entonces '' apunta a 'básico' y a '0.3'
  • Después de eso solo necesitas una función recursiva simple para resolverlo.

Si la complejidad de estas fórmulas no es mucho, puede hacerlo en el lado que desee, ya que no le llevará mucho tiempo procesarlo.

Si está buscando una solución .Net que evalúe la fórmula representada en cadenas, aquí hay un excelente artículo que detalla el uso de ANTLR and C # para crear un motor de cálculo. Hay un intérprete de fórmulas completamente funcional que analiza cadenas, construye un AST y luego evalúa la expresión. Además, el motor de cálculo se implementa mediante el patrón de visitante, por lo que si tiene funciones que desea realizar, como búsquedas en bases de datos, puede incorporar fácilmente la personalización en su solución.

¿Has oído hablar de Reflexión o delegados?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top