kmukku/php-iso11649
Lightweight PHP library for ISO 11649 structured creditor references (RF references). Generate, validate, and format RF numbers with mod-97 checksum handling, plus helpers for converting existing references for use in SEPA credit transfers and payment workflows.
What the package actually is. A single-purpose value-object/validator library for ISO 11649 creditor references ("RF" references) used in SEPA credit transfers. The entire domain surface is: normalize input, validate format (RF + 2 check digits + up to 21 alphanumerics, max 25 chars), compute and verify the ISO 7064 MOD 97-10 check digits, and emit a canonical string. There is no I/O, no persistence, no framework coupling, and no configuration worth speaking of. This is closer to a snippet than a subsystem.
Architecture fit. Good in shape, weak in provenance. The library is framework-agnostic, so it drops into a Laravel domain/service layer without a service provider, facade, or config publish step — which is the correct design for this kind of primitive. The concern is not architectural mismatch but that the package is a leaf dependency with an unknown repository URL, 12 stars, and a last release of 2020-04-21. An unverifiable upstream is a supply-chain and audit finding, not a design finding.
Integration feasibility. Mechanically trivial: one composer require, one class instantiation, calls at two points — reference generation on outbound payment instruction creation, and validation on inbound/imported reference data (reconciliation, mandate ingestion, CSV/ISO 20022 pain.001 parsing). The realistic effort is measured in hours, not sprints.
Technical risk. Ranked:
php: ^7.x and predates PHP 8.1/8.2 deprecations. Even if the code is simple enough to run fine on 8.3, Composer's platform check may block install, forcing a fork or an --ignore-platform-reqs smell. Must be verified against the actual composer.json.RF18 5390 0754 7034 with spaces and mixed case)? Does it enforce the 25-char ceiling and the leading-RF rule? Does it reject non-alphanumeric characters rather than silently coercing? Does validation distinguish "malformed" from "bad checksum" so we can give users actionable errors?A=10 … Z=35).Key questions for the maintainer/vetting spike.
validate() / generate() / normalize() operations, or only a boolean?RF18 5390 0754 7034)?Stack fit. Framework-neutral and therefore Laravel-neutral: no provider registration, no config, no migrations, no queue or cache interaction. It belongs behind a thin domain boundary rather than being called directly from controllers — define a CreditorReference value object or a CreditorReferenceService interface in our codebase, with the package as the one implementation. That costs an hour and converts an unmaintainable upstream into a swappable detail.
Migration path.
RF00, non-ASCII, empty string).mod 97 or regex validation scattered in payment code, which is where the real defect risk usually sits.Compatibility. Verify against our actual matrix: PHP version, Laravel version (irrelevant technically, but relevant to CI images), and whether we run composer audit / private mirroring. If we adopt, pin an exact version in composer.json (not a caret range), commit the lockfile, and mirror the source into our own VCS or a private Satis repo so an upstream disappearance is a non-event.
Sequencing. Reference generation first (outbound, low blast radius, easy to verify against bank acceptance), then validation on inbound/import paths where rejecting a valid reference has user-visible cost. Do not couple the adoption to any payment-scheme change; keep them separate releases so a rollback is clean.
Maintenance. Runtime maintenance is effectively nil — pure functions, no state. Ownership maintenance is real: we become the de facto maintainer of a fork we did not write. Budget a named owner, a pinned version, and a note in the dependency register explaining why an unmaintained 12-star package is present. If we build in-house, the ongoing cost is roughly zero and the audit conversation disappears.
Support. No vendor, no SLA, no security response channel. Escalation is "read the source" — which is fine here precisely because the source is small. Document the algorithm and the reference test vectors in our own repo so knowledge does not live in a dependency we cannot reach.
Scaling. A non-issue. Mod-97 over ≤25 characters is sub-microsecond, allocation-light, and stateless; it will never appear on a profile. It can be called per payment instruction without caching. If it ever does show up, that means it is being called in a loop over large batch files — memoize or precompute, do not restructure.
Failure modes.
Ramp-up. Hours for any PHP developer to use; half a day to understand the ISO 11649 / ISO 7064 rules well enough to trust or reimplement them. The learning curve is the standard, not the package — which is the crux of the assessment: the package's value is mostly in saving a developer an afternoon, and it prices that saving with an unverifiable upstream, five years of drift, and a 2020 PHP constraint. For a TPM, the defensible call is to treat this as a reference implementation to read, not a dependency to adopt: confirm the algorithm against it, write ~50 lines plus tests in-house, and keep the payment path fully inside our own supply chain.
How can I help you explore Laravel packages today?