private void btnInvoicePay_Click(object sender, EventArgs e)
        {
            var dbContext = AppVariables.getDbContext();
            var invoice   = dbContext.INVOICES.Find(this.CurrentInvoice.Id);

            try
            {
                if (invoice.PAID == 1)
                {
                    throw new Exception("Change is impossible, invoice paid.");
                }

                invoice.PAID = 1;
                // сохраняем изменения
                dbContext.SaveChanges();
                // перезагружаем изменённую запись
                CurrentInvoice.Load(invoice.INVOICE_ID);
                masterBinding.ResetCurrentItem();
            }
            catch (Exception ex)
            {
                // отображаем ошибку
                MessageBox.Show(ex.Message, "Error");
            }
        }
        private void btnEditInvoice_Click(object sender, EventArgs e)
        {
            // получение контекста
            var dbContext = AppVariables.getDbContext();
            // поиск сущности по идентификатору
            var invoice = dbContext.INVOICES.Find(this.CurrentInvoice.Id);

            if (invoice.PAID == 1)
            {
                MessageBox.Show("Change is impossible, invoice paid.", "Error");
                return;
            }

            using (InvoiceEditorForm editor = new InvoiceEditorForm())
            {
                editor.Text    = "Edit invoice";
                editor.Invoice = invoice;
                // Обработчик закрытия формы
                editor.FormClosing += delegate(object fSender, FormClosingEventArgs fe)
                {
                    if (editor.DialogResult == DialogResult.OK)
                    {
                        try
                        {
                            // пытаемся сохранить изменения
                            dbContext.SaveChanges();
                            // перезагружаем проекцию
                            CurrentInvoice.Load(invoice.INVOICE_ID);
                            masterBinding.ResetCurrentItem();
                        }
                        catch (Exception ex)
                        {
                            // отображаем ошибку
                            MessageBox.Show(ex.Message, "Error");
                            // не закрываем форму для возможности исправления ошибки
                            fe.Cancel = true;
                        }
                    }
                };
                // показываем модальную форму
                editor.ShowDialog(this);
            }
        }
        private void btnDeleteInvoiceLine_Click(object sender, EventArgs e)
        {
            var result = MessageBox.Show("Are you sure you want to delete the invoice item?",
                                         "Confirm",
                                         MessageBoxButtons.YesNo,
                                         MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                var dbContext = AppVariables.getDbContext();
                // получаем текущую счёт-фактуру
                var invoice = dbContext.INVOICES.Find(this.CurrentInvoice.Id);

                try
                {
                    // проверяем не оплачена ли счёт-фактура
                    if (invoice.PAID == 1)
                    {
                        throw new Exception("Remove is impossible, invoice paid.");
                    }
                    // создаём параметры ХП
                    var idParam = new FbParameter("INVOICE_LINE_ID", FbDbType.Integer);
                    // инициализируем параметры значениями
                    idParam.Value = this.CurrentInvoiceLine.Id;
                    // выполняем хранимую процедуру
                    dbContext.Database.ExecuteSqlCommand("EXECUTE PROCEDURE SP_DELETE_INVOICE_LINE(@INVOICE_LINE_ID)", idParam);

                    // обновляем гриды
                    // перезагрузка текущей записи счёт-фактуры
                    CurrentInvoice.Load(invoice.INVOICE_ID);
                    // перезагрузка всех записей детейл грида
                    LoadInvoiceLineData(invoice.INVOICE_ID);
                    // обновляем связанные даные
                    masterBinding.ResetCurrentItem();
                }
                catch (Exception ex)
                {
                    // отображаем ошибку
                    MessageBox.Show(ex.Message, "Error");
                }
            }
        }
        private void btnEditInvoiceLine_Click(object sender, EventArgs e)
        {
            var dbContext = AppVariables.getDbContext();
            // получаем текущую счёт-фактуру
            var invoice = dbContext.INVOICES.Find(this.CurrentInvoice.Id);

            // проверяем не оплачена ли счёт-фактура
            if (invoice.PAID == 1)
            {
                MessageBox.Show("Change is impossible, invoice paid.", "Error");
                return;
            }
            // получаем текущую позицию счёт-фактуры
            var invoiceLine = invoice.INVOICE_LINES
                              .Where(p => p.INVOICE_LINE_ID == this.CurrentInvoiceLine.Id)
                              .First();

            // создаём редактор позиции счёт фактуры
            using (InvoiceLineEditorForm editor = new InvoiceLineEditorForm())
            {
                editor.Text        = "Edit invoice line";
                editor.InvoiceLine = invoiceLine;

                // Обработчик закрытия формы
                editor.FormClosing += delegate(object fSender, FormClosingEventArgs fe)
                {
                    if (editor.DialogResult == DialogResult.OK)
                    {
                        try
                        {
                            // создаём параметры ХП
                            var idParam       = new FbParameter("INVOICE_LINE_ID", FbDbType.Integer);
                            var quantityParam = new FbParameter("QUANTITY", FbDbType.Integer);
                            // инициализируем параметры значениями
                            idParam.Value       = invoiceLine.INVOICE_LINE_ID;
                            quantityParam.Value = invoiceLine.QUANTITY;
                            // выполняем хранимую процедуру
                            dbContext.Database.ExecuteSqlCommand(
                                "EXECUTE PROCEDURE SP_EDIT_INVOICE_LINE(@INVOICE_LINE_ID, @QUANTITY)",
                                idParam,
                                quantityParam);
                            // обновляем гриды
                            // перезагрузка текущей записи счёт-фактуры
                            CurrentInvoice.Load(invoice.INVOICE_ID);
                            // перезагрузка всех записей детейл грида
                            LoadInvoiceLineData(invoice.INVOICE_ID);
                            // обновляем связанные даные
                            masterBinding.ResetCurrentItem();
                        }
                        catch (Exception ex)
                        {
                            // отображаем ошибку
                            MessageBox.Show(ex.Message, "Error");
                            // не закрываем форму для возможности исправления ошибки
                            fe.Cancel = true;
                        }
                    }
                };
                // показываем модальную форму
                editor.ShowDialog(this);
            }
        }