fix(checkout): resolve itemType validation error for download items
Updates ItemTypeSchema to accept bitwise flag combinations instead of
only individual enum values. The backend returns combined itemType
values (e.g., 20480 = ItemPrice | Download) which were causing Zod
validation errors when adding download/e-book items to cart.
Changes:
- Update ItemTypeSchema to use bitwise validation pattern
- Add comprehensive unit tests (24 tests) covering individual flags,
combinations, and edge cases
- Follow same pattern as NotificationChannelSchema and CRUDASchema
Closes#5429
Related work items: #5429
Replace the `group` property with `target` property in BaseFilterInputSchema to explicitly distinguish between 'filter' and 'input' query parameters. This improves code clarity and provides better semantic meaning.
**Changes:**
- Add `target` property to BaseFilterInputSchema with type 'filter' | 'input' and default 'input'
- Update filter.service.ts to use `target` instead of `group` for filtering inputs
- Update all filter input mappings (checkbox, date-range, number-range, text) to include `target` property
- Update all affected unit tests (9 test files) to include `target` in mock data
**Tests:** All 128 unit tests passing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
feat(crm-data-access,checkout): improve primary bonus card selection logic
Enhance getPrimaryBonusCard helper to sort cards alphabetically by code
when multiple primary cards exist or when no primary card is designated.
This ensures deterministic card selection across the application.
Add comprehensive test coverage for edge cases including:
- Multiple primary cards (returns first alphabetically)
- No primary cards (returns first alphabetically)
- Empty bonus cards array (returns undefined)
Add TODO comments in ShoppingCartService for future refactoring of
cart handling logic to improve code organization and reusability.
Ref: #5407
fix(checkout): resolve currency constraint violations in price handling
- Add ensureCurrencyDefaults() helper to normalize price objects with EUR defaults
- Fix currency constraint violation in shopping cart item additions (bug #5405)
- Apply price normalization across availability, checkout, and shopping cart services
- Update 8 locations: availability.adapter, checkout.service, shopping-cart.service,
get-availability-params.adapter, availability-transformers, reward quantity control
- Refactor OrderType to @isa/common/data-access for cross-domain reusability
- Remove duplicate availability service from catalogue library
- Enhance PriceValue and VatValue schemas with proper currency defaults
- Add availability-transformers.spec.ts test coverage
- Fix QuantityControl fallback from 0 to 1 to prevent invalid state warnings
Resolves issue where POST requests to /checkout/v6/store/shoppingcart/{id}/item
were sending price objects without required currency/currencySymbol fields,
causing 400 Bad Request with 'Currency: Constraint violation: NotNull' error.
Related work items: #5405
🐛 fix(reward-order-confirmation): group items by item-level delivery type
Fix incorrect delivery type headers by grouping order items based on
item.features.orderType instead of order.features.orderType, since items
within a single order can have different delivery types.
Changes:
- Add groupDisplayOrderItemsByDeliveryType helper to group items by delivery type
- Add groupDisplayOrderItemsByBranch helper to group items by branch
- Refactor OrderConfirmationItemListComponent to use item-level grouping
- Move list rendering and grouping logic from parent to child component
- Update template to use branchGroup.items instead of branchGroup.allItems
Fixes#5403
Related work items: #5403
fix(reward-confirmation): improve action card visibility and status messages
Refactor confirmation action card to only display for items with 'Rücklage' feature.
Replace boolean completion check with state-based system using ProcessingStatusState
enum (Cancelled, NotFound, Collected). Add specific completion messages for each
state to provide clearer user feedback.
Changes:
- Add displayActionCard computed signal to check for 'Rücklage' feature
- Replace getProcessingStatusCompleted with getProcessingStatusState helper
- Add ProcessingStatusState enum with three states (Cancelled, NotFound, Collected)
- Update completion messages in template to use @switch based on processingStatus
- Wrap entire action card in @if block checking displayActionCard
- Add proper test coverage for new helper function
- Update component spec to provide required dependencies
Ref: #5391, #5404, #5406
fix(reward-order-confirmation): correct typo and add loading state to collect action
- Fix typo in "Rechnugsadresse" → "Rechnungsadresse"
- Add loading state signal to prevent duplicate collect operations
- Bind pending and disabled states to collect button
- Wrap collect operation in try-finally to ensure loading state cleanup
- Add comprehensive unit tests for loading state behavior
The loading state prevents users from triggering multiple concurrent
collect operations by disabling the button during API calls.
Ref: #5396
Update the logging library to accept context as either direct objects
or functions (MaybeLoggerContextFn), providing better ergonomics while
maintaining performance optimization through lazy evaluation.
Changes:
- Add MaybeLoggerContextFn type for flexible context handling
- Update logger() factory to accept context as object or function
- Update all LoggerApi methods to support both context formats
- Enhance README with comprehensive examples and migration guide
- Document performance benefits of function-based context
- Add backward compatibility notes for v2.1.0 enhancement
The new API is fully backward compatible - both direct objects and
function wrappers work seamlessly.
Implement comprehensive system to disable specific purchase options (e.g., B2B delivery) for reward flows while providing flexible UI control.
Key Features:
- `disabledPurchaseOptions`: Array to specify options to disable (skips API calls)
- `hideDisabledPurchaseOptions`: Toggle to hide or show disabled options
- true (default): Completely hidden from UI
- false: Shown with disabled visual state (grayed out, not clickable)
Implementation:
- Store: Added state field and isOptionDisabled() helper method
- Availability loading: Skip API calls for disabled options in _loadAvailabilities()
- UI: Base directive prevents clicks, applies .disabled CSS class
- Visual: CSS styling for disabled state (opacity, cursor, background)
- Component: Updated showOption() logic to respect hide flag
Reward Integration:
- Applied to reward-catalog: Disable B2B delivery for reward redemption
- Applied to reward-shopping-cart: Disable B2B delivery for cart items
Documentation:
- Comprehensive README.md with usage examples and architecture
- JSDoc comments on all interfaces, methods, and directives
- Migration notes for breaking change (hidePurchaseOptions renamed)
Breaking Change:
Renamed `hidePurchaseOptions` → `disabledPurchaseOptions` for clarity
Affected Files:
- Core: modal data, service, component, store, state
- Tiles: base directive, CSS styling
- Reward: catalog action, shopping cart item
Add preSelectOption configuration to purchase options modal when adding
reward items, defaulting to 'in-store' purchase option.
This improves UX by automatically selecting the most common purchase
method for reward items, reducing the number of steps required for the
user to complete their reward redemption.
feat(checkout): implement hierarchical grouping on rewards order confirmation page
Implements correct grouping by delivery option and target address on the
rewards order confirmation page (Prämien-Abschlussseite).
Changes:
- Add hierarchical grouping: primary by delivery type, secondary by branch
- Show branch name only when multiple branches exist within same delivery type
- Remove duplicate "Abholfiliale" section from addresses component
- Fix undefined shoppingCartItem error by providing fallback with DisplayOrderItem features
- Fix partial order creation error handling in checkout orchestrator
Implementation:
- New helpers: groupDisplayOrdersByDeliveryType, groupDisplayOrdersByBranch
- Updated reward-order-confirmation component with groupedOrders computed signal
- Added comprehensive unit tests (15 new tests, all passing)
- Graceful error handling for backend responses with partial order creation
Bug Fixes:
- Prevent undefined features error when shopping cart item not found
- Extract orders from HTTP error responses when backend returns warnings
- Add German documentation for error handling with TODO for user feedback
Related to: #5397
Related work items: #5397
Relocates helper functions from feature-specific reward-selection-dialog to shared data-access library, enabling cross-feature usage. Renames get-loyalty-points and get-price helpers to better reflect their calculation purpose.
Add comprehensive Claude Code tooling:
- Agents: docs-researcher, docs-researcher-advanced for documentation research
- Commands: dev:add-e2e-attrs, docs:library, docs:refresh-reference, quality:bundle-analyze, quality:coverage
- Skills: 8 specialized skills including api-change-analyzer, architecture-enforcer, library-scaffolder, and more
Update documentation:
- Comprehensive CLAUDE.md overhaul with library reference system
- Update testing guidelines in docs/guidelines/testing.md
- Update READMEs for checkout, icons, scanner, and scroll-position libraries
Remove outdated checkout-completion-flow-documentation.md
Update .gitignore for Claude Code files
- Restructure CLAUDE.md with clearer sections and updated metadata
- Add research guidelines emphasizing subagent usage and documentation-first approach
- Create library reference guide covering all 61 libraries across 12 domains
- Add automated library reference generation tool
- Complete test coverage for reward order confirmation feature (6 new spec files)
- Refine product info components and adapters with improved documentation
- Update workflows documentation for checkout service
- Fix ESLint issues: case declarations, unused imports, and unused variables
- Extract reusable ProductInfoComponent from ProductInfoRedemptionComponent
- Implement order confirmation item list with product, action card, and destination info
- Add completed shopping carts tracking to checkout metadata service
- Create Storybook stories for product info component variants
- Update checkout completion orchestrator to store shopping cart data
- Extract COMPLETED_SHOPPING_CARTS_METADATA_KEY constant for consistency
Implement the complete UI for the reward order confirmation page including address displays, order item lists, and supporting helper functions.
Features:
- Add order confirmation addresses component displaying billing, delivery, and pickup branch addresses
- Implement order confirmation item list with order type icons and item details
- Add helper functions for order type feature checking and address/branch deduplication
- Integrate store computed properties for payers, shipping addresses, and target branches
- Apply responsive layout with Tailwind CSS styling
feat(crm): introduce PrimaryCustomerCardResource and format-name utility
Replace SelectedCustomerBonusCardsResource with a new PrimaryCustomerCardResource
that automatically loads and exposes the primary customer card as a signal.
This simplifies customer card access across the application by providing a
centralized, root-level injectable resource with automatic tab synchronization.
Create new @isa/utils/format-name library to consolidate customer name formatting
logic previously duplicated across components. The utility formats names with
configurable first name, last name, and organization name fields.
Key changes:
- Add PrimaryCustomerCardResource as providedIn root service with automatic
customer selection tracking via effect
- Remove SelectedCustomerBonusCardsResource and its manual provisioning
- Extract formatName function to dedicated utility library with Vitest setup
- Update all reward-related components to use new resource pattern
- Migrate OMS components to use centralized format-name utility
- Add comprehensive unit tests for formatName function
BREAKING CHANGE: SelectedCustomerBonusCardsResource has been removed
Ref: #5389
Add new ConfirmationListItemActionCardComponent for displaying action
cards in order confirmation item list. Component receives DisplayOrderItem
as input for rendering action-specific information.
Add refine validation to NotificationChannelSchema to ensure only valid
flag combinations are accepted. Computes valid flags using bitwise OR
of all enum values.
- Add new reward-order-confirmation feature library with components and store
- Implement checkout completion orchestrator service for order finalization
- Migrate checkout/oms/crm models to Zod schemas for better type safety
- Add order creation facade and display order schemas
- Update shopping cart facade with order completion flow
- Add comprehensive tests for shopping cart facade
- Update routing to include order confirmation page
hotfix(remission-list): prioritize reload trigger over exact search
Fix navigation issue where reload searches were incorrectly applying
exact search logic, causing filters to be cleared when they should
be preserved during navigation.
Changes:
- Update remission-list.resource.ts to check reload trigger before
exact search conditions
- Ensure reload trigger always clears input but preserves other query
parameters
- Prevent exact search from overriding reload behavior
- Add explanatory comment for reload priority logic
This ensures proper filter state management when users navigate
between remission lists, maintaining expected behavior for both
reload and exact search scenarios.
Ref: #5387
hotfix(remission-list-item, remission-list-empty-state): improve empty state logic and cleanup selected items on destroy
Refactor empty state display conditions in remission-list-empty-state component
to correctly handle search term validation. Move hasValidSearchTerm check to
parent condition to prevent displaying empty states during active searches.
Add ngOnDestroy lifecycle hook to remission-list-item component to properly
clean up selected quantities from the store when items are removed from the list.
This prevents memory leaks and ensures the store state remains synchronized with
the displayed items.
Changes:
- Move hasValidSearchTerm check in displayEmptyState computed signal to improve
empty state display logic
- Implement OnDestroy interface in RemissionListItemComponent
- Add removeItem call in ngOnDestroy to clean up store state
- Add corresponding unit tests for the cleanup behavior
Ref: #5387
- Add BatchingResource base class for automatic API request batching
- Refactor StockInfoComponent to use StockInfoResource with batching
- Remove redundant StockResource provider from RewardShoppingCartItemComponent
- Update tests to match new BatchingResourceRef API
- Add comprehensive documentation for BatchingResource pattern
The BatchingResource pattern optimizes multiple simultaneous stock info
requests by collecting params within a 250ms window and making a single
batched API call, significantly reducing network overhead.
1. Reward Shopping Cart Implementation
- New shopping cart with quantity control and availability checking
- Responsive shopping cart item component with improved CSS styling
- Shipping address integration in cart
- Customer reward card and billing/shipping address components
2. Navigation State Management Library (@isa/core/navigation)
- New library with type-safe navigation context service (373 lines)
- Navigation state service (287 lines) for temporary state between routes
- Comprehensive test coverage (668 + 227 lines of tests)
- Documentation (792 lines in README.md)
- Replaces query parameters for passing temporary navigation context
3. CRM Shipping Address Services
- New ShippingAddressService with fetching and validation
- CustomerShippingAddressResource and CustomerShippingAddressesResource
- Zod schemas for data validation
4. Additional Improvements
- Enhanced searchbox accessibility with ARIA support
- Availability data access rework for better fetching/mapping
- Storybook tooltip variant support
- Vitest JUnit and Cobertura reporting configuration
Related work items: #5382, #5383, #5384
Refactor checkout data-access layer to use centralized adapter pattern for converting between CRM and Checkout domain models. Extract business logic into dedicated helper modules and implement complete order button component for reward shopping cart.
Changes:
- Add 8 new adapters (availability, branch, customer, logistician, payer, product-number, shipping-address, shopping-cart-item) with comprehensive unit tests
- Create 3 helper modules: checkout-analysis, checkout-business-logic, checkout-data for separation of concerns
- Implement complete-order-button component with Tailwind styling for reward shopping cart
- Extend checkout models with Buyer and Payer types, update OrderOptions interface
- Add CustomerType, BuyerType, PayerType enums to common and CRM data-access layers
- Refactor customer component address selection to use new CustomerAdapter and ShippingAddressAdapter
- Update CheckoutService with refactored logic using new adapters and helpers
- Update CrmTabMetadataService to use consistent payer/shipping address ID tracking
- Add comprehensive documentation for checkout completion flow and service architecture