public override int Save()
        {
            if (Id < 0)
            {
                DBContractDetail[] dbContractDetail = new DBContractDetail[Detail.Count];

                for (int i = 0; i < Detail.Count; i++)
                {
                    dbContractDetail[i] = ContractDetail.ToDBContractDetail(Detail[i]);
                }

                List<Dictionary<string, object>> listPaymentPlan = new List<Dictionary<string,object>>();
                foreach (ContractPaymentPlan paymentPlan in PaymentPlan)
                {
                    Dictionary<string, object> plan = new Dictionary<string,object>();

                    plan.Add("Amount", paymentPlan.Amount);
                    plan.Add("Date", paymentPlan.Date);
                    plan.Add("Condition", paymentPlan.Condition);
                    listPaymentPlan.Add(plan);
                }

                return DBContract.AddPaidWork(ContractorId, Currency, CreatedBy, Description, ToString(ContractStatus.Active), Start, End, ExchangeRate, Amount, _advance, dbContractDetail, listPaymentPlan);
            }

            return -1;
        }
        public static int Add(int contractorId,
            string currency,
            string createdBy,
            string description,
            string status,
            DateTime start,
            DateTime end,
            decimal rate,
            decimal amount,
            DBContractDetail[] listDetail)
        {
            SqlConnection connection = new SqlConnection(DBHelper.Instance.ConnectionString);
            SqlTransaction transaction;
            SqlCommand command = new SqlCommand();
            int identity = -1;

            connection.Open();
            transaction = connection.BeginTransaction();
            command.Connection = connection;
            command.Transaction = transaction;

            try
            {
                command.CommandText = "INSERT INTO uContrato " +
                    "(IdContratista,CodigoMoneda,Monto,FechaCreacion,UsuarioCreador,FechaInicio,FechaFin,TipoCambio,Glosa,Estado)" +
                    " VALUES " +
                    string.Format("({0},'{1}',{2},GETDATE(),'{3}','{4}','{5}',{6},'{7}','{8}')", contractorId, currency, DBConverter.ToSafeDecimal(amount), createdBy, DBConverter.ToSafeDate(start), DBConverter.ToSafeDate(end), DBConverter.ToSafeDecimal(rate), description, status) +
                    ";SELECT Id FROM uContrato WHERE Id=@@IDENTITY";

                identity = (int)command.ExecuteScalar();

                foreach(DBContractDetail detail in listDetail)
                {
                    command.CommandText = "INSERT INTO uContratoDetalle " +
                        "(IdProyecto,IdBloque,IdObra,IdGrupo,IdItem,IdSubItem,IdContrato,AvanceInicial,PrecioReal,Precio)" +
                        " VALUES " +
                        string.Format("({0},{1},{2},{3},{4},{5},{6},{7},{8},{8})", detail.ProjectId, detail.BlockId, detail.WorkId, detail.GroupId, detail.ItemId, detail.SubItemId, identity, detail.Progress, DBConverter.ToSafeDecimal(detail.Price));
                    command.ExecuteNonQuery();
                }

                transaction.Commit();
            }
            catch(Exception)
            {
                transaction.Rollback();
                identity = -1;
            }

            connection.Close();
            command.Dispose();
            transaction.Dispose();
            connection.Dispose();

            return identity;
        }
        public virtual int Save()
        {
            if (_id < 0)
            {
                DBContractDetail[] dbContractDetail = new DBContractDetail[Detail.Count];

                for(int i=0; i < _detail.Count; i++)
                {
                    dbContractDetail[i] = ContractDetail.ToDBContractDetail(_detail[i]);
                }

                return DBContract.Add(_contractorId, _currency, _createdBy, _description, ToString(ContractStatus.Active), _start, _end, _rate, Amount, dbContractDetail);
            }

            return -1;
        }
        public static int AddPaidWork(int contractorId,
            string currency,
            string createdBy,
            string description,
            string status,
            DateTime start,
            DateTime end,
            decimal rate,
            decimal amount,
            double advance,
            DBContractDetail[] listDetail,
            List<Dictionary<string, object>> paymentPlan)
        {
            string prefix = DBHelper.Instance.TablePrefix;
            SqlConnection connection = new SqlConnection(DBHelper.Instance.ConnectionString);
            SqlTransaction transaction;
            SqlCommand command = new SqlCommand();
            int identity = -1;

            connection.Open();
            transaction = connection.BeginTransaction();
            command.Connection = connection;
            command.Transaction = transaction;

            try
            {
                command.CommandText = string.Format("INSERT INTO {0}Contrato ", prefix) +
                    "(IdContratista,CodigoMoneda,Monto,FechaCreacion,UsuarioCreador,FechaInicio,FechaFin,TipoCambio,Glosa,Estado)" +
                    " VALUES " +
                    string.Format("({0},'{1}',{2},GETDATE(),'{3}','{4}','{5}',{6},'{7}','{8}')", contractorId, currency, DBConverter.ToSafeDecimal(amount), createdBy, DBConverter.ToSafeDate(start), DBConverter.ToSafeDate(end), DBConverter.ToSafeDecimal(rate), description, status) +
                    ";SELECT Id FROM uContrato WHERE Id=@@IDENTITY";

                identity = (int)command.ExecuteScalar();

                foreach (DBContractDetail detail in listDetail)
                {
                    command.CommandText = "INSERT INTO uContratoDetalle " +
                        "(IdProyecto,IdBloque,IdObra,IdGrupo,IdItem,IdSubItem,IdContrato,AvanceInicial,PrecioReal,Precio)" +
                        " VALUES " +
                        string.Format("({0},{1},{2},{3},{4},{5},{6},{7},{8},{8})", detail.ProjectId, detail.BlockId, detail.WorkId, detail.GroupId, detail.ItemId, detail.SubItemId, identity, detail.Progress, DBConverter.ToSafeDecimal(detail.Price));

                    command.ExecuteNonQuery();
                }

                command.CommandText = string.Format("INSERT INTO {0}Pago ", prefix) +
                    "(CodigoMoneda,Fecha,Monto,TipoCambio,Usuario)" +
                    " VALUES " +
                    string.Format("('{0}',GETDATE(),{1},{2},'{3}')", currency, DBConverter.ToSafeDecimal(advance), DBConverter.ToSafeDecimal(rate), createdBy) +
                    string.Format(";SELECT Id FROM {0}Pago WHERE Id=@@IDENTITY", prefix);

                int identityPayment = (int)command.ExecuteScalar();

                command.CommandText = string.Format("INSERT INTO {0}ContratoObraVendida ", prefix) +
                    "(IdContrato,IdPago)" +
                    " VALUES " +
                    string.Format("({0},{1})", identity, identityPayment);

                command.ExecuteNonQuery();

                foreach (Dictionary<string, object> itemPlan in paymentPlan)
                {
                    command.CommandText = string.Format("INSERT INTO {0}PlanPagoContrato ", prefix) +
                        "(IdContrato,Fecha,Monto,CondicionAvance)" +
                        " VALUES " +
                        string.Format("({0},'{1}',{2},{3})", identity, DBConverter.ToSafeDate((DateTime)itemPlan["Date"]), DBConverter.ToSafeDecimal((double)itemPlan["Amount"]), (int)itemPlan["Condition"]);
                    command.ExecuteNonQuery();
                }

                transaction.Commit();
            }
            catch (Exception)
            {
                transaction.Rollback();
                identity = -1;
            }

            connection.Close();
            command.Dispose();
            transaction.Dispose();
            connection.Dispose();

            return identity;
        }