Skip to content

PointSav Documentation

The engineering library for the PointSav platform — operating systems and services for regulated businesses that own their data, their AI, and their record-keeping outright. Where the monorepo holds the code, this wiki holds the reasoning: architecture, services, security, and the governance commitments that bind future development.

Generar un registro de nóminas

Requisitos previos

  • Un conjunto de herramientas Rust funcional (véase Cómo instalar el conjunto de herramientas de desarrollo)
  • Una copia del espacio de trabajo que contenga los crates de construcción — el crate de nóminas es miembro de él y lee dos ficheros de referencia del directorio del propio crate de construcción, por una ruta que se resuelve al compilar
  • Un directorio de datos de construcción con work_packages.csv
  • Permiso de escritura sobre el directorio de salida

Esta tarea no requiere ningún servicio en ejecución. Es una tarea por lotes en la línea de comandos, y la línea de comandos es toda la interfaz — no hay pantalla de consola, ni ranura de tecla de función, ni nada que pulsar.

Hay un requisito que no es configurable y que le sorprenderá: el directorio de salida es una ruta absoluta fijada en el código, sin variable de entorno que la sustituya. La ejecución lo crea y falla sin más si no puede. El directorio de datos de entrada sí es redirigible; el de salida no. Esa asimetría es la inversa de la de la herramienta contable hermana, y es una carencia real, no una postura de diseño.

Propósito

Producir el Registro de Nóminas (por División) — una única hoja de trabajo con las horas de mano de obra presupuestadas y el tamaño de cuadrilla, una fila por división de construcción, en HTML y PDF.

Lea el párrafo siguiente antes de ejecutar nada, porque el nombre del informe promete bastante más de lo que el informe entrega.

Este comando no calcula ninguna retribución. No calcula salario bruto, ni neto, ni deducción alguna. No determina una frecuencia de pago, ni una fecha de pago, ni un calendario de remisión. No lee un parte de horas — las horas que agrega son horas presupuestadas procedentes de estimaciones de paquetes de trabajo, no horas que nadie haya trabajado. No tiene concepto de empleado: sus filas son divisiones, y el tamaño de cuadrilla junto a cada una es un supuesto de planificación, no una plantilla real. Las columnas tituladas Pay Freq. y Gross Pay existen en la página y todas sus celdas son una raya.

Es deliberado, y el documento lo dice en su propia cara. El cálculo de bruto a neto y el modelo de datos de la frecuencia de pago están ambos explícitamente sin diseñar en esta etapa, y el renderizador imprime una raya antes que una cifra inventada. Para lo que el registro sirve de verdad es para lo que dicen sus dos columnas pobladas: cuántas horas de mano de obra presupuestadas lleva cada división y qué tamaño de cuadrilla supone el plan para ella.

Para el diseño del que este informe es una primera porción, véase tool-payroll — nómina y remesas estatutarias por jurisdicción. Para la herramienta de la que proceden las horas, véase tool-construction — libro contable de costo, cronograma y calidad para construcción.

Procedimiento

1. Indicar el directorio de datos de construcción

export TCO26_DATA_DIR=/data/construction/proyecto-ejemplo

Es la misma variable que usa el binario de informes de construcción, y se comporta igual: si no está definida, el binario recurre a una ruta absoluta fijada en el código, propia del despliegue para el que se compiló originalmente, y la ejecución falla en una lectura de fichero nombrando un directorio desconocido.

2. Comprobar las cuatro entradas

La ejecución lee cuatro ficheros CSV de tres lugares distintos. Dos llegan con la copia del repositorio, uno procede del directorio que acaba de exportar y otro vive en el directorio de datos del propio crate de nóminas.

Fichero De dónde procede Qué se lee de él
division_crosswalk.csv Datos de referencia versionados del crate de construcción Prefijo de código de coste y nombre de división
crew_assumptions.csv Datos de referencia versionados del crate de construcción Nombre de división y tamaño de cuadrilla
work_packages.csv TCO26_DATA_DIR Código de coste y horas de mano de obra presupuestadas
wage_payment_rules.csv Datos de referencia versionados del propio crate de nóminas La fila de jurisdicción impresa en la nota

division_crosswalk.csv:

uniformat_prefix,csi_division,division_name

crew_assumptions.csv:

csi_division,division_name,crew_size,hours_per_day

wage_payment_rules.csv:

jurisdiction_code,max_pay_period_days,max_days_to_pay_after_period_end,day_counting,remitting_authority,comp_authority,source_ref,effective_from

De work_packages.csv — un fichero más ancho, propiedad de la herramienta de construcción — esta ejecución lee exactamente dos campos: cost_code y labor_hours_budget. Todo lo demás de la fila se ignora.

Conviene conocer tres detalles antes de la primera ejecución:

  • hours_per_day se carga y nunca se usa. El lector de supuestos de cuadrilla lo analiza en memoria; este informe consume solo crew_size. No es una columna que deba acertar para esta tarea.
  • Un código de coste se une a una división por el prefijo coincidente más largo. Cada fila de la tabla de correspondencia declara un prefijo; el código de coste de un paquete de trabajo se compara con todos ellos y gana el más largo. Un código que no coincide con ningún prefijo no se une a nada — véase la tercera comprobación de verificación, donde eso importa más de lo que parece.
  • La jurisdicción está fijada en el código. No hay opción, ni variable de entorno, ni columna en ningún sitio que seleccione qué fila de jurisdicción se lee. Un código de jurisdicción es una constante del binario, y solo esa fila se consulta.

3. Ejecutar el binario

Desde la raíz del espacio de trabajo:

cargo run -p tool-payroll-tco-26

Ese es el comando completo. No hay opciones, ni subcomandos, ni argumentos posicionales — el binario no analiza la línea de comandos en absoluto, de modo que no existe un --help que consultar, ni un --jurisdiction con el que sustituir la constante, ni forma de representar solo una parte del informe. Todo lo configurable que tiene es la única variable de entorno del paso 1.

4. Leer la línea de consola

Una ejecución correcta imprime exactamente una línea:

[payroll_register] 9 division(s), 4820 total budgeted hour(s) — written to <directorio de salida>

Los recuentos son inventados para esta guía; la forma es real. Conviene leer ambos números en lugar de saltárselos — son el único resumen que produce la ejecución, y el recuento de divisiones es lo primero que delata una tabla de correspondencia rota.

Resultado esperado

Dos ficheros en el directorio de salida fijado en el código, que la ejecución crea si no existe:

Fichero Qué es
payroll_register.html El registro como página web
payroll_register.pdf El mismo registro como documento impreso

El documento tiene tres partes: una cabecera con la etiqueta de proyecto propia del despliegue, el título del informe y el recuento de divisiones; una nota de Bases de preparación; y una tabla.

La tabla tiene cinco columnas — Division, Crew Size, Budgeted Hours, Pay Freq., Gross Pay — y repite su encabezado entre páginas. Dos de las cinco están pobladas. El registro se compone tipográficamente como documento de trabajo y no como estado presentado, que es la clasificación correcta para una hoja de cifras presupuestadas.

La nota de Bases de preparación declara en el propio documento que el tamaño de cuadrilla y las horas presupuestadas son reales y proceden de los datos de paquetes de trabajo de la herramienta de construcción, que la frecuencia de pago y el salario bruto no se muestran porque ninguno de los dos ha sido diseñado, y que nunca se ha registrado un parte de horas ni una transacción de nómina para el proyecto. Un segundo párrafo, presente solo cuando se encuentra la fila de jurisdicción, indica el tope de pago de salarios de esa jurisdicción en días, si esos días se cuentan como naturales o hábiles, qué autoridad administra la remisión, cuál administra la declaración de accidentes de trabajo, y la cita que respalda todo ello.

Ese segundo párrafo es un enunciado de la norma, no una aplicación de ella. Nada en esta ejecución calcula una fecha de pago, y nada la contrasta con el tope.

Verificación

Contraste el recuento de divisiones con la tabla de correspondencia. El número de la línea de consola es cuántas divisiones distintas recibieron al menos un paquete de trabajo emparejado. Si es inferior al número de divisiones en las que espera ver trabajo, la correspondencia no está emparejando lo que usted cree.

Contraste el total con la tabla. El total de horas presupuestadas de la línea de consola es la suma de la columna Budgeted Hours. También debería coincidir con la cifra de horas-hombre que produce el informe de estado de construcción hermano a partir de los mismos datos de paquetes de trabajo — la unión y la agregación replican aquí deliberadamente la lógica de aquel informe, de modo que los dos nunca puedan discrepar en silencio sobre las mismas cifras subyacentes. Si difieren, uno de los dos se ha desviado, y ese es un hallazgo que merece perseguirse.

Sume usted mismo labor_hours_budget y compare. Esta comprobación no es opcional, y es la única forma de detectar el único fallo silencioso del informe. Una fila de paquete de trabajo cuyo código de coste no coincida con ningún prefijo, o cuyo labor_hours_budget esté vacío o no se analice como número, se descarta de la agregación sin advertencia, sin contador y sin mención alguna ni en la línea de consola ni en el documento representado. El registro parecerá completo. Sume la columna en su fichero de origen: si su total es mayor que el de la línea de consola, la diferencia son filas descartadas, no un error aritmético.

Lea las rayas como dos hechos distintos. Una raya bajo Pay Freq. o Gross Pay significa que la plataforma no calcula esa magnitud en absoluto. Una raya bajo Crew Size significa algo más concreto y más accionable: ninguna fila de crew_assumptions.csv tiene un nombre de división que coincida con esa división. El renderizador se niega a imprimir 0 ahí, precisamente para que un supuesto ausente no pueda confundirse con una cuadrilla de nadie.

Confirme que el párrafo de jurisdicción está presente. Si la nota de Bases de preparación termina tras su primer párrafo, la consulta de jurisdicción no encontró nada y el documento ha perdido en silencio toda su información regulatoria. Véanse los casos límite.

Lo que esta tarea no hace

  • No calcula el salario bruto. No se lee ninguna tarifa salarial de ningún sitio. La columna es estructural.
  • No calcula el salario neto ni deducción alguna. El cálculo de bruto a neto — tramos fiscales, fórmulas de deducción obligatoria — está explícitamente fuera del alcance de esta versión y no está implementado a medias.
  • No determina una frecuencia de pago. Ningún campo que lleve una frecuencia de pago por cuadrilla o por empleado tiene sitio en ningún esquema que esta ejecución lea, y por eso la columna es una raya y no un valor predeterminado.
  • No calcula ni hace cumplir una fecha de pago. El tope de pago de salarios de la jurisdicción se imprime como texto en una nota. Nada deriva una fecha de pago, y nada la contrasta con ese tope.
  • No remite nada, ni calcula un calendario de remisión. Las autoridades de remisión y de accidentes de trabajo se nombran en la nota como hechos sobre la jurisdicción. No se calcula ningún calendario.
  • No lee partes de horas. Toda hora de este informe es una estimación presupuestada asociada a un paquete de trabajo. Ninguna hora realmente trabajada aparece en ningún sitio.
  • No es por empleado. No hay registro de empleado, ni plantilla, ni nombre alguno en esta cadena en ningún momento. Las filas son divisiones.
  • No selecciona jurisdicción. Un código de jurisdicción es una constante de compilación; hoy, un operador en otra jurisdicción necesita un cambio de código, no un cambio de configuración.
  • No escribe asientos en el libro mayor. La ejecución lee cuatro ficheros y escribe dos.

Casos límite

  • Cualquier fichero de entrada ausente aborta la ejecución con read <ruta>: <error> y una salida distinta de cero. No se escribe nada. El mensaje es un pánico en bruto y no un error formateado — nombra la ruta, que es la parte que usted necesita.
  • Una fila corta en cualquiera de los dos ficheros de referencia aborta la ejecución de la misma forma abrupta. Ambos lectores de referencia indexan posiciones de columna fijas, de modo que una fila con menos campos de los esperados es un fallo de índice, no una línea omitida.
  • Una coma dentro de un nombre de división romperá la correspondencia. El lector de paquetes de trabajo maneja campos entrecomillados; los dos lectores de referencia dividen por comas simples y no lo hacen. Un nombre de división con coma desplaza en silencio todos los campos posteriores.
  • Un valor de day_counting no reconocido en la tabla de jurisdicciones aborta la ejecución nombrando el valor infractor. Solo se admiten dos formas.
  • Que no exista fila para la jurisdicción fijada en el código no es un error. La ejecución termina bien, los dos ficheros se escriben, y la nota de Bases de preparación simplemente omite su párrafo de jurisdicción. Es el fallo más peligroso de la herramienta, porque el documento parece terminado y ha eliminado en silencio toda su información regulatoria. Compruebe que el párrafo está, en lugar de darlo por supuesto.
  • Las divisiones se ordenan alfabéticamente por nombre, no por número de división. Si espera un orden numérico, el informe no está mal — está ordenado por la otra clave.
  • Los ficheros de salida se sobrescriben en el sitio. Sin versionado, sin directorio con marca de tiempo, sin confirmación y sin variable de entorno que los envíe a otro lugar. Copie lo que necesite conservar antes de volver a ejecutar.

Reversión

No hay nada que deshacer en los datos de origen: la ejecución lee cuatro ficheros y nunca escribe en ellos. Sus únicas escrituras son payroll_register.html y payroll_register.pdf. Bórrelos, o vuelva a ejecutar para reemplazarlos.

Pasos siguientes

Véase también

Cite this record: /wiki/generate-a-payroll-register — revision 8fff5a87, last updated 1 September 2026.

Important Information

Estructura corporativa. PointSav Digital Systems ("PointSav") es actualmente un nombre comercial de Woodfine Capital Projects Inc. ("Woodfine"), con previsión de convertirse en una subsidiaria de propiedad absoluta de Woodfine tras su incorporación. PointSav no ofrece, vende ni solicita por sí mismo valor alguno. Toda oferta de valores asociada a las soluciones inmobiliarias de tenencia directa de Woodfine se realiza exclusivamente por parte de Woodfine, y únicamente por medio del Memorando de Colocación Privada aplicable.

Sin asesoramiento de inversión. El contenido de este wiki se ofrece con fines de ingeniería, operativos, de investigación y de desarrollo. Nada de lo que figura en este wiki constituye asesoramiento de inversión ni una solicitud para invertir en ninguna sociedad o solución de tenencia directa de Woodfine.

Propiedad intelectual. El nombre, el nombre comercial, el logotipo y las marcas de PointSav, junto con todos los productos, servicios y ofertas actuales y futuros de las marcas PointSav y Totebox — así como el software, el código fuente, la documentación, el sistema de diseño y todos los materiales relacionados — son propiedad de Woodfine y sus filiales, salvo los componentes identificados como de código abierto. No se otorga ningún derecho salvo el expresamente establecido en una licencia o acuerdo por escrito. El aviso de marcas completo aparece en el pie de página de cada página de este sitio.

Componentes de código abierto. Algunas partes de la plataforma se ofrecen bajo licencias de código abierto permisivas identificadas en el repositorio correspondiente. El uso de esos componentes se rige por los términos de sus respectivas licencias.

Sin garantía; uso informativo. El contenido de este wiki se ofrece únicamente con fines informativos generales y no constituye una declaración, garantía ni compromiso respecto de la funcionalidad, disponibilidad, precio o hoja de ruta de ningún producto. Algunos artículos describen características, capacidades e hitos planificados o previstos — el lenguaje como "planificado", "previsto", "objetivo", "puede" y "esperado" marca este contenido prospectivo, que está sujeto a cambios y no constituye un compromiso respecto del rendimiento futuro.

Confidencialidad. Cuando un artículo describiría un detalle operativo o de implementación no destinado a divulgación pública, ese artículo no se publica en este wiki. El contenido aquí es documentación de ingeniería de uso general, no configuración específica de clientes.

Jurisdicción. Woodfine Capital Projects Inc. está constituida en Columbia Británica, Canadá. Las referencias a la Sovereign Data Foundation en este wiki describen una iniciativa planificada o prevista únicamente, no una titular de capital actual ni un órgano de gobierno activo.

Cambios a este aviso. PointSav podrá actualizar este aviso periódicamente; rige la versión publicada en esta página.

No es un sistema de presentación de documentos. Este wiki no es un sistema de presentación de valores, un repositorio de divulgación electrónica ni un sustituto de SEDAR+ ni de ningún otro sistema de presentación regulatorio. Las presentaciones formales de valores se realizan a través del sistema de presentación regulatorio correspondiente, no a través de este wiki.

Descargo completo. Este aviso complementa, y no sustituye, el artículo completo de Avisos Legales. En caso de cualquier conflicto, prevalece el artículo de Avisos Legales.

Read the full disclaimer →