diff --git a/openspec/specs/data-access/spec.md b/openspec/specs/data-access/spec.md index 6e75c88..224ead4 100644 --- a/openspec/specs/data-access/spec.md +++ b/openspec/specs/data-access/spec.md @@ -1580,7 +1580,7 @@ Task SubmitSearchAsync(Search search, CancellationToken ct = default) #### Stored Procedure ```sql -EXEC dbo.SubmitSearch +EXEC dbo.usp_SubmitSearch @p_UserName = ..., @p_Name = ..., @p_Criteria = ..., diff --git a/openspec/specs/database-schema/spec.md b/openspec/specs/database-schema/spec.md index 0ba5572..a4daed8 100644 --- a/openspec/specs/database-schema/spec.md +++ b/openspec/specs/database-schema/spec.md @@ -91,11 +91,11 @@ The system SHALL store user search requests, criteria, status, and results. - Criteria stores JSON-serialized SearchCriteria object #### Scenario: Insert new search request -- **WHEN** a user "jdoe" submits a search named "Q4 Report" and the SubmitSearch stored procedure is called +- **WHEN** a user "jdoe" submits a search named "Q4 Report" and the usp_SubmitSearch stored procedure is called - **THEN** a new row is inserted with Status = 1 (Submitted), SubmitDT is set to current timestamp, and ID is auto-generated #### Scenario: Search completes successfully -- **WHEN** a search with ID = 123 and Status = 2 (Started) exists and CompleteSearch is called with WasSuccessful = 1 +- **WHEN** a search with ID = 123 and Status = 2 (Started) exists and usp_CompleteSearch is called with WasSuccessful = 1 - **THEN** Status is updated to 3 (Ended), Results contains the Excel binary data, and EndDT is set to current timestamp #### Scenario: Query searches by user @@ -854,12 +854,12 @@ GROUP BY wos.WorkOrderNumber; ## Stored Procedures -### Requirement: SubmitSearch stored procedure +### Requirement: usp_SubmitSearch stored procedure The system SHALL insert a new search request with Status = Submitted (1). ```sql -CREATE PROCEDURE [dbo].[SubmitSearch] ( +CREATE PROCEDURE [dbo].[usp_SubmitSearch] ( @p_UserName VARCHAR(128), @p_Name VARCHAR(128), @p_Criteria VARCHAR(MAX), @@ -874,19 +874,19 @@ CREATE PROCEDURE [dbo].[SubmitSearch] ( - Returns new ID via OUTPUT parameter #### Scenario: Submit new search request -- **WHEN** user "jdoe" submits criteria for Q4 analysis and SubmitSearch is called with UserName, Name, Criteria +- **WHEN** user "jdoe" submits criteria for Q4 analysis and usp_SubmitSearch is called with UserName, Name, Criteria - **THEN** a new Search row is created with Status = 1 and @o_SearchID OUTPUT contains the new ID #### .NET 10 Implementation Notes **Decision**: Keep as stored procedure. This atomic insert-and-return-ID operation benefits from stored procedure encapsulation. The OUTPUT parameter pattern maps directly to Dapper's `Query` with `@o_SearchID OUTPUT` or EF Core's `FromSqlRaw`. -### Requirement: StartSearch stored procedure +### Requirement: usp_StartSearch stored procedure The system SHALL mark a search as started. ```sql -CREATE PROCEDURE [dbo].[StartSearch] (@p_SearchID INT) +CREATE PROCEDURE [dbo].[usp_StartSearch] (@p_SearchID INT) ``` #### Business Rules @@ -895,19 +895,19 @@ CREATE PROCEDURE [dbo].[StartSearch] (@p_SearchID INT) - Sets StartDT = GETDATE() #### Scenario: Worker picks up queued search -- **WHEN** search ID 123 with Status = 1 (Submitted) exists and StartSearch(123) is called +- **WHEN** search ID 123 with Status = 1 (Submitted) exists and usp_StartSearch(123) is called - **THEN** Status = 2 (Started) and StartDT = current time #### .NET 10 Implementation Notes **Decision**: Candidate for C# service layer. Simple single-row UPDATE could be implemented as repository method for better testability. However, keeping as stored procedure is acceptable for consistency with other search lifecycle procedures. -### Requirement: CompleteSearch stored procedure +### Requirement: usp_CompleteSearch stored procedure The system SHALL mark a search as completed with results. ```sql -CREATE PROCEDURE [dbo].[CompleteSearch] ( +CREATE PROCEDURE [dbo].[usp_CompleteSearch] ( @p_SearchID INT, @p_WasSuccessful BIT, @p_Results VARBINARY(MAX) @@ -921,23 +921,23 @@ CREATE PROCEDURE [dbo].[CompleteSearch] ( - Sets EndDT = GETDATE() #### Scenario: Search completes successfully -- **WHEN** search ID 123 with Status = 2 (Started) exists and CompleteSearch(123, 1, ) is called +- **WHEN** search ID 123 with Status = 2 (Started) exists and usp_CompleteSearch(123, 1, ) is called - **THEN** Status = 3 (Ended), Results = , EndDT = current time #### Scenario: Search fails with error -- **WHEN** search ID 456 with Status = 2 (Started) exists and CompleteSearch(456, 0, NULL) is called +- **WHEN** search ID 456 with Status = 2 (Started) exists and usp_CompleteSearch(456, 0, NULL) is called - **THEN** Status = 4 (Error), Results = NULL, EndDT = current time #### .NET 10 Implementation Notes **Decision**: Keep as stored procedure. The conditional status logic (success vs error) and VARBINARY handling make this a good fit for stored procedure. When migrating to blob storage, this procedure would be modified to store a blob URL instead. -### Requirement: ResetPartialSearches stored procedure +### Requirement: usp_ResetPartialSearches stored procedure The system SHALL reset incomplete searches on application startup. ```sql -CREATE PROCEDURE [dbo].[ResetPartialSearches] +CREATE PROCEDURE [dbo].[usp_ResetPartialSearches] ``` #### Business Rules @@ -947,11 +947,11 @@ CREATE PROCEDURE [dbo].[ResetPartialSearches] - Used on service startup to recover from crashes #### Scenario: Recover from service crash -- **WHEN** search ID 789 has Status = 2, StartDT = yesterday, EndDT = NULL and ResetPartialSearches is called on service startup +- **WHEN** search ID 789 has Status = 2, StartDT = yesterday, EndDT = NULL and usp_ResetPartialSearches is called on service startup - **THEN** Status = 1 (Submitted), StartDT = NULL, and the search will be re-processed #### Scenario: Ignore completed searches -- **WHEN** search ID 111 has Status = 3, StartDT and EndDT both set and ResetPartialSearches is called +- **WHEN** search ID 111 has Status = 3, StartDT and EndDT both set and usp_ResetPartialSearches is called - **THEN** search ID 111 is unchanged (EndDT is not NULL) #### .NET 10 Implementation Notes @@ -1163,7 +1163,7 @@ CREATE PROCEDURE dbo.usp_ValidateSearchCriteria(@SearchId INT) --- -### Requirement: MatchMIS function +### Requirement: fn_MatchMIS function The system SHALL provide a table-valued function to match work order steps to MIS data. @@ -1222,11 +1222,11 @@ The system SHALL provide a table-valued function to match work order steps to MI 8. Returns input parameters with NULL MIS fields if no matches at all #### Scenario: Match via routing with current MIS -- **WHEN** work order 12345, step 10 with function code "ASSY" is processed and MatchMIS finds a routing entry in F3112Z1 and MIS data exists with Status = 'Current' +- **WHEN** work order 12345, step 10 with function code "ASSY" is processed and fn_MatchMIS finds a routing entry in F3112Z1 and MIS data exists with Status = 'Current' - **THEN** RoutingMatch = 1, MasterMatch = 0, MIS fields populated #### Scenario: Fallback to master routing -- **WHEN** work order 12345, step 10 with no routing entry is processed and MatchMIS finds match in F3003 RouteMaster +- **WHEN** work order 12345, step 10 with no routing entry is processed and fn_MatchMIS finds match in F3003 RouteMaster - **THEN** RoutingMatch = 0, MasterMatch = 1, MatchedSequenceNumber from master #### Scenario: Fallback to BackLevel MIS @@ -1234,7 +1234,7 @@ The system SHALL provide a table-valued function to match work order steps to MI - **THEN** Status = 'BackLevel' MIS data is returned #### Scenario: No MIS data available -- **WHEN** routing match found but no MIS data exists and MatchMIS completes +- **WHEN** routing match found but no MIS data exists and fn_MatchMIS completes - **THEN** RoutingMatch/MasterMatch set, MIS fields = NULL --- @@ -1342,10 +1342,10 @@ Current implementation stores Excel results as `VARBINARY(MAX)` in the Search.Re | Procedure | Decision | Rationale | |-----------|----------|-----------| -| SubmitSearch | Keep | Atomic INSERT with OUTPUT parameter | -| StartSearch | Keep (or migrate) | Simple UPDATE, but consistency with lifecycle | -| CompleteSearch | Keep | Conditional logic, VARBINARY handling | -| ResetPartialSearches | Keep | Bulk conditional UPDATE at startup | +| usp_SubmitSearch | Keep | Atomic INSERT with OUTPUT parameter | +| usp_StartSearch | Keep (or migrate) | Simple UPDATE, but consistency with lifecycle | +| usp_CompleteSearch | Keep | Conditional logic, VARBINARY handling | +| usp_ResetPartialSearches | Keep | Bulk conditional UPDATE at startup | All procedures can be called from .NET 10 via Dapper or EF Core. Migration to C# service layer is optional and would primarily benefit unit testing (mockable repository interfaces). diff --git a/openspec/specs/search-processing/spec.md b/openspec/specs/search-processing/spec.md index a32a1f4..48b0d26 100644 --- a/openspec/specs/search-processing/spec.md +++ b/openspec/specs/search-processing/spec.md @@ -545,7 +545,7 @@ The system SHALL optionally extract Manufacturing Information System (MIS) data - `ExtractMisData` flag from search criteria - `ItemOperationMisFilter` entries (when filtering by specific MIS) -- Work order step data joined with MIS matching function `dbo.MatchMIS` +- Work order step data joined with MIS matching function `dbo.fn_MatchMIS` #### Outputs @@ -562,7 +562,7 @@ The system SHALL optionally extract Manufacturing Information System (MIS) data #### Business Rules - MIS extraction is only performed when `ExtractMisData = true` -- The `MatchMIS` table-valued function handles MIS record matching logic +- The `fn_MatchMIS` table-valued function handles MIS record matching logic - RoutingMatch indicates match to F3112Z1 (work order routing) records - MasterMatch indicates match to F3003 (item master routing) records - Non-match results include work orders where neither RoutingMatch nor MasterMatch is true, or MisNumber is null @@ -792,9 +792,9 @@ Circular references in work order relationships are **handled implicitly** by th MIS non-match results are **always included** when `ExtractMisData = true`. The non-match data is valuable for quality investigations and should not be optional. -### Decision: MatchMIS function availability +### Decision: fn_MatchMIS function availability -The `dbo.MatchMIS` table-valued function **must be recreated** in the migrated database. It is a custom SQL Server function that implements MIS record matching logic based on work order routing, master routing, and operation parameters. +The `dbo.fn_MatchMIS` table-valued function **must be recreated** in the migrated database. It is a custom SQL Server function that implements MIS record matching logic based on work order routing, master routing, and operation parameters. ### Decision: Filter validation location diff --git a/openspec/specs/sql-business-logic/spec.md b/openspec/specs/sql-business-logic/spec.md index d115f3a..3996c54 100644 --- a/openspec/specs/sql-business-logic/spec.md +++ b/openspec/specs/sql-business-logic/spec.md @@ -18,7 +18,7 @@ This specification documents stored procedures and functions that implement data ### Requirement: Submit search procedure -The system SHALL provide a SubmitSearch stored procedure that creates new search records in the database. +The system SHALL provide a usp_SubmitSearch stored procedure that creates new search records in the database. #### Inputs @@ -39,7 +39,7 @@ The system SHALL provide a SubmitSearch stored procedure that creates new search #### Scenario: Submit new search -- **WHEN** SubmitSearch is called with valid username, search name, and criteria +- **WHEN** usp_SubmitSearch is called with valid username, search name, and criteria - **THEN** a new Search record is inserted with Status = 1 (Queued) - **AND** SubmitDT is set to the current timestamp - **AND** the new SearchId is returned via the @o_SearchID OUTPUT parameter @@ -54,7 +54,7 @@ The system SHALL provide a SubmitSearch stored procedure that creates new search ### Requirement: Start search procedure -The system SHALL provide a StartSearch stored procedure that marks a search as being actively processed. +The system SHALL provide a usp_StartSearch stored procedure that marks a search as being actively processed. #### Inputs @@ -72,7 +72,7 @@ The system SHALL provide a StartSearch stored procedure that marks a search as b #### Scenario: Start processing a queued search -- **WHEN** StartSearch is called with a valid SearchID +- **WHEN** usp_StartSearch is called with a valid SearchID - **THEN** the search Status is updated to 2 (Processing) - **AND** StartDT is set to the current timestamp @@ -80,7 +80,7 @@ The system SHALL provide a StartSearch stored procedure that marks a search as b ### Requirement: Complete search procedure -The system SHALL provide a CompleteSearch stored procedure that finalizes a search with results or failure status. +The system SHALL provide a usp_CompleteSearch stored procedure that finalizes a search with results or failure status. #### Inputs @@ -101,14 +101,14 @@ The system SHALL provide a CompleteSearch stored procedure that finalizes a sear #### Scenario: Complete successful search -- **WHEN** CompleteSearch is called with WasSuccessful = 1 and Excel binary data +- **WHEN** usp_CompleteSearch is called with WasSuccessful = 1 and Excel binary data - **THEN** the search Status is updated to 3 (Complete) - **AND** the Results column contains the Excel binary - **AND** EndDT is set to the current timestamp #### Scenario: Complete failed search -- **WHEN** CompleteSearch is called with WasSuccessful = 0 +- **WHEN** usp_CompleteSearch is called with WasSuccessful = 0 - **THEN** the search Status is updated to 4 (Failed) - **AND** EndDT is set to the current timestamp @@ -116,7 +116,7 @@ The system SHALL provide a CompleteSearch stored procedure that finalizes a sear ### Requirement: Reset partial searches procedure -The system SHALL provide a ResetPartialSearches stored procedure that recovers searches stuck in a processing state. +The system SHALL provide a usp_ResetPartialSearches stored procedure that recovers searches stuck in a processing state. #### Inputs @@ -135,7 +135,7 @@ The system SHALL provide a ResetPartialSearches stored procedure that recovers s #### Scenario: Service restart recovery -- **WHEN** the worker service starts and calls ResetPartialSearches +- **WHEN** the worker service starts and calls usp_ResetPartialSearches - **THEN** all searches with StartDT set but EndDT NULL are reset - **AND** Status is changed back to 1 (Queued) - **AND** StartDT is cleared to NULL @@ -143,14 +143,14 @@ The system SHALL provide a ResetPartialSearches stored procedure that recovers s #### Scenario: No stuck searches -- **WHEN** ResetPartialSearches is called with no searches in partial state +- **WHEN** usp_ResetPartialSearches is called with no searches in partial state - **THEN** no records are modified --- ### Requirement: MIS matching function -The system SHALL provide a MatchMIS table-valued function that correlates work order operations with Manufacturing Information System (MIS) quality documents. +The system SHALL provide a fn_MatchMIS table-valued function that correlates work order operations with Manufacturing Information System (MIS) quality documents. #### Inputs @@ -198,14 +198,14 @@ Returns a table with the following columns: #### Scenario: Match via work order routing with current MIS -- **WHEN** MatchMIS is called for a work order with routing data +- **WHEN** fn_MatchMIS is called for a work order with routing data - **AND** a current MIS document exists for the matched sequence - **THEN** results include RoutingMatch = 1 and full MIS details - **AND** MasterMatch indicates whether route master also matched #### Scenario: Match via route master when no routing exists -- **WHEN** MatchMIS is called for a work order without specific routing +- **WHEN** fn_MatchMIS is called for a work order without specific routing - **AND** a route master entry exists for the item/branch/work center - **THEN** results include MasterMatch = 1 and RoutingMatch = 0 - **AND** MIS details are included if available @@ -244,7 +244,7 @@ Returns a table with the following columns: [New Search] | v - SubmitSearch + usp_SubmitSearch | v +-------+ @@ -253,7 +253,7 @@ Returns a table with the following columns: +---+---+ | | | v | - StartSearch ResetPartialSearches + usp_StartSearch usp_ResetPartialSearches | | v | +----------+ | @@ -262,7 +262,7 @@ Returns a table with the following columns: +----+-----+ | v - CompleteSearch + usp_CompleteSearch | +---------------+ | |