Progettazione del sistema di gestione stipendi, Logica aziendale in SP o Application Layer (C # .Net), Manutenibilità - Repost

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

Domanda

Stiamo progettando un sistema di generazione dei salari per un cliente.

L'organizzazione a cui ci stiamo rivolgendo ha una gerarchia come segue: Azienda - > Cluster - > Business Unit (BU) - > Dipartimento - > Impiegato

Lo stipendio per un dipendente è costituito da varie componenti salariali. Ad ogni componente salariale sono associate 3 regole, una Regola di calcolo (Calcola componente come% di un altro componente, o% di un numero fisso o un numero fisso), una Regola di ammissibilità (se un dipendente / dipartimento è idoneo per un componente) e una regola di vincolo che limita il massimo e il minimo di un componente.

**** Queste regole sono modificabili e possono essere modificate da un utente finale **. Anche queste regole vengono ereditate dall'alto verso il basso, ma se definite a un livello inferiore, la regola di livello inferiore ha la precedenza. **

Abbiamo un database con tabelle di partecipazione, foglie, bonus e anche queste regole dovrebbero interagire con queste tabelle.

Il client genererà buste paga per più client, ciascuno dei quali ospita un'istanza di database separata. Ciascuno di essi può avere un'interpretazione diversa di ciascun componente e può avere componenti diversi.

Stiamo solo cercando di supportare SQL Server e la generazione di buste paga sarà un'attività offline.

Siamo divisi su dove mettere la logica che utilizza queste regole per generare le singole componenti fiscali (che includeranno detrazioni fiscali, cancellazioni fiscali, indennità, ecc.)

Alcune persone stanno sostenendo SP magici che prenderanno un ID dipendente e genereranno un libro paga per quel mese. Altri vogliono che la logica sia suddivisa in componenti separati che ottengano i dati dipendenti per un dipendente nel livello dell'applicazione e calcolino questi componenti lì.

L'ordine delle nostre priorità sono: 1. La capacità di adattare rapidamente le modifiche ai nuovi clienti 2. Manutenibilità a lungo termine 3. Prestazioni

1 e 2 superano di gran lunga 3 in questo caso in quanto si tratterà di un'attività offline.

La manutenibilità e la rapida personalizzazione sono molto importanti, distribuiremo l'applicazione per clienti diversi. Il cliente A può avere una regola del componente salariale come ((0.3 * Base) + 800) e il cliente B come (0,2 * di base) + (0,1 * bonus di partecipazione)

Gli SP causeranno un disastro qui, poiché le regole suggerite sopra saranno specificate dall'utente finale e dovranno essere personalizzabili tramite un'interfaccia utente web. Dovremo analizzare le formule da SQL. Quanto sarà difficile o facile? Quale vantaggio comporterebbe questo nell'Application Layer (C # .Net) rispetto all'utilizzo di SP?

Il post originale è qui: Suggerimenti per la progettazione, sistema di gestione stipendi ... ripubblicare ... ma nessuna delle domande ha ricevuto una risposta adeguata.

Suggerimenti e suggerimenti per l'architettura dei sistemi esistenti saranno molto utili. ... e sì, stiamo usando LINQ to SQL altrove nel sistema.

Cordiali saluti, Ashish Sharma

È stato utile?

Soluzione

Cerco sempre di evitare di mettere la logica di business nel livello DB. È più difficile scrivere, eseguire il debug e mantenere. Inoltre, il DB è generalmente il livello più costoso da ridimensionare. Se alla fine hai bisogno di rinforzare il tuo sistema per supportare più utenti, è relativamente economico e facile aggiungere nuovi server web a un sistema, ma l'aggiunta di istanze di DB diventa costosa poiché ogni DB richiede una licenza e supporto aggiuntivo.

Altri suggerimenti

Se memorizzi le formule come ad esempio JEP (per java) non è un grosso problema. Tieni semplicemente la formula completa come stringa: vale a dire: " pay = ((0.3 * Basic) + 800) e poi analizzala in un albero.

Puoi vedere parte della documentazione jep per informazioni e prendere le idee da lì. Non dovrebbe essere 2 problematico implementare semplici solutori per le formule che hai pubblicato qui.

Mia sugestion:

  • Conservalo in una stringa, nel database
  • Crea una piccola libreria per eval e parser.
  • Analizzalo in un albero binario. (come "+" punta a 800 e punta anche a "") quindi "" indica "base" e "0,3"
  • Dopo di che hai solo bisogno di una semplice funzione ricorsiva per risolverlo.

Se la complessità di queste formule non è molto, puoi farlo in qualsiasi parte tu voglia in quanto non ti ci vorrà molto tempo per elaborarla.

Se stai cercando una soluzione .Net che valuterà la formula rappresentata nelle stringhe, ecco un eccellente articolo che dettaglia usando ANTLR e C # per creare un motore di calcolo. Esiste un interprete di formula completamente funzionale che analizza le stringhe, crea un AST, quindi valuta l'espressione. Inoltre, il motore di calcolo viene implementato utilizzando il modello Visitatore, quindi se si dispone di funzioni che si desidera eseguire, come le ricerche nel database, è possibile incorporare facilmente la personalizzazione nella propria soluzione.

Hai mai sentito parlare di Reflection o delegati?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top