@esolve/ng-esolve-connect 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/esm2020/lib/manufacturers/esolve-manufacturer-image-size.type.mjs +2 -0
  2. package/esm2020/lib/manufacturers/esolve-manufacturer.model.mjs +30 -13
  3. package/esm2020/lib/manufacturers/esolve-manufacturers.service.mjs +2 -2
  4. package/esm2020/lib/manufacturers/index.mjs +7 -2
  5. package/esm2020/lib/media/esolve-media.service.mjs +3 -3
  6. package/esm2020/lib/news/esolve-news-article-options.interface.mjs +1 -1
  7. package/esm2020/lib/news/esolve-news-article-record.interface.mjs +1 -1
  8. package/esm2020/lib/news/esolve-news-article.model.mjs +65 -13
  9. package/esm2020/lib/news/esolve-news.service.mjs +56 -46
  10. package/esm2020/lib/news/index.mjs +1 -3
  11. package/esm2020/lib/ranges/esolve-range.model.mjs +35 -14
  12. package/esm2020/lib/ranges/esolve-ranges.service.mjs +2 -2
  13. package/esm2020/lib/shared/assets/esolve-asset-list.type.mjs +2 -0
  14. package/esm2020/lib/shared/assets/esolve-asset-options.interface.mjs +2 -0
  15. package/esm2020/lib/shared/assets/esolve-asset-record.interface.mjs +2 -0
  16. package/esm2020/lib/shared/assets/esolve-asset.model.mjs +58 -0
  17. package/esm2020/lib/shared/assets/esolve-assets.service.mjs +93 -0
  18. package/esm2020/lib/shared/assets/index.mjs +11 -2
  19. package/esm2020/lib/stock/esolve-additional-stock-image-record.interface.mjs +2 -0
  20. package/esm2020/lib/stock/esolve-additional-stock-image.model.mjs +21 -0
  21. package/esm2020/lib/stock/esolve-media-stock-item-list.type.mjs +2 -0
  22. package/esm2020/lib/stock/esolve-media-stock-item-options.interface.mjs +2 -0
  23. package/esm2020/lib/stock/esolve-media-stock-item-record.interface.mjs +2 -0
  24. package/esm2020/lib/stock/esolve-media-stock-item.model.mjs +7 -0
  25. package/esm2020/lib/stock/esolve-stock-base-record.interface.mjs +1 -1
  26. package/esm2020/lib/stock/esolve-stock-image-collection-record.interface.mjs +3 -0
  27. package/esm2020/lib/stock/esolve-stock-image-collection.model.mjs +26 -0
  28. package/esm2020/lib/stock/esolve-stock-image-size.type.mjs +2 -0
  29. package/esm2020/lib/stock/esolve-stock-image.model.mjs +45 -0
  30. package/esm2020/lib/stock/esolve-stock-item-base.model.mjs +9 -5
  31. package/esm2020/lib/stock/esolve-stock-item-list.model.mjs +1 -1
  32. package/esm2020/lib/stock/esolve-stock-lead-times-record.interface.mjs +2 -0
  33. package/esm2020/lib/stock/esolve-stock-lead-times.model.mjs +9 -0
  34. package/esm2020/lib/stock/esolve-stock.service.mjs +77 -6
  35. package/esm2020/lib/stock/index.mjs +14 -1
  36. package/esm2020/lib/tags/esolve-tag-options.interface.mjs +2 -0
  37. package/esm2020/lib/tags/esolve-tag-phrase-match-mode.type.mjs +2 -0
  38. package/esm2020/lib/tags/esolve-tag-record.interface.mjs +1 -1
  39. package/esm2020/lib/tags/esolve-tag.model.mjs +32 -6
  40. package/esm2020/lib/tags/esolve-tags.service.mjs +76 -0
  41. package/esm2020/lib/tags/index.mjs +9 -2
  42. package/esm2020/lib/topics/esolve-topic.model.mjs +12 -6
  43. package/esm2020/lib/topics/esolve-topic.service.mjs +2 -2
  44. package/fesm2015/esolve-ng-esolve-connect.mjs +1956 -1424
  45. package/fesm2015/esolve-ng-esolve-connect.mjs.map +1 -1
  46. package/fesm2020/esolve-ng-esolve-connect.mjs +1930 -1413
  47. package/fesm2020/esolve-ng-esolve-connect.mjs.map +1 -1
  48. package/lib/manufacturers/esolve-manufacturer-image-size.type.d.ts +1 -0
  49. package/lib/manufacturers/esolve-manufacturer.model.d.ts +4 -3
  50. package/lib/manufacturers/index.d.ts +2 -1
  51. package/lib/news/esolve-news-article-options.interface.d.ts +1 -0
  52. package/lib/news/esolve-news-article-record.interface.d.ts +8 -4
  53. package/lib/news/esolve-news-article.model.d.ts +13 -2
  54. package/lib/news/esolve-news.service.d.ts +2 -1
  55. package/lib/news/index.d.ts +0 -2
  56. package/lib/ranges/esolve-range.model.d.ts +2 -2
  57. package/lib/shared/assets/esolve-asset-list.type.d.ts +3 -0
  58. package/lib/shared/assets/esolve-asset-options.interface.d.ts +12 -0
  59. package/lib/shared/assets/esolve-asset-record.interface.d.ts +26 -0
  60. package/lib/shared/assets/esolve-asset.model.d.ts +28 -0
  61. package/lib/shared/assets/esolve-assets.service.d.ts +19 -0
  62. package/lib/shared/assets/index.d.ts +6 -1
  63. package/lib/stock/esolve-additional-stock-image-record.interface.d.ts +8 -0
  64. package/lib/stock/esolve-additional-stock-image.model.d.ts +10 -0
  65. package/lib/stock/esolve-media-stock-item-list.type.d.ts +7 -0
  66. package/lib/stock/esolve-media-stock-item-options.interface.d.ts +10 -0
  67. package/lib/stock/esolve-media-stock-item-record.interface.d.ts +4 -0
  68. package/lib/stock/esolve-media-stock-item.model.d.ts +6 -0
  69. package/lib/stock/esolve-stock-base-record.interface.d.ts +2 -0
  70. package/lib/stock/esolve-stock-image-collection-record.interface.d.ts +6 -0
  71. package/lib/stock/esolve-stock-image-collection.model.d.ts +9 -0
  72. package/lib/stock/esolve-stock-image-size.type.d.ts +1 -0
  73. package/lib/stock/esolve-stock-image.model.d.ts +26 -0
  74. package/lib/stock/esolve-stock-item-base.model.d.ts +7 -1
  75. package/lib/stock/esolve-stock-lead-times-record.interface.d.ts +4 -0
  76. package/lib/stock/esolve-stock-lead-times.model.d.ts +6 -0
  77. package/lib/stock/esolve-stock.service.d.ts +21 -0
  78. package/lib/stock/index.d.ts +12 -0
  79. package/lib/tags/esolve-tag-options.interface.d.ts +6 -0
  80. package/lib/tags/esolve-tag-phrase-match-mode.type.d.ts +1 -0
  81. package/lib/tags/esolve-tag-record.interface.d.ts +1 -0
  82. package/lib/tags/esolve-tag.model.d.ts +14 -3
  83. package/lib/tags/esolve-tags.service.d.ts +22 -0
  84. package/lib/tags/index.d.ts +4 -1
  85. package/lib/topics/esolve-topic.model.d.ts +1 -1
  86. package/package.json +1 -1
  87. package/esm2020/lib/news/esolve-news-manufacturer-record.interface.mjs +0 -2
  88. package/esm2020/lib/news/esolve-news-range-record.interface.mjs +0 -2
  89. package/lib/news/esolve-news-manufacturer-record.interface.d.ts +0 -8
  90. package/lib/news/esolve-news-range-record.interface.d.ts +0 -9
@@ -7,7 +7,7 @@ import * as i1 from 'ngx-cookie-service';
7
7
  import { CookieService } from 'ngx-cookie-service';
8
8
  import { BehaviorSubject, throwError, of, iif } from 'rxjs';
9
9
  import * as i1$1 from '@angular/platform-browser';
10
- import { map, tap, catchError, switchMap } from 'rxjs/operators';
10
+ import { map, catchError, tap, switchMap } from 'rxjs/operators';
11
11
 
12
12
  const ESOLVE_CONNECT_CONFIG = new InjectionToken('esolve.connect.config');
13
13
 
@@ -682,162 +682,167 @@ class EsolveLinkedAsset {
682
682
  }
683
683
  }
684
684
 
685
- class EsolveAuthService {
686
- constructor(config, http, session, errorHandler, cookieService) {
687
- this.config = config;
688
- this.http = http;
689
- this.session = session;
690
- this.errorHandler = errorHandler;
691
- this.cookieService = cookieService;
692
- }
693
- getAccessToken(email, password, anonymous = false) {
694
- let params = new HttpParams();
695
- if (anonymous) {
696
- params = params.set('anonymous', true);
685
+ class EsolveCategoryTreeItem {
686
+ constructor(type, esolve_id, parent_id, description, sef_description, short_description, sort_priority, active, display_only, image_name, seo_title, seo_keywords, seo_description, children) {
687
+ this.type = type;
688
+ this.esolve_id = esolve_id;
689
+ this.parent_id = parent_id;
690
+ this.description = description;
691
+ this.sef_description = sef_description;
692
+ this.short_description = short_description;
693
+ this.sort_priority = sort_priority;
694
+ this.active = active;
695
+ this.display_only = display_only;
696
+ this.image_name = image_name;
697
+ this.id = '';
698
+ this.image_path = '';
699
+ if (this.type === 'category') {
700
+ this.id = `<<CAT>>${this.esolve_id}`;
701
+ if (children != null) {
702
+ this.children = children;
703
+ }
704
+ this.image_path = '/images/categories/';
697
705
  }
698
- if (email !== '') {
699
- params = params.set('email', email);
706
+ else {
707
+ this.id = `<<SUB>>${this.esolve_id}`;
708
+ this.image_path = '/images/subcategories/';
700
709
  }
701
- if (password !== '') {
702
- params = params.set('password', password);
710
+ if (seo_title.trim() === '') {
711
+ seo_title = this.description;
703
712
  }
704
- return this.http
705
- .get(`${this.config.api_url}/get-access-token.php`, {
706
- params,
707
- headers: new HttpHeaders({
708
- 'Accept-Language': '*',
709
- }),
710
- })
711
- .pipe(tap((responseData) => {
712
- if ((responseData.type === 'error') ||
713
- (responseData.type === 'exception')) {
714
- throw responseData;
715
- }
716
- }), catchError(this.handleError), tap((responseData) => {
717
- this.handleAuthentication(responseData.additional_data);
718
- }));
713
+ this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
719
714
  }
720
- autoLogin() {
721
- this.session.restore(this.handleExpiration(), () => {
722
- this.getAccessToken('', '', true).toPromise().then(() => { }, (error) => {
723
- console.error(error);
724
- });
725
- });
715
+ get small_image_src() {
716
+ return this.getImagePath('small');
726
717
  }
727
- login(email, password) {
728
- const body = {
729
- login: {
730
- email,
731
- password
732
- }
733
- };
718
+ get thumbnail_image_src() {
719
+ return this.getImagePath('thumb');
720
+ }
721
+ get tiny_image_src() {
722
+ return this.getImagePath('tiny');
723
+ }
724
+ getImagePath(image_size) {
725
+ if (this.image_name !== '') {
726
+ return `${this.image_path}${image_size}/${this.image_name}`;
727
+ }
728
+ return '';
729
+ }
730
+ }
731
+
732
+ class EsolveCategoryTreeService {
733
+ constructor(config, http) {
734
+ this.config = config;
735
+ this.http = http;
736
+ }
737
+ /**
738
+ * Retrieves the category tree from eSolve instance and coverts it to the correct format.
739
+ */
740
+ getCategoryTree() {
734
741
  return this.http
735
- .post(`${this.config.api_url}/set-login.php`, body, {
736
- headers: {
737
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
738
- },
739
- responseType: 'json',
740
- observe: 'body'
741
- })
742
+ .get(`${this.config.api_url}/get-tree.php`)
742
743
  .pipe(map((response) => {
743
- if ((response.responses === undefined) ||
744
- (response.responses.length <= 0)) {
744
+ if (response.records === undefined) {
745
745
  throw response;
746
746
  }
747
- const login_response = response.responses[0];
748
- if ((login_response.status.state !== 'success') &&
749
- (login_response.status.state !== 'warning')) {
750
- throw login_response;
751
- }
752
- for (const response_log of login_response.log) {
753
- if ((response_log.type === 'success') &&
754
- (response_log.message_code === 'login_success')) {
755
- const session_data = login_response.session_data;
756
- const user_id = +login_response.esolve_id;
757
- const location_id = +session_data.location_id;
758
- this.session.handleUpdateSession({
759
- user_id: user_id,
760
- location_id: location_id
761
- });
762
- return user_id;
763
- }
764
- }
765
- throw login_response;
766
- }), catchError((errorRes) => {
767
- return this.errorHandler.handleHttpPostError('set-login', errorRes);
747
+ return this.processTree(response.records);
768
748
  }));
769
749
  }
770
- logout() {
771
- this.session.clearTimer();
772
- this.cookieService.delete('_ws_id');
773
- return this.getAccessToken('', '', true).toPromise();
774
- }
775
- checkAccessToken(session) {
776
- session = session || this.session.currentSession;
777
- const token = session?.key ?? '';
778
- return this.http
779
- .get(`${this.config.api_url}/get-access-token.php`, {
780
- params: { key: token },
781
- headers: new HttpHeaders({
782
- 'Accept-Language': '*'
783
- }),
784
- })
785
- .pipe(map((responseData) => {
786
- if ((responseData.type === 'error') ||
787
- (responseData.type === 'exception') ||
788
- (!responseData.additional_data.key_okay)) {
789
- throw responseData;
750
+ /**
751
+ * Retrieve the details of a category tree item from the eSolve instance and
752
+ * converts it to the correct format.
753
+ *
754
+ * @param options Filter options
755
+ */
756
+ getCategoryTreeItem(options) {
757
+ let type;
758
+ let esolve_id;
759
+ let sef_description;
760
+ if (options.id) {
761
+ const categoryIdentifier = this.processID(options.id);
762
+ if (categoryIdentifier) {
763
+ type = categoryIdentifier.type;
764
+ esolve_id = categoryIdentifier.esolve_id;
790
765
  }
791
- const additional_data = responseData.additional_data;
792
- const result = {
793
- key: token,
794
- expires: additional_data.expires,
795
- expiry_time: additional_data.expiry_time,
796
- location_id: additional_data.location_id,
797
- user_id: additional_data.user_id,
798
- };
799
- return result;
800
- }))
801
- .toPromise();
802
- }
803
- // Handlers
804
- handleExpiration() {
805
- return (session) => {
806
- this.checkAccessToken(session).then((response) => {
807
- this.handleAuthentication(response);
808
- }, () => {
809
- this.logout();
810
- });
811
- };
812
- }
813
- handleAuthentication(result) {
814
- if (!result.key) {
815
- return;
816
766
  }
817
- this.session.handleSession(+result.user_id, +result.location_id, result.key, +result.expiry_time, +result.expires, this.handleExpiration());
818
- }
819
- handleError(errorRes) {
820
- const error = {
821
- message: 'An unknown error occurred',
822
- data: {},
823
- };
824
- if ((!errorRes.type) ||
825
- (!errorRes.service_type) ||
826
- (!errorRes.message)) {
827
- return throwError(error);
767
+ else if (options.type) {
768
+ type = options.type;
769
+ if (options.esolve_id) {
770
+ esolve_id = options.esolve_id;
771
+ }
772
+ else if (options.sef_description) {
773
+ sef_description = options.sef_description;
774
+ }
828
775
  }
829
- if (errorRes.message.trim() !== '') {
830
- error.message = errorRes.message;
776
+ if (type && (esolve_id || sef_description)) {
777
+ let params = new HttpParams();
778
+ params = params.set('type', type);
779
+ if (esolve_id) {
780
+ params = params.set('id', esolve_id);
781
+ }
782
+ if (sef_description) {
783
+ params = params.set('sef_description', sef_description);
784
+ }
785
+ return this.http
786
+ .get(`${this.config.api_url}/get-tree-item.php`, { params })
787
+ .pipe(map((response) => {
788
+ if ((response.records === undefined) ||
789
+ (response.records.length <= 0)) {
790
+ throw response;
791
+ }
792
+ return this.processTreeItem(response.records[0]);
793
+ }));
831
794
  }
832
- if (errorRes.additional_data) {
833
- error.data = errorRes.additional_data;
795
+ return throwError('Invalid options');
796
+ }
797
+ /**
798
+ * Processes the eSolve tree records and converts them into the correct format.
799
+ *
800
+ * @param tree_records Records to process
801
+ */
802
+ processTree(tree_records) {
803
+ const tree_items = [];
804
+ if (tree_records) {
805
+ for (const tree_record of tree_records) {
806
+ let esolve_id = '';
807
+ let parent_id = '';
808
+ let children = [];
809
+ if (tree_record.type === 'category') {
810
+ children = this.processTree(tree_record.children);
811
+ esolve_id = tree_record.menu_id;
812
+ parent_id = tree_record.owner_menu_id;
813
+ }
814
+ else {
815
+ esolve_id = tree_record.id;
816
+ parent_id = tree_record.menu_id;
817
+ }
818
+ tree_items.push(new EsolveCategoryTreeItem(tree_record.type, esolve_id, parent_id, tree_record.description, tree_record.sef_description, tree_record.seo_description, tree_record.sort_priority, tree_record.active, tree_record.display_only, tree_record.image, tree_record.seo_page_title, tree_record.seo_keywords, tree_record.short_description, children));
819
+ }
834
820
  }
835
- return throwError(error);
821
+ return tree_items;
822
+ }
823
+ processTreeItem(record) {
824
+ return new EsolveCategoryTreeItem(record.type, record.id, record.parent_id, record.description, record.sef_description, record.short_description, record.sort_priority, record.active, record.display_only, record.image, record.seo_page_title, record.seo_keywords, record.seo_description);
825
+ }
826
+ processID(id) {
827
+ let type;
828
+ let esolve_id;
829
+ const type_code_regex = /^\<\<(CAT|SUB)\>\>/g;
830
+ const match_results = id.match(type_code_regex);
831
+ if (match_results) {
832
+ const type_code = match_results[0];
833
+ type = (type_code === '<<CAT>>' ? 'category' : 'subcategory');
834
+ esolve_id = id.replace(type_code_regex, '');
835
+ return {
836
+ type,
837
+ esolve_id
838
+ };
839
+ }
840
+ return null;
836
841
  }
837
842
  }
838
- EsolveAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAuthService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }, { token: EsolveSessionService }, { token: EsolveErrorHandlerService }, { token: EsolveCookieService }], target: i0.ɵɵFactoryTarget.Injectable });
839
- EsolveAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAuthService, providedIn: 'root' });
840
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAuthService, decorators: [{
843
+ EsolveCategoryTreeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveCategoryTreeService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
844
+ EsolveCategoryTreeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveCategoryTreeService, providedIn: 'root' });
845
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveCategoryTreeService, decorators: [{
841
846
  type: Injectable,
842
847
  args: [{
843
848
  providedIn: 'root',
@@ -845,270 +850,348 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
845
850
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
846
851
  type: Inject,
847
852
  args: [ESOLVE_CONNECT_CONFIG]
848
- }] }, { type: i1$2.HttpClient }, { type: EsolveSessionService }, { type: EsolveErrorHandlerService }, { type: EsolveCookieService }]; } });
853
+ }] }, { type: i1$2.HttpClient }]; } });
849
854
 
850
- class EsolveAddress {
851
- constructor(id, recipient, address_type, pobox, place_name, street_number, street, suburb, city, province, country, postal_code, latitude, longitude) {
852
- this.id = id;
853
- this.recipient = recipient;
854
- this.address_type = address_type;
855
- this.pobox = pobox;
856
- this.place_name = place_name;
857
- this.street_number = street_number;
858
- this.street = street;
859
- this.suburb = suburb;
860
- this.city = city;
861
- this.province = province;
862
- this.country = country;
863
- this.postal_code = postal_code;
864
- this.latitude = latitude;
865
- this.longitude = longitude;
855
+ class EsolveManufacturer {
856
+ constructor(record) {
857
+ this.id = 0;
858
+ this.manufacturer = '';
859
+ this.sef_manufacturer = '';
860
+ this.title = '';
861
+ this.article = '';
862
+ this.sort_priority = 0;
863
+ this.is_active = false;
864
+ this.featured = false;
865
+ this.image_name = '';
866
+ let seo_title = '';
867
+ let seo_keywords = '';
868
+ let seo_description = '';
869
+ if (record) {
870
+ this.id = +(record.id ?? 0);
871
+ this.manufacturer = record.manufacturer ?? '';
872
+ this.sef_manufacturer = record.sef_manufacturer ?? '';
873
+ this.title = record.title ?? '';
874
+ this.article = record.article ?? '';
875
+ this.sort_priority = +(record.sort_priority ?? 0);
876
+ this.image_name = record.image_name ?? '';
877
+ if (record.is_active) {
878
+ this.is_active = !!+record.is_active;
879
+ }
880
+ if (record.featured) {
881
+ this.featured = !!+record.featured;
882
+ }
883
+ }
884
+ if (this.title.trim() === '') {
885
+ this.title = this.manufacturer;
886
+ }
887
+ if (seo_title.trim() === '') {
888
+ seo_title = this.title;
889
+ }
890
+ this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
866
891
  }
867
- }
868
-
869
- class EsolveAddressResult extends EsolveResponseResult {
870
- constructor(response) {
871
- super(response);
872
- this.id = response.esolve_id;
873
- this.address_validated = response.address_validated;
874
- this.geocode_status = response.geocode_status;
875
- this.geocode_result = response.geocode_result;
892
+ get original_image_src() {
893
+ return this.getImagePath('original');
876
894
  }
877
- }
878
-
879
- class EsolveUserAccount {
880
- constructor(esolve_id, email, registration_type, title, first_name, last_name, initials, gender, identification_number) {
881
- this.esolve_id = esolve_id;
882
- this.email = email;
883
- this.registration_type = registration_type;
884
- this.title = title;
885
- this.first_name = first_name;
886
- this.last_name = last_name;
887
- this.initials = initials;
888
- this.gender = gender;
889
- this.identification_number = identification_number;
895
+ get small_image_src() {
896
+ return this.getImagePath('small');
890
897
  }
891
- }
892
-
893
- class EsolveUserAccountResult extends EsolveResponseResult {
894
- constructor(response) {
895
- super(response);
896
- this.id = 0;
897
- this.id = +response.esolve_id;
898
+ get thumbnail_image_src() {
899
+ return this.getImagePath('thumb');
898
900
  }
899
- }
900
-
901
- class EsolveUserAccountBusiness {
902
- constructor(name, vat_number, description, type) {
903
- this.name = name;
904
- this.vat_number = vat_number;
905
- this.description = description;
906
- this.type = type;
901
+ get tiny_image_src() {
902
+ return this.getImagePath('tiny');
907
903
  }
908
- }
909
-
910
- class EsolveUserAccountContact {
911
- constructor(tel_number, cell_number, fax_number) {
912
- this.tel_number = tel_number;
913
- this.cell_number = cell_number;
914
- this.fax_number = fax_number;
904
+ getImagePath(image_size) {
905
+ if (this.image_name !== '') {
906
+ return `/images/manufacturers/${image_size}/${this.image_name}`;
907
+ }
908
+ return '';
915
909
  }
916
910
  }
917
911
 
918
- class EsolveTransactionAddress {
919
- constructor(recipient, address_type, address_description, street_number, street, suburb, city, province, country, postal_code, pobox) {
920
- this.recipient = recipient;
921
- this.address_type = address_type;
922
- this.address_description = address_description;
923
- this.street_number = street_number;
924
- this.street = street;
925
- this.suburb = suburb;
926
- this.city = city;
927
- this.province = province;
928
- this.country = country;
929
- this.postal_code = postal_code;
930
- this.pobox = pobox;
912
+ class EsolveManufacturersService {
913
+ constructor(config, http) {
914
+ this.config = config;
915
+ this.http = http;
931
916
  }
932
- }
933
-
934
- class EsolveTransactionClient {
935
- constructor(id, account, company_name, branch_code, email, first_name, last_name, contact_number) {
936
- this.id = id;
937
- this.account = account;
938
- this.company_name = company_name;
939
- this.branch_code = branch_code;
940
- this.email = email;
941
- this.first_name = first_name;
942
- this.last_name = last_name;
943
- this.contact_number = contact_number;
917
+ getManufacturer(id) {
918
+ const params = new HttpParams({
919
+ fromObject: { manufacturers_id: id }
920
+ });
921
+ return this.getManufacturerSingle(params);
944
922
  }
945
- }
946
-
947
- class EsolveTransactionItem {
948
- constructor(code, name, qty, discount, vat_rate, price, line_total) {
949
- this.code = code;
950
- this.name = name;
951
- this.qty = qty;
952
- this.discount = discount;
953
- this.vat_rate = vat_rate;
954
- this.price = price;
955
- this.line_total = line_total;
923
+ getManufacturerFromSEF(sef_manufacturer) {
924
+ const params = new HttpParams({
925
+ fromObject: { sef_manufacturer }
926
+ });
927
+ return this.getManufacturerSingle(params);
956
928
  }
957
- }
958
-
959
- class EsolveTransactionItemPrice {
960
- constructor(
961
- /**
962
- * Price without tax
963
- */
964
- price,
965
- /**
966
- * Price with tax
967
- */
968
- price_with_tax,
969
- /**
970
- * Price without tax and with discounts applied if applicable
971
- */
972
- price_discounted,
973
- /**
974
- * Price with tax and with discounts applied if applicable
975
- */
976
- price_with_tax_discounted) {
977
- this.price = price;
978
- this.price_with_tax = price_with_tax;
979
- this.price_discounted = price_discounted;
980
- this.price_with_tax_discounted = price_with_tax_discounted;
929
+ getManufacturers(options) {
930
+ let params = new HttpParams();
931
+ if (options?.featured_only) {
932
+ params = params.set('featured_only', options.featured_only);
933
+ }
934
+ return this.getManufacturerRecords(params).pipe(map((records) => {
935
+ const manufacturers = [];
936
+ for (const record of records) {
937
+ manufacturers.push(this.processManufacturer(record));
938
+ }
939
+ return manufacturers;
940
+ }), catchError(() => {
941
+ return of([]);
942
+ }));
981
943
  }
982
- }
983
-
984
- class EsolveLocationAddress {
985
- constructor(street, suburb, city, province, country, postal_code, latitude, longitude) {
986
- this.street = street;
987
- this.suburb = suburb;
988
- this.city = city;
989
- this.province = province;
990
- this.country = country;
991
- this.postal_code = postal_code;
992
- this.latitude = latitude;
993
- this.longitude = longitude;
944
+ getManufacturerSingle(params) {
945
+ return this.getManufacturerRecords(params).pipe(map((records) => {
946
+ const record = records[0];
947
+ return this.processManufacturer(record);
948
+ }));
994
949
  }
995
- }
996
-
997
- class EsolveLocationContactInfo {
998
- constructor(telnumber, cellnumber, email, fax) {
999
- this.telnumber = telnumber;
1000
- this.cellnumber = cellnumber;
1001
- this.email = email;
1002
- this.fax = fax;
950
+ getManufacturerRecords(params) {
951
+ return this.http
952
+ .get(`${this.config.api_url}/get-manufacturers.php`, { params })
953
+ .pipe(map((response) => {
954
+ if ((response.records === undefined) ||
955
+ (response.records.length <= 0)) {
956
+ throw response;
957
+ }
958
+ return response.records;
959
+ }));
1003
960
  }
1004
- }
1005
-
1006
- class EsolveLocationPOBoxAddress {
1007
- constructor(pobox, city, postal_code) {
1008
- this.pobox = pobox;
1009
- this.city = city;
1010
- this.postal_code = postal_code;
961
+ processManufacturer(record) {
962
+ return new EsolveManufacturer(record);
1011
963
  }
1012
- }
1013
-
1014
- class EsolveLocationTradingTimes {
1015
- constructor(monday, tuesday, wednesday, thursday, friday, saturday, sunday, public_holiday, trading_hours_additional_info = '') {
1016
- this.monday = monday;
1017
- this.tuesday = tuesday;
1018
- this.wednesday = wednesday;
1019
- this.thursday = thursday;
1020
- this.friday = friday;
1021
- this.saturday = saturday;
1022
- this.sunday = sunday;
1023
- this.public_holiday = public_holiday;
1024
- this.trading_hours_additional_info = trading_hours_additional_info;
964
+ }
965
+ EsolveManufacturersService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveManufacturersService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
966
+ EsolveManufacturersService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveManufacturersService, providedIn: 'root' });
967
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveManufacturersService, decorators: [{
968
+ type: Injectable,
969
+ args: [{
970
+ providedIn: 'root',
971
+ }]
972
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
973
+ type: Inject,
974
+ args: [ESOLVE_CONNECT_CONFIG]
975
+ }] }, { type: i1$2.HttpClient }]; } });
976
+
977
+ // Types
978
+
979
+ class EsolveRange {
980
+ constructor(record) {
981
+ this.id = 0;
982
+ this.range = '';
983
+ this.sef_range = '';
984
+ this.manufacturers_id = 0;
985
+ this.title = '';
986
+ this.article = '';
987
+ this.is_active = false;
988
+ this.featured = false;
989
+ this.sort_priority = 0;
990
+ this.image_name = '';
991
+ let seo_title = '';
992
+ let seo_keywords = '';
993
+ let seo_description = '';
994
+ if (record) {
995
+ this.id = +(record.id ?? 0);
996
+ this.range = record.range ?? '';
997
+ this.sef_range = record.sef_range ?? '';
998
+ this.manufacturers_id = +(record.manufacturers_id ?? 0);
999
+ this.title = record.title ?? '';
1000
+ this.article = record.article ?? '';
1001
+ this.sort_priority = +(record.sort_priority ?? 0);
1002
+ this.image_name = record.image_name ?? '';
1003
+ if (record.is_active) {
1004
+ this.is_active = !!+record.is_active;
1005
+ }
1006
+ if (record.featured) {
1007
+ this.featured = !!+record.featured;
1008
+ }
1009
+ seo_title = record.seo_page_title ?? '';
1010
+ seo_keywords = record.seo_keywords ?? '';
1011
+ seo_description = record.seo_description ?? '';
1012
+ }
1013
+ if (this.title.trim() === '') {
1014
+ this.title = this.range;
1015
+ }
1016
+ if (seo_title.trim() === '') {
1017
+ seo_title = this.title;
1018
+ }
1019
+ this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
1020
+ }
1021
+ get image_src() {
1022
+ return this.getImagePath();
1023
+ }
1024
+ getImagePath() {
1025
+ if (this.image_name !== '') {
1026
+ return `/images/ranges/${this.image_name}`;
1027
+ }
1028
+ return '';
1025
1029
  }
1026
1030
  }
1027
1031
 
1028
- class EsolveLocationTradingDay {
1029
- constructor(open, close) {
1030
- this.open = open;
1031
- this.close = close;
1032
+ class EsolveRangesService {
1033
+ constructor(config, http) {
1034
+ this.config = config;
1035
+ this.http = http;
1032
1036
  }
1033
- }
1037
+ getRange(id) {
1038
+ const params = new HttpParams({
1039
+ fromObject: { ranges_id: id }
1040
+ });
1041
+ return this.getRangeSingle(params);
1042
+ }
1043
+ getRangeFromSEF(sef_range) {
1044
+ const params = new HttpParams({
1045
+ fromObject: { sef_range }
1046
+ });
1047
+ return this.getRangeSingle(params);
1048
+ }
1049
+ getRanges(options) {
1050
+ let params = new HttpParams();
1051
+ if (options?.featured_only) {
1052
+ params = params.set('featured_only', options.featured_only);
1053
+ }
1054
+ if (options?.manufacturers_id) {
1055
+ params = params.set('manufacturers_id', options.manufacturers_id);
1056
+ }
1057
+ return this.getRangeRecords(params).pipe(map((records) => {
1058
+ const ranges = [];
1059
+ for (const record of records) {
1060
+ ranges.push(this.processRange(record));
1061
+ }
1062
+ return ranges;
1063
+ }), catchError(() => {
1064
+ return of([]);
1065
+ }));
1066
+ }
1067
+ getRangeSingle(params) {
1068
+ return this.getRangeRecords(params).pipe(map((records) => {
1069
+ const record = records[0];
1070
+ return this.processRange(record);
1071
+ }));
1072
+ }
1073
+ getRangeRecords(params) {
1074
+ return this.http
1075
+ .get(`${this.config.api_url}/get-ranges.php`, { params })
1076
+ .pipe(map((response) => {
1077
+ if ((response.records === undefined) ||
1078
+ (response.records.length <= 0)) {
1079
+ throw response;
1080
+ }
1081
+ return response.records;
1082
+ }));
1083
+ }
1084
+ processRange(record) {
1085
+ return new EsolveRange(record);
1086
+ }
1087
+ }
1088
+ EsolveRangesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveRangesService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1089
+ EsolveRangesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveRangesService, providedIn: 'root' });
1090
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveRangesService, decorators: [{
1091
+ type: Injectable,
1092
+ args: [{
1093
+ providedIn: 'root',
1094
+ }]
1095
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1096
+ type: Inject,
1097
+ args: [ESOLVE_CONNECT_CONFIG]
1098
+ }] }, { type: i1$2.HttpClient }]; } });
1034
1099
 
1035
- class EsolveLocation {
1100
+ class EsolveTag {
1036
1101
  constructor(record) {
1037
- this.id = +record.id;
1038
- this.identifier = record.identifier;
1039
- this.description = record.description;
1040
- this.head_office = record.head_office;
1041
- this.erp_identifier = record.erp_identifier;
1042
- this.external_system_code = record.external_system_code;
1043
- this.default_location_for_payment_methods = record.default_location_for_payment_methods;
1044
- this.userid = +record.userid;
1045
- this.importance = +record.importance;
1046
- this.active = record.is_active;
1047
- this.website_url = record.website_url;
1048
- this.address = new EsolveLocationAddress(record.street, record.suburb, record.city, record.province, record.country, record.postal_code, +record.latitude, +record.longitude);
1049
- this.pobox_address = new EsolveLocationPOBoxAddress(record.pobox, record.pobox_city, record.pobox_postal_code);
1050
- const telnumbers = [];
1051
- if (record.branch_telnumber.length > 0) {
1052
- telnumbers.push(record.branch_telnumber);
1053
- }
1054
- if (record.branch_telnumber_2.length > 0) {
1055
- telnumbers.push(record.branch_telnumber_2);
1102
+ this.id = 0;
1103
+ this.phrase = '';
1104
+ this.weight = 0;
1105
+ this.description = '';
1106
+ this.image_name = '';
1107
+ if (record) {
1108
+ this.id = +(record.id ?? 0);
1109
+ this.phrase = record.tag_phrase ?? '';
1110
+ this.weight = +(record.tag_weight ?? 0);
1111
+ this.description = record.description ?? '';
1112
+ this.image_name = record.image_name ?? '';
1056
1113
  }
1057
- if (record.branch_telnumber_3.length > 0) {
1058
- telnumbers.push(record.branch_telnumber_3);
1114
+ }
1115
+ /**
1116
+ * @deprecated To be removed in the future. Use `EsolveTag.phrase` instead
1117
+ */
1118
+ get tag_phrase() {
1119
+ return this.phrase;
1120
+ }
1121
+ /**
1122
+ * @deprecated To be removed in the future. Use `EsolveTag.weight` instead
1123
+ */
1124
+ get tag_weight() {
1125
+ return this.weight;
1126
+ }
1127
+ getImagePath() {
1128
+ if (this.image_name !== '') {
1129
+ return `/images/tags/${this.image_name}`;
1059
1130
  }
1060
- this.contact_info = new EsolveLocationContactInfo(telnumbers, record.branch_cellnumber, record.branch_email, record.branch_fax);
1061
- const monday = new EsolveLocationTradingDay(record.monday_open_time, record.monday_close_time);
1062
- const tuesday = new EsolveLocationTradingDay(record.tuesday_open_time, record.tuesday_close_time);
1063
- const wednesday = new EsolveLocationTradingDay(record.wednesday_open_time, record.wednesday_close_time);
1064
- const thursday = new EsolveLocationTradingDay(record.thursday_open_time, record.thursday_close_time);
1065
- const friday = new EsolveLocationTradingDay(record.friday_open_time, record.friday_close_time);
1066
- const saturday = new EsolveLocationTradingDay(record.saturday_open_time, record.saturday_close_time);
1067
- const sunday = new EsolveLocationTradingDay(record.sunday_open_time, record.sunday_close_time);
1068
- const public_holiday = new EsolveLocationTradingDay(record.public_holiday_open_time, record.public_holiday_close_time);
1069
- this.trading_times = new EsolveLocationTradingTimes(monday, tuesday, wednesday, thursday, friday, saturday, sunday, public_holiday, record.trading_hours_additional_info);
1131
+ return '';
1070
1132
  }
1071
1133
  }
1072
1134
 
1073
- class EsolveLocationsService {
1135
+ class EsolveTagsService {
1074
1136
  constructor(config, http) {
1075
1137
  this.config = config;
1076
1138
  this.http = http;
1077
1139
  }
1078
1140
  /**
1079
- * Retrieves a list of stock locations
1141
+ * Retrieves active topics from the list of topic ID's. Note that inactive or expired
1142
+ * topics will not be retrieved.
1080
1143
  *
1081
- * @returns An `Observable` with an array of stock locations
1144
+ * @param options Tag filters
1082
1145
  */
1083
- getStockLocations() {
1084
- return this.http
1085
- .get(`${this.config.api_url}/get-locations.php`)
1086
- .pipe(map((response) => {
1146
+ getTags(options) {
1147
+ const params = this.parseOptions(options);
1148
+ return this.http.get(`${this.config.api_url}/get-tags.php`, { params }).pipe(map(response => {
1087
1149
  if (response.records === undefined) {
1088
1150
  throw response;
1089
1151
  }
1090
- return this.processStockLocations(response.records);
1152
+ return this.processTags(response.records);
1091
1153
  }));
1092
1154
  }
1093
- /**
1094
- * Processes the eSolve stock location records.
1095
- *
1096
- * @param records Records to process
1097
- * @returns An array of processed stock location records
1098
- */
1099
- processStockLocations(records) {
1100
- const stock_locations = [];
1155
+ parseOptions(options) {
1156
+ let params = new HttpParams();
1157
+ if (options) {
1158
+ if (options.tags_id) {
1159
+ if (Array.isArray(options.tags_id)) {
1160
+ const tag_list = options.tags_id;
1161
+ if (tag_list.length > 0) {
1162
+ params = params.append('tags_id', tag_list.join(','));
1163
+ }
1164
+ }
1165
+ else {
1166
+ params = params.append('tags_id', options.tags_id);
1167
+ }
1168
+ }
1169
+ else {
1170
+ if (options.phrase && options.phrase !== '') {
1171
+ params = params.append('phrase', options.phrase);
1172
+ const phrase_match_mode = options.phrase_match_mode;
1173
+ if (phrase_match_mode) {
1174
+ params = params.append('phrase_match_mode', phrase_match_mode);
1175
+ }
1176
+ }
1177
+ }
1178
+ }
1179
+ return params;
1180
+ }
1181
+ processTags(records) {
1182
+ const tags = [];
1101
1183
  if (records) {
1102
1184
  for (const record of records) {
1103
- stock_locations.push(new EsolveLocation(record));
1185
+ const tag = new EsolveTag(record);
1186
+ tags.push(tag);
1104
1187
  }
1105
1188
  }
1106
- return stock_locations;
1189
+ return tags;
1107
1190
  }
1108
1191
  }
1109
- EsolveLocationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveLocationsService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1110
- EsolveLocationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveLocationsService, providedIn: 'root' });
1111
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveLocationsService, decorators: [{
1192
+ EsolveTagsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTagsService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1193
+ EsolveTagsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTagsService, providedIn: 'root' });
1194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTagsService, decorators: [{
1112
1195
  type: Injectable,
1113
1196
  args: [{
1114
1197
  providedIn: 'root',
@@ -1118,422 +1201,365 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
1118
1201
  args: [ESOLVE_CONNECT_CONFIG]
1119
1202
  }] }, { type: i1$2.HttpClient }]; } });
1120
1203
 
1121
- class EsolveTransactionLocation extends EsolveLocation {
1122
- }
1123
-
1124
- class EsolveTransactionPaymentMethod {
1125
- constructor(id, name, description, integration_type, service_provider) {
1126
- this.id = id;
1127
- this.name = name;
1128
- this.description = description;
1129
- this.integration_type = integration_type;
1130
- this.service_provider = service_provider;
1131
- }
1132
- }
1204
+ // Types
1133
1205
 
1134
- class EsolveTransactionShippingMethod {
1135
- constructor(id, name, delivery_category, location, description, pricing, client_to_collect) {
1136
- this.id = id;
1137
- this.name = name;
1138
- this.delivery_category = delivery_category;
1139
- this.location = location;
1140
- this.description = description;
1141
- this.pricing = pricing;
1142
- this.client_to_collect = client_to_collect;
1206
+ class EsolveTopic {
1207
+ constructor(record) {
1208
+ this.id = 0;
1209
+ this.name = '';
1210
+ this.short_description = '';
1211
+ this.sort_priority = 0;
1212
+ if (record) {
1213
+ this.id = +(record.id ?? 0);
1214
+ this.name = record.name ?? '';
1215
+ this.short_description = record.short_description ?? '';
1216
+ this.sort_priority = +(record.sort_priority ?? 0);
1217
+ }
1143
1218
  }
1144
1219
  }
1145
1220
 
1146
- class EsolveTransactionUser {
1147
- constructor(id, email, first_name, last_name, tel_number, cell_number) {
1148
- this.id = id;
1149
- this.email = email;
1150
- this.first_name = first_name;
1151
- this.last_name = last_name;
1152
- this.tel_number = tel_number;
1153
- this.cell_number = cell_number;
1221
+ class EsolveTopicService {
1222
+ constructor(config, http) {
1223
+ this.config = config;
1224
+ this.http = http;
1154
1225
  }
1155
- }
1156
-
1157
- class EsolveTransaction {
1226
+ /**
1227
+ * Retrieves active topics from the list of topic ID's. Note that inactive or expired
1228
+ * topics will not be retrieved.
1229
+ *
1230
+ * @param topic_id_list List of topic ID's that need to be retrieved
1231
+ */
1232
+ getTopics(topic_id_list = []) {
1233
+ let params = new HttpParams();
1234
+ if (topic_id_list.length > 0) {
1235
+ params = params.append('topic_id', topic_id_list.join(','));
1236
+ }
1237
+ return this.http.get(`${this.config.api_url}/get-topics.php`, { params }).pipe(map(response => {
1238
+ if (response.records === undefined) {
1239
+ throw response;
1240
+ }
1241
+ return this.processTopics(response.records);
1242
+ }));
1243
+ }
1244
+ processTopics(records) {
1245
+ const topics = [];
1246
+ if (records) {
1247
+ for (const record of records) {
1248
+ const topic = new EsolveTopic(record);
1249
+ topics.push(topic);
1250
+ }
1251
+ }
1252
+ return topics;
1253
+ }
1254
+ }
1255
+ EsolveTopicService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTopicService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1256
+ EsolveTopicService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTopicService, providedIn: 'root' });
1257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTopicService, decorators: [{
1258
+ type: Injectable,
1259
+ args: [{
1260
+ providedIn: 'root',
1261
+ }]
1262
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1263
+ type: Inject,
1264
+ args: [ESOLVE_CONNECT_CONFIG]
1265
+ }] }, { type: i1$2.HttpClient }]; } });
1266
+
1267
+ class EsolveAsset {
1158
1268
  constructor(record) {
1159
- // Transaction Items
1160
- this.items = [];
1269
+ this.id = 0;
1270
+ this.src = '';
1271
+ this.name = '';
1272
+ this.description = '';
1273
+ this.document_number = '';
1274
+ this.document_type = '';
1275
+ this.area_of_application = '';
1276
+ this.asset_category = '';
1277
+ this.asset_sub_category = '';
1278
+ this.sort_priority = 0;
1279
+ this.topics = [];
1280
+ this.tags = [];
1161
1281
  this.id = +record.id;
1162
- this.type = record.transaction_type;
1163
- this.status = record.status;
1164
- this.loyalty_number = record.loyaltynumber;
1165
- this.external_order_number = record.external_order_number;
1166
- this.external_invoice_number = record.external_invoice_number;
1167
- this.date = new Date(+record.txdate_timestamp * 1000);
1168
- this.expected_date = new Date(+record.expected_date_timestamp * 1000);
1169
- this.invoice_amount = +record.invoice_amount;
1170
- this.vat = +record.vat;
1171
- this.discount = +record.discount;
1172
- this.total = +record.total;
1173
- this.shipping_total = +record.shipping_total;
1174
- this.insurance_total = +record.insurance_total;
1175
- this.payment = +record.payment;
1176
- this.payment_reference = record.payment_reference;
1177
- this.payment_description = record.payment_description;
1178
- this.gateway_transaction_id = record.gateway_transaction_id;
1179
- this.address = new EsolveTransactionAddress(record.recipient, record.address_type, record.address_description, record.street_number, record.street, record.suburb, record.city, record.province, record.country, record.postal_code, record.pobox);
1180
- if (record.user) {
1181
- this.user = new EsolveTransactionUser(+record.user.id, record.user.email, record.user.firstname, record.user.surname, record.user.telnumber, record.user.cellnumber);
1282
+ this.src = record.src;
1283
+ this.name = record.name;
1284
+ this.type = record.type;
1285
+ this.description = record.description;
1286
+ this.document_number = record.document_number ?? '';
1287
+ this.document_type = record.document_type ?? '';
1288
+ this.area_of_application = record.area_of_application ?? '';
1289
+ this.asset_category = record.asset_category ?? '';
1290
+ this.asset_sub_category = record.asset_sub_category ?? '';
1291
+ this.sort_priority = +(record.sort_priority ?? '');
1292
+ if (record.created) {
1293
+ this.created = record.created;
1182
1294
  }
1183
- if (record.client) {
1184
- this.client = new EsolveTransactionClient(+record.client.id, record.client.account, record.client.company_name, record.client.branch_code, record.client.email, record.client.firstname, record.client.surname, record.client.contact_number);
1295
+ if (record.category) {
1296
+ this.category = new EsolveCategoryTreeItem(record.category.type, record.category.id, record.category.parent_id, record.category.description, record.category.sef_description, record.category.short_description, record.category.sort_priority, record.category.active, record.category.display_only, record.category.image, record.category.seo_page_title, record.category.seo_keywords, record.category.seo_description);
1185
1297
  }
1186
- if (record.location_details) {
1187
- this.location = new EsolveTransactionLocation(record.location_details);
1298
+ if (record.subcategory) {
1299
+ this.subcategory = new EsolveCategoryTreeItem(record.subcategory.type, record.subcategory.id, record.subcategory.parent_id, record.subcategory.description, record.subcategory.sef_description, record.subcategory.short_description, record.subcategory.sort_priority, record.subcategory.active, record.subcategory.display_only, record.subcategory.image, record.subcategory.seo_page_title, record.subcategory.seo_keywords, record.subcategory.seo_description);
1188
1300
  }
1189
- if (record.payment_method_details) {
1190
- this.payment_method = new EsolveTransactionPaymentMethod(record.payment_method_details.id, record.payment_method_details.paymethod_name, record.payment_method_details.description, record.payment_method_details.integration_type, record.payment_method_details.service_provider);
1301
+ if (record.manufacturer) {
1302
+ this.manufacturer = new EsolveManufacturer(record.manufacturer);
1191
1303
  }
1192
- if (record.shipping_method_details) {
1193
- this.shipping_method = new EsolveTransactionShippingMethod(+record.shipping_method_details.id, record.shipping_method_details.carrier_name, record.shipping_method_details.delivery_category, record.shipping_method_details.location, record.shipping_method_details.description, record.shipping_method_details.pricing, !!record.shipping_method_details.client_to_collect);
1304
+ if (record.range) {
1305
+ this.range = new EsolveRange(record.range);
1194
1306
  }
1195
- this.parseTransactionItems(record.transaction_items);
1196
- }
1197
- parseTransactionItems(record_items) {
1198
- for (const record_item of record_items) {
1199
- const price = new EsolveTransactionItemPrice(+record_item.price_exclusive, +record_item.price_inclusive, +record_item.price_exclusive_after_discount, +record_item.price_inclusive_after_discount);
1200
- const line_total = new EsolveTransactionItemPrice(+record_item.line_total_exclusive, +record_item.line_total_inclusive, +record_item.line_total_exclusive_after_discount, +record_item.line_total_inclusive_after_discount);
1201
- const item = new EsolveTransactionItem(record_item.code, record_item.name, +record_item.qty, +record_item.discount, +record_item.vat_rate, price, line_total);
1202
- this.items.push(item);
1307
+ if (record.topics && record.topics.length > 0) {
1308
+ for (const topic of record.topics) {
1309
+ this.topics.push(new EsolveTopic(topic));
1310
+ }
1311
+ }
1312
+ if (record.tags && record.tags.length > 0) {
1313
+ for (const tag of record.tags) {
1314
+ this.tags.push(new EsolveTag(tag));
1315
+ }
1203
1316
  }
1204
1317
  }
1205
1318
  }
1206
1319
 
1207
- class EsolveTransactionList extends EsolveList {
1208
- }
1209
-
1210
- // Classes
1211
-
1212
- class EsolveChangePasswordResult extends EsolveResponseResult {
1213
- constructor(response) {
1214
- super(response);
1215
- this.password_updated = (response.status.state === 'success');
1320
+ class EsolveAssetsService {
1321
+ constructor(config, http) {
1322
+ this.config = config;
1323
+ this.http = http;
1216
1324
  }
1217
- }
1218
-
1219
- class EsolveResetPasswordResult extends EsolveResponseResult {
1220
- constructor(response) {
1221
- super(response);
1222
- this.id = response.esolve_id;
1223
- this.reset_success = response.reset_success;
1224
- this.password_matches_old = response.password_matches_old;
1225
- this.login_required = response.login_required;
1325
+ getAsset(id) {
1326
+ const params = new HttpParams({ fromObject: { assets_id: id } });
1327
+ return this.getAssetRecords(params).pipe(map((response) => {
1328
+ if ((response.records === undefined) ||
1329
+ (response.records.length <= 0)) {
1330
+ throw response;
1331
+ }
1332
+ const record = response.records[0];
1333
+ return this.processAsset(record);
1334
+ }));
1226
1335
  }
1227
- }
1228
-
1229
- class EsolveRegistrationResult extends EsolveResponseResult {
1230
- constructor(response) {
1231
- super(response);
1232
- this.user_id = response.esolve_id;
1233
- this.guest = response.guest;
1234
- this.auto_login = response.auto_login;
1235
- this.authentication_required = response.authentication_required;
1236
- this.location_id = response.session_data.location_id;
1336
+ getAssets(options) {
1337
+ const params = this.parseOptions(options);
1338
+ return this.getAssetRecords(params).pipe(map((response) => {
1339
+ if (response.records === undefined) {
1340
+ throw response;
1341
+ }
1342
+ const assets = [];
1343
+ for (const record of response.records) {
1344
+ assets.push(this.processAsset(record));
1345
+ }
1346
+ const page = options?.page ?? 0;
1347
+ const rows = options?.rows ?? 0;
1348
+ const total = +response.additional_data.total_records;
1349
+ return new EsolveList(assets, page, rows, total);
1350
+ }));
1237
1351
  }
1238
- }
1239
-
1240
- class EsolveLocationUpdateResult extends EsolveResponseResult {
1241
- constructor(response) {
1242
- super(response);
1243
- this.location_updated = (response.esolve_id > 0);
1352
+ processAsset(record) {
1353
+ return new EsolveAsset(record);
1244
1354
  }
1245
- }
1355
+ parseOptions(options) {
1356
+ let params = new HttpParams();
1357
+ if (!options) {
1358
+ return params;
1359
+ }
1360
+ if (options.page) {
1361
+ params = params.set('page', options.page);
1362
+ }
1363
+ if (options.rows) {
1364
+ params = params.set('rows', options.rows);
1365
+ }
1366
+ if (options.asset_type) {
1367
+ params = params.set('asset_type', options.asset_type);
1368
+ }
1369
+ if (options.category_id) {
1370
+ params = params.set('category_id', options.category_id);
1371
+ }
1372
+ if (options.subcategory_id) {
1373
+ params = params.set('subcategory_id', options.subcategory_id);
1374
+ }
1375
+ if (options.manufacturers_id) {
1376
+ params = params.set('manufacturers_id', options.manufacturers_id);
1377
+ }
1378
+ if (options.ranges_id) {
1379
+ params = params.set('ranges_id', options.ranges_id);
1380
+ }
1381
+ if (options.asset_category) {
1382
+ params = params.set('asset_category', options.asset_category);
1383
+ }
1384
+ if (options.asset_sub_category) {
1385
+ params = params.set('asset_sub_category', options.asset_sub_category);
1386
+ }
1387
+ return params;
1388
+ }
1389
+ getAssetRecords(params) {
1390
+ return this.http.get(`${this.config.api_url}/get-assets.php`, { params });
1391
+ }
1392
+ }
1393
+ EsolveAssetsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAssetsService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1394
+ EsolveAssetsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAssetsService, providedIn: 'root' });
1395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAssetsService, decorators: [{
1396
+ type: Injectable,
1397
+ args: [{
1398
+ providedIn: 'root',
1399
+ }]
1400
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1401
+ type: Inject,
1402
+ args: [ESOLVE_CONNECT_CONFIG]
1403
+ }] }, { type: i1$2.HttpClient }]; } });
1246
1404
 
1247
- class EsolveAccountService {
1248
- constructor(config, http, sessionService, errorHandler, responseHandler) {
1405
+ // Types
1406
+
1407
+ class EsolveAuthService {
1408
+ constructor(config, http, session, errorHandler, cookieService) {
1249
1409
  this.config = config;
1250
1410
  this.http = http;
1251
- this.sessionService = sessionService;
1411
+ this.session = session;
1252
1412
  this.errorHandler = errorHandler;
1253
- this.responseHandler = responseHandler;
1254
- this._user_id = 0;
1255
- this.sessionService.session.subscribe((session) => {
1256
- if (session.key !== '') {
1257
- this.user_id = session.id;
1258
- }
1259
- });
1260
- }
1261
- get user_id() {
1262
- return this._user_id;
1413
+ this.cookieService = cookieService;
1263
1414
  }
1264
- set user_id(value) {
1265
- value = ((value > 0) ? value : 0);
1266
- if (this._user_id !== value) {
1267
- this._user_id = value;
1415
+ getAccessToken(email, password, anonymous = false) {
1416
+ let params = new HttpParams();
1417
+ if (anonymous) {
1418
+ params = params.set('anonymous', true);
1419
+ }
1420
+ if (email !== '') {
1421
+ params = params.set('email', email);
1422
+ }
1423
+ if (password !== '') {
1424
+ params = params.set('password', password);
1268
1425
  }
1426
+ return this.http
1427
+ .get(`${this.config.api_url}/get-access-token.php`, {
1428
+ params,
1429
+ headers: new HttpHeaders({
1430
+ 'Accept-Language': '*',
1431
+ }),
1432
+ })
1433
+ .pipe(tap((responseData) => {
1434
+ if ((responseData.type === 'error') ||
1435
+ (responseData.type === 'exception')) {
1436
+ throw responseData;
1437
+ }
1438
+ }), catchError(this.handleError), tap((responseData) => {
1439
+ this.handleAuthentication(responseData.additional_data);
1440
+ }));
1269
1441
  }
1270
- updateUserAccount(user_account_data) {
1442
+ autoLogin() {
1443
+ this.session.restore(this.handleExpiration(), () => {
1444
+ this.getAccessToken('', '', true).toPromise().then(() => { }, (error) => {
1445
+ console.error(error);
1446
+ });
1447
+ });
1448
+ }
1449
+ login(email, password) {
1271
1450
  const body = {
1272
- account: user_account_data
1451
+ login: {
1452
+ email,
1453
+ password
1454
+ }
1273
1455
  };
1274
1456
  return this.http
1275
- .post(`${this.config.api_url}/set-user-account.php`, body, {
1457
+ .post(`${this.config.api_url}/set-login.php`, body, {
1276
1458
  headers: {
1277
1459
  'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
1278
1460
  },
1279
1461
  responseType: 'json',
1280
1462
  observe: 'body'
1281
1463
  })
1282
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveUserAccountResult(response))), catchError((errorRes) => {
1283
- return this.errorHandler.handleHttpPostError('set-user-account', errorRes);
1284
- }));
1285
- }
1286
- getUserAccount() {
1287
- return this.http
1288
- .get(`${this.config.api_url}/get-account.php`)
1289
1464
  .pipe(map((response) => {
1290
- if ((response.records === undefined) ||
1291
- (response.records.length === 0)) {
1465
+ if ((response.responses === undefined) ||
1466
+ (response.responses.length <= 0)) {
1292
1467
  throw response;
1293
1468
  }
1294
- const record = response.records[0];
1295
- return this.processUserAccount(record);
1296
- }));
1297
- }
1298
- setAddress(address_post_data) {
1299
- const body = {
1300
- address: address_post_data
1301
- };
1302
- return this.http
1303
- .post(`${this.config.api_url}/set-address.php`, body, {
1304
- headers: {
1305
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
1306
- },
1307
- responseType: 'json',
1308
- observe: 'body',
1309
- })
1310
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveAddressResult(response))), catchError((errorRes) => {
1311
- return this.errorHandler.handleHttpPostError('set-registration', errorRes);
1312
- }));
1313
- }
1314
- getAddresses() {
1315
- try {
1316
- this.loginGuard();
1317
- return this.http
1318
- .get(`${this.config.api_url}/get-addresses.php`, {
1319
- params: { user_id: this.user_id }
1320
- })
1321
- .pipe(map((response) => {
1322
- if (response.records === undefined) {
1323
- throw response;
1469
+ const login_response = response.responses[0];
1470
+ if ((login_response.status.state !== 'success') &&
1471
+ (login_response.status.state !== 'warning')) {
1472
+ throw login_response;
1473
+ }
1474
+ for (const response_log of login_response.log) {
1475
+ if ((response_log.type === 'success') &&
1476
+ (response_log.message_code === 'login_success')) {
1477
+ const session_data = login_response.session_data;
1478
+ const user_id = +login_response.esolve_id;
1479
+ const location_id = +session_data.location_id;
1480
+ this.session.handleUpdateSession({
1481
+ user_id: user_id,
1482
+ location_id: location_id
1483
+ });
1484
+ return user_id;
1324
1485
  }
1325
- return this.processUserAddress(response.records);
1326
- }));
1327
- }
1328
- catch (error) {
1329
- return throwError(error);
1330
- }
1331
- }
1332
- deleteAddress(id) {
1333
- return this.http
1334
- .delete(`${this.config.api_url}/delete-address.php`, {
1335
- params: { id },
1336
- responseType: 'json',
1337
- observe: 'body'
1338
- })
1339
- .pipe(map((http_response) => {
1340
- if ((http_response.result === undefined) ||
1341
- (http_response.result === null) ||
1342
- (http_response.result.status !== 'success')) {
1343
- throw http_response;
1344
1486
  }
1345
- return new EsolveResult(http_response.result.status, http_response.result.code, http_response.result.message);
1487
+ throw login_response;
1346
1488
  }), catchError((errorRes) => {
1347
- return this.errorHandler.handleHttpDeleteError('delete-address', errorRes);
1348
- }));
1349
- }
1350
- register(user_registration) {
1351
- const body = {
1352
- user: user_registration
1353
- };
1354
- return this.http
1355
- .post(`${this.config.api_url}/set-registration.php`, body, {
1356
- headers: {
1357
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
1358
- },
1359
- responseType: 'json',
1360
- observe: 'body'
1361
- })
1362
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
1363
- if (response.auto_login) {
1364
- this.sessionService.handleUpdateSession({
1365
- user_id: +response.esolve_id,
1366
- location_id: +response.session_data.location_id,
1367
- });
1368
- }
1369
- return new EsolveRegistrationResult(response);
1370
- })), catchError((errorRes) => {
1371
- return this.errorHandler.handleHttpPostError('set-registration', errorRes);
1372
- }));
1373
- }
1374
- changePassword(password, confirm_password) {
1375
- const body = {
1376
- password,
1377
- confirm_password
1378
- };
1379
- return this.http
1380
- .post(`${this.config.api_url}/set-change-password.php`, body, {
1381
- headers: {
1382
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
1383
- },
1384
- responseType: 'json',
1385
- observe: 'body'
1386
- })
1387
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
1388
- return new EsolveChangePasswordResult(response);
1389
- })), catchError((errorRes) => {
1390
- return this.errorHandler.handleHttpPostError('set-change-password', errorRes);
1489
+ return this.errorHandler.handleHttpPostError('set-login', errorRes);
1391
1490
  }));
1392
1491
  }
1393
- sendForgotPasswordRequest(email) {
1394
- return this.http
1395
- .get(`${this.config.api_url}/get-forgot-password.php`, { params: { email } })
1396
- .pipe(map((response) => {
1397
- if ((response.records === undefined) ||
1398
- !('reset_link_sent' in response.records)) {
1399
- throw response;
1400
- }
1401
- return response.records.reset_link_sent;
1402
- }));
1492
+ logout() {
1493
+ this.session.clearTimer();
1494
+ this.cookieService.delete('_ws_id');
1495
+ return this.getAccessToken('', '', true).toPromise();
1403
1496
  }
1404
- resetPassword(reset_key, password, confirm_password, auto_login = true) {
1497
+ checkAccessToken(session) {
1498
+ session = session || this.session.currentSession;
1499
+ const token = session?.key ?? '';
1405
1500
  return this.http
1406
- .post(`${this.config.api_url}/set-forgot-password.php`, {
1407
- reset_key,
1408
- password,
1409
- confirm_password,
1410
- auto_login
1411
- }, {
1412
- headers: {
1413
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
1414
- },
1415
- responseType: 'json',
1416
- observe: 'body'
1501
+ .get(`${this.config.api_url}/get-access-token.php`, {
1502
+ params: { key: token },
1503
+ headers: new HttpHeaders({
1504
+ 'Accept-Language': '*'
1505
+ }),
1417
1506
  })
1418
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
1419
- if (!response.login_required) {
1420
- this.sessionService.handleUpdateSession({
1421
- user_id: +response.esolve_id,
1422
- location_id: +response.session_data.location_id,
1423
- });
1507
+ .pipe(map((responseData) => {
1508
+ if ((responseData.type === 'error') ||
1509
+ (responseData.type === 'exception') ||
1510
+ (!responseData.additional_data.key_okay)) {
1511
+ throw responseData;
1424
1512
  }
1425
- return new EsolveResetPasswordResult(response);
1426
- })), catchError((errorRes) => {
1427
- return this.errorHandler.handleHttpPostError('set-forgot-password', errorRes);
1428
- }));
1513
+ const additional_data = responseData.additional_data;
1514
+ const result = {
1515
+ key: token,
1516
+ expires: additional_data.expires,
1517
+ expiry_time: additional_data.expiry_time,
1518
+ location_id: additional_data.location_id,
1519
+ user_id: additional_data.user_id,
1520
+ };
1521
+ return result;
1522
+ }))
1523
+ .toPromise();
1429
1524
  }
1430
- updateLocation(location_id) {
1431
- const body = { location_id };
1432
- return this.http
1433
- .post(`${this.config.api_url}/set-session-location.php`, body, {
1434
- headers: {
1435
- 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
1436
- },
1437
- responseType: 'json',
1438
- observe: 'body',
1439
- })
1440
- .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
1441
- this.sessionService.handleUpdateSession({ location_id });
1442
- return new EsolveLocationUpdateResult(response);
1443
- })));
1525
+ // Handlers
1526
+ handleExpiration() {
1527
+ return (session) => {
1528
+ this.checkAccessToken(session).then((response) => {
1529
+ this.handleAuthentication(response);
1530
+ }, () => {
1531
+ this.logout();
1532
+ });
1533
+ };
1444
1534
  }
1445
- getTransactions(options = {}) {
1446
- try {
1447
- this.loginGuard();
1448
- return this.http
1449
- .get(`${this.config.api_url}/get-transactions.php`, {
1450
- params: {
1451
- user_id: this.user_id,
1452
- ...options,
1453
- }
1454
- })
1455
- .pipe(map((response) => {
1456
- if (response.records === undefined) {
1457
- throw response;
1458
- }
1459
- const items = this.processTransactions(response.records);
1460
- const total = +response.additional_data.total_records ?? 0;
1461
- const rows = options.rows ?? total;
1462
- const page = options.page || 1;
1463
- return new EsolveTransactionList(items, page, rows, total);
1464
- }));
1465
- }
1466
- catch (error) {
1467
- return throwError(error);
1535
+ handleAuthentication(result) {
1536
+ if (!result.key) {
1537
+ return;
1468
1538
  }
1539
+ this.session.handleSession(+result.user_id, +result.location_id, result.key, +result.expiry_time, +result.expires, this.handleExpiration());
1469
1540
  }
1470
- getTransaction(id) {
1471
- try {
1472
- this.loginGuard();
1473
- return this.http
1474
- .get(`${this.config.api_url}/get-transactions.php`, {
1475
- params: {
1476
- user_id: this.user_id,
1477
- transaction_id: id,
1478
- }
1479
- })
1480
- .pipe(map((response) => {
1481
- if ((response.records === undefined) ||
1482
- (response.records.length <= 0)) {
1483
- throw response;
1484
- }
1485
- const items = this.processTransactions(response.records);
1486
- return items[0];
1487
- }));
1488
- }
1489
- catch (error) {
1541
+ handleError(errorRes) {
1542
+ const error = {
1543
+ message: 'An unknown error occurred',
1544
+ data: {},
1545
+ };
1546
+ if ((!errorRes.type) ||
1547
+ (!errorRes.service_type) ||
1548
+ (!errorRes.message)) {
1490
1549
  return throwError(error);
1491
1550
  }
1492
- }
1493
- processUserAccount(record) {
1494
- if (!record) {
1495
- throw new Error('Invalid record');
1496
- }
1497
- if (+record.userid !== this._user_id) {
1498
- throw new Error('Invalid user account retrieved');
1499
- }
1500
- const user_account = new EsolveUserAccount(+record.userid, record.email, record.registration_type, record.title, record.firstname, record.surname, record.initials, record.gender, record.idnumber);
1501
- user_account.contact_details = new EsolveUserAccountContact(record.telnumber, record.cellnumber, record.fax);
1502
- user_account.business_details = new EsolveUserAccountBusiness(record.busname, record.vatnum, record.busdescript, record.business_type);
1503
- return user_account;
1504
- }
1505
- processUserAddress(records) {
1506
- const user_addresses = [];
1507
- if (!records || (this._user_id === 0)) {
1508
- return user_addresses;
1509
- }
1510
- for (const record of records) {
1511
- if (+record.userid !== this._user_id) {
1512
- continue;
1513
- }
1514
- user_addresses.push(new EsolveAddress(+record.id, record.recipient, record.address_type, record.pobox, record.place_name, record.street_number, record.street, record.suburb, record.city, record.province, record.country, record.postal_code, +record.latitude, +record.longitude));
1515
- }
1516
- return user_addresses;
1517
- }
1518
- processTransactions(records) {
1519
- const transactions = [];
1520
- if (records) {
1521
- for (const record of records) {
1522
- const transaction = new EsolveTransaction(record);
1523
- transactions.push(transaction);
1524
- }
1551
+ if (errorRes.message.trim() !== '') {
1552
+ error.message = errorRes.message;
1525
1553
  }
1526
- return transactions;
1527
- }
1528
- loginGuard() {
1529
- if (this.user_id <= 0) {
1530
- this.errorHandler.throwError('login_required', 'Login is required');
1554
+ if (errorRes.additional_data) {
1555
+ error.data = errorRes.additional_data;
1531
1556
  }
1557
+ return throwError(error);
1532
1558
  }
1533
1559
  }
1534
- EsolveAccountService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAccountService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }, { token: EsolveSessionService }, { token: EsolveErrorHandlerService }, { token: EsolveResponseHandlerService }], target: i0.ɵɵFactoryTarget.Injectable });
1535
- EsolveAccountService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAccountService, providedIn: 'root' });
1536
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAccountService, decorators: [{
1560
+ EsolveAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAuthService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }, { token: EsolveSessionService }, { token: EsolveErrorHandlerService }, { token: EsolveCookieService }], target: i0.ɵɵFactoryTarget.Injectable });
1561
+ EsolveAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAuthService, providedIn: 'root' });
1562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAuthService, decorators: [{
1537
1563
  type: Injectable,
1538
1564
  args: [{
1539
1565
  providedIn: 'root',
@@ -1541,141 +1567,270 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
1541
1567
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1542
1568
  type: Inject,
1543
1569
  args: [ESOLVE_CONNECT_CONFIG]
1544
- }] }, { type: i1$2.HttpClient }, { type: EsolveSessionService }, { type: EsolveErrorHandlerService }, { type: EsolveResponseHandlerService }]; } });
1570
+ }] }, { type: i1$2.HttpClient }, { type: EsolveSessionService }, { type: EsolveErrorHandlerService }, { type: EsolveCookieService }]; } });
1571
+
1572
+ class EsolveAddress {
1573
+ constructor(id, recipient, address_type, pobox, place_name, street_number, street, suburb, city, province, country, postal_code, latitude, longitude) {
1574
+ this.id = id;
1575
+ this.recipient = recipient;
1576
+ this.address_type = address_type;
1577
+ this.pobox = pobox;
1578
+ this.place_name = place_name;
1579
+ this.street_number = street_number;
1580
+ this.street = street;
1581
+ this.suburb = suburb;
1582
+ this.city = city;
1583
+ this.province = province;
1584
+ this.country = country;
1585
+ this.postal_code = postal_code;
1586
+ this.latitude = latitude;
1587
+ this.longitude = longitude;
1588
+ }
1589
+ }
1590
+
1591
+ class EsolveAddressResult extends EsolveResponseResult {
1592
+ constructor(response) {
1593
+ super(response);
1594
+ this.id = response.esolve_id;
1595
+ this.address_validated = response.address_validated;
1596
+ this.geocode_status = response.geocode_status;
1597
+ this.geocode_result = response.geocode_result;
1598
+ }
1599
+ }
1600
+
1601
+ class EsolveUserAccount {
1602
+ constructor(esolve_id, email, registration_type, title, first_name, last_name, initials, gender, identification_number) {
1603
+ this.esolve_id = esolve_id;
1604
+ this.email = email;
1605
+ this.registration_type = registration_type;
1606
+ this.title = title;
1607
+ this.first_name = first_name;
1608
+ this.last_name = last_name;
1609
+ this.initials = initials;
1610
+ this.gender = gender;
1611
+ this.identification_number = identification_number;
1612
+ }
1613
+ }
1614
+
1615
+ class EsolveUserAccountResult extends EsolveResponseResult {
1616
+ constructor(response) {
1617
+ super(response);
1618
+ this.id = 0;
1619
+ this.id = +response.esolve_id;
1620
+ }
1621
+ }
1622
+
1623
+ class EsolveUserAccountBusiness {
1624
+ constructor(name, vat_number, description, type) {
1625
+ this.name = name;
1626
+ this.vat_number = vat_number;
1627
+ this.description = description;
1628
+ this.type = type;
1629
+ }
1630
+ }
1631
+
1632
+ class EsolveUserAccountContact {
1633
+ constructor(tel_number, cell_number, fax_number) {
1634
+ this.tel_number = tel_number;
1635
+ this.cell_number = cell_number;
1636
+ this.fax_number = fax_number;
1637
+ }
1638
+ }
1639
+
1640
+ class EsolveTransactionAddress {
1641
+ constructor(recipient, address_type, address_description, street_number, street, suburb, city, province, country, postal_code, pobox) {
1642
+ this.recipient = recipient;
1643
+ this.address_type = address_type;
1644
+ this.address_description = address_description;
1645
+ this.street_number = street_number;
1646
+ this.street = street;
1647
+ this.suburb = suburb;
1648
+ this.city = city;
1649
+ this.province = province;
1650
+ this.country = country;
1651
+ this.postal_code = postal_code;
1652
+ this.pobox = pobox;
1653
+ }
1654
+ }
1655
+
1656
+ class EsolveTransactionClient {
1657
+ constructor(id, account, company_name, branch_code, email, first_name, last_name, contact_number) {
1658
+ this.id = id;
1659
+ this.account = account;
1660
+ this.company_name = company_name;
1661
+ this.branch_code = branch_code;
1662
+ this.email = email;
1663
+ this.first_name = first_name;
1664
+ this.last_name = last_name;
1665
+ this.contact_number = contact_number;
1666
+ }
1667
+ }
1668
+
1669
+ class EsolveTransactionItem {
1670
+ constructor(code, name, qty, discount, vat_rate, price, line_total) {
1671
+ this.code = code;
1672
+ this.name = name;
1673
+ this.qty = qty;
1674
+ this.discount = discount;
1675
+ this.vat_rate = vat_rate;
1676
+ this.price = price;
1677
+ this.line_total = line_total;
1678
+ }
1679
+ }
1680
+
1681
+ class EsolveTransactionItemPrice {
1682
+ constructor(
1683
+ /**
1684
+ * Price without tax
1685
+ */
1686
+ price,
1687
+ /**
1688
+ * Price with tax
1689
+ */
1690
+ price_with_tax,
1691
+ /**
1692
+ * Price without tax and with discounts applied if applicable
1693
+ */
1694
+ price_discounted,
1695
+ /**
1696
+ * Price with tax and with discounts applied if applicable
1697
+ */
1698
+ price_with_tax_discounted) {
1699
+ this.price = price;
1700
+ this.price_with_tax = price_with_tax;
1701
+ this.price_discounted = price_discounted;
1702
+ this.price_with_tax_discounted = price_with_tax_discounted;
1703
+ }
1704
+ }
1705
+
1706
+ class EsolveLocationAddress {
1707
+ constructor(street, suburb, city, province, country, postal_code, latitude, longitude) {
1708
+ this.street = street;
1709
+ this.suburb = suburb;
1710
+ this.city = city;
1711
+ this.province = province;
1712
+ this.country = country;
1713
+ this.postal_code = postal_code;
1714
+ this.latitude = latitude;
1715
+ this.longitude = longitude;
1716
+ }
1717
+ }
1718
+
1719
+ class EsolveLocationContactInfo {
1720
+ constructor(telnumber, cellnumber, email, fax) {
1721
+ this.telnumber = telnumber;
1722
+ this.cellnumber = cellnumber;
1723
+ this.email = email;
1724
+ this.fax = fax;
1725
+ }
1726
+ }
1545
1727
 
1546
- class EsolveBanner {
1547
- constructor(id, banner_display_container, identifier, type, title, article, sort_priority, link, images) {
1548
- this.id = id;
1549
- this.banner_display_container = banner_display_container;
1550
- this.identifier = identifier;
1551
- this.type = type;
1552
- this.title = title;
1553
- this.article = article;
1554
- this.sort_priority = sort_priority;
1555
- this.link = link;
1556
- this.desktop_images = [];
1557
- this.mobile_images = [];
1558
- this.sub_images = [];
1559
- if (images.desktop) {
1560
- this.desktop_images = images.desktop;
1561
- }
1562
- if (images.mobile) {
1563
- this.mobile_images = images.mobile;
1564
- }
1565
- if (images.sub) {
1566
- this.sub_images = images.sub;
1567
- }
1728
+ class EsolveLocationPOBoxAddress {
1729
+ constructor(pobox, city, postal_code) {
1730
+ this.pobox = pobox;
1731
+ this.city = city;
1732
+ this.postal_code = postal_code;
1568
1733
  }
1569
1734
  }
1570
1735
 
1571
- class EsolveBannerImage {
1572
- constructor(id, image_type, width, height, filename, hotspots) {
1573
- this.id = id;
1574
- this.image_type = image_type;
1575
- this.width = width;
1576
- this.height = height;
1577
- this.filename = filename;
1578
- this.hotspots = hotspots;
1736
+ class EsolveLocationTradingTimes {
1737
+ constructor(monday, tuesday, wednesday, thursday, friday, saturday, sunday, public_holiday, trading_hours_additional_info = '') {
1738
+ this.monday = monday;
1739
+ this.tuesday = tuesday;
1740
+ this.wednesday = wednesday;
1741
+ this.thursday = thursday;
1742
+ this.friday = friday;
1743
+ this.saturday = saturday;
1744
+ this.sunday = sunday;
1745
+ this.public_holiday = public_holiday;
1746
+ this.trading_hours_additional_info = trading_hours_additional_info;
1579
1747
  }
1580
- get src() {
1581
- return '/images/banners/' + this.filename;
1748
+ }
1749
+
1750
+ class EsolveLocationTradingDay {
1751
+ constructor(open, close) {
1752
+ this.open = open;
1753
+ this.close = close;
1582
1754
  }
1583
1755
  }
1584
1756
 
1585
- class EsolveBannerImageHotspot {
1586
- constructor(url, target, coords, coords_string) {
1587
- this.url = url;
1588
- this.target = target;
1589
- this.coords = coords;
1590
- this.coords_string = coords_string;
1757
+ class EsolveLocation {
1758
+ constructor(record) {
1759
+ this.id = +record.id;
1760
+ this.identifier = record.identifier;
1761
+ this.description = record.description;
1762
+ this.head_office = record.head_office;
1763
+ this.erp_identifier = record.erp_identifier;
1764
+ this.external_system_code = record.external_system_code;
1765
+ this.default_location_for_payment_methods = record.default_location_for_payment_methods;
1766
+ this.userid = +record.userid;
1767
+ this.importance = +record.importance;
1768
+ this.active = record.is_active;
1769
+ this.website_url = record.website_url;
1770
+ this.address = new EsolveLocationAddress(record.street, record.suburb, record.city, record.province, record.country, record.postal_code, +record.latitude, +record.longitude);
1771
+ this.pobox_address = new EsolveLocationPOBoxAddress(record.pobox, record.pobox_city, record.pobox_postal_code);
1772
+ const telnumbers = [];
1773
+ if (record.branch_telnumber.length > 0) {
1774
+ telnumbers.push(record.branch_telnumber);
1775
+ }
1776
+ if (record.branch_telnumber_2.length > 0) {
1777
+ telnumbers.push(record.branch_telnumber_2);
1778
+ }
1779
+ if (record.branch_telnumber_3.length > 0) {
1780
+ telnumbers.push(record.branch_telnumber_3);
1781
+ }
1782
+ this.contact_info = new EsolveLocationContactInfo(telnumbers, record.branch_cellnumber, record.branch_email, record.branch_fax);
1783
+ const monday = new EsolveLocationTradingDay(record.monday_open_time, record.monday_close_time);
1784
+ const tuesday = new EsolveLocationTradingDay(record.tuesday_open_time, record.tuesday_close_time);
1785
+ const wednesday = new EsolveLocationTradingDay(record.wednesday_open_time, record.wednesday_close_time);
1786
+ const thursday = new EsolveLocationTradingDay(record.thursday_open_time, record.thursday_close_time);
1787
+ const friday = new EsolveLocationTradingDay(record.friday_open_time, record.friday_close_time);
1788
+ const saturday = new EsolveLocationTradingDay(record.saturday_open_time, record.saturday_close_time);
1789
+ const sunday = new EsolveLocationTradingDay(record.sunday_open_time, record.sunday_close_time);
1790
+ const public_holiday = new EsolveLocationTradingDay(record.public_holiday_open_time, record.public_holiday_close_time);
1791
+ this.trading_times = new EsolveLocationTradingTimes(monday, tuesday, wednesday, thursday, friday, saturday, sunday, public_holiday, record.trading_hours_additional_info);
1591
1792
  }
1592
1793
  }
1593
1794
 
1594
- class EsolveBannerService {
1795
+ class EsolveLocationsService {
1595
1796
  constructor(config, http) {
1596
1797
  this.config = config;
1597
1798
  this.http = http;
1598
1799
  }
1599
1800
  /**
1600
- * Retrieves banners records from eSolve instance
1801
+ * Retrieves a list of stock locations
1601
1802
  *
1602
- * @returns An observable of eSolve banners.
1803
+ * @returns An `Observable` with an array of stock locations
1603
1804
  */
1604
- getBanners(identifier, banner_display_container, enable_date_filter = false) {
1605
- let params = new HttpParams({
1606
- fromObject: { enable_date_filter }
1607
- });
1608
- if (identifier) {
1609
- params = params.set('identifier', identifier);
1610
- }
1611
- if (banner_display_container) {
1612
- params = params.set('banner_display_container', banner_display_container);
1613
- }
1805
+ getStockLocations() {
1614
1806
  return this.http
1615
- .get(`${this.config.api_url}/get-banners.php`, { params })
1807
+ .get(`${this.config.api_url}/get-locations.php`)
1616
1808
  .pipe(map((response) => {
1617
1809
  if (response.records === undefined) {
1618
1810
  throw response;
1619
1811
  }
1620
- return this.processBanners(response.records);
1812
+ return this.processStockLocations(response.records);
1621
1813
  }));
1622
1814
  }
1623
- processBannerImageHotspots(hotspot_records) {
1624
- const hotspots = [];
1625
- if (hotspot_records.length > 0) {
1626
- for (const hotspot_record of hotspot_records) {
1627
- const hotspot = new EsolveBannerImageHotspot(hotspot_record.url, hotspot_record.target, hotspot_record.coords, hotspot_record.coords_string);
1628
- hotspots.push(hotspot);
1629
- }
1630
- }
1631
- return hotspots;
1632
- }
1633
- processBannerImages(image_records, banner_type) {
1634
- const images = [];
1635
- if (image_records.length > 0) {
1636
- for (const image_record of image_records) {
1637
- const image = new EsolveBannerImage(+image_record.id, image_record.image_type, +image_record.width, +image_record.height, image_record.filename);
1638
- if ((banner_type === 'hotspot') && (image_record.hotspots)) {
1639
- const hotspots = this.processBannerImageHotspots(image_record.hotspots);
1640
- image.hotspots = hotspots;
1641
- }
1642
- images.push(image);
1643
- }
1644
- }
1645
- return images;
1646
- }
1647
1815
  /**
1648
- * Process banner records into banner objects
1649
- * @param records Array of records
1650
- * @returns List of banners
1816
+ * Processes the eSolve stock location records.
1817
+ *
1818
+ * @param records Records to process
1819
+ * @returns An array of processed stock location records
1651
1820
  */
1652
- processBanners(records) {
1653
- const banners = [];
1654
- if ((records) && (records.length > 0)) {
1821
+ processStockLocations(records) {
1822
+ const stock_locations = [];
1823
+ if (records) {
1655
1824
  for (const record of records) {
1656
- const image_sets = {};
1657
- if (record.images.desktop) {
1658
- image_sets.desktop = this.processBannerImages(record.images.desktop, record.type);
1659
- }
1660
- if (record.images.mobile) {
1661
- image_sets.mobile = this.processBannerImages(record.images.mobile, record.type);
1662
- }
1663
- if (record.images.sub) {
1664
- image_sets.sub = this.processBannerImages(record.images.sub, record.type);
1665
- }
1666
- const banner = new EsolveBanner(+record.id, record.banner_display_container, record.identifier, record.type, record.title, record.article, +record.sort_priority, {
1667
- url: record.link.url,
1668
- target: record.link.target
1669
- }, image_sets);
1670
- banners.push(banner);
1825
+ stock_locations.push(new EsolveLocation(record));
1671
1826
  }
1672
1827
  }
1673
- return banners;
1828
+ return stock_locations;
1674
1829
  }
1675
1830
  }
1676
- EsolveBannerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveBannerService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1677
- EsolveBannerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveBannerService, providedIn: 'root' });
1678
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveBannerService, decorators: [{
1831
+ EsolveLocationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveLocationsService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1832
+ EsolveLocationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveLocationsService, providedIn: 'root' });
1833
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveLocationsService, decorators: [{
1679
1834
  type: Injectable,
1680
1835
  args: [{
1681
1836
  providedIn: 'root',
@@ -1685,253 +1840,422 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
1685
1840
  args: [ESOLVE_CONNECT_CONFIG]
1686
1841
  }] }, { type: i1$2.HttpClient }]; } });
1687
1842
 
1688
- // Types
1843
+ class EsolveTransactionLocation extends EsolveLocation {
1844
+ }
1845
+
1846
+ class EsolveTransactionPaymentMethod {
1847
+ constructor(id, name, description, integration_type, service_provider) {
1848
+ this.id = id;
1849
+ this.name = name;
1850
+ this.description = description;
1851
+ this.integration_type = integration_type;
1852
+ this.service_provider = service_provider;
1853
+ }
1854
+ }
1855
+
1856
+ class EsolveTransactionShippingMethod {
1857
+ constructor(id, name, delivery_category, location, description, pricing, client_to_collect) {
1858
+ this.id = id;
1859
+ this.name = name;
1860
+ this.delivery_category = delivery_category;
1861
+ this.location = location;
1862
+ this.description = description;
1863
+ this.pricing = pricing;
1864
+ this.client_to_collect = client_to_collect;
1865
+ }
1866
+ }
1867
+
1868
+ class EsolveTransactionUser {
1869
+ constructor(id, email, first_name, last_name, tel_number, cell_number) {
1870
+ this.id = id;
1871
+ this.email = email;
1872
+ this.first_name = first_name;
1873
+ this.last_name = last_name;
1874
+ this.tel_number = tel_number;
1875
+ this.cell_number = cell_number;
1876
+ }
1877
+ }
1878
+
1879
+ class EsolveTransaction {
1880
+ constructor(record) {
1881
+ // Transaction Items
1882
+ this.items = [];
1883
+ this.id = +record.id;
1884
+ this.type = record.transaction_type;
1885
+ this.status = record.status;
1886
+ this.loyalty_number = record.loyaltynumber;
1887
+ this.external_order_number = record.external_order_number;
1888
+ this.external_invoice_number = record.external_invoice_number;
1889
+ this.date = new Date(+record.txdate_timestamp * 1000);
1890
+ this.expected_date = new Date(+record.expected_date_timestamp * 1000);
1891
+ this.invoice_amount = +record.invoice_amount;
1892
+ this.vat = +record.vat;
1893
+ this.discount = +record.discount;
1894
+ this.total = +record.total;
1895
+ this.shipping_total = +record.shipping_total;
1896
+ this.insurance_total = +record.insurance_total;
1897
+ this.payment = +record.payment;
1898
+ this.payment_reference = record.payment_reference;
1899
+ this.payment_description = record.payment_description;
1900
+ this.gateway_transaction_id = record.gateway_transaction_id;
1901
+ this.address = new EsolveTransactionAddress(record.recipient, record.address_type, record.address_description, record.street_number, record.street, record.suburb, record.city, record.province, record.country, record.postal_code, record.pobox);
1902
+ if (record.user) {
1903
+ this.user = new EsolveTransactionUser(+record.user.id, record.user.email, record.user.firstname, record.user.surname, record.user.telnumber, record.user.cellnumber);
1904
+ }
1905
+ if (record.client) {
1906
+ this.client = new EsolveTransactionClient(+record.client.id, record.client.account, record.client.company_name, record.client.branch_code, record.client.email, record.client.firstname, record.client.surname, record.client.contact_number);
1907
+ }
1908
+ if (record.location_details) {
1909
+ this.location = new EsolveTransactionLocation(record.location_details);
1910
+ }
1911
+ if (record.payment_method_details) {
1912
+ this.payment_method = new EsolveTransactionPaymentMethod(record.payment_method_details.id, record.payment_method_details.paymethod_name, record.payment_method_details.description, record.payment_method_details.integration_type, record.payment_method_details.service_provider);
1913
+ }
1914
+ if (record.shipping_method_details) {
1915
+ this.shipping_method = new EsolveTransactionShippingMethod(+record.shipping_method_details.id, record.shipping_method_details.carrier_name, record.shipping_method_details.delivery_category, record.shipping_method_details.location, record.shipping_method_details.description, record.shipping_method_details.pricing, !!record.shipping_method_details.client_to_collect);
1916
+ }
1917
+ this.parseTransactionItems(record.transaction_items);
1918
+ }
1919
+ parseTransactionItems(record_items) {
1920
+ for (const record_item of record_items) {
1921
+ const price = new EsolveTransactionItemPrice(+record_item.price_exclusive, +record_item.price_inclusive, +record_item.price_exclusive_after_discount, +record_item.price_inclusive_after_discount);
1922
+ const line_total = new EsolveTransactionItemPrice(+record_item.line_total_exclusive, +record_item.line_total_inclusive, +record_item.line_total_exclusive_after_discount, +record_item.line_total_inclusive_after_discount);
1923
+ const item = new EsolveTransactionItem(record_item.code, record_item.name, +record_item.qty, +record_item.discount, +record_item.vat_rate, price, line_total);
1924
+ this.items.push(item);
1925
+ }
1926
+ }
1927
+ }
1928
+
1929
+ class EsolveTransactionList extends EsolveList {
1930
+ }
1689
1931
 
1690
- class EsolveHeading {
1691
- constructor(identifier, value) {
1692
- this.identifier = identifier;
1693
- this.value = value;
1932
+ // Classes
1933
+
1934
+ class EsolveChangePasswordResult extends EsolveResponseResult {
1935
+ constructor(response) {
1936
+ super(response);
1937
+ this.password_updated = (response.status.state === 'success');
1694
1938
  }
1695
1939
  }
1696
1940
 
1697
- class EsolveMediaArticle {
1698
- constructor(identifier, title, article, image_url = '', tags = [], topics = [], seo_title = '', seo_keywords = '', seo_description = '') {
1699
- this.identifier = identifier;
1700
- this.title = title;
1701
- this.article = article;
1702
- this.image_url = image_url;
1703
- this.tags = tags;
1704
- this.topics = topics;
1705
- if (seo_title.trim() === '') {
1706
- seo_title = this.title;
1707
- }
1708
- this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
1941
+ class EsolveResetPasswordResult extends EsolveResponseResult {
1942
+ constructor(response) {
1943
+ super(response);
1944
+ this.id = response.esolve_id;
1945
+ this.reset_success = response.reset_success;
1946
+ this.password_matches_old = response.password_matches_old;
1947
+ this.login_required = response.login_required;
1709
1948
  }
1710
1949
  }
1711
1950
 
1712
- class EsolveTag {
1713
- constructor(id, tag_phrase, tag_weight, description) {
1714
- this.id = id;
1715
- this.tag_phrase = tag_phrase;
1716
- this.tag_weight = tag_weight;
1717
- this.description = description;
1951
+ class EsolveRegistrationResult extends EsolveResponseResult {
1952
+ constructor(response) {
1953
+ super(response);
1954
+ this.user_id = response.esolve_id;
1955
+ this.guest = response.guest;
1956
+ this.auto_login = response.auto_login;
1957
+ this.authentication_required = response.authentication_required;
1958
+ this.location_id = response.session_data.location_id;
1718
1959
  }
1719
1960
  }
1720
1961
 
1721
- class EsolveTopic {
1722
- constructor(id, name, short_description, sort_priority) {
1723
- this.id = id;
1724
- this.name = name;
1725
- this.short_description = short_description;
1726
- this.sort_priority = sort_priority;
1962
+ class EsolveLocationUpdateResult extends EsolveResponseResult {
1963
+ constructor(response) {
1964
+ super(response);
1965
+ this.location_updated = (response.esolve_id > 0);
1727
1966
  }
1728
1967
  }
1729
1968
 
1730
- class EsolveTopicService {
1731
- constructor(config, http) {
1969
+ class EsolveAccountService {
1970
+ constructor(config, http, sessionService, errorHandler, responseHandler) {
1732
1971
  this.config = config;
1733
1972
  this.http = http;
1973
+ this.sessionService = sessionService;
1974
+ this.errorHandler = errorHandler;
1975
+ this.responseHandler = responseHandler;
1976
+ this._user_id = 0;
1977
+ this.sessionService.session.subscribe((session) => {
1978
+ if (session.key !== '') {
1979
+ this.user_id = session.id;
1980
+ }
1981
+ });
1734
1982
  }
1735
- /**
1736
- * Retrieves active topics from the list of topic ID's. Note that inactive or expired
1737
- * topics will not be retrieved.
1738
- *
1739
- * @param topic_id_list List of topic ID's that need to be retrieved
1740
- */
1741
- getTopics(topic_id_list = []) {
1742
- let params = new HttpParams();
1743
- if (topic_id_list.length > 0) {
1744
- params = params.append('topic_id', topic_id_list.join(','));
1983
+ get user_id() {
1984
+ return this._user_id;
1985
+ }
1986
+ set user_id(value) {
1987
+ value = ((value > 0) ? value : 0);
1988
+ if (this._user_id !== value) {
1989
+ this._user_id = value;
1745
1990
  }
1746
- return this.http.get(`${this.config.api_url}/get-topics.php`, { params }).pipe(map(response => {
1747
- if (response.records === undefined) {
1991
+ }
1992
+ updateUserAccount(user_account_data) {
1993
+ const body = {
1994
+ account: user_account_data
1995
+ };
1996
+ return this.http
1997
+ .post(`${this.config.api_url}/set-user-account.php`, body, {
1998
+ headers: {
1999
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
2000
+ },
2001
+ responseType: 'json',
2002
+ observe: 'body'
2003
+ })
2004
+ .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveUserAccountResult(response))), catchError((errorRes) => {
2005
+ return this.errorHandler.handleHttpPostError('set-user-account', errorRes);
2006
+ }));
2007
+ }
2008
+ getUserAccount() {
2009
+ return this.http
2010
+ .get(`${this.config.api_url}/get-account.php`)
2011
+ .pipe(map((response) => {
2012
+ if ((response.records === undefined) ||
2013
+ (response.records.length === 0)) {
1748
2014
  throw response;
1749
2015
  }
1750
- return this.processTopics(response.records);
2016
+ const record = response.records[0];
2017
+ return this.processUserAccount(record);
1751
2018
  }));
1752
2019
  }
1753
- processTopics(records) {
1754
- const topics = [];
1755
- if (records) {
1756
- for (const record of records) {
1757
- const topic = new EsolveTopic(+record.id, record.name, record.short_description, +record.sort_priority);
1758
- topics.push(topic);
1759
- }
2020
+ setAddress(address_post_data) {
2021
+ const body = {
2022
+ address: address_post_data
2023
+ };
2024
+ return this.http
2025
+ .post(`${this.config.api_url}/set-address.php`, body, {
2026
+ headers: {
2027
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;',
2028
+ },
2029
+ responseType: 'json',
2030
+ observe: 'body',
2031
+ })
2032
+ .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => new EsolveAddressResult(response))), catchError((errorRes) => {
2033
+ return this.errorHandler.handleHttpPostError('set-registration', errorRes);
2034
+ }));
2035
+ }
2036
+ getAddresses() {
2037
+ try {
2038
+ this.loginGuard();
2039
+ return this.http
2040
+ .get(`${this.config.api_url}/get-addresses.php`, {
2041
+ params: { user_id: this.user_id }
2042
+ })
2043
+ .pipe(map((response) => {
2044
+ if (response.records === undefined) {
2045
+ throw response;
2046
+ }
2047
+ return this.processUserAddress(response.records);
2048
+ }));
2049
+ }
2050
+ catch (error) {
2051
+ return throwError(error);
1760
2052
  }
1761
- return topics;
1762
2053
  }
1763
- }
1764
- EsolveTopicService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTopicService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1765
- EsolveTopicService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTopicService, providedIn: 'root' });
1766
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveTopicService, decorators: [{
1767
- type: Injectable,
1768
- args: [{
1769
- providedIn: 'root',
1770
- }]
1771
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1772
- type: Inject,
1773
- args: [ESOLVE_CONNECT_CONFIG]
1774
- }] }, { type: i1$2.HttpClient }]; } });
1775
-
1776
- class EsolveMediaService {
1777
- constructor(config, http) {
1778
- this.config = config;
1779
- this.http = http;
2054
+ deleteAddress(id) {
2055
+ return this.http
2056
+ .delete(`${this.config.api_url}/delete-address.php`, {
2057
+ params: { id },
2058
+ responseType: 'json',
2059
+ observe: 'body'
2060
+ })
2061
+ .pipe(map((http_response) => {
2062
+ if ((http_response.result === undefined) ||
2063
+ (http_response.result === null) ||
2064
+ (http_response.result.status !== 'success')) {
2065
+ throw http_response;
2066
+ }
2067
+ return new EsolveResult(http_response.result.status, http_response.result.code, http_response.result.message);
2068
+ }), catchError((errorRes) => {
2069
+ return this.errorHandler.handleHttpDeleteError('delete-address', errorRes);
2070
+ }));
1780
2071
  }
1781
- /**
1782
- * Retrieves the media record from the eSolve instance using the identifier
1783
- *
1784
- * @param identifier String representing the eSolve media identifier
1785
- */
1786
- getMediaArticle(identifier) {
1787
- const params = new HttpParams({ fromObject: { identifier } });
1788
- // TODO: Error Handling
1789
- return this.getMediaRecords(params).pipe(map((response) => {
1790
- if ((response.records === undefined) ||
1791
- (response.records.length <= 0)) {
1792
- throw response;
2072
+ register(user_registration) {
2073
+ const body = {
2074
+ user: user_registration
2075
+ };
2076
+ return this.http
2077
+ .post(`${this.config.api_url}/set-registration.php`, body, {
2078
+ headers: {
2079
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
2080
+ },
2081
+ responseType: 'json',
2082
+ observe: 'body'
2083
+ })
2084
+ .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
2085
+ if (response.auto_login) {
2086
+ this.sessionService.handleUpdateSession({
2087
+ user_id: +response.esolve_id,
2088
+ location_id: +response.session_data.location_id,
2089
+ });
1793
2090
  }
1794
- const mediaRecord = response.records[0];
1795
- if (!mediaRecord.active) {
2091
+ return new EsolveRegistrationResult(response);
2092
+ })), catchError((errorRes) => {
2093
+ return this.errorHandler.handleHttpPostError('set-registration', errorRes);
2094
+ }));
2095
+ }
2096
+ changePassword(password, confirm_password) {
2097
+ const body = {
2098
+ password,
2099
+ confirm_password
2100
+ };
2101
+ return this.http
2102
+ .post(`${this.config.api_url}/set-change-password.php`, body, {
2103
+ headers: {
2104
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
2105
+ },
2106
+ responseType: 'json',
2107
+ observe: 'body'
2108
+ })
2109
+ .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
2110
+ return new EsolveChangePasswordResult(response);
2111
+ })), catchError((errorRes) => {
2112
+ return this.errorHandler.handleHttpPostError('set-change-password', errorRes);
2113
+ }));
2114
+ }
2115
+ sendForgotPasswordRequest(email) {
2116
+ return this.http
2117
+ .get(`${this.config.api_url}/get-forgot-password.php`, { params: { email } })
2118
+ .pipe(map((response) => {
2119
+ if ((response.records === undefined) ||
2120
+ !('reset_link_sent' in response.records)) {
1796
2121
  throw response;
1797
2122
  }
1798
- return this.processMediaRecord(mediaRecord);
2123
+ return response.records.reset_link_sent;
1799
2124
  }));
1800
2125
  }
1801
- /**
1802
- * Retrieves a group of media records from the eSolve instance linked to a group
1803
- *
1804
- * @param media_group String representing the eSolve media group
1805
- */
1806
- getGroupedMediaArticles(media_group) {
1807
- const params = new HttpParams({
1808
- fromObject: { media_group_sef: media_group }
1809
- });
1810
- return this.getMediaRecords(params).pipe(map((response) => {
1811
- const mediaArticles = [];
1812
- if ((response.records !== undefined) &&
1813
- (response.records.length > 0)) {
1814
- for (const mediaRecord of response.records) {
1815
- if (mediaRecord.active) {
1816
- mediaArticles.push(this.processMediaRecord(mediaRecord));
1817
- }
1818
- }
2126
+ resetPassword(reset_key, password, confirm_password, auto_login = true) {
2127
+ return this.http
2128
+ .post(`${this.config.api_url}/set-forgot-password.php`, {
2129
+ reset_key,
2130
+ password,
2131
+ confirm_password,
2132
+ auto_login
2133
+ }, {
2134
+ headers: {
2135
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
2136
+ },
2137
+ responseType: 'json',
2138
+ observe: 'body'
2139
+ })
2140
+ .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
2141
+ if (!response.login_required) {
2142
+ this.sessionService.handleUpdateSession({
2143
+ user_id: +response.esolve_id,
2144
+ location_id: +response.session_data.location_id,
2145
+ });
1819
2146
  }
1820
- return mediaArticles;
2147
+ return new EsolveResetPasswordResult(response);
2148
+ })), catchError((errorRes) => {
2149
+ return this.errorHandler.handleHttpPostError('set-forgot-password', errorRes);
1821
2150
  }));
1822
2151
  }
1823
- /**
1824
- * Retrieves the media heading records from the eSolve instance using the identifiers
1825
- *
1826
- * @param identifiers Array of strings representing the eSolve heading identifiers
1827
- */
1828
- getHeadings(identifiers) {
2152
+ updateLocation(location_id) {
2153
+ const body = { location_id };
1829
2154
  return this.http
1830
- .get(`${this.config.api_url}/get-headings.php`, {
1831
- params: {
1832
- identifier: identifiers.join(','),
2155
+ .post(`${this.config.api_url}/set-session-location.php`, body, {
2156
+ headers: {
2157
+ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
1833
2158
  },
2159
+ responseType: 'json',
2160
+ observe: 'body',
1834
2161
  })
1835
- .pipe(map((response) => {
1836
- const headings = [];
1837
- if ((response.records !== undefined) &&
1838
- (response.records.length > 0)) {
1839
- for (const heading_record of response.records) {
1840
- headings.push(this.processHeadingRecord(heading_record));
1841
- }
1842
- }
1843
- return headings;
1844
- }));
2162
+ .pipe(map((http_response) => this.responseHandler.validateSingleHttpResponse(http_response, (response) => {
2163
+ this.sessionService.handleUpdateSession({ location_id });
2164
+ return new EsolveLocationUpdateResult(response);
2165
+ })));
1845
2166
  }
1846
- /**
1847
- * Processes media article record
1848
- *
1849
- * @param record Record from eSolve instance
1850
- */
1851
- processMediaRecord(record) {
1852
- const tags = [];
1853
- const topics = [];
1854
- if ((record.tags) && (record.tags.length > 0)) {
1855
- for (const tag of record.tags) {
1856
- tags.push(new EsolveTag(+tag.id, tag.tag_phrase, +tag.tag_weight, tag.description));
1857
- }
2167
+ getTransactions(options = {}) {
2168
+ try {
2169
+ this.loginGuard();
2170
+ return this.http
2171
+ .get(`${this.config.api_url}/get-transactions.php`, {
2172
+ params: {
2173
+ user_id: this.user_id,
2174
+ ...options,
2175
+ }
2176
+ })
2177
+ .pipe(map((response) => {
2178
+ if (response.records === undefined) {
2179
+ throw response;
2180
+ }
2181
+ const items = this.processTransactions(response.records);
2182
+ const total = +response.additional_data.total_records ?? 0;
2183
+ const rows = options.rows ?? total;
2184
+ const page = options.page || 1;
2185
+ return new EsolveTransactionList(items, page, rows, total);
2186
+ }));
1858
2187
  }
1859
- if ((record.topics) && (record.topics.length > 0)) {
1860
- for (const topic of record.topics) {
1861
- topics.push(new EsolveTopic(+topic.id, topic.name, topic.short_description, +topic.sort_priority));
1862
- }
2188
+ catch (error) {
2189
+ return throwError(error);
1863
2190
  }
1864
- return new EsolveMediaArticle(record.identifier, record.title, record.article, record.image_url, tags, topics, record.seo_page_title, record.seo_keywords, record.seo_description);
1865
- }
1866
- /**
1867
- * Processes media heading record
1868
- *
1869
- * @param record Record from eSolve instance
1870
- */
1871
- processHeadingRecord(record) {
1872
- return new EsolveHeading(record.identifier, record.value);
1873
- }
1874
- /**
1875
- * Retrieves media records from eSolve instance.
1876
- *
1877
- * @param params HTTP params
1878
- */
1879
- getMediaRecords(params) {
1880
- return this.http.get(`${this.config.api_url}/get-media.php`, { params });
1881
2191
  }
1882
- }
1883
- EsolveMediaService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMediaService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1884
- EsolveMediaService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMediaService, providedIn: 'root' });
1885
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMediaService, decorators: [{
1886
- type: Injectable,
1887
- args: [{
1888
- providedIn: 'root',
1889
- }]
1890
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1891
- type: Inject,
1892
- args: [ESOLVE_CONNECT_CONFIG]
1893
- }] }, { type: i1$2.HttpClient }]; } });
1894
-
1895
- class EsolveMenuItem {
1896
- constructor(url, name, target, children = []) {
1897
- this.url = url;
1898
- this.name = name;
1899
- this.target = target;
1900
- this.children = children;
2192
+ getTransaction(id) {
2193
+ try {
2194
+ this.loginGuard();
2195
+ return this.http
2196
+ .get(`${this.config.api_url}/get-transactions.php`, {
2197
+ params: {
2198
+ user_id: this.user_id,
2199
+ transaction_id: id,
2200
+ }
2201
+ })
2202
+ .pipe(map((response) => {
2203
+ if ((response.records === undefined) ||
2204
+ (response.records.length <= 0)) {
2205
+ throw response;
2206
+ }
2207
+ const items = this.processTransactions(response.records);
2208
+ return items[0];
2209
+ }));
2210
+ }
2211
+ catch (error) {
2212
+ return throwError(error);
2213
+ }
1901
2214
  }
1902
- }
1903
-
1904
- class EsolveMenuService {
1905
- constructor(config, http) {
1906
- this.config = config;
1907
- this.http = http;
2215
+ processUserAccount(record) {
2216
+ if (!record) {
2217
+ throw new Error('Invalid record');
2218
+ }
2219
+ if (+record.userid !== this._user_id) {
2220
+ throw new Error('Invalid user account retrieved');
2221
+ }
2222
+ const user_account = new EsolveUserAccount(+record.userid, record.email, record.registration_type, record.title, record.firstname, record.surname, record.initials, record.gender, record.idnumber);
2223
+ user_account.contact_details = new EsolveUserAccountContact(record.telnumber, record.cellnumber, record.fax);
2224
+ user_account.business_details = new EsolveUserAccountBusiness(record.busname, record.vatnum, record.busdescript, record.business_type);
2225
+ return user_account;
1908
2226
  }
1909
- getMenuTree(identifier) {
1910
- return this.http
1911
- .get(`${this.config.api_url}/get-menu-tree.php`, { params: { identifier } })
1912
- .pipe(map((response) => {
1913
- if ((!response) || (response.records === undefined)) {
1914
- throw response;
1915
- }
1916
- else if (response.records.length === 0) {
1917
- return [];
2227
+ processUserAddress(records) {
2228
+ const user_addresses = [];
2229
+ if (!records || (this._user_id === 0)) {
2230
+ return user_addresses;
2231
+ }
2232
+ for (const record of records) {
2233
+ if (+record.userid !== this._user_id) {
2234
+ continue;
1918
2235
  }
1919
- return this.handleMenu(response.records);
1920
- }));
2236
+ user_addresses.push(new EsolveAddress(+record.id, record.recipient, record.address_type, record.pobox, record.place_name, record.street_number, record.street, record.suburb, record.city, record.province, record.country, record.postal_code, +record.latitude, +record.longitude));
2237
+ }
2238
+ return user_addresses;
1921
2239
  }
1922
- handleMenu(records) {
1923
- const menu = [];
1924
- if (typeof records !== 'undefined') {
1925
- for (const menuTreeRecord of records) {
1926
- menu.push(new EsolveMenuItem(menuTreeRecord.sef_url, menuTreeRecord.name, menuTreeRecord.target, this.handleMenu(menuTreeRecord.children)));
2240
+ processTransactions(records) {
2241
+ const transactions = [];
2242
+ if (records) {
2243
+ for (const record of records) {
2244
+ const transaction = new EsolveTransaction(record);
2245
+ transactions.push(transaction);
1927
2246
  }
1928
2247
  }
1929
- return menu;
2248
+ return transactions;
2249
+ }
2250
+ loginGuard() {
2251
+ if (this.user_id <= 0) {
2252
+ this.errorHandler.throwError('login_required', 'Login is required');
2253
+ }
1930
2254
  }
1931
2255
  }
1932
- EsolveMenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMenuService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1933
- EsolveMenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMenuService, providedIn: 'root' });
1934
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMenuService, decorators: [{
2256
+ EsolveAccountService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAccountService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }, { token: EsolveSessionService }, { token: EsolveErrorHandlerService }, { token: EsolveResponseHandlerService }], target: i0.ɵɵFactoryTarget.Injectable });
2257
+ EsolveAccountService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAccountService, providedIn: 'root' });
2258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveAccountService, decorators: [{
1935
2259
  type: Injectable,
1936
2260
  args: [{
1937
2261
  providedIn: 'root',
@@ -1939,137 +2263,141 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
1939
2263
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1940
2264
  type: Inject,
1941
2265
  args: [ESOLVE_CONNECT_CONFIG]
1942
- }] }, { type: i1$2.HttpClient }]; } });
2266
+ }] }, { type: i1$2.HttpClient }, { type: EsolveSessionService }, { type: EsolveErrorHandlerService }, { type: EsolveResponseHandlerService }]; } });
1943
2267
 
1944
- class EsolveNewsGroup {
1945
- constructor(id, name, description, sef_name) {
2268
+ class EsolveBanner {
2269
+ constructor(id, banner_display_container, identifier, type, title, article, sort_priority, link, images) {
1946
2270
  this.id = id;
1947
- this.name = name;
1948
- this.description = description;
1949
- this.sef_name = sef_name;
2271
+ this.banner_display_container = banner_display_container;
2272
+ this.identifier = identifier;
2273
+ this.type = type;
2274
+ this.title = title;
2275
+ this.article = article;
2276
+ this.sort_priority = sort_priority;
2277
+ this.link = link;
2278
+ this.desktop_images = [];
2279
+ this.mobile_images = [];
2280
+ this.sub_images = [];
2281
+ if (images.desktop) {
2282
+ this.desktop_images = images.desktop;
2283
+ }
2284
+ if (images.mobile) {
2285
+ this.mobile_images = images.mobile;
2286
+ }
2287
+ if (images.sub) {
2288
+ this.sub_images = images.sub;
2289
+ }
1950
2290
  }
1951
2291
  }
1952
2292
 
1953
- class EsolveNewsArticle {
1954
- constructor(id, title, sef_title, article, short_description, txdate, active, image, featured, author, seo_title = '', seo_keywords = '') {
2293
+ class EsolveBannerImage {
2294
+ constructor(id, image_type, width, height, filename, hotspots) {
1955
2295
  this.id = id;
1956
- this.title = title;
1957
- this.sef_title = sef_title;
1958
- this.article = article;
1959
- this.short_description = short_description;
1960
- this.txdate = txdate;
1961
- this.active = active;
1962
- this.image = image;
1963
- this.featured = featured;
1964
- this.author = author;
1965
- if (seo_title.trim() === '') {
1966
- seo_title = this.title;
1967
- }
1968
- this.seo_details = new EsolveSeoInfo(seo_title, short_description, seo_keywords);
2296
+ this.image_type = image_type;
2297
+ this.width = width;
2298
+ this.height = height;
2299
+ this.filename = filename;
2300
+ this.hotspots = hotspots;
1969
2301
  }
1970
- }
1971
-
1972
- class EsolveNewsArticleList {
1973
- constructor(newsArticles, total, page) {
1974
- this.newsArticles = newsArticles;
1975
- this.total = total;
1976
- this.page = page;
2302
+ get src() {
2303
+ return '/images/banners/' + this.filename;
1977
2304
  }
1978
2305
  }
1979
2306
 
1980
- class EsolveNewsArticleAuthor {
1981
- constructor(userid, email, firstname, surname) {
1982
- this.userid = userid;
1983
- this.email = email;
1984
- this.firstname = firstname;
1985
- this.surname = surname;
2307
+ class EsolveBannerImageHotspot {
2308
+ constructor(url, target, coords, coords_string) {
2309
+ this.url = url;
2310
+ this.target = target;
2311
+ this.coords = coords;
2312
+ this.coords_string = coords_string;
1986
2313
  }
1987
2314
  }
1988
2315
 
1989
- class EsolveNewsService {
2316
+ class EsolveBannerService {
1990
2317
  constructor(config, http) {
1991
2318
  this.config = config;
1992
2319
  this.http = http;
1993
2320
  }
1994
- getNewsArticle(identifier) {
1995
- const params = new HttpParams({ fromObject: { sef_title: identifier } });
1996
- return this.getNewsRecords(params).pipe(map(response => {
1997
- if ((response.records === undefined) ||
1998
- (response.records.length <= 0)) {
1999
- throw response;
2000
- }
2001
- const newsRecord = response.records[0];
2002
- if (!newsRecord.active) {
2003
- throw response;
2004
- }
2005
- return this.processNewsArticle(newsRecord);
2006
- }));
2007
- }
2008
- getNewsArticles(options) {
2009
- let params = new HttpParams();
2010
- if (options.news_group_id) {
2011
- params = params.set('news_group_id', options.news_group_id.toString());
2012
- }
2013
- else if (options.news_group_sef) {
2014
- params = params.set('news_group_sef', options.news_group_sef.toString());
2015
- }
2016
- if (options.page) {
2017
- params = params.set('page', options.page.toString());
2018
- }
2019
- if (options.rows) {
2020
- params = params.set('rows', options.rows.toString());
2021
- }
2022
- if (options.feature_only) {
2023
- params = params.set('feature_only', options.feature_only.toString());
2024
- }
2025
- if (options.manufacturers_id) {
2026
- params = params.set('manufacturers_id', options.manufacturers_id.toString());
2027
- }
2028
- if (options.ranges_id) {
2029
- params = params.set('ranges_id', options.ranges_id.toString());
2030
- }
2031
- if (options.from_date) {
2032
- params = params.set('from_date', options.from_date.toString());
2321
+ /**
2322
+ * Retrieves banners records from eSolve instance
2323
+ *
2324
+ * @returns An observable of eSolve banners.
2325
+ */
2326
+ getBanners(identifier, banner_display_container, enable_date_filter = false) {
2327
+ let params = new HttpParams({
2328
+ fromObject: { enable_date_filter }
2329
+ });
2330
+ if (identifier) {
2331
+ params = params.set('identifier', identifier);
2033
2332
  }
2034
- if (options.to_date) {
2035
- params = params.set('to_date', options.to_date.toString());
2333
+ if (banner_display_container) {
2334
+ params = params.set('banner_display_container', banner_display_container);
2036
2335
  }
2037
- return this.getNewsRecords(params).pipe(map(response => {
2038
- if (response.records === undefined) {
2039
- throw response;
2040
- }
2041
- const newsArticles = [];
2042
- response.records.forEach(newsArticleRecord => {
2043
- newsArticles.push(this.processNewsArticle(newsArticleRecord));
2044
- });
2045
- return new EsolveNewsArticleList(newsArticles, response.additional_data.total_records, options.page || 0);
2046
- }));
2047
- }
2048
- getNewsGroups() {
2049
2336
  return this.http
2050
- .get(`${this.config.api_url}/get-news-groups.php`)
2337
+ .get(`${this.config.api_url}/get-banners.php`, { params })
2051
2338
  .pipe(map((response) => {
2052
2339
  if (response.records === undefined) {
2053
2340
  throw response;
2054
2341
  }
2055
- const newsGroups = [];
2056
- response.records.forEach(newsGroupRecord => {
2057
- newsGroups.push(new EsolveNewsGroup(newsGroupRecord.id, newsGroupRecord.name, newsGroupRecord.description, newsGroupRecord.sef_name));
2058
- });
2059
- return newsGroups;
2342
+ return this.processBanners(response.records);
2060
2343
  }));
2061
2344
  }
2062
- processNewsArticle(newsRecord) {
2063
- const author = new EsolveNewsArticleAuthor(newsRecord.user.userid, newsRecord.user.email, newsRecord.user.firstname, newsRecord.user.surname);
2064
- return new EsolveNewsArticle(newsRecord.id, newsRecord.title, newsRecord.sef_title, newsRecord.article, newsRecord.short_description, newsRecord.txdate, newsRecord.active, newsRecord.image, newsRecord.featured, author, newsRecord.seo_page_title, newsRecord.seo_keywords);
2345
+ processBannerImageHotspots(hotspot_records) {
2346
+ const hotspots = [];
2347
+ if (hotspot_records.length > 0) {
2348
+ for (const hotspot_record of hotspot_records) {
2349
+ const hotspot = new EsolveBannerImageHotspot(hotspot_record.url, hotspot_record.target, hotspot_record.coords, hotspot_record.coords_string);
2350
+ hotspots.push(hotspot);
2351
+ }
2352
+ }
2353
+ return hotspots;
2354
+ }
2355
+ processBannerImages(image_records, banner_type) {
2356
+ const images = [];
2357
+ if (image_records.length > 0) {
2358
+ for (const image_record of image_records) {
2359
+ const image = new EsolveBannerImage(+image_record.id, image_record.image_type, +image_record.width, +image_record.height, image_record.filename);
2360
+ if ((banner_type === 'hotspot') && (image_record.hotspots)) {
2361
+ const hotspots = this.processBannerImageHotspots(image_record.hotspots);
2362
+ image.hotspots = hotspots;
2363
+ }
2364
+ images.push(image);
2365
+ }
2366
+ }
2367
+ return images;
2065
2368
  }
2066
- getNewsRecords(params) {
2067
- return this.http.get(`${this.config.api_url}/get-news.php`, { params });
2369
+ /**
2370
+ * Process banner records into banner objects
2371
+ * @param records Array of records
2372
+ * @returns List of banners
2373
+ */
2374
+ processBanners(records) {
2375
+ const banners = [];
2376
+ if ((records) && (records.length > 0)) {
2377
+ for (const record of records) {
2378
+ const image_sets = {};
2379
+ if (record.images.desktop) {
2380
+ image_sets.desktop = this.processBannerImages(record.images.desktop, record.type);
2381
+ }
2382
+ if (record.images.mobile) {
2383
+ image_sets.mobile = this.processBannerImages(record.images.mobile, record.type);
2384
+ }
2385
+ if (record.images.sub) {
2386
+ image_sets.sub = this.processBannerImages(record.images.sub, record.type);
2387
+ }
2388
+ const banner = new EsolveBanner(+record.id, record.banner_display_container, record.identifier, record.type, record.title, record.article, +record.sort_priority, {
2389
+ url: record.link.url,
2390
+ target: record.link.target
2391
+ }, image_sets);
2392
+ banners.push(banner);
2393
+ }
2394
+ }
2395
+ return banners;
2068
2396
  }
2069
2397
  }
2070
- EsolveNewsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveNewsService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2071
- EsolveNewsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveNewsService, providedIn: 'root' });
2072
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveNewsService, decorators: [{
2398
+ EsolveBannerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveBannerService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2399
+ EsolveBannerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveBannerService, providedIn: 'root' });
2400
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveBannerService, decorators: [{
2073
2401
  type: Injectable,
2074
2402
  args: [{
2075
2403
  providedIn: 'root',
@@ -2079,175 +2407,140 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
2079
2407
  args: [ESOLVE_CONNECT_CONFIG]
2080
2408
  }] }, { type: i1$2.HttpClient }]; } });
2081
2409
 
2082
- class EsolveColour {
2083
- constructor(record) {
2084
- this.id = record.id ?? 0;
2085
- this.colour = record.colour ?? '';
2086
- this.description = record.description ?? '';
2410
+ // Types
2411
+
2412
+ class EsolveHeading {
2413
+ constructor(identifier, value) {
2414
+ this.identifier = identifier;
2415
+ this.value = value;
2087
2416
  }
2088
2417
  }
2089
2418
 
2090
- class EsolveCategoryTreeItem {
2091
- constructor(type, esolve_id, parent_id, description, sef_description, short_description, sort_priority, active, display_only, image_name, seo_title, seo_keywords, seo_description, children) {
2092
- this.type = type;
2093
- this.esolve_id = esolve_id;
2094
- this.parent_id = parent_id;
2095
- this.description = description;
2096
- this.sef_description = sef_description;
2097
- this.short_description = short_description;
2098
- this.sort_priority = sort_priority;
2099
- this.active = active;
2100
- this.display_only = display_only;
2101
- this.image_name = image_name;
2102
- this.id = '';
2103
- this.image_path = '';
2104
- if (this.type === 'category') {
2105
- this.id = `<<CAT>>${this.esolve_id}`;
2106
- if (children != null) {
2107
- this.children = children;
2108
- }
2109
- this.image_path = '/images/categories/';
2110
- }
2111
- else {
2112
- this.id = `<<SUB>>${this.esolve_id}`;
2113
- this.image_path = '/images/subcategories/';
2114
- }
2419
+ class EsolveMediaArticle {
2420
+ constructor(identifier, title, article, image_url = '', tags = [], topics = [], seo_title = '', seo_keywords = '', seo_description = '') {
2421
+ this.identifier = identifier;
2422
+ this.title = title;
2423
+ this.article = article;
2424
+ this.image_url = image_url;
2425
+ this.tags = tags;
2426
+ this.topics = topics;
2115
2427
  if (seo_title.trim() === '') {
2116
- seo_title = this.description;
2428
+ seo_title = this.title;
2117
2429
  }
2118
2430
  this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
2119
2431
  }
2120
- get small_image_src() {
2121
- return this.getImagePath('small');
2122
- }
2123
- get thumbnail_image_src() {
2124
- return this.getImagePath('thumb');
2125
- }
2126
- get tiny_image_src() {
2127
- return this.getImagePath('tiny');
2128
- }
2129
- getImagePath(image_size) {
2130
- if (this.image_name !== '') {
2131
- return `${this.image_path}${image_size}/${this.image_name}`;
2132
- }
2133
- return '';
2134
- }
2135
2432
  }
2136
2433
 
2137
- class EsolveCategoryTreeService {
2434
+ class EsolveMediaService {
2138
2435
  constructor(config, http) {
2139
2436
  this.config = config;
2140
2437
  this.http = http;
2141
2438
  }
2142
2439
  /**
2143
- * Retrieves the category tree from eSolve instance and coverts it to the correct format.
2440
+ * Retrieves the media record from the eSolve instance using the identifier
2441
+ *
2442
+ * @param identifier String representing the eSolve media identifier
2443
+ */
2444
+ getMediaArticle(identifier) {
2445
+ const params = new HttpParams({ fromObject: { identifier } });
2446
+ // TODO: Error Handling
2447
+ return this.getMediaRecords(params).pipe(map((response) => {
2448
+ if ((response.records === undefined) ||
2449
+ (response.records.length <= 0)) {
2450
+ throw response;
2451
+ }
2452
+ const mediaRecord = response.records[0];
2453
+ if (!mediaRecord.active) {
2454
+ throw response;
2455
+ }
2456
+ return this.processMediaRecord(mediaRecord);
2457
+ }));
2458
+ }
2459
+ /**
2460
+ * Retrieves a group of media records from the eSolve instance linked to a group
2461
+ *
2462
+ * @param media_group String representing the eSolve media group
2463
+ */
2464
+ getGroupedMediaArticles(media_group) {
2465
+ const params = new HttpParams({
2466
+ fromObject: { media_group_sef: media_group }
2467
+ });
2468
+ return this.getMediaRecords(params).pipe(map((response) => {
2469
+ const mediaArticles = [];
2470
+ if ((response.records !== undefined) &&
2471
+ (response.records.length > 0)) {
2472
+ for (const mediaRecord of response.records) {
2473
+ if (mediaRecord.active) {
2474
+ mediaArticles.push(this.processMediaRecord(mediaRecord));
2475
+ }
2476
+ }
2477
+ }
2478
+ return mediaArticles;
2479
+ }));
2480
+ }
2481
+ /**
2482
+ * Retrieves the media heading records from the eSolve instance using the identifiers
2483
+ *
2484
+ * @param identifiers Array of strings representing the eSolve heading identifiers
2144
2485
  */
2145
- getCategoryTree() {
2486
+ getHeadings(identifiers) {
2146
2487
  return this.http
2147
- .get(`${this.config.api_url}/get-tree.php`)
2488
+ .get(`${this.config.api_url}/get-headings.php`, {
2489
+ params: {
2490
+ identifier: identifiers.join(','),
2491
+ },
2492
+ })
2148
2493
  .pipe(map((response) => {
2149
- if (response.records === undefined) {
2150
- throw response;
2494
+ const headings = [];
2495
+ if ((response.records !== undefined) &&
2496
+ (response.records.length > 0)) {
2497
+ for (const heading_record of response.records) {
2498
+ headings.push(this.processHeadingRecord(heading_record));
2499
+ }
2151
2500
  }
2152
- return this.processTree(response.records);
2501
+ return headings;
2153
2502
  }));
2154
2503
  }
2155
2504
  /**
2156
- * Retrieve the details of a category tree item from the eSolve instance and
2157
- * converts it to the correct format.
2505
+ * Processes media article record
2158
2506
  *
2159
- * @param options Filter options
2507
+ * @param record Record from eSolve instance
2160
2508
  */
2161
- getCategoryTreeItem(options) {
2162
- let type;
2163
- let esolve_id;
2164
- let sef_description;
2165
- if (options.id) {
2166
- const categoryIdentifier = this.processID(options.id);
2167
- if (categoryIdentifier) {
2168
- type = categoryIdentifier.type;
2169
- esolve_id = categoryIdentifier.esolve_id;
2170
- }
2171
- }
2172
- else if (options.type) {
2173
- type = options.type;
2174
- if (options.esolve_id) {
2175
- esolve_id = options.esolve_id;
2176
- }
2177
- else if (options.sef_description) {
2178
- sef_description = options.sef_description;
2509
+ processMediaRecord(record) {
2510
+ const tags = [];
2511
+ const topics = [];
2512
+ if ((record.tags) && (record.tags.length > 0)) {
2513
+ for (const tag of record.tags) {
2514
+ tags.push(new EsolveTag(tag));
2179
2515
  }
2180
2516
  }
2181
- if (type && (esolve_id || sef_description)) {
2182
- let params = new HttpParams();
2183
- params = params.set('type', type);
2184
- if (esolve_id) {
2185
- params = params.set('id', esolve_id);
2186
- }
2187
- if (sef_description) {
2188
- params = params.set('sef_description', sef_description);
2517
+ if ((record.topics) && (record.topics.length > 0)) {
2518
+ for (const topic of record.topics) {
2519
+ topics.push(new EsolveTopic(topic));
2189
2520
  }
2190
- return this.http
2191
- .get(`${this.config.api_url}/get-tree-item.php`, { params })
2192
- .pipe(map((response) => {
2193
- if ((response.records === undefined) ||
2194
- (response.records.length <= 0)) {
2195
- throw response;
2196
- }
2197
- return this.processTreeItem(response.records[0]);
2198
- }));
2199
2521
  }
2200
- return throwError('Invalid options');
2522
+ return new EsolveMediaArticle(record.identifier, record.title, record.article, record.image_url, tags, topics, record.seo_page_title, record.seo_keywords, record.seo_description);
2201
2523
  }
2202
2524
  /**
2203
- * Processes the eSolve tree records and converts them into the correct format.
2525
+ * Processes media heading record
2204
2526
  *
2205
- * @param tree_records Records to process
2527
+ * @param record Record from eSolve instance
2206
2528
  */
2207
- processTree(tree_records) {
2208
- const tree_items = [];
2209
- if (tree_records) {
2210
- for (const tree_record of tree_records) {
2211
- let esolve_id = '';
2212
- let parent_id = '';
2213
- let children = [];
2214
- if (tree_record.type === 'category') {
2215
- children = this.processTree(tree_record.children);
2216
- esolve_id = tree_record.menu_id;
2217
- parent_id = tree_record.owner_menu_id;
2218
- }
2219
- else {
2220
- esolve_id = tree_record.id;
2221
- parent_id = tree_record.menu_id;
2222
- }
2223
- tree_items.push(new EsolveCategoryTreeItem(tree_record.type, esolve_id, parent_id, tree_record.description, tree_record.sef_description, tree_record.seo_description, tree_record.sort_priority, tree_record.active, tree_record.display_only, tree_record.image, tree_record.seo_page_title, tree_record.seo_keywords, tree_record.short_description, children));
2224
- }
2225
- }
2226
- return tree_items;
2227
- }
2228
- processTreeItem(record) {
2229
- return new EsolveCategoryTreeItem(record.type, record.id, record.parent_id, record.description, record.sef_description, record.short_description, record.sort_priority, record.active, record.display_only, record.image, record.seo_page_title, record.seo_keywords, record.seo_description);
2529
+ processHeadingRecord(record) {
2530
+ return new EsolveHeading(record.identifier, record.value);
2230
2531
  }
2231
- processID(id) {
2232
- let type;
2233
- let esolve_id;
2234
- const type_code_regex = /^\<\<(CAT|SUB)\>\>/g;
2235
- const match_results = id.match(type_code_regex);
2236
- if (match_results) {
2237
- const type_code = match_results[0];
2238
- type = (type_code === '<<CAT>>' ? 'category' : 'subcategory');
2239
- esolve_id = id.replace(type_code_regex, '');
2240
- return {
2241
- type,
2242
- esolve_id
2243
- };
2244
- }
2245
- return null;
2532
+ /**
2533
+ * Retrieves media records from eSolve instance.
2534
+ *
2535
+ * @param params HTTP params
2536
+ */
2537
+ getMediaRecords(params) {
2538
+ return this.http.get(`${this.config.api_url}/get-media.php`, { params });
2246
2539
  }
2247
2540
  }
2248
- EsolveCategoryTreeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveCategoryTreeService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2249
- EsolveCategoryTreeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveCategoryTreeService, providedIn: 'root' });
2250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveCategoryTreeService, decorators: [{
2541
+ EsolveMediaService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMediaService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2542
+ EsolveMediaService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMediaService, providedIn: 'root' });
2543
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMediaService, decorators: [{
2251
2544
  type: Injectable,
2252
2545
  args: [{
2253
2546
  providedIn: 'root',
@@ -2257,102 +2550,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
2257
2550
  args: [ESOLVE_CONNECT_CONFIG]
2258
2551
  }] }, { type: i1$2.HttpClient }]; } });
2259
2552
 
2260
- class EsolveManufacturer {
2261
- constructor(id, manufacturer, sef_manufacturer, title, article, sort_priority, is_active, featured, image_name, seo_title = '', seo_keywords = '', seo_description = '') {
2262
- this.id = id;
2263
- this.manufacturer = manufacturer;
2264
- this.sef_manufacturer = sef_manufacturer;
2265
- this.title = title;
2266
- this.article = article;
2267
- this.sort_priority = sort_priority;
2268
- this.is_active = is_active;
2269
- this.featured = featured;
2270
- this.image_name = image_name;
2271
- this.image_path = '/images/manufacturers/';
2272
- if (this.title.trim() === '') {
2273
- this.title = this.manufacturer;
2274
- }
2275
- if (seo_title.trim() === '') {
2276
- seo_title = this.title;
2277
- }
2278
- this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
2279
- }
2280
- get original_image_src() {
2281
- return this.getImagePath('original');
2282
- }
2283
- get small_image_src() {
2284
- return this.getImagePath('small');
2285
- }
2286
- get thumbnail_image_src() {
2287
- return this.getImagePath('thumb');
2288
- }
2289
- get tiny_image_src() {
2290
- return this.getImagePath('tiny');
2291
- }
2292
- getImagePath(image_size) {
2293
- if (this.image_name !== '') {
2294
- return `${this.image_path}${image_size}/${this.image_name}`;
2295
- }
2296
- return '';
2553
+ class EsolveMenuItem {
2554
+ constructor(url, name, target, children = []) {
2555
+ this.url = url;
2556
+ this.name = name;
2557
+ this.target = target;
2558
+ this.children = children;
2297
2559
  }
2298
2560
  }
2299
2561
 
2300
- class EsolveManufacturersService {
2562
+ class EsolveMenuService {
2301
2563
  constructor(config, http) {
2302
2564
  this.config = config;
2303
2565
  this.http = http;
2304
2566
  }
2305
- getManufacturer(id) {
2306
- const params = new HttpParams({
2307
- fromObject: { manufacturers_id: id }
2308
- });
2309
- return this.getManufacturerSingle(params);
2310
- }
2311
- getManufacturerFromSEF(sef_manufacturer) {
2312
- const params = new HttpParams({
2313
- fromObject: { sef_manufacturer }
2314
- });
2315
- return this.getManufacturerSingle(params);
2316
- }
2317
- getManufacturers(options) {
2318
- let params = new HttpParams();
2319
- if (options?.featured_only) {
2320
- params = params.set('featured_only', options.featured_only);
2321
- }
2322
- return this.getManufacturerRecords(params).pipe(map((records) => {
2323
- const manufacturers = [];
2324
- for (const record of records) {
2325
- manufacturers.push(this.processManufacturer(record));
2326
- }
2327
- return manufacturers;
2328
- }), catchError(() => {
2329
- return of([]);
2330
- }));
2331
- }
2332
- getManufacturerSingle(params) {
2333
- return this.getManufacturerRecords(params).pipe(map((records) => {
2334
- const record = records[0];
2335
- return this.processManufacturer(record);
2336
- }));
2337
- }
2338
- getManufacturerRecords(params) {
2567
+ getMenuTree(identifier) {
2339
2568
  return this.http
2340
- .get(`${this.config.api_url}/get-manufacturers.php`, { params })
2569
+ .get(`${this.config.api_url}/get-menu-tree.php`, { params: { identifier } })
2341
2570
  .pipe(map((response) => {
2342
- if ((response.records === undefined) ||
2343
- (response.records.length <= 0)) {
2571
+ if ((!response) || (response.records === undefined)) {
2344
2572
  throw response;
2345
2573
  }
2346
- return response.records;
2574
+ else if (response.records.length === 0) {
2575
+ return [];
2576
+ }
2577
+ return this.handleMenu(response.records);
2347
2578
  }));
2348
2579
  }
2349
- processManufacturer(record) {
2350
- return new EsolveManufacturer(+record.id, record.manufacturer, record.sef_manufacturer, record.title, record.article, +record.sort_priority, !!+record.is_active, !!+record.featured, record.image_name, record.seo_page_title, record.seo_keywords, record.seo_description);
2580
+ handleMenu(records) {
2581
+ const menu = [];
2582
+ if (typeof records !== 'undefined') {
2583
+ for (const menuTreeRecord of records) {
2584
+ menu.push(new EsolveMenuItem(menuTreeRecord.sef_url, menuTreeRecord.name, menuTreeRecord.target, this.handleMenu(menuTreeRecord.children)));
2585
+ }
2586
+ }
2587
+ return menu;
2351
2588
  }
2352
2589
  }
2353
- EsolveManufacturersService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveManufacturersService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2354
- EsolveManufacturersService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveManufacturersService, providedIn: 'root' });
2355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveManufacturersService, decorators: [{
2590
+ EsolveMenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMenuService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2591
+ EsolveMenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMenuService, providedIn: 'root' });
2592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveMenuService, decorators: [{
2356
2593
  type: Injectable,
2357
2594
  args: [{
2358
2595
  providedIn: 'root',
@@ -2362,97 +2599,192 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
2362
2599
  args: [ESOLVE_CONNECT_CONFIG]
2363
2600
  }] }, { type: i1$2.HttpClient }]; } });
2364
2601
 
2365
- class EsolveRange {
2366
- constructor(id, range, sef_range, manufacturers_id, title, article, is_active, featured, sort_priority, image_name, seo_title = '', seo_keywords = '', seo_description = '') {
2602
+ class EsolveNewsGroup {
2603
+ constructor(id, name, description, sef_name) {
2367
2604
  this.id = id;
2368
- this.range = range;
2369
- this.sef_range = sef_range;
2370
- this.manufacturers_id = manufacturers_id;
2371
- this.title = title;
2372
- this.article = article;
2373
- this.is_active = is_active;
2374
- this.featured = featured;
2375
- this.sort_priority = sort_priority;
2376
- this.image_name = image_name;
2377
- this.image_path = '/images/ranges/';
2378
- if (this.title.trim() === '') {
2379
- this.title = this.range;
2605
+ this.name = name;
2606
+ this.description = description;
2607
+ this.sef_name = sef_name;
2608
+ }
2609
+ }
2610
+
2611
+ class EsolveNewsArticleAuthor {
2612
+ constructor(userid, email, firstname, surname) {
2613
+ this.userid = userid;
2614
+ this.email = email;
2615
+ this.firstname = firstname;
2616
+ this.surname = surname;
2617
+ }
2618
+ }
2619
+
2620
+ class EsolveNewsArticle {
2621
+ constructor(record) {
2622
+ this.id = 0;
2623
+ this.title = '';
2624
+ this.sef_title = '';
2625
+ this.article = '';
2626
+ this.short_description = '';
2627
+ this.txdate = '';
2628
+ this.active = false;
2629
+ this.image = '';
2630
+ this.featured = false;
2631
+ this.topics = [];
2632
+ this.tags = [];
2633
+ let seo_title = '';
2634
+ let seo_description = '';
2635
+ let seo_keywords = '';
2636
+ if (record) {
2637
+ this.id = +(record.id ?? 0);
2638
+ this.title = record.title ?? '';
2639
+ this.sef_title = record.sef_title ?? '';
2640
+ this.article = record.article ?? '';
2641
+ this.txdate = record.txdate ?? '';
2642
+ this.image = record.image ?? '';
2643
+ if (record.active) {
2644
+ this.active = !!+record.active;
2645
+ }
2646
+ if (record.featured) {
2647
+ this.featured = !!+record.featured;
2648
+ }
2649
+ seo_title = record.seo_page_title ?? '';
2650
+ seo_description = record.short_description ?? '';
2651
+ seo_keywords = record.seo_keywords ?? '';
2652
+ if (record.news_group) {
2653
+ const group_record = record.news_group;
2654
+ this.group = new EsolveNewsGroup(+group_record.id, group_record.name, group_record.description, group_record.sef_name);
2655
+ }
2656
+ if (record.user) {
2657
+ this.author = new EsolveNewsArticleAuthor(record.user.userid, record.user.email, record.user.firstname, record.user.surname);
2658
+ }
2659
+ if (record.manufacturer) {
2660
+ this.manufacturer = new EsolveManufacturer(record.manufacturer);
2661
+ }
2662
+ if (record.range) {
2663
+ this.range = new EsolveRange(record.range);
2664
+ }
2665
+ if (record.topics && record.topics.length > 0) {
2666
+ const topics = record.topics;
2667
+ for (const topic of topics) {
2668
+ this.topics.push(new EsolveTopic(topic));
2669
+ }
2670
+ }
2671
+ if (record.tags && record.tags.length > 0) {
2672
+ const tags = record.tags;
2673
+ for (const tag of tags) {
2674
+ this.tags.push(new EsolveTag(tag));
2675
+ }
2676
+ }
2380
2677
  }
2381
2678
  if (seo_title.trim() === '') {
2382
2679
  seo_title = this.title;
2383
2680
  }
2384
2681
  this.seo_details = new EsolveSeoInfo(seo_title, seo_description, seo_keywords);
2385
2682
  }
2386
- get image_src() {
2387
- return this.getImagePath();
2388
- }
2389
- getImagePath() {
2390
- if (this.image_name !== '') {
2391
- return `${this.image_path}${this.image_name}`;
2392
- }
2393
- return '';
2683
+ }
2684
+
2685
+ class EsolveNewsArticleList {
2686
+ constructor(newsArticles, total, page) {
2687
+ this.newsArticles = newsArticles;
2688
+ this.total = total;
2689
+ this.page = page;
2394
2690
  }
2395
2691
  }
2396
2692
 
2397
- class EsolveRangesService {
2693
+ class EsolveNewsService {
2398
2694
  constructor(config, http) {
2399
2695
  this.config = config;
2400
2696
  this.http = http;
2401
2697
  }
2402
- getRange(id) {
2403
- const params = new HttpParams({
2404
- fromObject: { ranges_id: id }
2405
- });
2406
- return this.getRangeSingle(params);
2407
- }
2408
- getRangeFromSEF(sef_range) {
2409
- const params = new HttpParams({
2410
- fromObject: { sef_range }
2411
- });
2412
- return this.getRangeSingle(params);
2413
- }
2414
- getRanges(options) {
2415
- let params = new HttpParams();
2416
- if (options?.featured_only) {
2417
- params = params.set('featured_only', options.featured_only);
2418
- }
2419
- if (options?.manufacturers_id) {
2420
- params = params.set('manufacturers_id', options.manufacturers_id);
2421
- }
2422
- return this.getRangeRecords(params).pipe(map((records) => {
2423
- const ranges = [];
2424
- for (const record of records) {
2425
- ranges.push(this.processRange(record));
2698
+ getNewsArticle(identifier) {
2699
+ const params = new HttpParams({ fromObject: { sef_title: identifier } });
2700
+ return this.getNewsRecords(params).pipe(map((response) => {
2701
+ if ((response.records === undefined) ||
2702
+ (response.records.length <= 0)) {
2703
+ throw response;
2426
2704
  }
2427
- return ranges;
2428
- }), catchError(() => {
2429
- return of([]);
2705
+ const record = response.records[0];
2706
+ if (!record.active) {
2707
+ throw response;
2708
+ }
2709
+ return this.processNewsArticle(record);
2430
2710
  }));
2431
2711
  }
2432
- getRangeSingle(params) {
2433
- return this.getRangeRecords(params).pipe(map((records) => {
2434
- const record = records[0];
2435
- return this.processRange(record);
2712
+ getNewsArticles(options) {
2713
+ const params = this.parseOptions(options);
2714
+ return this.getNewsRecords(params).pipe(map((response) => {
2715
+ if (response.records === undefined) {
2716
+ throw response;
2717
+ }
2718
+ const news_articles = [];
2719
+ for (const record of response.records) {
2720
+ news_articles.push(this.processNewsArticle(record));
2721
+ }
2722
+ const page = options?.page ?? 0;
2723
+ const total_records = +response.additional_data.total_records;
2724
+ return new EsolveNewsArticleList(news_articles, total_records, page);
2436
2725
  }));
2437
2726
  }
2438
- getRangeRecords(params) {
2727
+ getNewsGroups() {
2439
2728
  return this.http
2440
- .get(`${this.config.api_url}/get-ranges.php`, { params })
2729
+ .get(`${this.config.api_url}/get-news-groups.php`)
2441
2730
  .pipe(map((response) => {
2442
- if ((response.records === undefined) ||
2443
- (response.records.length <= 0)) {
2731
+ if (response.records === undefined) {
2444
2732
  throw response;
2445
2733
  }
2446
- return response.records;
2734
+ const news_groups = [];
2735
+ for (const record of response.records) {
2736
+ news_groups.push(new EsolveNewsGroup(record.id, record.name, record.description, record.sef_name));
2737
+ }
2738
+ return news_groups;
2447
2739
  }));
2448
2740
  }
2449
- processRange(record) {
2450
- return new EsolveRange(+record.id, record.range, record.sef_range, record.manufacturers_id, record.title, record.article, !!+record.is_active, !!+record.featured, +record.sort_priority, record.image_name, record.seo_page_title, record.seo_keywords, record.seo_description);
2741
+ processNewsArticle(record) {
2742
+ return new EsolveNewsArticle(record);
2743
+ }
2744
+ getNewsRecords(params) {
2745
+ return this.http.get(`${this.config.api_url}/get-news.php`, { params });
2746
+ }
2747
+ parseOptions(options) {
2748
+ let params = new HttpParams();
2749
+ if (!options) {
2750
+ return params;
2751
+ }
2752
+ if (options.news_group_id) {
2753
+ params = params.set('news_group_id', options.news_group_id);
2754
+ }
2755
+ else if (options.news_group_sef) {
2756
+ params = params.set('news_group_sef', options.news_group_sef);
2757
+ }
2758
+ if (options.page) {
2759
+ params = params.set('page', options.page);
2760
+ }
2761
+ if (options.rows) {
2762
+ params = params.set('rows', options.rows);
2763
+ }
2764
+ if (options.feature_only) {
2765
+ params = params.set('feature_only', options.feature_only);
2766
+ }
2767
+ if (options.manufacturers_id) {
2768
+ params = params.set('manufacturers_id', options.manufacturers_id);
2769
+ }
2770
+ if (options.ranges_id) {
2771
+ params = params.set('ranges_id', options.ranges_id);
2772
+ }
2773
+ if (options.from_date) {
2774
+ params = params.set('from_date', options.from_date);
2775
+ }
2776
+ if (options.to_date) {
2777
+ params = params.set('to_date', options.to_date);
2778
+ }
2779
+ if (options.search_phrase) {
2780
+ params = params.set('search_phrase', options.search_phrase);
2781
+ }
2782
+ return params;
2451
2783
  }
2452
2784
  }
2453
- EsolveRangesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveRangesService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2454
- EsolveRangesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveRangesService, providedIn: 'root' });
2455
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveRangesService, decorators: [{
2785
+ EsolveNewsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveNewsService, deps: [{ token: ESOLVE_CONNECT_CONFIG }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2786
+ EsolveNewsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveNewsService, providedIn: 'root' });
2787
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EsolveNewsService, decorators: [{
2456
2788
  type: Injectable,
2457
2789
  args: [{
2458
2790
  providedIn: 'root',
@@ -2462,6 +2794,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
2462
2794
  args: [ESOLVE_CONNECT_CONFIG]
2463
2795
  }] }, { type: i1$2.HttpClient }]; } });
2464
2796
 
2797
+ class EsolveColour {
2798
+ constructor(record) {
2799
+ this.id = record.id ?? 0;
2800
+ this.colour = record.colour ?? '';
2801
+ this.description = record.description ?? '';
2802
+ }
2803
+ }
2804
+
2465
2805
  class EsolveStockBadge {
2466
2806
  constructor(id, text, identifier, font_colour, badge_colour, sort_priority) {
2467
2807
  this.id = id;
@@ -2516,6 +2856,15 @@ class EsolveStockPrice {
2516
2856
  }
2517
2857
  }
2518
2858
 
2859
+ class EsolveStockLeadTimes {
2860
+ constructor(lead_times) {
2861
+ this.min = 0;
2862
+ this.max = 0;
2863
+ this.min = lead_times.min;
2864
+ this.max = lead_times.max;
2865
+ }
2866
+ }
2867
+
2519
2868
  class EsolveStockItemBase {
2520
2869
  constructor(record = {}) {
2521
2870
  /**
@@ -2620,12 +2969,12 @@ class EsolveStockItemBase {
2620
2969
  sell_price_with_tax = +(record.sellprice_inclusive ?? 0);
2621
2970
  if ((record.tags) && (record.tags.length > 0)) {
2622
2971
  for (const tag of record.tags) {
2623
- this.tags.push(new EsolveTag(+tag.id, tag.tag_phrase, +tag.tag_weight, tag.description));
2972
+ this.tags.push(new EsolveTag(tag));
2624
2973
  }
2625
2974
  }
2626
2975
  if ((record.topics) && (record.topics.length > 0)) {
2627
2976
  for (const topic of record.topics) {
2628
- this.topics.push(new EsolveTopic(+topic.id, topic.name, topic.short_description, +topic.sort_priority));
2977
+ this.topics.push(new EsolveTopic(topic));
2629
2978
  }
2630
2979
  }
2631
2980
  if ((record.badges) && (record.badges.length > 0)) {
@@ -2640,16 +2989,19 @@ class EsolveStockItemBase {
2640
2989
  this.subcategory = new EsolveCategoryTreeItem(record.subcategory.type, record.subcategory.id, record.subcategory.parent_id, record.subcategory.description, record.subcategory.sef_description, record.subcategory.short_description, record.subcategory.sort_priority, record.subcategory.active, record.subcategory.display_only, record.subcategory.image, record.subcategory.seo_page_title, record.subcategory.seo_keywords, record.subcategory.seo_description);
2641
2990
  }
2642
2991
  if (record.manufacturer) {
2643
- this.manufacturer = new EsolveManufacturer(record.manufacturer.id, record.manufacturer.manufacturer, record.manufacturer.sef_manufacturer, record.manufacturer.title, record.manufacturer.article, record.manufacturer.sort_priority, record.manufacturer.is_active, record.manufacturer.featured, record.manufacturer.image_name, record.manufacturer.seo_page_title, record.manufacturer.seo_keywords, record.manufacturer.seo_description);
2992
+ this.manufacturer = new EsolveManufacturer(record.manufacturer);
2644
2993
  }
2645
2994
  if (record.range) {
2646
- this.range = new EsolveRange(record.range.id, record.range.range, record.range.sef_range, record.range.manufacturers_id, record.range.title, record.range.article, record.range.is_active, record.range.featured, record.range.sort_priority, record.range.image_name, record.range.seo_page_title, record.range.seo_keywords, record.range.seo_description);
2995
+ this.range = new EsolveRange(record.range);
2647
2996
  }
2648
2997
  if (record.colours && record.colours.length > 0) {
2649
2998
  for (const colour of record.colours) {
2650
2999
  this.colours.push(new EsolveColour(colour));
2651
3000
  }
2652
3001
  }
3002
+ if (record.lead_times) {
3003
+ this.lead_times = new EsolveStockLeadTimes(record.lead_times);
3004
+ }
2653
3005
  if (record.custom_fields) {
2654
3006
  this.custom_fields = record.custom_fields;
2655
3007
  }
@@ -2760,6 +3112,104 @@ class EsolveLinkedStockItem extends EsolveStockItemBase {
2760
3112
  }
2761
3113
  }
2762
3114
 
3115
+ class EsolveMediaStockItem extends EsolveStockItemBase {
3116
+ constructor(record) {
3117
+ super(record);
3118
+ }
3119
+ }
3120
+
3121
+ class EsolveStockImage {
3122
+ constructor(image_name) {
3123
+ this.image_name = image_name;
3124
+ if (this.image_name === 'no_image.jpg') {
3125
+ this.image_name = '';
3126
+ }
3127
+ }
3128
+ /**
3129
+ * Path to tiny stock image
3130
+ */
3131
+ get tiny_src() {
3132
+ return this.getImagePath('tiny');
3133
+ }
3134
+ /**
3135
+ * Path to thumbnail stock image
3136
+ */
3137
+ get thumbnail_src() {
3138
+ return this.getImagePath('thumb');
3139
+ }
3140
+ /**
3141
+ * Path to small stock image
3142
+ */
3143
+ get small_src() {
3144
+ return this.getImagePath('small');
3145
+ }
3146
+ /**
3147
+ * Path to big stock image
3148
+ */
3149
+ get big_src() {
3150
+ return this.getImagePath('big');
3151
+ }
3152
+ /**
3153
+ * Path to original stock image
3154
+ */
3155
+ get original_src() {
3156
+ return this.getImagePath('original');
3157
+ }
3158
+ getImagePath(image_size) {
3159
+ if (this.image_name !== '') {
3160
+ return `/images/stock/${image_size}/${this.image_name}`;
3161
+ }
3162
+ return '';
3163
+ }
3164
+ }
3165
+
3166
+ class EsolveAdditionalStockImage {
3167
+ constructor(record) {
3168
+ this.id = 0;
3169
+ this.type = '';
3170
+ this.url = '';
3171
+ this.name = '';
3172
+ if (record) {
3173
+ this.id = record.id ?? 0;
3174
+ this.type = record.type ?? '';
3175
+ this.url = record.url ?? '';
3176
+ this.name = record.name ?? '';
3177
+ if (record.etag) {
3178
+ this.etag = record.etag;
3179
+ }
3180
+ if (record.key) {
3181
+ this.key = record.key;
3182
+ }
3183
+ }
3184
+ }
3185
+ }
3186
+
3187
+ class EsolveStockImageCollection {
3188
+ constructor(record) {
3189
+ this.alt_images = [];
3190
+ this.additional_images = [];
3191
+ this.default_image = new EsolveStockImage(record?.default_image ?? '');
3192
+ if (!record) {
3193
+ return;
3194
+ }
3195
+ if (record.alt_images && record.alt_images.length > 0) {
3196
+ for (const alt_image_name of record.alt_images) {
3197
+ const alt_image = new EsolveStockImage(alt_image_name);
3198
+ this.alt_images.push(alt_image);
3199
+ }
3200
+ }
3201
+ if (record.additional_images && record.additional_images.length > 0) {
3202
+ for (const additional_image_record of record.additional_images) {
3203
+ const additional_image = new EsolveAdditionalStockImage(additional_image_record);
3204
+ this.additional_images.push(additional_image);
3205
+ }
3206
+ }
3207
+ }
3208
+ }
3209
+ ;
3210
+
3211
+ ;
3212
+
2763
3213
  class EsolveStockService {
2764
3214
  constructor(config, http) {
2765
3215
  this.config = config;
@@ -2777,7 +3227,8 @@ class EsolveStockService {
2777
3227
  }
2778
3228
  });
2779
3229
  return this.getStockRecords(params).pipe(map(response => {
2780
- if ((response.records === undefined) || (response.records.length <= 0)) {
3230
+ if ((response.records === undefined) ||
3231
+ (response.records.length <= 0)) {
2781
3232
  throw response;
2782
3233
  }
2783
3234
  const stockRecord = response.records[0];
@@ -2796,7 +3247,8 @@ class EsolveStockService {
2796
3247
  }
2797
3248
  });
2798
3249
  return this.getStockRecords(params).pipe(map(response => {
2799
- if ((response.records === undefined) || (response.records.length <= 0)) {
3250
+ if ((response.records === undefined) ||
3251
+ (response.records.length <= 0)) {
2800
3252
  throw response;
2801
3253
  }
2802
3254
  const stockRecord = response.records[0];
@@ -2851,7 +3303,8 @@ class EsolveStockService {
2851
3303
  }
2852
3304
  }
2853
3305
  return this.getStockRecords(params).pipe(map(response => {
2854
- if ((response.records === undefined) || (response.records.length <= 0)) {
3306
+ if ((response.records === undefined) ||
3307
+ (response.records.length <= 0)) {
2855
3308
  throw response;
2856
3309
  }
2857
3310
  const stockItems = [];
@@ -2870,7 +3323,8 @@ class EsolveStockService {
2870
3323
  return this.http
2871
3324
  .get(`${this.config.api_url}/get-linked-items.php`, { params: { code } })
2872
3325
  .pipe(map((response) => {
2873
- if ((response.records === undefined) || (response.records.length <= 0)) {
3326
+ if ((response.records === undefined) ||
3327
+ (response.records.length <= 0)) {
2874
3328
  throw response;
2875
3329
  }
2876
3330
  return this.processLinkedItems(response.records);
@@ -2885,12 +3339,62 @@ class EsolveStockService {
2885
3339
  return this.http
2886
3340
  .get(`${this.config.api_url}/get-recipe-items.php`, { params: { code } })
2887
3341
  .pipe(map((response) => {
2888
- if ((response.records === undefined) || (response.records.length <= 0)) {
3342
+ if ((response.records === undefined) ||
3343
+ (response.records.length <= 0)) {
2889
3344
  throw response;
2890
3345
  }
2891
3346
  return this.processRecipeItems(response.records);
2892
3347
  }));
2893
3348
  }
3349
+ /**
3350
+ * Retrieve list of stock items linked to a stock item from the eSolve API
3351
+ *
3352
+ * @param options Filter options
3353
+ */
3354
+ getMediaLinkedItems(options) {
3355
+ let params = new HttpParams({
3356
+ fromObject: {
3357
+ rows: options.rows ?? 0,
3358
+ page: options.page ?? 0,
3359
+ ranges_id: options.ranges_id ?? 0,
3360
+ manufacturers_id: options.manufacturers_id ?? 0,
3361
+ display_only: options.display_only ?? false,
3362
+ is_active: options.is_active ?? true,
3363
+ },
3364
+ });
3365
+ if (options.media_identifier) {
3366
+ params = params.append('media_identifier', options.media_identifier);
3367
+ }
3368
+ if (options.media_id) {
3369
+ params = params.append('media_id', options.media_id);
3370
+ }
3371
+ return this.http
3372
+ .get(`${this.config.api_url}/get-media-linked-items.php`, { params })
3373
+ .pipe(map((response) => {
3374
+ if ((response.records === undefined) ||
3375
+ (response.records.length <= 0)) {
3376
+ throw response;
3377
+ }
3378
+ const items = this.processMediaStockItems(response.records);
3379
+ return new EsolveList(items, options.page, options.rows, +response.additional_data.total_records);
3380
+ }));
3381
+ }
3382
+ /**
3383
+ * Retrieves the full image collection of a stock item
3384
+ *
3385
+ * @param code Stock item code
3386
+ */
3387
+ getStockImageCollection(code) {
3388
+ return this.http
3389
+ .get(`${this.config.api_url}/get-item-image-collection.php`, { params: { code } })
3390
+ .pipe(map((response) => {
3391
+ if (response.records === undefined) {
3392
+ throw response;
3393
+ }
3394
+ const collection = new EsolveStockImageCollection(response.records);
3395
+ return collection;
3396
+ }));
3397
+ }
2894
3398
  /**
2895
3399
  * Processes the eSolve stock item record and converts it to an object.
2896
3400
  *
@@ -2927,6 +3431,20 @@ class EsolveStockService {
2927
3431
  }
2928
3432
  return items;
2929
3433
  }
3434
+ /**
3435
+ * Processes the linked eSolve stock item records and converts them to objects.
3436
+ *
3437
+ * @param records Linked eSolve stock item records
3438
+ */
3439
+ processMediaStockItems(records) {
3440
+ const items = [];
3441
+ if (records.length > 0) {
3442
+ for (const record of records) {
3443
+ items.push(new EsolveMediaStockItem(record));
3444
+ }
3445
+ }
3446
+ return items;
3447
+ }
2930
3448
  /**
2931
3449
  * Retrieves stock records from HTTP params.
2932
3450
  * @param params HTTP client parameters
@@ -2947,7 +3465,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
2947
3465
  args: [ESOLVE_CONNECT_CONFIG]
2948
3466
  }] }, { type: i1$2.HttpClient }]; } });
2949
3467
 
2950
- // Models
3468
+ // Types
2951
3469
 
2952
3470
  class EsolveSpecialImage {
2953
3471
  constructor(record) {
@@ -3864,5 +4382,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
3864
4382
  * Generated bundle index. Do not edit.
3865
4383
  */
3866
4384
 
3867
- export { EsolveAccountService, EsolveAddress, EsolveAddressResult, EsolveAuthService, EsolveBankingDetails, EsolveBanner, EsolveBannerImage, EsolveBannerImageHotspot, EsolveBannerService, EsolveCartItem, EsolveCartService, EsolveCartStockItem, EsolveCartTotals, EsolveCategoryTreeItem, EsolveCategoryTreeService, EsolveChangePasswordResult, EsolveCheckoutResult, EsolveColour, EsolveCookieService, EsolveEnquiryResult, EsolveEnquiryService, EsolveErrorHandlerService, EsolveGeocodeAddressResult, EsolveGeocodeCoordsResult, EsolveGeocodeResult, EsolveGeocoderService, EsolveHeading, EsolveHttpError, EsolveLinkedAsset, EsolveLinkedStockItem, EsolveList, EsolveLocation, EsolveLocationAddress, EsolveLocationContactInfo, EsolveLocationPOBoxAddress, EsolveLocationTradingDay, EsolveLocationTradingTimes, EsolveLocationsService, EsolveManufacturer, EsolveManufacturersService, EsolveMediaArticle, EsolveMediaService, EsolveMenuItem, EsolveMenuService, EsolveNewsArticle, EsolveNewsArticleAuthor, EsolveNewsArticleList, EsolveNewsGroup, EsolveNewsService, EsolvePaymentMethod, EsolvePaymentResult, EsolvePaymentService, EsolveRange, EsolveRangesService, EsolveRecipeStockItem, EsolveRegistrationResult, EsolveResetPasswordResult, EsolveResponseHandlerService, EsolveResponseResult, EsolveResult, EsolveSeoInfo, EsolveSeoService, EsolveSession, EsolveSessionService, EsolveShippingCost, EsolveShippingMethod, EsolveShippingService, EsolveShippingTotals, EsolveSpecial, EsolveSpecialImage, EsolveSpecialImageCollection, EsolveSpecialsService, EsolveStockBadge, EsolveStockGroup, EsolveStockGroupItem, EsolveStockItem, EsolveStockItemBase, EsolveStockItemList, EsolveStockPrice, EsolveStockService, EsolveTag, EsolveTopic, EsolveTopicService, EsolveTransaction, EsolveTransactionAddress, EsolveTransactionClient, EsolveTransactionItem, EsolveTransactionItemPrice, EsolveTransactionList, EsolveTransactionLocation, EsolveTransactionPaymentMethod, EsolveTransactionShippingMethod, EsolveTransactionUser, EsolveUserAccount, EsolveUserAccountBusiness, EsolveUserAccountContact, EsolveUserAccountResult, EsolveVaultItem, EsolveVaultItemResult, NgEsolveConnectModule };
3868
- //# sourceMappingURL=esolve-ng-esolve-connect.mjs.map
4385
+ export { EsolveAccountService, EsolveAdditionalStockImage, EsolveAddress, EsolveAddressResult, EsolveAsset, EsolveAssetsService, EsolveAuthService, EsolveBankingDetails, EsolveBanner, EsolveBannerImage, EsolveBannerImageHotspot, EsolveBannerService, EsolveCartItem, EsolveCartService, EsolveCartStockItem, EsolveCartTotals, EsolveCategoryTreeItem, EsolveCategoryTreeService, EsolveChangePasswordResult, EsolveCheckoutResult, EsolveColour, EsolveCookieService, EsolveEnquiryResult, EsolveEnquiryService, EsolveErrorHandlerService, EsolveGeocodeAddressResult, EsolveGeocodeCoordsResult, EsolveGeocodeResult, EsolveGeocoderService, EsolveHeading, EsolveHttpError, EsolveLinkedAsset, EsolveLinkedStockItem, EsolveList, EsolveLocation, EsolveLocationAddress, EsolveLocationContactInfo, EsolveLocationPOBoxAddress, EsolveLocationTradingDay, EsolveLocationTradingTimes, EsolveLocationsService, EsolveManufacturer, EsolveManufacturersService, EsolveMediaArticle, EsolveMediaService, EsolveMediaStockItem, EsolveMenuItem, EsolveMenuService, EsolveNewsArticle, EsolveNewsArticleAuthor, EsolveNewsArticleList, EsolveNewsGroup, EsolveNewsService, EsolvePaymentMethod, EsolvePaymentResult, EsolvePaymentService, EsolveRange, EsolveRangesService, EsolveRecipeStockItem, EsolveRegistrationResult, EsolveResetPasswordResult, EsolveResponseHandlerService, EsolveResponseResult, EsolveResult, EsolveSeoInfo, EsolveSeoService, EsolveSession, EsolveSessionService, EsolveShippingCost, EsolveShippingMethod, EsolveShippingService, EsolveShippingTotals, EsolveSpecial, EsolveSpecialImage, EsolveSpecialImageCollection, EsolveSpecialsService, EsolveStockBadge, EsolveStockGroup, EsolveStockGroupItem, EsolveStockImage, EsolveStockImageCollection, EsolveStockItem, EsolveStockItemBase, EsolveStockItemList, EsolveStockLeadTimes, EsolveStockPrice, EsolveStockService, EsolveTag, EsolveTagsService, EsolveTopic, EsolveTopicService, EsolveTransaction, EsolveTransactionAddress, EsolveTransactionClient, EsolveTransactionItem, EsolveTransactionItemPrice, EsolveTransactionList, EsolveTransactionLocation, EsolveTransactionPaymentMethod, EsolveTransactionShippingMethod, EsolveTransactionUser, EsolveUserAccount, EsolveUserAccountBusiness, EsolveUserAccountContact, EsolveUserAccountResult, EsolveVaultItem, EsolveVaultItemResult, NgEsolveConnectModule };