Formularios personalizables. Registra tanto los formularios de pago como los formularios de pruebas de entrega.
El atributo name contiene el nombre del método de pago a mostrar en la lista.
Si el formulario está desactivado, tendrá disabled = true.
El atributo icon es un campo numérico que indica el icono a mostrar. La lista de iconos es fija y está previamente
configurada.
currency contiene la información de la moneda a usar para el pago. Este objeto contiene dos atributos adicionales,
tax_flat_e2 y tax_percent, que contienen información de las tarifas adicionales a cobrar por usar el método de
pago. Si cualquiera de esos valores es mayor a cero, se debe mostrar una advertencia indicando que se cobrará una
tarifa adicional. Por ejemplo: Si tax_flat_e2 = 50 se mostrara algo como: "Al seleccionar Pago Móvil, se cobrará
un impuesto adicional de $0.50" (texto de ejemplo). Si tax_percent = 0.05 se mostrará "impuesto de 5%" o si ambos
campos tienen valor, por ejemplo, tax_flat_e2 = 30; tax_percent = 0.03 se cobrará "3% + $0.30"
Por otra parte, el campo label_url muestra una imagen grande en el formulario. Útil para mostrar QR.
Podría ser null.
El atributo data contiene los parámetros a mostrar del formulario. Se trata de un array de objetos que contienen
un único atributo. Según el nombre de ese atributo, se debe mostrar un componente diferente en el formulario:
text: Se trata de un texto a mostrar. No se requiere respuesta del usuario. Útil para mostrar información como
el número de pago móvil o cuenta bancaria para el depósito.
question: Título a mostrar.content: Texto descriptivo.input: Se trata de un campo de entrada de texto convencional.
question: Título de la pregunta.required: Indica si es obligatorio para el servidor. Se debe mostrar un asterisco rojo y validar que no esté
vacío al momento de enviar.hint: El texto de ayuda a mostrar en el campo (placeholder).regex: Regla para validar el campo. Se debe ignorar el primer y último caracter del regex para usar en JS.type: El tipo de entrada. Podría ser: text (normal), text_area (multilinea), date (calendario),
numeric (sólo números), bank (mostrar icono de banco).key: Booleano que indica que el campo contiene el campo clave de identificador del pago. Se utiliza para la
validación de pagos automatizada.boolean: Se trata de un check. Útil para aceptar términos.
question: Título a mostrar.required: Indica si es obligatorio estar checked == true para enviar el formulario.option: Campo de selección de opciones. Se trata de un Select de elección simple. Útil para elegir el banco o
el tipo de DNI (V, E, J, etc).
question: Título de la pregunta.required: Indica si es obligatorio para el servidor. En cualquier caso se debe inicializar con un campo en
blanco al estilo "Seleccione una opción: " y NO tener la primera opción por defecto. En caso de required == true se
debe obligar a elegir una opción para enviar el formulario.choices: un array de string con las distintas opciones a elegir,type: puede ser text y banktext_button: Botón de texto informativo, no hay que responder en el formulario (es informativo). Se muestra un
título igualmente, una descripción y un botón debajo. Útil para mostrar información muy extensa.
question: Título a mostrar.content: Texto descriptivo.button_text: Texto a mostrar en el botón. Por ejemplo: "Ver cuentas bancarias".button_content: Contenido a mostrar (en un diálogo) cuando presionas el botón. Como título del diálogo se puede
usar el button_text y el contenido es button_content.file: Campo para subir un archivo.
question: Título a mostrar.required: Indica si es obligatorio para el servidor.allowed_types: Array de tipos de archivos admitidos.type: Indica si es un archivo cualquiera file o imagen image.| Atributo | Tipo | Descripción |
|---|---|---|
id |
int |
|
type |
int |
Tipo/slot del formulario: 1 = prueba de entrega; 2-20 = métodos de pago manual. En las rutas se usa como {form_type}. |
data |
array |
Definición de los campos del formulario (array de componentes); ver el detalle de cada tipo de componente arriba. |
name |
string\|null |
Nombre del método de pago a mostrar en la lista; null si no aplica. |
disabled |
bool |
true si el formulario está desactivado y no debe ofrecerse. |
created_at |
datetime\|null |
Fecha de creación. |
updated_at |
datetime\|null |
Fecha de última modificación. |
company_id |
int |
Compañía dueña del formulario. |
icon |
int |
Índice del icono a mostrar (lista fija predefinida). |
currency |
array |
Moneda y tarifas del método de pago: iso, tax_flat_e2 (recargo fijo, céntimos) y tax_percent (recargo porcentual, fracción). |
branch_id |
int\|null |
Comercio dueño del formulario; null si pertenece a la compañía (caso marketplace). |
label_url |
string\|null |
URL de una imagen grande a mostrar en el formulario (por ejemplo un QR); puede ser null. |
internal_name |
string\|null |
Nombre interno para identificar el formulario en el panel; no visible para el cliente. |
allLogs |
ApiLog> |
|
company |
Company |
|
logs |
ApiLog> |
|
resources |
UploadedResource> |
{
"id": 185,
"type": 4,
"data": [
{
"text": {
"question": "Usuario del comercio",
"content": ".Zen DEV"
}
},
{
"input": {
"question": "¿Quién envia el pago?",
"required": false,
"hint": "Coloca tu usuario de Reserve",
"regex": "^[a-zA-Z0-9_]*^",
"type": "text"
}
}
],
"name": "Reserve",
"disabled": true,
"created_at": "2021-05-19 16:59:16",
"updated_at": "2023-07-07 12:58:57",
"company_id": 116,
"icon": 7,
"currency": {
"iso": "USD",
"tax_flat_e2": 0,
"tax_percent": 0,
"id": 475,
"enabled": true,
"symbol": "$",
"conversion_factor": 1,
"related_iso": "USD",
"decimals_count": 2,
"format": "0.00$",
"decimal_point": ".",
"use_thousands_separator": true,
"thousands_separator": ",",
"is_local": true,
"is_international": true,
"created_at": "2021-07-15 19:16:41",
"updated_at": "2024-02-22 13:34:01",
"company_id": 116,
"is_custom": true,
"branch_id": 37,
"auto_sync": false,
"auto_sync_provider": "legacy",
"use_conversion": false,
"available": true,
"related_iso_expected": "USD",
"related_iso_error": false
},
"branch_id": 37,
"label_url": "http://127.0.0.1:8000/storage/companies/69/form/form_label_185_1621458192.jpg",
"internal_name": null
}
Crear o actualizar un formulario
Crea el Form del {form_type} indicado (o lo actualiza si ya existe) para la compañía
o el comercio. El cuerpo form es la lista de componentes; sólo se conservan las claves
admitidas por cada tipo (text, input, boolean, option, text_button, file). Si no
se envía currency se usa la moneda local de la compañía sin recargos.
{warning} Responde
400 invalid_typesi{form_type}no está entre 1 y 20.
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{company}/branches/{branchId}/forms/{form_type} |
Authorization |
{
"name": "string|max:32",
"internal_name": "nullable|string|in:bancamiga_pm,bancamiga_ci,humaniz",
"icon": "integer",
"currency": {
"iso": "required_with:currency|min:3|max:8|string",
"tax_percent": "required_with:currency|numeric|between:0.0000,1.0000",
"tax_flat_e2": "required_with:currency|integer|min:0"
},
"branch_id": "integer|min:1",
"form": [
{
"boolean": {
"question": "required_with:form.*.boolean|max:64|string",
"required": "required_with:form.*.boolean|boolean"
},
"option": {
"question": "required_with:form.*.option|max:64|string",
"required": "required_with:form.*.option|boolean",
"choices": [
"required_with:form.*.option.choices|max:48|string"
],
"type": "string|in:text,date,bank"
},
"input": {
"question": "required_with:form.*.input|max:64|string",
"hint": "max:32|string",
"required": "required_with:form.*.input|boolean",
"regex": "max:255|pattern",
"type": "string|in:text,text_area,date,numeric,bank",
"key": "boolean"
},
"text": {
"question": "required_with:form.*.text|max:64|string",
"content": "required_with:form.*.text|max:512|string"
},
"text_button": {
"question": "required_with:form.*.text_button|max:64|string",
"content": "required_with:form.*.text_button|max:255|string",
"button_text": "required_with:form.*.text_button|max:48|string",
"button_content": "required_with:form.*.text_button|max:1024|string"
},
"file": {
"question": "required_with:form.*.file|string",
"required": "required_with:form.*.file|boolean",
"allowed_types": [
"required_with:form.*.file.allowed_types|max:128|string"
],
"type": "string|in:file,image"
}
}
]
}
Crear o actualizar un formulario
Crea el Form del {form_type} indicado (o lo actualiza si ya existe) para la compañía
o el comercio. El cuerpo form es la lista de componentes; sólo se conservan las claves
admitidas por cada tipo (text, input, boolean, option, text_button, file). Si no
se envía currency se usa la moneda local de la compañía sin recargos.
{warning} Responde
400 invalid_typesi{form_type}no está entre 1 y 20.
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{company}/branches/{branchId}/forms/{form_type} |
Authorization |
{
"name": "string|max:32",
"internal_name": "nullable|string|in:bancamiga_pm,bancamiga_ci,humaniz",
"icon": "integer",
"currency": {
"iso": "required_with:currency|min:3|max:8|string",
"tax_percent": "required_with:currency|numeric|between:0.0000,1.0000",
"tax_flat_e2": "required_with:currency|integer|min:0"
},
"branch_id": "integer|min:1",
"form": [
{
"boolean": {
"question": "required_with:form.*.boolean|max:64|string",
"required": "required_with:form.*.boolean|boolean"
},
"option": {
"question": "required_with:form.*.option|max:64|string",
"required": "required_with:form.*.option|boolean",
"choices": [
"required_with:form.*.option.choices|max:48|string"
],
"type": "string|in:text,date,bank"
},
"input": {
"question": "required_with:form.*.input|max:64|string",
"hint": "max:32|string",
"required": "required_with:form.*.input|boolean",
"regex": "max:255|pattern",
"type": "string|in:text,text_area,date,numeric,bank",
"key": "boolean"
},
"text": {
"question": "required_with:form.*.text|max:64|string",
"content": "required_with:form.*.text|max:512|string"
},
"text_button": {
"question": "required_with:form.*.text_button|max:64|string",
"content": "required_with:form.*.text_button|max:255|string",
"button_text": "required_with:form.*.text_button|max:48|string",
"button_content": "required_with:form.*.text_button|max:1024|string"
},
"file": {
"question": "required_with:form.*.file|string",
"required": "required_with:form.*.file|boolean",
"allowed_types": [
"required_with:form.*.file.allowed_types|max:128|string"
],
"type": "string|in:file,image"
}
}
]
}
Listar formularios
Devuelve los Form de la compañía (o del comercio, con el prefijo branches/{branchId}),
paginados. En marketplaces, un usuario no administrador que consulta con branchId recibe
tanto los formularios propios del comercio como los de la compañía (branch_id = null).
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{company}/branches/{branchId}/forms |
Authorization |
Listar formularios
Devuelve los Form de la compañía (o del comercio, con el prefijo branches/{branchId}),
paginados. En marketplaces, un usuario no administrador que consulta con branchId recibe
tanto los formularios propios del comercio como los de la compañía (branch_id = null).
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{company}/branches/{branchId}/forms |
Authorization |
Ver un formulario
Devuelve el Form de la compañía o comercio identificado por {form_type} (su type).
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{company}/branches/{branchId}/forms/{form_type} |
Authorization |
Ver un formulario
Devuelve el Form de la compañía o comercio identificado por {form_type} (su type).
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{company}/branches/{branchId}/forms/{form_type} |
Authorization |
Eliminar un formulario
Borra el Form de la compañía o comercio identificado por {form_type}.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{company}/branches/{branchId}/forms/{form_type} |
Authorization |
Eliminar un formulario
Borra el Form de la compañía o comercio identificado por {form_type}.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{company}/branches/{branchId}/forms/{form_type} |
Authorization |
Devuelve el desglose del pago para el {form_type} dado aplicando su moneda y recargos
(tax_flat_e2, tax_percent) sobre order_e2 y tip_e2, opcionalmente convertido a
currency_to_use.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{company}/branches/{branchId}/forms/{form_type}/get-tax |
Authorization |
{
"order_e2": "required|integer|min:0",
"tip_e2": "required|integer|min:0",
"currency_to_use": "string|min:3|max:8",
"branch_id": "nullable|integer"
}
Busca el primer type disponible en el rango de pagos manuales (2–20) y crea allí el
Form con el contenido recibido.
{warning} Responde
400 no_slots_availablesi los 19 slots de pago manual ya están ocupados.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{company}/branches/{branchId}/forms/payment |
Authorization |
{
"name": "string|max:32",
"internal_name": "nullable|string|in:bancamiga_pm,bancamiga_ci,humaniz",
"icon": "integer",
"currency": {
"iso": "required_with:currency|min:3|max:8|string",
"tax_percent": "required_with:currency|numeric|between:0.0000,1.0000",
"tax_flat_e2": "required_with:currency|integer|min:0"
},
"branch_id": "integer|min:1",
"form": [
{
"boolean": {
"question": "required_with:form.*.boolean|max:64|string",
"required": "required_with:form.*.boolean|boolean"
},
"option": {
"question": "required_with:form.*.option|max:64|string",
"required": "required_with:form.*.option|boolean",
"choices": [
"required_with:form.*.option.choices|max:48|string"
],
"type": "string|in:text,date,bank"
},
"input": {
"question": "required_with:form.*.input|max:64|string",
"hint": "max:32|string",
"required": "required_with:form.*.input|boolean",
"regex": "max:255|pattern",
"type": "string|in:text,text_area,date,numeric,bank",
"key": "boolean"
},
"text": {
"question": "required_with:form.*.text|max:64|string",
"content": "required_with:form.*.text|max:512|string"
},
"text_button": {
"question": "required_with:form.*.text_button|max:64|string",
"content": "required_with:form.*.text_button|max:255|string",
"button_text": "required_with:form.*.text_button|max:48|string",
"button_content": "required_with:form.*.text_button|max:1024|string"
},
"file": {
"question": "required_with:form.*.file|string",
"required": "required_with:form.*.file|boolean",
"allowed_types": [
"required_with:form.*.file.allowed_types|max:128|string"
],
"type": "string|in:file,image"
}
}
]
}
Pone disabled = false en el Form indicado por {form_type}.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{company}/branches/{branchId}/forms/{form_type}/enable |
Authorization |
Pone disabled = true en el Form indicado por {form_type}; deja de ofrecerse sin
borrar su configuración.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{company}/branches/{branchId}/forms/{form_type}/disable |
Authorization |
Devuelve el desglose del pago para el {form_type} dado aplicando su moneda y recargos
(tax_flat_e2, tax_percent) sobre order_e2 y tip_e2, opcionalmente convertido a
currency_to_use.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{company}/branches/{branchId}/forms/{form_type}/get-tax |
Authorization |
{
"order_e2": "required|integer|min:0",
"tip_e2": "required|integer|min:0",
"currency_to_use": "string|min:3|max:8",
"branch_id": "nullable|integer"
}
Busca el primer type disponible en el rango de pagos manuales (2–20) y crea allí el
Form con el contenido recibido.
{warning} Responde
400 no_slots_availablesi los 19 slots de pago manual ya están ocupados.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{company}/branches/{branchId}/forms/payment |
Authorization |
{
"name": "string|max:32",
"internal_name": "nullable|string|in:bancamiga_pm,bancamiga_ci,humaniz",
"icon": "integer",
"currency": {
"iso": "required_with:currency|min:3|max:8|string",
"tax_percent": "required_with:currency|numeric|between:0.0000,1.0000",
"tax_flat_e2": "required_with:currency|integer|min:0"
},
"branch_id": "integer|min:1",
"form": [
{
"boolean": {
"question": "required_with:form.*.boolean|max:64|string",
"required": "required_with:form.*.boolean|boolean"
},
"option": {
"question": "required_with:form.*.option|max:64|string",
"required": "required_with:form.*.option|boolean",
"choices": [
"required_with:form.*.option.choices|max:48|string"
],
"type": "string|in:text,date,bank"
},
"input": {
"question": "required_with:form.*.input|max:64|string",
"hint": "max:32|string",
"required": "required_with:form.*.input|boolean",
"regex": "max:255|pattern",
"type": "string|in:text,text_area,date,numeric,bank",
"key": "boolean"
},
"text": {
"question": "required_with:form.*.text|max:64|string",
"content": "required_with:form.*.text|max:512|string"
},
"text_button": {
"question": "required_with:form.*.text_button|max:64|string",
"content": "required_with:form.*.text_button|max:255|string",
"button_text": "required_with:form.*.text_button|max:48|string",
"button_content": "required_with:form.*.text_button|max:1024|string"
},
"file": {
"question": "required_with:form.*.file|string",
"required": "required_with:form.*.file|boolean",
"allowed_types": [
"required_with:form.*.file.allowed_types|max:128|string"
],
"type": "string|in:file,image"
}
}
]
}
Pone disabled = false en el Form indicado por {form_type}.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{company}/branches/{branchId}/forms/{form_type}/enable |
Authorization |
Pone disabled = true en el Form indicado por {form_type}; deja de ofrecerse sin
borrar su configuración.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{company}/branches/{branchId}/forms/{form_type}/disable |
Authorization |
Guarda el archivo image como label_url del Form (imagen grande del formulario,
por ejemplo un QR de pago). Enviar la petición sin image deja label_url en null.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{company}/forms/{formId}/upload-label |
Authorization |
{
"image": "nullable|image|mimes:jpeg,png|max:2048"
}