import {Component, OnInit, inject} from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MatButtonModule } from '@angular/material/button'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatIconModule } from '@angular/material/icon'; import { MatTableModule } from '@angular/material/table'; import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { DashboardService, AdminStats } from '../../services/dashboard'; import { HttpClient } from '@angular/common/http'; import { environment } from '../../../environments/environment'; import { AuthService } from '../../services/auth'; interface CommunityMember { userId: string; firstName: string; lastName: string; email: string; } interface TariffInvite { id: string; producerUserId: string; consumerUserId: string; energyCommunityId: string; code: string; note: string; status: string; expiresAt: string; acceptedAt: string; createdAt: string; } interface EnergyCommunity { id: string; name: string; } @Component({ selector: 'app-producer-invites', standalone: true, imports: [ CommonModule, FormsModule, MatCardModule, MatButtonModule, MatInputModule, MatFormFieldModule, MatSelectModule, MatIconModule, MatTableModule, MatSnackBarModule, MatProgressSpinnerModule ], template: `

Meine Einladungen

Neue Einladung erstellen Laden Sie einen Consumer ein, einen Spezial-Tarif zu erhalten @if (communities.length === 0) {

Sie sind noch keiner Energiegemeinschaft beigetreten.

} @else {
Energiegemeinschaft @for (community of communities; track community.id) { {{ community.name }} } @if (selectedCommunityId) { Consumer auswählen @for (member of members; track member.userId) { {{ member.firstName }} {{ member.lastName }} } Notiz (optional) }
}
Gesendete Einladungen @if (invites.length === 0) {

Noch keine Einladungen gesendet.

} @else {
Consumer {{ invite.consumerUserId }} Code {{ invite.code }} Status {{ getStatusLabel(invite.status) }} Gültig bis {{ invite.expiresAt | date:'dd.MM.yyyy HH:mm' }}
}
` }) export class ProducerInvitesComponent implements OnInit { private http = inject(HttpClient); private snackBar = inject(MatSnackBar); private authService = inject(AuthService); private apiUrl = `${environment.apiUrl}/api`; communities: EnergyCommunity[] = []; members: CommunityMember[] = []; invites: TariffInvite[] = []; selectedCommunityId: string = ''; selectedConsumerId: string = ''; inviteNote: string = ''; isLoading = false; displayedColumns = ['consumer', 'code', 'status', 'expiresAt']; ngOnInit() { this.loadCommunities(); } loadCommunities() { this.http.get(`${this.apiUrl}/community/admin/communities`) .subscribe({ next: (communities) => this.communities = communities, error: () => this.snackBar.open('Fehler beim Laden der Energiegemeinschaften', 'Schließen', { duration: 3000 }) }); } loadMembers() { if (!this.selectedCommunityId) return; this.http.get(`${this.apiUrl}/community/admin/communities/${this.selectedCommunityId}/members`) .subscribe({ next: (members) => { const currentUserId = this.authService.getCurrentUserId(); this.members = members.filter(m => m.userId !== currentUserId); }, error: () => this.snackBar.open('Fehler beim Laden der Mitglieder', 'Schließen', { duration: 3000 }) }); this.loadInvites(); } loadInvites() { if (!this.selectedCommunityId) return; this.http.get(`${this.apiUrl}/tariffs/invites/community/${this.selectedCommunityId}`) .subscribe({ next: (invites) => this.invites = invites, error: () => this.snackBar.open('Fehler beim Laden der Einladungen', 'Schließen', { duration: 3000 }) }); } createInvite() { if (!this.selectedConsumerId || !this.selectedCommunityId) return; this.isLoading = true; const request = { consumerUserId: this.selectedConsumerId, energyCommunityId: this.selectedCommunityId, note: this.inviteNote || null }; this.http.post(`${this.apiUrl}/tariffs/invites`, request) .subscribe({ next: (invite) => { this.isLoading = false; this.snackBar.open('Einladung erfolgreich gesendet!', 'Schließen', { duration: 3000 }); this.inviteNote = ''; this.selectedConsumerId = ''; this.loadInvites(); }, error: (err) => { this.isLoading = false; const message = err.error?.message || 'Fehler beim Erstellen der Einladung'; this.snackBar.open(message, 'Schließen', { duration: 5000 }); } }); } getStatusClass(status: string): string { switch (status) { case 'PENDING': return 'text-yellow-600 bg-yellow-100 px-2 py-1 rounded'; case 'ACCEPTED': return 'text-green-600 bg-green-100 px-2 py-1 rounded'; case 'EXPIRED': return 'text-red-600 bg-red-100 px-2 py-1 rounded'; default: return 'text-slate-600 bg-slate-100 px-2 py-1 rounded'; } } getStatusLabel(status: string): string { switch (status) { case 'PENDING': return 'Ausstehend'; case 'ACCEPTED': return 'Angenommen'; case 'EXPIRED': return 'Abgelaufen'; default: return status; } } } interface TariffInviteRequest { consumerUserId: string; energyCommunityId: string; note: string | null; }