CONTACTO ***** jofelchez@gmail.com *****




Soporte Remoto, helpmybusinesspos.info , TeamViewer, Hamachi, Descarga My Business pos 2012 Gratis, crack activar, keygen activador , FACTURACIÓN ELECTRÓNICA, my business pos 2012, MyCBB, Codigo de Barras BiDimensional, configurar facturas, Migración de la Versión 2006 a la Versión 2011, Delta, Configurar 2011, Manuales de Instalación, Errores, Modificar, Respaldos, Nuevo IVA, Red MyBusiness, Problema, Ambiente path, Migración, Impresora, Descarga 2011, Reportes, Presentaciones, Win7, SQL, Manager, Ticket, Etiquetas, Generador, Corte X Z, Restaurar, Zebra, Logo, recomendaciones, Remisiones, Barras, Inventario, hamachi, Delta y LINUX, code39, como cambiar el iva en my business pos, my business pos blogspot, como instalar my busuness delta, TPV, MyMoney, Concentrador POS, Zebra, Datamax, Mobile Business, Commander, Restaurante, MyBusiness POS 2012, Kardex
Mostrando entradas con la etiqueta MyBusiness POS 2012. Mostrar todas las entradas
Mostrando entradas con la etiqueta MyBusiness POS 2012. Mostrar todas las entradas

miércoles, 28 de noviembre de 2012

Inventario en MyBusiness POS con un SmartPhone Android

[wpdm_package id='15130']
[wpdm_package id='15370']

En estos días es importante la movilidad al hacer inventarios. Para eso existen herramientas a un costo muy bajo y algunas gratuitas que nos pueden apoyar en esta hardua batalla del Inventario.

Para eso, en esta ocasión estoy probando la herramienta PetScan (https://play.google.com/store/apps/details?id=com.maiko.scanpet&hl=es) en un dispositivo Sony Xperia U.

Se puede hacer una revisión de los beneficios de esta aplicación y hasta el momento es la más completa y sobre todo porque permite almacenar la información en Excel, la cual se puede exportar al sistema MyBusiness POS en algún inventario Inicial. Además es posible utilizar la plantilla que tiene por default el sistema MyBusiness POS para cargar el inventario inicial.

[youtube kbCuM63wncc]

Los resultados son buenos, aunque si es importante destacar la calidad de la cámara para hacer el enfoque apropiado y la cantidad de iluminación ambiental, ya que si se utiliza solo el flash del smartphone puede afectar en la duración de la batería.

jueves, 1 de noviembre de 2012

Descarga el NUEVO My Business POS 2012!!!

Descarga la nueva versión de MyBusiness POS 2012 ahora!!!
[wpdm_package id='15042']

viernes, 12 de octubre de 2012

Respaldos automáticos en My Business POS

Sql_Management_Studio-mybusinessposNunca se conoce la importancia de los respaldos hasta que ocurre un desastre, desde que un apagón dañe un archivo importante hasta lo peor: que se pierda toda la información de su disco duro, meses o quizás años de valiosa información de su negocio. Ahora MyBusiness POS (version 2008 a la 2012) le ofrece una forma automática de hacer respaldos, los cuales se pueden programar desde una sencilla ventana.

Este módulo se encuentra en la barra de tareas en la pestaña Utilerías, icono Respaldo.

Las opciones son:

CONFIGURACIÓN DEL RESPALDO.

Base de datos: Es la ruta donde se encuentra la base de datos que respaldaremos. Por omisión es C:\MyBusinessDatabase\MyBusinessPOS2012.mdf, que es la base de datos de MS SQL Server que se crea en la instalación.

Destino: Es la carpeta en donde se guardarán los respaldos, la cual se crea al momento de instalar el programa. Por omisión es C:\Respaldos\MyBusinessPOS2012.back.

Destino Adicional: Podemos utilizar esta opción para otra ruta donde se quiera guardar una copia de la base de datos. Por omisión es F:\Respaldos\MyBusinessPOS2012.back.

CONFIGURACIÓN DE LA CALENDARIZACIÓN.

Realizar desde: Esta opción nos la muestra en caso de tener varios equipos en red y queramos que una de las estaciones sea la que almacene la información de los respaldos.

Frecuencia: puede ser diaria, en cierta fecha y hora, una vez cada “x” días o en ciertos días específicos de la semana.

Elija una configuración adecuada a sus necesidades, de un clic en [Aplicar] y después en [Salir].

Ya cuenta ahora con una herramienta automática de respaldo de su información para no sufrir sobresaltos.

Fuente:

Información obtenida del boletín No. 50 de http://mybusinesspos.com

viernes, 10 de agosto de 2012

My Business POS 2012

descagas mybusiness pos[wpdm_package id='15022']

[wpdm_package id='14960']

[wpdm_package id='15023']

Descarga la nueva versión de MyBusiness POS 2012 ahora!!!

[wpdm_package id='15042']

[gview file="http://helpmybusinesspos.info/wp-content/Descargas/2012/05/MyBusinessPOS2012_trip.pdf" height="900" width="100%"]

Así que hay que probar las novedades que nos presenta; por supuesto espero que esta última versión sea mucho mejor que sus antecesoras 2008, 2010 y 2011; porque para lograr llegar hasta aquí tuvieron que pasar dos años de espera, quiero pensar que eso significa que los errores son mínimos

Lo único que espero es que este típtico no sea solo publicidad engañosa, esto debido a que muchos nuevos distribuidores se ven ilusionados y se arriesgan a tal grado de perder hasta la lealtad de sus clientes. Y pues con el cliente no se puede jugar...Hay que ofrecer soluciones y no problemas.

Los distribuidores que tienen el privilegio de ir al congreso a Cancún en este mes de  Mayo, pues bien por ellos; en mi caso, pues la carga de trabajo no me permite  asistir (y si tuviera tiempo y dinero pues mejor lo disfrutaba en Mérida y sus alrededores)

Aquí les dejo el link de descarga de la diferentes versiones de MyBusiness POS por si llegaran a necesitarlas

En lo personal, aun sigo recomendando la versión 2006 Delta por considero que es la que ha dado vida y  costeado el desarrollo de las demás versiones.

Recomendación importante para los Distribuidores:

Antes de ofrecer el producto, hay que hacer las pruebas necesarias para tener la certeza de funcionalidad del software...

Bueno pues mucha suerte y éxito a todos.

domingo, 5 de agosto de 2012

Manejo de números de Serie, Lotes y Caducidades

Desde su versión 2010 y hasta la actual versión 2012, MyBusiness POS cuenta con un módulo de manejo de números de serie, lotes y caducidades.

Son opciones adicionales a las características de un artículo con el fin de determinar su entrada y salida UNICA.

Los pasos a seguir para manejar estas características son:

1.- Dar de alta el artículo con sus datos generales, en la pestaña "Información adicional" es necesario activar las casillas "Control de serie", si va a ser un artículo que maneje números de serie; o bien, la casilla "Control de lotes" si es un artículo que va a manejar lotes y caducidades, esto es porque van ligadas las fechas de caducidad con los lotes.

2.- Configurar la estación de trabajo, esto para que los movimientos realizados con dichos artículos solicite los números de serie o bien sea elegido el lote y su respectiva fecha de caducidad. Para esto es necesario seguir la secuencia Business Manager -> Configuración -> Estaciones de trabajo -> Estacion01 -> pestaña "General", localizamos las opciones "Solicitar pantalla de series" y "Solicitar pantalla de lotes".

3.- Lo que resta es realizar movimientos de inventario. Es NECESARIO primero realizar compras o bien entradas al inventario ya que para manejar números de serie o lotes de caducidades debe el artículo tener existencias para venderse, de otra forma, el ciclo no es correcto.

4.- Posterior a capturar una entrada al inventario o una compra diríjase al icono "Lotes" o bien "números de serie" (según lo que desee manejar) y en estas ventanas debe capturar los siguientes datos:

Tipo de documento (factura, remisión, compra, etc.)
Número de documento
Si son lotes debe capturar el puerto de entrada (p. e. Veracruz, Manzanillo, etc.)
Si son lotes debe capturar el número de pedimento (Número de lote o pedimiento)
Sólo si todos los artículos pertenecen al mismo lote, de un clic en el botón de la derecha para asignárselo a cada artículo capturado.
5.- Ya que tiene existencias de estos artículos al venderlos dentro del punto de venta o de los asistentes de ventas (remisión o factura), le solicitara los números de serie o lotes que salen en esa venta.

El manejo de números de serie y lotes es ESTRICTO en manejo de existencias, si usted vende sin tener existencias el ciclo no se completa y las devoluciones de producto se verían afectadas.

Se recomienda usar estos módulos SOLO SI el manejo de las existencias es regular en la administración de su empresa o negocio.
Fuente: Boletín No. 137 de www.mybusinessspos.com

miércoles, 1 de agosto de 2012

Configuración de Usuarios en My Business POS

La seguridad y el control de los usuarios son importantes para el buen manejo de cualquier empresa o negocio. En MyBusiness POS la configuración de usuarios consta de cinco niveles que le van a permitir configurar específicamente el perfil de cada uno de sus usuarios:

1. ALTA DE UN USUARIO.

Es necesario que acceda a MyBusiness POS con una clave de Supervisor, por ejemplo, “SUP SUP” (separado por un espacio). Ahora diríjase a 'Business Manager’, carpeta ‘Configuración’, opción ‘Usuarios’.

De un click en [Nuevo] y capturemos los siguientes datos:

  • Usuario: Es el nombre del usuario con el que va a accesar.

  • Nombre: Es el nombre completo del usuario.

  • Password: Hace referencia a la clave o palabra secreta de acceso.


Además es posible tomar las huellas del usuario para que el acceso al sistema pueda ser mediante la huella digital.

Este el procedimiento:

  1. Una vez conectado el lector de huella, MyBusiness POS lo reconocerá de inmediato.

  2. En la misma pantalla tomaremos lectura uno a uno de los dedos del usuario. Pueden ser solamente dos o los cinco dedos de una u ambas manos.


Una vez asignados los datos, tanto de las huellas como los de acceso por tecleo de usuario y clave, detallaremos las configuraciones de los usuarios.

En el proceso anterior dejamos sin activar la casilla “Es Supervisor”

¿Qué utilidad tiene que la active la casilla de Supervisor?

Esta casilla permite ver:

  • En el Business Manager: La carpeta de Configuración, la cual regula los catálogos de configuración de las estaciones de trabajo, los conceptos de cobranza, los conceptos de inventario, catálogos de monedas, etc., lo que detallaremos en un boletín posterior.

  • En la Barra de Iconos: El segmento de Configuración y de Programación que tienen iconos los cuales configuran y personalizan a MyBusiness POS.

  • En el Punto de Venta: Teclas de ayuda y funciones especiales para la venta, tales como los descuentos.

  • Reportes: Asigna todos los reportes al usuario “Supervisor”.


Ya que hemos comprendido la utilidad que tiene el activar o desactivar esta casilla proceda con la acción que considere propia del usuario que acaba de dar de alta.

2. CONFIGURACIÓN DE LOS DERECHOS EN EL BUSINESS MANAGER.

Vamos a ingresar a MyBusiness POS con una clave de Supervisor, por ejemplo, “SUP SUP” (separado por un espacio). Ahora diríjase a Business Manager, carpeta Configuración, opción Usuarios.

Seleccionamos al usuario que vamos a configurar, damos un clic derecho sobre él y escogemos la opción Derechos del Business Manager

Esta acción mostrará una ventana con una imagen similar al Business Manager que permitirá seleccionar una a una las carpetas a las que le daremos derecho de uso al usuario en cuestión; A su vez estas carpetas contienen menús que detallan acciones tales como “Nuevo”, “Modificar”, “Eliminar”, mismas que también son configurables.

Para definirle derechos a los usuarios posiciónese sobre el icono de la “llave” que desea restringir, dé un clic derecho y elija entre “Activado” e “Inactivo”, según le convenga.

Con lo anterior evitaremos que el usuario vea y use “carpetas” en el ‘Business Manager’ a las que no tiene derecho.

Es necesario entrar a My Business POS con el nombre del usuario y la contraseña asignada para verificar los cambios realizados.

[youtube tbNCcQeJgGg]

[youtube CS7Lw8N2Z1E]

[youtube nXGYqRbct9M]

[youtube SqGkxqwHBKY]

[youtube zO5A3pUfEFk]

Fuente:

Información obtenida del boletín No. 46 y 49 de http://mybusinesspos.com

lunes, 4 de junio de 2012

Recuperar Respaldo con SQL Management

Sql_Management_Studio-mybusinesspos[wpdm_package id='15035']

[wpdm_package id='14957']

Para recuperar un respaldo de MyBusiness POS debemos de tener instalada la utilería SQL Management Studio, que se incluye en su disco de instalación.

Si usted ya tiene instalada esta utilería accederemos a ella asegurándonos antes de que MyBusiness está cerrado, dando clic al menú “Inicio”, “Todos los Programas”, “Microsoft SQL Server 2005” y dando clic en el icono “SQL Server Management

Studio”.

En la ventana que nos aparece a continuación, en el dato “Autenticación” seleccionaremos la opción “Autenticación de Windows” y daremos clic en el botón [Conectar].

Entramos a la pantalla principal de “SQL Server Management Studio” y de nuestro lado izquierdo veremos un árbol de directorios, uno de ellos llamado “Bases de datos”, sobre del cual daremos un clic derecho y seleccionaremos la opción “Restaurar base de datos”.

Ahora veremos una nueva ventana en la cual deberemos hacer lo siguiente:

1. En el dato “A una base de datos” (to database) seleccionaremos la base de datos de MyBusinessPOS2012.mdf

2. Para el origen de la restauración seleccionaremos la opción “Desde dispositivo” y daremos clic en el botón con tres puntos. En la ventana que se nos muestra

enseguida daremos clic en el botón [Agregar] y nos aparecerá un nueva ventana en la que seleccionaremos el archivo de respaldo que queremos restaurar.

Los respaldos se encuentran en una carpeta llamada “Respaldo”. Podemos seleccionar nuestro archivo de respaldo de esa ubicación o bien de una memoria USB o un CD si es

que decidimos guardar ahí nuestros respaldos.

Para seleccionar nuestro archivo de respaldo, primero seleccionaremos la opción “Todos los archivos (*)” de la lista marcada como “Archivos de tipo”, posteriormente en el árbol

de directorios de la parte superior seleccionaremos nuestro archivo dependiendo en donde lo tengamos guardado y daremos un clic en [Aceptar]. Cabe mencionar que los

archivos de respaldo de MyBusiness POS se llaman MyBusinessPOSElite, MyBusinessPOS2010, MyBusinessPOS2011 o MyBusinessPOS2012, y tienen una extensión “ .back” seguida de la fecha en que se

realizaron.

De nuevo daremos clic en el botón [Aceptar] en la ventana donde ya agregamos el archivo, y ahora observaremos que en la ventana de “Restaurar Base de Datos” ya nos

aparece nuestro respaldo listo para ser cargado, tan solo activaremos la casilla “Restaurar” y daremos un clic en el botón [Aceptar]. Observaremos de nuestro lado izquierdo un indicador verde que nos muestra el progreso en la carga de nuestro respaldo.

Una vez finalizada la carga de el respaldo nos aparecerá un mensaje indicándonos que el proceso finalizo correctamente.

Ahora daremos clic en el botón [Ok], cerramos la aplicación SQL Management Studio e ingresamos a MyBusinessPOS para revisar que nuestra información se haya restaurado

correctamente.

Fuente: http://MyBusinessPOS.com 

viernes, 4 de mayo de 2012

Devoluciones en el Punto de Venta

En versiones anteriores de MyBusiness POS (2004 y 2006) existía una forma de hacer devoluciones desde el módulo de ‘Punto de venta’ con la cual, al hacer una devolución parcial o total, nos generaba un vale para ser utilizado en otra venta de igual o mayor monto.
A partir de MyBusiness POS v2008 hasta la actual, hay un mejor manejo de la devolución permitiéndonos, además de hacer devoluciones parciales o totales, generar vales o pagos en efectivo por el monto devuelto y hacer pagos por vales no aplicados.
Para hacer la devolución desde el punto de venta hay que presionar la tecla para que nos muestre la ventana de ayuda y elijamos la opción “Z013 Devolución de mercancía” dando doble clic sobre la misma o clic en el botón [Aceptar].

Los datos que nos solicita son los siguientes:
1. Estación. Estación de trabajo donde se generó el ticket.
2. Ticket. Número de ticket del que se hará la devolución.
3. Devolución total. Si activamos esta opción automáticamente nos coloca en la columna de Devolver la cantidad original de artículos comprada para realizar la devolución total de la venta.
4. Devolución Parcial. Nos permite seleccionar uno a varios artículos de la venta a devolver.
5. Devolver Efectivo. Se activa esta opción para hacer la devolución de efectivo en lugar de vales para compras futuras.

Al finalizar la devolución con , aparece un mensaje de confirmación según las combinaciones:
1. Devolución total con devolución de efectivo.
2. Devolución parcial con devolución de efectivo.
3. Devolución total con generación de vales.
4. Devolución parcial con generación de vales.

Finalmente damos un clic en el botón [Si] y finalizamos nuestra devolución.

Fuente:
Información obtenida del boletín No. 45 de MyBusinessPOS.com

domingo, 29 de abril de 2012

¿Cómo elaborar un reporte en MyBusiness POS?

REPORTES_mybusinesspos

[wpdm_package id='15042']

En este post se muestran las partes de un reporte y cómo modificar cada uno de los elementos para que se adaptea nuestras necesidades, así como crear los propios de una manera clara.

[youtube Ied-7juRO44]

miércoles, 29 de febrero de 2012

Manejo de Cobranza

En esta ocasión veremos el manejo del nuevo módulo de cobranza de My Business POS Ingrese al icono ‘Cobranza’ de la pestaña ‘Ventas’ de la barra de iconos.

Definamos ahora cada uno de sus componentes de la ventana de Cobranza:

1. ‘Cliente’: cliente al que le vamos aplicar el movimiento de cobranza.

2. ‘Saldo Total’: aquí nos indica el saldo total del cliente especificado.

3. ‘Saldo del Documento’: saldo que tiene el documento que seleccionado para su abono o consulta.

4. ‘Mostrar Documentos con saldo’: al estar activada esta opción nos muestra solamente los documentos que tienen un saldo pendiente por liquidar; si está desactivada y se oprime el botón [Refrescar Malla] nos mostrara todos los documentos de este cliente, tanto los que tienen saldo como aquellos que tienen saldo en ceros.

5. [Refrescar Malla]: actualiza la ventana de cobranza.

6. [Datos del Cliente]: nos muestra la ventana de los datos generales del cliente para efectos informativos.

7. [Nuevo Abono]: nos permite hacer un abono a un documento particular de cobranza.
Una vez seleccionado un documento con un clic, damos otro clic en este botón y capturaremos las siguientes casillas:
a. ‘Documento’: forma en que estamos recibiendo el pago, por ejemplo, EFE = Efectivo, TAR = Tarjeta, CHL = Cheque, etc.
b. ‘Referencia’: este dato se llena si nos están abonando con cheque con el número de cheque.
c. ‘Moneda’: por omisión se carga la moneda base que tenemos dado de alta en el sistema.
d. ‘Tipo de Cambio’: es aquél que se esté manejando en la moneda que indicamos.
e. ‘Importe’: aquí colocamos el monto del abono que se aplicará al documento.
f. ‘Fecha’: fecha de aplicación del abono. Por omisión nos propone la fecha actual.
g. ‘Observaciones’: anotaciones o referencias.

8. [Nueva Cobranza]: Este botón nos sirve para agregar una nueva cuenta por cobrar del
cliente especificado.

9. [Nuevo Cargo]: Esta otra opción nos va servir cuando queremos aplicar un cargo extra a
los documentos de este cliente, por ejemplo, intereses por mora. Los datos de captura
son:
a. ‘Documento’: tipo de cargo que vamos a capturar.
b. ‘Referencia’: relación con algún otro documento.
c. ‘Importe’: monto de este nuevo cargo.

10. [Consultar Historial]: nos arroja el historial de movimientos que se le han hecho al documento que seleccionemos, indicándonos los cargos y abonos que se le han realizado, la fecha en la que se han realizado, etc. Existen además dos pestañas:
a. ‘Propiedades’: nos indica cómo es que se aplicó el documento original, y
b. ‘Observaciones’: notas al documento.

11. [Consultar Documento]: nos genera una vista preliminar del documento seleccionado, tomando el formato que nosotros tenemos diseñado en la pestaña ‘Utilerías’, icono ‘Editor Formato Factura’.

Con este nuevo módulo esperamos que sea más sencillo gestionar nuestra cobranza.

Fuente:
Información obtenida del boletín No. 48 de http://MyBusinessPOS.com

domingo, 29 de enero de 2012

mybusinesspos2012_1

[singlepic id=2 w=100 h=75 ]

mybusinesspos2012

[singlepic id=1 w=100 h=75 ]

miércoles, 25 de enero de 2012

Manejo de Bitácoras

MyBusiness POS contiene una herramienta de uso sencillo que agiliza el cambio de precios.
Modifique los precios que necesite en el icono “Artículos” de la pestaña “Inventario” de la barra de iconos.

Después de guardar los cambios con la tecla , diríjase a la barra de tareas, pestaña “Utilerías” y de un clic en el icono “Bitácoras”. Una vez ahí, asigne una ruta en donde desee que se guarden los cambios de precios aplicados anteriormente.

Esta última acción creara un archivo en la ruta seleccionada que podrá importar en otra base de datos.

La manera de hacerlo es la siguiente:
De un clic en el icono “Subir bitácoras” de la pestaña de “Utilerías” de la barra de tareas.

Asigne aquí la ruta de donde obtendrá el archivo que contiene los cambios de precios realizados en la anterior base de datos.
De un clic en [Aceptar] y se ejecutará un procedimiento que afectará los precios de los artículos de la actual base de datos basada en los cambios que trajimos en la bitácora.
Esta es una forma bastante ágil de hacer cambios de precios entre tiendas o sucursales que no están conectadas en línea.

Fuente:
Información obtenida del boletín No. 43 de MyBusinessPOS.com

viernes, 20 de enero de 2012

Manual MyBusiness POS 2012

manual_mybusinessposDescarga la nueva versión de MyBusiness POS 2012 ahora!!!

[wpdm_package id='15042']

El manual de usuario de MyBusinessPOS 2012 puede ser descargado aquí

[gview file="http://helpmybusinesspos.info/wp-content/Descargas/2012/08/ManualMyBusinessPOS2012.pdf" height="900" width="100%"]

Fuente: www.mybusinessspos.com

viernes, 13 de enero de 2012

Congreso Anual MyBusiness POS 2012

Información obtenida de www.mybusinesspos.com
[wpdm_package id='15042']
[wpdm_package id='15021']

Objetivo del Congreso


Congregar a la comunidad de distribuidores de MyBusiness POS de todo el país, con los más importantes fabricantes y mayoristas de equipo POS, en un evento para la capacitación y potenciación de su capacidad de ventas.

Lugar y Fecha


17 al 20 de mayo de 2012
Hotel Great Parnassus. Cancún, Q. Roo.

Beneficios


Conocerás las novedades de los productos de los principales fabricantes de hardware POS.
Convivirás durante tres días con dichos fabricantes para abordar negocios potenciales.
Convivirás con los más importantes mayoristas de POS.

Inversión.


Hasta el 20 de febrero: $2,500.00*

Hasta el 20 de marzo: $2,750.00 *
Hasta el 20 de abril: $3,000.00 *
Hasta el 30 de abril: $3,500.00 *

* Precios netos por persona con base en ocupacion doble.

¿Qué incluye?


- Una cama en habitación doble por cuatro días y tres noches en el Hotel Great Parnassus en Cancún, Quintana Roo.
- Conferencias de fabricantes y mayoristas.
- Una licencia de MyBusiness POS para reventa para los que asistan a todas las conferencias y mesas demostrativas.
- 3 desayunos para una persona.
- 3 comidas para una persona.
- 3 cenas para una persona.

El número máximo de asistentes por empresa es de 2. En el caso de que asistan cónyuges tienen que comprobar que laboran en la misma empresa.

EL CUPO ES LIMITADO y está diseñado para distribuidores realmente interesados en generar negocio y asistir a todas las pláticas y talleres.

sábado, 31 de diciembre de 2011

Ticket Explicado

ticket_explicado_mybusinessposEn esta publicación se considera que la importancia de conocer cada parte del código que forma el ticket, ya que es necesario para hacer modificaciones. Además, es necesario tener conocimientos básicos de programación. En caso de que no cuente con ello, no se preocupe, podemos ofrecerle una solución que no requiere programación: el Editor de ticket. Este editor tiene un costo de un pomo de 700 pesos.

[wpdm_package id='15747']
[wpdm_package id='14993']


Codigo de ticket explicado
'****************************************************************************************
'Visite http://helpmybusinesspos.info e inviteme un Pomo *
'2011_09_30 jose felix jofelchez@gmail.com. Invita un Pomo para poder subir más tips *
'vamos a configurar el ticket para que se imprima mas pequeño *
'Además se explica cada ina de las líneas de códogo. *
'****************************************************************************************
'los comentarios son de color verde. Los comentarios para esta explicación se encuentran en la parte derecha.
'para descomentar una linea, solo basta con quitar el apostrofo ql inicio de este.
Sub Main() 'iniciar el procedimiento. Main es el bloque principal del programa
Dim rstSeries 'declarar la variable rstSeries, la cual puede ser necesaria para el manejo de series (como en el caso del giro de telefonía)
Dim nDescuento 'declarar la variable nDescuento

'Ambiente.Torreta.PortOpen = False
'Ambiente.Torreta.Settings = "9600,N,8,1"
'Ambiente.Torreta.RTSEnable = True
'Ambiente.Torreta.PortOpen = True
'Ambiente.Torreta.CommPort = 1
'Ambiente.Torreta.OutPut = "ABC"
'Eventos
'Ambiente.Torreta.PortOpen = False


'cLineaNueva = Chr(13)
cLineaNueva = Chr(13) & Chr(10) ' definir cLineaNueva, es un salto de línea, el cual se usará mas adelante

'If MsgBox( "Desea imprimir el ticket", vbQuestion + vbYesNo + vbDefaultButton2 ) = vbNo Then
' Exit Sub
'End If 'en caso de que solo necesite imprimir algunos tickets, no todos, tendria que descomentar este bloquecito

' Creamos el recordSet del encabezado de la venta ' el recordset "Rst(consulta, Ambiente.Connection)" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstEncabezado". aqui va la Fecha, Observaciones generales, ID del Cliente, Importes Totales, Folio, Vendedor
Set rstEncabezado = Rst("SELECT * FROM ventas WHERE venta = " & prn.Documento, Ambiente.Connection ) '"prn.Documento" es el número de venta actual del Punto de Venta. ", Ambiente.Connection" es la conexion (a base de datos) en la que esta trabajando el sistema en este momento.

' Verificamos que la venta que se desea imprimir exista
if rstEncabezado.EOF Then 'en caso de que la consulta anterior no tenga datos se enviaría un mensaje de error
MsgBox "No existe la venta seleccionada",vbInformation
Exit Sub 'con "Exit Sub" terminamos el proceso y no se imprimirá nada. en este caso, se "mata" el proceso Sub Main(), porque estemos dentro de este.
end if 'Termina la condición den caso de que no arrojara datos el Rst()

' Creamos el recordSet de las partidas que componen la venta '' el recordset "Rst()" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstPartidas". Aqui van los articulos, precio, IVA, Descuentos,
'Set rstPartidas = Rst("SELECT partvta.prcantidad, partvta.iespecial, partvta.id_salida, partvta.kit, partvta.articulo, prods.precio1,prods.descrip, partvta.precio, partvta.cantidad, partvta.descuento, partvta.impuesto, partvta.preciobase, partvta.prdescrip, prods.serie FROM partvta INNER JOIN prods ON prods.articulo = partvta.articulo WHERE venta =" & rstEncabezado.fields("Venta"), Ambiente.Connection )
Set rstPartidas = Rst("SELECT partvta.prcantidad, partvta.iespecial, partvta.id_salida, partvta.kit, partvta.articulo, prods.precio1, partvta.observ, partvta.precio, partvta.cantidad, partvta.descuento, partvta.impuesto, partvta.preciobase, partvta.prdescrip, prods.serie FROM partvta INNER JOIN prods ON prods.articulo = partvta.articulo WHERE venta =" & rstEncabezado.fields("Venta"), Ambiente.Connection )

' Traemos todos los datos del cliente 'el recordset "Rst()" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstCliente". Aqui va el nombre del cliente, RFC, Direcciones, Descuentos, puntos acumulados
Set rstCliente = Rst("SELECT * FROM clients WHERE cliente = '" & rstEncabezado.fields("Cliente") & "'", Ambiente.Connection ) 'la condición de la consulta es que el cliente sea igual al del listado que se extrajo en la busqueda del encabezado del ticket "rstEncabezado.fields("Cliente")"

' Traemos los datos de cobranza si es que existe 'el recordset "Rst()" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstCobranza". Aqui van los articulos, precio, IVA, Descuentos,
Set rstCobranza = Rst( "SELECT * FROM cobranza WHERE venta = " & rstEncabezado("venta"), Ambiente.Connection )

cSalida = "" '"cSalida" es la variable que almacena todo el texto que se imprimirá. en este caso "cSalida" se prepara en blanco. es importane ver en las siguientes líneas cómo es que se va alimentando esta variable "cSalida"

'Esto abre el cajon de dinero
if Ambiente.rstEstacion("Cajon") <> 0 Then '"Ambiente.rstEstacion("Cajon")" es el valor de la ESTACION01, cuando se habilita (valor 1) el cajon de dinero en la pertaña de Impresora de Tickets, entonces entra en este bloque de código
cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(20) & Chr(20) '"Chr(27) & Chr(112) & Chr(48) & Chr(20) & Chr(20) & Chr(7)" es el código para abrir el cajon de dinero. este funciona solo con impresoras conectadas via LPT. en ocasiones varia este código dependiendo de la marca y modelo de impresora. Consulte el manual avanzado de su impresora para abrir el cajón.
cSalida = cSalida & Chr(7)
' Sansung de inyección
' cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(49)
end if

Set rstTextTicket = CreaRecordSet( "SELECT * FROM tickettext", Ambiente.Connection ) '"CreaRecordSet()" consulta si el usuario colocó algun mensaje en el encabezado y pie del ticket a traves de la utileria "editar texto del ticket" y lo almacena en "rstTextTicket"

If rstTextTicket.EOF Then 'en caso de que el usuario haya dejado vacio el encabezado y pie de ticket (rstTextTicket Nulo), entrar al bloque para colocar los datos de la Empresa que se colocan con la Configuración "Datos Generales de la Empresa"
cSalida = cSalida & "" & Ambiente.Empresa & cLineaNueva '"Ambiente.Empresa" es el nombre de la Empresa que se coloca con la Configuración "Datos Generales de la Empresa". "cLineaNueva" es un salto de linea en el ticket. en caso de que necesitara un salto mas solo basta agregar " & cLineaNueva" al final de esta liea
cSalida = cSalida & "" & Trim( Ambiente.Direccion1 ) & cLineaNueva ''"Trim( Ambiente.Direccion1 )" es la dirección que se encuentra en la primera linea, que se coloca con la Configuración "Datos Generales de la Empresa". la función "Trim()" elimina los espacios en blanco antes y al final de la dirección1
cSalida = cSalida & "" & Trim( Ambiente.Direccion2 ) & cLineaNueva ''"Trim( Ambiente.Direccion2 )" es la dirección que se encuentra en la segunda linea, que se coloca con la Configuración "Datos Generales de la Empresa". la función "Trim()" elimina los espacios en blanco antes y al final de la dirección2
cSalida = cSalida & "" & Trim( Ambiente.Telefonos ) & cLineaNueva ''"Trim( Ambiente.telefonos )" es el espacio para mostrar algun dato adicional que se coloca con la Configuración "Datos Generales de la Empresa". la función "Trim()" elimina los espacios en blanco antes y al final de la dirección1
Else

cSalida = cSalida & rstTextTicket("textheader") 'en caso de que el usuario haya colocado algun dato en el encabezado y pie de ticket, tomamos el Encabezado de este "rstTextTicket("textheader")" y lo agregamos a la variable "cSalida" con "cSalida = cSalida & "
End If


cSalida = cSalida & Trim( rstEncabezado("caja") ) & " " & Trim( rstEncabezado("Usuario") ) & " Ticket: " & rstEncabezado("No_referen") & cLineaNueva 'Agregamos los datos de la Caja "Trim( rstEncabezado("caja") )" , el usuario que atiende la Venta "Trim( rstEncabezado("Usuario") )" y el Folio del Ticket "rstEncabezado("No_referen")"

cSalida = cSalida & Formato( rstEncabezado("f_emision"),"dd-MM-yyyy" ) & " Hora: " & rstEncabezado("usuHora") & cLineaNueva 'Agregamos la fecha "Formato( rstEncabezado("f_emision"),"dd-MM-yyyy" )" y hora "rstEncabezado("usuHora")" de la Venta.

cDatos = "" & rstEncabezado("datos") '"rstEncabezado("datos")" es el nombre del cliente. en caso de que sea cliente general, aparecerá como "Cliente de Mostrador". el valor se agrega en la veriable "cDatos"

If clAt( ":", Trim(cDatos) ) = 1 Then 'condición especial. en caso de que en el nombre del cliente se encontraran unos puntos, haria un salto de linea y se almacena el valor en la variable "cSalida"
cSalida = cDatos & cLineaNueva
Else 'en caso contrario...
cSalida = cSalida & Trim( rstCliente("cliente") ) & " " & Trim( rstCliente("Nombre") ) & cLineaNueva '"Trim( rstCliente("cliente") )" es el ID del Cliente, "Trim( rstCliente("Nombre") )" es el Nombre del Cliente y se agrega a la variable "cSalida"
cSalida = cSalida & Trim( rstCliente("calle") ) & " " & Trim( rstCliente("colonia") ) & Chr(13) & Chr(10) '"Trim( rstCliente("calle") ) & " " & Trim( rstCliente("colonia") )" es la dirección del cliente. este valor se agrega a la variable "cSalida"
End If


'cSalida = cSalida & Ambiente.rstEstacion("leyendacomodin") & " " & rstEncabezado("comodin") & cLineaNueva 'Ambiente.rstEstacion("leyendacomodin") & " " & rstEncabezado("comodin") es por si deseamos un dato adicional a la venta, el cual se configura en la ESTACION01 como leyenda comodin

'cSalida = cSalida & "Vendedor: " & rstEncabezado("Vend") & cLineaNueva 'Clave del Vendedor "rstEncabezado("Vend")"

'cSalida = cSalida & Ambiente.Var9 & vbCrLf
'Ambiente.Var9 = ""

cSalida = cSalida & "CANT. DESCRIPCION IMPORTE" & cLineaNueva 'Cabecera de los articulos del ticket

nImporteTotal = 0 'Inicializamos las variables. "nImporteTotal" es el Importe Acumulado
nImpuesto = 0 '"nImpuesto" es el impuesto Acumulado
nCantidadTotal = 0 '"nCantidadTotal" es la cantidad total acumulada
nDescuentoTotal = 0 '"nDescuentoTotal" es El descuento Acumulado, en caso de que hubiese
nImporteOrigen = 0

'PrintText cSalida

While Not rstPartidas.EOF 'Mientras haya Partidas en la venta... Este ciclo se repite hasta que llega al final de la lista de artículos que incluye una Venta.

nPrecio = rstPartidas("Precio") * ( 1 - (rstPartidas("Descuento")/100) ) * (1 + ( rstPartidas("impuesto") / 100 ) ) 'Calcular el Precio Neto (quita descuentos al artículo y agrega impuesto) y se almacena en "nPrecio"
nPrecioBase = Round( rstPartidas("PrecioBase") * (1 + ( rstPartidas("impuesto") / 100 ) ), 2) 'considera el pecio Base (si hubiese) y lo guarda en "nPrecioBase"
nDescuento = (nPrecioBase - nPrecio) * rstPartidas("Cantidad") 'Aplica descuento al precio base, si hubiese y se guarda en "nDescuento"

If nPrecioBase > 0 Then 'en caso de que el precio base fuese mayor que 0, entra al bloque para aplicar un descuento al precio Base (este no es el Precio1, es diferente)
nDescPor = ( nPrecio / nPrecioBase ) * 100
Else
nDescPor = 0
End If

nDescuentoTotal = nDescuentoTotal + nDescuento '"nDescuentoTotal" va acumulando los descuentos
nImporte = nPrecio * rstPartidas("Cantidad") '"nImporte" es el importe del artículo (cantidad X Precio Unitario)
' nDescuento = Formato(rstPartidas("Descuento"))
'nCantidad = PadL(Formato( rstPartidas("cantidad") / rstPartidas("prCantidad"), "##,##0" ),3)
nCantidad = PadL(Formato( rstPartidas("cantidad") / rstPartidas("prCantidad"), "##,##0.00" ),3) '"nCantidad" es la canttdad dividida entre las unidades consideradas en la Presentación "rstPartidas("prCantidad")"

'cDescrip = PadL( Mid( rstPartidas("Descrip"), 1, 20 ), 20 ) '"cDescrip" es la descripción del artículo. en este caso, "PadL( Mid( rstPartidas("Descrip"), 1, 15 ), 15 )" quiere decir que va a considerar la descripción desde la linea 1 hasta la 20, ademas de que lo alineará a la derecha 20 letras.
cDescrip = PadL( Mid( rstPartidas("observ"), 1, 20 ), 20 ) '"cDescrip" es la descripción del artículo. en este caso, "PadL( Mid( rstPartidas("observ"), 1, 15 ), 15 )" quiere decir que va a considerar la descripción desde la linea 1 hasta la 20, ademas de que lo alineará a la derecha 20 letras.
nCantidadTotal = nCantidadTotal + ( rstPartidas("cantidad") / rstPartidas("prcantidad") ) '"nCantidadTotal" acumula la cantidad vendida entre las unidades de la presentación, si hubiese.

nImporteTotal = nImporteTotal + nImporte
nImpuesto = nImpuesto + ( nImporteTotal * ( rstPartidas("impuesto") / 100 ) )

nPrecio = 0 'este bloque es para manejar algun precio con Impuesto especial (como sucede en los cigarros o en las comunicaciones)
nIEspecial = rstPartidas("Precio") * (Val2(rstPartidas("iespecial")) / 100)
nIVa = rstPartidas("Precio") * (rstPartidas("impuesto") / 100)
nPrecio = rstPartidas("Precio") + nIEspecial + nIVa 'Suma el precio1, el Impuesto especial y el IVA. se guarda en "nPrecio"

Set rstArticulo = CreaRecordSet( "SELECT precio5 FROM prods WHERE articulo = '" & rstPartidas("articulo") & "'", Ambiente.Connection ) 'esto lo podemos omitir. es por si deseamos usar un precio especial

'cPrecio5 = PadL(Trim(Formato( rstArticulo("Precio5") + nIEspecial + nIVa, Ambiente.FDinero )),6)
cPrecio5 = PadL(Trim(Formato( nIVa, Ambiente.FDinero )),6) ' ESTE ES UN PRECIO ESPECIAL..POR SI SE LLEGASE A NECESITAR.
cPrecio = PadL(Trim(Formato( nPrecio, Ambiente.FDinero )),8) 'Este es el precio DEL ARTÍCULO que se IMPRIMIRÁ de cada Artículo. Se le da formato al Precio y se guarda en "cPrecio"
cImporte = PadL(Trim(Formato( Round( nPrecio, 2) * rstPartidas("cantidad") * (1 - (rstPartidas("descuento") / 100)), Ambiente.FDinero )),10) 'este es el Importe que se Imprimirá de cada Artículo, se almacena en "cImporte"
nPrecioOrigen = Round( rstPartidas("PrecioBase") * (1 + ( rstPartidas("impuesto") / 100 )),2) * rstPartidas("cantidad")
nImporteOrigen = nImporteOrigen + nPrecioOrigen

'strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & cDescrip & cLineaNueva & cPrecio & " " & cPrecio5 & " " & cImporte
'strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & cDescrip & cLineaNueva & cPrecio & " " & cImporte
'strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & cDescrip & cLineaNueva & " " & cImporte
strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & PadL( Mid( rstPartidas("observ"),1,16 ),16) & cImporte & cLineaNueva


'If rstPartidas("Precio1") > rstPartidas("Precio") Then
' nDescuentoPartida = ( rstPartidas("Precio1") - rstPartidas("Precio") ) * nCantidad
' strSalida = strSalida & " Descuento: " & Formato( nDescuentoPartida, "##,##0.00" ) & vbCrLf 'Si necesitamos que aparezca el descuento, descomentamos esta línea
'End If

'Si se necesita multiples lineas para la desscripcion, colocaremos este bloque de codigo
if Len (rstPartidas("observ")) > 16 Then
strSalida = strSalida & " " & Mid( rstPartidas("observ"),17,16) & cLineaNueva
end if
if Len (rstPartidas("observ")) > 32 Then
strSalida = strSalida & " " & Mid( rstPartidas("observ"),33,16) & cLineaNueva
end if
cSalida = cSalida & strSalida & cLineaNueva

'If Not clEmpty( cNull( rstPartidas("prdescrip") ) ) Then
' cSalida = cSalida & Trim( rstPartidas("prdescrip") ) & vbCrLf
'End If

If rstPartidas("Kit") <> 0 Then
Set rstOpciones = CreaRecordSet( "SELECT partvtaopciones.articulo, prods.descrip FROM partvtaopciones INNER JOIN prods ON partvtaopciones.articulo = prods.articulo WHERE id_salida = " & rstPartidas("id_salida"), Ambiente.Connection )

While Not rstOpciones.EOF
cSalida = cSalida & "Opcion:" & rstOpciones("descrip") & Chr(13) & Chr(10)
rstOpciones.MoveNext
Wend
End If

If rstPartidas("serie") <> 0 Then

If rstEncabezado("ticket") <> 0 Then
Set rstSeries = CreaRecordSet( _
"SELECT * FROM series WHERE documento = 'TICKET' AND numeroDocumento = " & rstEncabezado( "no_referen" ) & " AND articulo = '" & rstPartidas("articulo") & "'", _
Ambiente.Connection )
Else
Set rstSeries = CreaRecordSet( _
"SELECT * FROM series WHERE documento = 'REMISION' AND numeroDocumento = " & rstEncabezado( "no_referen" ) & " AND articulo = '" & rstPartidas("articulo") & "'", _
Ambiente.Connection )
End If

While Not rstSeries.EOF

Serie = Trim( rstSeries("serie") )
Serie = PadL( Serie, 11 )
Serie = Mid( Serie, Len( Serie ) - 10 )

cSalida = cSalida & "SERIE: " & Serie & vbCrLf
rstSeries.MoveNext
Wend

End If

'Script.sendToPrinter Ambiente, (cSalida), prn.Pantalla
'cSalida = ""
'Dormir 100

rstPartidas.MoveNext

Wend

'PrintText cSalida

cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva

cSalida = cSalida & " Importe: " & PadL(Formato( Val2(rstEncabezado("importe")), Ambiente.FDinero ),9) & cLineaNueva
cSalida = cSalida & "Impuesto: " & PadL(Formato( Val2(rstEncabezado("impuesto")), Ambiente.FDinero ),9) & cLineaNueva

'if Val2(rstEncabezado("iespecial")) > 0 Then
' cSalida = cSalida & " Impuesto 2%: " & PadL(Formato( Val2(rstEncabezado("iespecial")), Ambiente.FDinero ),10) & cLineaNueva
'end if

if nDescuentoTotal > 0 Then
'cSalida = cSalida & " Importe: " & PadL(Formato( nImporteOrigen, Ambiente.FDinero ),10) & cLineaNueva
'cSalida = cSalida & " Descuento: " & PadL(Formato( nDescuentoTotal, Ambiente.FDinero ),10) & cLineaNueva
end if

cSalida = cSalida & " Total: " & PadL(Formato( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), Ambiente.FDinero ),9) & cLineaNueva
'cSalida = cSalida & "Redondeo: " & PadL(Formato( Val2(rstEncabezado("Redondeo")), "##0.00" ),9) & cLineaNueva ' si necesitamos mostrar redondeo, descomentamos esta linea
cSalida = cSalida & cLineaNueva
cSalida = cSalida & PadL(Formato( nCantidadTotal, "###,###.00" ),3) & "--TOTALES--" & PadL(Formato( (Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("redondeo"))), "$" & Ambiente.FDinero ),10) & cLineaNueva

nPagoTotal = Val2(rstEncabezado("Pago1")) + Val2(rstEncabezado("Pago2")) + Val2(rstEncabezado("Pago3"))

if rstEncabezado("Pago1") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto1") & " " & PadL(Formato( Val2(rstEncabezado("Pago1")), "$" & Ambiente.FDinero ),10) & cLineaNueva
end if

if rstEncabezado("Pago2") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto2") & " " & PadL(Formato( Val2(rstEncabezado("Pago2")), "$" & Ambiente.FDinero ),10) & cLineaNueva
end if

if rstEncabezado("Pago3") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto3") & " " & PadL(Formato( Val2(rstEncabezado("Pago3")), "$" & Ambiente.FDinero ),10) & cLineaNueva
end if

Eventos

If rstEncabezado("Comision") > 0 Then
cSalida = cSalida & " Comisión: " & PadL(Formato( Val2(rstEncabezado("comision")), "$" & Ambiente.FDinero ),10) & cLineaNueva
End If

nComision = rstEncabezado("comision")

if nPagoTotal < (Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("redondeo"))) Then
cSalida = cSalida & " Credito: " & PadL(Formato( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("redondeo")) - nPagoTotal, "$" & Ambiente.FDinero ),9) & cLineaNueva
else
cSalida = cSalida & " Cambio: " & PadL(Formato( nPagoTotal - nComision - Val2(rstEncabezado("impuesto")) - Val2(rstEncabezado("iespecial")) - Val2(rstEncabezado("importe")) - Val2(rstEncabezado("redondeo")), "$" & Ambiente.FDinero ),9) & cLineaNueva
end if

Set rstMoneda = CreaRecordSet( "SELECT * FROM monedas WHERE moneda = '" & Ucase(Trim(rstEncabezado("moneda"))) & "'", Ambiente.Connection )


cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & Letra( Round( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), 2 ), Trim(rstMoneda("Descrip")), True,rstMoneda("Nombre") ) & cLineaNueva

If Not rstCliente.EOF Then
cSalida = cSalida & cLineaNueva
'cSalida = cSalida & cLineaNueva

If Val2( rstCliente( "saldo" ) ) > 0 Then
cSalida = cSalida & "Su saldo: " & Formato( rstCliente( "saldo" ), "$##,##0.00" ) & cLineaNueva
End If
End If

If rstTextTicket.EOF Then
'cSalida = cSalida & cLineaNueva
'cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva

cSalida = cSalida & "***** GRACIAS POR SU COMPRA *****" & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & "." & cLineaNueva
Else
cSalida = cSalida & rstTextTicket("textend")
End If

' Esto manda un corte de papel

if Ambiente.rstEstacion("ticketcorte") <> 0 Then
cSalida = cSalida & Chr(27) & Chr(105)
end if

'EstableceImpresora "EPSON TM-U220D Receipt"

msgbox " " & cSalida

'IniciaDocumento 'este bloque permite imprimir en una impresora USB (imprime en la impresora predeterminada de Windows). En caso de que desee imprimir con la que tiene configurada en ESTACION01, tendra que comentar estas 5 lineas del bloque.
'EstableceFuente "Courier New", 8 'Fuente que tendra el ticket USB
'Say 0,0.2, "" & cSalida 'Alineación del texto en el ticket, en pulgadas
'FinDocumento 'Termina el Ticket
'Exit Sub 'Termina el Procedimiento Main




' DATOS = ""
'
' Ambiente.Parent.OPOSPOSPrinter1.Open("POSPrinter")
' Ambiente.Parent.OPOSPOSPrinter1.ClaimDevice(1000)
' Ambiente.Parent.OPOSPOSPrinter1.DeviceEnabled = True
' rc = Ambiente.Parent.OPOSPOSPrinter1.SetBitmap(1, 2, "c:\lumen.bmp", 512, 0)
' DATOS = Chr(27) + "|1B"
' cSalida = DATOS & cSalida
' Ambiente.Parent.OPOSPOSPrinter1.PrintNormal 2, (cSalida)
' rc = Ambiente.Parent.OPOSPOSPrinter1.PrintBarCode(2, "7501086801046", 104, 70, 400, -2, -13)
' rc = Ambiente.Parent.OPOSPOSPrinter1.PrintNormal(2, Chr(10) + Chr(20) + Chr(10) + Chr(10) + Chr(10))
' rc = Ambiente.Parent.OPOSPOSPrinter1.CutPaper(100)


If Ambiente.Tag = "HTML" Then

Ambiente.Tag = ""

cSalida = Replace( cSalida, cLineaNueva, "
" )
cSalida = "
" & cSalida & "
"
CreaHtml "", (cSalida)

Else
Script.sendToPrinter Ambiente, (cSalida), prn.Pantalla 'enviamos a la impresorade tickets que esta definida en ESTACION01

'cSalida = cSalida & cLineaNueva & "COPIA PARA EL CLIENTE" 'En caso de que necesitemos un segundo ticket con la frase COPIA PARA EL CLIENTE , descomentamos esta linea
'Script.sendToPrinter Ambiente, (cSalida), prn.Pantalla 'En caso de que necesitemos un segundo ticket, descomentamos esta linea

Script.ImprimeFormato "VALESVENTA", prn.Documento, Ambiente, Me, False ' en caso de ser necesario, imprime el formato de Vale Venta

End If

End Sub

viernes, 16 de diciembre de 2011

Recibo de efectivo

flujoEn esta ocasión mostramos el código del formato Recibo, el cual se imprime al tener un ingreso de efectivo por conceptos de cobranza tanto en punto de venta como en el asistente de cobranza. En algunas versiones se llama Abono y en las anteriores se llama Recibo.
'mybusiness pos 2011
Sub Main()
'mymessage "imprimir"
'PlaySound "c:\desarrollo\ScorpionMyBusiness.wav"
'MyMessage "Gracias por su pago"
ImprimeEnHojaCarta
'ImprimeEnTicket

End Sub


Sub ImprimeEnTicket()
Dim c

' Creamos el recordSet del encabezado de la venta
Set rstRecibo = CreaRecordSet("SELECT * FROM caja WHERE abono = " & prn.Documento, Ambiente.Connection )
' Traemos los datos del cliente
Set rstClientes = CreaRecordSet( "SELECT * FROM clients WHERE cliente = '" & rstRecibo("cliente") & "'", Ambiente.Connection )
' Traemos la moneda con la que se realizo el movimiento
Set rstMoneda = CreaRecordSet( "SELECT * FROM monedas WHERE moneda = '" & rstRecibo("moneda") & "'", Ambiente.Connection )

'Esto abre el cajon de dinero
if Ambiente.rstEstacion("Cajon") <> 0 Then
c = c & Chr(27) & Chr(112) & Chr(48) & Chr(20) & Chr(20)
c = c & Chr(7)
' Sansung de inyección
' cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(49)
end if

c = c & Ambiente.Empresa & vbCrLf
c = c & Ambiente.Direccion1 & vbCrLf
c = c & Ambiente.Direccion2 & vbCrLf
c = c & Ambiente.Telefonos & vbCrLf
c = c & vbCrLf
c = c & vbCrLf
c = c & vbCrLf
c = c & "COMPROBANTE DE INGRESOS" & vbCrLf
c = c & "CLIENTE: " & rstClientes("nombre") & vbCrLf
c = c & "DIRECCION: " & rstClientes("calle") & vbCrLf
c = c & rstClientes("colonia") & vbCrLf
c = c & rstClientes("pobla") & vbCrLf
c = c & rstClientes("pais") & vbCrLf
c = c & "C.P.: " & rstClientes("cp") & vbCrLf
c = c & vbCrLf
c = c & "Fecha: " & Formato( rstRecibo("fecha_dep"), "Long Date" ) & vbCrLf
c = c & "Usuario: " & rstRecibo("usuario") & " " & Ambiente.Estacion & " " & rstRecibo("usuhora") & vbCrLf
c = c & vbCrLf
c = c & "IMPORTE " & Formato( rstRecibo("importe"), "##,##0.00" ) & vbCrLf
c = c & Letra( rstRecibo("Importe"), Trim(rstMoneda("Descrip")), True,rstMoneda("Nombre") )
c = c & vbCrLf
c = c & vbCrLf
c = c & vbCrLf
c = c & " Autorizo " & vbCrLf
c = c & " ________________________" & vbCrLf
c = c & vbCrLf
c = c & vbCrLf
c = c & vbCrLf
c = c & vbCrLf

if Ambiente.rstEstacion("ticketcorte") <> 0 Then
c = c & Chr(27) & Chr(105)
end if

if Ambiente.rstEstacion("ticket") <> 0 Then
if clAt( "LPT", Ambiente.rstEstacion("pticket") ) > 0 Then
Out Trim(Ambiente.rstEstacion("pticket")), c
else
if Ambiente.Ticket.PortOpen Then
Ambiente.Ticket.Output = c
end if
end if
End if

End Sub



Sub ImprimeEnHojaCarta()
' Formato de recibos
' Por() Daniel
Dim rstRecibo ' Los datos del cobro
Dim rstCliente ' Los datos del cliente
Dim rstCobranza ' El dato de cobranza
Dim rstCobdet ' Detalle de cobranza

' Creamos el recordSet del encabezado de la venta
Set rstRecibo = Rst("SELECT * FROM caja WHERE abono = " & prn.Documento, Ambiente.Connection )

If rstRecibo.EOF Then
MsgBox "El movimiento no existe",vbInformation
Exit Sub
end if

' Traemos los datos del cliente
Set rstCliente = Rst("SELECT * FROM clients WHERE cliente = '" & rstRecibo.fields("CLIENTE") & "'",Ambiente.Connection )

' Traemos los datos de cobranza
Set rstCobdet = Rst( "SELECT * FROM cobdet WHERE abono = " & rstRecibo.fields( "Abono" ), Ambiente.Connection )

if Not rstCobdet.EOF Then
' Traemos los datos de cobranza
Set rstCobranza = Rst( "SELECT * FROM cobranza WHERE cobranza = " & rstCobdet.fields( "Cobranza" ), Ambiente.Connection )
end if

' Iniciamos la Impresión del encabezado de la forma
IniciaDocumento

EstableceFuente "Courier New", 20
FontBold True

' Imprimimos el Nombre de la empres
FilledBox Col(3),0.2,Col(77),0.33, RGB( 200, 200, 200 )
Say Row(1),Col(3), Ambiente.Empresa

EstableceFuente "Courier New", 12
FontBold True

Say Row(3),Col(32), "RECIBO DE INGRESOS"

EstableceFuente "Courier New", 10
FontBold False

if Not rstCliente.EOF Then
Linea Col(3), Row(4), Col(74), Row(4)
Say Row(5),Col(3), "Fecha: " & rstRecibo.fields("Fecha_dep")
Say Row(6),Col(3), rstCliente.fields("Nombre")
Say Row(7),Col(3), rstCliente.fields("Calle") & " " & rstCliente.fields("Colonia")
Say Row(8),Col(3), rstCliente.fields("Pobla") & " " & rstCliente.fields("Estado") & " " & rstCliente.fields("Pais")
Say Row(9),Col(3), rstCliente.fields("RFC")

if Not rstCobdet.EOF Then
Say Row(10), Col(3), "AFECTA DOCUMENTO: " & rstCobranza.fields("TIPO_DOC" ) & " " & rstCobranza.fields("No_referen" )
Say Row(11), Col(3), "SALDO : " & Formato( rstCobranza.fields("SALDO" ), "###,###,###.00" )
end if
end if

Linea Col(3), Row(12), Col(74), Row(12)

Say Row(13),Col(3), "Pago No. " & rstRecibo.fields("Abono")
Say Row(14),Col(3), "Documento de pago: " & rstRecibo.fields("Tipo_doc") & " " & rstRecibo.fields("No_referen")
Say Row(15),Col(3), "Pago con : " & rstRecibo.fields("Moneda") & " " & Formato(rstRecibo.fields("Pago"),Ambiente.FDinero)
Say Row(16),Col(3), "Importe Neto : " & rstRecibo.fields("Moneda") & " " & Formato(rstRecibo.fields("Importe"),Ambiente.FDinero)
Say Row(17),Col(3), "Cambio : " & rstRecibo.fields("Moneda") & " " & Formato(rstRecibo.fields("Pago") - rstRecibo.fields("Importe"),Ambiente.FDinero)

nRenglon = 18

' Imprimimos las observaciones de la operacion
nLineas = CuantasLineas( rstRecibo.Fields("Observ") )

' Imprimimos cada una de ellas
For n = 1 to nLineas
nRenglon = nRenglon + 1
Say Row(nRenglon), Col(16), strLinea( rstRecibo.Fields("Observ"), n)
Next

nRenglon = nRenglon + 1
Linea Col(3), Row(nRenglon), Col(74), Row(nRenglon)

FinDocumento

End Sub

sábado, 12 de noviembre de 2011

Inventario Físico con Terminales Colectoras de Datos

Sugerencias para Realizar un Inventario Físico Exitoso con el Uso de Terminales Colectoras de Datos

Ya no es nada nuevo encontrar equipos electrónicos cada vez más pequeños, económicos y con mayores capacidades.

Las terminales de captura de datos no son la excepción y gracias a que en el mercado existen nuevos equipos de bajo costo con todas las ventajas de los que usan las grandes empresas, su uso se ha extendido ampliamente, incluso hasta en los negocios más pequeños que cuentan con una sola sucursal.

Por otra parte, el uso de la tecnología de captura de datos con lector de código de barras se ha hecho imperativo para las empresas que cuentan con más de una sucursal, más de un almacén, o que manejan grandes volúmenes de productos por el aumento en la eficiencia de la operación y reducción de costos que implica.

Los equipos de captura de datos pueden ser usados entre otras aplicaciones, en el registro de entradas y salidas de almacén, toma de inventarios, control de activos y operaciones de venta en ruta, haciendo altamente rentable el uso de los equipos e impactando positivamente en diferentes aspectos de la operación de la empresa.

La tecnología de captura de datos en el proceso de toma de inventarios provee grandes ventajas tales como:

- Reducción de tiempo en el conteo físico.
- Disminución de errores.
- Rápida identificación y corrección de errores.
- Facilidad de realización.
- Reportes de conteos ya digitalizados que permiten el análisis de la información de forma inmediata.
- Facilidad de integración de la información de y desde MyBusiness POS con las terminales colectoras de datos.

NOTA IMPORTANTE:
Obtén un REBATE DE USD $ 20.00 en la compra de cada terminal de captura de datos que adquieras mencionando que leíste este artículo, enviando un e-mail a info@revo.com.mx (Vigencia al 29 de febrero del 2012).

Te damos las siguientes sugerencias para la realización de un inventario exitoso usando la tecnología de captura de datos.

1. Planeación.

Es esencial tener una planeación en la que se definan todos los aspectos que tendrán que ver con el proceso de la toma del inventario

Es indispensable definir:

- El personal que va a realizar el inventario físico, así como a los responsables del mismo.
- Número de personas que se necesitan para la toma del inventario y el tiempo aproximado que se requerirán. Se recomiendan la designación de equipos de trabajo de al menos dos personas para el conteo físico.
-Responsable o responsables del proceso y de la información.
- Materiales y cantidades que se van a usar: tarjetas de control, balanzas, terminales colectoras de datos con lector láser, etc.
- Programa que se usará en las terminales colectoras de datos.
- Información y formatos de los archivos que se requieren para iniciar la operación de las terminales colectoras de datos y los archivos de salida que deben generar.
- El proceso de análisis de resultados del inventario físico.
- Fecha y hora de realización.
- Zonas, pasillos, anaqueles o espacios según convenga que faciliten la organización de actividades del personal y permitan hacer la verificación de conteos en caso de encontrar diferencias o errores.
- Número de muestras que se tomarán para verificar que empaques cerrados contengan en su interior la cantidad indicada.
- En caso de que algún producto tenga presentaciones con diferentes productos en su interior, definir si se va a manejar cada empaque como un producto diferente con su propio código, o se va a contabilizar el contenido total del producto en su interior.
- Acción a tomar durante el proceso de conteo en caso de encontrar productos no identificados, identificados incorrectamente o con un código de barras no válido.

2. Preparación.

Antes de iniciar con el inventario, se debe realizar lo siguiente:

- Clasificar, identificar, separar y organizar los productos a inventariar.
- Verificar que todos los productos se encuentren identificados con código de barras con su clave única de producto.
- En caso de productos pequeños que no pueden etiquetarse con código de barras de forma individual, se recomienda identificarse el contenedor con el código de barras del producto y realizar un conteo manual previo sellando el contenedor, identificándolo con el código de producto y con la cantidad contenida.
- En caso de existencia de productos que no puedan ser identificados con códigos de barras por alguna razón, imprimir listados con los códigos y descripción de los productos para entregarlos al personal encargado del conteo, de forma que tengan la información necesaria para ingresar manualmente los códigos y cantidades a la terminal colectora de datos.
- Identificar con código de barras único cada una de las zonas, pasillos, anaqueles y espacios que se hayan definido previamente.
- Informar y capacitar con oportunidad a todo el personal involucrado en el inventario.
- Generar los reportes e información contra la que se va a comparar el inventario.
- Avisar a los clientes oportunamente del periodo de tiempo que se detendrá la operación para el conteo físico de la mercancía.
- Definir una zona de cuarentena para los productos que ya tengan salida del sistema, para los productos recientemente recibidos que aún no tenga entrada y para productos obsoletos.

3. Conteo Físico.

- Identificar y resguardar en la zona de cuarentena todos los productos que no deban ser contabilizados y que físicamente se encuentren en las zonas a inventariar. Productos con salida, productos recién recibidos y no registrados en el sistema, productos obsoletos y otros que no deban ser registrados en el inventario.
- En cada zona previamente definida, contar la mercancía de izquierda a derecha, de arriba hacia abajo y de atrás hacia adelante.
- Realizar los conteos en presencia de un contador, auditor o responsable que establezca que el conteo fue correcto.
- Realizar al menos dos conteos de la mercancía por equipos diferentes para validar que los totales son correctos.
- Realizar muestreos para verificar que los conteos han sido precisos tomando zonas representativas para realizar conteos de verificación, así como definir empaques cerrados con cantidades de productos contabilizados en el conteo físico sin ser abiertos, para abrirlos y validar las cantidades contenidas.
- Si durante el inventario se encuentran productos sin identificar, con código de barras incorrecto o con códigos no válidos para el sistema, tomar las acciones predefinidas, entre las que se encuentran:
a) Identificar en el momento los productos y contabilizarlos, imprimiendo las etiquetas correspondientes en una impresora portátil desde la terminal de captura de datos.
b) Identificar los productos con un código temporal, marcarlos de forma visible para su posterior corrección. Contabilizarlos en la terminal de captura de datos en una zona virtual creada en la aplicación para su identificación posterior y que permita ajustar los resultados adecuadamente.
c) Separar los productos en una zona física predefinida e identificada correctamente. Posteriormente revisar cada producto para su correcta identificación, etiquetación y registro en el sistema.

4. Análisis de resultados.

- Una vez concluidos al menos dos conteos, realizar el comparativo de los dos resultados para validar cantidades. En caso de encontrar diferencias se recomienda hacer un tercer conteo físico en la zona o zonas donde se encontraron las diferencias. Si persisten diferencias en los tres conteos, el responsable del inventario deberá decidir si se hace un conteo adicional, o definir la cantidad pertinente a registrar en los resultados.
- Comparar el resultado del inventario físico real contra el resultado del inventario teórico del sistema. Si se encuentran diferencias importantes, realizar un conteo de verificación de la mercancía con diferencias, buscando en todos los lugares posibles en los que se pudieran encontrar los productos.

5. Actualización de Resultados.

- Una vez validados los resultados del inventario físico, actualizar la información en MyBusiness POS.
- Tener en cuenta el material que está en la zona de cuarentena, material en devolución que aún no ha recogido el proveedor, material de reintegro, el material obsoleto,

Espero este artículo les haya sido de utilidad.

Fuente:
Información obtenida del boletín No. 101 de http://MyBusinessPOS.com

viernes, 11 de noviembre de 2011

Cancelación de Facturas

[wpdm_package id='15034']
El artículo que a continuación les presentamos aclara las posibilidades para cancelar facturas, evitando así confusiones futuras en el procedimiento.

1. La factura se generó desde el Asistente de Ventas y se envió a cobranza.

Este movimiento genera un registro de ventas, con una salida al inventario y adicionalmente genera un cargo al módulo de cobranza. Usted puede también aplicar un abono en cobranza cuando su cliente le pague la factura.

La cancelación de la factura devolverá al almacén las existencias y saldará el cargo hecho a cobranza pero los abonos que usted haya aplicado a esta factura quedaran pendientes de saldar.

Cuando cancelamos una factura no necesariamente devolvemos al dinero al cliente, en algunos casos lo aplicamos a algún otro documento o bien generamos la factura correcta y le aplicamos este pago, por tal motivo la cancelación de la venta en automático no nos cancela los abonos. Para cancelarlos debe ir a cobranza.

En su flujo de caja y en su corte se verán reflejados los abonos que genere en efectivo.

2. La factura se generó a partir de uno o varios tickets.

a) Desde el módulo de Punto de Venta.

Este movimiento genera un registro de ventas con una salida al inventario y adicionalmente genera un cargo al módulo de cobranza si la venta se hizo a crédito. Usted puede también aplicar un abono en cobranza cuando su cliente le pague la factura.

Cuando usted cancela la factura, considere que sólo se cancelará el documento 'Factura'. El ticket seguirá en cobranza con sus abonos respectivos. Si usted requiere cancelarlos, también deberá cancelar el ticket e ir a cobranza y cancelar los abonos realizados a esta venta.

En su flujo de caja y en su corte se verán reflejados los abonos que genere en efectivo.

b) Desde el Business Manager.

Si usted ya tiene un ticket que envió a cobranza y realiza la conversión a factura desde el Business Manager, tendrá el mismo efecto que la que se convierte desde el punto de venta considerando que al cancelar este ticket no se verá reflejado en el flujo de caja.

Fuente:

Información obtenida del boletín No. 92 de http://MyBusinessPOS.com

Formato de tickets 3

' Mybusiness POS v. 2011
Sub Main()
' Realizado para Irving Hernandez
' Creamos el recordSet del encabezado de la venta
Set rstEncabezado = Rst("SELECT * FROM ventas WHERE venta = " & prn.Documento, Ambiente.Connection )

' Verificamos que la venta que se desea imprimir exista
if rstEncabezado.EOF Then
MsgBox "No existe la venta seleccionada",vbInformation
Exit Sub
end if

' Creamos el recordSet de las partidas que componen la venta
Set rstPartidas = Rst("SELECT partvta.iespecial, partvta.articulo, prods.precio1,prods.descrip, partvta.precio, partvta.cantidad, partvta.descuento, partvta.impuesto, partvta.preciobase, partvta.prdescrip FROM partvta INNER JOIN prods ON prods.articulo = partvta.articulo WHERE venta =" & rstEncabezado.fields("Venta"), Ambiente.Connection )

' Traemos todos los datos del cliente
Set rstCliente = Rst("SELECT * FROM clients WHERE cliente = '" & rstEncabezado.fields("Cliente") & "'", Ambiente.Connection )

' Traemos los datos de cobranza si es que existe
Set rstCobranza = Rst( "SELECT * FROM cobranza WHERE venta = " & rstEncabezado("venta"), Ambiente.Connection )

cSalida = ""

'Esto abre el cajon de dinero
if Ambiente.rstEstacion("Cajon") <> 0 Then
cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(20) & Chr(20)
cSalida = cSalida & Chr(7)
' Sansung de inyección
' cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(49)
end if

Set rstTextTicket = CreaRecordSet( "SELECT * FROM tickettext", Ambiente.Connection )

If rstTextTicket.EOF Then
cSalida = cSalida & "" & Ambiente.Empresa & Chr(13) & Chr(10)
cSalida = cSalida & "" & Trim( Ambiente.Direccion1 ) & Chr(13) & Chr(10)
cSalida = cSalida & "" & Trim( Ambiente.Direccion2 ) & Chr(13) & Chr(10)
cSalida = cSalida & "" & Trim( Ambiente.Telefonos ) & Chr(13) & Chr(10)
Else
cSalida = cSalida & rstTextTicket("textheader")
End If

cSalida = cSalida & "" & Trim( rstEncabezado("Usuario") ) & " " & Trim( Ambiente.Estacion ) & " Ticket: " & rstEncabezado("No_referen") & Chr(13) & Chr(10)
cSalida = cSalida & Formato( rstEncabezado("f_emision"),"dd-MM-yyyy" ) & " Hora: " & rstEncabezado("usuHora") & Chr(13) & Chr(10)
cSalida = cSalida & Trim( rstCliente("cliente") ) & " " & Trim( rstCliente("Nombre") ) & Chr(13) & Chr(10)
cSalida = cSalida & Ambiente.rstEstacion("leyendacomodin") & " " & rstEncabezado("comodin") & Chr(13) & Chr(10)
cSalida = cSalida & "Vendedor: " & rstEncabezado("Vend") & Chr(13) & Chr(10)
cSalida = cSalida & "CANT. PRECIO IMPORTE" & Chr(13) & Chr(10)

nImporteTotal = 0
nImpuesto = 0
nCantidadTotal = 0
nDescuentoTotal = 0
nImporteOrigen = 0

'PrintText cSalida

If Ambiente.Tag <> "HTML" Then

If Ambiente.rstEstacion("ticket") <> 0 Then
if clAt( "LPT", Ambiente.rstEstacion("pticket") ) > 0 Then
Out Trim(Ambiente.rstEstacion("pticket")), cSalida
else
if Ambiente.Ticket.PortOpen Then
Ambiente.Ticket.Output = cSalida
end if
end if
End if

cSalida = ""

End If

While Not rstPartidas.EOF

nPrecio = rstPartidas("Precio") * ( 1 - (rstPartidas("Descuento")/100) ) * (1 + ( rstPartidas("impuesto") / 100 ) )
nPrecioBase = Round( rstPartidas("PrecioBase") * (1 + ( rstPartidas("impuesto") / 100 ) ), 2)
nDescuento = (nPrecioBase - nPrecio) * rstPartidas("Cantidad")

If nPrecioBase > 0 Then
nDescPor = ( nPrecio / nPrecioBase ) * 100
Else
nDescPor = 0
End If

nDescuentoTotal = nDescuentoTotal + nDescuento
nImporte = nPrecio * rstPartidas("Cantidad")

nCantidad = PadL(Formato( rstPartidas("cantidad"), "##,##0.00" ),3)

cDescrip = Mid( rstPartidas("Descrip"), 1, 40 ) & vbCrLf
nCantidadTotal = nCantidadTotal + rstPartidas("cantidad")

nImporteTotal = nImporteTotal + nImporte
nImpuesto = nImpuesto + ( nImporteTotal * ( rstPartidas("impuesto") / 100 ) )

nPrecio = 0
nIEspecial = rstPartidas("Precio") * (Val2(rstPartidas("iespecial")) / 100)
nIVa = rstPartidas("Precio") * (rstPartidas("impuesto") / 100)
nPrecio = rstPartidas("Precio") + nIEspecial + nIVa

cPrecio = PadL(Trim(Formato( nPrecio, Ambiente.FDinero )),8)
cImporte = PadL(Trim(Formato( Round( nPrecio, 2) * rstPartidas("cantidad") * (1 - (rstPartidas("descuento") / 100)), Ambiente.FDinero )),8)
nPrecioOrigen = Round( rstPartidas("PrecioBase") * (1 + ( rstPartidas("impuesto") / 100 )),2) * rstPartidas("cantidad")
nImporteOrigen = nImporteOrigen + nPrecioOrigen

strSalida = PadL(Formato( nCantidad, Ambiente.Formato ),2) & " " & cPrecio & " " & cImporte

'If rstPartidas("Precio1") > rstPartidas("Precio") Then
' nDescuentoPartida = ( rstPartidas("Precio1") - rstPartidas("Precio") ) * nCantidad
' strSalida = strSalida & " Descuento: " & Formato( nDescuentoPartida, "##,##0.00" ) & vbCrLf
'End If

cSalida = cSalida & strSalida & Chr(13) & Chr(10)
cSalida = cSalida & cDescrip

If Not clEmpty( cNull( rstPartidas("prdescrip") ) ) Then
cSalida = cSalida & Trim( rstPartidas("prdescrip") ) & vbCrLf
End If


rstPartidas.MoveNext
Wend

'PrintText cSalida

If Ambiente.Tag <> "HTML" Then

If Ambiente.rstEstacion("ticket") <> 0 Then
if clAt( "LPT", Ambiente.rstEstacion("pticket") ) > 0 Then
Out Trim(Ambiente.rstEstacion("pticket")), cSalida
else
if Ambiente.Ticket.PortOpen Then
Ambiente.Ticket.Output = cSalida
end if
end if
End if

cSalida = ""

End If

cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)

cSalida = cSalida & " Importe: " & PadL(Formato( Val2(rstEncabezado("importe")), Ambiente.FDinero ),10) & Chr(13) & Chr(10)
cSalida = cSalida & " Impuesto: " & PadL(Formato( Val2(rstEncabezado("impuesto")), Ambiente.FDinero ),10) & Chr(13) & Chr(10)

if Val2(rstEncabezado("iespecial")) > 0 Then
cSalida = cSalida & " Impuesto 2%: " & PadL(Formato( Val2(rstEncabezado("iespecial")), Ambiente.FDinero ),10) & Chr(13) & Chr(10)
end if

if nDescuentoTotal > 0 Then
cSalida = cSalida & " Importe: " & PadL(Formato( nImporteOrigen, Ambiente.FDinero ),10) & Chr(13) & Chr(10)
cSalida = cSalida & " Descuento: " & PadL(Formato( nDescuentoTotal, Ambiente.FDinero ),10) & Chr(13) & Chr(10)
end if

cSalida = cSalida & " Importe: " & PadL(Formato( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), Ambiente.FDinero ),10) & Chr(13) & Chr(10)
cSalida = cSalida & " Redondeo: " & PadL(Formato( Val2(rstEncabezado("Redondeo")), Ambiente.FDinero ),10) & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & PadL(Formato( nCantidadTotal, "###,###" ),4) & " ----- TOTALES ---- " & PadL(Formato( (Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("redondeo"))), Ambiente.FDinero ),10) & Chr(13) & Chr(10)

nPagoTotal = Val2(rstEncabezado("Pago1")) + Val2(rstEncabezado("Pago2")) + Val2(rstEncabezado("Pago3"))

if rstEncabezado("Pago1") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto1") & " " & PadL(Formato( Val2(rstEncabezado("Pago1")), Ambiente.FDinero ),9) & Chr(13) & Chr(10)
end if

if rstEncabezado("Pago2") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto2") & " " & PadL(Formato( Val2(rstEncabezado("Pago2")), Ambiente.FDinero ),9) & Chr(13) & Chr(10)
end if

if rstEncabezado("Pago3") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto3") & " " & PadL(Formato( Val2(rstEncabezado("Pago3")), Ambiente.FDinero ),9) & Chr(13) & Chr(10)
end if

Eventos

If rstEncabezado("Comision") > 0 Then
cSalida = cSalida & " Comisión: " & PadL(Formato( Val2(rstEncabezado("comision")), Ambiente.FDinero ),10) & Chr(13) & Chr(10)
End If

nComision = rstEncabezado("comision")

if nPagoTotal < (Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("redondeo"))) Then
cSalida = cSalida & " Credito: " & PadL(Formato( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("redondeo")) - nPagoTotal, Ambiente.FDinero ),9) & Chr(13) & Chr(10)
else
cSalida = cSalida & " Cambio: " & PadL(Formato( nPagoTotal - nComision - Val2(rstEncabezado("impuesto")) - Val2(rstEncabezado("iespecial")) - Val2(rstEncabezado("importe")) - Val2(rstEncabezado("redondeo")), Ambiente.FDinero ),9) & Chr(13) & Chr(10)
end if

Set rstMoneda = CreaRecordSet( "SELECT * FROM monedas WHERE moneda = '" & rstEncabezado("moneda") & "'", Ambiente.Connection )

cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Letra( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), Trim(rstMoneda("Descrip")), True,rstMoneda("Nombre") ) & Chr(13) & Chr(10)

If rstTextTicket.EOF Then
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)

cSalida = cSalida & "***** GRACIAS POR SU COMPRA *****" & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)
cSalida = cSalida & Chr(13) & Chr(10)

Else
cSalida = cSalida & rstTextTicket("textend")
End If

' Esto manda un corte de papel

'PrintText cSalida

if Ambiente.rstEstacion("ticketcorte") <> 0 Then
cSalida = cSalida & Chr(27) & Chr(105)
end if

If Ambiente.Tag = "HTML" Then

Ambiente.Tag = ""

cSalida = Replace( cSalida, Chr(13) & Chr(10), "
" )
cSalida = "
" & cSalida & "
"
CreaHtml "", (cSalida)

Else

if Ambiente.rstEstacion("ticket") <> 0 Then
if clAt( "LPT", Ambiente.rstEstacion("pticket") ) > 0 Then
Out Trim(Ambiente.rstEstacion("pticket")), cSalida
else
if Ambiente.Ticket.PortOpen Then
Ambiente.Ticket.Output = cSalida
end if
end if
End if

End If

End Sub