// INSERT DESPESA CARTAO
        //------------------------------------------------------------------------------------------------------------
        private void InsertDespesaCartao(objDespesaCartao desp, AcessoDados dbTran)
        {
            try
            {
                //--- clear Params
                dbTran.LimparParametros();

                //--- define Params
                dbTran.AdicionarParametros("@IDDespesa", desp.IDDespesa);
                dbTran.AdicionarParametros("@IDCartaoCredito", desp.IDCartaoCredito);
                dbTran.AdicionarParametros("@ReferenciaData", desp.ReferenciaData);
                dbTran.AdicionarParametros("@IDSituacao", desp.IDSituacao);

                //--- convert null parameters
                dbTran.ConvertNullParams();

                string query = dbTran.CreateInsertSQL("tblDespesaCartao");

                //--- insert
                dbTran.ExecutarManipulacao(CommandType.Text, query);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void mnuImagemVisualizar_Click(object sender, EventArgs e)
        {
            //--- check selected item
            if (dgvListagem.SelectedRows.Count == 0)
            {
                AbrirDialog("Favor selecionar um registro para Visualizar Imagem...",
                            "Selecionar Registro", DialogType.OK, DialogIcon.Information);
                return;
            }

            //--- get Selected item
            objDespesaCartao item = (objDespesaCartao)dgvListagem.SelectedRows[0].DataBoundItem;

            try
            {
                // --- Ampulheta ON
                Cursor.Current = Cursors.WaitCursor;
                ImagemUtil.ImagemVisualizar(item.Imagem);
            }
            catch (Exception ex)
            {
                AbrirDialog("Uma exceção ocorreu ao Visualizar a imagem..." + "\n" +
                            ex.Message, "Exceção", DialogType.OK, DialogIcon.Exclamation);
            }
            finally
            {
                // --- Ampulheta OFF
                Cursor.Current = Cursors.Default;
            }
        }
        // CONVERT ROW IN CLASS
        //------------------------------------------------------------------------------------------------------------
        public objDespesaCartao ConvertRowInClass(DataRow row)
        {
            var despesa = new objDespesaCartao((long)row["IDDespesa"])
            {
                DespesaDescricao = (string)row["DespesaDescricao"],
                IDCredor         = (int)row["IDCredor"],
                Credor           = (string)row["Credor"],
                DespesaData      = (DateTime)row["DespesaData"],
                IDDespesaTipo    = (int)row["IDDespesaTipo"],
                DespesaTipo      = (string)row["DespesaTipo"],
                DespesaValor     = (decimal)row["DespesaValor"],
                IDSetor          = (int)row["IDSetor"],
                Setor            = (string)row["Setor"],
                IDSituacao       = (byte)row["IDSituacao"],
                Situacao         = (string)row["Situacao"],
                IDCartaoCredito  = (int)row["IDCartaoCredito"],
                CartaoDescricao  = (string)row["CartaoDescricao"],
                VencimentoDia    = (byte)row["VencimentoDia"],
                ReferenciaData   = (DateTime)row["ReferenciaData"],
            };

            // SET IMAGEM
            despesa.Imagem.IDOrigem       = (long)despesa.IDDespesa;
            despesa.Imagem.Origem         = EnumImagemOrigem.Despesa;
            despesa.Imagem.ImagemFileName = row["ImagemFileName"] == DBNull.Value ? string.Empty : (string)row["ImagemFileName"];
            despesa.Imagem.ImagemPath     = row["ImagemPath"] == DBNull.Value ? string.Empty : (string)row["ImagemPath"];

            // RETURN
            return(despesa);
        }
        // CONSTRUCTOR WITH DESPESA
        //------------------------------------------------------------------------------------------------------------
        public frmDespesaCartao(objDespesaCartao despesa, Form formOrigem = null)
        {
            InitializeComponent();

            _formOrigem = formOrigem;
            ConstructorContinue(despesa);
        }
        private void mnuImagemRemover_Click(object sender, EventArgs e)
        {
            //--- check selected item
            if (dgvListagem.SelectedRows.Count == 0)
            {
                AbrirDialog("Favor selecionar um registro para Visualizar Imagem...",
                            "Selecionar Registro", DialogType.OK, DialogIcon.Information);
                return;
            }

            //--- get Selected item
            objDespesaCartao item = (objDespesaCartao)dgvListagem.SelectedRows[0].DataBoundItem;

            DialogResult resp;

            resp = AbrirDialog("Deseja realmente REMOVER ou DESASSOCIAR a imagem da despesa selecionada?" +
                               "\nA imagem não será excluída mas movida para pasta de Imagens Removidas...",
                               "Remover Imagem", DialogType.SIM_NAO, DialogIcon.Question, DialogDefaultButton.Second);

            if (resp != DialogResult.Yes)
            {
                return;
            }

            try
            {
                // --- Ampulheta ON
                Cursor.Current = Cursors.WaitCursor;

                //_despesa.Imagem.ReferenceDate = _despesa.DespesaData;
                item.Imagem = ImagemUtil.ImagemRemover(item.Imagem);

                AbrirDialog("Imagem desassociada com sucesso!" +
                            "\nPor segurança a imagem foi guardada na pasta de Imagens Removidas.",
                            "Imagem Removida", DialogType.OK, DialogIcon.Information);
            }
            catch (Exception ex)
            {
                AbrirDialog("Uma exceção ocorreu ao Remover a imagem..." + "\n" +
                            ex.Message, "Exceção", DialogType.OK, DialogIcon.Exclamation);
            }
            finally
            {
                // --- Ampulheta OFF
                Cursor.Current = Cursors.Default;
            }
        }
        private void dgvListagem_MouseDown(object sender, MouseEventArgs e)
        {
            // check button
            if (e.Button != MouseButtons.Right)
            {
                return;
            }

            // check Escolha
            if (_formOrigem != null && _formOrigem.Name == "frmProvisorio")
            {
                return;
            }

            Control c = (Control)sender;

            DataGridView.HitTestInfo hit = dgvListagem.HitTest(e.X, e.Y);
            dgvListagem.ClearSelection();

            if (hit.Type != DataGridViewHitTestType.Cell)
            {
                return;
            }

            // seleciona o ROW
            dgvListagem.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvListagem.CurrentCell   = dgvListagem.Rows[hit.RowIndex].Cells[2];
            dgvListagem.Rows[hit.RowIndex].Selected = true;

            // mostra o MENU ativar e desativar
            objDespesaCartao desp = (objDespesaCartao)dgvListagem.Rows[hit.RowIndex].DataBoundItem;

            // mnuImagem
            bool IsThereImagem = desp.Imagem != null && !string.IsNullOrEmpty(desp.Imagem.ImagemFileName);

            mnuImagemRemover.Enabled    = IsThereImagem;
            mnuImagemInserir.Text       = IsThereImagem ? "Alterar Imagem" : "Inserir Imagem";
            mnuImagemVisualizar.Enabled = IsThereImagem;

            // revela menu
            mnuOperacoes.Show(c.PointToScreen(e.Location));
        }
        // EDITAR DESPESA ESCOLHIDA
        //------------------------------------------------------------------------------------------------------------
        private void btnVisualizar_Click(object sender, EventArgs e)
        {
            //--- check selected item
            if (dgvListagem.SelectedRows.Count == 0)
            {
                AbrirDialog("Favor selecionar um registro para Visualizar...",
                            "Selecionar Registro", DialogType.OK, DialogIcon.Information);
                return;
            }

            //--- get Selected item
            objDespesaCartao item = (objDespesaCartao)dgvListagem.SelectedRows[0].DataBoundItem;

            var frm = new frmDespesaCartao(item, this);

            frm.MdiParent = Application.OpenForms.OfType <frmPrincipal>().FirstOrDefault();
            DesativaMenuPrincipal();
            Close();
            frm.Show();
        }
        // CONSTRUCTOR CONTINUE AFTER GET DESPESA
        //------------------------------------------------------------------------------------------------------------
        private void ConstructorContinue(objDespesaCartao despesa)
        {
            _despesa = despesa;

            // binding Despesa
            bindDespesa.DataSource = typeof(objDespesaCartao);
            bindDespesa.Add(_despesa);
            BindingCreator();

            // binding APagar
            bindAPagar.DataSource = typeof(objAPagar);
            GetAPagarVinculado();

            SituacaoAlterada();

            // handlers
            bindAPagar.ListChanged += (a, b) => CalculaTotais();

            HandlerKeyDownControl(this);
        }
        private void ObterDadosLastDespesa()
        {
            try
            {
                // --- Ampulheta ON
                Cursor.Current = Cursors.WaitCursor;

                //--- Check Conta
                if (_CartaoSelected == null)
                {
                    AbrirDialog("Favor selecionar o Cartao de Crédito...", "Cartão Selecionado");
                    txtCartaoDescricao.Focus();
                }

                _LastDespesa = dBLL.GetLastDespesaCartaoByCartao((int)_CartaoSelected.IDCartaoCredito);

                if (_LastDespesa == null)
                {
                    cmbRefMes.SelectedValue = DateTime.Today.Month;
                    numRefAno.Value         = DateTime.Today.Year;
                }
                else
                {
                    cmbRefMes.SelectedValue = _LastDespesa.ReferenciaData.AddMonths(1).Month;
                    numRefAno.Value         = _LastDespesa.ReferenciaData.AddMonths(1).Year;
                }

                btnEfetuar.Enabled = true;
            }
            catch (Exception ex)
            {
                AbrirDialog("Uma exceção ocorreu ao Obter as informações de Cartão de Crédito..." + "\n" +
                            ex.Message, "Exceção", DialogType.OK, DialogIcon.Exclamation);
                btnEfetuar.Enabled = false;
            }
            finally
            {
                // --- Ampulheta OFF
                Cursor.Current = Cursors.Default;
            }
        }
        // INSERT IMAGE
        //------------------------------------------------------------------------------------------------------------
        private void mnuImagemInserir_Click(object sender, EventArgs e)
        {
            //--- check selected item
            if (dgvListagem.SelectedRows.Count == 0)
            {
                AbrirDialog("Favor selecionar um registro para Inserir Imagem...",
                            "Selecionar Registro", DialogType.OK, DialogIcon.Information);
                return;
            }

            //--- get Selected item
            objDespesaCartao item = (objDespesaCartao)dgvListagem.SelectedRows[0].DataBoundItem;

            try
            {
                // --- Ampulheta ON
                Cursor.Current = Cursors.WaitCursor;

                objImagem imagem = new objImagem()
                {
                    IDOrigem       = (long)item.IDDespesa,
                    Origem         = EnumImagemOrigem.Despesa,
                    ImagemFileName = item.Imagem == null ? string.Empty : item.Imagem.ImagemFileName,
                    ImagemPath     = item.Imagem == null ? string.Empty : item.Imagem.ImagemPath,
                    ReferenceDate  = item.DespesaData,
                };

                // open form to edit or save image
                bool IsNew = item.Imagem == null || string.IsNullOrEmpty(item.Imagem.ImagemPath);
                imagem = ImagemUtil.ImagemGetFileAndSave(imagem, this);

                // check if isUpdated
                bool IsUpdated = false;
                if (item.Imagem != null && imagem != null)
                {
                    IsUpdated = (item.Imagem.ImagemFileName != imagem.ImagemFileName) || (item.Imagem.ImagemPath != imagem.ImagemPath);
                }

                // update imagem object
                item.Imagem = imagem;

                // emit message
                if (IsNew && imagem != null)
                {
                    AbrirDialog("Imagem associada e salva com sucesso!" +
                                "\nPor segurança a imagem foi transferida para a pasta padrão.",
                                "Imagem Salva", DialogType.OK, DialogIcon.Information);
                }
                else if (IsUpdated)
                {
                    AbrirDialog("Imagem alterada com sucesso!" +
                                "\nPor segurança a imagem anterior foi transferida para a pasta de imagens removidas.",
                                "Imagem Alterada", DialogType.OK, DialogIcon.Information);
                }
            }
            catch (Exception ex)
            {
                AbrirDialog("Uma exceção ocorreu ao obter a imagem..." + "\n" +
                            ex.Message, "Exceção", DialogType.OK, DialogIcon.Exclamation);
            }
            finally
            {
                // --- Ampulheta OFF
                Cursor.Current = Cursors.Default;
            }
        }
        // CONCLUIR DESPESA CARTAO
        //------------------------------------------------------------------------------------------------------------
        public void ConcluirDespesaCartao(objDespesaCartao despesa)
        {
            AcessoDados db = null;

            try
            {
                //--- INIT DATABASE
                db = new AcessoDados();
                db.BeginTransaction();

                //--- 1. BLOCK ALL DESPESA CARTAO WITH SAME IDCARTAO
                string query = "UPDATE tblDespesaCartao " +
                               "SET IDSituacao = 3 " +
                               "WHERE IDCartaoCredito = @IDCartaoCredito AND IDSituacao = 2";

                db.LimparParametros();
                db.AdicionarParametros("@IDCartaoCredito", despesa.IDCartaoCredito);

                db.ExecutarManipulacao(CommandType.Text, query);

                //--- 2. UPDATE TBL DESPESA
                new DespesaBLL().UpdateDespesa(despesa, db);

                //--- 3. FINALIZE THIS DESPESA CARTAO
                query = "UPDATE tblDespesaCartao " +
                        "SET IDSituacao = 2 " +
                        "WHERE IDDespesa = @IDDespesa";

                db.LimparParametros();
                db.AdicionarParametros("@IDDespesa", despesa.IDDespesa);

                db.ExecutarManipulacao(CommandType.Text, query);

                //--- 4. GET CARTAO OBJECT
                var cartao = new APagarCartaoBLL().GetCartaoCreditoDespesa(despesa.IDCartaoCredito, db);

                //--- 5. GENERATE NEW APAGAR WITH SUM OF VALUES
                var newPag = new objAPagar(null)
                {
                    IDSetor       = despesa.IDSetor,
                    IDSituacao    = 1,
                    APagarValor   = despesa.DespesaValor,
                    IDAPagarForma = cartao.IDAPagarForma,
                    IDCredor      = despesa.IDCredor,
                    IDDespesa     = (long)despesa.IDDespesa,
                    Identificador = $"{despesa.ReferenciaData.Month:D2}-{despesa.ReferenciaData.Year}",
                    Parcela       = 1,
                    Vencimento    = despesa.ReferenciaData,
                    ReferenciaMes = despesa.ReferenciaData.Month,
                    ReferenciaAno = despesa.ReferenciaData.Year,
                };

                new APagarBLL().InsertAPagarList(new List <objAPagar>()
                {
                    newPag
                }, db);

                //--- COMMIT TRANSACTION
                db.CommitTransaction();
            }
            catch (Exception ex)
            {
                db.RollBackTransaction();
                throw ex;
            }
        }
        // VERIFY DESPESA BEFORE DELETE
        //------------------------------------------------------------------------------------------------------------
        public bool VerifyBeforeDelete(objDespesaCartao despesa,
                                       ref List <objAPagar> listAPagar,
                                       ref List <objMovimentacao> listMovSaidas,
                                       AcessoDados dbTran)
        {
            try
            {
                long IDDespesa = (long)despesa.IDDespesa;

                // VERIFY IMAGEM
                //------------------------------------------------------------------------------------------------------------
                if (despesa.Imagem != null && !string.IsNullOrEmpty(despesa.Imagem.ImagemFileName))
                {
                    throw new AppException("A despesa não pode ser excluída pois possui uma imagem vinculada a ela...");
                }

                // GET APAGAR
                //------------------------------------------------------------------------------------------------------------
                listAPagar = new APagarBLL().GetListAPagarByDespesa(IDDespesa, dbTran);

                // VERIFY APAGAR
                //------------------------------------------------------------------------------------------------------------
                bool   err        = false;
                string errMessage = "Os a PAGAR abaixo possuem pagamentos...\n";

                Action <objAPagar> addMessage = (pagar) =>
                {
                    errMessage += $"Reg.: {pagar.IDAPagar:D4}    {pagar.Vencimento.ToShortDateString()}\n";
                    err         = true;
                };

                listAPagar.Where(x => x.IDSituacao == 2).ToList().ForEach(addMessage);

                if (err == true)
                {
                    errMessage += "Favor estornar antes os pagamentos se deseja EXCLUIR a despesa.";
                    throw new AppException(errMessage);
                }

                // VERIFY APAGAR IMAGES
                //------------------------------------------------------------------------------------------------------------
                errMessage = "Os APagar abaixo possuem IMAGEM associada\n";

                listAPagar.Where(x => x.Imagem != null && !string.IsNullOrEmpty(x.Imagem.ImagemFileName)).ToList().ForEach(addMessage);

                if (err == true)
                {
                    errMessage += "Favor remover/desassociar as imagens do APagar se deseja EXCLUIR a despesa.";
                    throw new AppException(errMessage);
                }

                // VERIFY MOVIMENTACAO SAIDA FROM APAGAR
                //------------------------------------------------------------------------------------------------------------
                MovimentacaoBLL mBLL = new MovimentacaoBLL();
                listMovSaidas = new List <objMovimentacao>();

                if (listAPagar.Count > 0)
                {
                    foreach (objAPagar pagar in listAPagar)
                    {
                        listMovSaidas.AddRange(mBLL.GetMovimentacaoListByOrigem(EnumMovOrigem.APagar, (long)pagar.IDAPagar, true, dbTran));
                    }
                }

                // VERIFY RECEBIMENTOS WITH CAIXA OR BLOCKED
                //------------------------------------------------------------------------------------------------------------
                errMessage = "Essa Despesa possui pagamentos que foram inseridas no caixa...\n";

                Action <objMovimentacao> addMessageMov = (saida) =>
                {
                    errMessage += $"Reg.: {saida.IDMovimentacao:D4} | {saida.MovData.ToShortDateString()} | Caixa: {saida.IDCaixa:D4}\n";
                    err         = true;
                };

                listMovSaidas.Where(x => x.IDCaixa != null).ToList().ForEach(addMessageMov);

                if (err == true)
                {
                    errMessage += "Favor remover o(s) caixa(s) se desejar EXCLUIR a(s) DESPESA.";
                    throw new AppException(errMessage);
                }

                // VERIFY MOVIMENTACAO SAIDA IMAGES
                //------------------------------------------------------------------------------------------------------------
                errMessage = "As Saídas abaixo possuem IMEGEM associada\n";

                listMovSaidas.Where(x => x.Imagem != null && !string.IsNullOrEmpty(x.Imagem.ImagemFileName)).ToList().ForEach(addMessageMov);

                if (err == true)
                {
                    errMessage += "Favor remover/desassociar as imagens das Saídas se deseja EXCLUIR a despesa.";
                    throw new AppException(errMessage);
                }

                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        // DELETE
        //------------------------------------------------------------------------------------------------------------
        public bool DeleteDespesaCartao(objDespesaCartao despesa)
        {
            AcessoDados dbTran = null;

            try
            {
                dbTran = new AcessoDados();
                dbTran.BeginTransaction();

                // 1 - CHECK APagar and Movimentacao Saida
                //------------------------------------------------------------------------------------------------------------
                List <objAPagar>       listAPagar    = new List <objAPagar>();
                List <objMovimentacao> listMovSaidas = new List <objMovimentacao>();

                if (!VerifyBeforeDelete(despesa, ref listAPagar, ref listMovSaidas, dbTran))
                {
                    return(false);
                }

                // 2 - Return with all APAGAR vinculadas --> convert all to EM ABERTO
                //------------------------------------------------------------------------------------------------------------
                var ListVinculadas = ListAPagarCartaoVinculadas((long)despesa.IDDespesa, dbTran);

                foreach (var pag in ListVinculadas)
                {
                    RemoverVinculoAPagarItem((long)pag.IDAPagar, dbTran);
                }

                // 3 - delete ALL APAGAR
                //------------------------------------------------------------------------------------------------------------
                if (listAPagar.Count > 0)
                {
                    APagarBLL pBLL = new APagarBLL();

                    foreach (objAPagar pagar in listAPagar)
                    {
                        pBLL.DeleteAPagar(pagar, dbTran);
                    }
                }

                // 4 - delete DESPESA CARTAO
                //------------------------------------------------------------------------------------------------------------

                //--- define Params
                dbTran.LimparParametros();
                dbTran.AdicionarParametros("@IDDespesa", despesa.IDDespesa);
                dbTran.ConvertNullParams();

                //--- create query
                string query = "DELETE tblDespesaCartao WHERE IDDespesa = @IDDespesa";

                //--- DELETE
                dbTran.ExecutarManipulacao(CommandType.Text, query);

                // 5 - delete DESPESA
                //------------------------------------------------------------------------------------------------------------

                //--- define Params
                dbTran.LimparParametros();
                dbTran.AdicionarParametros("@IDDespesa", despesa.IDDespesa);
                dbTran.ConvertNullParams();

                //--- create query
                query = "DELETE tblDespesa WHERE IDDespesa = @IDDespesa";

                //--- DELETE
                dbTran.ExecutarManipulacao(CommandType.Text, query);

                // 6 - COMMIT AND RETURN
                //------------------------------------------------------------------------------------------------------------
                dbTran.CommitTransaction();
                return(true);
            }
            catch (AppException ex)
            {
                dbTran.RollBackTransaction();
                throw ex;
            }
            catch (Exception ex)
            {
                dbTran.RollBackTransaction();
                throw ex;
            }
        }
        // INSERT DESPESA AND DESPESA CARTAO
        //------------------------------------------------------------------------------------------------------------
        public objDespesaCartao InsertDespesaCartao(objAPagarCartao cartao, DateTime ReferenciaData, object dbTran = null)
        {
            AcessoDados db = dbTran == null ? new AcessoDados() : (AcessoDados)dbTran;

            try
            {
                db = new AcessoDados();
                if (dbTran == null)
                {
                    db.BeginTransaction();
                }

                var descricao = $"Fatura de Cartão {cartao.CartaoDescricao}";
                if (descricao.Length > 200)
                {
                    descricao = descricao.Substring(0, 199);
                }

                var despesa = new objDespesaCartao(null)
                {
                    IDCredor         = cartao.IDCredorCartao,
                    Credor           = cartao.CredorCartao,
                    DespesaDescricao = descricao,
                    DespesaOrigem    = 3,                  // CARTAO
                    DespesaValor     = 0,
                    DespesaData      = ReferenciaData,
                    IDSetor          = cartao.IDSetorCartao,
                    Setor            = cartao.SetorCartao,
                    IDDespesaTipo    = 0,
                    IDTitular        = null,
                    DespesaTipo      = "Outras",
                    CartaoDescricao  = cartao.CartaoDescricao,
                    IDCartaoCredito  = (int)cartao.IDCartaoCredito,
                    VencimentoDia    = cartao.VencimentoDia,
                    IDSituacao       = 1,
                    Situacao         = "Em Aberto",
                    Imagem           = null,
                    ReferenciaData   = ReferenciaData,
                };

                //--- insert DESPESA and Get new ID
                long newID = new DespesaBLL().InsertDespesa(despesa, db);

                despesa.IDDespesa = newID;

                //--- insert DESPESA CARTAO
                InsertDespesaCartao(despesa, db);

                if (dbTran == null)
                {
                    db.CommitTransaction();
                }
                return(despesa);
            }
            catch (Exception ex)
            {
                if (dbTran == null)
                {
                    db.RollBackTransaction();
                }
                throw ex;
            }
        }