Gestión de importación/Exportación de datos desde programas de gestión.

GESTIÓN DE IMPORTACIÓN / EXPORTACIÓN DE DATOS DESDE PROGRAMAS DE GESTIÓN

Permite importar directamente los artículos en el programa de venta (TPV PRO)
Documento: Blatta Soft S.L. a 6/3/2003
Última modificación:     22/5/2003
Válido en versión de TPV Hostelware Profesional 5.1.26 o superior.

Este documento explica como el Terminal de venta importa datos de una aplicación de gestión externa y como deposita los datos para que esta aplicación pueda importar las ventas.

IMPORTACIÓN

Para poder importar artículos en el TPV Blatta Hostelware 5.1 se debe crear una base de datos en Access97 (DAO 3.5). El nombre de la base de datos puede ser cualquiera, aunque por defecto la aplicación buscará el archivo "C:ArticulosImportar.mdb".

Para que el terminal se auto actualice, en el archivo de configuración llamado c:Cafe.ini, se debe modificar
En la sección ADMIN el parametro ACTUALIZARME dejando su valor en -1, no obstante podemos automatizar esta operación modificando a mano en el archivo cafe.ini en la sección ADMIN el parametro ACTUALIZARMESIEMPRE dejando su valor en -1, de esta forma, al arrancar confirmará si existe el archivo a importar, lo importará y lo borrará.

Las tablas a incluir serán:

Artículos:
TABLA:ArtículosNombre de CampoTipo de campoValoresID_ArticuloLongNombreString (*256)IvaVentaCurrency PLUString (*256)
Artículos_Tipos
TABLA:Artículos_TiposNombre de CampoTipo de campoValoresID_ArticuloLongTipoLong*eTDArticuloCompra = 1 *eTDArticuloVenta = 2 *eTDArticuloVarios = 3***Si un artículo es de más de un tipo, se añadirán tantos registros como sea necesario,
**varios significa que no tiene precio y este se pide al vender.
***El IVA ha de existir y corresponde con el porcentaje.

Artículos_Familias
TABLA:Artículos_FamiliasNombre de CampoTipo de campoValoresID_ArticuloLongID_FamiliaLong

Artículos_Familias_Nombres
TABLA:Articulos_Familias_Nombres Nombre de CampoTipo de campoValoresID_FamiliaLongNombreString (*256)
Articulos_Precios_Turnos
TABLA:Articulos_Precios_Turnos Nombre de CampoTipo de campoValoresID_ArticuloLongTurnoLongPrecioCurrency

Articulos_Codigos: Para un mismo artículo, podrán existir varios codigos de barras distintos.
TABLA:Articulos_CodigosNombre de CampoTipo de campoValoresID_ArticuloLongCodigoString*Esta tabla ha de rellenarse solo cuando el artículo tenga codigos de barras.

EXPORTACIÓN

La aplicación TPV Hostelware Profesional, generará en cada cierre de caja (Z) un archivo con el siguiente formato: 00000000.MDB con una numeración consecutiva.

La ruta donde se colocarán los archivos es: C:TPVDestino

**Se recomienda una vez recogido estos archivos, renombrarlos a .OLD.

Formato de datos
Al abrir un cierre XXXX.MDB, nos encontraremos con los siguientes tablas:

     Tabla VentaDia
Indicaciones preliminares: Al hablar de línea nos referimos a un registro completo, una línea de venta.
Tabla: VentaDia

Campo:Tipo:Descripción.

Marca:Boleano: _________
Id_TPV:Long:
     Identificador del terminal de venta que realiza esa línea de venta.
Id_Articulo:Long:
Identificador del artículo vendido en esa línea
     Corresponde con el enviado en el archivo de importación.
     Si su valor es 0 o Null, indica que esa línea no es una venta.
Id_Familia:Long:
     Identificador del código interno de la familia a la que pertenece el artículo de esa línea.
     Si su valor es 0 o Null, indica que esa línea no es una venta.
Id_Grupo:Long:
     Identificador del grupo al que pertenecen esa familia.
     Si su valor es 0 o Null, indica que esa línea no es una venta.
IdPedidoCocina:Long:
     Corresponde al identificador de pedido realizado. Enlaza artículos con aditivos.
CodPLU:String:
     Corresponde con el código PLU del cliente.
     Corresponde con el enviado en el archivo de importación.
     Si su valor es -1 o Null, indica que esa línea no es una venta.
Camarero:String:
     Corresponde con el nombre del agente de venta o camarero que realiza esa línea.
     Si su valor es ??, indica que no se ha seleccionado ningún camarero.
CodCamarero:String:
     Valor del identificador del código de agente de venta.
     Si su valor es 0 o Null, indica que no se ha seleccionado ningún camarero.
     Corresponde con el enviado en el archivo de importación.
Turno:String:
     Corresponde con el turno de precios que se utiliza en esa línea de venta.
     Corresponde con el enviado en el archivo de importación.
     Si su valor es Null, indica que esa línea no es una venta.
Familia:String:
Para una venta, corresponde con el nombre de la familia a la que pertenece el artículo vendido en esa línea.
Especiales:
FUNCIÓN, Para una función, se indicará en el campo ArtNombre el tipo de función realizada.
INICITPV, Para indicar la fecha y hora en la que se ha iniciado la aplicación.
INGRESOXXXXXXX, Indica que se ha realizado un ingreso en la caja que corresponde al tipo de ingreso XXXXX.
     Si su valor es Null, indicará que esa línea no es una venta.
ArtNombre:String:
Para una venta, Indica la descripción del articulo vendido en esa línea.
Para una funcion, Indica el tipo de función realizada.
     Tipos:
          PROFORMAMESA: Indica que se ha pedido la cuenta de una mesa.
          PROFORMAMESAFIN: Indica el cierre de una mesa.
Para un pago o ingreso, corresponde con la descripción.
Si su valor es 0 o Null, indicará que esa línea no es una venta.

PrecioUnitario:Moneda: Importe de la venta con impuestos incluídos en Euros.
Descuento:Moneda: Porcentaje de descuento global para la venta.
DTO:Moneda:Porcentaje de descuento de esa línea de venta.
PrecioSinDTO:Moneda: Importe de la línea sin descuentos (precio real de venta).
Cantidad:Moneda: Cantidad de artículos en esa línea.
PrecioTotal: Moneda: Importe total de esa línea de venta sin los aditivos. (incluídos descuentos)
PrecioTotalAdd: Moneda: Importe total de esa linea de venta con los aditivos. (incluídos descuentos)
Pagado:Moneda:Importe pagado en el cierre del ticket.
Forma_de_Pago:String: Corresponde con la forma de pago realizada en esa venta.
     Especiales:
     ESPECIALXX, XX corresponde con el identificador de tipo de forma de pago realizada.
Ticket: String: Corresponde con el número de Ticket de esa línea de venta.
Factura:String: Corresponde con el número de factura de un ticket.
Fecha:DATE: (dd/mm/yyyy)
Hora:TIME: (HH:MM:SS)
Actualizada:Boleano: Indica si es línea de venta esta procesada por la aplicación que controle los stocks.
Tipo_Invitado:Boleano: Indica si esa línea esta invitada.
Tipo_Cajon: Boleano: Indica si esa línea corresponde a una apertura de cajón provocada.
Tipo_Facturado: Boleano: Indica si ese ticket esta facturado, y por ello tiene número de factura asignado.
Tipo_Venta: Boleano: Indica si esa línea es una línea de venta.
Tipo_Funcion: Boleano: Indica si esa línea es una línea de función.
SubTipo:String: Indica el tipo al que corresponde la venta:
     Tipos existentes.
     0= Es una venta.
Comensales:Long: Indica el número de comensales introducidos en esa mesa.
Id_Cliente:Long:Indica el código interno de cliente seleccionado en esa venta.
Id_Direccion:Long:Indica el código interno de la dirección del cliente seleccionado en esa venta.

Como seleccionar los datos correctamente
Para trabajar con los cierres de caja desde otro software hay que diferenciar entre 3 tipos de datos, para poder seleccionar todas las cantidades indicaremos las consultas a realizar.

Datos de Movimientos
Las entradas y salidas de dinero de caja, Cambio (dotación),Retirado de caja, Ingresos y pagos.
     El cambio, es la cantidad con que se inicia la caja tambien llamada Dotación.
     El retirado de caja nos indica las cantidades que se han retirado de la caja.
Para obtener los Datos Tendremos una SQL:

SELECT `Cambios:` AS Movimientos, Sum([PrecioTotal]) as valor
FROM Ventadia where familia like `cambio`
union
SELECT `Pagos:` aS Movimientos, Sum([PrecioTotal]) as valor
FROM Ventadia where familia like `Pagos*`
union
SELECT `Ingresos:` aS Movimientos, Sum([PrecioTotal]) as Valor
FROM Ventadia where familia like `Ingreso*`
union
SELECT `Cobro: FP:` & forma_De_Pago & ` ` AS Movimientos, Sum([Pagado]) as VAlor
FROM Ventadia where Forma_De_Pago <> `` and Forma_De_Pago <>`PENDIENTECOBRO` and Forma_De_Pago <>`EFECTIVO`
Group by forma_De_Pago
having Sum([Pagado]) >0
union
SELECT `Cobro: pendiente de cobro:` AS Movimientos, Sum(Pagado) as VAlor
FROM Ventadia where Forma_De_Pago =`PENDIENTECOBRO`
Union
SELECT `Venta Total sin invitar: ` as Movimientos, sum(PrecioTotal*Cantidad/(abs(Cantidad))) as Valor
FROM Ventadia where Ticket <>`` and tipo_Invitado=0 and familia <> `Forma_De_Pago` and cantidad <>0
union
SELECT `Venta Total Invitado: ` as Movimientos, sum(PrecioTotal*CAntidad/(abs(Cantidad))) as Valor
FROM Ventadia where Ticket <>`` and tipo_Invitado=-1 and familia <> `Forma_De_Pago` and cantidad <>0
union
SELECT `Venta Total de ` & Camarero & `: sin invitar ` as Movimientos, sum(PrecioTotal*Cantidad/(abs(Cantidad))) as Valor
FROM Ventadia where Ticket <>`` and tipo_Invitado=0 and familia <> `Forma_De_Pago` and cantidad <>0
Group by Camarero
union
SELECT `Venta Total de ` & Camarero & ` invitado : ` as Movimientos, sum(PrecioTotal*Cantidad/(Abs(Cantidad))) as Valor
FROM Ventadia where Ticket <>`` and tipo_Invitado=-1 and familia <> `Forma_De_Pago` and cantidad <>0
Group by Camarero
UNION
SELECT `Ticket:` & Ticket & ` cobrado` AS Movimientos, Sum(PrecioTotal*Cantidad/(abs(Cantidad))) as Valor
FROM Ventadia where Familia <> `Forma_De_Pago` and Ticket <>`` and tipo_Invitado=0 and cantidad <>0
Group by Ticket
having sum(precioTotal)>0
UNION SELECT `Ticket:` & Ticket & ` invitado` AS Movimientos, Sum(PrecioTotal*CAntidad/(abs(Cantidad))) as Valor
FROM Ventadia where Familia <> `Forma_De_Pago` and Ticket <>`` and tipo_Invitado=-1 and cantidad <>0
Group by Ticket;
UNION
SELECT `Ticket:` & Ticket & ` info anula` AS Movimientos, ArtNombre
FROM Ventadia where Familia =`Anulacion` and artNombre like `Anula el*`
UNION SELECT `Ticket:` & Ticket & ` info anulado por` AS Movimientos, ArtNombre
FROM Ventadia where Familia =`Anulacion` and artNombre like `Anulado*`
union
SELECT `Z Real en Caja` as Movimientos, PrecioTotal as Valor
FROM Ventadia where familia = `FUNCION` and artnombre=`REAL`
Union
SELECT `Z Descuadre` as Movimientos, PrecioTotal as Valor
From Ventadia where familia = `FUNCION` and artnombre=`DESCUADRE`


El resultado en una Base de datos de Pruebas es el siguiente

MovimientosvalorCambios:1000Cobro: FP:ESPECIAL1 4Cobro: FP:ESPECIAL2 2Cobro: pendiente de cobro:14Ingresos:200Pagos:400Ticket:14 cobrado6,1Ticket:15 cobrado4Ticket:16 invitado4Ticket:17 cobrado3Ticket:18 cobrado8Ticket:18 info anulado porAnulado en T:21Ticket:19 cobrado8,5Ticket:20 cobrado15Ticket:20 invitado42Ticket:21 cobrado-8Ticket:21 info anulaAnula el ticket 18Ticket:22 cobrado19Ticket:23 cobrado18Ticket:24 cobrado14Venta Total de ?? invitado : 46Venta Total de ??: sin invitar 33,6Venta Total de Agente 1: sin invitar 3Venta Total de Agente 2: sin invitar 51Venta Total Invitado: 46Venta Total sin invitar: 87,6Z Descuadre1132,4Z Real en Caja2000
*Pagos y retirado los hemos juntado en uno solo pero es fail de separar desde la base de datos

Datos del Cierre

Efectivo= Total Ventas-Pend De cobro-Tarjetas_y_Cheques-Pagos-Retirado+Ingresos+Cambio inicial
Efectivo=87,6-4-2-14+200-400+1000=867,6
Al cerrar la caja hemos contado el real y en el ejemplo salen 2000 euros así que hay un descuadre positivo de: 2000-867,6=1132,4 ( que tambien aparecen en la consulta), en general los descuadres vienen de devolver mal un cambio. (Y no son tan altos)

Los datos de cada venta se pueden obtener de la lista de tickets, si en la SQL quitamos las agrupaciones veremos la lista de los artículos del ticket.
Registros relacionados