Pagar.cs
Nos vamos al código del formulario Pagar.cs y escribmos las siguientes líneas.
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GatoAbarrotero
{
public partial class frmPagar : Form
{
MySqlConnection conexion = new MySqlConnection("server=localhost;User id=admin;password=adminlara;database=puntodeventadb");
DataRow rowVenta;
private DataTable data = new DataTable();
public frmPagar(DataTable data)
{
InitializeComponent();
this.data = data;
}
}
}
A continuación hacemos doble click sobre el formulario.Esto es para hacer modal el formulario
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GatoAbarrotero
{
public partial class frmPagar : Form
{
MySqlConnection conexion = new MySqlConnection("server=localhost;User id=admin;password=adminlara;database=puntodeventadb");
DataRow rowVenta;
private DataTable data = new DataTable();
public frmPagar(DataTable data)
{
InitializeComponent();
this.data = data;
}
private void FrmPagar_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
// Remove the control box so the form will only display client area.
this.ControlBox = false;
}
}
}
Antes de iniciar el evento de cobrar tenemos que imprimir el ticket fiscal nos vamos ayudar con dos clases la primera se va llamar RawPrinterHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace GatoAbarrotero
{
class RawPrinterHelper
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOCINFOA
{
[MarshalAs(UnmanagedType.LPStr)]
public string pDocName;
[MarshalAs(UnmanagedType.LPStr)]
public string pOutputFile;
[MarshalAs(UnmanagedType.LPStr)]
public string pDataType;
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
// SendBytesToPrinter()
// When the function is given a printer name and an unmanaged array
// of bytes, the function sends those bytes to the print queue.
// Returns true on success, false on failure.
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
// How many characters are in the string?
dwCount = szString.Length;
// Assume that the printer is expecting ANSI text, and then convert
// the string to ANSI text.
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
// Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
}
}
La segunda clase seva a llamar Ticket.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace GatoAbarrotero
{
class Ticket
{
string ticket = "";
string parte1, parte2;
string impresora = "POS-58"; // nombre exacto de la impresora como esta en el panel de control
int max, cort;
public void LineasGuion()
{
ticket = "----------------------------------------\n"; // agrega lineas separadoras -
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
}
public void LineasAsterisco()
{
ticket = "****************************************\n"; // agrega lineas separadoras *
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
}
public void LineasIgual()
{
ticket = "========================================\n"; // agrega lineas separadoras =
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
}
public void LineasTotales()
{
ticket = " -----------\n"; ; // agrega lineas de total
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
}
public void EncabezadoVenta()
{
ticket = "Articulo Can P.Unit Importe\n"; // agrega lineas de encabezados
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
public void TextoIzquierda(string par1) // agrega texto a la izquierda
{
max = par1.Length;
if (max > 40) // **********
{
cort = max - 40;
parte1 = par1.Remove(40, cort); // si es mayor que 40 caracteres, lo corta
}
else { parte1 = par1; } // **********
ticket = parte1 + "\n";
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
public void TextoDerecha(string par1)
{
ticket = "";
max = par1.Length;
if (max > 40) // **********
{
cort = max - 40;
parte1 = par1.Remove(40, cort); // si es mayor que 40 caracteres, lo corta
}
else { parte1 = par1; } // **********
max = 40 - par1.Length; // obtiene la cantidad de espacios para llegar a 40
for (int i = 0; i < max; i++)
{
ticket += " "; // agrega espacios para alinear a la derecha
}
ticket += parte1 + "\n"; //Agrega el texto
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
public void TextoCentro(string par1)
{
ticket = "";
max = par1.Length;
if (max > 40) // **********
{
cort = max - 40;
parte1 = par1.Remove(40, cort); // si es mayor que 40 caracteres, lo corta
}
else { parte1 = par1; } // **********
max = (int)(40 - parte1.Length) / 2; // saca la cantidad de espacios libres y divide entre dos
for (int i = 0; i < max; i++) // **********
{
ticket += " "; // Agrega espacios antes del texto a centrar
} // **********
ticket += parte1 + "\n";
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
public void TextoExtremos(string par1, string par2)
{
max = par1.Length;
if (max > 18) // **********
{
cort = max - 18;
parte1 = par1.Remove(18, cort); // si par1 es mayor que 18 lo corta
}
else { parte1 = par1; } // **********
ticket = parte1; // agrega el primer parametro
max = par2.Length;
if (max > 18) // **********
{
cort = max - 18;
parte2 = par2.Remove(18, cort); // si par2 es mayor que 18 lo corta
}
else { parte2 = par2; }
max = 40 - (parte1.Length + parte2.Length);
for (int i = 0; i < max; i++) // **********
{
ticket += " "; // Agrega espacios para poner par2 al final
} // **********
ticket += parte2 + "\n"; // agrega el segundo parametro al final
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
public void AgregaTotales(string par1, double total)
{
max = par1.Length;
if (max > 25) // **********
{
cort = max - 25;
parte1 = par1.Remove(25, cort); // si es mayor que 25 lo corta
}
else { parte1 = par1; } // **********
ticket = parte1;
parte2 = total.ToString("c");
max = 40 - (parte1.Length + parte2.Length);
for (int i = 0; i < max; i++) // **********
{
ticket += " "; // Agrega espacios para poner el valor de moneda al final
} // **********
ticket += parte2 + "\n";
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
public void AgregaArticulo(string par1, int cant, double precio, double total)
{
if (cant.ToString().Length <= 3 && precio.ToString("c").Length <= 10 && total.ToString("c").Length <= 11) // valida que cant precio y total esten dentro de rango
{
max = par1.Length;
if (max > 16) // **********
{
cort = max - 16;
parte1 = par1.Remove(16, cort); // corta a 16 la descripcion del articulo
}
else { parte1 = par1; } // **********
ticket = parte1; // agrega articulo
max = (3 - cant.ToString().Length) + (16 - parte1.Length);
for (int i = 0; i < max; i++) // **********
{
ticket += " "; // Agrega espacios para poner el valor de cantidad
}
ticket += cant.ToString(); // agrega cantidad
max = 10 - (precio.ToString("c").Length);
for (int i = 0; i < max; i++) // **********
{
ticket += " "; // Agrega espacios
} // **********
ticket += precio.ToString("c"); // agrega precio
max = 11 - (total.ToString().Length);
for (int i = 0; i < max; i++) // **********
{
ticket += " "; // Agrega espacios
} // **********
ticket += total.ToString("c") + "\n"; // agrega precio
RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
}
else
{
MessageBox.Show("Valores fuera de rango");
RawPrinterHelper.SendStringToPrinter(impresora, "Error, valor fuera de rango\n"); // imprime texto
}
}
public void CortaTicket()
{
string corte = "\x1B" + "m"; // caracteres de corte
string avance = "\x1B" + "d" + "\x09"; // avanza 9 renglones
RawPrinterHelper.SendStringToPrinter(impresora, avance); // avanza
RawPrinterHelper.SendStringToPrinter(impresora, corte); // corta
}
public void AbreCajon()
{
string cajon0 = "\x1B" + "p" + "\x00" + "\x0F" + "\x96"; // caracteres de apertura cajon 0
// string cajon1 = "\x1B" + "p" + "\x01" + "\x0F" + "\x96"; // caracteres de apertura cajon 1
RawPrinterHelper.SendStringToPrinter(impresora, cajon0); // abre cajon0
//RawPrinterHelper.SendStringToPrinter(impresora, cajon1); // abre cajon1
}
}
}
Nos volvemos al formulario Pagar.cs[diseño] y hacemos doble click en el botón Cobrar
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GatoAbarrotero
{
public partial class frmPagar : Form
{
MySqlConnection conexion = new MySqlConnection("server=localhost;User id=admin;password=adminlara;database=puntodeventadb");
DataRow rowVenta;
private DataTable data = new DataTable();
public frmPagar(DataTable data)
{
InitializeComponent();
this.data = data;
}
private void FrmPagar_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
// Remove the control box so the form will only display client area.
this.ControlBox = false;
}
private void BtnCobrar_Click(object sender, EventArgs e)
{
decimal cambio;
string llaveUnica = Guid.NewGuid().ToString();
DateTime theDate = DateTime.Now;
string fecha = theDate.ToString("yyyy-MM-dd H:mm:ss");
int idVenta;
try
{
conexion.Open();
string insertarQuery = "INSERT INTO ventastotales (idventa,llaveventa,total,fecha) VALUES(null,?llaveventa,?total,?fecha)";
MySqlCommand cmd = new MySqlCommand(insertarQuery, conexion);
cmd.Parameters.Add("?llaveventa", MySqlDbType.VarChar, 100).Value = llaveUnica;
cmd.Parameters.Add("?total", MySqlDbType.Decimal, 60).Value = txtTotal.Text;
cmd.Parameters.Add("?fecha", MySqlDbType.DateTime, 60).Value = fecha;
cmd.ExecuteNonQuery();
conexion.Close();
}
catch
{
MessageBox.Show("Inserción fallida");
}
try
{
conexion.Open();
string selectQuery = "SELECT idventa FROM ventastotales WHERE llaveventa ='" + llaveUnica + "' ";
MySqlCommand cmd = new MySqlCommand(selectQuery, conexion);
MySqlDataAdapter selecionnar = new MySqlDataAdapter();
selecionnar.SelectCommand = cmd;
DataTable datosVentas = new DataTable();
selecionnar.Fill(datosVentas);
rowVenta = datosVentas.Rows[0];
idVenta = Convert.ToInt32(rowVenta["idventa"]);
//MessageBox.Show(Dt.Rows.Count.ToString());
foreach (DataRow row in data.Rows)
{
int cantidad = Convert.ToInt32(row["Cantidad"]);
decimal totalVenta = cantidad * Convert.ToDecimal(row["PrecioU"]);
string insertarQuery = "INSERT INTO ventasdetalle (idventa,cantidad,total,codigoBarras) " +
"VALUES(@idventa,@cantidad,@total,@codigo)";
MySqlCommand cmd2 = new MySqlCommand(insertarQuery, conexion);
cmd2.Parameters.AddWithValue("@idventa", idVenta);
cmd2.Parameters.AddWithValue("@cantidad", cantidad);
cmd2.Parameters.AddWithValue("@total", totalVenta);
cmd2.Parameters.AddWithValue("@codigo", row[1].ToString());
cmd2.ExecuteNonQuery();
}
Ticket Ticket1 = new Ticket();
//Ticket1.AbreCajon(); //abre el cajon
Ticket1.TextoCentro("GATO ABARROTERO");
Ticket1.TextoCentro("Venta No." + idVenta);
Ticket1.TextoCentro("FECHA:" + fecha);// imprime en el centro "Venta mostrador"
Ticket1.LineasGuion(); // imprime una linea de guiones
Ticket1.EncabezadoVenta(); // imprime encabezados
foreach (DataRow row in data.Rows)
{
int cantidad = Convert.ToInt32(row["Cantidad"]);
double totalVenta = cantidad * Convert.ToDouble(row["PrecioU"]);
String producto = row["Producto"].ToString();
double precio = Convert.ToDouble(row["PrecioU"]);
Ticket1.AgregaArticulo(producto, cantidad, precio, totalVenta); //imprime una linea de descripcion
}
Ticket1.LineasTotales(); // imprime linea
Ticket1.AgregaTotales("Total", Convert.ToDouble(txtTotal.Text)); // imprime linea con total
//Ticket1.CortaTicket(); // corta el ticket
conexion.Close();
}
catch (MySqlException E)
{
MessageBox.Show(E.ToString());
}
cambio = Convert.ToDecimal(txtEfectivo.Text) - Convert.ToDecimal(txtTotal.Text);
txtCambio.Text = Convert.ToString(cambio);
}
}
}
Hacemos doble click en el Button Cerrar escribimos:
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GatoAbarrotero
{
public partial class frmPagar : Form
{
MySqlConnection conexion = new MySqlConnection("server=localhost;User id=admin;password=adminlara;database=puntodeventadb");
DataRow rowVenta;
private DataTable data = new DataTable();
public frmPagar(DataTable data)
{
InitializeComponent();
this.data = data;
}
private void FrmPagar_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
// Remove the control box so the form will only display client area.
this.ControlBox = false;
}
private void BtnCobrar_Click(object sender, EventArgs e)
{
decimal cambio;
string llaveUnica = Guid.NewGuid().ToString();
DateTime theDate = DateTime.Now;
string fecha = theDate.ToString("yyyy-MM-dd H:mm:ss");
int idVenta;
try
{
conexion.Open();
string insertarQuery = "INSERT INTO ventastotales (idventa,llaveventa,total,fecha) VALUES(null,?llaveventa,?total,?fecha)";
MySqlCommand cmd = new MySqlCommand(insertarQuery, conexion);
cmd.Parameters.Add("?llaveventa", MySqlDbType.VarChar, 100).Value = llaveUnica;
cmd.Parameters.Add("?total", MySqlDbType.Decimal, 60).Value = txtTotal.Text;
cmd.Parameters.Add("?fecha", MySqlDbType.DateTime, 60).Value = fecha;
cmd.ExecuteNonQuery();
conexion.Close();
}
catch
{
MessageBox.Show("Inserción fallida");
}
try
{
conexion.Open();
string selectQuery = "SELECT idventa FROM ventastotales WHERE llaveventa ='" + llaveUnica + "' ";
MySqlCommand cmd = new MySqlCommand(selectQuery, conexion);
MySqlDataAdapter selecionnar = new MySqlDataAdapter();
selecionnar.SelectCommand = cmd;
DataTable datosVentas = new DataTable();
selecionnar.Fill(datosVentas);
rowVenta = datosVentas.Rows[0];
idVenta = Convert.ToInt32(rowVenta["idventa"]);
//MessageBox.Show(Dt.Rows.Count.ToString());
foreach (DataRow row in data.Rows)
{
int cantidad = Convert.ToInt32(row["Cantidad"]);
decimal totalVenta = cantidad * Convert.ToDecimal(row["PrecioU"]);
string insertarQuery = "INSERT INTO ventasdetalle (idventa,cantidad,total,codigoBarras) " +
"VALUES(@idventa,@cantidad,@total,@codigo)";
MySqlCommand cmd2 = new MySqlCommand(insertarQuery, conexion);
cmd2.Parameters.AddWithValue("@idventa", idVenta);
cmd2.Parameters.AddWithValue("@cantidad", cantidad);
cmd2.Parameters.AddWithValue("@total", totalVenta);
cmd2.Parameters.AddWithValue("@codigo", row[1].ToString());
cmd2.ExecuteNonQuery();
}
Ticket Ticket1 = new Ticket();
//Ticket1.AbreCajon(); //abre el cajon
Ticket1.TextoCentro("GATO ABARROTERO");
Ticket1.TextoCentro("Venta No." + idVenta);
Ticket1.TextoCentro("FECHA:" + fecha);// imprime en el centro "Venta mostrador"
Ticket1.LineasGuion(); // imprime una linea de guiones
Ticket1.EncabezadoVenta(); // imprime encabezados
foreach (DataRow row in data.Rows)
{
int cantidad = Convert.ToInt32(row["Cantidad"]);
double totalVenta = cantidad * Convert.ToDouble(row["PrecioU"]);
String producto = row["Producto"].ToString();
double precio = Convert.ToDouble(row["PrecioU"]);
Ticket1.AgregaArticulo(producto, cantidad, precio, totalVenta); //imprime una linea de descripcion
}
Ticket1.LineasTotales(); // imprime linea
Ticket1.AgregaTotales("Total", Convert.ToDouble(txtTotal.Text)); // imprime linea con total
//Ticket1.CortaTicket(); // corta el ticket
conexion.Close();
}
catch (MySqlException E)
{
MessageBox.Show(E.ToString());
}
cambio = Convert.ToDecimal(txtEfectivo.Text) - Convert.ToDecimal(txtTotal.Text);
txtCambio.Text = Convert.ToString(cambio);
}
private void BtnCerrar_Click(object sender, EventArgs e)
{
frmPuntoVenta puntoVenta = new frmPuntoVenta();
puntoVenta.Show();
this.Hide();
}
}
}
Ahora nos vamos al formulario Menu.cs y copiamos un Button y en el texto ponemos Punto de Venta y lo nombramos btnPunto

Hacemos doble click sobre el botónPunto de venta
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GatoAbarrotero
{
public partial class frmMenu : Form
{
public frmMenu()
{
InitializeComponent();
}
private void BtnProductos_Click(object sender, EventArgs e)
{
this.Hide();
frmAgregarProducto agregarProdcuto = new frmAgregarProducto();
agregarProdcuto.Show();
}
private void BtnCodigo_Click(object sender, EventArgs e)
{
this.Hide();
frmCodigoBarras codigo = new frmCodigoBarras();
codigo.Show();
}
private void BtnPunto_Click(object sender, EventArgs e)
{
this.Hide();
frmPuntoVenta punto = new frmPuntoVenta();
punto.Show();
}
}
}
Probando
Corremos la aplicación:
Escaneamos algunos productos:

Presionamos pagar

Nos pagan 500 pesos en efectivo y presionamos Cobrar



