From 51fbae34f5647994857f1182240e0325c9bbe5bf Mon Sep 17 00:00:00 2001 From: George Date: Tue, 20 Oct 2026 15:55:51 -0500 Subject: [PATCH] =?UTF-8?q?feat(tagumedica):=20el=20bot=C3=B3n=20=C2=ABCam?= =?UTF-8?q?pos=C2=BB=20funciona=20en=20las=20pantallas=20del=20flujo=20de?= =?UTF-8?q?=20lotes=20(campos=20y=20cabeceras=20de=20tablas)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../client/lotes/lote-release-confirm.page.ts | 5 ++- .../client/lotes/lote-transfer.page.spec.ts | 7 +++++ .../client/lotes/lote-transfer.page.ts | 31 ++++++++++--------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/apps/web/src/app/features/client/lotes/lote-release-confirm.page.ts b/apps/web/src/app/features/client/lotes/lote-release-confirm.page.ts index 31a9168..325c6b2 100644 --- a/apps/web/src/app/features/client/lotes/lote-release-confirm.page.ts +++ b/apps/web/src/app/features/client/lotes/lote-release-confirm.page.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, computed, inject, resource, signal } from '@angular/core'; import { apiErrorMessage } from '../../../core/api'; +import { FieldNames } from '../../../core/field-names'; import { formatDate } from '../../../core/format'; import type { DetailColumn } from '../../../shared/grid/grid.types'; import { RowsTable } from '../../../shared/grid/rows-table'; @@ -27,7 +28,7 @@ const text = (v: unknown): string => (v === null || v === undefined ? '' : Strin

Solicitudes de traslado de liberación abiertas. Elija una para indicar a qué almacenes vuelve cada lote.

- + @for (r of pending.value() ?? []; track r['DocEntry']) { @@ -72,6 +73,7 @@ const text = (v: unknown): string => (v === null || v === undefined ? '' : Strin h3 { margin: 14px 0 4px; font-size: 13px; font-weight: 600; } .hint { margin: 0 0 8px; color: var(--quiet); } .grid { width: 100%; border-collapse: collapse; } + .grid th .db { display: block; font: 10.5px/1.2 var(--mono, monospace); font-weight: 400; color: var(--quiet); } .grid th { padding: 4px 8px; background: var(--grid-head); border: 1px solid var(--line); font-size: 12.5px; text-align: left; } .grid td { padding: 3px 8px; border: 1px solid var(--line-soft); } .grid tbody tr { cursor: pointer; } @@ -88,6 +90,7 @@ const text = (v: unknown): string => (v === null || v === undefined ? '' : Strin }) export class LoteReleaseConfirmPage { private readonly api = inject(LotesFlujoApi); + protected readonly names = inject(FieldNames); protected readonly pending = resource({ loader: () => this.api.pending(PENDING_LIBERATION) }); protected readonly docEntry = signal(null); diff --git a/apps/web/src/app/features/client/lotes/lote-transfer.page.spec.ts b/apps/web/src/app/features/client/lotes/lote-transfer.page.spec.ts index 49ff920..6585532 100644 --- a/apps/web/src/app/features/client/lotes/lote-transfer.page.spec.ts +++ b/apps/web/src/app/features/client/lotes/lote-transfer.page.spec.ts @@ -132,6 +132,13 @@ describe('LoteTransferPage', () => { expect(el().querySelector('.status')?.textContent).toContain('Stock insuficiente'); }); + it('cada campo de la solicitud lleva el nombre de su campo de SAP (botón «Campos»)', async () => { + await search('2090456'); + const titles = [...el().querySelectorAll('label')].map((l) => l.getAttribute('title')); + expect(titles).toEqual(expect.arrayContaining(['BatchNumber', 'DocDate', 'Series', 'U_SIS_MOVINV', 'U_EXX_TIPOOPER', 'U_SIS_TIPDESP', 'U_SIS_MOTALM', 'U_SIS_MOTEST', 'U_SIS_COMEST', 'U_SIS_ACCTOM'])); + expect([...el().querySelectorAll('.stock th')].map((t) => t.getAttribute('title'))).toEqual(expect.arrayContaining(['ItemCode', 'WarehouseCode', 'Quantity'])); + }); + it('un lote sin stock se avisa', async () => { await search('NOEXISTE', []); expect(el().querySelector('.status')?.textContent).toContain('No se encontró stock para el lote «NOEXISTE»'); diff --git a/apps/web/src/app/features/client/lotes/lote-transfer.page.ts b/apps/web/src/app/features/client/lotes/lote-transfer.page.ts index b80015b..ab9bd84 100644 --- a/apps/web/src/app/features/client/lotes/lote-transfer.page.ts +++ b/apps/web/src/app/features/client/lotes/lote-transfer.page.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, computed, inject, resource, signal } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { apiErrorMessage } from '../../../core/api'; +import { FieldNames } from '../../../core/field-names'; import { todayIso } from '../../../core/format'; import { DateField, LookupField, SelectField, TextField, TextareaField } from '../../../shared/form'; import type { VhLookup } from '../../../shared/value-help/value-help.types'; @@ -36,11 +37,11 @@ const WAREHOUSE: VhLookup = { ...WAREHOUSE_LOOKUP, nameKey: 'WarehouseName' };
- +
@if (config.pickFrom) { - + }
@@ -52,8 +53,8 @@ const WAREHOUSE: VhLookup = { ...WAREHOUSE_LOOKUP, nameKey: 'WarehouseName' };
SolicitudFechaMotivo del estadoComentarioAcción a tomar
Solicitud@if (names.show()) {DocNum}Fecha@if (names.show()) {DocDate}Motivo del estado@if (names.show()) {U_SIS_MOTEST}Comentario@if (names.show()) {U_SIS_COMEST}Acción a tomar@if (names.show()) {U_SIS_ACCTOM}
- - + + @@ -87,20 +88,20 @@ const WAREHOUSE: VhLookup = { ...WAREHOUSE_LOOKUP, nameKey: 'WarehouseName' };

Solicitud de traslado

- - - + + +
- - - - + + + +
- - - + + + @if (confirming()) {
ArtículoDescripciónAlmacénNombreEn stockComprometidoCantidad a moverArtículo@if (names.show()) {ItemCode}Descripción@if (names.show()) {ItemDescription}Almacén@if (names.show()) {WarehouseCode}Nombre@if (names.show()) {WarehouseName}En stock@if (names.show()) {Quantity}Comprometido@if (names.show()) {CommitQty}Cantidad a mover