PHPackages                             puyu-pe/sipro-internal-api-core - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. puyu-pe/sipro-internal-api-core

ActiveLibrary[API Development](/categories/api)

puyu-pe/sipro-internal-api-core
===============================

Framework-agnostic core contracts, HMAC security utilities, and API response/error standards for SIPRO internal API.

1.4.0(2mo ago)0893MITPHPPHP &gt;=8.1

Since Feb 11Pushed 2mo agoCompare

[ Source](https://github.com/puyu-pe/sipro-internal-api-core)[ Packagist](https://packagist.org/packages/puyu-pe/sipro-internal-api-core)[ RSS](/packages/puyu-pe-sipro-internal-api-core/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (3)Versions (10)Used By (3)

puyupe/sipro-internal-api-core
==============================

[](#puyupesipro-internal-api-core)

Paquete Composer framework-agnostic para integraciones entre **SIPRO Control Plane** y los **SaaS** en `/internal/v1`.

¿Qué resuelve este paquete?
---------------------------

[](#qué-resuelve-este-paquete)

1. **Contracts (DTOs)** para provisioning, ciclo de vida y clonado de tenants.
2. **HMAC** para firmado y verificación de requests entre servicios.
3. **Errores estándar** para respuestas JSON consistentes (`ErrorResponse`).

> Objetivo: reducir código repetido y evitar diferencias de implementación entre servicios.

Payload de ejemplo: ProvisionPayloadDTO (createTenant)
------------------------------------------------------

[](#payload-de-ejemplo-provisionpayloaddto-createtenant)

```
{
  "project": {
    "name": "Acme Suite",
    "code": "ACME",
    "description": "Suite principal",
    "billingCycle": "monthly",
    "priceAgreed": 199.9,
    "startDate": "2026-03-25",
    "renewalDate": "2027-03-25",
    "execStatus": "active",
    "isActive": true,
    "accessUrlCustom": "https://acme.sipro.app",
    "accessUrls": {
      "app": "https://acme.sipro.app",
      "api": "https://api.acme.sipro.app"
    },
    "appKey": "acme-app-001",
    "logo": null,
    "address": "Av. Demo 123",
    "phone": "+51 1 5555555",
    "email": "admin@acme.pe",
    "ubigeo": "150101",
    "latitud": -12.0464,
    "longitud": -77.0428,
    "color": "#004c97",
    "notes": "Cliente migrado desde legacy"
  },
  "client": {
    "ruc": "20123456789",
    "businessName": "Acme SAC",
    "tradeName": "Acme"
  },
  "services": [
    {
      "key": "billing",
      "externalId": "srv-01",
      "code": "BILL",
      "name": "Facturacion",
      "description": "Modulo de facturacion",
      "priceList": 99.0,
      "defaultBillingCycle": "monthly",
      "type": "core",
      "accessUrl": "https://acme.sipro.app/billing",
      "logo": null,
      "credentials": [
        {
          "name": "Admin Acme",
          "username": "admin",
          "email": "admin@acme.pe",
          "role": "owner",
          "initialPassword": "Temporal123!",
          "mustChangePassword": true
        }
      ],
      "modules": [
        {
          "id": 10,
          "externalId": "mod-01",
          "name": "Ventas",
          "description": "Ventas y cotizaciones",
          "price": 20.0,
          "isUnlimited": false,
          "customPrice": null,
          "quantity": 5
        }
      ]
    }
  ],
  "metadata": {
    "source": "control-plane",
    "priority": "high"
  }
}
```

Ciclo de vida del tenant (warn / suspend / activate / close / reopen)
---------------------------------------------------------------------

[](#ciclo-de-vida-del-tenant-warn--suspend--activate--close--reopen)

`TenantLifecycleRequestDTO` (payload estándar para todas las acciones de ciclo de vida):

CampoTipoDescripción`appKey``string`Identificador del tenant`projectCode``string`Código del proyecto`reason``?string`Motivo de la acción (opcional)`requestedAt``?string`ISO 8601 — cuándo se solicitó (opcional)`requestedBy``?string`Identificador del operador que solicita la acción (opcional)```
{
  "appKey": "acme-app-001",
  "projectCode": "ACME",
  "reason": "PAYMENT_OVERDUE",
  "requestedAt": "2026-03-25T10:00:00Z",
  "requestedBy": "user-42"
}
```

`TenantLifecycleResponseDTO`:

```
{
  "appKey": "acme-app-001",
  "projectCode": "ACME",
  "status": "ok",
  "systemStatus": "suspended"
}
```

Clonado de tenant (export / import)
-----------------------------------

[](#clonado-de-tenant-export--import)

`TenantExportRequestDTO`:

```
{
  "appKey": "acme-app-001",
  "projectCode": "ACME",
  "reason": "MIGRATION"
}
```

`TenantExportResponseDTO`:

```
{
  "appKey": "acme-app-001",
  "projectCode": "ACME",
  "dumpPath": "/mnt/backups/acme-20260325.sql.gz",
  "checksum": "sha256:3f4b8c...",
  "createdAt": "2026-03-25T10:35:00Z"
}
```

`TenantImportRequestDTO`:

```
{
  "appKey": "acme-app-001",
  "projectCode": "ACME",
  "dumpPath": "/mnt/backups/acme-20260325.sql.gz",
  "checksum": "sha256:3f4b8c..."
}
```

`TenantImportResponseDTO`:

```
{
  "appKey": "acme-app-001",
  "projectCode": "ACME",
  "database": "acme_20260325",
  "restored": true
}
```

Interfaces de adapters
----------------------

[](#interfaces-de-adapters)

Provisioning:

- `TenantProvisioningAdapterInterface::createTenant(ProvisionPayloadDTO $dto): ProvisionResponseDTO`

Ciclo de vida:

- `TenantLifecycleAdapterInterface::warnTenant(string $appKey, TenantLifecycleRequestDTO $dto): TenantLifecycleResponseDTO`
- `TenantLifecycleAdapterInterface::suspendTenant(string $appKey, TenantLifecycleRequestDTO $dto): TenantLifecycleResponseDTO`
- `TenantLifecycleAdapterInterface::activateTenant(string $appKey, TenantLifecycleRequestDTO $dto): TenantLifecycleResponseDTO`
- `TenantLifecycleAdapterInterface::closeTenant(string $appKey, TenantLifecycleRequestDTO $dto): TenantLifecycleResponseDTO`
- `TenantLifecycleAdapterInterface::reopenTenant(string $appKey, TenantLifecycleRequestDTO $dto): TenantLifecycleResponseDTO`

Clonado:

- `TenantCloneAdapterInterface::exportTenant(string $appKey, TenantExportRequestDTO $dto): TenantExportResponseDTO`
- `TenantCloneAdapterInterface::importTenant(string $appKey, TenantImportRequestDTO $dto): TenantImportResponseDTO`

Nota: `TenantAdapterInterface` agrupa provisioning + ciclo de vida. El clonado se mantiene separado en `TenantCloneAdapterInterface`.

Firma HMAC (Control Plane) — pasos
----------------------------------

[](#firma-hmac-control-plane--pasos)

Headers requeridos:

- `X-Internal-KeyId`
- `X-Internal-Timestamp`
- `X-Internal-Nonce`
- `X-Internal-Signature`

Canonical string **v1 exacto**:

```
{METHOD}\n{PATH}\n{TIMESTAMP}\n{NONCE}\n{BODY_SHA256_HEX}

```

```
