reportItem.service.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. return 'A food item with a value greater than $50 must have a receipt';
  30. }
  31. const validateDate = (minDate: Date, maxDate: Date) => (item: ReportItem): string => {
  32. return +item.date >= +minDate && +item.date <= +maxDate ? '' : 'The date is invalid';
  33. };
  34. @Injectable()
  35. export class ReportItemService {
  36. private validateDate: (item: ReportItem) => string;
  37. constructor() {
  38. const today = new Date();
  39. const maxDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
  40. const minDate = new Date(maxDate);
  41. minDate.setMonth(-3);
  42. this.validateDate = validateDate(minDate, maxDate);
  43. }
  44. isValid(item: ReportItem): string {
  45. switch (item.type) {
  46. case ReportItemType.food: {
  47. const validatedFood = validateFoodItem(item);
  48. if (validatedFood) {
  49. return validatedFood;
  50. }
  51. return this.validateDate(item);
  52. }
  53. case ReportItemType.training:
  54. return validateTraining(item);
  55. case ReportItemType.transport:
  56. case ReportItemType.travel: {
  57. const validatedReceipt = validateReceipt(item);
  58. if (validatedReceipt) {
  59. return validatedReceipt;
  60. }
  61. return this.validateDate(item);
  62. }
  63. case ReportItemType.unselected:
  64. default:
  65. return 'The item type is not supported';
  66. }
  67. }
  68. }