Mostrando entradas con la etiqueta Windows. Mostrar todas las entradas
Mostrando entradas con la etiqueta Windows. Mostrar todas las entradas

miércoles, 15 de julio de 2015

Impuesto Sobre la renta

Tassa de interes anual hasta el 2016 aplicado a la escala salarial en Republica Dominicana

Objetivo

Calcular la tasa de interes anual aplicado a la escala salarial de la Republica dominicana hasta el 2016:
1. Renta hasta RD$ 399,923.00                                         = Exento
2. Renta desde RD$ 399,923.01 hasta RD$ 599,884.00       = 15% del excedente de RD$ 399,923.01
3. Renta desde RD$ 599,884.01 hasta RD$ 833,171.00       = RD$29,994.00 mas el 20% del excedente de RD$ 599,884.01
4. Rentas desde RD$ 833,171.01 en adelante                    = RD$ 76,652.00 más el 25% del excedente de RD$ 833,171.01

Nota

Esta es una aplicacion de escritorio, pero puede ser facirmente aplicado a una aplicacion web

Vista previa

Vista Previa

Codigo C#

  private void button1_Click(object sender, EventArgs e)
        {
            double SueldoBruto = 0;                 // Sueldo bruto ingresado por el usuario.
            double ISR = 0;                         // Impuesto Sobre la Renta.
            const double AFP = 2.87;                // Administradoras de fondos de pensiones.
            const double ARL = 3.04;                // Administradora de riesgos laborales.

            const double LISR2 = 399923.01 / 12;    // Limite inferior de la escala 2.
            const double LISR3 = 599884.01 / 12;    // Limite inferior de la escala 3.
            const double LISR4 = 833171.01 / 12;    // Limite inferior de la escala 4.
            const double PCISR2 = 15.0  / 12;       // Porciento aplicado a la escala 2.
            const double PCISR3 = 20.0 / 12;        // Porciento aplicado a la escala 3.
            const double PCISR4 = 25.0 / 12;        // Porciento aplicado a la escala 4.
            const double incr3 = 29994.0 / 12;      // Valor fijo aplicado a la escala 3.
            const double incr4 = 76652.0 / 12;      // Valor fijo aplicado a la escala 4.         

            if ((double.TryParse(textBox1.Text, out SueldoBruto)))
            {
                // determinar el valor de ISR segun la escala salarial
                //No hay decuento, segun la escala 1
                if ((SueldoBruto <= LISR2))
                {
                    ISR += ISR;

                } // 15% anual, segun la escala 2
                else 
                {
                    double excedente;

                    if ((SueldoBruto <= LISR3))
                    {
                        // como es al excedente de LISR2, debemos hacer una resta con el sueldo
                        excedente = SueldoBruto - (LISR2);

                        // determino el descuento segun escala 2
                        ISR = (excedente * PCISR2) / 100;

                    } // 20% anual, , segun la escala 3
                    else 
                    {
                        if ((SueldoBruto <= LISR4))
                        {
                            // como es al excedente de LISR3, debemos hacer una resta con el sueldo
                            excedente = SueldoBruto - (LISR3);

                            // determino el descuento mas incr3, segun la escala 3
                            ISR = ((excedente * PCISR3 / 100) + (incr3));

                        } // 25% anual, , segun la escala 4
                        else
                        {
                            // como es al excedente de LISR4, debemos hacer una resta con el sueldo
                            excedente = SueldoBruto - (LISR4);

                            // determino el descuento mas incr4, segun la escala 4
                            ISR = ((excedente * PCISR4 / 100) + (incr4));
                        }
                    }
                }
                double SueldoNexto = SueldoBruto - (((SueldoBruto * AFP) / 100) + ((SueldoBruto * ARL) / 100) + (ISR));

                listBox1.Items.Clear();

                listBox1.Items.Add("Sueldo Bruto: \tRD$" + Convert.ToString(SueldoBruto));
                listBox1.Items.Add("AFP: \t\t" + Convert.ToString(AFP) + "%");
                listBox1.Items.Add("ARL: \t\t" + Convert.ToString(ARL) + "%");
                listBox1.Items.Add("ISR: \t\t" + Convert.ToString(ISR) + "%");
                listBox1.Items.Add("Total a descontar: \tRD$" + Convert.ToString(((SueldoBruto * AFP) / 100) + ((SueldoBruto * ARL) / 100) + (ISR)));
                listBox1.Items.Add("Sueldo Neto: \tRD$" + Convert.ToString(SueldoNexto));
            }
            else
            {
                MessageBox.Show("Ingrese sueldo");                
            }
        }
    

Codigo Visual basic

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim SueldoBruto As Double               REM Sueldo bruto ingresado por el usuario.
        Dim ISR As Double = 0                   REM Impuesto Sobre la Renta.
        Const AFP As Double = 2.87              REM Administradoras de fondos de pensiones.
        Const ARL As Double = 3.04              REM Administradora de riesgos laborales.

        Const LISR2 As Double = 399923.01 / 12  REM Limite inferior de la escala 2
        Const LISR3 As Double = 599884.01 / 12  REM Limite inferior de la escala 3
        Const LISR4 As Double = 833171.01 / 12  REM Limite inferior de la escala 4
        Const PCISR2 As Double = 15 / 12        REM Porciento aplicado a la escala 2
        Const PCISR3 As Double = 20 / 12        REM Porciento aplicado a la escala 3
        Const PCISR4 As Double = 25 / 12        REM Porciento aplicado a la escala 4
        Const incr3 As Double = 29994.0 / 12    REM Valor fijo aplicado a la escala 3
        Const incr4 As Double = 76652.0 / 12    REM Valor fijo aplicado a la escala 4

        If (Double.TryParse(TextBox1.Text, SueldoBruto)) Then
            REM determinar el valor de ISR segun la escala salarial
            If (SueldoBruto <= LISR2) Then 'No hay decuento, segun la escala 1
                ISR = ISR

            Else REM 15% anual, segun la escala 2
                Dim excedente As Double

                If (SueldoBruto <= LISR3) Then
                    REM como es al excedente de LISR1, debemos hacer una resta con el sueldo
                    excedente = SueldoBruto - (LISR2)

                    REM determino el descuento segun escala 2
                    ISR = (excedente * PCISR2) / 100

                Else REM 20% anual
                    If (SueldoBruto <= LISR4) Then
                        REM como es al excedente de LISR2, debemos hacer una resta con el sueldo
                        excedente = SueldoBruto - (LISR3)

                        REM determino el descuento mas incr1, segun la escala 3
                        ISR = ((excedente * PCISR3 / 100) + (incr3))

                    Else REM 25% anual
                        REM como es al excedente de LISR3, debemos hacer una resta con el sueldo
                        excedente = SueldoBruto - (LISR4)

                        REM determino el descuento mas incr2, segun la escala 4
                        ISR = ((excedente * PCISR4 / 100) + (incr4))
                    End If
                End If
            End If
            Dim SueldoNexto As Double = SueldoBruto - (((SueldoBruto * AFP) / 100) + ((SueldoBruto * ARL) / 100) + (ISR))

            ListBox1.Items.Clear()

            ListBox1.Items.Add("Sueldo Bruto: " + vbTab + vbTab + "RD$" + CStr(SueldoBruto))
            ListBox1.Items.Add("AFP: " + vbTab + vbTab + vbTab + CStr(AFP) + "%")
            ListBox1.Items.Add("ARL: " + vbTab + vbTab + vbTab + CStr(ARL) + "%")
            ListBox1.Items.Add("ISR: " + vbTab + vbTab + vbTab + CStr(ISR) + "%")
            ListBox1.Items.Add("Total a descontar: " + vbTab + vbTab + "RD$" + CStr(((SueldoBruto * AFP) / 100) + ((SueldoBruto * ARL) / 100) + (ISR)))
            ListBox1.Items.Add("Sueldo Neto: " + vbTab + vbTab + "RD$" + CStr(SueldoNexto))

        Else
            MessageBox.Show("Ingrese sueldo")
        End If
    End Sub
    

Descripcion del codigo

Todo el codigo va a estar contenido dentro de la estructura condicional

         If (Double.TryParse(TextBox1.Text, SueldoBruto)) Then

        Else
            MessageBox.Show("Ingrese sueldo")
        End If
    

donde el metodo  

        Double.TryParse(TextBox1.Text, SueldoBruto)    

va a evaluar el valor ingresado por el ususario en la caja de texto, de ser un valor valido hara la conversion al tipo Double y lo asignara a la
variable SueldoBruto, luego retornara un valor de true a la condiccion para que ejecute todo el codigo, de lo contrario enviara un mensaje para
que ingrese un valor valido.

Tambien podriamos hacer uso de: Instrucción Try...Catch...Finally (Visual Basic). Esta instrucción proporciona una manera de
controlar algunos o todos los errores posibles que pueden ocurrir en un bloque de código determinado mientras se
ejecuta el código. Si piensa que se puede producir una excepción determinada en una sección concreta del
código, incluya éste en un bloque Try y utilice un bloque Catch para conservar el control y tratar la excepción que se produce.

Descarga
C# VB

martes, 24 de enero de 2012

Marcar Accion Realizada en DataGridView

Objectivo
Marcar la accion realizada en las filas del DataGridView.

Vista Previa
Blogger
Requisito:
  • Visual Estudio 2008 o Superior
  • SQL Server Express 2005 o superior
Para realizar esta practica :
  • Agregue un projecto tipo WinForm.
  • Agregar una conexion a la base de datos con la que quiere interactual.
    Cómo: Conectarse a los datos de una base de datos.
  • Arrastre el objecto de datos con la que quiere trabajar desde la ventana Origen de Datos hacia el diseñador de formulario.
    Esto generara los objectos(BindingSource, DataSet, TableAdapter, TableAdapterManager y el BindingNavigator)
    necesario para poder realizar las operaciones(CRUD(Create, Read, Update, Delete)) en la grilla con impacto en la base de datos.
  • Deshabilito la funcionalidad de eliminacion del control bindingNavigatorDeleteItem del BindingNavigator.

Blogger
  • Agregue las imagenes que servirar como marcador para las filas.
Blogger
  • Agregamos una columna de tipo DataGridViewImageColumn en la posicion 0 de la coleccion de columnas de la grilla y seteamos algunas de sus propiedades
Blogger

Codigo C#
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace WindowsCS.Formularios
{
    public partial class GridMarkedActionForm : Form
    {
        DataTable table = new DataTable("TB1");

        public GridMarkedActionForm()
        {
            InitializeComponent();

            DoColumn("ID", "System.Int32", true, true);
            DoColumn("NameAccion", "System.String", false, false);
            DoColumn("Image", "System.Byte[]", false, false);
        }
                
        #region Metodos de ayuda
        private void DoColumn(string name, string type, bool unique, bool isprimary)
        {
            DataColumn column = new DataColumn(name);
            column.DataType = Type.GetType(type);
            column.Unique = unique;
            table.Columns.Add(column);

            if (isprimary)
            {
                DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = table.Columns[name];
                table.PrimaryKey = PrimaryKeyColumns;
            }
        }

        public byte[] ConvertImageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }

        public Image ConvertByteArrayToImage(int id)
        {
            MemoryStream ms = new MemoryStream((byte[])table.Rows.Find(id).ItemArray[2]);

            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

        public Image ConvertByteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }
        #endregion Metodos de ayuda

        #region EventHandler
        private void Form4_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'testDataSet.T1' Puede moverla o quitarla según sea necesario.
            this.t1TableAdapter.Fill(this.testDataSet.T1);

            foreach (DataGridViewRow row in t1DataGridView.Rows)
            {
                row.Cells[0].Value = null;
            }
        }

        private void t1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in t1DataGridView.Rows)
            {
                if (table.Rows.Contains(row.Cells[1].Value))
                {
                    if ((table.Rows.Find((int)row.Cells[1].Value).ItemArray[1]).ToString() == "Delete")
                    {
                        t1BindingSource.RemoveCurrent();
                    }
                }
            }

            this.Validate();
            this.t1BindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.testDataSet);

            foreach (DataGridViewRow row in t1DataGridView.Rows)
            {
                row.Cells[0].Value = null;
            }

            table.Clear();
        }

        private void t1BindingSource_ListChanged(object sender, ListChangedEventArgs e)
        {
            DataRow row = table.NewRow();
            switch (e.ListChangedType.ToString())
            {
                case "ItemChanged":
                    row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                    row["NameAccion"] = "Edit";
                    row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Edit);
                    table.Rows.Add(row);
                    t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Edit;
                    break;

                case "ItemAdded":
                    row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                    row["NameAccion"] = "Add";
                    row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Add);
                    table.Rows.Add(row);
                    t1DataGridView.Rows[e.NewIndex].Cells[0].Value = (System.Drawing.Image)Resource1.Add;
                    break;

                // movido al evento clic del boton eliminar, con el objectivo de eliminar esta 
                // caracteristica del bindingsource e implementarlo de forma manual.
                //case "ItemDeleted":
                //    
                //    break;


                /* 
                 // no implementado
                 case "ItemMoved":

                 break;   
                 */

                default:
                    break;
            }
        }

        private void t1DataGridView_Sorted(object sender, EventArgs e)
        {
            if (table.Rows.Count > 0)
            {
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    if (table.Rows.Contains((Convert.ToInt32(row.Cells[1].Value))))
                    {
                        row.Cells[0].Value = ConvertByteArrayToImage((Convert.ToInt32(row.Cells[1].Value)));
                    }
                }
            }
        }

        private void bindingNavigatorDeleteItem_Click_1(object sender, EventArgs e)
        {
            DataRow row = table.NewRow();
            row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
            row["NameAccion"] = "Delete";
            row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Delete);
            table.Rows.Add(row);
            t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Delete;
        }
        #endregion EventHandler
    }
}
            
Descripcion:
  1. Creamos una tabla a nivel de clase el cual nos servira como repositorio para almacenar aqui la acciones realizada en la grilla.
  2. En el constructor del formulario invocamos el metodo DoColumn() el cual crea una tabla con el siguiente ezquema:
    • Una columna ID de tipo entero el cual servira como PK de la tabla para almacenar la PK de la grilla
    • Una columna de tipo string llamada NameAction el cual almacenara el nombre de la accion realizada en la grilla , Sus posible valores son: Add, Delete, Update
    • Unaa columna llamada imagen que representa graficamente la accion realizada en la fila de la grilla
      public GridMarkedActionForm()
              {
                  InitializeComponent();
      
                  DoColumn("ID", "System.Int32", true, true);
                  DoColumn("NameAccion", "System.String", false, false);
                  DoColumn("Image", "System.Byte[]", false, false);
              }
  3. El Metodo DoColumn
  4. declara como parameros formales:
    • String que represente el nombre de la columna: name.
    • String que represente el tipo de dato de la columna: type; Eemplo, "System.String".
    • Valor Booleano que especifca la columna como unica dentro de la tabla: unique.
    • Valor Booleano para determinar si la columna a crear sera la PK de la tabla: isprimary.
    private void DoColumn(string name, string type, bool unique, bool isprimary)
            {
                DataColumn column = new DataColumn(name);
                column.DataType = Type.GetType(type);
                column.Unique = unique;
                table.Columns.Add(column);
    
                if (isprimary)
                {
                    DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                    PrimaryKeyColumns[0] = table.Columns[name];
                    table.PrimaryKey = PrimaryKeyColumns;
                }
            }
  5. El Metodo ConvertImageToByteArray() hace la conversion de System.Image a byte[] para almacenarla en la base de dato
  6. public byte[] ConvertImageToByteArray(System.Drawing.Image imageIn)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return ms.ToArray();
            }
  7. El Metodo ConvertByteArrayToImage(), recupera el byte[] de la base de dato hace la conversion a System.Image para asignarselo a la filas de la grilla.
  8. public Image ConvertByteArrayToImage(int id)
            {
                MemoryStream ms = new MemoryStream((byte[])table.Rows.Find(id).ItemArray[2]);
    
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
  9. En el Evento Load del formulario nos encargamos de que las filas tenga una imagen en blanco
  10. private void Form4_Load(object sender, EventArgs e)
            {
                // TODO: esta línea de código carga datos en la tabla 'testDataSet.T1' Puede moverla o quitarla según sea necesario.
                this.t1TableAdapter.Fill(this.testDataSet.T1);
    
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    row.Cells[0].Value = null;
                }
            }
  11. En el Evento Click del BindingNavigatorSaveItem colocamos el siguiente codigo, aqui es donde implementaremos la accion de eliminacion.:
    private void t1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
            {
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    if (table.Rows.Contains(row.Cells[1].Value))
                    {
                        if ((table.Rows.Find((int)row.Cells[1].Value).ItemArray[1]).ToString() == "Delete")
                        {
                            t1BindingSource.RemoveCurrent();
                        }
                    }
                }
    
                this.Validate();
                this.t1BindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.testDataSet);
    
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    row.Cells[0].Value = null;
                }
    
                table.Clear();
            }
    El cual se encarga de:
    • Procesar cada una de la fila de la grilla para verificar que el valor de la celda uno(1) el cual corresponde al PK de la grilla este contenido dentro de la tabla de repositorio; de ser cierto, busco dentro de la coleccion de fila de la tabla de repositorio la fila que contenga el valor especificado por medio del valor de la celda uno(1) que coresponde al valor de la PK de la grilla en la fila actual, descompongo la fila obtenida en cada uno de sus campos o columnas mediante el uso de DataRow.ItemArray (Propiedad) obtengo en valor del campo o columna uno(1) que corresponde al NameAction de la tabla y lo comparo con el NameAction == "Delete", de ser afirmativo procedemos a eliminar la fila actual de la grilla mediante la invocacion de BindingSource.RemoveCurrent (Método)
      foreach (DataGridViewRow row in t1DataGridView.Rows)
                  {
                      if (table.Rows.Contains(row.Cells[1].Value))
                      {
                          if ((table.Rows.Find((int)row.Cells[1].Value).ItemArray[1]).ToString() == "Delete")
                          {
                              t1BindingSource.RemoveCurrent();
                          }
                      }
                  }
    • Valido los controles modificado
      his.Validate();
    • Aplica los cambios pendientes al origen de datos subyacente
      this.t1BindingSource.EndEdit();
    • Envio todos los cambios al Dataset
      this.tableAdapterManager.UpdateAll(this.testDataSet);
    • Limpioi la imagen de la filas
      foreach (DataGridViewRow row in t1DataGridView.Rows)
                  {
                      row.Cells[0].Value = null;
                  }
    • Elimino los valores de la tabla
      table.Clear();
  12. En el Evento ListChanged del BindingSource colocamos el siguiente codigo:
    private void t1BindingSource_ListChanged(object sender, ListChangedEventArgs e)
            {
                DataRow row = table.NewRow();
                switch (e.ListChangedType.ToString())
                {
                    case "ItemChanged":
                        row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                        row["NameAccion"] = "Edit";
                        row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Edit);
                        table.Rows.Add(row);
                        t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Edit;
                        break;
    
                    case "ItemAdded":
                        row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                        row["NameAccion"] = "Add";
                        row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Add);
                        table.Rows.Add(row);
                        t1DataGridView.Rows[e.NewIndex].Cells[0].Value = (System.Drawing.Image)Resource1.Add;
                        break;
    
                    // movido al evento clic del boton eliminar, con el objectivo de eliminar esta 
                    // caracteristica del bindingsource e implementarlo de forma manual.
                    //case "ItemDeleted":
                    //    
                    //    break;
    
    
                    /* 
                     // no implementado
                     case "ItemMoved":
    
                     break;   
                     */
    
                    default:
                        break;
                }
            }
    En el cual testeamos ListChangedEventArgs.ListChangedType (Propiedad)  para obtener el tipo de cambio realizado en el control, creamos una nueva filas con el PK de la grilla, un NameAction == "a la accion corespondiente", su respectiva imagen y la agregamos a la coleccion de filas de la tabla de repositorio
  13. En el evento sorted de la grilla nos aseguramo de las imagenes se corespondan no importando por que columna se ordenen las filas, pero ante confirmamos que nuestra tabla de repositorio contenga filas esto no garantiza de que si hubo cambio en la grilla.
    private void t1DataGridView_Sorted(object sender, EventArgs e)
            {
                if (table.Rows.Count > 0)
                {
                    foreach (DataGridViewRow row in t1DataGridView.Rows)
                    {
                        if (table.Rows.Contains((Convert.ToInt32(row.Cells[1].Value))))
                        {
                            row.Cells[0].Value = ConvertByteArrayToImage((Convert.ToInt32(row.Cells[1].Value)));
                        }
                    }
                }
            }
  14. En el evento click del control bindingNavigatorDeleteItem del BindingNavigator, no eliminamos la filas sino mas bien, la marcamos con la imagen de eliminacion, pero antes creamos una nueva filas con el PK de la grilla, un NameAction == "Delete", y la imagen corespondiente a la eliminacion y la agregamos a la coleccion de filas de la tabla de repositorio
    private void bindingNavigatorDeleteItem_Click_1(object sender, EventArgs e)
            {
                DataRow row = table.NewRow();
                row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                row["NameAccion"] = "Delete";
                row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Delete);
                table.Rows.Add(row);
                t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Delete;
            }
  • Nos restaria Agregar Menu contextuales a las filas de la grilla para deshacer los cambios realizado por filas separada
  • Agregar al Toolbox los botones para Deshacer y Reahacer