Un proveedor de la company: repartidor (rider), shopper o prestador de servicios. Sus
credenciales viven en Account (account_id); este modelo guarda el perfil operativo,
ubicación, rating, disponibilidad y accesos.
status)status es un bitmask; los flags booleanos derivados se definen en onInitializeBitMaskBags().
Un proveedor puede tener varios roles a la vez:
is_deliverer — reparte productos y comida.is_shopper — hace la compra en el supermercado y se la entrega al repartidor. shopping_count
es la cantidad de órdenes de compra activas que tiene.is_service_provider — presta servicios (jardinería, limpieza, etc.); ver skills / serviceProfiles.is_shipping_provider — encomiendas / envíos punto A → B.is_trip_provider — traslado de personas (viajes / taxi).Disponibilidad:
is_status_online / is_online — el proveedor está conectado. Se marca con set-online y
expira a los 15 minutos (ONLINE_EXPIRATION_IN_MINUTES) salvo settings.is_active_forever.is_status_free / is_busy — si tiene o no órdenes activas asignadas.score, setting_score_for_delivery y setting_score_for_shopping son el puntaje del
proveedor, usado para priorizar la asignación automática de órdenes:
| Campo | Tipo | Descripción |
|---|---|---|
score |
float|null | Puntaje actual |
count |
int | Órdenes consideradas para el cálculo |
badge_idx |
int|null | Índice de la insignia obtenida |
rank |
int|null | Posición en el ranking |
days |
int | Ventana de días del cálculo |
is_ranked |
bool | Si el proveedor entró en el ranking |
setting_financial_plan es el plan de financiamiento/comisiones del proveedor (p. ej. la compra
de un vehículo a cuotas descontadas de sus pagos):
| Campo | Tipo | Descripción |
|---|---|---|
name |
string | Nombre del plan |
total_amount_e2 |
int | Monto total a pagar (× 100) |
grace_period_in_days |
int | Días de gracia antes de la primera cuota |
pay_frequency_in_days |
int | Cada cuántos días se cobra una cuota |
initial_payment_prc |
float | Porcentaje del pago inicial (fracción 0–1) |
initial_payment_amount_e2 |
int | Monto del pago inicial (× 100) |
installments_count |
int | Cantidad de cuotas |
installments_amount_e2 |
int | Monto de cada cuota (× 100) |
installments |
array | Detalle de cada cuota |
is_enabled |
bool | El plan está activo |
is_started |
bool | El plan ya comenzó a cobrarse |
accesses (ProviderAccess) define a qué Branch o Company puede atender
el proveedor. Se gestiona con grant-access / revoke-access.
settings)settings es un objeto con la configuración del proveedor. editable_settings devuelve solo
las claves modificables; allowed_settings (solo super-admin) devuelve las filas
ProviderSetting en crudo. Los setting_* del modelo son el acceso tipado.
Claves editables:
| Clave | Tipo | Descripción |
|---|---|---|
profile_extract |
object | Extracto del perfil (extract, languages) |
payout_accounts |
array | Cuentas para recibir pagos |
is_active_forever |
bool | El proveedor no expira su estado online a los 15 min |
pos_serial |
string | Serial del POS asignado al proveedor |
rif |
string | Identificador fiscal |
invoice_address |
string | Dirección para facturación |
financial_plan |
object | Plan de financiamiento (ver arriba; solo admins) |
Claves visibles (solo lectura): profile_extract, rif, score_for_delivery,
score_for_shopping.
| Atributo | Tipo | Descripción |
|---|---|---|
id |
int |
|
name |
string |
Nombre del proveedor |
display_name |
string |
Nombre de usuario |
email |
string |
|
phone |
string |
Teléfono con prefijo internacional |
avatar_url |
string\|null |
URL del avatar |
status |
int |
Bitmask de roles y disponibilidad (ver "Roles") |
rating_e2 |
int |
Rating del proveedor (× 100) |
rating_sum |
int |
Suma de calificaciones recibidas |
rating_count |
int |
Cantidad de calificaciones recibidas |
latitude_e6 |
int |
Última latitud conocida del proveedor (× 1e6) |
longitude_e6 |
int |
Última longitud conocida del proveedor (× 1e6) |
online_at |
datetime\|null |
Última vez que el proveedor se marcó online |
created_at |
datetime\|null |
|
updated_at |
datetime\|null |
|
deleted_at |
datetime\|null |
|
account_id |
int |
{@link Account} con las credenciales del proveedor |
company_id |
int |
Company a la que pertenece el proveedor (oculto) |
is_status_free |
bool |
BitMask (({@link self::status} & 0x1) !== 0) |
is_status_online |
bool |
BitMask (({@link self::status} & 0x10) !== 0) |
is_service_provider |
bool |
BitMask (({@link self::status} & 0x100) !== 0) |
is_deliverer |
bool |
BitMask (({@link self::status} & 0x200) !== 0) |
is_shopper |
bool |
BitMask (({@link self::status} & 0x400) !== 0) |
shopping_count |
int |
BitMask (({@link self::status} & 0xf000) >> 12) |
is_shipping_provider |
bool |
BitMask (({@link self::status} & 0x10000) !== 0) |
is_trip_provider |
bool |
BitMask (({@link self::status} & 0x20000) !== 0) |
setting_profile_extract |
string\|null |
Extracto del perfil (clave editable profile_extract) |
setting_payout_accounts |
PayoutAccount[]\|null |
Cuentas de payout (clave editable payout_accounts) |
setting_is_active_forever |
bool\|null |
El estado online no expira a los 15 min (clave editable is_active_forever) |
setting_pos_serial |
string\|null |
Serial del POS asignado (clave editable pos_serial) |
setting_last_turned_online_at |
datetime\|null |
Última vez que el proveedor se conectó (interno) |
setting_rif |
string\|null |
Identificador fiscal (clave editable rif) |
setting_invoice_address |
string\|null |
Dirección de facturación (clave editable invoice_address) |
setting_score_for_delivery |
ProviderScoreData\|null |
Puntaje del proveedor para reparto |
setting_score_for_shopping |
ProviderScoreData\|null |
Puntaje del proveedor para compras |
setting_financial_plan |
FinancialPlan\|null |
Plan de financiamiento del proveedor (clave editable financial_plan) |
setting_financial_plan_id |
int\|null |
Id del plan de financiamiento |
accesses |
ProviderAccess> |
Sucursales / companies que el proveedor puede atender |
account |
Account |
|
activeAssignments |
OrderProvider> |
Asignaciones de órdenes activas |
activeShoppingOrders |
Order> |
Órdenes de compra activas (rol shopper) |
admin |
Admin |
|
admin_url |
string |
|
allLogs |
ApiLog> |
|
allSettings |
ProviderSetting> |
|
allowedServices |
GoodRequirement> |
Servicios que el proveedor está habilitado a atender |
allowed_settings |
array |
Todas las filas de configuración en crudo (solo super-admin) |
attendedClients |
Client> |
Clientes atendidos por el proveedor |
bids |
Bid> |
|
city_by_location |
City\|null |
Ciudad según su ubicación actual |
client |
Client |
|
company |
Company |
|
current_city |
City\|null |
Ciudad del proveedor (derivada de su actividad reciente) |
deliveryVehicles |
DeliveryVehicle> |
Vehículos del proveedor |
editable_settings |
array |
Configuración que el proveedor/admin puede modificar |
fleetMembers |
FleetMember> |
Membresías de flota del proveedor |
full_name |
string |
Nombre completo |
givenRatings |
ClientRating> |
Calificaciones que el proveedor dio a clientes |
google_maps_url |
string\|null |
|
is_busy |
bool |
El proveedor tiene órdenes activas asignadas |
is_email_valid |
bool |
|
is_online |
bool |
El proveedor está conectado (online_at dentro de los últimos 15 min) |
is_phone_user |
bool |
Cuenta creada solo con teléfono |
latestCompletedDelivery |
OrderProvider\|null |
Última entrega completada |
logs |
ApiLog> |
|
names |
array |
Partes del nombre |
notifications |
Notification> |
|
payments |
Payment> |
|
pendingFeeConciliations |
PendingFeeConciliation> |
|
profile_data |
array |
Datos del perfil del proveedor para mostrar |
profileRatings |
ProviderRating> |
Calificaciones recibidas por el proveedor |
provider |
Provider |
|
public_rating_e2 |
int |
Rating mostrado públicamente (suavizado; × 100) |
resources |
UploadedResource> |
|
score |
array |
Puntaje del proveedor (ver "Score y plan financiero") |
serviceProfiles |
Collection<int, ServiceProfile> |
Perfiles de servicio del proveedor |
settings |
array |
Configuración del proveedor (ver "Configuración del proveedor") |
skills |
ServiceSkill> |
Habilidades del proveedor para prestar servicios |
{
"id": 36,
"name": "José Daniel Gómez Ortíz",
"display_name": "provider_192",
"email": "joseg@manzanares.com.ve",
"phone": "+584147851509",
"avatar_url": "http://127.0.0.1:8000/storage/companies/69/avatar/avatar_192_1749150879.jpg",
"status": 67361,
"rating_e2": 430,
"rating_sum": 327,
"rating_count": 76,
"latitude_e6": 10468468,
"longitude_e6": -64167158,
"online_at": "2026-02-25 19:21:17",
"created_at": "2020-04-27 21:26:00",
"updated_at": "2026-02-25 19:21:17",
"deleted_at": null,
"account_id": 192,
"is_service_provider": true,
"is_deliverer": true,
"is_shopper": true,
"shopping_count": 0,
"is_shipping_provider": true,
"is_trip_provider": false,
"is_online": false,
"is_busy": false,
"profile_data": {
"profile_extract": null
},
"score": {
"delivery_score": {
"score": 999,
"count": 1,
"badge": null,
"badge_idx": null,
"rank": null,
"days": 30,
"is_ranked": false
},
"shopping_score": {
"score": 999,
"count": 1,
"badge": null,
"badge_idx": null,
"rank": null,
"days": 30,
"is_ranked": false
}
}
}
Crear proveedor
Da de alta un Provider en la company, creando su Account. Se indican los roles y el acceso (branch o company) que tendrá.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/providers |
Authorization |
{
"access_type": "required|string|in:company,branch",
"access_id": "required|integer",
"name": "required|max:64",
"email": "required|email:rfc,filter",
"phone": "required",
"status": "integer",
"profile_data": {
"extract": "string|max:255",
"languages": {
"string": true,
"max": "255",
"regex": "/^\w+(,\w+)*$/"
}
},
"is_service_provider": "nullable|boolean",
"is_deliverer": "nullable|boolean",
"is_shopper": "nullable|boolean",
"is_shipping_provider": "nullable|boolean",
"is_trip_provider": "nullable|boolean"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ED204 |
400 | El acceso indicado no pertenece a esta company. |
ER409 |
409 | Ya existe un proveedor con ese contacto. |
Da al Provider acceso a una Branch o a toda la Company, para que pueda tomar sus órdenes.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/providers/{providerId}/grant-access |
Authorization |
{
"access_type": "required|string|in:company,branch",
"access_id": "required|integer"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ED204 |
400 | El acceso indicado no pertenece a esta company. |
{info} Soporta: Paginación Filters Carga dinámica
Listar proveedores
Lista los Provider de la company. Filtrable por rol, estado online y ubicación.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/providers |
Authorization |
{
"access_type": "string|in:company,branch",
"access_id": "required_with:access_type"
}
{info} Soporta: Paginación Filters Carga dinámica
Devuelve los Provider cuya última ubicación cae dentro del recuadro geográfico
indicado (min_latitude_e6, max_latitude_e6, min_longitude_e6, max_longitude_e6).
Útil para mapas de operación.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/providers-in-bounding-box |
Authorization |
{
"llat": "required|numeric",
"rlat": "required|numeric",
"llon": "required|numeric",
"rlon": "required|numeric"
}
{info} Soporta: Paginación Filters Carga dinámica
Devuelve los ProviderAccess del proveedor: a qué Branch o Company puede atender.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/providers/{providerId}/accesses |
Authorization |
Listar proveedores de una orden
Devuelve los Provider asignados a la orden (shopper y/o repartidor).
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/orders/{orderId}/providers |
Authorization |
{info} Soporta: Carga dinámica
Mostrar proveedor
Devuelve el Provider con su perfil, roles, estado online y score.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/providers/{providerId} |
Authorization |
Devuelve métricas de desempeño del Provider: entregas, tiempos, calificaciones y ganancias en el período consultado.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/providers/{providerId}/statistics |
Authorization |
Actualizar proveedor
Actualiza datos del Provider: nombre, teléfono, roles (status), ubicación.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{companyId}/providers/{providerId} |
Authorization |
{
"name": "max:64|person_name",
"email": "email:rfc,filter",
"phone": "",
"latitude_e6": "integer|between:-90000000,90000000",
"longitude_e6": "integer|between:-180000000,180000000",
"status": "integer",
"profile_data": {
"extract": "string|max:255",
"languages": {
"string": true,
"max": "255",
"regex": "/^\w+(,\w+)*$/"
}
},
"reported_at": "date",
"is_service_provider": "nullable|boolean",
"is_deliverer": "nullable|boolean",
"is_shopper": "nullable|boolean",
"is_shipping_provider": "nullable|boolean",
"is_trip_provider": "nullable|boolean",
"settings": {
"profile_extract": {
"extract": "string|max:255",
"languages": {
"string": true,
"max": "255",
"regex": "/^\w+(,\w+)*$/"
}
},
"payout_accounts": [
{
"type": "required_with:payout_accounts.*|string|in:national_bank_account,mobile_payment",
"document": "required_if:type,national_bank_account|required_if:type,mobile_payment|string|regex:/^[VEJGP].{7,15}$/",
"name": "required_if:type,national_bank_account|string",
"account": "required_if:type,national_bank_account|string|min:20",
"bank_name": "required_if:type,national_bank_account|string|min:3|max:64",
"bank_code": "required_if:type,mobile_payment|string|size:4",
"phone": "required_if:type,mobile_payment|string|max:32",
"email": "nullable|email:rfc,filter",
"alias": "nullable|string|max:40"
}
],
"is_active_forever": "nullable|boolean",
"pos_serial": {
"nullable": true,
"string": true,
"regex": "/^LP20[2-9]\d(0[1-9]|1[0-2])\d{7}$/"
},
"rif": "nullable|string|regex:/^([VEJGP])-?(\d{7,15}(?:-\d)?)$/",
"invoice_address": "nullable|string|max:255",
"financial_plan": {
"name": "required_with:financial_plan|string|max:80",
"total_amount_e2": "required_with:financial_plan|integer|min:1",
"grace_period_in_days": "nullable|integer|min:1",
"pay_frequency_in_days": "nullable|integer|min:1",
"initial_payment_prc": "nullable|numeric|min:0.0|max:1.0",
"installments_count": "nullable|integer|min:1",
"started_at": "nullable|date",
"is_enabled": "nullable|boolean"
}
}
}
Quita al Provider el acceso a la Branch o Company indicada.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/providers/{providerId}/revoke-access |
Authorization |
{
"access_type": "required|string|in:company,branch",
"access_id": "required|integer"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ED204 |
400 | El acceso indicado no pertenece a esta company. |
Reemplaza avatar_url del Provider con la imagen subida (campo avatar).
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/providers/{providerId}/upload-avatar |
Authorization |
{
"avatar": "required|image|mimes:jpeg,png,bmp|max:2048|dimensions:ratio=1/1"
}
Marca el Provider como online (online_at = ahora). El estado expira a los 15
minutos salvo settings.is_active_forever. Idempotente.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/providers/{providerId}/set-online |
Authorization |
Marca el Provider como offline. Idempotente.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/providers/{providerId}/set-offline |
Authorization |
accesses HasMany ProviderAccessaccount BelongsTo AccountactiveAssignments HasMany OrderProvideractiveShoppingOrders HasMany Orderadmin BelongsTo AdminallLogs HasMany ApiLogallowedServices HasMany GoodRequirementattendedClients HasMany Clientbids HasMany Bidclient BelongsTo Clientcompany BelongsTo CompanydeliveryVehicles HasMany DeliveryVehiclefleetMembers HasMany FleetMembergivenRatings HasMany ClientRatinglatestCompletedDelivery HasOne OrderProviderlogs HasMany ApiLogpayments HasMany PaymentpendingFeeConciliations HasMany PendingFeeConciliationprofileRatings HasMany ProviderRatingprovider BelongsTo ProviderserviceProfiles HasMany ServiceProfileskills HasMany ServiceSkill