reportItem.service.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { Injectable } from '@angular/core';
  2. export enum ReportItemType {
  3. food = 'Food',
  4. travel = 'Travel',
  5. training = 'Training',
  6. transport = 'Transport',
  7. unselected = ''
  8. }
  9. export type ReportItem = {
  10. description: string;
  11. amount: number;
  12. hasReceipt: boolean;
  13. type: ReportItemType;
  14. date: Date;
  15. };
  16. function validateFoodItem(item: ReportItem): string {
  17. if (item.amount >= 50 && !item.hasReceipt) {
  18. return 'A food item with a value greater than $50 must have a receipt';
  19. }
  20. return '';
  21. }
  22. function validateReceipt(item: ReportItem): string {
  23. return item.hasReceipt ? '' : 'The item must have a receipt';
  24. }
  25. function validateTraining(item: ReportItem): string {
  26. if (item.amount < 50 && !item.hasReceipt) {
  27. return '';
  28. }
  29. }
  30. const validateDate = (minDate: Date, maxDate: Date) => (item): string => {
  31. return +item.date >= +minDate && +item.date <= +maxDate ? '' : 'The date is invalid';
  32. };
  33. @Injectable()
  34. export class ReportItemService {
  35. private validateDate: (item: ReportItem) => string;
  36. constructor() {
  37. const today = new Date();
  38. const maxDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
  39. const minDate = new Date(maxDate);
  40. minDate.setMonth(-3);
  41. this.validateDate = validateDate(minDate, maxDate);
  42. }
  43. isValid(item: ReportItem): string {
  44. switch (item.type) {
  45. case ReportItemType.food: {
  46. const validatedFood = validateFoodItem(item);
  47. if (validatedFood) {
  48. return validatedFood;
  49. }
  50. return this.validateDate(item);
  51. }
  52. case ReportItemType.training:
  53. return validateTraining(item);
  54. case ReportItemType.transport:
  55. case ReportItemType.travel: {
  56. const validatedReceipt = validateReceipt(item);
  57. if (validatedReceipt) {
  58. return validatedReceipt;
  59. }
  60. return this.validateDate(item);
  61. }
  62. case ReportItemType.unselected:
  63. default:
  64. return 'The item type is not supported';
  65. }
  66. }
  67. }