{{ menuItems.find(item => item.id === currentView)?.name || 'Dashboard' }}
{{ currentEnvironment }}⚠️ Production Environment
You are managing the PRODUCTION environment. Changes will affect live data. Please be careful!
Total Products
{{ stats.products }}
Total Doctors
{{ stats.doctors }}
Total Pharmacies
{{ stats.pharmacies }}
Total Orders
{{ stats.orders }}
Quick Actions
Slack Error Logging Test
Developer Tools
Test that Slack error notifications are working correctly. Messages will be sent to #soos-errors.
{{ slackTestResult.message }}
| Image | Name / Abbreviation | THC / CBD | Price / Stock | Category | CannaFlow | Status | Actions |
|---|---|---|---|---|---|---|---|
|
|
{{ product.name }}
{{ product.abbreviation || '-' }}
|
THC: {{ product.syncedFields?.thc || '-' }}%
CBD: {{ product.syncedFields?.cbd || '-' }}%
|
€{{ (product.syncedFields?.price / 100).toFixed(2) || '0.00' }}
Stock: {{ product.syncedFields?.stock || 0 }}
|
{{ product.category || '-' }} | {{ product.cannaflowId }} Not linked | {{ product.active !== false ? 'Active' : 'Inactive' }} |
| Image | Product Name | Category | Manufacturer | Variants | Status | Actions |
|---|---|---|---|---|---|---|
|
|
{{ template.displayName }}
{{ template.cultivar || '-' }}
|
{{ template.category || '-' }} | {{ template.manufacturer || '-' }} |
{{ template.cannaflowIds?.length || 0 }}
({{ getAvailableVariantCount(template) }} available)
|
{{ template.active !== false ? 'Active' : 'Inactive' }} |
{{ selectedTemplate.displayName }}
{{ selectedTemplate.cannaflowIds?.length || 0 }} variants
No variants found for this template
| Name | Specialty | Phone | Actions | |
|---|---|---|---|---|
|
{{ doctor.name }}
|
{{ doctor.specialty }} | {{ doctor.email }} | {{ doctor.phone }} |
| Name | Phone | Address | Actions | |
|---|---|---|---|---|
|
{{ pharmacy.name }}
|
{{ pharmacy.email }} | {{ pharmacy.phone }} | {{ pharmacy.street }}, {{ pharmacy.city }} {{ pharmacy.zip }} |
Catalog Sync
Updates prices & availability from pharmacy catalog
{{ catalogSyncResult.stats?.variantsUpdated || 0 }}
Updated
{{ catalogSyncResult.stats?.variantsCreated || 0 }}
Created
{{ catalogSyncResult.stats?.variantsUnavailable || 0 }}
Unavailable
Registry Sync
Scans full Cannaflow registry for new variants
{{ registrySyncResult.stats?.registryProductsScanned || 0 }}
Products Scanned
{{ registrySyncResult.stats?.newVariantsDetected || 0 }}
New Variants Found
⚠️ Broken products skipped:
{{ registrySyncResult.stats.brokenProducts.join(', ') }}
Google Sheet Import
Import templates & variants from the product spreadsheet
{{ sheetImportResult.stats?.totalRows || 0 }}
Rows
{{ sheetImportResult.stats?.templatesCreated || 0 }}
Templates Created
{{ sheetImportResult.stats?.templatesUpdated || 0 }}
Templates Updated
{{ sheetImportResult.stats?.variantsCreated || 0 }}
Variants Created
{{ sheetImportResult.stats?.skipped || 0 }}
Skipped
⚠️ {{ sheetImportResult.stats.errors.length }} errors:
Sync Status
Templates
{{ variantSyncStatus.templatesCount || 0 }}
Active Variants
{{ variantSyncStatus.activeVariantsCount || 0 }}
Last Catalog Sync
{{ variantSyncStatus.lastCatalogSync ? formatDateTime(variantSyncStatus.lastCatalogSync) : 'Never' }}
Last Registry Scan
{{ variantSyncStatus.lastRegistryScan ? formatDateTime(variantSyncStatus.lastRegistryScan) : 'Never' }}
Last Sheet Import
{{ variantSyncStatus.lastSheetImport ? formatDateTime(variantSyncStatus.lastSheetImport) : 'Never' }}
Click refresh to load sync status
Catalog Sync
- • Fetches products from pharmacy catalog
- • Updates prices, availability, stock
- • Runs automatically every 6 hours
- • Only updates existing variants
Registry Sync
- • Scans full Cannaflow registry
- • Detects new variants for templates
- • Sends email notifications
- • Handles broken products gracefully
Sheet Import
- • Imports from Google Spreadsheet
- • Creates templates & variants
- • Use "Dry Run" to preview
- • Run after updating the sheet
| Order ID | Doctor | User | Status | Items | Created | Actions | |
|---|---|---|---|---|---|---|---|
|
{{ order.id.substring(0, 8) }}...
|
{{ getDoctorName(order.doctorId) }} | {{ order.userId }} |
⚠️
|
{{ order.items?.length || 0 }} items | {{ formatDate(order.createdAt) }} |
Total Vouchers
{{ voucherAnalytics?.totalVouchers || 0 }}
Active Vouchers
{{ voucherAnalytics?.activeVouchers || 0 }}
Total Redemptions
{{ voucherAnalytics?.totalRedemptions || 0 }}
Total Discount Given
€{{ ((voucherAnalytics?.totalDiscountGiven || 0) / 100).toFixed(2) }}
Manage Vouchers
| Code | Type | Value | Applies To | Usage | Status | Actions |
|---|---|---|---|---|---|---|
|
{{ voucher.code }}
{{ voucher.description }}
|
{{ voucher.type }} | {{ voucher.value }}% €{{ (voucher.value / 100).toFixed(2) }} | {{ voucher.appliesTo }} | {{ voucher.usageCount || 0 }} / {{ voucher.usageLimit }} / ∞ | {{ voucher.active ? 'Active' : 'Inactive' }} |
Redemption Statistics
| Voucher Code | Redemptions | Total Discount | Status |
|---|---|---|---|
| {{ stat.code }} | {{ stat.redemptions }} | €{{ (stat.totalDiscount / 100).toFixed(2) }} | {{ stat.active ? 'Active' : 'Inactive' }} |