infoalloggi-monorepo/apps/infoalloggi/typst/estratto.typ
Marco Pedone f52dd96c11 feat: implement Stripe reports management for admin panel
- Add new page for managing Stripe reports with functionality to generate and view reports.
- Create API router for handling Stripe report operations including listing, setting up, and generating reports.
- Introduce caching service for managing cache invalidation related to reports.
- Update Typst templates for formatting financial reports in EUR.
- Enhance utility functions for price formatting and error handling.
- Implement a script to check for unused tRPC procedures in the codebase.
2026-04-03 18:57:39 +02:00

122 lines
3.1 KiB
Typst

#import "utils.typ": format-eur
#let data_file = sys.inputs.at("data_path", default: "none")
#let data = if data_file != "none" { json(data_file) } else {
(
interval: "01/03/2026 - 31/03/2026",
emissione: "03/04/2026",
starting_balance: 0,
ending_balance: 0,
activity_gross: 184500, // Entrate lorde
activity_fee: -6187, // Commissioni
payouts: -178313, // Prelievi verso conto bancario
movimenti: (
(
"date": "17/03/2026",
"description": "Acconto Cerco Transitorio",
"gross": 3500,
"net": 3361,
"fees": -139,
"name": "Rossi Mario",
"email": "killmyfootwithsniper@gmail.com",
),
(
"date": "17/03/2026",
"description": "Rinnovo permanenza 6 mesi",
"gross": 36000,
"net": 34805,
"fees": -1195.0000004,
"name": "Rossi Mario",
"email": "killmyfootwithsniper@gmail.com",
),
),
)
}
#set page(paper: "a4", margin: (x: .5cm, y: 1.5cm))
#set text(font: "Inter 18pt", size: 10pt)
#let stripe-blue = rgb("#635BFF")
#let text-dark = rgb("#30313D")
#let text-muted = rgb("#687385")
#let border-color = rgb("#E3E8EE")
#let bg-light = rgb("#F7FAFC")
#grid(
columns: (1fr, 1fr),
align(left)[
// Simulazione del logo Stripe
#text(fill: stripe-blue, size: 28pt, weight: "bold")[Stripe]
],
align(right)[
#text(fill: text-muted, size: 14pt, weight: "bold")[ESTRATTO CONTO] \
#v(4pt)
#text(fill: text-dark, size: 10pt)[*Periodo:* #data.interval] \
#text(fill: text-dark, size: 10pt)[*Generato il:* #data.emissione]
],
)
#v(.5cm)
#text(fill: text-muted, size: 9pt, weight: "bold")[INTESTARIO DEL CONTO:] \
#v(2pt)
#text(weight: "bold", size: 11pt, fill: text-dark)[Arcenia S.r.l.] \
Via Beata Giovanna, 1 \
36061 Bassano del Grappa (VI) \
Italia \
P.IVA: 00924740244
#v(.5cm)
#text(size: 14pt, weight: "bold", fill: stripe-blue)[Riepilogo del Conto]
#v(0.3cm)
#table(
columns: (1fr, 1fr, 1fr, 1fr, 1fr),
stroke: border-color,
fill: (col, row) => if row == 0 { bg-light } else { none },
align: center + horizon,
[*Saldo Iniziale*], [*Totale Entrate*], [*Commissioni*], [*Prelievi*], [*Saldo Finale*],
[#format-eur(data.starting_balance)],
[#format-eur(data.activity_gross)],
[#format-eur(data.activity_fee)],
[#format-eur(data.payouts)],
[#format-eur(data.ending_balance)],
)
#v(.5cm)
#text(size: 14pt, weight: "bold", fill: stripe-blue)[Dettaglio Movimenti]
#v(0.3cm)
#table(
columns: (auto, 1fr, 1fr, auto, auto, auto),
stroke: (x, y) => if y == 0 {
(bottom: 1pt + text-muted)
} else {
(bottom: 0.5pt + border-color)
},
fill: (col, row) => if row == 0 { bg-light } else { none },
align: (left, left, left, left, left, left),
table.header([*Data*], [*Descrizione*], [*Cliente*], [*Lordo*], [*Comm.*], [*Netto*]),
..data
.movimenti
.map(item => {
(
item.date,
item.description,
item.name + "\n" + text(size: 8pt)[#item.email],
format-eur(item.gross),
format-eur(item.fees),
format-eur(item.net),
)
})
.flatten(),
)