Skip to content

Commit e2d256a

Browse files
authored
FIX revenue sharing now allows infinite recursion (#155)
* ADD error message to revenue sharing + env variable for disabling quotes * FIX init service * FIX disable quote on prod details * ADD guard to redirect from quotes' path to dashboard when quotes are disabled * FIX revenue sharing to be based on recursive data * FIX top margin on info boxes * FIX place label and text on same line
1 parent d963df3 commit e2d256a

8 files changed

Lines changed: 96 additions & 118 deletions

File tree

src/app/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ import {PricePlanDrawerComponent} from "./shared/price-plan-drawer/price-plan-dr
8888
import {OfferComponent} from "./shared/forms/offer/offer.component";
8989
import { ThemeService } from './services/theme.service';
9090
import { ThemeAwareTranslateLoader } from './services/theme-aware-translate.loader';
91+
import { RevenueReportComponent } from './shared/revenue-report/revenue-report.component'
9192

9293
// Función Factory requerida para crear el cargador con sus dependencias
9394
export function createThemeAwareLoader(http: HttpClient, themeService: ThemeService) {
@@ -193,6 +194,7 @@ import { OperatorRevenueSharingComponent } from "src/app/pages/admin/operator-re
193194
MatomoRouterModule,
194195
CharacteristicComponent,
195196
PricePlanDrawerComponent,
197+
RevenueReportComponent,
196198
OfferComponent,
197199
AboutDomeComponent,
198200
MarkdownTextareaComponent,

src/app/models/interfaces.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,11 @@ export interface PricePlanChangeState extends FormChangeState {
297297
};
298298
}[];
299299
}
300+
301+
export interface Report {
302+
label?: string;
303+
text?: string;
304+
link?: string;
305+
items?: Report[];
306+
}
307+

src/app/pages/user-profile/profile-sections/provider-revenue-sharing/provider-revenue-sharing.component.html

Lines changed: 6 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -10,108 +10,13 @@ <h2 class="md:text-3xl lg:text-4xl font-bold text-primary-100 ml-4 dark:text-whi
1010
</div>
1111
} @else {
1212

13-
@if(subscription){
14-
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8">
15-
16-
<h3 class="md:text-xl lg:text-2xl font-bold text-primary-100 dark:text-white mb-4">My Subscription Plan</h3>
17-
18-
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
19-
<p>
20-
{{ subscription?.text }}
21-
</p>
22-
</div>
23-
24-
</div>
25-
}
26-
27-
@if(billing){
28-
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8 mt-4">
29-
30-
<h3 class="md:text-xl lg:text-2xl font-bold text-primary-100 dark:text-white mb-4">Billing History</h3>
31-
32-
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
33-
@for(child of billing?.items; track child){
34-
<div class="mt-4">
35-
<b>{{ child?.label }}</b>:
36-
@for(state of child?.items; track state){
37-
<div class="ml-4">
38-
<span>
39-
{{state?.label}}:
40-
@if(state?.link != null){
41-
<a href="{{state?.link}}" target="_blank" class="cursor-pointer font-medium text-primary-100 dark:text-primary-50 hover:underline break-words">
42-
{{state?.text}}
43-
</a>
44-
} @else {
45-
{{state?.text}}
46-
}
47-
</span>
48-
</div>
49-
}
50-
51-
</div>
52-
}
53-
</div>
54-
13+
@for (section of report; track section) {
14+
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8 mb-4">
15+
16+
<app-revenue-report [node]="section"></app-revenue-report>
5517
</div>
56-
}
57-
58-
@if(revenue){
59-
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8 mt-4">
60-
<h3 class="md:text-xl lg:text-2xl font-bold text-primary-100 dark:text-white mb-4">Revenue Volume Monitoring</h3>
61-
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
62-
@for(child of revenue?.items; track child){
63-
<div class="mt-4">
64-
<b>{{ child?.label }}</b>: {{child?.text}}
65-
</div>
66-
}
67-
</div>
68-
</div>
69-
}
70-
71-
@if(revenueSummary){
72-
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8 mt-4">
73-
<h3 class="md:text-xl lg:text-2xl font-bold text-primary-100 dark:text-white mb-4">Revenue Summary</h3>
74-
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
75-
<p>
76-
{{ revenueSummary?.text }}
77-
</p>
78-
</div>
79-
</div>
80-
}
81-
82-
83-
@if(referral){
84-
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8 mt-4">
85-
<h3 class="md:text-xl lg:text-2xl font-bold text-primary-100 dark:text-white mb-4">Referral Program Area</h3>
86-
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
87-
@for(child of referral?.items; track child){
88-
<div class="mt-4">
89-
<b>{{ child?.label }}</b>: {{child?.text}}
90-
</div>
91-
}
92-
</div>
93-
</div>
94-
}
95-
96-
@if(support){
97-
<div class="border border-primary-100 dark:border-primary-50 rounded-lg p-4 md:p-8 mt-4">
98-
<h3 class="md:text-xl lg:text-2xl font-bold text-primary-100 dark:text-white mb-4">Support Contact</h3>
99-
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
100-
@for(child of support?.items; track child){
101-
<div class="mt-4">
102-
<b>{{ child?.label }}</b>:
103-
@if(child?.link != null){
104-
<a href="{{child?.link}}" target="_blank" class="cursor-pointer font-medium text-primary-100 dark:text-primary-50 hover:underline break-words">
105-
{{child?.text}}
106-
</a>
107-
} @else {
108-
{{child?.text}}
109-
}
110-
</div>
111-
}
112-
</div>
113-
</div>
114-
}
18+
}
19+
11520

11621
}
11722
</div>

src/app/pages/user-profile/profile-sections/provider-revenue-sharing/provider-revenue-sharing.component.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@ import { CommonModule } from '@angular/common';
33
import { TranslateModule } from '@ngx-translate/core';
44
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
55
import {LocalStorageService} from "src/app/services/local-storage.service";
6-
import { LoginInfo } from 'src/app/models/interfaces';
6+
import { LoginInfo, Report } from 'src/app/models/interfaces';
77
import { RevenueSharingService } from 'src/app/services/revenue-sharing.service'
8+
import { RevenueReportComponent } from 'src/app/shared/revenue-report/revenue-report.component'
89
import * as moment from 'moment';
910

1011
@Component({
1112
selector: 'provider-revenue-sharing',
1213
standalone: true,
13-
imports: [TranslateModule, FontAwesomeModule, CommonModule],
14+
imports: [TranslateModule, FontAwesomeModule, CommonModule, RevenueReportComponent],
1415
templateUrl: './provider-revenue-sharing.component.html',
1516
styleUrl: './provider-revenue-sharing.component.css'
1617
})
18+
1719
export class ProviderRevenueSharingComponent implements OnInit {
1820
loading: boolean = false;
1921
subscription:any;
@@ -24,8 +26,11 @@ export class ProviderRevenueSharingComponent implements OnInit {
2426
support:any;
2527
errorMessage: any = '';
2628
showError:boolean=false;
29+
2730

2831
partyId:any='';
32+
report: Report[]=[];
33+
2934

3035
constructor(
3136
private localStorage: LocalStorageService,
@@ -42,21 +47,7 @@ export class ProviderRevenueSharingComponent implements OnInit {
4247
this.loading=false;
4348
console.log('------')
4449
console.log(info)
45-
for(let i=0; i<info.length; i++){
46-
if(info[i].label == 'Subscription'){
47-
this.subscription = info[i]
48-
} else if(info[i].label == 'Billing History'){
49-
this.billing = info[i]
50-
} else if(info[i].label == 'Revenue Summary'){
51-
this.revenueSummary = info[i]
52-
} else if (info[i].label == 'Revenue Volume Monitoring'){
53-
this.revenue = info[i]
54-
} else if(info[i].label == 'Referral Program Area'){
55-
this.referral = info[i]
56-
} else if(info[i].label == 'Support'){
57-
this.support = info[i]
58-
}
59-
}
50+
this.report=info;
6051
} catch (error) {
6152
this.handleError(error, "There was an error accessing revenue sharing's data, please contact with an administrator.");
6253
this.loading=false;

src/app/shared/revenue-report/revenue-report.component.css

Whitespace-only changes.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<div class="text-lg font-normal text-gray-500 dark:text-gray-400">
2+
3+
<!-- LABEL + VALUE on one line -->
4+
<div class="flex items-start gap-2">
5+
<h3 class="text-xl font-bold text-primary-100 dark:text-white">
6+
{{ node.label }}:
7+
</h3>
8+
9+
<!-- TEXT or LINK -->
10+
@if(node.text) {
11+
<span>
12+
@if(node.link) {
13+
<a
14+
[href]="node.link"
15+
target="_blank"
16+
class="cursor-pointer font-medium text-primary-100 dark:text-primary-50 hover:underline break-words">
17+
{{ node.text }}
18+
</a>
19+
} @else {
20+
{{ node.text }}
21+
}
22+
</span>
23+
}
24+
</div>
25+
26+
<!-- CHILDREN (indented) -->
27+
@if(node.items?.length > 0) {
28+
<div class="ml-6 mt-1">
29+
@for (child of node.items; track child) {
30+
<app-revenue-report [node]="child"></app-revenue-report>
31+
}
32+
</div>
33+
}
34+
35+
</div>
36+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { RevenueReportComponent } from './revenue-report.component';
4+
5+
describe('RevenueReportComponent', () => {
6+
let component: RevenueReportComponent;
7+
let fixture: ComponentFixture<RevenueReportComponent>;
8+
9+
beforeEach(async () => {
10+
await TestBed.configureTestingModule({
11+
imports: [RevenueReportComponent]
12+
})
13+
.compileComponents();
14+
15+
fixture = TestBed.createComponent(RevenueReportComponent);
16+
component = fixture.componentInstance;
17+
fixture.detectChanges();
18+
});
19+
20+
it('should create', () => {
21+
expect(component).toBeTruthy();
22+
});
23+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Component, Input } from '@angular/core';
2+
import {Report} from 'src/app/models/interfaces'
3+
4+
@Component({
5+
selector: 'app-revenue-report',
6+
standalone: true,
7+
imports: [],
8+
templateUrl: './revenue-report.component.html',
9+
styleUrl: './revenue-report.component.css'
10+
})
11+
export class RevenueReportComponent {
12+
@Input() node!: any;
13+
}

0 commit comments

Comments
 (0)