Added "skip:ci" tag to multiple project configurations to prevent CI runs
for certain libraries. This change affects the following libraries:
crm-feature-customer-card-transactions, crm-feature-customer-loyalty-cards,
oms-data-access, oms-feature-return-details, oms-feature-return-process,
oms-feature-return-summary, remission-data-access, remission-feature-remission-list,
remission-feature-remission-return-receipt-details, remission-feature-remission-return-receipt-list,
remission-shared-remission-start-dialog, remission-shared-return-receipt-actions,
shared-address, shared-delivery, ui-carousel, and ui-dialog.
Also updated CI command in package.json to exclude tests with the "skip:ci" tag.
fix(core-tabs): improve tab cleanup and naming logic
Refactor tab management to handle checkout state transitions more reliably:
- Extract helpers (formatCustomerTabNameHelper, checkCartHasItemsHelper,
getNextTabNameHelper) from checkout component to @isa/core/tabs for reuse
- Fix getNextTabNameHelper to count tabs instead of finding max ID,
preventing gaps in "Vorgang X" numbering
- Add canDeactivateTabCleanup guard to manage tab context based on cart state:
* Preserves customer context if either cart (regular or reward) has items
* Updates tab name with customer/organization name when context preserved
* Resets tab to clean "Vorgang X" state when both carts empty
* Handles navigation to global areas (without tab ID) gracefully
- Apply canDeactivateTabCleanup to checkout-summary and reward-order-confirmation routes
- Move tab cleanup logic from component ngOnDestroy to reusable guard
- Add comprehensive unit tests for getNextTabNameHelper
This ensures tabs maintain correct state after order completion, properly
display customer context when carts have items, and reset cleanly when
both carts are empty. The guard approach centralizes cleanup logic and
makes it reusable across checkout flows.
Ref: #5480
feat(confirmation-list-item-action-card): improve action card visibility logic and add ordered state
Enhance the action card display logic to show only when both feature flag
and command/completion conditions are met. Add support for "Ordered" state
to distinguish pending items from completed ones.
Changes:
- Add hasLoyaltyCollectCommand helper to check for LOYALTY_COLLECT_COMMAND
- Update displayActionCard logic to require both Rücklage feature AND
(loyalty collect command OR completion state)
- Add ProcessingStatusState.Ordered to distinguish ordered vs completed items
- Update isComplete to exclude ordered items from completion state
- Move role-based visibility check to outer container level
- Remove unused CSS class for completed state
- Add comprehensive unit tests for new helpers
The action card now correctly appears only for items that need user action,
hiding for CallCenter role and for items without the required commands.
Ref: #5459
feat(core/auth): add type-safe role-based authorization library
Created @isa/core/auth library with comprehensive role checking:
- RoleService for programmatic hasRole() checks
- IfRoleDirective for declarative *ifRole/*ifNotRole templates
- Type-safe Role enum (CallCenter, Store)
- TokenProvider abstraction with OAuth2 integration
- Signal-based reactive rendering with Angular effects
- Zero-configuration setup via InjectionToken factory
Fixed Bug #5451:
- Hide action buttons for HSC (CallCenter) users on reward order confirmation
- Applied *ifNotRole="Role.CallCenter" to actions container
- Actions now hidden while maintaining card visibility
Testing:
- 18/18 unit tests passing with Vitest
- JUnit and Cobertura reporting configured
- Complete test coverage for role checking logic
Documentation:
- Comprehensive README (817 lines) with API reference
- Usage examples and architecture diagrams
- Updated library-reference.md (62→63 libraries)
Technical:
- Handles both string and array JWT role formats
- Integrated with @isa/core/logging
- Standalone directive (no module imports)
- Full TypeScript type safety
Closes#5451
Related work items: #5451
fix(crm-data-access, customer-details, reward-shopping-cart): persist selected addresses across navigation flows
Implement address selection persistence using CRM tab metadata to ensure
selected shipping addresses and payers are retained throughout the customer
selection flow, particularly when navigating from Kundenkarte to reward cart.
Changes include:
- Create PayerResource and CustomerPayerAddressResource to load selected
payer from tab metadata with fallback to customer as payer
- Create PayerService to fetch payer data from CRM API with proper error
handling and abort signal support
- Update BillingAndShippingAddressCardComponent to prefer selected addresses
from metadata over customer defaults, with computed loading state
- Refactor continue() flow in CustomerDetailsViewMainComponent to load
selected addresses from metadata before setting in checkout service
- Add adapter logic to convert CRM payer/shipping address types to checkout
types with proper type casting for incompatible enum types
- Implement fallback chain: metadata selection → component state → customer
default for both payer and shipping address
This ensures address selections made in the address selection dialogs are
properly preserved and applied when completing the customer selection flow,
fixing the issue where addresses would revert to customer defaults.
Ref: #5411
🐛 fix(checkout): include download orders in destination update flow
Fixes#5448 - Prämienshop download orders now properly update destination
logistician before order creation. Previously, download orders were excluded
from the destination update step, causing null logistician errors during
order creation in the reward shop.
The fix adds hasDownload to the condition that determines whether to update
destination shipping addresses, ensuring download items (including those
purchased with loyalty points) get their logistician properly assigned.
Related work items: #5448
fix(reward-shopping-cart-item, filter-service): exclude downloads and text inputs from counts
Hide low stock warning for download items in reward shopping cart, as
downloads don't have physical inventory constraints.
Exclude text/searchbox inputs from selected filter count calculation
to prevent search queries from inflating the filter badge counter.
Remove unused isIconButtonActive computed property in filter menu button.
Ref: #5441
fix(reward-print, reward-popup, reward-destination): improve reward cart stability and UX
- fix: remove console.log statement from calculate-price-value helper
- fix: add loading/pending state to print button to prevent duplicate prints
- fix: debounce reward selection resource reloading to prevent race conditions
- fix: correct reward cart item destination-info alignment and flex behavior
- fix: support OrderType in OrderDestinationComponent alongside OrderTypeFeature
- fix: use unitPrice instead of total for price calculations in reward items
- refactor: update calculatePriceValue test descriptions for clarity
- fix: fallback to order.orderType when features don't contain orderType
The reward selection popup now properly waits for all resources to reload
before resolving, preventing timing issues with cart synchronization.
Print button shows pending state during print operations.
Destination info components now handle both legacy OrderType and new
OrderTypeFeature enums for better compatibility.
Ref: #5442, #5445
- Add junit reporter to vitest configs for CI/CD integration
- Enable cobertura coverage reports for test analytics
- Add @ts-expect-error comment for complex vitest reporter types
- Remove duplicate test target from reward-selection-dialog project.json
feat(shared-filter, ui-switch): add switch filter menu button for inline toggle filters
Add a new SwitchMenuButtonComponent that renders filter inputs as compact toggle switches
without an overlay menu. This provides a more streamlined UX for simple boolean/single-option
filters directly in the controls panel.
Key changes:
- Create new switch-menu module with button component and tests
- Extend FilterControlsPanelComponent to accept switchFilters input array
- Rename IconSwitchComponent to SwitchComponent for consistency
- Update filter actions to use 'target' property instead of 'group' for filtering
- Add isEmptyFilterInput support for NumberRange inputs
- Export switch-menu module from shared/filter public API
The switch button auto-commits on toggle and uses the checkbox filter model internally,
allowing simple configuration like:
switchFilters = [{ filter: stockFilter, icon: 'isaFiliale' }]
This implementation follows the existing filter architecture patterns and maintains
full accessibility support through ARIA attributes and keyboard navigation.
Ref: #5427
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
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
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 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
- 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.