agentic-qe 3.5.4 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/v3/README.md +1 -1
- package/.claude/agents/v3/qe-message-broker-tester.md +380 -0
- package/.claude/agents/v3/qe-middleware-validator.md +423 -0
- package/.claude/agents/v3/qe-odata-contract-tester.md +484 -0
- package/.claude/agents/v3/qe-pentest-validator.md +359 -0
- package/.claude/agents/v3/qe-qx-partner.md +85 -3
- package/.claude/agents/v3/qe-sap-idoc-tester.md +407 -0
- package/.claude/agents/v3/qe-sap-rfc-tester.md +357 -0
- package/.claude/agents/v3/qe-soap-tester.md +340 -0
- package/.claude/agents/v3/qe-sod-analyzer.md +528 -0
- package/.claude/agents/v3/templates/qx-report-template.html +437 -0
- package/.claude/skills/debug-loop/SKILL.md +61 -0
- package/.claude/skills/enterprise-integration-testing/SKILL.md +735 -0
- package/.claude/skills/middleware-testing-patterns/SKILL.md +798 -0
- package/.claude/skills/observability-testing-patterns/SKILL.md +930 -0
- package/.claude/skills/pentest-validation/SKILL.md +268 -0
- package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +708 -0
- package/.claude/skills/pentest-validation/schemas/output.json +281 -0
- package/.claude/skills/pentest-validation/scripts/validate.sh +402 -0
- package/.claude/skills/pr-review/SKILL.md +61 -0
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +315 -13
- package/.claude/skills/qcsd-development-swarm/SKILL.md +331 -16
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +258 -9
- package/.claude/skills/qcsd-refinement-swarm/SKILL.md +344 -22
- package/.claude/skills/release/SKILL.md +333 -0
- package/.claude/skills/skills-manifest.json +5 -4
- package/.claude/skills/wms-testing-patterns/SKILL.md +949 -0
- package/README.md +30 -21
- package/package.json +2 -2
- package/v3/CHANGELOG.md +57 -0
- package/v3/README.md +23 -20
- package/v3/assets/agents/v3/qe-message-broker-tester.md +380 -0
- package/v3/assets/agents/v3/qe-middleware-validator.md +423 -0
- package/v3/assets/agents/v3/qe-odata-contract-tester.md +484 -0
- package/v3/assets/agents/v3/qe-pentest-validator.md +359 -0
- package/v3/assets/agents/v3/qe-qx-partner.md +90 -12
- package/v3/assets/agents/v3/qe-sap-idoc-tester.md +407 -0
- package/v3/assets/agents/v3/qe-sap-rfc-tester.md +357 -0
- package/v3/assets/agents/v3/qe-soap-tester.md +340 -0
- package/v3/assets/agents/v3/qe-sod-analyzer.md +528 -0
- package/v3/assets/agents/v3/templates/qx-report-template.html +437 -0
- package/v3/assets/skills/debug-loop/SKILL.md +61 -0
- package/v3/assets/skills/enterprise-integration-testing/SKILL.md +735 -0
- package/v3/assets/skills/middleware-testing-patterns/SKILL.md +798 -0
- package/v3/assets/skills/observability-testing-patterns/SKILL.md +930 -0
- package/v3/assets/skills/pentest-validation/SKILL.md +268 -0
- package/v3/assets/skills/pentest-validation/evals/pentest-validation.yaml +708 -0
- package/v3/assets/skills/pentest-validation/schemas/output.json +281 -0
- package/v3/assets/skills/pentest-validation/scripts/validate.sh +402 -0
- package/v3/assets/skills/pr-review/SKILL.md +61 -0
- package/v3/assets/skills/qcsd-cicd-swarm/SKILL.md +2206 -0
- package/v3/assets/skills/qcsd-development-swarm/SKILL.md +2154 -0
- package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +2008 -1753
- package/v3/assets/skills/qcsd-refinement-swarm/SKILL.md +2398 -0
- package/v3/assets/skills/security-visual-testing/SKILL.md +223 -0
- package/v3/assets/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -0
- package/v3/assets/skills/security-visual-testing/schemas/output.json +486 -0
- package/v3/assets/skills/security-visual-testing/scripts/validate.sh +748 -0
- package/v3/assets/skills/sfdipot-product-factors/SKILL.md +239 -0
- package/v3/assets/skills/test-idea-rewriting/SKILL.md +229 -0
- package/v3/assets/skills/wms-testing-patterns/SKILL.md +949 -0
- package/v3/dist/cli/bundle.js +10816 -4625
- package/v3/dist/cli/commands/coverage.d.ts.map +1 -1
- package/v3/dist/cli/commands/coverage.js +29 -0
- package/v3/dist/cli/commands/coverage.js.map +1 -1
- package/v3/dist/cli/commands/learning.d.ts.map +1 -1
- package/v3/dist/cli/commands/learning.js +9 -0
- package/v3/dist/cli/commands/learning.js.map +1 -1
- package/v3/dist/cli/commands/token-usage.d.ts.map +1 -1
- package/v3/dist/cli/commands/token-usage.js +6 -2
- package/v3/dist/cli/commands/token-usage.js.map +1 -1
- package/v3/dist/coordination/protocols/learning-consolidation.d.ts.map +1 -1
- package/v3/dist/coordination/protocols/learning-consolidation.js +1 -0
- package/v3/dist/coordination/protocols/learning-consolidation.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/coordinator.d.ts +8 -0
- package/v3/dist/domains/coverage-analysis/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/coordinator.js +67 -0
- package/v3/dist/domains/coverage-analysis/coordinator.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/interfaces.d.ts +33 -0
- package/v3/dist/domains/coverage-analysis/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/plugin.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/plugin.js +17 -0
- package/v3/dist/domains/coverage-analysis/plugin.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.d.ts +125 -0
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.d.ts.map +1 -0
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.js +317 -0
- package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.js.map +1 -0
- package/v3/dist/domains/coverage-analysis/services/index.d.ts +1 -0
- package/v3/dist/domains/coverage-analysis/services/index.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/index.js +4 -0
- package/v3/dist/domains/coverage-analysis/services/index.js.map +1 -1
- package/v3/dist/domains/enterprise-integration/coordinator.d.ts +91 -0
- package/v3/dist/domains/enterprise-integration/coordinator.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/coordinator.js +672 -0
- package/v3/dist/domains/enterprise-integration/coordinator.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/index.d.ts +14 -0
- package/v3/dist/domains/enterprise-integration/index.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/index.js +18 -0
- package/v3/dist/domains/enterprise-integration/index.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/interfaces.d.ts +376 -0
- package/v3/dist/domains/enterprise-integration/interfaces.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/interfaces.js +11 -0
- package/v3/dist/domains/enterprise-integration/interfaces.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/plugin.d.ts +88 -0
- package/v3/dist/domains/enterprise-integration/plugin.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/plugin.js +515 -0
- package/v3/dist/domains/enterprise-integration/plugin.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.d.ts +67 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.js +670 -0
- package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/index.d.ts +13 -0
- package/v3/dist/domains/enterprise-integration/services/index.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/index.js +13 -0
- package/v3/dist/domains/enterprise-integration/services/index.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.d.ts +88 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.js +560 -0
- package/v3/dist/domains/enterprise-integration/services/message-broker-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.d.ts +75 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.js +618 -0
- package/v3/dist/domains/enterprise-integration/services/odata-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.d.ts +73 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.js +513 -0
- package/v3/dist/domains/enterprise-integration/services/sap-integration-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts +84 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js +639 -0
- package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.d.ts +90 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.d.ts.map +1 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.js +389 -0
- package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.js.map +1 -0
- package/v3/dist/domains/index.d.ts +1 -0
- package/v3/dist/domains/index.d.ts.map +1 -1
- package/v3/dist/domains/index.js +1 -0
- package/v3/dist/domains/index.js.map +1 -1
- package/v3/dist/domains/learning-optimization/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/coordinator.js +1 -0
- package/v3/dist/domains/learning-optimization/coordinator.js.map +1 -1
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.js +1 -0
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.js.map +1 -1
- package/v3/dist/domains/learning-optimization/services/transfer-specialist.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/services/transfer-specialist.js +1 -0
- package/v3/dist/domains/learning-optimization/services/transfer-specialist.js.map +1 -1
- package/v3/dist/domains/test-execution/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/test-execution/coordinator.js +34 -0
- package/v3/dist/domains/test-execution/coordinator.js.map +1 -1
- package/v3/dist/domains/test-generation/services/test-data-generator.d.ts +7 -1
- package/v3/dist/domains/test-generation/services/test-data-generator.d.ts.map +1 -1
- package/v3/dist/domains/test-generation/services/test-data-generator.js +116 -98
- package/v3/dist/domains/test-generation/services/test-data-generator.js.map +1 -1
- package/v3/dist/init/agents-installer.d.ts +4 -0
- package/v3/dist/init/agents-installer.d.ts.map +1 -1
- package/v3/dist/init/agents-installer.js +32 -3
- package/v3/dist/init/agents-installer.js.map +1 -1
- package/v3/dist/init/skills-installer.d.ts.map +1 -1
- package/v3/dist/init/skills-installer.js +4 -1
- package/v3/dist/init/skills-installer.js.map +1 -1
- package/v3/dist/init/types.d.ts.map +1 -1
- package/v3/dist/init/types.js +1 -0
- package/v3/dist/init/types.js.map +1 -1
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.d.ts +16 -0
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.d.ts.map +1 -1
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.js +41 -0
- package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.js.map +1 -1
- package/v3/dist/integrations/ruvector/provider.d.ts.map +1 -1
- package/v3/dist/integrations/ruvector/provider.js +1 -0
- package/v3/dist/integrations/ruvector/provider.js.map +1 -1
- package/v3/dist/kernel/anti-drift-middleware.d.ts +160 -0
- package/v3/dist/kernel/anti-drift-middleware.d.ts.map +1 -0
- package/v3/dist/kernel/anti-drift-middleware.js +376 -0
- package/v3/dist/kernel/anti-drift-middleware.js.map +1 -0
- package/v3/dist/kernel/event-bus.d.ts +29 -1
- package/v3/dist/kernel/event-bus.d.ts.map +1 -1
- package/v3/dist/kernel/event-bus.js +69 -6
- package/v3/dist/kernel/event-bus.js.map +1 -1
- package/v3/dist/kernel/interfaces.d.ts +35 -0
- package/v3/dist/kernel/interfaces.d.ts.map +1 -1
- package/v3/dist/kernel/kernel.d.ts.map +1 -1
- package/v3/dist/kernel/kernel.js +14 -17
- package/v3/dist/kernel/kernel.js.map +1 -1
- package/v3/dist/kernel/unified-memory.d.ts +5 -0
- package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
- package/v3/dist/kernel/unified-memory.js +28 -0
- package/v3/dist/kernel/unified-memory.js.map +1 -1
- package/v3/dist/learning/asymmetric-learning.d.ts +133 -0
- package/v3/dist/learning/asymmetric-learning.d.ts.map +1 -0
- package/v3/dist/learning/asymmetric-learning.js +170 -0
- package/v3/dist/learning/asymmetric-learning.js.map +1 -0
- package/v3/dist/learning/pattern-lifecycle.d.ts +26 -0
- package/v3/dist/learning/pattern-lifecycle.d.ts.map +1 -1
- package/v3/dist/learning/pattern-lifecycle.js +83 -0
- package/v3/dist/learning/pattern-lifecycle.js.map +1 -1
- package/v3/dist/learning/qe-patterns.d.ts +8 -0
- package/v3/dist/learning/qe-patterns.d.ts.map +1 -1
- package/v3/dist/learning/qe-patterns.js.map +1 -1
- package/v3/dist/learning/real-qe-reasoning-bank.d.ts +28 -0
- package/v3/dist/learning/real-qe-reasoning-bank.d.ts.map +1 -1
- package/v3/dist/learning/real-qe-reasoning-bank.js +72 -4
- package/v3/dist/learning/real-qe-reasoning-bank.js.map +1 -1
- package/v3/dist/learning/token-tracker.d.ts +22 -0
- package/v3/dist/learning/token-tracker.d.ts.map +1 -1
- package/v3/dist/learning/token-tracker.js +67 -0
- package/v3/dist/learning/token-tracker.js.map +1 -1
- package/v3/dist/mcp/bundle.js +11099 -4879
- package/v3/dist/mcp/tool-registry.d.ts.map +1 -1
- package/v3/dist/mcp/tool-registry.js +4 -0
- package/v3/dist/mcp/tool-registry.js.map +1 -1
- package/v3/dist/mcp/tools/analysis/token-usage.d.ts +1 -1
- package/v3/dist/mcp/tools/analysis/token-usage.d.ts.map +1 -1
- package/v3/dist/mcp/tools/analysis/token-usage.js +23 -3
- package/v3/dist/mcp/tools/analysis/token-usage.js.map +1 -1
- package/v3/dist/mcp/tools/base.d.ts.map +1 -1
- package/v3/dist/mcp/tools/base.js +1 -15
- package/v3/dist/mcp/tools/base.js.map +1 -1
- package/v3/dist/mcp/tools/coverage-analysis/index.d.ts +7 -0
- package/v3/dist/mcp/tools/coverage-analysis/index.d.ts.map +1 -1
- package/v3/dist/mcp/tools/coverage-analysis/index.js +30 -0
- package/v3/dist/mcp/tools/coverage-analysis/index.js.map +1 -1
- package/v3/dist/optimization/token-optimizer-service.d.ts +7 -0
- package/v3/dist/optimization/token-optimizer-service.d.ts.map +1 -1
- package/v3/dist/optimization/token-optimizer-service.js +10 -1
- package/v3/dist/optimization/token-optimizer-service.js.map +1 -1
- package/v3/dist/shared/types/index.d.ts +20 -1
- package/v3/dist/shared/types/index.d.ts.map +1 -1
- package/v3/dist/shared/types/index.js +1 -0
- package/v3/dist/shared/types/index.js.map +1 -1
- package/v3/dist/strange-loop/healing-controller.d.ts.map +1 -1
- package/v3/dist/strange-loop/healing-controller.js +12 -0
- package/v3/dist/strange-loop/healing-controller.js.map +1 -1
- package/v3/dist/strange-loop/strange-loop.d.ts +14 -0
- package/v3/dist/strange-loop/strange-loop.d.ts.map +1 -1
- package/v3/dist/strange-loop/strange-loop.js +24 -0
- package/v3/dist/strange-loop/strange-loop.js.map +1 -1
- package/v3/dist/strange-loop/types.d.ts +2 -2
- package/v3/dist/strange-loop/types.d.ts.map +1 -1
- package/v3/dist/strange-loop/types.js.map +1 -1
- package/v3/dist/sync/claude-flow-bridge.d.ts.map +1 -1
- package/v3/dist/sync/claude-flow-bridge.js +3 -24
- package/v3/dist/sync/claude-flow-bridge.js.map +1 -1
- package/v3/package.json +12 -9
- /package/{v3/assets/skills/sfdipot-product-factors/skill.md → .claude/skills/sfdipot-product-factors/SKILL.md} +0 -0
- /package/{v3/assets/skills/test-idea-rewriting/skill.md → .claude/skills/test-idea-rewriting/SKILL.md} +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - SAP Integration Testing Service
|
|
3
|
+
* Tests SAP RFC/BAPI calls and validates IDoc structure and segments.
|
|
4
|
+
*
|
|
5
|
+
* ADR-063: Enterprise Integration Testing Gap Closure
|
|
6
|
+
*/
|
|
7
|
+
import { Result } from '../../../shared/types/index.js';
|
|
8
|
+
import type { MemoryBackend } from '../../../kernel/interfaces.js';
|
|
9
|
+
import type { RfcConnection, BapiCall, BapiTestResult, BapiReturn, IDocDefinition, IDocTestResult } from '../interfaces.js';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for the SAP integration service
|
|
12
|
+
*/
|
|
13
|
+
export interface SapIntegrationServiceConfig {
|
|
14
|
+
/** Default language for SAP connections */
|
|
15
|
+
defaultLanguage: string;
|
|
16
|
+
/** Validate BAPI return messages strictly */
|
|
17
|
+
strictReturnValidation: boolean;
|
|
18
|
+
/** Maximum IDoc segment depth for recursive validation */
|
|
19
|
+
maxSegmentDepth: number;
|
|
20
|
+
/** Cache BAPI metadata */
|
|
21
|
+
cacheBapiMetadata: boolean;
|
|
22
|
+
/** Timeout for RFC calls in milliseconds */
|
|
23
|
+
rfcTimeout: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* SAP Integration Testing Service
|
|
27
|
+
* Provides RFC/BAPI call testing and IDoc structure validation
|
|
28
|
+
*/
|
|
29
|
+
export declare class SapIntegrationService {
|
|
30
|
+
private readonly memory;
|
|
31
|
+
private readonly config;
|
|
32
|
+
private readonly bapiMetadataCache;
|
|
33
|
+
constructor(memory: MemoryBackend, config?: Partial<SapIntegrationServiceConfig>);
|
|
34
|
+
/**
|
|
35
|
+
* Validate an RFC connection configuration.
|
|
36
|
+
* Checks for required fields and valid system number format.
|
|
37
|
+
*/
|
|
38
|
+
validateConnection(connection: RfcConnection): Result<string[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Validate a BAPI call structure.
|
|
41
|
+
* Checks for required parameters, naming conventions, and parameter structure.
|
|
42
|
+
*/
|
|
43
|
+
validateBapiCall(bapi: BapiCall): Result<string[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Test a BAPI call by validating the call structure and analyzing the return messages.
|
|
46
|
+
* Simulates BAPI execution analysis without requiring a live SAP connection.
|
|
47
|
+
*/
|
|
48
|
+
testBapiCall(connection: RfcConnection, bapi: BapiCall, returnMessages: BapiReturn[], exportValues?: Record<string, unknown>, tableData?: Record<string, unknown[]>): Promise<Result<BapiTestResult>>;
|
|
49
|
+
/**
|
|
50
|
+
* Validate an IDoc definition structure.
|
|
51
|
+
* Checks segment hierarchy, field definitions, and cardinality.
|
|
52
|
+
*/
|
|
53
|
+
validateIDocDefinition(definition: IDocDefinition): Result<string[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Validate IDoc content against its definition.
|
|
56
|
+
* Checks segment presence, field values, cardinality, and data types.
|
|
57
|
+
*/
|
|
58
|
+
validateIDoc(definition: IDocDefinition, content: string): Promise<Result<IDocTestResult>>;
|
|
59
|
+
/**
|
|
60
|
+
* Clear cached BAPI metadata.
|
|
61
|
+
*/
|
|
62
|
+
clearCache(): void;
|
|
63
|
+
private hasBapiErrors;
|
|
64
|
+
private validateExportParams;
|
|
65
|
+
private validateTableParams;
|
|
66
|
+
private validateSegmentHierarchy;
|
|
67
|
+
private validateIDocFieldDefinition;
|
|
68
|
+
private parseIDocContent;
|
|
69
|
+
private validateIDocSegments;
|
|
70
|
+
private validateIDocFields;
|
|
71
|
+
private validateIDocFieldValue;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=sap-integration-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sap-integration-service.d.ts","sourceRoot":"","sources":["../../../../src/domains/enterprise-integration/services/sap-integration-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAW,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,UAAU,EACV,cAAc,EAGd,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,sBAAsB,EAAE,OAAO,CAAC;IAChC,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD;;;GAGG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmD;gBAGlE,MAAM,EAAE,aAAa,EACtC,MAAM,GAAE,OAAO,CAAC,2BAA2B,CAAM;IASnD;;;OAGG;IACH,kBAAkB,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAgC/D;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAoClD;;;OAGG;IACG,YAAY,CAChB,UAAU,EAAE,aAAa,EACzB,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,UAAU,EAAE,EAC5B,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC1C,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAM,GACxC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IA8ElC;;;OAGG;IACH,sBAAsB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAsBpE;;;OAGG;IACG,YAAY,CAChB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAgFlC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,wBAAwB;IA+ChC,OAAO,CAAC,2BAA2B;IAsCnC,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,oBAAoB;IA2D5B,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,sBAAsB;CAiF/B"}
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - SAP Integration Testing Service
|
|
3
|
+
* Tests SAP RFC/BAPI calls and validates IDoc structure and segments.
|
|
4
|
+
*
|
|
5
|
+
* ADR-063: Enterprise Integration Testing Gap Closure
|
|
6
|
+
*/
|
|
7
|
+
import { ok, err } from '../../../shared/types/index.js';
|
|
8
|
+
const DEFAULT_CONFIG = {
|
|
9
|
+
defaultLanguage: 'EN',
|
|
10
|
+
strictReturnValidation: true,
|
|
11
|
+
maxSegmentDepth: 10,
|
|
12
|
+
cacheBapiMetadata: true,
|
|
13
|
+
rfcTimeout: 60000,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* SAP Integration Testing Service
|
|
17
|
+
* Provides RFC/BAPI call testing and IDoc structure validation
|
|
18
|
+
*/
|
|
19
|
+
export class SapIntegrationService {
|
|
20
|
+
memory;
|
|
21
|
+
config;
|
|
22
|
+
bapiMetadataCache = new Map();
|
|
23
|
+
constructor(memory, config = {}) {
|
|
24
|
+
this.memory = memory;
|
|
25
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
26
|
+
}
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// RFC/BAPI Testing
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Validate an RFC connection configuration.
|
|
32
|
+
* Checks for required fields and valid system number format.
|
|
33
|
+
*/
|
|
34
|
+
validateConnection(connection) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
if (!connection.ashost || connection.ashost.trim() === '') {
|
|
37
|
+
errors.push('Application server host (ashost) is required');
|
|
38
|
+
}
|
|
39
|
+
if (!connection.sysnr || connection.sysnr.trim() === '') {
|
|
40
|
+
errors.push('System number (sysnr) is required');
|
|
41
|
+
}
|
|
42
|
+
else if (!/^\d{2}$/.test(connection.sysnr)) {
|
|
43
|
+
errors.push('System number (sysnr) must be a 2-digit number (e.g., "00", "01")');
|
|
44
|
+
}
|
|
45
|
+
if (!connection.client || connection.client.trim() === '') {
|
|
46
|
+
errors.push('Client number is required');
|
|
47
|
+
}
|
|
48
|
+
else if (!/^\d{3}$/.test(connection.client)) {
|
|
49
|
+
errors.push('Client number must be a 3-digit number (e.g., "100", "800")');
|
|
50
|
+
}
|
|
51
|
+
if (!connection.user || connection.user.trim() === '') {
|
|
52
|
+
errors.push('User is required');
|
|
53
|
+
}
|
|
54
|
+
if (!connection.lang || connection.lang.trim() === '') {
|
|
55
|
+
errors.push('Language is required');
|
|
56
|
+
}
|
|
57
|
+
else if (connection.lang.length !== 2) {
|
|
58
|
+
errors.push('Language must be a 2-character ISO code (e.g., "EN", "DE")');
|
|
59
|
+
}
|
|
60
|
+
return ok(errors);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validate a BAPI call structure.
|
|
64
|
+
* Checks for required parameters, naming conventions, and parameter structure.
|
|
65
|
+
*/
|
|
66
|
+
validateBapiCall(bapi) {
|
|
67
|
+
const errors = [];
|
|
68
|
+
if (!bapi.name || bapi.name.trim() === '') {
|
|
69
|
+
errors.push('BAPI name is required');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// BAPI naming convention check
|
|
73
|
+
if (!bapi.name.startsWith('BAPI_') && !bapi.name.startsWith('RFC_') &&
|
|
74
|
+
!bapi.name.startsWith('Z_') && !bapi.name.startsWith('/')) {
|
|
75
|
+
errors.push(`BAPI name '${bapi.name}' does not follow SAP naming conventions (expected BAPI_*, RFC_*, Z_*, or /<namespace>/)`);
|
|
76
|
+
}
|
|
77
|
+
// Length check (SAP function module names are max 30 chars)
|
|
78
|
+
if (bapi.name.length > 30) {
|
|
79
|
+
errors.push(`BAPI name '${bapi.name}' exceeds SAP maximum of 30 characters`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!bapi.importParams || Object.keys(bapi.importParams).length === 0) {
|
|
83
|
+
errors.push('At least one import parameter is required');
|
|
84
|
+
}
|
|
85
|
+
// Validate parameter names follow SAP naming conventions
|
|
86
|
+
if (bapi.importParams) {
|
|
87
|
+
for (const paramName of Object.keys(bapi.importParams)) {
|
|
88
|
+
if (paramName.length > 30) {
|
|
89
|
+
errors.push(`Import parameter name '${paramName}' exceeds SAP maximum of 30 characters`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return ok(errors);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Test a BAPI call by validating the call structure and analyzing the return messages.
|
|
97
|
+
* Simulates BAPI execution analysis without requiring a live SAP connection.
|
|
98
|
+
*/
|
|
99
|
+
async testBapiCall(connection, bapi, returnMessages, exportValues = {}, tableData = {}) {
|
|
100
|
+
const startTime = Date.now();
|
|
101
|
+
try {
|
|
102
|
+
// Validate connection
|
|
103
|
+
const connectionResult = this.validateConnection(connection);
|
|
104
|
+
if (connectionResult.success && connectionResult.value.length > 0) {
|
|
105
|
+
return err(new Error(`Invalid RFC connection: ${connectionResult.value.join('; ')}`));
|
|
106
|
+
}
|
|
107
|
+
// Validate BAPI call structure
|
|
108
|
+
const callResult = this.validateBapiCall(bapi);
|
|
109
|
+
if (callResult.success && callResult.value.length > 0) {
|
|
110
|
+
return err(new Error(`Invalid BAPI call: ${callResult.value.join('; ')}`));
|
|
111
|
+
}
|
|
112
|
+
// Analyze return messages
|
|
113
|
+
const hasErrors = this.hasBapiErrors(returnMessages);
|
|
114
|
+
const hasAbend = returnMessages.some(msg => msg.type === 'A');
|
|
115
|
+
const passed = !hasErrors && !hasAbend;
|
|
116
|
+
// Determine if transaction should be committed
|
|
117
|
+
const transactionCommitted = passed && !hasAbend;
|
|
118
|
+
// Validate export parameters if expected
|
|
119
|
+
const exportValidationErrors = this.validateExportParams(bapi.exportParams || [], exportValues);
|
|
120
|
+
// Validate table parameters if expected
|
|
121
|
+
const tableValidationErrors = this.validateTableParams(bapi.tableParams || [], tableData);
|
|
122
|
+
const allPassed = passed &&
|
|
123
|
+
exportValidationErrors.length === 0 &&
|
|
124
|
+
tableValidationErrors.length === 0;
|
|
125
|
+
const result = {
|
|
126
|
+
bapiName: bapi.name,
|
|
127
|
+
passed: allPassed,
|
|
128
|
+
returnMessages,
|
|
129
|
+
exportValues,
|
|
130
|
+
tableData,
|
|
131
|
+
duration: Date.now() - startTime,
|
|
132
|
+
transactionCommitted,
|
|
133
|
+
};
|
|
134
|
+
// Store test result for learning
|
|
135
|
+
await this.memory.set(`enterprise-integration:bapi:${bapi.name}:${Date.now()}`, {
|
|
136
|
+
bapiName: bapi.name,
|
|
137
|
+
passed: allPassed,
|
|
138
|
+
returnTypes: returnMessages.map(m => m.type),
|
|
139
|
+
exportParamCount: Object.keys(exportValues).length,
|
|
140
|
+
tableParamCount: Object.keys(tableData).length,
|
|
141
|
+
duration: result.duration,
|
|
142
|
+
timestamp: new Date().toISOString(),
|
|
143
|
+
}, { namespace: 'enterprise-integration', ttl: 86400 * 30 });
|
|
144
|
+
return ok(result);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// ============================================================================
|
|
151
|
+
// IDoc Validation
|
|
152
|
+
// ============================================================================
|
|
153
|
+
/**
|
|
154
|
+
* Validate an IDoc definition structure.
|
|
155
|
+
* Checks segment hierarchy, field definitions, and cardinality.
|
|
156
|
+
*/
|
|
157
|
+
validateIDocDefinition(definition) {
|
|
158
|
+
const errors = [];
|
|
159
|
+
if (!definition.type || definition.type.trim() === '') {
|
|
160
|
+
errors.push('IDoc type is required');
|
|
161
|
+
}
|
|
162
|
+
if (!definition.version || definition.version.trim() === '') {
|
|
163
|
+
errors.push('IDoc version is required');
|
|
164
|
+
}
|
|
165
|
+
if (!definition.segments || definition.segments.length === 0) {
|
|
166
|
+
errors.push('IDoc must have at least one segment');
|
|
167
|
+
return ok(errors);
|
|
168
|
+
}
|
|
169
|
+
// Validate segment hierarchy
|
|
170
|
+
this.validateSegmentHierarchy(definition.segments, '', errors, 0);
|
|
171
|
+
return ok(errors);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Validate IDoc content against its definition.
|
|
175
|
+
* Checks segment presence, field values, cardinality, and data types.
|
|
176
|
+
*/
|
|
177
|
+
async validateIDoc(definition, content) {
|
|
178
|
+
const startTime = Date.now();
|
|
179
|
+
try {
|
|
180
|
+
if (!content || content.trim() === '') {
|
|
181
|
+
return ok({
|
|
182
|
+
idocType: definition.type,
|
|
183
|
+
direction: 'inbound',
|
|
184
|
+
passed: false,
|
|
185
|
+
statusCode: 51,
|
|
186
|
+
statusMessage: 'IDoc content is empty',
|
|
187
|
+
segmentValidation: [],
|
|
188
|
+
processingTime: Date.now() - startTime,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// Validate the definition first
|
|
192
|
+
const defResult = this.validateIDocDefinition(definition);
|
|
193
|
+
if (defResult.success && defResult.value.length > 0) {
|
|
194
|
+
return err(new Error(`Invalid IDoc definition: ${defResult.value.join('; ')}`));
|
|
195
|
+
}
|
|
196
|
+
// Parse the IDoc content into segment data
|
|
197
|
+
const parsedSegments = this.parseIDocContent(content);
|
|
198
|
+
// Validate segments against definition
|
|
199
|
+
const segmentValidation = [];
|
|
200
|
+
this.validateIDocSegments(definition.segments, parsedSegments, segmentValidation);
|
|
201
|
+
// Determine overall status
|
|
202
|
+
const hasErrors = segmentValidation.some(sv => !sv.valid || sv.fieldErrors.length > 0);
|
|
203
|
+
// SAP IDoc status codes:
|
|
204
|
+
// 3 = Successfully posted
|
|
205
|
+
// 51 = Error during application document posting
|
|
206
|
+
// 53 = IDoc posted, no application document
|
|
207
|
+
// 64 = IDoc ready to be transferred
|
|
208
|
+
const statusCode = hasErrors ? 51 : 3;
|
|
209
|
+
const statusMessage = hasErrors
|
|
210
|
+
? 'IDoc validation failed with field/segment errors'
|
|
211
|
+
: 'IDoc validated successfully';
|
|
212
|
+
const result = {
|
|
213
|
+
idocType: definition.type,
|
|
214
|
+
direction: 'inbound',
|
|
215
|
+
passed: !hasErrors,
|
|
216
|
+
statusCode,
|
|
217
|
+
statusMessage,
|
|
218
|
+
segmentValidation,
|
|
219
|
+
processingTime: Date.now() - startTime,
|
|
220
|
+
};
|
|
221
|
+
// Store validation result for learning
|
|
222
|
+
await this.memory.set(`enterprise-integration:idoc:${definition.type}:${Date.now()}`, {
|
|
223
|
+
idocType: definition.type,
|
|
224
|
+
passed: !hasErrors,
|
|
225
|
+
statusCode,
|
|
226
|
+
segmentCount: segmentValidation.length,
|
|
227
|
+
errorCount: segmentValidation.reduce((sum, sv) => sum + sv.fieldErrors.length, 0),
|
|
228
|
+
processingTime: result.processingTime,
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
}, { namespace: 'enterprise-integration', ttl: 86400 * 30 });
|
|
231
|
+
return ok(result);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Clear cached BAPI metadata.
|
|
239
|
+
*/
|
|
240
|
+
clearCache() {
|
|
241
|
+
this.bapiMetadataCache.clear();
|
|
242
|
+
}
|
|
243
|
+
// ============================================================================
|
|
244
|
+
// Private Helper Methods - BAPI
|
|
245
|
+
// ============================================================================
|
|
246
|
+
hasBapiErrors(returnMessages) {
|
|
247
|
+
return returnMessages.some(msg => msg.type === 'E' || msg.type === 'A');
|
|
248
|
+
}
|
|
249
|
+
validateExportParams(expectedParams, exportValues) {
|
|
250
|
+
const errors = [];
|
|
251
|
+
for (const param of expectedParams) {
|
|
252
|
+
if (!(param in exportValues)) {
|
|
253
|
+
errors.push(`Expected export parameter '${param}' not found in response`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return errors;
|
|
257
|
+
}
|
|
258
|
+
validateTableParams(expectedParams, tableData) {
|
|
259
|
+
const errors = [];
|
|
260
|
+
for (const param of expectedParams) {
|
|
261
|
+
if (!(param in tableData)) {
|
|
262
|
+
errors.push(`Expected table parameter '${param}' not found in response`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return errors;
|
|
266
|
+
}
|
|
267
|
+
// ============================================================================
|
|
268
|
+
// Private Helper Methods - IDoc
|
|
269
|
+
// ============================================================================
|
|
270
|
+
validateSegmentHierarchy(segments, parentPath, errors, depth) {
|
|
271
|
+
if (depth > this.config.maxSegmentDepth) {
|
|
272
|
+
errors.push(`Segment depth exceeds maximum of ${this.config.maxSegmentDepth}`);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
for (const segment of segments) {
|
|
276
|
+
const segPath = parentPath ? `${parentPath}/${segment.name}` : segment.name;
|
|
277
|
+
if (!segment.name || segment.name.trim() === '') {
|
|
278
|
+
errors.push(`Segment name is required at path '${parentPath || '/'}'`);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
// SAP segment names are max 27 chars and uppercase
|
|
282
|
+
if (segment.name.length > 27) {
|
|
283
|
+
errors.push(`Segment name '${segment.name}' exceeds SAP maximum of 27 characters`);
|
|
284
|
+
}
|
|
285
|
+
// Validate cardinality
|
|
286
|
+
if (segment.minOccurs < 0) {
|
|
287
|
+
errors.push(`Segment '${segPath}' minOccurs cannot be negative`);
|
|
288
|
+
}
|
|
289
|
+
if (segment.maxOccurs < segment.minOccurs) {
|
|
290
|
+
errors.push(`Segment '${segPath}' maxOccurs (${segment.maxOccurs}) must be >= minOccurs (${segment.minOccurs})`);
|
|
291
|
+
}
|
|
292
|
+
// Validate fields
|
|
293
|
+
for (const field of segment.fields) {
|
|
294
|
+
this.validateIDocFieldDefinition(field, segPath, errors);
|
|
295
|
+
}
|
|
296
|
+
// Recurse into child segments
|
|
297
|
+
if (segment.children && segment.children.length > 0) {
|
|
298
|
+
this.validateSegmentHierarchy(segment.children, segPath, errors, depth + 1);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
validateIDocFieldDefinition(field, segmentPath, errors) {
|
|
303
|
+
if (!field.name || field.name.trim() === '') {
|
|
304
|
+
errors.push(`Field name is required in segment '${segmentPath}'`);
|
|
305
|
+
}
|
|
306
|
+
if (field.length <= 0) {
|
|
307
|
+
errors.push(`Field '${segmentPath}/${field.name}' length must be positive (got ${field.length})`);
|
|
308
|
+
}
|
|
309
|
+
// Validate type-specific constraints
|
|
310
|
+
const validTypes = ['CHAR', 'NUMC', 'DATS', 'TIMS', 'CURR', 'QUAN', 'DEC'];
|
|
311
|
+
if (!validTypes.includes(field.type)) {
|
|
312
|
+
errors.push(`Field '${segmentPath}/${field.name}' has invalid type '${field.type}'. Valid: ${validTypes.join(', ')}`);
|
|
313
|
+
}
|
|
314
|
+
// Date fields must be length 8
|
|
315
|
+
if (field.type === 'DATS' && field.length !== 8) {
|
|
316
|
+
errors.push(`Field '${segmentPath}/${field.name}' of type DATS must have length 8 (YYYYMMDD)`);
|
|
317
|
+
}
|
|
318
|
+
// Time fields must be length 6
|
|
319
|
+
if (field.type === 'TIMS' && field.length !== 6) {
|
|
320
|
+
errors.push(`Field '${segmentPath}/${field.name}' of type TIMS must have length 6 (HHMMSS)`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
parseIDocContent(content) {
|
|
324
|
+
const segments = new Map();
|
|
325
|
+
// IDoc flat file format: segment name in first 27 chars, data follows
|
|
326
|
+
// Or JSON format with segment arrays
|
|
327
|
+
try {
|
|
328
|
+
// Try JSON format first
|
|
329
|
+
const jsonContent = JSON.parse(content);
|
|
330
|
+
if (typeof jsonContent === 'object' && jsonContent !== null) {
|
|
331
|
+
for (const [segName, segData] of Object.entries(jsonContent)) {
|
|
332
|
+
if (Array.isArray(segData)) {
|
|
333
|
+
segments.set(segName, segData);
|
|
334
|
+
}
|
|
335
|
+
else if (typeof segData === 'object' && segData !== null) {
|
|
336
|
+
segments.set(segName, [segData]);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return segments;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Not JSON, try flat file format
|
|
344
|
+
}
|
|
345
|
+
// Flat file format: each line is a segment record
|
|
346
|
+
const lines = content.split('\n').filter(l => l.trim() !== '');
|
|
347
|
+
for (const line of lines) {
|
|
348
|
+
// First field (up to first whitespace or fixed position) is segment name
|
|
349
|
+
const segName = line.substring(0, Math.min(27, line.length)).trim();
|
|
350
|
+
if (segName) {
|
|
351
|
+
if (!segments.has(segName)) {
|
|
352
|
+
segments.set(segName, []);
|
|
353
|
+
}
|
|
354
|
+
segments.get(segName).push({ _raw: line });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return segments;
|
|
358
|
+
}
|
|
359
|
+
validateIDocSegments(definedSegments, parsedSegments, results) {
|
|
360
|
+
for (const segment of definedSegments) {
|
|
361
|
+
const segmentData = parsedSegments.get(segment.name);
|
|
362
|
+
const occurrences = segmentData ? segmentData.length : 0;
|
|
363
|
+
const fieldErrors = [];
|
|
364
|
+
// Check cardinality
|
|
365
|
+
if (segment.mandatory && occurrences === 0) {
|
|
366
|
+
fieldErrors.push({
|
|
367
|
+
field: segment.name,
|
|
368
|
+
expected: `at least ${segment.minOccurs} occurrence(s)`,
|
|
369
|
+
actual: '0 occurrences',
|
|
370
|
+
rule: 'mandatory-segment',
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
if (occurrences < segment.minOccurs) {
|
|
374
|
+
fieldErrors.push({
|
|
375
|
+
field: segment.name,
|
|
376
|
+
expected: `>= ${segment.minOccurs} occurrences`,
|
|
377
|
+
actual: `${occurrences} occurrences`,
|
|
378
|
+
rule: 'minOccurs',
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
if (segment.maxOccurs > 0 && occurrences > segment.maxOccurs) {
|
|
382
|
+
fieldErrors.push({
|
|
383
|
+
field: segment.name,
|
|
384
|
+
expected: `<= ${segment.maxOccurs} occurrences`,
|
|
385
|
+
actual: `${occurrences} occurrences`,
|
|
386
|
+
rule: 'maxOccurs',
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
// Validate fields within each occurrence
|
|
390
|
+
if (segmentData) {
|
|
391
|
+
for (const record of segmentData) {
|
|
392
|
+
this.validateIDocFields(segment.fields, record, fieldErrors);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
results.push({
|
|
396
|
+
segment: segment.name,
|
|
397
|
+
valid: fieldErrors.length === 0,
|
|
398
|
+
fieldErrors,
|
|
399
|
+
});
|
|
400
|
+
// Recurse into child segments
|
|
401
|
+
if (segment.children && segment.children.length > 0) {
|
|
402
|
+
this.validateIDocSegments(segment.children, parsedSegments, results);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
validateIDocFields(fields, record, errors) {
|
|
407
|
+
// Skip raw-data-only records (flat file format)
|
|
408
|
+
if ('_raw' in record && Object.keys(record).length === 1)
|
|
409
|
+
return;
|
|
410
|
+
for (const field of fields) {
|
|
411
|
+
const value = record[field.name];
|
|
412
|
+
// Check mandatory fields
|
|
413
|
+
if (field.mandatory && (value === undefined || value === null || value === '')) {
|
|
414
|
+
errors.push({
|
|
415
|
+
field: field.name,
|
|
416
|
+
expected: 'non-empty value',
|
|
417
|
+
actual: value === undefined ? 'undefined' : `'${value}'`,
|
|
418
|
+
rule: 'mandatory',
|
|
419
|
+
});
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
if (value === undefined || value === null)
|
|
423
|
+
continue;
|
|
424
|
+
// Validate length
|
|
425
|
+
if (String(value).length > field.length) {
|
|
426
|
+
errors.push({
|
|
427
|
+
field: field.name,
|
|
428
|
+
expected: `max length ${field.length}`,
|
|
429
|
+
actual: `length ${String(value).length}`,
|
|
430
|
+
rule: 'maxLength',
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
// Validate type-specific format
|
|
434
|
+
this.validateIDocFieldValue(field, String(value), errors);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
validateIDocFieldValue(field, value, errors) {
|
|
438
|
+
switch (field.type) {
|
|
439
|
+
case 'NUMC':
|
|
440
|
+
if (!/^\d*$/.test(value)) {
|
|
441
|
+
errors.push({
|
|
442
|
+
field: field.name,
|
|
443
|
+
expected: 'numeric characters only',
|
|
444
|
+
actual: `'${value}'`,
|
|
445
|
+
rule: 'type-NUMC',
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
break;
|
|
449
|
+
case 'DATS':
|
|
450
|
+
if (value !== '00000000' && !/^\d{8}$/.test(value)) {
|
|
451
|
+
errors.push({
|
|
452
|
+
field: field.name,
|
|
453
|
+
expected: 'YYYYMMDD format (8 digits)',
|
|
454
|
+
actual: `'${value}'`,
|
|
455
|
+
rule: 'type-DATS',
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
else if (value !== '00000000' && /^\d{8}$/.test(value)) {
|
|
459
|
+
const year = parseInt(value.substring(0, 4), 10);
|
|
460
|
+
const month = parseInt(value.substring(4, 6), 10);
|
|
461
|
+
const day = parseInt(value.substring(6, 8), 10);
|
|
462
|
+
if (month < 1 || month > 12 || day < 1 || day > 31 || year < 1900 || year > 9999) {
|
|
463
|
+
errors.push({
|
|
464
|
+
field: field.name,
|
|
465
|
+
expected: 'valid date (YYYYMMDD)',
|
|
466
|
+
actual: `'${value}'`,
|
|
467
|
+
rule: 'type-DATS-valid',
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
break;
|
|
472
|
+
case 'TIMS':
|
|
473
|
+
if (!/^\d{6}$/.test(value)) {
|
|
474
|
+
errors.push({
|
|
475
|
+
field: field.name,
|
|
476
|
+
expected: 'HHMMSS format (6 digits)',
|
|
477
|
+
actual: `'${value}'`,
|
|
478
|
+
rule: 'type-TIMS',
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
const hours = parseInt(value.substring(0, 2), 10);
|
|
483
|
+
const minutes = parseInt(value.substring(2, 4), 10);
|
|
484
|
+
const seconds = parseInt(value.substring(4, 6), 10);
|
|
485
|
+
if (hours > 23 || minutes > 59 || seconds > 59) {
|
|
486
|
+
errors.push({
|
|
487
|
+
field: field.name,
|
|
488
|
+
expected: 'valid time (HH:00-23, MM:00-59, SS:00-59)',
|
|
489
|
+
actual: `'${value}'`,
|
|
490
|
+
rule: 'type-TIMS-valid',
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
break;
|
|
495
|
+
case 'CURR':
|
|
496
|
+
case 'QUAN':
|
|
497
|
+
case 'DEC':
|
|
498
|
+
if (!/^-?\d*\.?\d*$/.test(value.trim())) {
|
|
499
|
+
errors.push({
|
|
500
|
+
field: field.name,
|
|
501
|
+
expected: 'decimal number',
|
|
502
|
+
actual: `'${value}'`,
|
|
503
|
+
rule: `type-${field.type}`,
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
break;
|
|
507
|
+
case 'CHAR':
|
|
508
|
+
// CHAR accepts any character, just validate length (done above)
|
|
509
|
+
break;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=sap-integration-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sap-integration-service.js","sourceRoot":"","sources":["../../../../src/domains/enterprise-integration/services/sap-integration-service.ts"],"names":[],"mappings":"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"}
|