refactor(web): el formulario base recibe de cada pantalla los campos de cabecera, pie y línea
Todas las pantallas declaran su DocumentLayout (catálogo FIELDS): ventas y compras dejan de tener la cabecera escrita en el HTML; el folio solo lo llevan los documentos tributarios. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c734dcbd0a
commit
8b0b8afc87
9 files changed
+320
-257
No files matched your search
@@ -9,136 +9,44 @@
|
||||
</sbo-toolbar>
|
||||
|
||||
<sbo-window [title]="windowTitle()" [badge]="badge()" [status]="status()">
|
||||
@if (partner) {
|
||||
<div class="sbo-hdr">
|
||||
<div class="sbo-col">
|
||||
<sbo-lookup-field
|
||||
[label]="partner.label"
|
||||
required
|
||||
[readonly]="readOnly() || !isNew()"
|
||||
[value]="str(header()['CardCode'])"
|
||||
(valueChange)="onPartnerText($event)"
|
||||
[lookup]="partnerLookup"
|
||||
resolveOnLeave
|
||||
(picked)="onPartner($event)"
|
||||
/>
|
||||
<sbo-text-field label="Nombre" readonly [value]="partnerName()" />
|
||||
<sbo-text-field label="RUT" readonly [value]="partnerTaxId()" />
|
||||
<sbo-text-field
|
||||
label="Nº referencia"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['NumAtCard'])"
|
||||
(valueChange)="setHeader('NumAtCard', $event)"
|
||||
/>
|
||||
</div>
|
||||
<div class="sbo-col">
|
||||
<sbo-text-field label="Número" readonly [value]="str(doc()?.['DocNum'])" />
|
||||
<sbo-date-field
|
||||
label="Fecha de contabilización"
|
||||
required
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['DocDate'])"
|
||||
(valueChange)="setHeader('DocDate', $event)"
|
||||
/>
|
||||
<sbo-date-field
|
||||
label="Fecha de vencimiento"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['DocDueDate'])"
|
||||
(valueChange)="setHeader('DocDueDate', $event)"
|
||||
/>
|
||||
@if (folio) {
|
||||
<sbo-field label="Folio">
|
||||
<sbo-input
|
||||
width="90px"
|
||||
[maxlength]="10"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['FolioPrefixString'])"
|
||||
(valueChange)="setHeader('FolioPrefixString', $event)"
|
||||
/>
|
||||
<sbo-input
|
||||
ariaLabel="Número de folio"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['FolioNumber'])"
|
||||
(valueChange)="setHeader('FolioNumber', $event)"
|
||||
/>
|
||||
</sbo-field>
|
||||
}
|
||||
</div>
|
||||
<div class="sbo-hdr">
|
||||
<div class="sbo-col">
|
||||
@for (f of layout.header.left; track $index) {
|
||||
<ng-container *ngTemplateOutlet="field; context: { $implicit: f }" />
|
||||
}
|
||||
</div>
|
||||
|
||||
<sbo-lines-grid
|
||||
[columns]="columns"
|
||||
[lines]="lines()"
|
||||
(linesChange)="setLines($event)"
|
||||
(notice)="notify($event)"
|
||||
[readonly]="readOnly()"
|
||||
[newLine]="newLine"
|
||||
[recalc]="recalc"
|
||||
[multiAdd]="multi"
|
||||
/>
|
||||
|
||||
<div class="sbo-hdr" style="margin-top: 14px">
|
||||
<div class="sbo-col">
|
||||
<sbo-textarea-field
|
||||
label="Comentarios"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['Comments'])"
|
||||
(valueChange)="setHeader('Comments', $event)"
|
||||
/>
|
||||
</div>
|
||||
<div class="sbo-col">
|
||||
<sbo-text-field label="Total antes del descuento" readonly [value]="fmt(totals().subtotal)" />
|
||||
<sbo-number-field
|
||||
label="Descuento %"
|
||||
[decimals]="2"
|
||||
[readonly]="readOnly()"
|
||||
[value]="+str(header()['DiscountPercent'])"
|
||||
(valueChange)="setHeader('DiscountPercent', $event ?? 0)"
|
||||
/>
|
||||
<sbo-text-field label="Impuesto" readonly [value]="fmt(totals().tax)" />
|
||||
<sbo-text-field label="Total del documento" readonly [value]="fmt(totals().total)" />
|
||||
</div>
|
||||
<div class="sbo-col">
|
||||
@for (f of layout.header.right; track $index) {
|
||||
<ng-container *ngTemplateOutlet="field; context: { $implicit: f }" />
|
||||
}
|
||||
</div>
|
||||
} @else if (layout; as lay) {
|
||||
<div class="sbo-hdr">
|
||||
<div class="sbo-col">
|
||||
@for (f of lay.left; track f.key) {
|
||||
<ng-container *ngTemplateOutlet="field; context: { $implicit: f }" />
|
||||
}
|
||||
</div>
|
||||
<div class="sbo-col">
|
||||
<sbo-text-field label="Número" readonly [value]="str(doc()?.['DocNum'])" />
|
||||
@for (f of lay.right; track f.key) {
|
||||
<ng-container *ngTemplateOutlet="field; context: { $implicit: f }" />
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<sbo-lines-grid
|
||||
[columns]="columns"
|
||||
[lines]="lines()"
|
||||
(linesChange)="setLines($event)"
|
||||
(notice)="notify($event)"
|
||||
[readonly]="readOnly()"
|
||||
[newLine]="newLine"
|
||||
[recalc]="recalc"
|
||||
[multiAdd]="multi"
|
||||
/>
|
||||
|
||||
<div class="sbo-hdr" style="margin-top: 14px">
|
||||
<div class="sbo-col">
|
||||
@for (f of layout.footer.left; track $index) {
|
||||
<ng-container *ngTemplateOutlet="field; context: { $implicit: f }" />
|
||||
}
|
||||
</div>
|
||||
|
||||
<sbo-lines-grid
|
||||
[columns]="columns"
|
||||
[lines]="lines()"
|
||||
(linesChange)="setLines($event)"
|
||||
(notice)="notify($event)"
|
||||
[readonly]="readOnly()"
|
||||
[newLine]="newLine"
|
||||
[multiAdd]="multi"
|
||||
/>
|
||||
|
||||
<div class="sbo-hdr" style="margin-top: 14px">
|
||||
<div class="sbo-col">
|
||||
<sbo-textarea-field
|
||||
label="Comentarios"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()['Comments'])"
|
||||
(valueChange)="setHeader('Comments', $event)"
|
||||
/>
|
||||
</div>
|
||||
<div class="sbo-col">
|
||||
@for (f of layout.footer.right; track $index) {
|
||||
<ng-container *ngTemplateOutlet="field; context: { $implicit: f }" />
|
||||
}
|
||||
</div>
|
||||
} @else {
|
||||
<p>El formulario de este documento aún no está disponible. <a routerLink="..">Volver a la lista</a></p>
|
||||
}
|
||||
</div>
|
||||
|
||||
@if ((partner || layout) && !readOnly()) {
|
||||
@if (!readOnly()) {
|
||||
<button sboActions class="btn main" type="button" [disabled]="saving() || loading()" (click)="save()">
|
||||
{{ isNew() ? 'Crear' : 'Actualizar' }}
|
||||
</button>
|
||||
@@ -171,13 +79,16 @@
|
||||
|
||||
<ng-template #field let-f>
|
||||
@switch (f.type) {
|
||||
@case ('date') {
|
||||
<sbo-date-field
|
||||
@case ('partner') {
|
||||
<sbo-lookup-field
|
||||
[label]="f.label"
|
||||
[required]="!!f.required"
|
||||
[readonly]="readOnly()"
|
||||
[readonly]="readOnly() || !isNew()"
|
||||
[value]="str(header()[f.key])"
|
||||
(valueChange)="setHeader(f.key, $event)"
|
||||
(valueChange)="onPartnerText($event)"
|
||||
[lookup]="partnerLookup"
|
||||
resolveOnLeave
|
||||
(picked)="onPartner($event)"
|
||||
/>
|
||||
}
|
||||
@case ('warehouse') {
|
||||
@@ -191,13 +102,59 @@
|
||||
resolveOnLeave
|
||||
/>
|
||||
}
|
||||
@default {
|
||||
<sbo-text-field
|
||||
@case ('date') {
|
||||
<sbo-date-field
|
||||
[label]="f.label"
|
||||
[required]="!!f.required"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()[f.key])"
|
||||
(valueChange)="setHeader(f.key, $event)"
|
||||
/>
|
||||
}
|
||||
@case ('number') {
|
||||
<sbo-number-field
|
||||
[label]="f.label"
|
||||
[decimals]="f.decimals"
|
||||
[readonly]="readOnly()"
|
||||
[value]="+str(header()[f.key])"
|
||||
(valueChange)="setHeader(f.key, $event ?? 0)"
|
||||
/>
|
||||
}
|
||||
@case ('textarea') {
|
||||
<sbo-textarea-field
|
||||
[label]="f.label"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()[f.key])"
|
||||
(valueChange)="setHeader(f.key, $event)"
|
||||
/>
|
||||
}
|
||||
@case ('folio') {
|
||||
<sbo-field [label]="f.label">
|
||||
<sbo-input
|
||||
width="90px"
|
||||
[maxlength]="10"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()[f.prefixKey])"
|
||||
(valueChange)="setHeader(f.prefixKey, $event)"
|
||||
/>
|
||||
<sbo-input
|
||||
ariaLabel="Número de folio"
|
||||
[readonly]="readOnly()"
|
||||
[value]="str(header()[f.numberKey])"
|
||||
(valueChange)="setHeader(f.numberKey, $event)"
|
||||
/>
|
||||
</sbo-field>
|
||||
}
|
||||
@case ('computed') {
|
||||
<sbo-text-field [label]="f.label" readonly [value]="computedValue(f.source)" />
|
||||
}
|
||||
@default {
|
||||
<sbo-text-field
|
||||
[label]="f.label"
|
||||
[readonly]="readOnly() || !!f.readonly"
|
||||
[value]="str(header()[f.key])"
|
||||
(valueChange)="setHeader(f.key, $event)"
|
||||
/>
|
||||
}
|
||||
}
|
||||
</ng-template>
|
||||
Reference in new issue
Block a user