kch/pcc-3-deklaracja
Laravel/PHP package for generating and managing Polish PCC-3 tax declarations for civil law transactions. It simplifies preparing declaration data, calculating tax, and producing compliant documents, helping automate PCC-3 form creation and integrate declaration workflows into your application.
Architecture fit. Despite the "Laravel package" label, this is a framework-agnostic Composer library of DTO/domain classes that describes a Polish PCC-3 declaration and serializes it to XML via JMS Serializer annotations. There is no service provider, config, facade, or migration. From a product-architecture standpoint that is actually convenient: the capability it represents is a narrow, well-bounded compliance artifact (taxpayer → transaction basis → tax calculation → declaration document), which maps cleanly onto a single domain module behind an application service. It is a poor fit only if the roadmap expectation is a plug-and-play Laravel component; it is a good fit as the seed of an internally owned PCC-3 generator capability.
Integration feasibility. Low without remediation. Last release October 2017, 1 star, 0 dependents, no issue traffic. The code almost certainly targets PHP 5.6/7.x and JMS Serializer 1.x-era annotations. A Laravel 10/11 application on PHP 8.2+ will hit Composer constraint conflicts, Doctrine annotation-reader deprecations, and possible @SerializedName/type-handling changes. Realistic path: fork, upgrade, validate against the current Ministry of Finance XSD — or rebuild the small DTO surface directly from the schema. Either way the effort is measured in days, not weeks, which is the key input to a build-vs-borrow decision.
Technical risk.
| Risk | Likelihood | Impact | Product consequence |
|---|---|---|---|
| Schema drift since 2017 (XSD / tax rules) | High | High | Portal rejects filings; compliance breach |
| Dependency rot (JMS 1.x → 3.x, PHP 8.x) | High | Medium | Blocks platform upgrades, deploy friction |
| No XSD validation or known test coverage | High | High | Silent, well-formed-but-wrong XML |
| Abandoned upstream (no security/patch posture) | Certain | Medium | Permanent internal ownership burden |
| Tax computation correctness if in scope | Medium | High | Incorrect declared amounts |
Mitigating factor: MIT license with no CLA or copyleft — forking into an internal VCS and re-licensing internally is legally clean, which materially lowers the "borrow" risk.
Key questions.
Stack fit. Treat it as an isolated domain dependency, not a Laravel first-class citizen. Vendor it into a bounded namespace, put an internal interface (Pcc3Generator) in front of it, and confine JMS Serializer to that adapter so the rest of the application is insulated from annotation-era code. If the host app cannot tolerate legacy constraints at all, containerize the generator as a small CLI/sidecar service exchanging JSON in and XML out — this also gives a clean upgrade boundary.
Migration path. Recommended: fork into internal VCS, tag 1.0.0-internal, upgrade PHP and JMS constraints, convert annotations to attributes or explicit metadata, add golden-file regression tests, and validate output against the official PCC-3 XSD. Decision gate: if fork-and-harden exceeds ~2–3 engineering days, stop and rebuild the DTOs from the schema — the domain surface is small enough that a rewrite is competitive and leaves a much cleaner long-term asset. Do not install upstream unmodified into any customer-facing service.
Compatibility. Expect friction with PHP 8.x, JMS Serializer 3.x, and Laravel 10/11. On PHP 7.4 / Laravel 6–8 it may install with pinned constraints, but that anchors the product to an unsupported runtime and is not an acceptable long-term posture. Containerization is the cleanest compatibility escape hatch and doubles as a testable unit for CI.
Sequencing. Each step has a product decision attached:
Maintenance. Upstream is dead; internal ownership is mandatory and permanent. Budget recurring effort for annual PCC-3 schema and tax-rule changes, PHP/JMS major upgrades, and dependency patching. The code volume is small, so the work is tractable — but it is a compliance-adjacent component, so "we'll get to it next quarter" is not a viable maintenance strategy. Name an owner.
Support. No vendor, no community, no issue triage, no knowledge base. Support must be internal: a runbook covering generation, validation, submission, and failure recovery, plus a documented escalation path to a tax/legal reviewer. Expect to rely directly on Ministry of Finance e-deklaracje documentation and the official XSD as your primary references.
Scaling. XML generation is stateless and CPU-light; horizontal scaling is trivial and JMS Serializer will not be the bottleneck. Throughput is governed by surrounding workflow — data entry, persistence, submission to the tax portal. The only real scaling concern is operational: batch generation for a loan portfolio should be queued, rate-limited against the portal, and validated asynchronously rather than inline. Do not share serializer state across requests.
Failure modes. Highest impact first: (1) portal rejection from stale schema — mitigation: XSD validation in CI plus a sandbox submission check on every release; (2) silent serialization drift after a JMS upgrade producing well-formed but semantically wrong XML — mitigation: golden-file regression fixtures and field-level assertions; (3) Composer resolution failures blocking deploys — mitigation: internal fork with pinned constraints and a lockfile; (4) PHP runtime upgrades blocked by abandoned constraints — mitigation: containerized generator; (5) incorrect tax amounts if computation is in scope — mitigation: independent recomputation in tests and finance review.
Ramp-up. A mid-level PHP developer can read the code in under a day; JMS Serializer familiarity is the main prerequisite. The larger cost is domain ramp-up on Polish PCC-3 rules and e-deklaracje submission mechanics — plan one to two weeks for a developer plus a tax/legal reviewer to reach production confidence on a fork-and-harden path. For TPM planning: ~2 dev-days for the spike and fork/build decision, ~1–2 sprint-weeks to hardened, signed-off output, and a standing annual maintenance line item thereafter. The value of the package is that it converts an unknown compliance requirement into a scoped, estimable capability — it is a cheap discovery instrument, not a dependency.
How can I help you explore Laravel packages today?