4.7 KiB
basic-erp
ERP base para SAP Business One (Service Layer). Migración del mini-erp (React + FastAPI, en /Users/george/Documents/Desarrollo/React/mini-erp) a NestJS + Angular, ambos en TypeScript. Sirve de base para crear una rama por cliente.
Monorepo npm workspaces:
apps/api— NestJS 12 (ESM): proxy hacia el Service Layer, login, sesión SAP compartida, permisos de menú (SQLite). Verapps/api/README.md.apps/web— Angular 22 (standalone, zoneless, señales): componentes reutilizables estilo SAP Business One. Verapps/web/README.md.libs/sap-types— tipos y utilidades compartidos por api y web (MENU, evaluador de permisos, tipos de auth/SL). Se compila enpostinstall.tools/— mockupoferta_venta.html(ejemplo: tiene algunos campos no estándar, pero se conserva la idea).
Reglas del proyecto base
- Solo campos estándar de SAP Business One. Ningún campo de usuario (
U_*) salvoU_WEB_USER/U_WEB_PASSdeEmployeesInfo, usados para el login web. - Los formularios se construyen con componentes reutilizables y configuración declarativa; no se duplica markup por documento.
- Aspecto por variables CSS (temas). Tema por defecto: claro, con la paleta del mockup. Esquinas contenidas (
--radius*, como SBO). - La fila de un formulario es etiqueta + uno o varios controles (input, select, número, fecha, botón); la cabecera tiene como máximo 2 columnas.
- Impuesto de las líneas:
TaxCodecon el maestroSalesTaxCodes(verificado en el Service Layer;VatGroupsno tieneRate). Un cliente conVatGrouplo cambia en su rama.
Bancos (pagos recibidos y efectuados)
Menú Bancos → /bancos/pagos-recibidos (IncomingPayments) y /bancos/pagos-efectuados (VendorPayments), en apps/web/src/app/features/banking/. Medios: efectivo, transferencia y cheques; se aplican a facturas/notas de crédito abiertas del socio, a cuenta (lo que sobra de los medios queda como anticipo, implícito) o a cuentas contables (rAccount). Un pago contabilizado no se edita: se consulta y se anula (POST Recurso(clave)/Cancel, acción en la lista blanca de sl-resources.ts, auditada como sl_action).
Reglas de SAP verificadas: nota de crédito se aplica con SumApplied negativo; los cheques exigen CheckAccount en la cabecera; pagar de más trunca en silencio (se valida en el cliente); solo moneda local (localCurrency de la pantalla, hoy CLP). En SBODemoCL los pagos efectuados a facturas fallan por falta de la cuenta de "diferencias de conversión realizadas" (configuración de SAP); los de rAccount funcionan. Pendiente: depósitos y conciliación bancaria, moneda extranjera.
Finanzas (plan de cuentas y asientos)
Menú Finanzas: Plan de cuentas (/finanzas/plan-de-cuentas) es un maestro más (masters/finanzas/, recurso ChartOfAccounts, clave Code; extensiones por cliente en finanzas.extensions.ts) y Asientos contables (/finanzas/asientos, features/finance/, recurso JournalEntries, clave JdtNum) tiene lista y formulario propios (journal-model.ts: cuadre debe = haber, líneas con cuenta, dimensiones y proyecto). Verificado en SAP: en una cuenta ya creada solo se puede cambiar el nombre y similares; ActiveAccount (de movimiento / de título) y la cuenta padre no se cambian (campos immutable), y congelarla exige un rango de fechas (no se ofrece). Un asiento no se modifica; solo los manuales (OriginalJournal = ttJournalEntry) se cancelan con Cancel, que genera el asiento de reverso (el original no lleva marca de cancelado). Los asientos de documentos se cancelan con su documento. El plan de cuentas se abre como árbol (chart-tree.page → chart-tree.panel: se cargan todas las cuentas de a 200 y el árbol se arma en el navegador; pestañas verticales por grupo —las cuentas de primer nivel—, selector «Nivel», azul = título, verde = asociada) y al elegir una cuenta su formulario queda a la izquierda con el árbol a la derecha (MasterLayout.chartTree), como SAP. Campos del formulario según SAP (verificado con el usuario): «Cuenta asociada» = LockManualTransaction, «Cuenta monetaria» = CashAccount, «Bloquear contabilización manual» = BlockManualPosting, «Confidencial» = Protected; pestañas Propiedades, Contabilidad de costos e Info detallada (sin DefaultVatGroup ni VATRegNum). No se ofrece congelar/validar por fechas ni se puede cambiar ActiveAccount ni la cuenta padre. anualTransaction, «Cuenta monetaria» = CashAccount, «Bloquear contabilización manual» = BlockManualPosting, «Confidencial» = Protected; pestañas Propiedades, Contabilidad de costos e Info detallada (sin DefaultVatGroupniVATRegNum). No se ofrece congelar/validar por fechas ni se puede cambiar ActiveAccount` ni la cuenta padre.