- A project can have multiple invoices
- One invoice can have multiple items
- Items may include hours of work at a certain rate or work-related expenses
- Invoices have due date
- Over each cost item one of three tax rates, incl. 0%, is added
- The entire invoice can have one relative discount or fee
- Fees and discounts happen before tax
- I can see the list of projects
- I can see the list of invoices for each project
- I can see the price of each cost item
- I can see the invoice subtotal and total price
- I can print the invoice
- Cover components/services/helpers by unit tests
- Move all "magic" strings and variables under shared constants
- Add lazy loaders and skeletons for better UX, as real data fetching may take some time
- Add infinite scrolling with virtualized list for the list of projects. (Real data is much bigger, so it's not a good decision to load all data in one request and render a full list)
- Add i18n for text and currencies
- Add support for caching API callback results. Some libraries (like React Query) make it possible
- This application has no interactivity. So it's better to use SSR with its pros. It's possible to implement with Next.js
Runs the app in the development mode.
Open http://localhost:3000 to view it in the browser.
The page will reload if you make edits.
You will also see any lint errors in the console.