/// <summary>
        ///  Este metodo permite crear un contrato de aquiler. Asi mismo genera la cuotas por el pago del aquiler automaticamente.
        ///  En caso que el servicio de generacion de cuotas no este activo, se envia a una cola para que cuando se restablesca genere la cuotas.
        /// </summary>
        /// <param name="contratoACrear"></param>
        /// <returns></returns>
        public Contrato CrearContrato(Contrato contratoACrear)
        {
            Contrato objCont;
            try
            {
                Respuesta obj = dao.ValidarContrato(contratoACrear.CodigoVivienda, contratoACrear.CodigoResidente, Convert.ToDateTime(contratoACrear.FechaIniResidencia));

                if (obj != null)
                {
                    if (obj.ExisteVivienda == 0)
                    {
                        throw new WebFaultException<string>(
                       "La vivienda no se encuentra disponible para el periodo indicado", HttpStatusCode.InternalServerError);
                    }
                    else

                        if (obj.ExisteMoroso == 1)
                        {
                            throw new WebFaultException<string>(
                                "Residente con deuda pendiente", HttpStatusCode.InternalServerError);
                        }
                }

                objCont = dao.ContratoGenerar(contratoACrear);
                // Generacion de  Cuotas
                GenerarCuotas(objCont);
               
            }
            catch
            {
                throw;
            }
            
            return objCont;
        }
        public Contrato ContratoGenerar(Contrato contratoACrear)
        {
            Contrato contratoCreado = null;
            int codigo = 0;
            string sql = "SP_CONTRATO_INSERTAR"; // nombres de tu stored
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.CommandType = System.Data.CommandType.StoredProcedure;

                    com.Parameters.Add(new SqlParameter("@CodigoVivienda", contratoACrear.CodigoVivienda));
                    com.Parameters.Add(new SqlParameter("@CodigoResidente", contratoACrear.CodigoResidente));
                    com.Parameters.Add(new SqlParameter("@FechaContrato", Convert.ToDateTime(contratoACrear.FechaContrato)));
                    com.Parameters.Add(new SqlParameter("@FechaIniResidencia", Convert.ToDateTime(contratoACrear.FechaIniResidencia)));
                    com.Parameters.Add(new SqlParameter("@CostoMensual", Convert.ToDecimal(contratoACrear.CostoMensual)));
                    com.Parameters.Add(new SqlParameter("@Periodo", contratoACrear.Periodo));
                    com.Parameters.Add(new SqlParameter("@Estado", contratoACrear.Estado));
                    com.Parameters.Add(new SqlParameter("@UsuarioCreacion", contratoACrear.UsuarioCreacion));
                    com.Parameters.Add(new SqlParameter("@FechaCreacion", Convert.ToDateTime(contratoACrear.FechaCreacion)));

                    com.Parameters.Add(new SqlParameter("@CodigoContrato", SqlDbType.Int, 20)).Direction = ParameterDirection.Output;

                    com.ExecuteNonQuery();

                    codigo = Convert.ToInt32(com.Parameters["@CodigoContrato"].Value);
                }

            }
            contratoCreado = ObtenerContrato(codigo.ToString());
            return contratoCreado;
        }
        public Contrato ObtenerContrato(string codigocontrato)
        {
            Contrato contratoObtenido = null;

            string sql = "SELECT * FROM t_contrato WHERE codigocontrato=@CodigoContrato";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@CodigoContrato", codigocontrato));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            contratoObtenido = new Contrato()
                            {

                                CodigoContrato = Convert.ToInt32(resultado["CodigoContrato"]),
                                CodigoVivienda = Convert.ToInt32(resultado["CodigoVivienda"]),
                                CodigoResidente = Convert.ToInt32(resultado["CodigoResidente"]),
                                FechaContrato = Convert.ToString(resultado["FechaContrato"]),
                                FechaIniResidencia = Convert.ToString(resultado["FechaIniResidencia"]),
                                CostoMensual = Convert.ToString(resultado["CostoMensual"]),
                                Periodo = Convert.ToInt32(resultado["Periodo"]),
                                Estado = Convert.ToString(resultado["Estado"]),
                                UsuarioCreacion = Convert.ToString(resultado["UsuarioCreacion"]),
                                FechaCreacion = Convert.ToString(resultado["FechaCreacion"]),
                                UsuarioModificacion = Convert.ToString(resultado["usuariomodificacion"]),
                                FechaModificacion = Convert.ToString(resultado["fechamodificacion"])


                            };
                        }

                    }
                }
            }

            return contratoObtenido;
        }
 /// <summary>
 /// Este metodo permite actualizar los datos del contrato
 /// </summary>
 /// <param name="contratoAModificar"></param>
 /// <returns></returns>
 public Contrato ModificarContrato(Contrato contratoAModificar)
 {
     return dao.ModificarContrato(contratoAModificar);
 }
 /// <summary>
 /// Este metodo genera la cuotas si el servicio esta activo. Caso contrario, lo envia el contrato a una cola para que las cuotas sean generadas despues.
 /// </summary>
 /// <param name="objCont"></param>
 private void GenerarCuotas(Contrato objCont)
 {
     try
     {
         string postdata = "{\"CodigoContrato\":\"" + objCont.CodigoContrato.ToString() + "\"}"; //JSON
         byte[] data = Encoding.UTF8.GetBytes(postdata);
         HttpWebRequest req = (HttpWebRequest)WebRequest
         .Create("http://localhost:7142/CuotaService.svc/CuotaService");
         req.Method = "POST";
         req.ContentLength = data.Length;
         req.ContentType = "application/json";
         var reqStream = req.GetRequestStream();
         reqStream.Write(data, 0, data.Length);
         req.GetResponse(); 
     }
     catch
     {
         EnviarContratoACola(objCont.CodigoContrato);
     }
 
 }
 public Contrato ModificarContrato(Contrato contratoAModificar)
 {
     Contrato contratoModificado = null;
     string sql = "UPDATE t_contrato SET CostoMensual = @cos WHERE codigocontrato = @codc and codigovivienda = @codv and codigoresidente = @codr";
     using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena))
     {
         con.Open();
         using (SqlCommand com = new SqlCommand(sql, con))
         {
             com.Parameters.Add(new SqlParameter("@codc", contratoAModificar.CodigoContrato));
             com.Parameters.Add(new SqlParameter("@codv", contratoAModificar.CodigoVivienda));
             com.Parameters.Add(new SqlParameter("@codr", contratoAModificar.CodigoResidente));
             com.Parameters.Add(new SqlParameter("@cos", contratoAModificar.CostoMensual));
             com.ExecuteNonQuery();
         }
     }
     contratoModificado = ObtenerContrato(contratoAModificar.CodigoContrato.ToString());
     return contratoModificado;
 }