fix(purchase-options): resolve Lesepunkte delivery method change error
The commit includes:
- Restored ensureCurrencyDefaults import that was accidentally removed
- Fixed immutability violations in both getAddToShoppingCartDTOForItem and getUpdateShoppingCartItemDTOForItem methods
- Proper handling of frozen NgRx ComponentStore state objects
- Resolves bug #5452 where Lesepunkte delivery method changes failed
The pre-commit hooks ran successfully (ESLint passed with no changes needed). The fix is now ready to be pushed and tested.
Related work items: #5452
🐛 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
- Regenerated all Swagger API clients (availability, checkout, crm, isa, print, wws)
- Updated CRM loyalty card API endpoints (removed interests, added booking/bon management)
- Temporarily disabled interests form block functionality due to API changes
- Removed deprecated models (check-loyalty-card-result, loyalty-card-status, entity-key-value)
- Added new loyalty booking and bon management models and services
- 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
fix(filter-service, number-range-filter-input): resolve NumberRange state management and reference issues
**Root Cause:**
Filter service was experiencing reference sharing between current state and
committed state due to shallow copying in commit(), causing filters to
incorrectly appear as "changed" when mixing NumberRange with other filter
types like Checkbox.
**Changes Made:**
1. **State Management (filter.service.ts):**
- Use structuredClone() in commit() for deep copies to prevent reference sharing
- Update clear() to preserve structural properties (options array references)
- Refactor resetInput() to selectively copy only mutable properties while
preserving structural ones for isEqual() comparisons
- Simplify selectedFilterCount to use isDefaultFilterInput() consistently
2. **Default Values (number-range-filter-input.mapping.ts):**
- Parse minValue/maxValue from config (e.g., "1-" → 1) as defaults
- Use parsed defaults as initial min/max when no explicit value provided
**Impact:**
- NumberRange filters correctly display default values in UI
- Filters no longer incorrectly show as "changed" after multiple commits
- "Standardeinstellungen" works correctly when mixing NumberRange with other types
- selectedFilterCount accurately reflects changed filters including NumberRange
Ref: #5402
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
Remove the memory MCP server configuration and all references to the context-manager agent with persistent memory capabilities from CLAUDE.md.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
🐛 fix(checkout): remove manual cart counter updates (#5412)
Remove updateProcessCount method and all manual calls to it.
The cart counter is now updated through reactive mechanisms,
ensuring it stays in sync when items are added or removed.
Fixes bug where reward cart icon counter was not updating
when items were removed from the cart.
Related work items: #5412
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>
- Rename logging-helper to logging for consistency
- Remove git-commit-helper (superseded by /commit command)
- Add git-workflow skill for Git Flow operations
Co-Authored-By: Claude <noreply@anthropic.com>
- Rename skill directory from tailwind-isa to tailwind
- Update skill name in frontmatter metadata
- Update all references in CLAUDE.md (2 locations)
Simplifies naming while maintaining clear purpose. The skill provides
Tailwind CSS utilities and design system guidance for the ISA project.
- Create comprehensive html-template skill with 3 reference files
- E2E Testing Attributes (data-what, data-which patterns)
- ARIA Accessibility Attributes (roles, properties, states, WCAG)
- Combined Patterns (real-world examples with both)
- Move E2E attribute guidance from command to skill
- Add extensive ARIA accessibility documentation
- Update angular-template skill with cross-references
- Remove dev-add-e2e-attrs command (functionality now in skill)
The new skill provides 3,322 lines of comprehensive documentation
covering both testing and accessibility best practices for HTML
templates, with practical examples for forms, navigation, tables,
dialogs, and more.
Benefits:
- Clean separation: Angular syntax vs HTML attributes
- Reusable: html-template works with any HTML context
- Comprehensive: E2E + ARIA in one place
- Integrated: Works seamlessly with angular-template skill
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
Add changelog file following Keep a Changelog format.
Documents recent additions including checkout reward features, stock info
batching, CRM improvements, and Angular/Tailwind development skills.
Add two new Claude Code slash commands for developer workflow:
- /eod-report: Generate daily work summaries from git commits
- /generate-changelog: Create changelog entries from git tags
Both commands support flexible date ranges and output formatting.
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
feat(checkout-summary): add navigation to reward cart after order completion
Add conditional button to navigate to reward cart on checkout summary page.
The button appears only when the customer has a primary card and items
in their reward shopping cart.
Implementation details:
- Inject SelectedRewardShoppingCartResource and PrimaryCustomerCardResource
- Add computed signal displayRewardNavigation() to determine button visibility
- Add navigateToReward() method to handle navigation
- Provide SelectedRewardShoppingCartResource in module providers
- Update template with conditional button using new control flow syntax
Ref: #5311
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
fix(customer-card): implement navigation flow from customer card to reward selection
Add navigation logic to Kundenkarte component that allows users to select
a customer and navigate to the reward shop. The flow now properly preserves
navigation context using NavigationStateService scoped to the active tab.
Changes include:
- Add customerId input to KundenkarteComponent for customer identification
- Replace placeholder onRewardShop() with navigateToReward() method
- Preserve navigation context with returnUrl and autoTriggerContinueFn flag
- Update kundenkarte-main-view to pass customerId to child component
- Modify details-main-view to auto-trigger continue() when returning from
Kundenkarte with the appropriate context flag
- Add loading state handling during navigation from customer card
- Update button disabled logic to check both card availability and loading
The navigation context is automatically scoped to the current tab and cleaned
up after use, ensuring proper isolation between tabs.
Ref: #5400
Add comprehensive skill documentation for @isa/core/logging usage:
- SKILL.md: Core principles, patterns, and best practices
- examples.md: Real-world usage scenarios across components/services
- reference.md: Quick API reference and configuration guide
- troubleshooting.md: Common issues and solutions
Provides guidance for consistent logging patterns throughout the codebase.
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.