Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Acs Bundle Laravel Package

answear/acs-bundle

Symfony bundle for ACS pickup point integration. Configure API credentials via YAML, then use ParcelShopsService to fetch parcel shops by country (Greece or Cyprus) and optional kind, returning ParcelShop DTOs. Includes clear exceptions for service and response errors.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

answear/acs-bundle is a Symfony bundle, not a Laravel package. That distinction is the central product constraint: the code is consumable in a Laravel/PHP application, but it is not drop-in. It ships Symfony DI extension/config loading, a bundle class registered through config/bundles.php, Symfony Serializer/PropertyInfo-based DTO hydration, and Symfony-style exceptions. Laravel has no bundle registry or Flex auto-registration, so the README installation path does not apply unchanged.

The functional scope is narrow and clear: a read-only lookup of ACS parcel shops/pickup points for Greece and Cyprus, with an optional shop kind filter. That is useful for checkout delivery-option discovery, store-locator experiences, and carrier selection in GR/CY. It is not a shipping, label, tracking, or rate-quote integration. A TPM should treat it as an ACS parcel-shop reference implementation and API-contract accelerator, not as a complete logistics capability.

Architecture fit is good only if the roadmap need is parcel-shop discovery in those two markets and the team accepts a thin adaptation layer. It is poor if the team expects Laravel-native conventions, multi-country coverage, or write-side carrier operations.

Integration feasibility

  • HTTP layer: Guzzle-based, which is compatible with Laravel. Timeout support was added upstream in 2.1.1, which is a positive operational signal.
  • Configuration: Requires apiKey, companyId, companyPassword, userId, userPassword, and optional language (default GR). These map cleanly to Laravel config/acs.php and environment variables.
  • Service surface: ParcelShopsService::getList(CountryIdEnum $countryId, ?int $kind = null) returning ParcelShop[] is small enough to wrap or port in days, not weeks.
  • Error model: Two coarse exceptions — ServiceUnavailable for Guzzle failures and MalformedResponse for bad payloads. Adequate for a first release, but insufficient for nuanced retry/circuit-breaker policy without additional mapping.
  • Distribution: The README instructs composer require [email protected]:answear/acs-bundle.git, which is not a normal Packagist package install. Expect to configure a Composer VCS repository or vendor/fork the code. This affects supply-chain review, version pinning, and CI reproducibility.
  • Documentation quality: The config sample uses answear_gls rather than answear_acs, and the prose duplicates companyId while omitting companyPassword. These are small but real signals that the integration path needs verification against source, not just the README.

Technical risk

Risk Likelihood Impact TPM mitigation
Symfony-to-Laravel impedance mismatch (DI, config, serializer) High Medium Budget an explicit adapter/port; do not plan a same-day install
Low adoption and maintainer concentration (0 stars, 0 dependents, Answear-internal ownership) High Medium Treat as forkable MIT code; assign internal ownership and pin versions
ACS API contract drift or undocumented limits Medium High Validate against ACS sandbox/credentials early; add contract tests
Dependency conflicts with Laravel’s Symfony component versions Medium Medium Resolve a Composer matrix before committing; prefer isolating the package
Scope gap vs. roadmap (no labels, tracking, shipping) Medium High Confirm product scope is discovery-only before adoption
Config/documentation errors causing silent misconfiguration Medium Medium Verify extension alias and required keys in a spike; add config validation
PHP 8.4 / Symfony 7 requirements vs. current platform Medium Medium Check Laravel/PHP versions; older platforms may need bundle 3.x or an upgrade
Security/supply-chain review of a Git-based dependency Low–Medium Medium Vendor or mirror; run SCA; store credentials in secrets manager

Key questions

  1. Product scope: Is parcel-shop discovery in GR/CY sufficient for the next 2–3 quarters, or does the roadmap require ACS rates, labels, tracking, or returns? If the latter, this bundle covers only the first slice.
  2. Commercial access: Do we have an ACS merchant account, API credentials, and documented rate limits/SLA? Without these, the package cannot be validated.
  3. Build vs. port vs. wrap: Do we fork and Laravelize the bundle, wrap the existing service by pulling in Symfony components, or reimplement the thin ACS client using Laravel’s HTTP client? The scope is small enough that all three are credible; the decision should be based on maintenance appetite, not code volume.
  4. Distribution policy: Will we consume via VCS repository, private Packagist mirror, or vendored copy? Who owns version pinning and upgrade review?
  5. Platform baseline: Which Laravel and PHP versions are in production? Does bundle 4.x (PHP 8.4) or 3.x (PHP 8.2+, Symfony 6/7) match our support matrix?
  6. Observability and failure policy: What latency budget, retry policy, and fallback experience are acceptable when ACS is unavailable during checkout?
  7. Geographic expansion: If we expand beyond Greece/Cyprus, is ACS still the right carrier abstraction, or should we design a carrier-agnostic pickup-point interface from day one?

Integration Approach

Stack fit

Symfony/bundle concern Laravel equivalent TPM note
Bundle registration via config/bundles.php Illuminate\Support\ServiceProvider No Flex in Laravel; manual registration required
YAML extension config (answear_acs.yaml) config/acs.php + env() Straightforward, but validate extension alias
Symfony Serializer / PropertyInfo DTO hydration Manual mapping, JsonMapper, or Laravel validation Decide whether to keep Symfony components or simplify
CountryIdEnum custom enum Native PHP/Laravel enum Drop-in conceptually; verify backing values
Symfony exceptions Laravel-friendly domain exceptions or HTTP client exceptions Map at the adapter boundary
Guzzle client Guzzle directly or Illuminate\Http\Client Prefer one HTTP abstraction across the app
PSR-3 logging removed upstream Laravel Log facade in wrapper Add logging in our adapter, not upstream

The cleanest Laravel fit is a thin application-level AcsParcelShopService that owns configuration, HTTP concerns, DTO mapping, caching, and exception translation. The upstream package can sit behind that service if dependency resolution is clean; otherwise the service becomes the replacement.

Migration path

  1. Decision spike (2–4 days): Install the package from a VCS repository in a scratch Laravel app. Confirm Composer resolution against the current Laravel/PHP baseline. Instantiate ParcelShopsService manually with Guzzle and required config. Call ACS with real or sandbox credentials for GR and CY.
  2. Contract validation (2–3 days): Capture representative ACS responses for all required kind values. Verify ParcelShop DTO fields, nullability, encoding, and error payloads. Confirm the CountryIdEnum values and the extension/config key names.
  3. Adapter build (1–2 weeks): Implement AcsParcelShopService with:
    • config/acs.php and secrets via environment/vault.
    • Exception mapping (ServiceUnavailable, MalformedResponse → domain/HTTP exceptions).
    • Timeout, retry/backoff, and optional circuit breaker.
    • Cache for parcel-shop lists with a sensible TTL (shop data changes infrequently).
    • Logging and metrics around latency and failure rate.
  4. Product integration (1 sprint): Wire into checkout/store-locator behind a feature flag. Provide fallback behavior when ACS is unavailable (hide ACS option, show static list, or degrade to another carrier).
  5. Hardening and rollout: Contract tests with recorded fixtures, load test the lookup path, document runbook, and decide whether to publish an internal Laravel package for reuse.

Compatibility

  • Bundle 4.x: PHP 8.4-oriented; aligns with modern Laravel but may force a platform upgrade.
  • Bundle 3.x: PHP 8.2+, Symfony 6/7; likely the safer baseline for Laravel 10/11 estates.
  • Laravel: 10+ is the realistic floor for native enum support and modern HTTP client features. Laravel 9 is possible but adds avoidable friction.
  • ACS: Compatibility is limited to GR/CY parcel-shop lookup. Confirm authentication method, rate limits, response schema, and whether ACS requires IP allowlisting or additional headers.
  • Composer: Laravel already ships multiple Symfony components; adding Serializer/PropertyInfo can create constraint conflicts. Resolve this in the spike before committing to the approach.

Sequencing

Run the work as a product-discovery and technical-feasibility spike in parallel, not as a sequential “install then build.” The commercial ACS access and the product fallback behavior are on the critical path more than the code adaptation. Gate full build on: credentials available, GR/CY response schema validated, Composer resolution clean, and product sign-off that discovery-only scope is sufficient.

Operational Impact

Maintenance

  • Low code volume, forkable license: MIT and a small surface make internal ownership feasible. A fork is a realistic fallback if upstream stalls.
  • Upstream cadence: Releases exist but adoption is effectively zero (0 stars, 0 dependents). Maintainer concentration at Answear is a continuity risk. Pin exact versions and review upgrades deliberately; do not float constraints.
  • Historical BC breaks: 2.0.0 and 3.0.0 both introduced breaking changes. Expect future major versions to move PHP/Symfony baselines. Budget a periodic upgrade review, especially around PHP minor releases.
  • Documentation drift: The answear_gls config typo and key inconsistencies mean our internal runbook — not the README — should be the source of truth.

Support

  • No commercial vendor support: Support is best-effort via the Answear team and open-source channels. Escalation for ACS API issues goes through our ACS account relationship, not the package maintainers.
  • Debugging: Errors surface as two broad exception types. Our adapter should add context (endpoint, country, kind, correlation ID) without logging credentials.
  • Onboarding: A Laravel developer can understand the package in a few hours; the real ramp-up is ACS domain knowledge (shop kinds, country coverage, credential handling) and our fallback policy.
  • Documentation to produce internally: configuration reference, credential rotation procedure, ACS sandbox usage, error taxonomy, and checkout degradation behavior.

Scaling

  • Traffic profile: Parcel-shop lookup is read-heavy but cacheable. A short TTL cache (minutes to hours) plus stale-while-revalidate behavior will absorb most checkout traffic.
  • Latency: ACS API latency is outside our control. Enforce strict timeouts and prefer asynchronous or pre-warmed lookups on high-traffic checkout paths. Never let pickup-point discovery block checkout completion.
  • Rate limits: Unknown from the README. Confirm with ACS and add client-side throttling/backoff. If limits are tight, centralize caching rather than calling per user session.
  • Concurrency: Guzzle is suitable for parallel requests, but the product need is likely a handful of country/kind combinations. Pre-fetch and cache rather than parallelize per request.
  • Multi-carrier future: If ACS is one of several pickup networks, define a carrier-agnostic PickupPointProvider interface now. This package should be one adapter, not the domain model.

Failure modes

Failure User/product impact Mitigation
ACS API downtime or timeout ACS delivery option unavailable at checkout Feature flag, fallback carrier/static list, clear messaging
Malformed or changed response schema DTO mapping failure, option disappears Contract tests with fixtures, schema guards, alerting on MalformedResponse rate
Credential expiry or rotation All lookups fail Secrets manager, expiry monitoring, documented rotation runbook
Rate limiting Intermittent failures under load Shared cache, throttling, backoff, request coalescing
Silent config error (answear_gls vs answear_acs, missing key) Service appears configured but fails at runtime Startup config validation, health check, integration smoke test
Composer dependency conflict Build/deploy failure Lockfile discipline, isolated adapter package, CI matrix
Upstream abandonment No fixes for ACS changes Internal fork readiness, small surface, assigned owner
Geo/kind coverage gap Wrong or missing shops for a market Validate GR/CY and each kind; product acceptance tests

Ramp-up

  • Engineering: 2–4 hours to understand the package; 1–2 weeks for a production-grade Laravel adapter including tests, caching, and observability.
  • Product/operations: Half a day to align on fallback behavior, supported countries, shop-kind taxonomy, and customer messaging. This is the higher-leverage ramp-up because it determines whether an ACS outage is a checkout blocker or a graceful degradation.
  • TPM recommendation: Approve a time-boxed spike to validate credentials, Composer fit, and response schema. If the spike passes, fund a thin Laravel adapter behind a feature flag. If ACS access or discovery-only scope is insufficient, stop and revisit carrier strategy rather than forcing the bundle into the stack.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin