<%
#encoding: UTF-8

=begin

CapicuaGen

CapicuaGen es un software que ayuda a la creación automática de
sistemas empresariales a través de la definición y ensamblado de
diversos generadores de características.

El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
del 2016.

Puede modificar y distribuir este software, según le plazca, y usarlo
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
índole, siempre y cuando incluya este mensaje, y se permita acceso el
código fuente.

Este software es código libre, y se licencia bajo LGPL.

Para más información consultar http://www.gnu.org/licenses/lgpl.html
=end
%>using System;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Text;
using System.Collections.Generic;
<%=get_namespaces_text(:business_interfaces) %>

namespace <%=generation_attributes[:namespace]%>
{
    /// <summary>
    /// Capa de acceso a datos de una<%=template_target.class_name%>
    /// </summary>
    partial class  <%=template_target.class_name%><T> : AccesoDatos<T> where T : class, <%=get_entity_interface_name(template_target.entity_schema.name)%>, new()
    {

        #region Sentencias SQL
        
        /// <summary>
        /// Consulta
        /// </summary>
        /// <param name="<%=template_target.entity_schema.name.downcase%>">Registro a consultar</param>
        /// <returns>Registro consultado</returns>
        public override T Consultar(T <%=template_target.entity_schema.name.downcase%>)
        {
           T resultado = ConsultarExiste(<%=template_target.entity_schema.name.downcase%>);

            if (resultado == null)
            {
                throw new AccesoDatosException("No existe el registro");
            }
            else
            {
                return resultado;
            }
        }

        /// <summary>
        /// Lista todos los registros
        /// </summary>
        /// <returns>Registros</returns>
        public override IEnumerable<T> Listar()
        {
            List<T> listaResultado = new List<T>();

            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT");
            <%
            total=template_target.entity_schema.fields.count
            indice=0
            template_target.entity_schema.fields.each { |field|
            indice=indice+1
            %>query.AppendLine("  <%=field.name%><%="," if indice!=total%>");
            <%}%>query.AppendLine("FROM");
            query.AppendLine("    <%=template_target.entity_schema.sql_name.downcase%>");

            DbCommand comando = CrearComando(query.ToString());

            using (DbConnection conexion = CrearConexionAbierta())
            {
                comando.Connection = conexion;
                DbDataReader reader = comando.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                       T resultado = new T();
                        <%
                        template_target.entity_schema.fields.each { |field|
                        %> if (reader["<%=field.name%>"] != DBNull.Value) resultado.<%=field.name%> = (<%=field.net_type%>)reader["<%=field.name%>"];
                        <%}%>
                        listaResultado.Add(resultado);
                    }
                }

            }

            return listaResultado;
        }
        
        /// <summary>
        /// Consulta si un registro existe
        /// </summary>
        /// <param name="<%=template_target.entity_schema.name.downcase%>">Registro a consultar</param>
        /// <returns>Devuelve el registro o nulo</returns>
        public override T ConsultarExiste(T <%=template_target.entity_schema.name.downcase%>)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT");
            <%
            total=template_target.entity_schema.fields.count
            indice=0
            template_target.entity_schema.fields.each { |field|
            indice=indice+1
            %>query.AppendLine("  <%=field.name%><%="," if indice!=total%>");
            <%}%>query.AppendLine("FROM");
            query.AppendLine("    <%=template_target.entity_schema.sql_name.downcase%>");
            query.AppendLine("WHERE");
            <%
            total=template_target.entity_schema.primary_fields.count
            indice=0
            template_target.entity_schema.primary_fields.each { |field|
            indice=indice+1 
            %>query.AppendLine("<%=field.name%>=@p<%=indice%><%=" AND" if indice!=total%>"); 
            <%}%>

            DbCommand comando = CrearComando(query.ToString());
            <%
            indice=0
            template_target.entity_schema.primary_fields.each { |field|
            indice=indice+1
            %>AgregarParametro(comando, "@p<%=indice%>",<%=field.sql_net_type%>, <%=template_target.entity_schema.name.downcase%>.<%=field.name%>);
            <%}%>  


            using (DbConnection conexion = CrearConexionAbierta())
            {
                comando.Connection = conexion;
                DbDataReader reader = comando.ExecuteReader();

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                       T resultado = new T();
                        <%
                        template_target.entity_schema.fields.each { |field|
                        %> if (reader["<%=field.name%>"] != DBNull.Value) resultado.<%=field.name%> = (<%=field.net_type%>)reader["<%=field.name%>"];
                        <%}%>

                        return resultado;
                    }
                }

                return null;
            }
        }

        /// <summary>
        /// Actualización
        /// </summary>
        /// <param name="<%=template_target.entity_schema.name.downcase%>">Registro a actualizar</param>
        public override void Actualizar(T <%=template_target.entity_schema.name.downcase%>)
        {
            Consultar(<%=template_target.entity_schema.name.downcase%>);

            StringBuilder query = new StringBuilder();
            query.AppendLine("UPDATE <%=template_target.entity_schema.sql_name.downcase%>");
            query.AppendLine("SET");  
            <% 
            total=template_target.entity_schema.non_primary_fields.count
            indice=0
            template_target.entity_schema.non_primary_fields.each { |field|
            indice=indice+1
            %>query.AppendLine("  <%=field.name%>=@p<%=indice%><%="," if indice!=total%>");
            <%}%>query.AppendLine("WHERE");
            <%
            total=indice + template_target.entity_schema.primary_fields.count 
            template_target.entity_schema.primary_fields.each { |field|
            indice=indice+1
            %>query.AppendLine("  <%=field.name%>=@p<%=indice%><%=" AND" if indice!=total%>"); 
            <%}%>
            DbCommand comando = CrearComando(query.ToString());
            <%
            indice=0
            template_target.entity_schema.non_primary_fields.each { |field|
            indice=indice+1
            %>AgregarParametro(comando, "@p<%=indice%>",<%=field.sql_net_type%>, <%=template_target.entity_schema.name.downcase%>.<%=field.name%>);
            <%}
            template_target.entity_schema.primary_fields.each { |field|
            indice=indice+1
            %>AgregarParametro(comando, "@p<%=indice%>",<%=field.sql_net_type%>, <%=template_target.entity_schema.name.downcase%>.<%=field.name%>);
            <%}%>    
            
            using (DbConnection conexion = CrearConexionAbierta())
            {
                comando.Connection = conexion;
                comando.ExecuteNonQuery();
            }
        }

       
        
        /// <summary>
        /// Inserta un registro
        /// </summary>
        /// <param name="<%=template_target.entity_schema.name.downcase%>">Registro para insertar</param>
        public override void Insertar(T <%=template_target.entity_schema.name.downcase%>)
        {
           T registroExistente = ConsultarExiste(<%=template_target.entity_schema.name.downcase%>);

            if (registroExistente != null)
            {
                throw new AccesoDatosException("El registro ya existe");
            }

            StringBuilder query = new StringBuilder();
            query.AppendLine("INSERT INTO <%=template_target.entity_schema.sql_name.downcase%>");
            query.AppendLine("(");
            <%
            total=template_target.entity_schema.fields.count
            indice=0
            template_target.entity_schema.fields.each { |field|
              indice=indice+1
            next if field.identity
            %>query.AppendLine("  <%=field.name%><%="," if indice!=total%>"); 
            <%}%>query.AppendLine(")");
            query.AppendLine("VALUES");
            query.AppendLine("(");
            <%
            total=template_target.entity_schema.fields.count
            indice=0
            template_target.entity_schema.fields.each { |field|
            indice=indice+1
            next if field.identity
            %>query.AppendLine("  @p<%=indice%><%="," if indice!=total%>"); 
            <%}%>query.AppendLine(")");

            DbCommand comando = CrearComando(query.ToString());
            <%
            indice=0
            template_target.entity_schema.fields.each { |field|
            indice=indice+1
            next if field.identity
            %>AgregarParametro(comando, "@p<%=indice%>",<%=field.sql_net_type%>, <%=template_target.entity_schema.name.downcase%>.<%=field.name%>);
            <%}%>  


            using (DbConnection conexion = CrearConexionAbierta())
            {
                comando.Connection = conexion;
                comando.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// Borrado de registros
        /// </summary>
        /// <param name="<%=template_target.entity_schema.name.downcase%>">Registro a eliminar</param>
        public override void Eliminar(T <%=template_target.entity_schema.name.downcase%>)
        {
            Consultar(<%=template_target.entity_schema.name.downcase%>);

            StringBuilder query = new StringBuilder();
            query.AppendLine("DELETE <%=template_target.entity_schema.sql_name.downcase%>");
            query.AppendLine("WHERE");
            <%
            total=template_target.entity_schema.primary_fields.count
            indice=0
            template_target.entity_schema.primary_fields.each { |field|
            indice=indice+1 
            %>query.AppendLine("<%=field.name%>=@p<%=indice%><%=" AND" if indice!=total%>"); 
            <%}%>

            DbCommand comando = CrearComando(query.ToString());
            <%
            indice=0
            template_target.entity_schema.primary_fields.each { |field|
            indice=indice+1
            %>AgregarParametro(comando, "@p<%=indice%>",<%=field.sql_net_type%>, <%=template_target.entity_schema.name.downcase%>.<%=field.name%>);
            <%}%>  

            using (DbConnection conexion = CrearConexionAbierta())
            {
                comando.Connection = conexion;
                comando.ExecuteNonQuery();
            }
        }

        #endregion
    }
}