Inicio › Documentación › App de LB Phone · origen_billing
origen_billingapp es la aplicación complementaria de LB Phone para origen_billing. Ofrece una experiencia de facturación completa directamente en el teléfono, sin necesidad de comandos.
| Recurso | Notas |
|---|---|
lb-phone |
Obligatorio. La app se registra mediante exports['lb-phone']:AddCustomApp |
origen_billing |
Obligatorio. Toda la lógica de negocio se delega en sus exports de teléfono |
ox_lib |
Obligatorio. Utilidades de idioma |
Añade origen_billingapp después de origen_billing y lb-phone:
ensure lb-phone
ensure origen_billing
ensure origen_billingappAbre config.lua y define el idioma. Debe coincidir con un fichero de locales/:
Config.Language = 'en' -- 'en' | 'es'No hace falta SQL. origen_billingapp no crea ninguna tabla: todos los datos los almacena y gestiona origen_billing.
La app se registra en LB Phone al arrancar el recurso y se vuelve a registrar automáticamente si lb-phone se reinicia. La interfaz se comunica exclusivamente mediante callbacks NUI → eventos del servidor → exports de teléfono de origen_billing → evento del cliente que devuelve la respuesta a la interfaz del teléfono.
UI (NUI)
└─▶ NUI Callback (client.lua)
└─▶ Server Event (origen_billingapp:server:*)
└─▶ origen_billing Phone Export
└─▶ TriggerClientEvent → origen_billingapp:client:response
└─▶ exports['lb-phone']:SendCustomAppMessageEn origen_billingapp no hay lógica de negocio. Es un puente puro.
La app usa los siguientes exports registrados en origen_billing. También se pueden llamar desde otros recursos.
GetPhoneAppBootstrap(source) → tableCarga en una sola llamada todos los datos necesarios para abrir la app. Devuelve permisos, facturas pendientes, productos del catálogo y, para los jefes, facturas de la empresa, estadísticas y productos.
local data = exports['origen_billing']:GetPhoneAppBootstrap(source)
-- {
-- success = true,
-- permissions = { canInvoice, isBoss, jobName, jobLabel },
-- myInvoices = { ... },
-- catalogProducts = { ... },
-- companyInvoices = { ... }, -- nil if not boss
-- companyMeta = { page, pageSize, total, totalPages },
-- companyStats = { ... },
-- companyProducts = { ... },
-- }GetPhonePermissions(source) → tableDevuelve los permisos actuales del jugador. Se llama cuando cambia el job del jugador.
local res = exports['origen_billing']:GetPhonePermissions(source)
-- { success = true, permissions = { canInvoice, isBoss, jobName, jobLabel } }GetPhoneMyInvoices(source) → tableDevuelve las facturas pendientes del jugador.
local res = exports['origen_billing']:GetPhoneMyInvoices(source)
-- { success = true, invoices = { ... } }PayPhoneInvoice(source, invoiceId, paymentMethod) → tablePaga una factura. paymentMethod es 'bank' o 'cash'.
local res = exports['origen_billing']:PayPhoneInvoice(source, 12, 'bank')
-- { success = true|false, reason = 'error_code' }GetPhoneProducts(source) → tableDevuelve el catálogo de productos activos del job del jugador.
local res = exports['origen_billing']:GetPhoneProducts(source)
-- { success = true, products = { { id, name, description, price }, ... } }SendPhoneInvoice(source, payload) → tableCrea una factura desde el teléfono. payload.items es opcional: si se omite, se crea una factura de una sola línea a partir de payload.amount y payload.description.
local res = exports['origen_billing']:SendPhoneInvoice(source, {
targetId = 'ABC12345',
amount = 500,
description = 'Service fee',
notes = '',
items = {
{ name = 'Oil change', price = 150, quantity = 1, product_id = 5 },
},
})
-- { success = true, invoiceId = 42 }GetPhoneCompanyInvoicesPage(source, filters) → tableDevuelve una lista paginada y filtrada de facturas de la empresa. Solo jefes.
local res = exports['origen_billing']:GetPhoneCompanyInvoicesPage(source, {
search = 'John',
status = 'pending', -- 'all' | 'pending' | 'paid' | 'cancelled'
minAmount = 100,
maxAmount = 1000,
dateFrom = '2025-01-01',
dateTo = '2025-12-31',
page = 1,
pageSize = 10,
})
-- { success, invoices, meta = { page, pageSize, total, totalPages }, stats = { ... } }GetPhoneCompanyStats(source) → tableDevuelve las estadísticas globales de la empresa del jugador. Solo jefes.
local res = exports['origen_billing']:GetPhoneCompanyStats(source)
-- { success, stats = { total, pending, paid, cancelled, totalSociety, totalCommissions, avgAmount } }GetPhoneCompanyDashboardLite(source, dateFrom, dateTo) → tableDevuelve KPI y una serie temporal diaria para un rango de fechas. Solo jefes.
local res = exports['origen_billing']:GetPhoneCompanyDashboardLite(source, '2025-01-01', '2025-01-31')
-- {
-- success = true,
-- kpis = { total, pending, paid, cancelled, totalRevenue, totalSociety, totalCommissions, avgAmount },
-- timeSeries = { { day, totalAmount, paidAmount }, ... },
-- }CancelPhoneCompanyInvoice(source, invoiceId) → tableCancela una factura de la empresa. Quien llama debe ser jefe del job que la emitió.
local res = exports['origen_billing']:CancelPhoneCompanyInvoice(source, 42)
-- { success = true|false, reason = 'error_code' }GetPhoneCompanyProducts(source) → tableDevuelve todos los productos de la empresa del jugador (incluidos los inactivos). Solo jefes.
local res = exports['origen_billing']:GetPhoneCompanyProducts(source)
-- { success, products = { { id, name, description, price, active, created_at }, ... } }CreatePhoneCompanyProduct(source, data) → tableCrea un producto nuevo para la empresa. Solo jefes.
local res = exports['origen_billing']:CreatePhoneCompanyProduct(source, {
name = 'Oil change',
description = 'Full synthetic',
price = 150,
})
-- { success = true, productId = 7 }UpdatePhoneCompanyProduct(source, data) → tableActualiza un producto existente. Solo jefes.
local res = exports['origen_billing']:UpdatePhoneCompanyProduct(source, {
id = 7,
name = 'Oil change (premium)',
description = 'Full synthetic + filter',
price = 200,
})
-- { success = true|false }TogglePhoneCompanyProduct(source, productId) → tableAlterna un producto entre activo e inactivo. Solo jefes.
local res = exports['origen_billing']:TogglePhoneCompanyProduct(source, 7)
-- { success = true, active = false }DeletePhoneCompanyProduct(source, productId) → tableElimina un producto de forma permanente. Solo jefes.
local res = exports['origen_billing']:DeletePhoneCompanyProduct(source, 7)
-- { success = true|false }