private void fillMovements(placements placement)
        {
            if (placement != null)
            {
                movements = (from em in entities.placements_movements
                             join em2 in entities.countables_accounts
                             on em.account equals em2.id
                             where em.placement_id == placement.id
                             select em).ToList();
            }

            dgvMovements.DataSource = null;
            dgvMovements.DataSource = movements.Select(
                o => new
            {
                Column1 = ((countables_accounts)accounts.Where(e => e.id == o.account).First()).description,
                Column2 = o.movement_type,
                Column3 = o.amount
            }
                ).ToList();

            dgvMovements.Columns[0].HeaderText = "Cuenta";
            dgvMovements.Columns[1].HeaderText = "Tipo Movimiento";
            dgvMovements.Columns[2].HeaderText = "Monto";
            dgvMovements.AutoSizeColumnsMode   = DataGridViewAutoSizeColumnsMode.Fill;
        }
        public void setEntradaContable(placements placement)
        {
            this.placement      = placement;
            txtDescription.Text = placement.description;

            setCurrency(placement.currency_type);
            fillMovements(placement);
        }
        public void savePlacement(placements placement)
        {
            if (placement != null)
            {
                entities.placements.Add(placement);
            }

            entities.SaveChanges();
        }
        public void mayorize(placements placement)
        {
            var movements = (from em in entities.placements_movements
                             where em.placement_id == placement.id
                             select em).ToList();

            foreach (var movement in movements)
            {
                updateBalance(movement.account, movement.movement_type, movement.amount, false);
            }

            entities.SaveChanges();
        }
        private String validate(placements placement)
        {
            StringBuilder sb = new StringBuilder();

            foreach (var prop in placement.GetType().GetProperties())
            {
                if (prop.PropertyType == typeof(string))
                {
                    prop.SetValue(placement, ((string)prop.GetValue(placement)).Trim());
                }
            }

            if (placement.description.Length == 0)
            {
                sb.Append("- El campo descripción es obligatorio\n");
            }

            decimal totalDebito  = 0;
            decimal totalCredito = 0;

            foreach (var movement in movements)
            {
                if (movement.movement_type == "DB")
                {
                    totalDebito += movement.amount;
                }
                else
                {
                    totalCredito += movement.amount;
                }
            }

            if (totalCredito <= 0)
            {
                sb.Append("- El total de créditos debe ser mayor a 0\n");
            }

            if (totalDebito <= 0)
            {
                sb.Append("- El total de débitos debe ser mayor a 0\n");
            }

            if ((totalCredito - totalDebito) != 0)
            {
                sb.Append("- Los montos de débito y crédito no concuerdan\n");
            }

            return(sb.ToString());
        }
        public void setEntradaContable(placements placement, bool readOnly)
        {
            this.setEntradaContable(placement);
            // read only options to do
            txtDescription.ReadOnly = true;
            cbCurrency.Enabled      = false;

            lblAccount.Visible      = false;
            lblAmount.Visible       = false;
            lblMovementType.Visible = false;
            cbAccount.Visible       = false;
            cbMovementType.Visible  = false;
            btnAdd.Visible          = false;
            txtAmount.Visible       = false;

            btnCancel.Text    = "Cerrar";
            btnSave.Visible   = false;
            btnDelete.Visible = false;
        }
        private void btnDetails_Click(object sender, EventArgs e)
        {
            DataGridViewRow row = null;

            if (dgvPlacements.SelectedRows.Count == 1)
            {
                row = dgvPlacements.SelectedRows[0];
            }
            else if (dgvPlacements.SelectedCells.Count == 1)
            {
                int i = dgvPlacements.SelectedCells[0].RowIndex;
                row = dgvPlacements.Rows[i];
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar solo 1 asiento a visualizar",
                    "Información",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information
                    );
            }

            if (row != null)
            {
                EntradaContable tipoCuenta = EntradaContable.getInstance();
                int             id         = Int32.Parse(row.Cells[0].Value.ToString());
                placements      placement  = (from em in entities.placements
                                              where em.id == id
                                              select em).First();

                tipoCuenta.setEntradaContable(placement, true);
                tipoCuenta.Show();
                tipoCuenta.Focus();
            }
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            bool       created   = false;
            placements placement = new placements()
            {
                description   = txtDescription.Text,
                auxiliary_id  = 1,
                date          = DateTime.Now,
                currency_type = ((currencies_types)cbCurrency.SelectedItem).id,
                exchange_rate = ((currencies_types)cbCurrency.SelectedItem).exchange_rate,
                state         = "R"
            };

            String errors = validate(placement);

            if (errors.Length > 0)
            {
                MessageBox.Show(
                    errors,
                    "Error",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error
                    );
                return;
            }

            using (var transaction = entities.Database.BeginTransaction()) {
                try
                {
                    entities.placements.Add(placement);

                    foreach (var el in movements)
                    {
                        el.placement_id = placement.id;
                        entities.placements_movements.Add(el);
                    }
                    entities.SaveChanges();

                    MnjEntradaContable.getInstance().mayorize(placement);

                    transaction.Commit();
                    created = true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    transaction.Rollback();
                }
            };

            if (created)
            {
                MessageBox.Show(
                    "Asiento registrado con éxito",
                    "Información",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information
                    );

                MnjEntradaContable.getInstance().loadPlacements("");

                this.Close();
            }
            else
            {
                MessageBox.Show(
                    "El asiento no pudo ser registrado",
                    "Error",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error
                    );
            }
        }
        private void btnRevert_Click(object sender, EventArgs e)
        {
            DataGridViewRow row = null;

            if (dgvPlacements.SelectedRows.Count == 1)
            {
                row = dgvPlacements.SelectedRows[0];
            }
            else if (dgvPlacements.SelectedCells.Count == 1)
            {
                int i = dgvPlacements.SelectedCells[0].RowIndex;
                row = dgvPlacements.Rows[i];
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar solo 1 asiento a reversar",
                    "Información",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information
                    );
            }

            if (row != null)
            {
                int id = Int32.Parse(row.Cells[0].Value.ToString());

                placements placement = (from em in entities.placements
                                        where em.id == id
                                        select em).First();

                if (placement == null)
                {
                    MessageBox.Show(
                        "¡Asiento no encontrado!",
                        "Error",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error
                        );
                }
                else if (placement.state == "C")
                {
                    MessageBox.Show(
                        "¡Este asiento ha sido reversado!",
                        "Error",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error
                        );
                }
                else
                {
                    DialogResult revertIt = MessageBox.Show(
                        "¿Estas seguro que quieres realizar un reverso a esta entrada\n\nEstos cambios no se pueden deshacer?",
                        "Confirmar",
                        MessageBoxButtons.YesNoCancel,
                        MessageBoxIcon.Question
                        );

                    if (DialogResult.Yes == revertIt)
                    {
                        bool updated = false;

                        using (var transaction = entities.Database.BeginTransaction())
                        {
                            try
                            {
                                placement.state = "C";
                                entities.SaveChanges();
                                mayorize(placement, true);
                                transaction.Commit();
                                updated = true;
                            }
                            catch (Exception ex) {
                                Console.WriteLine(ex);
                                updated = false;
                                transaction.Rollback();
                            }
                        }

                        if (updated)
                        {
                            MessageBox.Show(
                                "¡Reverso realizado con exito!",
                                "Información",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information
                                );
                            loadPlacements("");
                        }
                        else
                        {
                            MessageBox.Show(
                                "¡Ha ocurrido un error, intente nuevamente más tarde!",
                                "Error",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error
                                );
                        }
                    }
                }
            }
        }