{"id":13594433,"url":"https://github.com/KyleMcMaster/payroll-processor","last_synced_at":"2025-04-09T07:32:20.227Z","repository":{"id":38993075,"uuid":"193154578","full_name":"KyleMcMaster/payroll-processor","owner":"KyleMcMaster","description":"A smorgasbord of modern .NET tech written with functional and asynchronous patterns","archived":true,"fork":false,"pushed_at":"2024-08-21T15:29:56.000Z","size":3493,"stargazers_count":120,"open_issues_count":11,"forks_count":23,"subscribers_count":8,"default_branch":"main","last_synced_at":"2024-08-22T17:32:32.586Z","etag":null,"topics":["akita","angular","azure","azure-functions","azure-storage","bootstrap","clean-architecture","cosmosdb","dotnet-core","functional-programming","scss","typescript","vertical-slice-architecture"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KyleMcMaster.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["KyleMcMaster"]}},"created_at":"2019-06-21T20:08:51.000Z","updated_at":"2024-08-21T15:31:13.000Z","dependencies_parsed_at":"2023-10-04T09:18:23.937Z","dependency_job_id":"61a8bbe7-3c75-4132-b2e9-ea9968acceab","html_url":"https://github.com/KyleMcMaster/payroll-processor","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KyleMcMaster%2Fpayroll-processor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KyleMcMaster%2Fpayroll-processor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KyleMcMaster%2Fpayroll-processor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KyleMcMaster%2Fpayroll-processor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KyleMcMaster","download_url":"https://codeload.github.com/KyleMcMaster/payroll-processor/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223375334,"owners_count":17135353,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["akita","angular","azure","azure-functions","azure-storage","bootstrap","clean-architecture","cosmosdb","dotnet-core","functional-programming","scss","typescript","vertical-slice-architecture"],"created_at":"2024-08-01T16:01:33.450Z","updated_at":"2024-11-06T16:31:23.403Z","avatar_url":"https://github.com/KyleMcMaster.png","language":"C#","readme":"# Payroll Processor\n\nSample HRIS application where a list of employees and their payroll information would be available in report format.\n\n\u003cp\u003e\n  \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/graphs/contributors\" alt=\"Contributors\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/contributors/KyleMcMaster/payroll-processor\" /\u003e\u003c/a\u003e\n\n  \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/stargazers\" alt=\"Stars\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/KyleMcMaster/payroll-processor\" /\u003e\u003c/a\u003e\n\n  \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/issues\" alt=\"Issues\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/issues/KyleMcMaster/payroll-processor\" /\u003e\u003c/a\u003e\n\n  \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/blob/master/LICENSE\" alt=\"License\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/KyleMcMaster/payroll-processor\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n![Twitter Follow](https://img.shields.io/twitter/follow/kylemcmaster?style=social)\n![Twitter Follow](https://img.shields.io/twitter/follow/seangwright?style=social)\n\n\u003cimg src=\"https://shields.io/endpoint?url=https://prod-nimble-metrics-appservice.azurewebsites.net/api/badge/kylemcmaster/payroll-processor\"/\u003e\n\n## Status of this Repository\n\nThis project was started as an exploration into various technologies and approaches that the contributors had been meaning to try but weren't able to exercise in their employer's production code. The effort and success this project achieved was a labor of love and will forever hold fond memories in my (@KyleMcMaster's) heart as a catalyst for learning and growth that had an impactful experience on my career. Since 2022 or so, development on this project has become stale and the primary contributors have all taken interest in other technologies and problems that aren't represented within the space of this sample application. You can follow my latest development efforts over at [FShopOnWeb](https://github.com/NitroDevs/FShopOnWeb) I hope this code can continue to be a reference for anyone interested in the patterns and principles applied here.\n\n## Build status\n\n### Api and Functions\n\n![dotnet core - build \u0026 test](https://github.com/KyleMcMaster/payroll-processor/workflows/dotnet%20core%20-%20build%20\u0026%20test/badge.svg)\n\n### Client\n\n![.github/workflows/policy-npm.yml](https://github.com/KyleMcMaster/payroll-processor/workflows/client%20-%20build%20\u0026%20test/badge.svg)\n[![Styled with Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://prettier.io)\n\n## Motivation\n\nThis project was created to explore a variety of technologies, patterns, and frameworks in a sandbox style environment.\nThe fictional domain of the application is designed be restrictive enough to mimic a real world application while\nalso allowing creative and technical freedom for the developers involved.\n\nAreas of interest:\n\n- Functional Programming\n- Automated Tests\n- Basics of Angular, TypeScript, Rxjs, and Bootstrap\n- Synergy that exists between Azure Functions and .NET Core Web APIs\n- Event Sourcing and CQRS\n- Having fun!\n\n## Roadmap\n\n### MVP\n\n- [x] Employee and Payroll CRUD functionality representing a simple workflow for the domain\n- [x] Administration screen for seeding data\n\n### Future Enhancements\n\n- Analytics like payroll totals by department, risk, and time\n- Integrate Cosmos Db change feed\n- Handle poison queue messages\n- Add helpful notifications from SignalR messages\n- Configure Tye app orchestrations\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/KyleMcMaster\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/11415127?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKyle McMaster\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#design-KyleMcMaster\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/commits?author=KyleMcMaster\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/commits?author=KyleMcMaster\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.seangwright.me\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/1382768?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSean G. Wright\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#design-seangwright\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/commits?author=seangwright\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/pulls?q=is%3Apr+reviewed-by%3Aseangwright\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://conklin.dev\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/2951907?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJustin Conklin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/pulls?q=is%3Apr+reviewed-by%3Aeyev\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"https://github.com/KyleMcMaster/payroll-processor/commits?author=eyev\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n## Star History ⭐\n\n\u003ca href=\"https://star-history.com/#kylemcmaster/payroll-processor\u0026Date\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=kylemcmaster/payroll-processor\u0026type=Date\u0026theme=dark\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=kylemcmaster/payroll-processor\u0026type=Date\" /\u003e\n    \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=kylemcmaster/payroll-processor\u0026type=Date\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n\n## Project Structure\n\napi/ - .NET API and Azure Functions backend\n\nclient/ - Main view of the application built with Angular and Boostrap\n\nvue-client/ - Alternate view of the Admin page built with Vue3 and Tailwind CSS\n\n## References\n\n[Akita-Demo](https://github.com/seangwright/akita-demo)\n\n## Build / Run\n\nThis project uses VS Code [Multi-root Workspaces](https://code.visualstudio.com/docs/editor/multi-root-workspaces).\nFor the best developer experience, open the workspace directly with VS Code (`code payroll-processor.code-workspace`)\nor open the root of the repository in VS Code (`code .`) and when prompted, open the workspace.\n\n### API\n\nThe API solution (`PayrollProcessor.sln`) is set up as the default solution\nfor [Omnisharp](https://github.com/OmniSharp/omnisharp-vscode), and is loaded as soon as the\nVS Code workspace is opened.\n\nAll of the backend .NET code is found in the `/api` folder.\n\nThis solution contains 2 applications `PayrollProcessor.Functions.Api` and `PayrollProcess.Web.Api`\nThis solution also contains multiple shared libraries and test projects.\n\nThere are VS Code tasks (Clean, Build, Test) at the solution and the individual application project level.\n\n#### PayrollProcess.Web.Api\n\nCurrently there are no application secrets or app settings to customize for the Web API.\nHowever, settings for the application can be found in `appsettings.Development.json` and `appsettings.json`.\n\nTo run the Web API run the following launch configuration (Debug: Select and Start Debugging)\n\n- API: Run and Attach (Debug)\n\nThe application will start and listen for requests on [http://localhost:5000](http://localhost:5000).\n\n#### PayrollProcessor.Functions.Api\n\n- Ensure the [Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions)\n  VS Code extension is installed.\n\n- Run \"Azure Functions: Install or Update Azure Functions Core Tools\" from the command palette.\n\n- [Update Powershell security policy](https://github.com/Azure/azure-functions-core-tools/issues/1821#issuecomment-586925919)\n\n- Start the Azure Storage Emulator and Azure Cosmos Db Emulator (see: Data Storage below)\n\n- Copy\n\n  `api/PayrollProcessor.Functions.Api/local.settings.json.sample`\n\n  to\n\n  `api/PayrollProcessor.Functions.Api/local.settings.json`\n\n- F5 or run from the VS Code Debug drop down \"Function: Run \u0026 Attach (Debug)\"\n\n- Optional: Run any of the following tasks (Task: Run Task)\n\n  - Function: Test\n  - Function: Build (Debug)\n\n- Optional: Run any of the following launch configurations (Debug: Select and Start Debugging)\n\n  - Function: Run \u0026 Attach (Debug)\n\nThe application will listen for requests on [http://localhost:7071](http://localhost:7071).\n\n### Angular Client\n\n- Copy\n\n  `client/src/environments/environment.local.sample.ts`\n\n  to\n\n  `client/src/environments/environment.local.ts`\n\n- Run the \"Client: Serve\" VS Code task (this will install packages and start serving the app)\n\n## Data Storage\n\nThe project currently stores data in Azure Table Storage, which can be simulated locally using the [Azurite](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio).\n\nThe locally stored data can be viewed using the [Azure Storage Explorer](https://azure.microsoft.com/en-us/features/storage-explorer/).\n\nThis project also uses the [Azure Cosmos Db Emulator](https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator)\nwhich can be downloaded at [https://aka.ms/cosmosdb-emulator](https://aka.ms/cosmosdb-emulator)\n\n\u003e Note: There is a [Linux/MacOS emulator](https://github.com/zeit/cosmosdb-server) available as well\n\n### Data Initialization / Seeding\n\n#### Create Collections / Queues\n\nFor performing any of the following operations ensure the following:\n\n- The Azure Storage Emulator \u0026 Azure Cosmos DB Emulator are running\n- The functions API project (see: `PayrollProcessor.Functions.Api` above) is running\n\nTo initialize the data storage structure (a few tables and a queue):\n\n- Make a POST request to `http://localhost:7071/api/resources/`\n- Optional: Use `Create Resources` request in `/docs/PayrollProcessor.postman_collection.json` [Postman](https://www.postman.com/) collection\n\nThe creation process will skip any resources that already exist.\n\n#### Create Seed Data\n\nThere is also an endpoint to initialize randomly generated data in the data storage:\n\n- Make a POST request to `http://localhost:7071/api/resources/data`\n  - There are 2 optional query parameters\n    - `employeesCount`: Sets the number of employees created by the request\n    - `payrollsMaxCount`: Sets the maximum number of payrolls created for each employee (random value 1-max)\n- Optional: Use `Create Seed Data` request in `/docs/PayrollProcessor.postman_collection.json` [Postman](https://www.postman.com/) collection\n\n#### Reset Collections / Queues and Data\n\nFinally, there's an endpoint to clear/reset all the data currently in the app.\nThis can be useful if you are changing schemas and don't want to write migrations.\n\n- Make a DELETE request to `http://localhost:7071/api/resources`\n- Optional: Use `Delete Resources` request in `/docs/PayrollProcessor.postman_collection.json` [Postman](https://www.postman.com/) collection\n","funding_links":["https://github.com/sponsors/KyleMcMaster"],"categories":["C#","C\\#"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKyleMcMaster%2Fpayroll-processor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKyleMcMaster%2Fpayroll-processor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKyleMcMaster%2Fpayroll-processor/lists"}