Form 230
A web platform for collecting Form 230 declarations through an embeddable public form, a handwritten signature, GDPR consent, and back-office processing via PDF, CSV, XML, ZIP archives, and ANAF batch registers.

Core stack
The challenge
The main challenge was turning a process involving personal data, signatures, and tax documents into a coherent flow from the public form through to the administrative batches. The system had to keep data separated by organization, avoid repeatedly including taxpayers in already-finalized batches, generate documents in the required formats, and move heavier operations — PDF, XML, CSV, ZIP, and batch register — outside the web request.
The solution
The solution uses a Laravel 12 monolith with Livewire 3 and Blade for the back office and a responsive public form that sends data to an API endpoint. Eloquent models the organizations, taxpayers, PDFs, exports, and archives, and CNP uniqueness is enforced per organization through a composite constraint. Queued jobs generate PDFs with TCPDI/TCPDF, CSVs, XMLs, and ZIP archives, keeping the operation's state in the database. For the ANAF batch register, the app builds the XML and orchestrates DUKIntegrator via an Artisan command and Java, exposing both the resulting files and the validation errors in the UI.
Notable complexity
Form 230 digitalizes the path between the person filling out the declaration for the 3.5% redirection and the organization's team preparing the documents for processing. Each organization has its own legal and banking data, can receive a public form URL embeddable via iframe, and can keep taxpayers separate through association_id. The form collects identification and address data, the one-year or two-year option, a signature drawn in the browser, and consent for data processing.
On submission, the backend validates the fields, checks the uniqueness of the national ID (CNP) within the organization, and uses an external service for additional CNP validation. The record is then persisted as a signed form, and a queue job generates the PDF declaration over an official template, fills in the taxpayer's and the organization's data, inserts the signature, and can email the resulting document to the taxpayer.
The Laravel Livewire back office offers a dashboard, organization selection, statistics for signed forms and the redirection period, tracking the source from which the iframe was loaded, a paginated and filtered taxpayer list, plus organization and user administration. The user, super_user, and admin roles and the many-to-many relationship between users and organizations model operational access, and the interface synchronizes the selected organization across Livewire components.
Administrative processing is moved into queue jobs. The app can generate CSV exports, XML files with the structure used for Form 230, ZIP archives bundling the documents for a batch, and XML batch registers. For the batch register, an Artisan command runs DUKIntegrator via Java, keeps the PDF result when it is produced, and saves validation errors for review in the interface. A separate flag allows manually marking the batch register as included in e-Guvernare; the code does not demonstrate a direct API integration with the filing platform.
The app uses Laravel storage for the generated documents, temporary cache for PDF job status, and a queue worker managed via PM2. The repository includes a manually triggered GitHub Actions workflow that connects to the server via SSH, runs migrations, builds Vite, restarts the worker, and runs Laravel optimizations.
Key results
- Responsive public form embeddable via iframe for each organization
- Collecting identification and address data, the one-year or two-year redirection option, and GDPR consent
- Capturing the handwritten signature directly in the browser and persisting it for the generated document
- CNP uniqueness at the organization level and additional validation via an external service
- Asynchronous generation of Form 230 as a PDF over a template, with a history of generated documents
- Emailing the generated PDF to the taxpayer
- Per-organization dashboard with totals, signed forms, redirection periods, and statistics by iframe source
- Paginated taxpayer list with search and filters by status, county, and period
- Asynchronous CSV export, with operational filters kept alongside the export history
- XML generation and tracking of taxpayer batches already included in finalized archives
- ANAF ZIP archives orchestrating the XML, PDFs, and CSV for the same batch
- XML batch-register generation and processing via DUKIntegrator/Java, with the PDF and validation errors kept in the system
- Manual tracking of batch-register inclusion in e-Guvernare
- Managing multiple organizations and associating users with available organizations
- user, super_user, and admin roles for separating the main administrative operations
- Queue worker managed via PM2 and a GitHub Actions workflow for manual deployment over SSH
Related projects
- GrileAMGA training ecosystem for nursing assistants: courses, multiple-choice questions, exam simulations, statistics, and tests distributed by teachers, across web, iOS, and Android, with subscriptions, AI, and editorial administration.
- Risa TimeA digital ecosystem for picking up a customer's car, transporting it to a partner car wash, and returning it safely, coordinated through separate customer and driver apps, an operations panel, and real-time tracking.
- MixboxA multi-vendor marketplace for local products, with a single cart spanning multiple stores, separate apps for customer, merchant, and courier, flexible payments, and an advanced system for importing and managing supplier catalogs.
Want something similar?
Start with the estimate wizard — answer a few questions and get a realistic price range and timeline.