Merge branch 'main' into cliente/tagumedica

This commit is contained in:
George committed 2026-10-20 09:09:45 -05:00
commit 074eed6d81
14 files changed
+132 -56

No files matched your search

@@ -11,10 +11,10 @@
<sbo-window [title]="windowTitle()" [badge]="badge()" [status]="status()">
<div class="sbo-hdr">
<div class="sbo-col">
<sbo-select-field label="Pago a" [options]="typeOptions" [value]="docType()" (valueChange)="onType($event)" [readonly]="saved()" />
<sbo-select-field label="Pago a" dbName="DocType" [options]="typeOptions" [value]="docType()" (valueChange)="onType($event)" [readonly]="saved()" />
@if (!toAccounts()) {
<sbo-lookup-field
[label]="screen.partner.label"
[label]="screen.partner.label" dbName="CardCode"
[lookup]="partnerLookup"
[value]="cardCode()"
[readonly]="saved()"
@@ -23,17 +23,17 @@
(valueChange)="onPartnerText($event)"
(picked)="onPartner($event)"
/>
<sbo-text-field label="Nombre" [value]="cardName()" readonly />
<sbo-text-field label="Nombre" dbName="CardName" [value]="cardName()" readonly />
}
</div>
<div class="sbo-col">
@if (isNew()) {
<sbo-select-field label="Serie" [options]="seriesOptions()" [value]="series()" (valueChange)="series.set($event === null ? null : +$event)" />
<sbo-select-field label="Serie" dbName="Series" [options]="seriesOptions()" [value]="series()" (valueChange)="series.set($event === null ? null : +$event)" />
} @else {
<sbo-text-field label="Número" [value]="'' + (doc()?.['DocNum'] ?? '')" readonly />
<sbo-text-field label="Número" dbName="DocNum" [value]="'' + (doc()?.['DocNum'] ?? '')" readonly />
}
<sbo-date-field label="Fecha de contabilización" [(value)]="docDate" [readonly]="saved()" required />
<sbo-date-field label="Fecha del documento" [(value)]="taxDate" [readonly]="saved()" />
<sbo-date-field label="Fecha de contabilización" dbName="DocDate" [(value)]="docDate" [readonly]="saved()" required />
<sbo-date-field label="Fecha del documento" dbName="TaxDate" [(value)]="taxDate" [readonly]="saved()" />
</div>
</div>
@@ -66,15 +66,15 @@
<h3>Medios de pago</h3>
<div class="sbo-hdr">
<div class="sbo-col">
<sbo-lookup-field label="Cuenta de efectivo" [lookup]="accountLookup" [value]="means().cashAccount" (valueChange)="setMeans({ cashAccount: $event })" [readonly]="saved()" />
<sbo-number-field label="Efectivo" [decimals]="2" [value]="means().cashSum" (valueChange)="setMeans({ cashSum: $event })" [readonly]="saved()" />
<sbo-lookup-field label="Cuenta de transferencia" [lookup]="accountLookup" [value]="means().transferAccount" (valueChange)="setMeans({ transferAccount: $event })" [readonly]="saved()" />
<sbo-number-field label="Transferencia" [decimals]="2" [value]="means().transferSum" (valueChange)="setMeans({ transferSum: $event })" [readonly]="saved()" />
<sbo-lookup-field label="Cuenta de efectivo" dbName="CashAccount" [lookup]="accountLookup" [value]="means().cashAccount" (valueChange)="setMeans({ cashAccount: $event })" [readonly]="saved()" />
<sbo-number-field label="Efectivo" dbName="CashSum" [decimals]="2" [value]="means().cashSum" (valueChange)="setMeans({ cashSum: $event })" [readonly]="saved()" />
<sbo-lookup-field label="Cuenta de transferencia" dbName="TransferAccount" [lookup]="accountLookup" [value]="means().transferAccount" (valueChange)="setMeans({ transferAccount: $event })" [readonly]="saved()" />
<sbo-number-field label="Transferencia" dbName="TransferSum" [decimals]="2" [value]="means().transferSum" (valueChange)="setMeans({ transferSum: $event })" [readonly]="saved()" />
</div>
<div class="sbo-col">
<sbo-date-field label="Fecha de transferencia" [value]="means().transferDate" (valueChange)="setMeans({ transferDate: $event })" [readonly]="saved()" />
<sbo-text-field label="Referencia" [value]="means().transferReference" (valueChange)="setMeans({ transferReference: $event })" [readonly]="saved()" />
<sbo-lookup-field label="Cuenta de cheques" [lookup]="accountLookup" [value]="means().checkAccount" (valueChange)="setMeans({ checkAccount: $event })" [readonly]="saved()" />
<sbo-date-field label="Fecha de transferencia" dbName="TransferDate" [value]="means().transferDate" (valueChange)="setMeans({ transferDate: $event })" [readonly]="saved()" />
<sbo-text-field label="Referencia" dbName="TransferReference" [value]="means().transferReference" (valueChange)="setMeans({ transferReference: $event })" [readonly]="saved()" />
<sbo-lookup-field label="Cuenta de cheques" dbName="CheckAccount" [lookup]="accountLookup" [value]="means().checkAccount" (valueChange)="setMeans({ checkAccount: $event })" [readonly]="saved()" />
</div>
</div>
@@ -94,8 +94,8 @@
<div class="sbo-hdr" style="margin-top: 14px">
<div class="sbo-col">
<sbo-textarea-field label="Comentarios" [(value)]="remarks" [readonly]="saved()" />
<sbo-text-field label="Comentarios del asiento" [(value)]="journalRemarks" [readonly]="saved()" />
<sbo-textarea-field label="Comentarios" dbName="Remarks" [(value)]="remarks" [readonly]="saved()" />
<sbo-text-field label="Comentarios del asiento" dbName="JournalRemarks" [(value)]="journalRemarks" [readonly]="saved()" />
</div>
<div class="sbo-col">
<table class="totals">
@@ -133,7 +133,7 @@
@switch (f.type) {
@case ('partner') {
<sbo-lookup-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[required]="!!f.required"
[readonly]="readOnly() || !isNew() || locked(f)"
[value]="str(header()[f.key])"
@@ -145,7 +145,7 @@
}
@case ('checkbox') {
<sbo-checkbox-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[readonly]="readOnly() || !!f.readonly || locked(f)"
[value]="header()[f.key] === 'tYES'"
(valueChange)="setHeader(f.key, $event ? 'tYES' : 'tNO')"
@@ -153,7 +153,7 @@
}
@case ('lookup') {
<sbo-lookup-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[required]="!!f.required"
[readonly]="readOnly() || locked(f)"
[value]="str(header()[f.key])"
@@ -165,7 +165,7 @@
}
@case ('warehouse') {
<sbo-lookup-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[required]="!!f.required"
[readonly]="readOnly() || locked(f)"
[value]="str(header()[f.key])"
@@ -176,7 +176,7 @@
}
@case ('date') {
<sbo-date-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[required]="!!f.required"
[readonly]="readOnly() || locked(f)"
[value]="str(header()[f.key])"
@@ -185,7 +185,7 @@
}
@case ('select') {
<sbo-select-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[required]="!!f.required"
[readonly]="readOnly() || locked(f)"
[options]="f.options"
@@ -196,7 +196,7 @@
}
@case ('number') {
<sbo-number-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[decimals]="f.decimals"
[readonly]="readOnly() || locked(f)"
[value]="+str(header()[f.key])"
@@ -205,14 +205,14 @@
}
@case ('textarea') {
<sbo-textarea-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[readonly]="readOnly() || locked(f)"
[value]="str(header()[f.key])"
(valueChange)="setHeader(f.key, $event)"
/>
}
@case ('folio') {
<sbo-field [label]="f.label" [dbName]="f.key">
<sbo-field [label]="f.label" [dbName]="dbNames(f)">
<sbo-input
width="90px"
[maxlength]="10"
@@ -229,7 +229,7 @@
</sbo-field>
}
@case ('group') {
<sbo-field [label]="f.label" [dbName]="f.key">
<sbo-field [label]="f.label" [dbName]="dbNames(f)">
@for (c of f.cells; track c.key) {
<sbo-input
[width]="c.width"
@@ -246,7 +246,7 @@
</sbo-field>
}
@case ('series') {
<sbo-field [label]="f.label" [dbName]="f.key">
<sbo-field [label]="f.label" [dbName]="dbNames(f)">
<sbo-select
width="170px"
ariaLabel="Serie de numeración"
@@ -261,7 +261,7 @@
}
@case ('expenses') {
<div class="exp">
<h3>{{ f.label }}</h3>
<h3 [attr.title]="dbNames(f)">{{ f.label }}</h3>
<sbo-rows-table
[columns]="expenseColumns"
[rows]="expenses()"
@@ -277,7 +277,7 @@
}
@case ('contact') {
<sbo-select-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[readonly]="readOnly() || locked(f)"
[options]="contactOptions()"
placeholder=""
@@ -287,7 +287,7 @@
}
@case ('address') {
<sbo-select-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[readonly]="readOnly() || locked(f)"
[options]="f.side === 'ship' ? shipOptions() : billOptions()"
placeholder=""
@@ -302,7 +302,7 @@
</sbo-field>
}
@case ('currency') {
<sbo-field [label]="f.label" [dbName]="f.key">
<sbo-field [label]="f.label" [dbName]="dbNames(f)">
<sbo-select
width="170px"
ariaLabel="Moneda del documento"
@@ -322,7 +322,7 @@
}
@case ('rounding') {
@if (roundingEnabled()) {
<sbo-field [label]="f.label" [dbName]="f.key">
<sbo-field [label]="f.label" [dbName]="dbNames(f)">
<sbo-checkbox
ariaLabel="Redondear el total del documento"
[readonly]="readOnly() || locked(f)"
@@ -340,11 +340,11 @@
}
}
@case ('computed') {
<sbo-text-field [label]="f.label" [dbName]="f.key" readonly [value]="computedValue(f.source)" />
<sbo-text-field [label]="f.label" [dbName]="dbNames(f)" readonly [value]="computedValue(f.source)" />
}
@default {
<sbo-text-field
[label]="f.label" [dbName]="f.key"
[label]="f.label" [dbName]="dbNames(f)"
[readonly]="readOnly() || !!f.readonly || locked(f)"
[value]="str(header()[f.key])"
(valueChange)="setHeader(f.key, $event)"
@@ -35,7 +35,7 @@ import {
validateLayout,
} from './document-model';
import { SERVICE_DOC_TYPE } from './document-layouts';
import { type ComputedSource, type GroupCell, type HeaderField, PARTNER_COLUMNS, WAREHOUSE_LOOKUP, hasCurrency, hasExpenses, hasFolio, hasPartnerData, hasSeries, headerKeysOf, keysOfFields, requiredHeaderOf } from './document-layouts';
import { type ComputedSource, type GroupCell, type HeaderField, PARTNER_COLUMNS, fieldDbName, WAREHOUSE_LOOKUP, hasCurrency, hasExpenses, hasFolio, hasPartnerData, hasSeries, headerKeysOf, keysOfFields, requiredHeaderOf } from './document-layouts';
import { type AddressSide, type AddressValues, addressFromExtension, addressFromPartner, composeAddress, toExtension } from './address-fields';
import { DocumentPdf } from '../reports/document-pdf';
import { AddressDialog } from './address-dialog';
@@ -450,6 +450,8 @@ export class DocumentFormPage {
}
/** Valor de una fila de solo lectura (número del documento, datos del socio, totales). */
protected readonly dbNames = fieldDbName;
protected computedValue(source: ComputedSource): string {
switch (source) {
case 'docNum':
@@ -592,3 +592,42 @@ export const hasPartnerData = (layout: DocumentLayout): boolean => allFields(lay
export const hasCurrency = (layout: DocumentLayout): boolean => allFields(layout).some((f) => f.type === 'currency');
export const hasFolio = (layout: DocumentLayout): boolean => allFields(layout).some((f) => f.type === 'folio' || (f.type === 'group' && f.cells.some((c) => c.key === 'FolioNumber')));
/**
* Nombre(s) del campo de SAP de una fila del formulario, para «Campos» y la ayuda del cursor: el de un campo sencillo, o
* todos los de una fila con varios controles (`FolioPrefixString · FolioNumber`).
*/
export function fieldDbName(f: HeaderField): string | undefined {
switch (f.type) {
case 'folio':
return `${f.prefixKey} · ${f.numberKey}`;
case 'group':
return f.cells.map((c) => c.key).join(' · ');
case 'series':
return 'Series · DocNum';
case 'currency':
return 'DocCurrency · DocRate';
case 'rounding':
return 'Rounding · RoundingDiffAmount';
case 'expenses':
return 'DocumentAdditionalExpenses';
case 'computed':
return COMPUTED_DB_NAMES[f.source];
default:
return 'key' in f ? f.key : undefined;
}
}
const COMPUTED_DB_NAMES: Readonly<Record<ComputedSource, string>> = {
docNum: 'DocNum',
partnerName: 'CardName',
partnerTaxId: 'FederalTaxID',
subtotal: 'Σ líneas',
expenses: 'Σ DocumentAdditionalExpenses',
tax: 'VatSum',
total: 'DocTotal',
downPayment: 'DownPaymentAmount',
applied: 'PaidToDate',
balance: 'DocTotal − PaidToDate',
};
@@ -12,21 +12,21 @@
<div class="sbo-hdr">
<div class="sbo-col">
@if (isNew()) {
<sbo-select-field label="Serie" [options]="seriesOptions()" [value]="series()" (valueChange)="series.set($event === null ? null : +$event)" />
<sbo-select-field label="Serie" dbName="Series" [options]="seriesOptions()" [value]="series()" (valueChange)="series.set($event === null ? null : +$event)" />
} @else {
<sbo-text-field label="Número" [value]="'' + (doc()?.['JdtNum'] ?? '')" readonly />
<sbo-text-field label="Número" dbName="JdtNum" [value]="'' + (doc()?.['JdtNum'] ?? '')" readonly />
}
<sbo-text-field label="Comentarios" [value]="memo()" (valueChange)="set('memo', $event)" [readonly]="saved()" />
<sbo-text-field label="Comentarios" dbName="Memo" [value]="memo()" (valueChange)="set('memo', $event)" [readonly]="saved()" />
</div>
<div class="sbo-col">
<sbo-date-field label="Fecha de contabilización" [(value)]="referenceDate" [readonly]="saved()" required />
<sbo-date-field label="Fecha de vencimiento" [value]="dueDate()" (valueChange)="onDueDate($event)" [readonly]="saved()" />
<sbo-date-field label="Fecha del documento" [(value)]="taxDate" [readonly]="saved()" />
<sbo-date-field label="Fecha de contabilización" dbName="ReferenceDate" [(value)]="referenceDate" [readonly]="saved()" required />
<sbo-date-field label="Fecha de vencimiento" dbName="DueDate" [value]="dueDate()" (valueChange)="onDueDate($event)" [readonly]="saved()" />
<sbo-date-field label="Fecha del documento" dbName="TaxDate" [(value)]="taxDate" [readonly]="saved()" />
</div>
</div>
<div class="sbo-hdr">
<div class="sbo-col">
<sbo-field label="Indicador / Folio">
<sbo-field label="Indicador / Folio" dbName="Indicator · FolioPrefixString · FolioNumber">
<sbo-input width="80px" ariaLabel="Indicador" [readonly]="saved()" [value]="indicator()" (valueChange)="indicator.set($event)" />
@if (!saved()) {
<button type="button" class="sbo-btn" aria-label="Abrir la lista de indicadores" title="Lista de valores" (click)="indicatorOpen.set(true)">…</button>
@@ -36,9 +36,9 @@
</sbo-field>
</div>
<div class="sbo-col">
<sbo-text-field label="Referencia 1" [value]="reference()" (valueChange)="set('reference', $event)" [readonly]="saved()" />
<sbo-text-field label="Referencia 2" [value]="reference2()" (valueChange)="set('reference2', $event)" [readonly]="saved()" />
<sbo-text-field label="Referencia 3" [value]="reference3()" (valueChange)="set('reference3', $event)" [readonly]="saved()" />
<sbo-text-field label="Referencia 1" dbName="Reference" [value]="reference()" (valueChange)="set('reference', $event)" [readonly]="saved()" />
<sbo-text-field label="Referencia 2" dbName="Reference2" [value]="reference2()" (valueChange)="set('reference2', $event)" [readonly]="saved()" />
<sbo-text-field label="Referencia 3" dbName="Reference3" [value]="reference3()" (valueChange)="set('reference3', $event)" [readonly]="saved()" />
</div>
</div>