
Service class).Helper classes) meant there was no unified way to say "activate these 500 SIMs" without hand-rolling the logic per carrier every time. Getting this wrong is expensive in both directions: a botched bulk activation either burns non-refundable wholesale SIM cost or leaves a customer without service, and any new workflow had to keep the platform's multi-tenant wallet accounting (distributor funds a dealer, a dealer funds its own store) correct under concurrent, long-running jobs.Service class (NexusService, ISPWNService, RogueMobileService, NexioMobileService, and siblings for the platform's other integrations). NexusService handles bearer-token login/refresh plus bulk-activation submission and batch-status polling; ISPWNService switches between sandbox and production credential sets and exposes the full port/SIM/eSIM lifecycle as discrete methods (portsAdd, simsChangePlan, simsSuspend, simsGetEsim, etc.). Each service normalizes a differently-shaped upstream response into one internal activation result, so the rest of the application never has to know which carrier it's talking to.SwappadProduct, StoreSwappadProduct, SimBank, ISPActivationBatch/ISPActivation - were added on top of that existing schema rather than requiring a rewrite, so the new bulk-activation product line inherits the platform's existing reporting and billing views.ISPActivationBatch and handed to ProcessSwapPadBatchJob, a queued job (2-hour timeout, since some carrier sandboxes are slow) that activates each row against the right carrier, updates row-level status, and records the cost split for each tier.streamStatus) watches the batch record every two seconds and pushes completed / failed / total counters directly to the UI, closing automatically once the batch finishes, fails, or a 5-minute connection cap is hit.laravel-permission plus a custom Distributor/Dealer/Team role hierarchy scope what each tier can see and act on - a distributor can view every batch beneath it; a dealer sees only its own.performNexioPreflight) that validates provider-specific constraints and fails the entire batch before any wallet hold is placed - avoiding a charge/refund dance when a downstream API would have rejected the row anyway.calculateTotalStoreChargeForCsv / calculateTotalDistributorChargeForCsv) and reconciling actual per-row cost as the queue worker completes each activation, with a separate retryBatch path that only re-submits the rows that actually failed.Posted Oct 15, 2026
Developed a bulk SIM activation platform for CelleUp, enhancing carrier integration and workflow efficiency.