Error al guardar cotizaciones con bloques

This commit is contained in:
David Arranz 2026-10-09 13:10:11 +02:00
parent e70706389a
commit 0a67c6a0e9
3 changed files with 13 additions and 3 deletions

View File

@ -225,6 +225,7 @@ export const QuoteDetailsCardEditor = ({
const handleAppendBlock = useCallback( const handleAppendBlock = useCallback(
(block: any) => { (block: any) => {
fieldActions.append({ fieldActions.append({
id_article: "",
description: `${block.title}\n${block.body}`, description: `${block.title}\n${block.body}`,
quantity: { quantity: {
amount: null, amount: null,

View File

@ -6,6 +6,15 @@ describe("ArticleIdentifier", () => {
expect(ArticleIdentifier.create(Number.MAX_SAFE_INTEGER).isSuccess).toBe(true); 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", () => { it("rejects zero, decimals, non-numeric, negative and unsafe identifiers", () => {
expect(ArticleIdentifier.create(0).isFailure).toBe(true); expect(ArticleIdentifier.create(0).isFailure).toBe(true);
expect(ArticleIdentifier.create(1.5).isFailure).toBe(true); expect(ArticleIdentifier.create(1.5).isFailure).toBe(true);

View File

@ -16,7 +16,7 @@ export class ArticleIdentifier extends NullableValueObject<number> {
) { ) {
const ruleNull = RuleValidator.RULE_ALLOW_NULL_OR_UNDEFINED.default(null); 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( const ruleNumber = RuleValidator.RULE_IS_TYPE_NUMBER.label(
options.label ? options.label : "ArticleIdentifier" options.label ? options.label : "ArticleIdentifier"
@ -35,7 +35,7 @@ export class ArticleIdentifier extends NullableValueObject<number> {
return value ? Number(value) : null; return value ? Number(value) : null;
} }
public static create(value: NullOr<number | string>, options: IArticleIdentifierOptions = {}) { public static create(value: NullOr<number | string> = null, options: IArticleIdentifierOptions = {}) {
const _options = { const _options = {
label: "ArticleIdentifier", label: "ArticleIdentifier",
...options, ...options,
@ -52,7 +52,7 @@ export class ArticleIdentifier extends NullableValueObject<number> {
if (typeof validationResult.object === "string") { if (typeof validationResult.object === "string") {
_value = parseInt(validationResult.object, 10); _value = parseInt(validationResult.object, 10);
} else { } else {
_value = validationResult.object; _value = validationResult.object ?? null;
} }
if (_value !== null && (!Number.isSafeInteger(_value) || _value <= 0)) { if (_value !== null && (!Number.isSafeInteger(_value) || _value <= 0)) {