diff --git a/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx b/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx index 91e84e6..db8ac82 100644 --- a/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx +++ b/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx @@ -225,6 +225,7 @@ export const QuoteDetailsCardEditor = ({ const handleAppendBlock = useCallback( (block: any) => { fieldActions.append({ + id_article: "", description: `${block.title}\n${block.body}`, quantity: { amount: null, diff --git a/server/src/contexts/catalog/domain/entities/ArticleIdentifier.test.ts b/server/src/contexts/catalog/domain/entities/ArticleIdentifier.test.ts index 83d8a27..d4ba0e3 100644 --- a/server/src/contexts/catalog/domain/entities/ArticleIdentifier.test.ts +++ b/server/src/contexts/catalog/domain/entities/ArticleIdentifier.test.ts @@ -6,6 +6,15 @@ describe("ArticleIdentifier", () => { expect(ArticleIdentifier.create(Number.MAX_SAFE_INTEGER).isSuccess).toBe(true); }); + it("normalizes missing identifiers to null for free quote lines", () => { + for (const value of ["", undefined]) { + const result = ArticleIdentifier.create(value); + + expect(result.isSuccess).toBe(true); + expect(result.object?.isNull()).toBe(true); + } + }); + it("rejects zero, decimals, non-numeric, negative and unsafe identifiers", () => { expect(ArticleIdentifier.create(0).isFailure).toBe(true); expect(ArticleIdentifier.create(1.5).isFailure).toBe(true); diff --git a/server/src/contexts/catalog/domain/entities/ArticleIdentifier.ts b/server/src/contexts/catalog/domain/entities/ArticleIdentifier.ts index 83c8504..c28cd80 100644 --- a/server/src/contexts/catalog/domain/entities/ArticleIdentifier.ts +++ b/server/src/contexts/catalog/domain/entities/ArticleIdentifier.ts @@ -16,7 +16,7 @@ export class ArticleIdentifier extends NullableValueObject { ) { const ruleNull = RuleValidator.RULE_ALLOW_NULL_OR_UNDEFINED.default(null); - const ruleEmpty = RuleValidator.RULE_ALLOW_EMPTY.default(null); + const ruleEmpty = RuleValidator.RULE_ALLOW_EMPTY.empty("").default(null); const ruleNumber = RuleValidator.RULE_IS_TYPE_NUMBER.label( options.label ? options.label : "ArticleIdentifier" @@ -35,7 +35,7 @@ export class ArticleIdentifier extends NullableValueObject { return value ? Number(value) : null; } - public static create(value: NullOr, options: IArticleIdentifierOptions = {}) { + public static create(value: NullOr = null, options: IArticleIdentifierOptions = {}) { const _options = { label: "ArticleIdentifier", ...options, @@ -52,7 +52,7 @@ export class ArticleIdentifier extends NullableValueObject { if (typeof validationResult.object === "string") { _value = parseInt(validationResult.object, 10); } else { - _value = validationResult.object; + _value = validationResult.object ?? null; } if (_value !== null && (!Number.isSafeInteger(_value) || _value <= 0)) {