What's New
Stay up to date with the latest features, improvements, and fixes
What's New in Margin Master
Stay up to date with the latest features, improvements, and fixes.
MarginMaster v2026.817.38458 v2026.817.38458
August 17, 2026 29 changes-
Bulk "Resolve Unassigned" menu in SKU Level Exceptions
A new "Resolve Unassigned" submenu appears in the SKU Level Exceptions hamburger menu when any active exceptions lack a price level. It offers three bulk actions: Delete All (removes all unassigned exceptions), Inactivate All (keeps them in the list but marks them inactive to clear the pre-flight warning), and Assign Price Level (opens a picker to set all of them to Retail, Level 1, CurrentPrice, or another self-contained level). Imported strategies often carry hundreds of unassigned exceptions, and this feature eliminates the need to fix them one row at a time.
-
Bulk "Resolve Unassigned" menu in Manage Custom Groups
The same "Resolve Unassigned" submenu is now available in Manage Custom Groups. When any active groups lack a price level, the menu shows how many exist and offers Delete All (removes groups and their SKUs after confirmation), Inactivate All (marks them inactive but keeps them in the list), and Assign Price Level (sets all groups to a chosen level and saves).
-
Same-day installation script logs attached to issues
The issue submission process now automatically collects and uploads script transcript logs written on the current day, packaged as MM_ScriptLogs_{timestamp}.zip. Three sources are scanned: Support Scripts dialog transcripts (Install/Upgrade-SQLExpress, Install-SSMS, etc.), Guided SQL Server Setup runner logs, and Diagnostic Tool script logs. Files locked by running scripts are read with shared access, and unreadable files are skipped. Upload is best-effort and never blocks issue submission.
-
Automatic script log attachment to support issues
A new ScriptLogCollector service automatically attaches installation and upgrade script transcripts to submitted issues when those scripts ran on the same day as the issue submission. It collects logs from three sources: Support Scripts dialog transcripts (SQL Server install/upgrade, SSMS install/update), Guided SQL Server Setup runner logs, and Diagnostic Tool script logs. All same-day logs are zipped into a single archive and uploaded as "Installation script logs" attachment. Files still locked by running scripts are read with shared access, and any collection failures are logged but do not block issue submission.
-
Store Manager Epicor store sorting by character ordinal
Enhanced Store Manager query to order Epicor stores by their character ordinal value while non-Epicor stores continue to sort numerically when possible, ensuring consistent and logical store ordering in the grid.
-
Strategy pre-flight now suggests bulk resolution
When the strategy pre-flight check finds rules that cannot price (no price level set), the confirmation dialog now mentions "To fix these in bulk, use 'Resolve Unassigned' in the menu of the Sku Level Exceptions or Manage Custom Groups window," directing users to the new bulk-fix tools.
-
Manual catalog SKU additions now persist correctly
Fixed a database constraint issue where manually added catalog SKUs (via "Add From Catalog") silently failed to save their tracking records. The INSERT statement relied on a CreateDate database default that was missing on databases created by the schema generator, causing SQL error 515. The error was swallowed by exception handling, and subsequent rebuilds dropped the SKU because no tracking record existed to re-add it. The fix explicitly supplies CreateDate during insert, heals existing databases missing the constraint, and ensures future databases include all model-defined defaults.
-
Manual catalog SKU additions now succeed in new databases
Fixed SQL error 515 where manually adding SKUs to vendor catalogs would silently fail because the CreateDate column lacked a default value. The schema creator now emits DEFAULT constraints declared in the data model, and a startup migration heals existing databases that were created without these defaults.
-
Setup scripts now properly embedded in installer
Corrected the build configuration to include PowerShell setup scripts (Upgrade-SSMS.ps1, Install-DotNetRuntime.ps1, etc.) as embedded resources. Previously, a typo in the file path glob (`..\..\scripts` instead of `..\scripts`) caused the build to search outside the repository root, so no scripts were ever included. This meant the 3-tier fallback system (cloud download → local cache → embedded backup) was silently broken at tier 3, and installations failed when both cloud and cache were unavailable.
-
Fixed missing embedded setup scripts causing SQL Server installation failures
The project file incorrectly referenced a non-existent directory (`..\..\scripts`) for embedding PowerShell setup scripts, causing the build to silently exclude them. This meant the three-tier fallback system (cloud → local cache → embedded) failed at tier 3, breaking SQL Server setup for customers when the cloud copy was missing and the local cache was stale. The path has been corrected to ``..\scripts`` and new automated tests now validate that all required scripts are properly embedded in every build.
-
Fixed RSC hijacking when vendor store numbers match Epicor character ordinals
Resolved issue where GetSpecificRSCAsync would incorrectly translate a vendor store number against the STOREMATCHUP ordinal table, causing stores whose vendor number matched another store's Epicor character ordinal to be priced off the wrong RSC. For example, vendor store 69 matched ordinal 69 ('E' = store 862) and received RSC 03 instead of its correct RSC 05. The DIB Compass rebuild now passes a flag to skip ordinal translation since it already has the vendor store number, while all other callers remain unchanged.
-
Fixed case-sensitivity issue in scripts folder
Normalized file paths for setup scripts that were tracked under a capital-S `Scripts/` folder while other scripts used lowercase `scripts/`. On Windows these appeared identical but caused the cloud upload process to miss certain files. All scripts are now consolidated under the lowercase `scripts/` directory.
-
Fixed Store Manager hiding case-distinct Epicor store pairs
Corrected Store Manager's deduplication query to use case-sensitive collation (Latin1_General_CS_AS) when partitioning on PosStoreNumber. Previously, the default case-insensitive database collation merged Epicor stores with case-distinct identifiers ('e' vs 'E' are different stores in Epicor) into single rows, hiding stores and preventing STORERSC projection to hidden stores. A 68-store site was rendering only 46 rows in the grid.
-
Script log documentation updated
Issue submission documentation now describes the three-bucket auto-attachment system: application logs, strategy execution logs, and same-day installation script logs. Search keywords updated to include "strategy execution logs", "installation script logs", and "script transcript".
-
Manual catalog insert now explicitly provides CreateDate
Updated the INSERT statement for manual catalog items to explicitly provide GETDATE() for CreateDate as a defensive measure, ensuring the operation succeeds even if the DEFAULT constraint is somehow missing.
-
Progress updates during script log collection
Both the full Submit Issue wizard and Quick Issue Submit dialog now display "Collecting installation script logs..." and "Uploading installation script logs..." status messages during the attachment process, providing visibility into this new automatic step.
-
"Unassigned" status filter added to SKU Level Exceptions
A new "Unassigned" radio button filter was added to the SKU Level Exceptions screen, alongside Active, Inactive, and Errors. It shows only active exceptions that have no price level set, making it easy to review which rows the Resolve Unassigned actions will affect.
-
Issue submission progress messages for script logs
Both the full Submit Issue wizard and Quick Issue Submit dialogs now display "Collecting installation script logs..." and "Uploading installation script logs..." status messages when script transcripts are found and attached. This upload occurs after the standard application log attachment and before database backup/additional file uploads.
-
Automatic repair of missing database defaults
Added a startup healing routine that detects and repairs existing databases missing the CreateDate default constraint on ManualCatalogItems table. The fix runs idempotently on every startup, ensuring all installations are automatically corrected without manual intervention.
-
Schema creator now honors default value constraints
The MigrationBasedSchemaCreator now emits DEFAULT constraints (both SQL expressions and literal values) when creating tables, ensuring NOT NULL columns like CreateDate have working defaults. Includes culture-invariant formatting for bool, string, DateTime, and enum defaults.
-
Startup migration heals missing CreateDate default
Added a startup migration that detects and repairs ManualCatalogItems tables created without the CreateDate DEFAULT constraint, preventing insert failures in databases created prior to this fix.
-
Price level assignment policy for bulk actions
A new BulkAssignableLevelPolicy class defines which price levels the "Assign Price Level" action may offer. Only self-contained levels (Retail, Level 1, Level 2, CurrentPrice, StoreCost, vendor-specific levels like Ace_MSURetail, and zone levels) are offered; levels that require a per-rule value (Margin %, Fixed Retail, Cost Break, Set-to-SKU) are excluded because assigning them in bulk would recreate the exact "cannot price" state the action exists to fix. Unit tests pin this exclusion list.
-
Script log collection service added
New ScriptLogCollector service consolidates script transcript discovery across three different app locations (%TEMP%\MarginMaster\InstallationScripts\Logs, %TEMP%\MarginMaster\ScriptLog_*.txt, and C:\ProgramData\RetailerSoft\MarginMaster\DiagnosticTool\Logs\Scripts). Only logs written on the requested date are collected, ensuring relevance to same-day issues. Handles locked files gracefully by reading with FileShare.ReadWrite and deduplicating entry names when multiple sources contain identically-named files.
-
Added automated tests to prevent setup script deployment failures
Created comprehensive tests that verify all setup scripts referenced by the Guided SQL Server Setup window and Installation Scripts dialog are correctly embedded as resources. These tests check for Install-SQLExpress.ps1, Upgrade-SQLExpress.ps1, Install-SSMS.ps1, Upgrade-SSMS.ps1, Uninstall-SSMS.ps1, Uninstall-SQLServer.ps1, Set-ExecutionPolicy.ps1, Install-DotNetRuntime.ps1, and Install-OleDb12.ps1. The build will now fail immediately if any script is missing, preventing this class of silent deployment failure from recurring.
-
Documentation update for attachment workflow
Support documentation updated to describe the three script log sources, same-day collection logic, shared-access file reading for locked transcripts, and best-effort upload behavior.
-
Schema generator now emits DEFAULT constraints
Enhanced MigrationBasedSchemaCreator to emit DEFAULT constraints for all model-defined defaults (both SQL expressions and CLR default values), preventing the same class of failures on future fresh database installations. CLR defaults are formatted as culture-invariant T-SQL literals to ensure cross-locale compatibility.
-
Added automated tests to prevent silent script embed failures
Created SetupScriptEmbeddedResourceTests that verify all setup scripts referenced by the installer (Upgrade-SSMS.ps1, Install-SQLExpress.ps1, Install-DotNetRuntime.ps1, etc.) are properly embedded with the exact resource names the resolver expects. This prevents the embed glob from silently breaking in future builds due to path changes or git case-folding issues.
-
Reorganized setup script storage location
Removed duplicate Upgrade-SSMS.ps1 script from the root Scripts folder and consolidated all setup scripts under the `scripts` folder (lowercase) to maintain consistency with the repository structure. This cleanup ensures there's a single source of truth for all PowerShell installation scripts.
-
Removed obsolete standalone SSMS upgrade script
Deleted stale root-level Scripts/Upgrade-SSMS.ps1 file. All resolver calls now use the correct version located in the SqlScripts/Powershell subdirectory.
