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