reportData.service.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { Injectable, Inject } from '@angular/core';
  2. import { BehaviorSubject } from 'rxjs/BehaviorSubject';
  3. import { ReportItem } from './reportItem.service';
  4. import { WindowService } from './window.service';
  5. import { Subject } from 'rxjs/Subject';
  6. export type Report = {
  7. id?: number;
  8. date: Date;
  9. approved: boolean;
  10. description: string;
  11. items: ReportItem[];
  12. amount?: number;
  13. };
  14. const psReportsKey = 'ps-reports';
  15. @Injectable()
  16. export class ReportDataService {
  17. dataChange = new BehaviorSubject<Report[]>([]);
  18. reportCreated: Subject<Report> = new Subject();
  19. reportApprovedReject: Subject<{ report: Report, user: string }> = new Subject();
  20. constructor(@Inject(WindowService) private _window: Window) {
  21. const stringfiedReports = _window.localStorage.getItem(psReportsKey);
  22. if (stringfiedReports) {
  23. this.dataChange.next(JSON.parse(stringfiedReports));
  24. }
  25. }
  26. get data(): Report[] {
  27. return this.dataChange.value;
  28. }
  29. getReport(reportId: number): Promise<Report> {
  30. return this.data.some(r => r.id === reportId) ?
  31. Promise.resolve(this.data.find(r => r.id === reportId)) :
  32. Promise.resolve(undefined);
  33. }
  34. add(report: Report) {
  35. const newReport = {
  36. ...report,
  37. id: this.data.reduce((biggestId, rep) => biggestId > rep.id ? biggestId : rep.id, 0) + 1,
  38. amount: report.items.reduce((sum, item) => sum + item.amount, 0)
  39. };
  40. const newData = [...this.data, newReport];
  41. this.updateData(newData);
  42. this.reportCreated.next(newReport);
  43. }
  44. save(report: Report) {
  45. const reportIndex = this.data.findIndex(r => r.id === report.id);
  46. const newData = [...this.data];
  47. newData.splice(reportIndex, 1, report);
  48. this.updateData(newData);
  49. }
  50. toggleApproval(report: Report, user: string) {
  51. const reportIndex = this.data.findIndex(r => r.id === report.id);
  52. const newData = [...this.data];
  53. newData.splice(reportIndex, 1, report);
  54. this.updateData(newData);
  55. this.reportApprovedReject.next({ report, user });
  56. }
  57. private updateData(reports: Report[]) {
  58. this._window.localStorage.setItem(psReportsKey, JSON.stringify(reports));
  59. this.dataChange.next(reports);
  60. }
  61. }