Salta al contenuto

Gestionale open source · Licenza MIT

Il quaderno delle ore, che però fa i conti.

Officino registra il lavoro svolto in officina, ne misura il costo e ne ricava il documento da consegnare al cliente.

Fastify e PostgreSQL Vue 3 Docker pronto Self-hosted

Rapportino n. 128 · 04/03
Cliente
Meccanica Vallese s.r.l.
Macchinario
Pressa idraulica PH‑40
Operaio
M. Ferrari
  • Sostituzione guarnizioni4,5
  • Taratura valvola di sfogo3,0
  • Ripristino centralina5,0

Aperto

12,5 ore

Come funziona

Un rapportino: un operaio, un macchinario, un cliente.

Il pezzo centrale è il rapportino: un contenitore delle lavorazioni che un operaio ha svolto su un solo macchinario per un solo cliente. Dentro ci finiscono le singole lavorazioni, con le ore e i materiali impiegati.

Lo stato non è memorizzato: si legge da due campi
chiuso_il nota_lavorazione_id Stato che ne risulta
— — Aperto
2026-03-04 — Concluso
2026-03-04 412 In nota di lavorazione

Una colonna scritta accanto a quei due campi rappresenterebbe due volte lo stesso fatto, e basterebbe un endpoint che aggiorna l'una e non l'altra per avere un rapportino gestito senza nota. Con la derivazione la contraddizione non è rappresentabile.

I rapportini chiusi confluiscono in una nota di lavorazione, il documento che va al cliente: raccoglie le lavorazioni di un periodo, ne calcola i totali e produce un PDF. Prima di stampare, un controllo di coerenza segnala le note che non tornano — righe con costo orario a zero, materiali senza prezzo — e chiede conferma esplicita per procedere.

Cosa c'è

Sei sezioni, e nient'altro da configurare.

Rapportini

Ore per macchinario e cliente, materiali con prezzo unitario, costo orario per riga, filtri per periodo, avviso in caso di rapportino duplicato, PDF del singolo rapportino.

Note di lavorazione

Costruite dai rapportini chiusi, con data di riferimento propria e riassunto composto dal server. Si correggono i costi, si uniscono o si dividono per macchinario, e il PDF distingue manodopera e materiali.

Dashboard

Misura il lavoro svolto, non i preventivi. Metriche distinte per ruolo, ore per operaio e per cliente, pannello dei giorni con ore mancanti sotto le otto feriali. Il totale coincide sempre con l'elenco rapportini dello stesso periodo.

Preventivi

Numerazione progressiva automatica, pezzi a catalogo e fuori catalogo, manodopera e sconto, ciclo bozza → approvato → fatturato, PDF con il logo dell'officina.

Catalogo prodotti

Ricambi e materiali con categorie e ricerca, lettura di codici a barre EAN‑13 e QR, export Excel. Alimenta preventivi e materiali dei rapportini, e accetta voci fuori catalogo inserite a mano.

Clienti e permessi

Due ruoli, user e admin. Cinque sezioni sono riservate agli admin; dashboard, rapportini, preventivi e catalogo restano accessibili a tutti, e ogni operaio vede e modifica i propri rapportini.

Provalo

In locale, in cinque minuti.

Serve Node 20+, pnpm e PostgreSQL 15+. Docker è comodo ma non obbligatorio.

Installazione
git clone https://github.com/savez/officino.git
cd officino

cp .env.example .env          # rivedere le credenziali del database

cd backend  && pnpm install && cd ..
cd frontend && pnpm install && cd ..

cd backend && pnpm migrate && pnpm seed && cd ..
Avvio, in due terminali
make dev-backend              # API su :3000
make dev-frontend             # interfaccia su :5173

L'applicazione risponde su http://localhost:5173. I dati di esempio creano due utenze:

RuoloEmailPassword
admindemo@officino.appadmin123
operaiooperaio@officino.appadmin123

Sono credenziali di dimostrazione: vanno cambiate prima di qualunque uso reale, insieme a JWT_SECRET nel file .env.

Com'è fatto

Niente di esotico, e tutto self-hosted.

Backend

  • Fastify 5
  • PostgreSQL 15
  • Knex query e migrazioni
  • JWT autenticazione
  • PDFKit documenti
  • Zod validazione
  • Jest test

Frontend

  • Vue 3 con Vite
  • Bootstrap 5 token propri
  • Chart.js grafici
  • html5-qrcode codici a barre
  • Barlow font locali
  • Vitest test

Infrastruttura

  • Docker e Compose
  • Dev container VS Code
  • GitHub Actions CI
  • semantic-release versioni
  • nginx sito statico
Licenza MIT Node 20 Conventional Commits Nessun servizio esterno

Stato attuale, detto com'è

Sei suite di integrazione falliscono.

La CI esegue il frontend per intero e, del backend, lint e test unitari. I test di integrazione restano fuori perché sei suite falliscono, per quattro motivi distinti e tutti preesistenti. Sono elencati nella issue dei difetti noti, e sono il punto di partenza più utile per un primo contributo.

Le pull request sono benvenute: CONTRIBUTING.md spiega ambiente di sviluppo, convenzioni e cosa succede alla tua PR. Per una vulnerabilità di sicurezza non aprire una issue — la procedura sta in SECURITY.md.

Progetto indipendente

Offrimi una birra.

Officino è gratis, open source e senza tracciamento, scritto nel tempo libero. Se non ti va di aprire una pull request ma ti è servito, offrimi una birra.

Offrimi una birra ↗