1import{b as _}from"./chunk-RKFGIQC5.js";import{a as V}from"./chunk-35HRW46N.js";import{$ as p,Ba as b,Fa as P,Ja as d,Ta as z,Wa as q,ga as $,jb as y,k as T,nb as D,qa as S,sa as x,vb as E,yb as h,zb as F}from"./chunk-MIPRGDUR.js";import{H as A,T as C,W as M,ca as R,ha as g,o as I,u as w}from"./chunk-DJYDUQFJ.js";import{a as v,b as f,d as O}from"./chunk-QJI7QS7F.js";var k=[{value:"accion",label:"Acciones"},{value:"fondo_mutuo",label:"Fondo mutuo / ETF"},{value:"deposito_plazo",label:"Dep\xF3sito a plazo"},{value:"bono",label:"Bonos / renta fija"},{value:"cripto",label:"Criptoactivos"},{value:"inmobiliaria",label:"Inmobiliaria"},{value:"startup",label:"Participaci\xF3n en startup"},{value:"maquinaria",label:"Activo productivo / maquinaria"},{value:"investigacion",label:"I+D e innovaci\xF3n"},{value:"otro",label:"Otro"}],B=[{value:"evaluacion",label:"En evaluaci\xF3n"},{value:"activa",label:"Activa"},{value:"pausada",label:"Pausada"},{value:"liquidada",label:"Liquidada"}],H=[{value:"bajo",label:"Bajo"},{value:"medio",label:"Medio"},{value:"alto",label:"Alto"}],G=[{value:"aporte",label:"Aporte",ayuda:"Capital que entra a la posici\xF3n."},{value:"retiro",label:"Retiro",ayuda:"Capital que sale (venta parcial o rescate)."},{value:"rendimiento",label:"Rendimiento",ayuda:"Dividendo, inter\xE9s o cup\xF3n cobrado."},{value:"valorizacion",label:"Valorizaci\xF3n",ayuda:"Nuevo valor de mercado de la posici\xF3n."},{value:"costo",label:"Costo",ayuda:"Comisi\xF3n, custodia o impuesto asociado."}];function j(c){let e=c.totalAportes||0,i=c.totalRetiros||0,o=c.totalRendimientos||0,t=c.totalCostos||0,a=Math.max(e-i,0),r=c.valorActual||0,n=r+i+o-e-t,s=e>0?n/e*100:0,u=m(c.fechaInicio),l=u?Math.max(Math.floor((Date.now()-u.getTime())/864e5),0):0;return{capitalInvertido:a,valorActual:r,ganancia:n,rentabilidad:s,diasEnCartera:l}}function m(c){if(!c)return null;if(c instanceof Date)return c;if(typeof c?.toDate=="function")return c.toDate();let e=new Date(c);return isNaN(e.getTime())?null:e}var U=class c{firestore=g($);authService=g(V);auditService=g(_);coleccion="inversiones";coleccionMovimientos="inversionMovimientos";getInversiones(){return this.authService.tenantId$.pipe(M(e=>{if(!e)return I([]);let i=y(b(this.firestore,this.coleccion),h("tenantId","==",e));return S(i,{idField:"id"}).pipe(w(o=>o.sort((t,a)=>{let r=m(t.fechaInicio)?.getTime()??0;return(m(a.fechaInicio)?.getTime()??0)-r})),A(o=>(console.error("[Inversiones] Error de consulta:",o),I([]))))}),C({bufferSize:1,refCount:!0}))}getInversion(e){let i=d(this.firestore,`${this.coleccion}/${e}`);return x(i,{idField:"id"})}async crear(e){let i=await this.tenantIdOrThrow(),o=await this.auditService.selloCreacion(),t=d(b(this.firestore,this.coleccion)),a=Number(e.valorActual)||0,r=f(v({},o),{id:t.id,tenantId:i,nombre:(e.nombre||"").trim(),descripcion:e.descripcion||"",tipo:e.tipo||"otro",moneda:e.moneda||"CLP",valorActual:a,estado:e.estado||"activa",riesgo:e.riesgo||"medio",institucion:e.institucion||"",fechaInicio:e.fechaInicio||T.now(),fechaFin:e.fechaFin??null,rentabilidadObjetivo:Number(e.rentabilidadObjetivo)||0,responsableId:e.responsableId||"",responsableNombre:e.responsableNombre||"",clienteId:e.clienteId||"",proyectoId:e.proyectoId||"",notas:e.notas||"",documentoUrl:e.documentoUrl||"",totalAportes:0,totalRetiros:0,totalRendimientos:0,totalCostos:0,createdAt:p(),updatedAt:p()});return await D(t,r),a>0&&await this.registrarMovimiento(t.id,{tipo:"aporte",monto:a,fecha:r.fechaInicio,descripcion:"Aporte inicial"},r),this.auditService.logCrear("inversion",t.id,r.nombre).catch(()=>{}),t.id}async actualizar(e,i){let o=await this.auditService.selloActualizacion(),N=i,{tenantId:t,id:a,createdAt:r,totalAportes:n,totalRetiros:s,totalRendimientos:u,totalCostos:l}=N,L=O(N,["tenantId","id","createdAt","totalAportes","totalRetiros","totalRendimientos","totalCostos"]);await E(d(this.firestore,`${this.coleccion}/${e}`),f(v(v({},L),o),{updatedAt:p()})),this.auditService.logActualizar("inversion",e,i.nombre).catch(()=>{})}async cambiarEstado(e,i){if(!e.id)return;let o=String(e.estado??"");await this.actualizar(e.id,{estado:i}
1),this.auditService.logCambioEstado("inversion",e.id,o,i).catch(()=>{})}async eliminar(e,i){let o=await this.movimientosUnaVez(e);if(o.length+1>500)throw new Error(`La inversi\xF3n tiene ${o.length} movimientos y no se puede borrar de una sola vez. No se borr\xF3 nada; contacta a soporte.`);let t=F(this.firestore);o.forEach(a=>t.delete(d(this.firestore,`${this.coleccionMovimientos}/${a.id}`))),t.delete(d(this.firestore,`${this.coleccion}/${e}`));try{await t.commit()}catch(a){throw a?.code==="permission-denied"?new Error("No tienes permiso para eliminar inversiones: s\xF3lo un administrador puede hacerlo. No se borr\xF3 nada."):a}this.auditService.logEliminar("inversion",e,i).catch(()=>{})}getMovimientos(e){return this.authService.tenantId$.pipe(M(i=>{if(!i)return I([]);let o=y(b(this.firestore,this.coleccionMovimientos),h("tenantId","==",i),h("inversionId","==",e));return S(o,{idField:"id"}).pipe(w(t=>this.ordenar(t).reverse()),A(t=>(console.error("[Inversiones] Error leyendo movimientos:",t),I([]))))}))}async registrarMovimiento(e,i,o){let t=await this.tenantIdOrThrow(),a=await this.auditService.selloCreacion(),r=o??await this.leerInversion(e),n=d(b(this.firestore,this.coleccionMovimientos)),s=f(v({},a),{id:n.id,tenantId:t,inversionId:e,tipo:i.tipo,monto:Number(i.monto)||0,moneda:r.moneda,fecha:i.fecha||T.now(),descripcion:i.descripcion||"",referencia:i.referencia||"",createdAt:p()});return await D(n,s),await this.recalcular(e),this.auditService.log({accion:"crear",entidadTipo:"movimiento_inversion",entidadId:n.id,entidadNombre:r.nombre,detalles:`${i.tipo}: ${s.monto} ${r.moneda}`}).catch(()=>{}),n.id}async eliminarMovimiento(e){e.id&&(await P(d(this.firestore,`${this.coleccionMovimientos}/${e.id}`)),await this.recalcular(e.inversionId),this.auditService.logEliminar("movimiento_inversion",e.id,`${e.tipo} ${e.monto}`).catch(()=>{}))}async recalcular(e){let i=this.ordenar(await this.movimientosUnaVez(e)),o=0,t=0,a=0,r=0,n=0,s=null;for(let u of i){let l=Number(u.monto)||0;switch(u.tipo){case"aporte":t+=l,o+=l;break;case"retiro":a+=l,o-=l;break;case"rendimiento":r+=l;break;case"costo":n+=l;break;case"valorizacion":o=l,s=u.fecha;break}}await E(d(this.firestore,`${this.coleccion}/${e}`),{valorActual:o,totalAportes:t,totalRetiros:a,totalRendimientos:r,totalCostos:n,ultimaValorizacion:s,updatedAt:p()})}resumenCartera(e){let i=e.filter(n=>n.estado!=="liquidada"),o=0,t=0,a=0,r=new Map;for(let n of i){let s=j(n);o+=s.capitalInvertido,t+=s.valorActual,a+=s.ganancia,r.set(String(n.tipo),(r.get(String(n.tipo))||0)+s.valorActual)}return{posiciones:e.length,activas:e.filter(n=>n.estado==="activa").length,capitalInvertido:o,valorActual:t,ganancia:a,rentabilidad:o>0?a/o*100:0,porTipo:Array.from(r.entries()).map(([n,s])=>({tipo:n,valorActual:s,peso:t>0?s/t*100:0})).sort((n,s)=>s.valorActual-n.valorActual)}}ordenar(e){return[...e].sort((i,o)=>{let t=m(i.fecha)?.getTime()??0,a=m(o.fecha)?.getTime()??0;if(t!==a)return t-a;let r=m(i.createdAt)?.getTime()??0,n=m(o.createdAt)?.getTime()??0;return r-n})}async movimientosUnaVez(e){let i=await this.tenantIdOrThrow();return(await q(y(b(this.firestore,this.coleccionMovimientos),h("tenantId","==",i),h("inversionId","==",e)))).docs.map(t=>v({id:t.id},t.data()))}async leerInversion(e){let i=await z(d(this.firestore,`${this.coleccion}/${e}`));if(!i.exists())throw new Error("La inversi\xF3n no existe o fue eliminada.");return v({id:i.id},i.data())}async tenantIdOrThrow(){let e=await this.authService.getTenantId();if(!e)throw new Error("Sesi\xF3n sin tenant asignado.");return e}static \u0275fac=function(i){return new(i||c)};static \u0275prov=R({token:c,factory:c.\u0275fac,providedIn:"root"})};export{k as a,B as b,H as c,G as d,j as e,m as f,U as g};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.