<style>
    img {
        max-width: 100%;
    }
    pre {
        background-color: #F5F5F5;
        padding: .5rem;
    }
</style>

# Implementación forma de pago

## Aplicación de cobro (VB6)
Secuencia recibida de cobro exitoso.

**Patrón Forma de pago** (F)|importe|divisa|pista!...

**Identificadores para cada forma de pago**
- ```E .-``` Efectivo. 
- ```C .-``` Cheques.
- ```D .-``` Depósito o transferencia.
- ```T .-``` Tarjeta de crédito o débito.
- ```W .-``` Cashback.
- ```X .-``` Cancelar transacción.
- ```Q .-``` Cupón.
- ```M .-``` Monedero.
- ```O .-``` Otros datos(opcional).

Cada secuencia de cobro exitoso está delimitada por un carácter (!)
La pista en las tarjetas de crédito puede contener un carácter (:) para delimitar el tipo de tarjeta y el número de autorización u otros datos.

Una cadena de respuesta vacía significa que debe omitirse el cobro alternativo y continuar.

Una cadena de respuesta con una X significa que la transacción debe cancelarse.

El parámetro `TIPO_CAMBIO` de cada forma de pago son opcional, si se omite toma el tipo de cambio de la divisa.

### Ejemplos

```E|50.00|MXN!T|80.10|MXN|VISA:8874554445544!T|20.25|MXN|AMX:98773999!W|100|MXN|774478754744```

**Efectivo**

F|IMPORTE|DIVISA

```E|290|MXN```

**Cheques**

F|IMPORTE|DIVISA|BANCO:EMISOR:BENEFICIARIO:NUMERO:TIPO_CAMBIO

F|IMPORTE|DIVISA|BANCO:EMISOR:BENEFICIARIO:NUMERO // Sin tipo de cambio.

```C|290|MXN|3:JUAN:PEDRO:12597:1```

**Depósitos**

F|IMPORTE|DIVISA|BANCO:REFERENCIA:TIPO_CAMBIO

F|IMPORTE|DIVISA|BANCO:REFERENCIA // Sin tipo de cambio.

```D|290|MXN|3:REF0013:1```

**Tarjeta**

F|IMPORTE|DIVISA|TIPO:NUMERO_AUTORIZACION:NUMERO:CVV:NOMBRE:DOMICILIO:TIPO_CAMBIO

F|IMPORTE|DIVISA|TIPO:NUMERO_AUTORIZACION:NUMERO:CVV:NOMBRE:DOMICILIO // Sin tipo de cambio.

```T|290|MXN|0001:1205:12345:123:JUAN:COLONIA CENTRO:1```

**Cashback**

Códigos de categorías identificados(`<CBK>`,003,categoría de la configuración).

F|IMPORTE|DIVISA|REFERENCIA

```W|100|MXN|774478754744```

**Vale**

ID|IMPORTE|DIVISA|REFERENCIA:NOTAS:TIPO_CAMBIO

ID|IMPORTE|DIVISA|REFERENCIA:NOTAS // Sin tipo de cambio.

V|290|MXN|REF0012:Cobro con vales

**Cupón**

ID|IMPORTE|DIVISA|CUPON|TIPOCUPON // DIVISA,TIPOCUPON son opcionales.

Q|50|MXN|CXMN01:DINERO

Q|50|MXN|CXMN01:

**Monedero**

ID|IMPORTE|DIVISA| // DIVISA es opcional.

M|120|MXN|

M|120||

**Otros datos**

O|CATEGORIA|REFERENCIA|FECHA|NOTAS

```O|5|REF909913|2025-01-30|COBRO DE PRODUCTO```

Ejemplo de datos extras(O)

```E|290|MXN!O|5|REF909912|2025-01-30|COBRO DE PRODUCTO```

Nota:
```
Sí se omite(O), se toman automáticamente los datos:
Categoría: Se asigna la categoría configurada en Maxicomercio(Categoría predeterminada de ingreso).
Referencia: Se asigna una referencia automática.
Notas: Se asigna "Cobro documento + Referencia". 
Fecha: Se asigna la fecha actual.
```
**Efectivo y Cheques**

F|IMPORTE|DIVISA!F|IMPORTE|DIVISA|BANCO:EMISOR:BENEFICIARIO:NUMERO:TIPO_CAMBIO

```E|200|MXN!C|90|MXN|3:JUAN LÓPEZ:PEDRO JUÁREZ:12597:1```

**Tarjeta y Cashback**

F|IMPORTE|DIVISA|TIPO:NUMERO_AUTORIZACION:NUMERO:CVV:NOMBRE:DOMICILIO:TIPO_CAMBIO!F|IMPORTE|DIVISA|REFERENCIA

```T|290|MXN|0001:1205:12345:123:NOMBRE:DOMICILIO:1!W|100|MXN|REF002345```

**Tarjeta X 3**
- T1= ```T|150|MXN|0001:12056:123456:123:TARJETA 1:DOMICILIO 1:1```
- T2= ```T|90|MXN|0001:120567:123457:321:TARJETA 2:DOMICILIO 2:1```
- T3= ```T|50|MXN|0001:120568:123456:131:TARJETA 3:DOMICILIO 3:1```

Línea completa:

```T|150|MXN|0001:12056:123456:123:TARJETA 1:DOMICILIO 1:1!T|90|MXN|0001:120567:123457:321:TARJETA 2:DOMICILIO 2:1!T|50|MXN|0001:120568:123456:131:TARJETA 3:DOMICILIO 3:1```

### pos.js

Función que realiza la invocación de la aplicación intermedia `evTPVCobrar`.

```
function getCad(cadena)
{
	var indice = cadena.indexOf('!!!');

	if (indice !== -1) 
	{
		var parteDespuesDeSecuencia = cadena.substring(indice + 3);
		return parteDespuesDeSecuencia; 
	} 
	else 
	{
		return "";
	}
}
function replaceArgs(cadena)
{
	//Reemplazar aquí todos los símbolos necesarios.
	var c=cadena.toString().replace('|','_');
	c=c.replace('!','_');
	
	return c;
}
function evTPVCobrar(referencia,importe,divisa, pista)
{
	Application.MainForm.ClearConsole();
	var args='"'+replaceArgs(referencia)+"|"+replaceArgs(importe)+"|"+replaceArgs(divisa)+"|"+replaceArgs(pista)+'"';

	var command = "globalpay.bat " + args;

	Application.MainForm.ExecInConsole(command);
	var response = Application.MainForm.txtConsole.Text;
	var res=getCad(response);
	
	return res;
}
```
 
###  Aplicación intermedia "AppGlobalPay.exe"
Esta aplicación implementa las formas de pago ya antes mencionado.

Todo carácter | o (!) será reemplazado por un carácter _ en las secuencias.

Secuencia de inicio de cobro (esto lo envía el sistema informando(punto de venta): `referencia|saldo a cobrar|divisa|una pista`).
```
A02444875|250.35|MXN|Venta 00001
```


Para ejecutar esta aplicación desde código javascript se utiliza un archivo `globalpay.bat` ya que por alguna razón las funciones de vb6 solo ejecutan aplicaciones de consola.

Contenido del archivo `globalpay.bat`, recibe un argumento "referencia|importe|divisa|pista".
```
appglobalpay.exe %1
```

**Patrón de retorno por consola de cada forma de pago**
- *Efectivo  .-*     F|IMPORTE|DIVISA
- *Tarjetas  .-*     F|IMPORTE|DIVISA|TIPO:NUMERO_AUTORIZACION:NUMERO:CVV:NOMBRE:DOMICILIO
- *Depósitos .-*     F|IMPORTE|DIVISA|BANCO:REFERENCIA
- *Vales     .-*     F|IMPORTE|DIVISA|REFERENCIA:NOTAS
- *Cheques   .-*     F|IMPORTE|DIVISA|BANCO:EMISOR:BENEFICIARIO:NUMERO

La aplicación `AppGlobalPay.exe` devuelve las formas pagos elegidas con los siguientes símbolos al inicio `!!!`, esto con el fin de poder recuperar las formas de pago elegidas desde la función de javascript `getCad`.

**Ejemplo**
```
Console.WriteLine("!!!E|290|MXN!T|290|MXN|0001:1205:12345:123:JUAN:COLONIA CENTRO"); 

// Al obtener el resultado de la consola desde la función `evTPVCobrar` da como resultado `C:\app\AppGlobalPay.exe!!!E|290|MXN!T|290|MXN|0001:1205:12345:123:JUAN:COLONIA CENTRO`.
// C:\app\AppGlobalPay.exe = Ruta de la ubicación de la aplicación.
```