{{ getPageDescription(activeTab).title }}
{{ getPageDescription(activeTab).description }}
- {{ feature }}
Configuration Overview
Active projects with their strategies and rules.
| Details | Actions | |
|---|---|---|
|
{{ row.label }}
{{ row.subtitle }}
|
{{ row.meta }} -- |
|
| Order | {{ t('tableSort.projects.domain') }} | {{ t('tableSort.projects.strategies') }} | {{ t('tableSort.projects.warehouse') }} | {{ t('tableSort.projects.status') }} | Actions | |
|---|---|---|---|---|---|---|
|
{{ project.domain }}
{{ project.slug || 'N/A' }}
|
{{ strategy.name }}
None
|
{{ project.warehouses_mask || 'N/A' }} | {{ project.is_active ? 'Active' : 'Inactive' }} |
|
| Order | {{ t('tableSort.strategies.name') }} | {{ t('tableSort.strategies.route') }} | {{ t('tableSort.strategies.global_rule') }} | {{ t('tableSort.strategies.projects') }} | Actions | |||
|---|---|---|---|---|---|---|---|---|
| {{ strategy.name }} |
{{ route.name }}
{{ strategy.route || 'N/A' }}
|
{{ truncate(strategy.global_rule) || 'N/A' }} |
{{ project.domain }}
None
|
{{ rule.name }}
None
|
{{ strategy.is_active ? 'Active' : 'Inactive' }} |
|
| Order | {{ t('tableSort.rules.name') }} | {{ t('tableSort.rules.expression') }} | {{ t('tableSort.rules.filter') }} | {{ t('tableSort.rules.strategies') }} | {{ t('tableSort.rules.status') }} | Actions | |
|---|---|---|---|---|---|---|---|
| {{ rule.name }} | {{ truncate(rule.dsl_expression) }} | {{ truncate(rule.filter_expression) || 'N/A' }} |
{{ strategy.name }}
None
|
{{ rule.is_active ? 'Active' : 'Inactive' }} |
|
No guardrails found
Click "New Guardrail" to create your first reusable pricing constraint| Order | {{ t('tableSort.guardrails.name') }} | {{ t('tableSort.guardrails.expression') }} | {{ t('tableSort.guardrails.note') }} | {{ t('tableSort.guardrails.status') }} | Global | Actions | |
|---|---|---|---|---|---|---|---|
| {{ guardrail.name }} | {{ truncate(guardrail.dsl_expression, 80) }} |
{{ guardrail.note || '-' }} | {{ guardrail.is_active ? 'Active' : 'Inactive' }} | {{ guardrail.is_global ? 'Global' : 'Strategy' }} |
|
| Validity | Global | Actions | |||||||
|---|---|---|---|---|---|---|---|---|---|
| #{{ rule.id }} |
{{ rule.domainLabel }}
{{ truncate(rule.domainDetail, 80) }}
|
{{ truncate(rule.targetSummary, 80) }}
{{ truncate(rule.targetDetail, 80) }}
|
{{ truncate(rule.actionSummary, 80) }}
{{ truncate(rule.actionDetail, 80) }}
{{ flag }}
|
{{ rule.updatedLabel || '?' }} | {{ rule.validityLabel }} | Yes ? | {{ rule.statusLabel }} | {{ rule.ownerName || '?' }} |
|
| No rules found. | |||||||||
| Actions | ||||
|---|---|---|---|---|
| {{ tier.tier_name }} | {{ tier.tier_remote_id }} | {{ tier.project_domain || 'Shared' }} | {{ tier.description }} |
|
| ID | Entity Type | Entity Name | Action | User | Date & Time | Actions |
|---|---|---|---|---|---|---|
| {{ log.id }} | {{ log.entity_type === 'single_rule' ? 'single rule' : log.entity_type }} | {{ log.action_type }} | {{ log.user_name || 'Unknown' }} | {{ formatDateTime(log.created_at) }} |
|
|
| No log entries found. | ||||||
| ID | API Key | Endpoint | Method | Status | IP Address | User Agent | Date & Time |
|---|---|---|---|---|---|---|---|
| {{ log.id }} | {{ log.api_key_prefix || 'N/A' }} | {{ log.method }} | {{ log.status_code }} | {{ log.ip_address }} | {{ formatDateTime(log.created_at) }} | ||
| No API key usage logs found. | |||||||
| Actions | |||||||
|---|---|---|---|---|---|---|---|
| {{ tier.tier_name }} | {{ tier.project_domain || 'Shared' }} | {{ displayNumber(tier.price_100) }} | {{ displayNumber(tier.price_200) }} | {{ displayNumber(tier.price_300) }} | {{ displayNumber(tier.price_400) }} | {{ displayNumber(tier.price_10000) }} |
|
| Actions | |||||
|---|---|---|---|---|---|
| {{ route.name }} | {{ route.route || 'N/A' }} | {{ route.description || 'N/A' }} | {{ route.endpoint_url || 'N/A' }} | {{ route.is_active ? 'Active' : 'Inactive' }} |
|
No dynamic tags found
Click "New Dynamic Tag" to create a tag that will be assigned to products matching a filter expression| Order | {{ t('tableSort.dynamicTags.name') }} | {{ t('tableSort.dynamicTags.expression') }} | {{ t('tableSort.dynamicTags.note') }} | {{ t('tableSort.dynamicTags.status') }} | Actions | |
|---|---|---|---|---|---|---|
| {{ tag.name }} | {{ truncate(tag.dsl_expression, 80) }} |
{{ tag.note || '-' }} | {{ tag.is_active ? 'Active' : 'Inactive' }} |
|
| Date | Domain | Tag | EAN | Abra ID | Price | Currency | Type | User | Active | Actions | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ formatDate(item.datum) }} | {{ item.domena || 'N/A' }} | {{ item.tag || '-' }} | {{ item.EAN }} | {{ item.produkt }} | {{ item.cena }} | {{ item.mena || 'CZK' }} | {{ item.typ === 'fixed' ? 'Fixed Price' : (item.typ === 'rrp' ? 'RRP' : 'Manual') }} | {{ item.user || item.uzivatel || 'N/A' }} | {{ item.aktivni == 1 ? 'Active' : 'Inactive' }} |
|
Import RRP Data from XLSX
Step 1: Select Import Options
Import Mode:
Click to select XLSX file or drag & drop
Supported formats: .xlsx, .xlsStep 2: Map Columns to Database Fields
Import Preview - First 10 Products
| Product Name | EAN/ID | Domain | Price | Type | Tag | Action |
|---|---|---|---|---|---|---|
|
{{ row.name || '-' }}
? Has validation errors
|
{{ row.product_id || '-' }} |
{{ row.domena || '-' }} | {{ row.price || '-' }} {{ row.currency }} | {{ row.type === 'fixed' ? 'Fixed' : 'RRP' }} | {{ row.tag || '-' }} |
{{ row._exists.action === 'update' ? 'Will Update' :
row._exists.action === 'create' ? 'Will Create' :
row._exists.action === 'verify' ? 'Needs Review' : '-' }}
{{ row._exists.reason }}
|
RRP Prices Detected - Create Rules?
Your import contains only fixed prices. These will be imported directly without creating rules.
Single Rules Preview
What will happen:
- Import prices to database
- Automatically create/update single pricing rules from RRP data (Fixed prices won't create rules)
- Rules will be grouped by Tag + Domain combinations
- All rules will be created in inactive state for safety
- ? You can activate and configure them in Single Rules section after import
Rule Strategy: RRP-based pricing
Estimated Rules: {{ new Set(state.rrpDatabase.previewData.filter(row => (!row.type || row.type === 'rrp') && row.tag && row.domena).map(row => row.tag + '|' + row.domena)).size }} rules (based on unique Tag + Domain combinations from RRP data)
Step 3: Import Complete
Successfully imported {{ rrpImportResult?.imported || 0 }} RRP records.
Single Rules Created/Updated:
-
{{ rule.action === 'created' ? 'Created' : 'Updated' }} rule "{{ rule.tag }}" ({{ rule.product_count }} products, {{ rule.sale_percent }}% discount) - Global
All rules are inactive by default. Activate them in Single Rules section.
? RRP prices imported successfully. No single rules were created.
Single Rules Creation Warning
RRP prices were imported successfully, but there was an issue creating single rules:
{{ rrpImportResult.single_rules_error }}
Product Repricing Logs
Inspect recent MySQL output or long-term BigQuery history for a single product.
Price & Margin Timeline
| Processed | Domain | Warehouse | Buy (w/o VAT) | Sell (with VAT) | Margin % | Strategy | Competition | Note | Debug |
|---|---|---|---|---|---|---|---|---|---|
| {{ row.processed_at || row.recorded_at || '--' }} | {{ row.domain || productLogs.meta.domain || '--' }} | {{ row.warehouse_id || row.wh || row.pricelist || '--' }} | {{ formatCurrency(row.buy_price_without_vat || row.buy_without_vat || row.buy_price_with_vat || row.buy, productLogs.meta.currency) }} | {{ formatCurrency(row.final_price_with_vat || row.price_with_vat || row.price, productLogs.meta.currency) }} | {{ formatPercent(row.margin_percentage || row.margin) }} | {{ row.strategy_used || row.strategy || '--' }} | {{ row.competition_count !== undefined && row.competition_count !== null ? row.competition_count : '--' }} |
| Date | Buy (CZK) | Sell (CZK) | Margin % | Warehouse | Note |
|---|---|---|---|---|---|
| {{ row.datum || '--' }} | {{ formatCurrency(row.cbuy || row.buy, 'CZK') }} | {{ formatCurrency(row.cprice || row.price, 'CZK') }} | {{ formatPercent(row.margin) }} | {{ row.wh || '--' }} |
Debug details
{{ productLogDiagnostics.summary }}
{{ productLogDiagnostics.json }}
Global Product Logs
View repricing changes for a product across every project, without selecting a domain.
| Recorded | Project | Warehouse | Buy Price | Sell Price | Margin | Strategy |
|---|---|---|---|---|---|---|
| {{ row.recorded_at || '--' }} | {{ row.domain || '--' }} | {{ row.warehouse || row.wh || '--' }} | {{ formatCurrency(row.buy || row.buy_price_without_vat || row.buy_price_with_vat, (globalProductLogs.meta && globalProductLogs.meta.currency) || 'CZK') }} | {{ formatCurrency(row.price_with_vat || row.price || row.price_without_vat, (globalProductLogs.meta && globalProductLogs.meta.currency) || 'CZK') }} | {{ formatPercent(row.margin) }} | {{ row.strategy || row.strategy_used || '--' }} |
Repricing Debug Console
Inspect cached inputs, evaluate strategy coverage, and run wait-mode repricing in one place.
Strategy Overview
-
{{ strategy.name }}
Rules for {{ selectedRepricingStrategy.name }}
| # | Name | Filter result | Expression |
|---|---|---|---|
| {{ rule.priority || '-' }} | {{ rule.name }} | {{ rule.matched ? 'Matched' : 'Not matched' }} |
{{ rule.dsl_expression || '-' }}
|
DSL Variables Available
{{ Object.keys(repricingDebug.repriceResult.dsl_variables_available).length }} variables you can use in DSL expressions{{ key }}
{{ formatDslVariableValue(value) }}
Repricing Output
Detailed Execution Log
Step-by-step repricing process
{{ JSON.stringify(repricingDebug.repriceResult.data_used, null, 2) }}