Extracto de fondo de inversión

Los movimientos de un periodo en pesos y en unidades, con el valor de la unidad, la rentabilidad y el cierre del saldo que recibe el titular.

extracto-de-fondo, con el diseño banca: qué entró, qué salió, cuánto rindió y con cuánto quedó el titular en un periodo.

"yourCompany": { "name": "Fiduciaria del Ejemplo S.A.", "nit": "800.123.456-7" },  // quien administra
"fund": { "name": "Fondo de Inversión Colectiva Abierto Ejemplo Liquidez", "nit": "800.123.456-7" },
"billTo": { "name": "MARTA ELENA OSORIO RIVERA", "nit": "43.210.987",
            "address": "Calle 10 Sur # 48-120", "city": "Sabaneta / Antioquia",
            "advisor": "Julián Betancur Mesa" },                  // el titular; advisor es opcional
"statement": {
  "account": "550000012345",
  "from": "2026-09-01", "to": "2026-09-30",                       // obligatorios
  "unitValueAtEnd": "21.834,50712390",                            // texto: se imprime tal cual
  "periodReturn": "9,26 % E.A. neta",
  "maturityDate": "2027-03-20",                                   // opcional: solo si la inversión vence
  "feeNote": "Comisión promedio mensual sobre el valor de la cartera: 1,50 % anual."
},
"movements": [
  { "date": "2026-09-02", "transaction": "Adición",
    "amount": 4500000, "units": "206,09579023", "balance": 22840225.60 }
],
"summary": {
  "previousBalance": 18340225.60, "previousUnits": "839,96517512",
  "additions": 18300000, "withdrawals": 7650000,
  "netReturns": 196480.55, "withholdingTax": 17927.59,
  "newBalance": 29168778.56, "newUnits": "1.335,90277053"         // newBalance es obligatorio
}
  • Nada se calcula aquí. El nuevo saldo no es el anterior más adiciones menos retiros, las unidades de un movimiento no salen de dividir su valor por el de la unidad, y la rentabilidad no se deriva de los saldos: todo llega hecho y se imprime como llega.
  • Las unidades van como texto y se imprimen tal cual, con los decimales y los separadores que usted mande. No se reformatean: redondear ocho decimales cambiaría la participación que el titular cree tener.
  • El emisor del documento es quien administra el dinero (yourCompany); el titular va en billTo. La tabla dice cada movimiento en las dos medidas —pesos y unidades— y el cierre repite el saldo en ambas, que es como se compara un periodo con el siguiente.
  • Un periodo sin movimientos es un extracto válido: mande movements: [] y el documento dice «Sin movimientos en el periodo», con su cierre impreso igual.
  • Lo obligatorio es de qué periodo habla y en qué quedó: statement.from, statement.to, summary y summary.newBalance. Sin ellos la respuesta es 400 con la lista de lo que falta, y no se compone ningún PDF. Los movimientos no son obligatorios.
  • Si hay más movimientos de los que caben en una hoja, la tabla continúa en la siguiente repitiendo su cabecera, y la rejilla de cierre no se parte entre hojas.
  • Las leyendas legales van en legalNotes y el texto vertical del margen en sideNotes: son declaraciones de quien emite —vigilancia, avisos de riesgo, garantías—, y el motor no elige ninguna.
  • maturityDate se imprime solo si llega: un fondo abierto no vence, y un «Sin vencimiento» diría que le falta algo que no le corresponde.
  • Lo que no llega se dice en vez de rellenarse: sin fondo, «Sin fondo»; sin unitValueAtEnd, «Sin valor de la unidad»; sin periodReturn, «Sin rentabilidad». Un importe que no llega queda en blanco, porque un $ 0,00 en un saldo afirmaría que no queda nada. Acepta además notes, fields y selectedCurrency.

Ejemplo: extracto-de-fondo.json.