1.0.84 • Published 2 years ago

@ci24/ci-billing-sqlserver v1.0.84

Weekly downloads
-
License
-
Repository
-
Last release
2 years ago

Modulo para la facturación de Controles Inteligentes @ci24/ci-billing-sqlserver

Descripcion

Servicio o modulo que sirve para facturar un servicio previamente liquidado.

Instalación

npm install --save @ci24/ci-billing-sqlserver

Como usarlo

Este modulo necesita de un archivo de configuracion ubicado en:

 /free/CI24/Settings/billing.json
 o
 C:\\ProgramData\\CI24\\Settings\\Billing\\billing.json

El archivo debe tener lo siguiente:

{
  "PortListenServerSDK": 0,
  "PathLogs": "/free/CI24/Logs/",
  "DBName": "/free/CI24/SDKDB/billing.db",
  "IPServerAurora": "192.168.2.88",
  "PortServerAurora": 3050
}

La base de datos debe existir y tener la estructura de tablas necesaria para hacer la sincronización, la ip y el puerto son del computador que tenga el servicio de sincronización previamente configurado.

Si ve a usar como libreria se puede obviar este paso y al inicializar el modulo se le pasan estos settings.

var billing = require('@ci24/ci-billing');

var settings = {
    "PortListenServerSDK": 0,
    "PathLogs": "/free/CI24/Logs/",
    "DBName": "/free/CI24/SDKDB/billing.db",
    "IPServerAurora": "192.168.2.88",
    "PortServerAurora": 3050
};

billing = new billing(settings);
billing.SyncDatabase(function (err) {
    if(err == null)
    {
        console.log("sync ok");

        //el objeto "data" a continuacion es devuelto por la funcion "LiquidateService"
        var data = {
            "IdCompany": 1,
            "IdSite": 1,
            "IdZone": 1,
            "MacAddress": "7071BCB0C432",
            "Billing": {
                "RateName": "38$ el minuto",
                "Plate": "ABC123",
                "EntryDate": "2017-05-08 10:00:00",
                "Cash": 50000,
                "Change": 0,
                "InvoiceDate": "2017-05-08 15:42:17",
                "IdToken": "123456789",
                "MinutesBilled": 1077,
                "TotalWithoutTaxes": 35168,
                "TotalAdjustments": 0,
                "SubTotal": 35168,
                "TotalTaxes": 6682,
                "Total": 41850,
                "MinutesAgreements": 240,
                "TotalAgreements": 12000,
                "BillingItems": [
                    {
                        "IdRate": 1,
                        "TotalWithoutTaxes": 35168,
                        "TotalTaxes": 6682,
                        "SubTotal": 35168,
                        "TotalAdjustments": 0,
                        "Total": 41850,
                        "TaxesApplied": [{
                            "IdTax": 1,
                            "TaxValue": 19,
                            "Total": 6682
                        }]
                    },
                    {
                        "IdRate": 2,
                        "TotalWithoutTaxes": 35168,
                        "TotalTaxes": 6682,
                        "SubTotal": 35168,
                        "TotalAdjustments": 0,
                        "Total": 41850,
                        "TaxesApplied": [
                            {
                                "IdTax": 2,
                                "TaxValue": 19,
                                "Total": 6682
                            },
                            {
                                "IdTax": 3,
                                "TaxValue": 19,
                                "Total": 6682
                            }
                        ]
                    }
                ],
                "AgreementsApplied": [
                    {
                        "IdAgreement": 1,
                        "Minutes": 240,
                        "Total": 12000
                    },
                    {
                        "IdAgreement": 2,
                        "Minutes": 240,
                        "Total": 12000
                    }
                ]
            }
        };

        //Cuando ya se es seguro que se realizo el pago, se usa la funciokn "BillingService" para crear y registrar la factura

        billing.BillingService(data, function (err, result) {
            if(err == null)
            {
                console.log("BillingService:%d:%s", number, result.bill.Receipt);
            }
            else
            {
                console.log("BillingService:%d:error:%s", number, err);
            }

            cb(err, result);
        });
    }
    else
    {
        console.log("sync err %s", err);
    }

});

Funciones

SyncDatabase: Inicializa la base de datos, sincroniza la base de datos contra el servidor, fundamental para que el programa pueda realizar las diferentes tareas.

billing.SyncDatabase(function (err) {
    if(err == null)
    {
        console.log("sync ok");
    }
    else
    {
        console.log("sync err %s", err);
    }


});

BillingService: guarda la liquidación en base de datos y devuelve la factura del servicio.

billing.BillingService(data, function (err, result) {
    if(err == null)
    {
        console.log("BillingService:%d:%s", number, result.bill.Receipt);
    }
    else
    {
        console.log("BillingService:%d:error:%s", number, err);
    }

    cb(err, result);
});

LiquidateService: guarda la liquidación en base de datos y devuelve la factura del servicio.

var data2 = {
    "IdCompany": 1,
    "IdSite": 1,
    "IdZone": 1,
    "MacAddress": "7071BCB0C432",
    "CardId" : "123456789",
    "CardDate": "2017-05-12 17:00:00",
    "IdConsole": 1,
    "CardType": 0,
    "IdAgreement": 1,
    "CardStatus": 0,
    "Id_Rate": x // Id de la Tarifa en caso de que sea necesario liquidar con una tarifa especifica
};

billing.LiquidateService(data2, function (err, result) {
    if(err == null)
    {
        console.log("LiquidateService ok");
    }
    else
    {
        console.log("error to LiquidateService:%d", err);
    }

});

OpenShift: habilita o deshabilita el log.

billing.OpenShift(null, function (err, result) {
    if(err == null)
    {
        console.log("OpenShift:%s", result.shift.IdShift);
    }
    else
    {
        console.log("CloseShift:error:%s", err);
    }

    //cb(err, result);
});

CloseShift: habilita o deshabilita el log.

billing.CloseShift(null, function (err, result) {
    if(err == null)
    {
        console.log("CloseShift:%s", result.shift.Receipt);
    }
    else
    {
        console.log("CloseShift:error:%s", err);
    }

    //cb(err, result);
});

Funciones de Inserciones en Base de Datos

1- Insert_Recargas: Realiza una insercion nueva en la tabla de recargas. Recibe un objeto con los siguientes parametros:

data = { Tipo: X1, Valor: X2 },

donde X1 es el tipo segun la siguiente enumeracion:

        Recarga = 1
        Vaciado = 2
        PagoNoc = 3 // NA
        FalloVueltas = 4
        ErrorPagoCierre = 5 // NA
        ErrorPagoCierreNoc = 6 // NA
        AgregarBillByTest = 7 // NA
        QuitarBillByTest = 8 // NA
        PreCierre = 9 // NA
        ErrorPagoPreCierre = 10 // NA
        Deposito = 11 // NA

X2 es el valor de "Recarga, Vaciado, etc"

Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    var data = {
        Tipo: 1,
        Valor: 200000
    }

    billing.Insert_Recargas(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {

        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

2- Insert_Cortes: Realiza una insercion nueva en la tabla de Cortes (Retiros de efectivo del PPA por fallos). Recibe un objeto con los siguientes parametros:

data = { Valor: X1 },

donde X1 es el valor del pago

Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    var data = {
        Valor: 200000
    }

    billing.Insert_Cortes(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            var Recibo = result.Texto // el formato del recibo a imprimir
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

3- Insert_Billetes_Stack: Realiza una insercion nueva en la tabla de billetesstack. todos los billetes que bajan al Stack deben registrarse mediante esta funcion

Recibe un objeto con los siguientes parametros:

data = { IdTarjeta: X1, ValorBillete: X2 },

Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    var data = {
        IdTarjeta: 12345678, // ID test
        ValorBillete: 50000 // billete de 50000
    }

    billing.Insert_Billetes_Stack(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {

        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

4- Insert_Movimiento_Dinero: Realiza una insercion nueva en la tabla de movimiento_dinero. En esta tabla se almacenan todos los ingresos y extracciones de monedas, incluyendo las recargas

Recibe un objeto con los siguientes parametros:

data = {IdTarjeta: X1, Valor: X2, Cantidad: X3, tipo: X4, isRecarga: X5},

- X2 es el valor de la moneda (50,100,200,500,1000)
- X3: el numero de monedas de esta denominacion
- X4: 1: si las monedas ingresaron al monedero, 2: si las monedas salieron del monedero
- X5: 0: si no fue recargando, 1: si fue una recarga

Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    var data = {
        IdTarjeta: 12345678,
        Valor: 1000, //moneda de 1000
        Cantidad: 10, //10 monedas
        tipo: 1, // las monedas ingresaron
        isRecarga: 1 // Fue una recarga hecha por modo administrativo
    }

    billing.Insert_Movimiento_Dinero(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {

        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

5- Get_Settings: Funcion que retorna un Array con todos los settings que se encuentran en la Tabla de Settings de la DB.

Esta Funcion no recibe ningun parametro:

Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    billing.Get_Settings(null, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            var data = result;
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

Nuevas Funciones Para Uso del Modulo en Tablet

1- Get_Rates: Funcion para la obtencion de las Tarifas Disponibles. Recibe un objeto con los siguientes parametros:

data = { Card_Type: XX },

donde XX es el tipo de la tarjeta segun la siguiente enumeracion:

        Tarjeta Normal = 0
        Tarjeta Mensual = 2
        Para Tarifas sin Tarjeta = -1 // NA

 Y Retorna un Objeto con las caracteristicas de las tarifas:
    {
        "Rates": [
                {
                    "Id_Rate": 4,
                    "RateName": "$100 El Minuto",
                    "Amount": 0
                },
                {
                    "Id_Rate": 8,
                    "RateName": "Special Rate $1.5 per hour",
                    "Amount": 1.5
                }
        ]
    }
Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    var data = {
        Card_Type: 0
    }

    billing.Get_Rates(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            _log.write ("Operacion Exitosa")
            _log.write(JSON.stringify(result)) // es un Objeto con las Tarifas
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

2- Misc_Service: Funcion que realiza la facturacion de Miscelaneos. Recibe un objeto con los siguientes parametros:

data = { Total_Misc: X1, Concept_Misc: X2, Cash_Paid: X3 },

donde:
- X1 es el valor del Miscelaneo
- X2 es el Concepto del Miscelaneo
- X3 es el valor recibido por el cajero (Cash Recibido)

 Y Retorna un Objeto Igual al Objeto Retornado por la funcion BillingService:


Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    var data = {
        Total_Misc: 15.5,
        Concept_Misc: "Pago por Concepto X",
        Cash_Paid: 16 // el total recibido por el cajero
    }

    billing.Misc_Service(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            _log.write ("Operacion Exitosa")
            _log.write(JSON.stringify(result)) // es un Objeto con la respuesta (Objeto similar a respuesta de BillingService)
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

3- Get_Agreements: Funcion para la obtencion de los Convenios Disponibles.

Retorna un Objeto con las caracteristicas de los Convenios:
    {
        "Agreements": [
                {
                    "Id_Agreement": 1,
                    "AgreementName": "Todo el día",
                    "Value": 1440
                }
        ]
    }

4- Decrypt_Data: Funcion para la Decripcion de los datos.

Retorna un Objeto con los parametros decodificados de la tarjeta, parametros que se deben pasar por el
servicio de Liquidacion:
    // Parametro de Retorno
    {
        "IdCompany": 1,
        "IdSite": 1,
        "IdZone": 1,
        "IdAgreement": 0,
        "MacAddress": "F2CA951E8FD5",
        "CardId": "3037569259",
        "CardDate": "2017-10-25 15:52:29",
        "CardDateIN": "2000-01-01 00:00:00",
        "IdConsole": 251,
        "CardType": 0,
        "Agreements": [
            0,
            0,
            0,
            0,
            0
        ],
        "CardStatus": 1,
        "Password": 0,
        "MinToExit": 0,
        "PlateIN": "",
        "WrongDate": false,
        "IdEntry": 0
    }
Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    data =
    {
        "idCard" : "eba00db5", // UID de la tarjeta "en String"
        "data": "205ef0651dfb00000000000001000000" // data de los 16 bytes del sector leido "en String"
    }

    billing.Decrypt_Card(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            _log.write ("Operacion Exitosa")
            _log.write(JSON.stringify(result)) // es un Objeto con la informacion Decodificada
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

4- Encrypt_Data: Funcion para la Encripcion de los datos a escribir en la tarjeta.

Retorna un array de 16 posiciones con los valores de cada uno de los 16 bytes del sector a escribir:
    // Parametro de Retorno
    [
     121,
     51,
     135,
     33,
     121,
     181,
     2,
     15,
     0,
     1,
     251,
     1,
     0,
     0,
     0,
     0
    ]
    ```


    Ejemplo de Uso:

```bash
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    Card_Info: {
                  "IdCompany": 1,
                  "IdSite": 1,
                  "IdZone": 1,
                  "IdAgreement": 0,
                  "MacAddress": "B827EBB1AE86",
                  "CardId": "679122206",
                  "CardDate": "2017-10-28 12:24:25",
                  "CardDateIN": "2017-10-27 08:00:54",
                  "IdConsole": 8,
                  "CardType": 0,
                  "Agreements": [],
                  "CardStatus": 1,
                  "Password": "4733ce65d79b0c667f37093709010000",
                  "MinToExit": 15,
                  "PlateIN": "",
                  "WrongDate": false,
                  "IdEntry": 150114,
                  "Err": "",
                  "Reference": "NO_REFERENCE"
               }

    Liquidate_Info = {
                              "Type": 0,
                              "Type_Name": "Normal_Card",
                              "Response": 1,
                              "Response_String": "CARD_DATA",
                              "Update_Card": true,
                              "MinToExit": 15,
                              "IdCompany": 5,
                              "IdSite": 14,
                              "IdZone": 14,
                              "MacAddress": "B827EBB1AE86",
                              "Billing": {
                                  "TipoCobro": 0,
                                  "RateName": "$100 El Minuto",
                                  "Plate": "",
                                  "EntryDate": "2017-10-28 12:24:25",
                                  "Cash": 0,
                                  "Change": 0,
                                  "Change_Left": 0,
                                  "InvoiceDate": "2017-10-28 15:06:41",
                                  "IdConsola": 8,
                                  "IdToken": "679122206",
                                  "MinutesBilled": 162,
                                  "TotalWithoutTaxes": 3.74,
                                  "TotalAdjustments": 0,
                                  "SubTotal": 3.74,
                                  "TotalTaxes": 1.01,
                                  "Total": 4.75,
                                  "MinutesAgreements": 0,
                                  "TotalAgreements": 0,
                                  "IdEntry": 0,
                                  "BillingItems": [
                                      {
                                          "IdRate": 4,
                                          "TotalWithoutTaxes": 3.74,
                                          "TotalTaxes": 1.01,
                                          "SubTotal": 3.74,
                                          "TotalAdjustments": 0,
                                          "Total": 4.75,
                                          "TaxesApplied": [
                                              {
                                                  "Id_Tax": 9,
                                                  "TaxValue": 8,
                                                  "Total": 0.3
                                              },
                                              {
                                                  "Id_Tax": 1,
                                                  "TaxValue": 19,
                                                  "Total": 0.71
                                              }
                                          ],
                                          "AgreementsApplied": []
                                      }
                                  ],
                                  "AgreementsApplied": [],
                                  "Card_Payment": {
                                      "Tarjeta_Last4Numbers": "",
                                      "Tarjeta_Franquicia": "",
                                      "Tarjeta_Tipo": "",
                                      "Tarjeta_Fecha_Pago": "",
                                      "Tarjeta_Hora_Pago": "",
                                      "Tarjeta_ID_Punto": "",
                                      "Tarjeta_RRN": "",
                                      "Tarjeta_Numero_Cuotas": "",
                                      "Tarjeta_Version_POS": "",
                                      "Tarjeta_Version_PPA": ""
                                  },
                                  "Nequi_Payment": {}
                              },
                              "Data_Normal": {
                                  "Is_Pase_Dia": false,
                                  "Status": -1,
                                  "Status_String": "No_DayPass_Service",
                                  "Is_Moroso": false,
                                  "Id_Moroso": 0,
                                  "Moroso_Value": 0,
                                  "Is_Validate": false,
                                  "Is_Misc": false,
                                  "Concept_Misc": ""
                              },
                              "Data_Mensual": {
                                  "dateINI": "2017-10-28 15:06:39",
                                  "horaINI": "15:06:39",
                                  "dateFIN": "2017-10-28 15:06:39",
                                  "horaFIN": "15:06:39",
                                  "User_Name": "",
                                  "Company_Name": "",
                                  "DiasPermitidos": 0
                              }
                          }


    data =
    {
        "cardData" : Card_Info, // informacion de la tarjeta decodificada"
        "liquidationData": Liquidate_Info // JSON de respuesta del servicio de Liquidacion "LiquidateService"
    }

    billing.Encrypt_Card(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            _log.write ("Operacion Exitosa")
            _log.write(JSON.stringify(result)) // es un Array con los valores de los bytes a escribir en la tarjeta
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

4- Login: Funcion para validar el usuario y la contraseña de inicio de sesion. Recibe un objeto con los siguientes parametros

    {
        user: "elkin@ci24.com", // el user es el email de registro del usuario
        password: "Controles1"
    }
Ejemplo de Uso:
    var billing = require ('@ci24/ci-billing-sqlserver')
    billing = new billing();

    data =
    {
        user: "elkin@ci24.com", // el user es el email de registro del usuario
        password: "Controles1"
    }

    billing.Login(data, function(err,result))
    {
        if (err == null) // operacion exitosa
        {
            _log.write ("Operacion Exitosa")
        }
        else
        {
            var error = result.Error_String // Si hay error, este es el string del error
        }
    }

Codigos de Error

WRONG_DATA =  1
PAYMENTPOINT_NOT_FOUND =  2
ERROR_CREATE_SHIFT =  3
ERROR_TO_GET_MACADDRESS =  4
DATABASE_DOESNT_EXIST =  5
ERROR_TO_SYNC_DB =  6
BUSY_SYNC_FUNCTION =  7
DATABASE_NOT_SYNC =  8
ERROR_SHIFT_IS_NULL =  9
ERROR_PAYMENTPOINT_IS_NULL =  10
ERROR_DBMANAGER =  11
ERROR_CHECK_CONSECUTIVE_SHIFT =  12
ERROR_GET_CONSECUTIVE_BILLING =  13
ERROR_GET_FORMAT_RECEIPT =  14
ERROR_SAVE_CONSECUTIVE_BILLING =  15
ERROR_SAVE_BILLING =  16
ERROR_SHIFT_IS_ALREADY_CLOSED =  17
ERROR_CLOSE_SHIFT =  18
ERROR_SHIFT_IS_ALREADY_OPEN =  19
ERROR_SELECT_RATE =  20
ERROR_NOT_DEFAULT_RATE =  21
ERROR_SELECT_AGREEMENT =  22
ERROR_SAVE_CONSECUTIVE_TABLA_FACTURACION = 23
ERROR_GET_CONSECUTIVE_TABLA_FACTURACION = 24
ERROR_GET_CONSECUTIVE_RECARGAS = 25
ERROR_INSERT_RECARGAS = 26
ERROR_INSERT_CORTES = 27
ERROR_GET_CONSECUTIVE_CORTES = 28
ERROR_INSERT_BILLETES_STACK = 29
ERROR_GET_CONSECUTIVE_BILLETES_STACK = 30
ERROR_CONSOLA_NOT_FOUND = 31;
ERROR_FACTURA_NOT_FOUND = 32
ERROR_TARIFA_EN_CONSOLA_NOT_FOUND = 33
ERROR_TARIFA_NOT_FOUND = 34
ERROR_GETTING_LIQUIDATION = 35
ERROR_CLASS_TARIFA = 36
ERROR_GETTING_CONVENIOS = 37
ERROR_CLASS_CONVENIO = 38
ERROR_CLASS_VIP_LIST = 39
ERROR_PROCESSING_VIP = 40
ERROR_REPEATING_LIQUIDATION = 41
ERROR_GETTING_SETTINGS = 42
ERROR_SENDING_CHANGES = 43
ERROR_GETTING_CHANGES = 44
ERROR_SHIFT_IS_CLOSE = 45
ERROR_CHECKING_BILLING = 46
ERROR_TO_LOAD_CONFIGURATION = 47
ERROR_GETTING_STACKED_BILLS = 48
ERROR_INSERT_PASE_DIA = 49
ERROR_UPDATE_MOROSOS = 50
ERROR_CHECK_CONTROL_HORARIO = 51
ERROR_VIP_CLIENT_NOT_FOUND = 52
ERROR_CARD_ADMIN_NOT_FOUND = 53
ERROR_USER_GROUP_NOT_FOUND = 54
ERROR_GETTING_DEVICE_SETTINGS = 55
ERROR_VIP_TOKEN_NOT_FOUND = 56
ERROR_RATES_NOT_FOUND = 57
ERROR_MISC_RATE_NOT_FOUND = 58
ERROR_AGREEMENTS_NOT_FOUND = 59
ERROR_DATA_DECRYPT_CARD = 60
ERROR_CONSOLE_NOT_FOUND = 61
ERROR_DATA_ENCRYPT_CARD = 62
ERROR_INSERT_MOVIMIENTO_DINERO = 63
ERROR_GET_CONSECUTIVE_MOVIMIENTO_DINERO = 64
1.0.84

2 years ago

1.0.83

2 years ago

1.0.82

2 years ago

1.0.81

2 years ago

1.0.80

2 years ago

1.0.79

2 years ago

1.0.78

2 years ago

1.0.77

2 years ago

1.0.76

2 years ago

1.0.75

2 years ago

1.0.74

2 years ago

1.0.73

3 years ago

1.0.72

3 years ago

1.0.71

3 years ago

1.0.69

3 years ago

1.0.68

3 years ago

1.0.67

4 years ago

1.0.66

4 years ago

1.0.65

4 years ago

1.0.64

4 years ago

1.0.63

4 years ago

1.0.62

4 years ago

1.0.61

4 years ago

1.0.60

4 years ago

1.0.59

4 years ago

1.0.58

4 years ago

1.0.57

4 years ago

1.0.56

4 years ago

1.0.55

4 years ago

1.0.54

4 years ago

1.0.53

4 years ago

1.0.52

4 years ago

1.0.51

4 years ago

1.0.50

4 years ago

1.0.49

4 years ago

1.0.48

4 years ago

1.0.47

4 years ago

1.0.46

5 years ago

1.0.45

5 years ago

1.0.44

5 years ago

1.0.43

5 years ago

1.0.41

5 years ago

1.0.40

5 years ago

1.0.39

5 years ago

1.0.38

5 years ago

1.0.37

5 years ago

1.0.36

5 years ago

1.0.35

5 years ago

1.0.34

5 years ago

1.0.33

5 years ago

1.0.32

5 years ago

1.0.31

5 years ago

1.0.30

5 years ago

1.0.29

5 years ago

1.0.28

5 years ago

1.0.27

5 years ago

1.0.26

5 years ago

1.0.25

5 years ago

1.0.24

5 years ago

1.0.23

6 years ago

1.0.22

6 years ago

1.0.21

6 years ago

1.0.20

6 years ago

1.0.19

6 years ago

1.0.18

6 years ago

1.0.17

6 years ago

1.0.16

6 years ago

1.0.15

6 years ago

1.0.14

6 years ago

1.0.13

6 years ago

1.0.12

6 years ago

1.0.11

6 years ago

1.0.10

6 years ago

1.0.9

6 years ago

1.0.8

6 years ago

1.0.7

6 years ago

1.0.6

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago

0.5.7

6 years ago

0.5.6

6 years ago

0.5.5

6 years ago

0.5.4

6 years ago

0.5.3

6 years ago

0.5.2

6 years ago

0.5.1

6 years ago

0.5.0

6 years ago

0.4.3

6 years ago

0.4.2

6 years ago

0.4.1

6 years ago

0.4.0

6 years ago

0.3.9

6 years ago

0.3.8

6 years ago

0.3.7

6 years ago

0.3.6

6 years ago

0.3.5

6 years ago

0.3.4

6 years ago

0.3.3

6 years ago

0.3.2

6 years ago

0.3.1

6 years ago

0.3.0

6 years ago

0.2.49

6 years ago

0.2.48

6 years ago

0.2.47

6 years ago

0.2.46

6 years ago

0.2.45

6 years ago

0.2.44

6 years ago

0.2.43

6 years ago

0.2.42

6 years ago

0.2.41

6 years ago

0.2.40

6 years ago

0.2.39

6 years ago

0.2.38

6 years ago

0.2.37

6 years ago

0.2.36

6 years ago

0.2.35

6 years ago

0.2.34

6 years ago

0.2.33

6 years ago

0.2.32

6 years ago

0.2.31

6 years ago

0.2.30

6 years ago

0.2.29

6 years ago

0.2.28

6 years ago

0.2.27

6 years ago

0.2.26

6 years ago

0.2.24

6 years ago

0.2.23

6 years ago

0.2.22

6 years ago

0.2.21

6 years ago

0.2.20

6 years ago

0.2.19

6 years ago

0.2.18

6 years ago

0.2.17

6 years ago

0.2.16

6 years ago

0.2.15

6 years ago

0.2.14

6 years ago

0.2.13

6 years ago

0.2.12

6 years ago

0.2.11

6 years ago

0.2.10

6 years ago

0.2.9

6 years ago

0.2.8

6 years ago

0.2.7

6 years ago

0.2.6

6 years ago

0.2.5

6 years ago

0.2.4

6 years ago

0.2.3

6 years ago

0.2.2

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago

0.1.12

7 years ago

0.1.11

7 years ago

0.1.10

7 years ago

0.1.9

7 years ago

0.1.8

7 years ago

0.1.7

7 years ago

0.1.6

7 years ago

0.1.5

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago