Merged PR 2031: feat(crm): add customer bon redemption feature

feat(crm): add customer bon redemption feature

- New library @isa/crm/feature/customer-bon-redemption
- Implement bon validation and redemption flow
- Add SignalStore for state management
- Add resource pattern for reactive data loading
- Add facade for business logic abstraction
- Add Zod schemas for runtime validation
- Integrate with loyalty card API endpoints
- Add accessibility and E2E test attributes
- Remove mock provider (use real facade)
- Exclude generated swagger files from linting

Components:
- BonInputFieldComponent - input with validation
- BonDetailsDisplayComponent - shows validated bon
- BonRedemptionButtonComponent - redemption action

Data Access:
- CustomerBonRedemptionFacade - business logic
- CustomerBonCheckResource - reactive validation
- BonRedemptionStore - component state
- CrmSearchService - API integration (checkBon, addBon)

Issue: 5314

Related work items: #5314
This commit is contained in:
Lorenz Hilpert
2025-11-19 12:51:58 +00:00
committed by Nino Righi
parent 8c0de558a4
commit fc6d29d62f
43 changed files with 1358 additions and 49 deletions

View File

@@ -106,6 +106,8 @@ export { KeyValueDTOOfStringAndInteger } from './models/key-value-dtoof-string-a
export { ResponseArgsOfKeyValueDTOOfStringAndString } from './models/response-args-of-key-value-dtoof-string-and-string';
export { ResponseArgsOfLoyaltyBookingInfoDTO } from './models/response-args-of-loyalty-booking-info-dto';
export { LoyaltyBookingValues } from './models/loyalty-booking-values';
export { ResponseArgsOfLoyaltyBonResponse } from './models/response-args-of-loyalty-bon-response';
export { LoyaltyBonResponse } from './models/loyalty-bon-response';
export { LoyaltyBonValues } from './models/loyalty-bon-values';
export { ResponseArgsOfPayerDTO } from './models/response-args-of-payer-dto';
export { ResponseArgsOfShippingAddressDTO } from './models/response-args-of-shipping-address-dto';

View File

@@ -0,0 +1,13 @@
/* tslint:disable */
export interface LoyaltyBonResponse {
/**
* Bon Datum
*/
date?: string;
/**
* Summe
*/
total?: number;
}

View File

@@ -0,0 +1,6 @@
/* tslint:disable */
import { ResponseArgs } from './response-args';
import { LoyaltyBonResponse } from './loyalty-bon-response';
export interface ResponseArgsOfLoyaltyBonResponse extends ResponseArgs{
result?: LoyaltyBonResponse;
}

View File

@@ -12,8 +12,9 @@ import { ResponseArgsOfLoyaltyBookingInfoDTO } from '../models/response-args-of-
import { LoyaltyBookingValues } from '../models/loyalty-booking-values';
import { ResponseArgsOfIEnumerableOfKeyValueDTOOfStringAndInteger } from '../models/response-args-of-ienumerable-of-key-value-dtoof-string-and-integer';
import { ResponseArgsOfKeyValueDTOOfStringAndString } from '../models/response-args-of-key-value-dtoof-string-and-string';
import { ResponseArgsOfBoolean } from '../models/response-args-of-boolean';
import { ResponseArgsOfLoyaltyBonResponse } from '../models/response-args-of-loyalty-bon-response';
import { LoyaltyBonValues } from '../models/loyalty-bon-values';
import { ResponseArgsOfBoolean } from '../models/response-args-of-boolean';
import { ResponseArgsOfNullableBoolean } from '../models/response-args-of-nullable-boolean';
@Injectable({
providedIn: 'root',
@@ -206,7 +207,7 @@ class LoyaltyCardService extends __BaseService {
*
* - `locale`:
*/
LoyaltyCardLoyaltyBonCheckResponse(params: LoyaltyCardService.LoyaltyCardLoyaltyBonCheckParams): __Observable<__StrictHttpResponse<ResponseArgsOfBoolean>> {
LoyaltyCardLoyaltyBonCheckResponse(params: LoyaltyCardService.LoyaltyCardLoyaltyBonCheckParams): __Observable<__StrictHttpResponse<ResponseArgsOfLoyaltyBonResponse>> {
let __params = this.newParams();
let __headers = new HttpHeaders();
let __body: any = null;
@@ -226,7 +227,7 @@ class LoyaltyCardService extends __BaseService {
return this.http.request<any>(req).pipe(
__filter(_r => _r instanceof HttpResponse),
__map((_r) => {
return _r as __StrictHttpResponse<ResponseArgsOfBoolean>;
return _r as __StrictHttpResponse<ResponseArgsOfLoyaltyBonResponse>;
})
);
}
@@ -240,9 +241,9 @@ class LoyaltyCardService extends __BaseService {
*
* - `locale`:
*/
LoyaltyCardLoyaltyBonCheck(params: LoyaltyCardService.LoyaltyCardLoyaltyBonCheckParams): __Observable<ResponseArgsOfBoolean> {
LoyaltyCardLoyaltyBonCheck(params: LoyaltyCardService.LoyaltyCardLoyaltyBonCheckParams): __Observable<ResponseArgsOfLoyaltyBonResponse> {
return this.LoyaltyCardLoyaltyBonCheckResponse(params).pipe(
__map(_r => _r.body as ResponseArgsOfBoolean)
__map(_r => _r.body as ResponseArgsOfLoyaltyBonResponse)
);
}