public RespuestaAccion DELETE_PURCHASE_PARAM(int head_id, SV_SYSTEM sistema, SV_PARAMETER parametro)
        {
            var res = new RespuestaAccion();

            try
            {
                TRANSACTION_PARAMETER_DETAIL curr_param = (from p in _context.TRANSACTIONS_PARAMETERS_DETAILS
                                                           where p.trx_head_id == head_id &&
                                                           p.paratemer_id == parametro.id &&
                                                           p.system_id == sistema.id
                                                           select p).FirstOrDefault();
                if (curr_param != null)
                {
                    _context.TRANSACTIONS_PARAMETERS_DETAILS.DeleteObject(curr_param);
                    _context.SaveChanges();
                    res.result_objs.Add((SV_TRANSACTION_PARAMETER_DETAIL)curr_param);
                    res.set_ok();
                }
                else
                {
                    //no existe, por lo que no hay que borrarlo
                    res.set(2, "No existe parametro para borrar");
                }
            }
            catch (Exception ex)
            {
                res.set(-1, ex.StackTrace);
            }
            return(res);
        }
Beispiel #2
0
        private RespuestaAccion registrar_parametros(SV_SYSTEM curSystem, int cabecera, decimal valor_unitario, bool derecho, int vutil, GENERIC_VALUE clase, bool isYen)
        {
            RespuestaAccion mRS;
            decimal         valor_proceso;
            //Ingreso Precio Unitario
            SV_PARAMETER pb = P.Consultas.parametros.PrecioBase;

            mRS = P.Consultas.detalle_parametros.REGISTER_PURCHASE_PARAM(cabecera, curSystem, pb, valor_unitario);
            if (mRS.CheckError)
            {
                return(mRS);
            }
            //Ingreso Credito
            if (derecho)
            {
                SV_PARAMETER cred = P.Consultas.parametros.Credito;
                //valor_proceso = Math.Round(curSystem.ENVIORMENT.credit_rate * -valor_unitario,0);
                valor_proceso = curSystem.ENVIORMENT.credit_rate * -valor_unitario;
                mRS           = P.Consultas.detalle_parametros.REGISTER_PURCHASE_PARAM(cabecera, curSystem, cred, valor_proceso);
                if (mRS.CheckError)
                {
                    return(mRS);
                }
            }
            //Ingreso Vida Util     //default monthly
            SV_PARAMETER vu = P.Consultas.parametros.VidaUtil;

            if (curSystem.ENVIORMENT.depreciation_rate == "monthly")
            {
                valor_proceso = vutil;
            }
            else
            {
                valor_proceso = vutil / 12 * 365;
            }
            mRS = P.Consultas.detalle_parametros.REGISTER_PURCHASE_PARAM(cabecera, curSystem, vu, valor_proceso);
            if (mRS.CheckError)
            {
                return(mRS);
            }
            //Valor Residual
            SV_PARAMETER vr = P.Consultas.parametros.ValorResidual;

            if (curSystem.ENVIORMENT == "IFRS")
            {
                decimal porc = P.Consultas.predeter_ifrs.porcentaje_valor_residual(clase);
                valor_proceso = Math.Round(valor_unitario * (-porc), 0);
            }
            else
            {
                valor_proceso = -1;
            }

            mRS = P.Consultas.detalle_parametros.REGISTER_PURCHASE_PARAM(cabecera, curSystem, vr, valor_proceso);
            return(mRS);
        }
Beispiel #3
0
        private RespuestaAccion modificar_parametros(SV_SYSTEM curSystem, int cabecera, decimal valor_unitario, bool derecho, int vutil, GENERIC_VALUE clase, bool isYen)
        {
            RespuestaAccion mRS;
            decimal         ValueToWork;
            //Modifico Precio Unitario
            SV_PARAMETER pb = P.Consultas.parametros.PrecioBase;

            mRS = P.Consultas.detalle_parametros.MODIF_PURCHASE_PARAM(cabecera, curSystem, pb, valor_unitario, !isYen);
            if (mRS.CheckError)
            {
                return(mRS);
            }
            //Ingreso Credito
            if (derecho)
            {
                SV_PARAMETER cred = P.Consultas.parametros.Credito;
                ValueToWork = curSystem.ENVIORMENT.credit_rate * -valor_unitario;
                mRS         = P.Consultas.detalle_parametros.MODIF_PURCHASE_PARAM(cabecera, curSystem, cred, ValueToWork);
                if (mRS.CheckError)
                {
                    return(mRS);
                }
            }
            //Ingreso Vida Util     //default monthly
            SV_PARAMETER vu = P.Consultas.parametros.VidaUtil;

            if (curSystem.ENVIORMENT.depreciation_rate == "monthly")
            {
                ValueToWork = vutil;
            }
            else
            {
                ValueToWork = vutil / 12 * 365;
            }
            mRS = P.Consultas.detalle_parametros.MODIF_PURCHASE_PARAM(cabecera, curSystem, vu, ValueToWork);
            if (mRS.CheckError)
            {
                return(mRS);
            }
            //Valor Residual
            SV_PARAMETER vr = P.Consultas.parametros.ValorResidual;

            if (curSystem.ENVIORMENT == "IFRS")
            {
                decimal porc = P.Consultas.predeter_ifrs.porcentaje_valor_residual(clase);
                ValueToWork = valor_unitario * -porc;
            }
            else
            {
                ValueToWork = -1;
            }

            mRS = P.Consultas.detalle_parametros.MODIF_PURCHASE_PARAM(cabecera, curSystem, vr, ValueToWork);
            return(mRS);
        }
        public RespuestaAccion MODIF_PURCHASE_PARAM(int head_id, SV_SYSTEM sistema, SV_PARAMETER parametro, decimal valor, bool withResiduo)
        {
            var res = new RespuestaAccion();

            try
            {
                TRANSACTION_PARAMETER_DETAIL curr_param = (from p in _context.TRANSACTIONS_PARAMETERS_DETAILS
                                                           where p.trx_head_id == head_id &&
                                                           p.paratemer_id == parametro.id &&
                                                           p.system_id == sistema.id
                                                           select p).FirstOrDefault();
                if (curr_param == null)
                {
                    curr_param                 = new TRANSACTION_PARAMETER_DETAIL();
                    curr_param.trx_head_id     = head_id;
                    curr_param.system_id       = sistema.id;
                    curr_param.paratemer_id    = parametro.id;
                    curr_param.parameter_value = valor;
                    _context.TRANSACTIONS_PARAMETERS_DETAILS.AddObject(curr_param);
                }
                else
                {
                    curr_param.parameter_value = valor;
                }
                _context.SaveChanges();

                res.result_objs.Add((SV_TRANSACTION_PARAMETER_DETAIL)curr_param);

                res.set_ok();
            }
            catch (Exception ex)
            {
                res.set(-1, ex.StackTrace);
            }
            return(res);
        }
Beispiel #5
0
        private RespuestaAccion baja_act(int codigo_articulo, int parte_articulo, DateTime newfecha, int newcantidad, string usuario, List <C.DetalleArticulo> detalle_articulos, SV_VALIDATY tipo_baja)
        {
            var res = new RespuestaAccion();

            try
            {
                ACode.Vperiodo prev_periodo = new ACode.Vperiodo(newfecha.Year, newfecha.Month) - 1;
                //valido que parte existe
                SV_PART partToDown = Partes.ByLotePart(codigo_articulo, parte_articulo);
                if (partToDown == null)
                {
                    res.set(-2, "Activo Fijo no puede ser vendido, ya que no existe la parte solicitada");
                    return(res);
                }
                //determino si necesito crear una nueva parte para bajar
                if (partToDown.quantity > newcantidad)
                {
                    res = CREATE_NEW_PART_FROM(codigo_articulo, partToDown.id, newcantidad, newfecha);
                    if (res.codigo < 0)
                    {
                        return(res);
                    }
                    int newPartId = res.result_objs[0].id;
                    partToDown = Partes.ById(newPartId);
                }

                //determino cabecera vigente
                SV_TRANSACTION_HEADER headPrev = cabeceras.byPartFechaValid(partToDown.id, newfecha);
                if (headPrev == null)
                {
                    res.set(-3, "Activo Fijo no puede ser dado de baja (" + tipo_baja.name + "), no tiene una transaccion vigente al periodo");
                    return(res);
                }

                //crear nueva cabecera de transaccion
                res = REGISTER_DOWNS_HEAD(partToDown.id, newfecha, headPrev, usuario, tipo_baja);
                //TODO: reporto en log hitos
                if (res.codigo < 0)
                {
                    return(res);
                }

                var headDown   = res.result_objs[0];
                var AllSystems = sistemas.All();
                //agregar valores de detalle y parametros para la cabecera
                foreach (SV_SYSTEM currSys in AllSystems)
                {
                    //compruebo si la transaccion anterior tenía detalle para este ambiente
                    SV_TRANSACTION_DETAIL findDet = detalles.GetByPartSystem(headPrev.id, currSys);
                    if (findDet != null)
                    {
                        //ingreso detalle de transaccion
                        res = REGISTER_DOWNS_DETAIL(headDown.id, currSys.id, tipo_baja);
                        if (res.codigo < 0)
                        {
                            return(res);
                        }

                        if (currSys.ENVIORMENT.depreciation_rate == "daily")
                        {
                            //si deprecio en días (IFRS) debo depreciar solo los dias desde el ultimo cierre
                            var currProc = get_detailed(currSys, prev_periodo.last, codigo_articulo, true, true).FirstOrDefault();
                            if (currProc != null)
                            {
                                //determino los valores de depreciados segun corresponda
                                var depreciado = new DETAIL_DEPRECIATE(currProc, 0, newfecha);
                                //ingreso parametros
                                decimal monto_param;
                                if (depreciado.val_AF_cm != 0)
                                {
                                    SV_PARAMETER currParam = parametros.PrecioBase;
                                    monto_param = depreciado.val_AF_cm / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.DA_AF != 0)
                                {
                                    SV_PARAMETER currParam = parametros.DepreciacionAcum;
                                    monto_param = depreciado.DA_AF / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.credi_adi_cm != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Credito;
                                    monto_param = depreciado.credi_adi_cm / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.deter != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Deterioro;
                                    monto_param = depreciado.deter / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.val_res != 0)
                                {
                                    SV_PARAMETER currParam = parametros.ValorResidual;
                                    monto_param = depreciado.val_res / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.vu_resi != 0)
                                {
                                    SV_PARAMETER currParam = parametros.VidaUtil;
                                    res = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, depreciado.vu_resi);
                                }
                                if (depreciado.preparacion != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Preparacion;
                                    monto_param = depreciado.preparacion / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.transporte != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Transporte;
                                    monto_param = depreciado.transporte / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.montaje != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Montaje;
                                    monto_param = depreciado.montaje / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.desmantelamiento != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Desmantelamiento;
                                    monto_param = depreciado.desmantelamiento / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.honorario != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Honorario;
                                    monto_param = depreciado.honorario / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                                if (depreciado.revalorizacion != 0)
                                {
                                    SV_PARAMETER currParam = parametros.Revalorizacion;
                                    monto_param = depreciado.revalorizacion / depreciado.cantidad;
                                    res         = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, currParam.id, monto_param);
                                }
                            }
                            else
                            {
                                res.set(-4, "No se encontro información vigente para dar de baja");
                                return(res);
                            }
                        }
                        else //if (currSys.ENVIORMENT.depreciation_rate == "monthly")
                        {
                            //copio los detalles de valores anteriores a la nueva cabecera (no aplica ningun calculo adicional)
                            List <SV_TRANSACTION_PARAMETER_DETAIL> findDetailsParams = DetallesParametros.ByHeadSys(headPrev.id, currSys);
                            foreach (var DetParam in findDetailsParams)
                            {
                                //ingreso detalle de parametros
                                res = REGISTER_PARAM_DETAIL(headDown.id, currSys.id, DetParam.paratemer_id, DetParam.parameter_value);
                                if (res.codigo < 0)
                                {
                                    return(res);
                                }
                            }
                        }
                    }
                }
                //actualizo detalles de inventarios
                res = ACTUALIZA_PARTES_HASTA(detalle_articulos, partToDown.id, newcantidad, newfecha);
                if (res.codigo < 0)
                {
                    return(res);
                }
                res.set_ok();
            }
            catch (Exception ex)
            {
                res.set(-1, ex.StackTrace);
            }
            return(res);
        }
        public RespuestaAccion REGISTER_PURCHASE_PARAM(int head_id, SV_SYSTEM sistema, SV_PARAMETER parametro, decimal valor)
        {
            var res = new RespuestaAccion();

            try
            {
                TRANSACTION_PARAMETER_DETAIL nuevo_param = new TRANSACTION_PARAMETER_DETAIL();
                nuevo_param.trx_head_id     = head_id;
                nuevo_param.system_id       = sistema.id;
                nuevo_param.paratemer_id    = parametro.id;
                nuevo_param.parameter_value = valor;

                _context.TRANSACTIONS_PARAMETERS_DETAILS.AddObject(nuevo_param);
                _context.SaveChanges();
                res.result_objs.Add((SV_TRANSACTION_PARAMETER_DETAIL)nuevo_param);
                res.set_ok();
            }
            catch (Exception ex)
            {
                res.set(-1, ex.StackTrace);
            }
            return(res);
        }
Beispiel #7
0
        public List <DETAIL_PROCESS> get_changed(SV_SYSTEM RqSistema, DateTime desde, DateTime hasta, int codigo, int parte, bool WithParameters, SV_KIND[] clases, SV_ZONE[] zonas)
        {
            var salida = new List <DETAIL_PROCESS>();

            int[] default_clase = new int[] { 1 };
            int[] default_zona  = new int[] { 0 };
            int[] rq_cl         = default_clase,
            rq_zn   = default_zona,
            rq_type = default_zona;
            //Some values are fixed from original get_detailed
            string[] aprobados = EstadoAprobacion.ArrOnlyActive;
            bool     CheckPost = true;

            if (clases != null)
            {
                rq_cl   = clases.Select(c => c.id).ToArray();
                rq_type = clases.Select(c => c.type_asset_id).Distinct().ToArray();
            }

            if (zonas != null)
            {
                rq_zn = zonas.Select(c => c.id).ToArray();
            }

            var def_clas = default_clase[0];
            var def_zon  = default_zona[0];


            var datos = (from A in this._context.BATCHS_ARTICLES
                         join B in this._context.PARTS on A.id equals B.article_id
                         join C in this._context.TRANSACTIONS_HEADERS
                         on B.id equals C.article_part_id
                         join D in this._context.TRANSACTIONS_DETAILS
                         on C.id equals D.trx_head_id
                         where
                         (C.trx_ini >= desde &&
                          C.trx_ini <= hasta) &&
                         (A.id == codigo || codigo == 0) &&
                         (B.part_index == parte || parte == -99) &&
                         (rq_cl.Contains(C.kind_id) || rq_cl.Contains(def_clas)) &&
                         (rq_zn.Contains(C.zone_id) || rq_zn.Contains(def_zon)) &&
                         (rq_type.Contains(A.type_asset_id) || rq_type.Contains(def_zon)) &&
                         (A.account_date <= hasta || !CheckPost) &&
                         aprobados.Contains(A.APROVAL_STATE.code) &&
                         (C.ref_source.Contains("TRAS")) &&
                         D.system_id == RqSistema.id
                         select new
            {
                //Batch = A,
                BatchId = A.id,
                BatchDescription = A.descrip,
                BatchPurchaseDate = A.purchase_date,
                BatchAprovalStateId = A.aproval_state_id,
                BatchInitialPrice = A.initial_price,
                BatchInitialLifeTime = A.initial_life_time,
                BatchAccountDate = A.account_date,
                BatchOriginId = A.origin_id,
                BatchAssetId = A.type_asset_id,
                //Part = B,
                PartIndex = B.part_index,
                PartQuantity = B.quantity,
                PartId = B.id,
                PartFirstDate = B.first_date,
                //Head = C,
                HeadTrxIni = C.trx_ini,
                HeadTrxEnd = C.trx_end,
                HeadZoneId = C.zone_id,
                HeadKindId = C.kind_id,
                HeadCategoryId = C.category_id,
                HeadSubZoneId = C.subzone_id,
                HeadSubkindId = C.subkind_id,
                HeadManageId = C.manage_id,
                HeadUserOwn = C.user_own,
                HeadId = C.id,
                HeadRefSource = C.ref_source,
                MethodRevalId = C.method_revalue_id,
                //Detail = D
                DetailValidityId = D.validity_id,
                DetailDepreciate = D.depreciate,
                DetailAllowCredit = D.allow_credit,
                DetailId = D.id
            });

            var selectedHeads = datos.Select(d => d.HeadId).Distinct().ToArray();

            set_detalle_parametros(RqSistema.id, selectedHeads);
            var all_params = this.parametros_sistemas.BySystem(RqSistema.id);

            foreach (var d in datos)
            {
                var line = new DETAIL_PROCESS();
                line.fecha_proceso = desde;
                line.sistema       = RqSistema;
                //Batch = A,
                line.cod_articulo      = d.BatchId;
                line.dscrp             = d.BatchDescription;
                line.dsc_extra         = d.BatchDescription;
                line.fecha_compra      = d.BatchPurchaseDate;
                line.aprobacion        = this.EstadoAprobacion.ById(d.BatchAprovalStateId);
                line.precio_inicial    = d.BatchInitialPrice;
                line.vida_util_inicial = ((RqSistema.ENVIORMENT.code == "IFRS") ? (int)(Math.Round((double)(d.BatchInitialLifeTime / 12 * 365), 0)) : d.BatchInitialLifeTime);
                line.fecha_ing         = d.BatchAccountDate;
                line.origen            = this.origenes.ById(d.BatchOriginId);
                line.tipo = this.Tipos.ById(d.BatchAssetId);
                //Part = B,
                line.parte        = d.PartIndex;
                line.cantidad     = d.PartQuantity;
                line.PartId       = d.PartId;
                line.PrimeraFecha = d.PartFirstDate;
                //Head = C,
                line.fecha_inicio = d.HeadTrxIni;
                line.fecha_fin    = d.HeadTrxEnd;
                line.zona         = this.zonas.ById(d.HeadZoneId);
                line.clase        = this.Clases.ById(d.HeadKindId);
                line.categoria    = this.categorias.ById(d.HeadCategoryId);
                line.subzona      = this.subzonas.ById(d.HeadSubZoneId);
                line.subclase     = this.subclases.ById(d.HeadSubkindId);
                line.gestion      = this.gestiones.ById(d.HeadManageId);
                line.usuario      = d.HeadUserOwn;
                line.HeadId       = d.HeadId;
                line.RefSource    = d.HeadRefSource;
                line.metodo_reval = this.MetodosRev.ById(d.MethodRevalId);
                //Detail = D
                line.vigencia        = this.Vigencias.ById(d.DetailValidityId);
                line.se_deprecia     = d.DetailDepreciate;
                line.derecho_credito = d.DetailAllowCredit;
                line.DetailId        = d.DetailId;

                line.documentos = this.documentos.ByBatch(d.BatchId);

                if (WithParameters)
                {
                    //Complete TRANSACTIONS_PARAMETERS_DETAILS collection
                    var valores   = new LIST_PARAM_VALUE();
                    var curr_vals = this.DetallesParametros.ByHead_Sys(d.HeadId, RqSistema.id);
                    foreach (var par in all_params)
                    {
                        SV_PARAMETER meta_param = this.parametros.ById(par.parameter_id);
                        PARAM_VALUE  det;
                        var          act_val = curr_vals.Find(x => x.code == meta_param.code);
                        if (act_val == null)
                        {
                            det = PARAM_VALUE.NoValue(meta_param);
                        }
                        else
                        {
                            det = act_val;
                        }
                        valores.Add(det);
                    }
                    line.parametros = valores;
                    //Complete SCHEMA sales
                    line.precio_venta = this.ventas.GetPriceSalesByPart(d.PartId, RqSistema.CURRENCY);
                }
                salida.Add(line);
            }

            return(salida);
        }
Beispiel #8
0
        //public test test_add()
        //{

        //    return test_add("hola", 1, new DateTime(2019, 3, 3));
        //}
        //public test test_add(string texto, int numero, DateTime fecha)
        //{
        //    var row = new test();
        //    row.texto = texto;
        //    row.numero = numero;
        //    row.fecha = fecha;

        //    var rel = new rel_test();
        //    rel.texto_rel = texto + numero.ToString();
        //    rel.test = row;
        //    //_context.tests.AddObject(row);
        //    _context.rel_test.AddObject(rel);
        //    _context.SaveChanges();
        //    return row;
        //}
        #endregion

        #region Datos Generales
        public List <DETAIL_PROCESS> get_detailed(SV_SYSTEM sistema, DateTime corte, int codigo, string[] aprobados, bool WithParameters, bool CheckPost, GENERIC_VALUE clase, GENERIC_VALUE zona)
        {
            var salida = new List <DETAIL_PROCESS>();
            int default_clase = 1;
            int default_zona = 0;
            int rq_cl = default_clase, rq_zn = default_zona, rq_type = 0;

            if (clase != null)
            {
                rq_cl = clase.id;
                if (clase.code == "10")
                {
                    rq_type = 1;
                    rq_cl   = default_clase;
                }
                if (clase.code == "20")
                {
                    rq_type = 2;
                    rq_cl   = default_clase;
                }
            }
            if (zona != null)
            {
                rq_zn = zona.id;
            }

            var datos = (from A in this._context.BATCHS_ARTICLES
                         join B in this._context.PARTS on A.id equals B.article_id
                         join C in this._context.TRANSACTIONS_HEADERS
                         on B.id equals C.article_part_id
                         join D in this._context.TRANSACTIONS_DETAILS
                         on C.id equals D.trx_head_id
                         where
                         (C.trx_ini <= corte &&
                          C.trx_end > corte) &&
                         (A.id == codigo || codigo == 0) &&
                         (C.kind_id == rq_cl || rq_cl == default_clase) &&
                         (C.zone_id == rq_zn || rq_zn == default_zona) &&
                         (A.type_asset_id == rq_type || rq_type == 0) &&
                         (A.account_date <= corte || !CheckPost) &&
                         aprobados.Contains(A.APROVAL_STATE.code) &&
                         D.system_id == sistema.id
                         select new {
                //Batch = A,
                BatchId = A.id,
                BatchDescription = A.descrip,
                BatchPurchaseDate = A.purchase_date,
                BatchAprovalStateId = A.aproval_state_id,
                BatchInitialPrice = A.initial_price,
                BatchInitialLifeTime = A.initial_life_time,
                BatchAccountDate = A.account_date,
                BatchOriginId = A.origin_id,
                BatchAssetId = A.type_asset_id,
                //Part = B,
                PartIndex = B.part_index,
                PartQuantity = B.quantity,
                PartId = B.id,
                PartFirstDate = B.first_date,
                //Head = C,
                HeadTrxIni = C.trx_ini,
                HeadTrxEnd = C.trx_end,
                HeadZoneId = C.zone_id,
                HeadKindId = C.kind_id,
                HeadCategoryId = C.category_id,
                HeadSubZoneId = C.subzone_id,
                HeadSubkindId = C.subkind_id,
                HeadManageId = C.manage_id,
                HeadUserOwn = C.user_own,
                HeadId = C.id,
                HeadIndex = C.head_index,
                HeadRefSource = C.ref_source,
                MethodRevalId = C.method_revalue_id,
                //Detail = D
                DetailValidityId = D.validity_id,
                DetailDepreciate = D.depreciate,
                DetailAllowCredit = D.allow_credit,
                DetailId = D.id,
            }).ToList();
            var selectedHeads = datos.
                                GroupBy(d => d.PartId).
                                Select(d =>
                                       //new {
                                       //PartId = d.Key,
                                       //HeadMaxId = d.Max(e => e.HeadIndex), HeadId =
                                       d.Where(e => e.HeadIndex == d.Max(f => f.HeadIndex))
                                       .FirstOrDefault().HeadId
                                       //}
                                       ).ToArray();

            //var selectedHeads = datos.Select(d => d.HeadId).Distinct().ToArray();
            set_detalle_parametros(sistema.id, selectedHeads);
            var all_params = this.parametros_sistemas.BySystem(sistema.id);

            foreach (var d in datos.Where(a => selectedHeads.Contains(a.HeadId)))
            {
                var line = new DETAIL_PROCESS();
                line.fecha_proceso  = corte;
                line.sistema        = sistema;
                line.cod_articulo   = d.BatchId;
                line.parte          = d.PartIndex;
                line.fecha_inicio   = d.HeadTrxIni;
                line.fecha_fin      = d.HeadTrxEnd;
                line.zona           = this.zonas.ById(d.HeadZoneId);
                line.vigencia       = this.Vigencias.ById(d.DetailValidityId);
                line.cantidad       = d.PartQuantity;
                line.clase          = this.Clases.ById(d.HeadKindId);
                line.categoria      = this.categorias.ById(d.HeadCategoryId);
                line.subzona        = this.subzonas.ById(d.HeadSubZoneId);
                line.subclase       = this.subclases.ById(d.HeadSubkindId);
                line.gestion        = this.gestiones.ById(d.HeadManageId);
                line.usuario        = d.HeadUserOwn;
                line.se_deprecia    = d.DetailDepreciate;
                line.aprobacion     = this.EstadoAprobacion.ById(d.BatchAprovalStateId);
                line.dscrp          = d.BatchDescription;
                line.dsc_extra      = this.inv_articulos_details.ExtraDescrip(d.BatchId);
                line.fecha_compra   = d.BatchPurchaseDate;
                line.documentos     = this.documentos.ByBatch(d.BatchId);
                line.precio_inicial = d.BatchInitialPrice;
                if (sistema.ENVIORMENT.code == "IFRS")
                {
                    line.vida_util_inicial = (int)(Math.Round((double)(d.BatchInitialLifeTime / 12 * 365), 0));
                }
                else
                {
                    line.vida_util_inicial = d.BatchInitialLifeTime;
                }
                line.derecho_credito = d.DetailAllowCredit;
                line.fecha_ing       = d.BatchAccountDate;
                line.origen          = this.origenes.ById(d.BatchOriginId);
                line.tipo            = this.Tipos.ById(d.BatchAssetId);
                line.metodo_reval    = this.MetodosRev.ById(d.MethodRevalId);

                line.PartId    = d.PartId;
                line.HeadId    = d.HeadId;
                line.DetailId  = d.DetailId;
                line.RefSource = d.HeadRefSource;
                if (WithParameters)
                {
                    //Complete TRANSACTIONS_PARAMETERS_DETAILS collection
                    var valores   = new LIST_PARAM_VALUE();
                    var curr_vals = this.DetallesParametros.ByHead_Sys(d.HeadId, sistema.id);
                    foreach (var par in all_params)
                    {
                        SV_PARAMETER meta_param = this.parametros.ById(par.parameter_id);
                        PARAM_VALUE  det;
                        var          act_val = curr_vals.Find(x => x.code == meta_param.code);
                        if (act_val == null)
                        {
                            det = PARAM_VALUE.NoValue(meta_param);
                        }
                        else
                        {
                            det = act_val;
                        }
                        valores.Add(det);
                    }
                    line.parametros = valores;
                    //Complete SCHEMA sales
                    line.precio_venta = this.ventas.GetPriceSalesByPart(d.PartId, sistema.CURRENCY);
                }
                salida.Add(line);
            }

            return(salida);
        }