public List <ProformaDetalle> CalculaDetalleProforma(Int64 idCenCos, int mesInicio, Int64 idEmpresa, Int64 idModeloNeg, Int64 idProyecto, int anio, Int64 idTipoCaptura, Int64 idTipoProforma) { ///obtener las variables ProformaDetalleDataAccessLayer detalleAccesLayer = new ProformaDetalleDataAccessLayer(); // Obtiene lista de montos consolidados para ejercicio log.Info("Calculando proforma ...."); List <ProformaDetalle> detallesCalculados = detalleAccesLayer.GetProformaCalculada(idCenCos, mesInicio, idEmpresa, idModeloNeg, idProyecto, anio, idTipoCaptura); //en ocasiones no hay montos para ciertos rubros, eso nos obliga a llenar con 0 el detalle de ese rubro List <ProformaDetalle> detallesFromModel = _profHelper.buildProformaFromTemplate( _profHelper.GetRubrosFromModeloId(idModeloNeg, false), idCenCos, anio, idTipoProforma, idTipoCaptura); List <ProformaDetalle> mergeDetalle = mergeDetallesMontosVsDetallesModelo(detallesFromModel, detallesCalculados); // Obtiene lista de sumatorias para el acumulado List <ProformaDetalle> detallesAniosAnteriores = detalleAccesLayer.GetAcumuladoAnteriores(idCenCos, idEmpresa, idModeloNeg, idProyecto, anio, idTipoCaptura); // Obtiene montos para anios posteriores List <ProformaDetalle> detalleAniosPosteriores = detalleAccesLayer.GetEjercicioPosterior(anio, idCenCos, idModeloNeg, idTipoCaptura, idTipoProforma); //--> se colocan los anios anteriores _profHelper.manageAniosAnteriores(mergeDetalle, detallesAniosAnteriores); // Genera una lista para almacenar la informacion consultada foreach (ProformaDetalle detalleCalculado in mergeDetalle) { foreach (ProformaDetalle detalleAnioPost in detalleAniosPosteriores) { if (detalleCalculado.rubro_id == detalleAnioPost.rubro_id) { // Si coincide el rubro se guardan los acumulados de anios posteriores detalleCalculado.anios_posteriores_resultado = detalleAnioPost.anios_posteriores_resultado; } } } return(mergeDetalle); }
// Calculo del ejercicio anterior public List <ProformaDetalle> GetAcumuladoAnteriores(Int64 idCenCos, Int64 idEmpresa, Int64 idModeloNegocio, Int64 idProyecto, int anio, Int64 idTipoCaptura) { string queryLastproformaAAnt = " select pf.id" + " from proforma pf" + " join tipo_proforma tp on pf.tipo_proforma_id = tp.id" + " where pf.activo = true" + " and pf.anio = @anio" + " and pf.empresa_id = @idEmpresa" + " and pf.modelo_negocio_id = @idModeloNegocio" + " and pf.centro_costo_id = @idCenCos" + " and pf.tipo_captura_id = @idTipoCaptura" + " order by tp.mes_inicio desc" + " limit 1"; String queryProformaAAnt = " select" + " total_resultado as acumulado_resultado," + " rub.id as rubro_id," + " rub.nombre as nombre_rubro," + " rub.es_total_ingresos" + " from proforma pf" + " join proforma_detalle pd on pd.id_proforma = pf.id" + " join rubro rub on rub.id = pd.rubro_id" + " join tipo_proforma tp on pf.tipo_proforma_id = tp.id" + " where pf.activo = true" + " and pf.anio = @anio" + " and pf.empresa_id = @idEmpresa" + " and pf.modelo_negocio_id = @idModeloNegocio" + " and pf.centro_costo_id = @idCenCos" + " and pf.tipo_captura_id = @idTipoCaptura" + " and pf.id in (" + queryLastproformaAAnt + ")"; string queryFromMontosAAnt = " select " + " coalesce ( "+ " sum(cns.enero_total_resultado) + "+ " sum(cns.febrero_total_resultado) + "+ " sum(cns.marzo_total_resultado) + "+ " sum(cns.abril_total_resultado) + "+ " sum(cns.mayo_total_resultado) + "+ " sum(cns.junio_total_resultado) + "+ " sum(cns.julio_total_resultado) + "+ " sum(cns.agosto_total_resultado) + "+ " sum(cns.septiembre_total_resultado) + "+ " sum(cns.octubre_total_resultado) + "+ " sum(cns.noviembre_total_resultado) + "+ " sum(cns.diciembre_total_resultado) "+ " , 0) as acumulado_resultado, cns.rubro_id as rubro_id, rub.nombre as nombre_rubro, rub.es_total_ingresos "+ " from montos_consolidados cns "+ " inner join rubro rub on cns.rubro_id = rub.id "+ " where cns.anio < @anio" + " AND cns.empresa_id=@idEmpresa" + " AND cns.modelo_negocio_id=@idModeloNegocio" + " AND cns.proyecto_id=@idProyecto" + " AND cns.centro_costo_id=@idCenCos" + " AND cns.tipo_captura_id=@idTipoCaptura" + " AND cns.activo=true" + " group by cns.rubro_id, rub.nombre, rub.es_total_ingresos "+ " order by cns.rubro_id "; var res = _queryExecuter.ExecuteQueryUniqueresult(queryLastproformaAAnt, new NpgsqlParameter("@anio", anio - 1), new NpgsqlParameter("@idEmpresa", idEmpresa), new NpgsqlParameter("@idModeloNegocio", idModeloNegocio), new NpgsqlParameter("@idCenCos", idCenCos), new NpgsqlParameter("@idTipoCaptura", idTipoCaptura)); if (res != null) { List <ProformaDetalle> proformaDetalles = new ProformaDetalleDataAccessLayer().GetProformaDetalle(ToInt64(res["id"])); new ProformaCalc().recalculateAll(proformaDetalles, true); log.Info("Termino proceso"); new ProformaDataAccessLayer().ActualizaProforma(proformaDetalles); } DataTable dataTable = _queryExecuter.ExecuteQuery(queryProformaAAnt.Trim(), new NpgsqlParameter("@anio", anio - 1), new NpgsqlParameter("@idEmpresa", idEmpresa), new NpgsqlParameter("@idModeloNegocio", idModeloNegocio), new NpgsqlParameter("@idCenCos", idCenCos), new NpgsqlParameter("@idTipoCaptura", idTipoCaptura)); if (dataTable.Rows.Count == 0) { dataTable = _queryExecuter.ExecuteQuery(queryFromMontosAAnt.Trim(), new NpgsqlParameter("@anio", anio), new NpgsqlParameter("@idEmpresa", idEmpresa), new NpgsqlParameter("@idModeloNegocio", idModeloNegocio), new NpgsqlParameter("@idProyecto", idProyecto), new NpgsqlParameter("@idCenCos", idCenCos), new NpgsqlParameter("@idTipoCaptura", idTipoCaptura) ); } List <ProformaDetalle> detallesAAnteriores = new List <ProformaDetalle>(); foreach (DataRow rdr in dataTable.Rows) { ProformaDetalle detalle = new ProformaDetalle(); detalle.acumulado_resultado = ToDouble(rdr["acumulado_resultado"]); detalle.rubro_id = ToInt64(rdr["rubro_id"]); detalle.nombre_rubro = rdr["nombre_rubro"].ToString(); detalle.es_total_ingresos = ToBoolean(rdr["es_total_ingresos"]); detallesAAnteriores.Add(detalle); } return(detallesAAnteriores); }