Payroll Design System, lógica de negócios em SPs ou camada de aplicativo (C # .Net), Maintainability - Repost

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

Pergunta

Estamos projetando um sistema de geração de folha de pagamento para um cliente.

A organização nós estamos alvejando tem uma hierarquia como segue: Empresa -> Cluster -> Unidade de Negócios (UN) -> Departamento -> Employee

O salário para um empregado é composto de vários componentes salariais. Cada componente salário tem 3 regras associadas com ele, uma regra de cálculo (componente Calcular como% de outro componente, ou% de um número fixo ou um número fixo), uma regra de elegibilidade (se um empregado / Dept é elegível para um componente) e um Regra de restrição que limita tha máxima e mínima de um componente.

**** Estas regras são editáveis ??e podem ser editados por um usuário final usuário **. Também estas regras são herdadas de cima para baixo, mas se definido em um nível inferior, a regra de nível mais baixo tem precedência. **

Temos um banco de dados que tem de Presença, folhas, bônus mesas e essas regras também são supostamente para interagir com essas tabelas.

O cliente estará gerando folha de pagamento para vários clientes cada hospedando uma instância banco de dados separado. Eles podem, cada um tem uma interpretação diferente de cada componente e pode ter componentes diferentes.

Estamos apenas olhando para apoiar SQL Server, e geração de folha de pagamento será uma atividade off-line.

Estamos divididos sobre onde colocar a lógica que usa essas regras para gerar os componentes fiscais individuais (que incluem deduções fiscais, imposto write-offs, subsídios, etc).

Algumas pessoas estão defendendo SPs mágicas que terá um empregado Id e gerar uma folha de pagamento para esse mês. Outros querem a lógica a ser dividido em componentes separados que irá obter os dados dependentes para um empregado na camada de aplicação e calcular esses componentes lá.

A ordem de nossas prioridades são: 1. A capacidade de se adaptar as mudanças para novos clientes rapidamente 2. Longo prazo de manutenção 3. Desempenho

1 e 2 superam 3 aqui por um fator grande como isso vai ser uma atividade off-line.

Manutenção e rápida Customizability são muito importantes, estaremos implementando o aplicativo para diferentes clientes. Cliente Um pode ter uma regra Componente salário como ((0,3 * Basic) + 800) e cliente B como (0,2 * básica) + (0,1 * Atendance Bonus)

irá SPs causa uma confusão aqui, como as regras sugeridas acima será especificado pelo usuário final e terá de ser personalizável através de uma interface web. Vamos ter de analisar as fórmulas de SQL. Quão difícil ou fácil será? Que vantagem vai fazer isso na camada de aplicação (C # .net) tem sobre o uso de SPs?

O post original está aqui: projeto Sugestões, Folha de Pagamento Sistema ... repost ... mas nenhuma das questões foram devidamente respondidas.

Sugestões e ponteiros para arquitetura de sistemas existentes vai ser muito útil. ... e sim, estamos usando LINQ to SQL em outras partes do sistema.

Atenciosamente, Ashish Sharma

Foi útil?

Solução

Eu sempre tento coíbe de colocar lógica de negócios na camada DB. É mais difícil de escrever, depurar e manter. Além disso, o banco de dados é geralmente a camada mais caro para escala. Se você acabar precisando para reforçar o seu sistema para suportar mais usuários é relativamente barato e fácil de adicionar novos servidores web a um sistema, mas acrescentando instâncias DB torna-se caro como cada DB requer uma licença e suporte adicional.

Outras dicas

Se você armazenar as fórmulas como por exemplo JEP (para Java) não é um grande problema. Basta manter a fórmula integral como uma string: ou seja:. "Pay = ((0,3 * Basic) + 800) e, em seguida, analisá-lo em uma árvore

Você pode ver alguns de documentação jep para info, e tomar as ideias de lá. não deve ser 2 problemático para implementar solucionadores simples para as fórmulas que você postou aqui.

A minha sugestão:

  • Mantenha-o em uma corda, na base de dados
  • Faça uma pequena biblioteca para o eval e analisador.
  • analisá-lo em uma árvore binária. (Como '+' aponta para 800 e também aponta para ''), então o '' aponta para 'básico' e a '0,3'
  • Depois que você só precisa de uma função recursiva simples para resolvê-lo.

Se a complexidade dessas fórmulas são não muito você pode fazer isso em qualquer lado que você quer, uma vez que não vai levá-lo muito tempo para processá-lo.

Se você está procurando uma solução Net que irá avaliar fórmula representada em cordas, aqui um é excelente artigo que detalhes usando ANTLR e C # para criar um mecanismo de cálculo. Há um intérprete fórmula totalmente funcional que analisa cordas, constrói uma AST, em seguida, avalia a expressão. Além disso, o mecanismo de cálculo é implementado usando o padrão Visitor, por isso, se você tem funções que você deseja realizar, como pesquisas de banco de dados pode facilmente incorporar a personalização em sua solução.

Você já ouviu falar de reflexão ou delegados?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top