import{t as e}from"./db-D2Po16Ap.js";import{B as t,L as n,N as r,S as i,x as a}from"./Card-Cxq4Ee-X.js";import{o}from"./now-Ds5hQLtP.js";import{o as s}from"./storedLabels-Cp0Gl0kW.js";import{r as c}from"./formatSettings-BmCn9wYJ.js";function l(){return crypto.randomUUID?.()??`_${Date.now()}_${Math.random().toString(36).slice(2)}`}async function u(){return e.debts.orderBy(`createdAt`).toArray()}async function d(t){let n=new Date().toISOString(),r={id:l(),name:t.name.trim()||`Долг`,totalRub:Math.max(0,Math.round(t.totalRub)),paidRub:0,active:!0,debtKind:t.debtKind,dueDateISO:t.dueDateISO,minPaymentRub:t.minPaymentRub,paymentSchedule:t.paymentSchedule,notes:t.notes,createdAt:n,updatedAt:n};return await e.debts.add(r),r}async function f(t,n){let r=await e.debts.get(t);if(!r)return;let i={...r,...n,totalRub:n.totalRub==null?r.totalRub:Math.max(0,Math.round(n.totalRub)),paidRub:n.paidRub==null?r.paidRub:Math.max(0,Math.round(n.paidRub)),updatedAt:new Date().toISOString()};return await e.debts.put(i),i}async function p(t){await e.transaction(`rw`,e.debts,e.debtPayments,async()=>{await e.debtPayments.where(`debtId`).equals(t).delete(),await e.debts.delete(t)})}async function m(t){let n=await e.debts.get(t.debtId);if(!n)return null;let r=new Date().toISOString(),i=Math.max(0,Math.round(t.amountRub)),a={id:l(),debtId:t.debtId,dateISO:t.dateISO,amountRub:i,source:t.source,linkedIncomeId:t.linkedIncomeId,createdAt:r};return await e.transaction(`rw`,e.debts,e.debtPayments,async()=>{await e.debtPayments.add(a),await e.debts.update(t.debtId,{paidRub:n.paidRub+i,updatedAt:r})}),a}async function h(){return(await e.debts.toArray()).reduce((e,t)=>e+Math.max(0,t.totalRub-t.paidRub),0)}async function g(t){let[n,r]=t.split(`-`).map(Number),i=new Date(n,r,0).getDate(),a=`${t}-01`,o=`${t}-${String(i).padStart(2,`0`)}`;return e.debtPayments.where(`dateISO`).between(a,o,!0,!0).toArray()}async function _(t){let n=(await e.debtPayments.toArray()).filter(e=>e.linkedIncomeId===t);n.length!==0&&await e.transaction(`rw`,e.debts,e.debtPayments,async()=>{for(let t of n){let n=await e.debts.get(t.debtId);n&&await e.debts.update(t.debtId,{paidRub:Math.max(0,n.paidRub-t.amountRub),updatedAt:new Date().toISOString()}),await e.debtPayments.delete(t.id)}})}function v(){return crypto.randomUUID?.()??`_${Date.now()}_${Math.random().toString(36).slice(2)}`}async function ee(){return e.savingsGoals.orderBy(`createdAt`).toArray()}async function te(t){let n=new Date().toISOString(),r={id:v(),name:t.name.trim()||`Цель`,targetRub:Math.max(0,Math.round(t.targetRub)),savedRub:0,active:!0,itemKind:t.itemKind,targetDateISO:t.targetDateISO,importance1to10:t.importance1to10,notes:t.notes,createdAt:n,updatedAt:n};return await e.savingsGoals.add(r),r}async function y(t,n){let r=await e.savingsGoals.get(t);if(!r)return;let i={...r,...n,targetRub:n.targetRub==null?r.targetRub:Math.max(0,Math.round(n.targetRub)),savedRub:n.savedRub==null?r.savedRub:Math.max(0,Math.round(n.savedRub)),updatedAt:new Date().toISOString()};return await e.savingsGoals.put(i),i}async function b(t){await e.transaction(`rw`,e.savingsGoals,e.savingsContributions,async()=>{await e.savingsContributions.where(`goalId`).equals(t).delete(),await e.savingsGoals.delete(t)})}async function x(t){let n=await e.savingsGoals.get(t.goalId);if(!n)return null;let r=new Date().toISOString(),i=Math.max(0,Math.round(t.amountRub)),a={id:v(),goalId:t.goalId,dateISO:t.dateISO,amountRub:i,source:t.source,linkedIncomeId:t.linkedIncomeId,createdAt:r};return await e.transaction(`rw`,e.savingsGoals,e.savingsContributions,async()=>{await e.savingsContributions.add(a),await e.savingsGoals.update(t.goalId,{savedRub:n.savedRub+i,updatedAt:r})}),a}async function S(t){let n=`${t}-01`,[r,i]=t.split(`-`).map(Number),a=new Date(r,i,0).getDate(),o=`${t}-${String(a).padStart(2,`0`)}`;return e.savingsContributions.where(`dateISO`).between(n,o,!0,!0).toArray()}async function C(t,n={}){let{monthISO:r,limit:i}=n,a=await e.savingsContributions.where(`goalId`).equals(t).toArray();if(r!=null&&r!==``){let[e,t]=r.split(`-`).map(Number),n=`${r}-01`,i=new Date(e,t,0).getDate(),o=`${r}-${String(i).padStart(2,`0`)}`;a=a.filter(e=>e.dateISO>=n&&e.dateISO<=o)}return a.sort((e,t)=>{let n=t.dateISO.localeCompare(e.dateISO);return n===0?(t.createdAt??``).localeCompare(e.createdAt??``):n}),i!=null&&i>0&&(a=a.slice(0,i)),a}async function ne(t){let n=await e.savingsContributions.get(t);if(!n)return!1;let r=await e.savingsGoals.get(n.goalId);return r?(await e.transaction(`rw`,e.savingsGoals,e.savingsContributions,async()=>{await e.savingsContributions.delete(t);let i=Math.max(0,r.savedRub-n.amountRub);await e.savingsGoals.update(n.goalId,{savedRub:i,updatedAt:new Date().toISOString()})}),!0):!1}async function w(t){let n=await e.savingsContributions.get(t);return n?x({goalId:n.goalId,dateISO:o(),amountRub:n.amountRub,source:`repeat`}):null}async function T(t){let n=(await e.savingsContributions.toArray()).filter(e=>e.linkedIncomeId===t);n.length!==0&&await e.transaction(`rw`,e.savingsGoals,e.savingsContributions,async()=>{for(let t of n){let n=await e.savingsGoals.get(t.goalId);n&&await e.savingsGoals.update(t.goalId,{savedRub:Math.max(0,n.savedRub-t.amountRub),updatedAt:new Date().toISOString()}),await e.savingsContributions.delete(t.id)}})}var E=new Set([`Накопление`,`Savings`,`накопление`,`savings`].map(e=>s(e)));function D(e){return e.type===`expense`?E.has(s(e.category)):!1}function O(e){return e.type===`expense`&&!D(e)}function k(e,r){return t(`finance.db.${e}`,r,n())}function A(){return crypto.randomUUID?.()??`_${Date.now()}_${Math.random().toString(36).slice(2)}`}function j(e){let[t,n]=e.split(`-`).map(Number),r=new Date(t,n,0).getDate();return`${e}-${String(r).padStart(2,`0`)}`}async function re(t){let n=new Date().toISOString(),r={id:A(),date:t.dateISO,amount:Math.round(t.amount),type:t.type,category:t.category,incomeSource:t.incomeSource,linkedIncomeId:t.linkedIncomeId,merchant:null,note:t.note??null,createdAt:n};return await e.transactions.add(r),await $(r,`add`),r}function M(e,t){return{id:A(),date:e.dateISO,amount:Math.round(e.amount),type:e.type,category:e.category,incomeSource:e.incomeSource,linkedIncomeId:e.linkedIncomeId,merchant:null,note:e.note??null,createdAt:t}}async function ie(t){let[n,r,i]=await Promise.all([F(t),e.savingsContributions.toArray(),e.debtPayments.toArray()]);return n.length>0||r.some(e=>e.linkedIncomeId===t)||i.some(e=>e.linkedIncomeId===t)}async function ae(t){let n=new Date().toISOString(),r=M({dateISO:t.dateISO,amount:t.amount,type:`income`,category:t.category,note:t.note??null,incomeSource:t.incomeSource??`salary`},n),i=[r],o=[],s=[],l={kind:`salary_income`,message:``,transactionIds:[r.id],savingsContributionIds:[],debtPaymentIds:[]},u=await a(),d=e=>c(e,u?.app);await e.transaction(`rw`,[e.transactions,e.debts,e.debtPayments,e.savingsGoals,e.savingsContributions],async()=>{if(await e.transactions.add(r),t.autoDebt?.debtId&&t.autoDebt.amount>0){let a=await e.debts.get(t.autoDebt.debtId);if(!a)throw Error(k(`debtNotFound`));let s=M({dateISO:t.dateISO,amount:t.autoDebt.amount,type:`expense`,category:k(`categories.debtRepayment`),note:t.autoDebt.mode===`percent`?k(`autoNotePercent`,{value:t.autoDebt.value}):k(`autoNoteAmount`,{amount:d(t.autoDebt.amount)}),linkedIncomeId:r.id},n),c={id:A(),debtId:t.autoDebt.debtId,dateISO:t.dateISO,amountRub:Math.round(t.autoDebt.amount),source:`salary`,linkedIncomeId:r.id,createdAt:n};await e.transactions.add(s),await e.debtPayments.add(c),await e.debts.update(t.autoDebt.debtId,{paidRub:a.paidRub+c.amountRub,updatedAt:n}),i.push(s),o.push(c),l.transactionIds.push(s.id),l.debtPaymentIds.push(c.id)}if(t.autoSavings?.goalId&&t.autoSavings.amount>0){let a=await e.savingsGoals.get(t.autoSavings.goalId);if(!a)throw Error(k(`savingsGoalNotFound`));let o=M({dateISO:t.dateISO,amount:t.autoSavings.amount,type:`expense`,category:k(`categories.savings`),note:t.autoSavings.mode===`percent`?k(`autoNotePercent`,{value:t.autoSavings.value}):k(`autoNoteAmount`,{amount:d(t.autoSavings.amount)}),linkedIncomeId:r.id},n),c={id:A(),goalId:t.autoSavings.goalId,dateISO:t.dateISO,amountRub:Math.round(t.autoSavings.amount),source:`salary`,linkedIncomeId:r.id,createdAt:n};await e.transactions.add(o),await e.savingsContributions.add(c),await e.savingsGoals.update(t.autoSavings.goalId,{savedRub:a.savedRub+c.amountRub,updatedAt:n}),i.push(o),s.push(c),l.transactionIds.push(o.id),l.savingsContributionIds.push(c.id)}}),l.message=k(`salarySaved`,{parts:[k(`salaryPartIncome`,{amount:d(r.amount)}),o[0]?k(`salaryPartDebt`,{amount:d(o[0].amountRub)}):null,s[0]?k(`salaryPartGoal`,{amount:d(s[0].amountRub)}):null].filter(Boolean).join(`, `)}),l.transactionIds=i.map(e=>e.id);for(let e of i)await $(e,`add`);return{income:r,summary:l}}async function oe(t,n){let r=await e.transactions.get(t);if(!r)return;if(r.type===`income`&&await ie(t)&&(n.amount!=null||n.type!=null||n.category!=null||n.date!=null||n.incomeSource!=null))throw Error(k(`incomeAllocationsLocked`));let i={...r,...n};return await e.transactions.put(i),await ue(r,i),i}async function N(t){let n=await e.transactions.get(t);await e.transactions.delete(t),n&&await $(n,`remove`)}async function P(){await e.transactions.clear()}async function F(t){return(await e.transactions.toArray()).filter(e=>e.linkedIncomeId===t)}async function I(e){let t=await F(e);for(let e of t)await N(e.id);await T(e),await _(e)}async function L(t){if(!t?.monthISO)return await e.transactions.orderBy(`createdAt`).reverse().toArray();let n=`${t.monthISO}-01`,r=j(t.monthISO);return(await e.transactions.where(`date`).between(n,r,!0,!0).toArray()).sort((e,t)=>t.createdAt>e.createdAt?1:-1)}async function R(e){let t=await L({monthISO:e}),n=0,r=0,i={};for(let e of t){if(e.type===`income`){n+=e.amount;continue}O(e)&&(r+=e.amount,i[e.category]=(i[e.category]??0)+e.amount)}return{totalIncome:n,totalExpense:r,balance:n-r,totalsByCategory:i}}var z={monthlyAvailableRub:0,essentialBudgetsRub:[]};async function B(){let t=(await e.settings.get(`singleton`))?.budgetPlan;if(!t)return z;let n=Array.isArray(t.essentialBudgetsRub)?t.essentialBudgetsRub.map(e=>({...e,category:s(e.category)})):[];return{monthlyAvailableRub:t.monthlyAvailableRub??z.monthlyAvailableRub,essentialBudgetsRub:n}}async function V(t){let n=`${t}-01`,r=j(t);return(await e.savingsContributions.where(`dateISO`).between(n,r,!0,!0).toArray()).reduce((e,t)=>e+t.amountRub,0)}function H(e,t,n){let r=new Set(e.essentialBudgetsRub.map(e=>s(e.category))),i=e.essentialBudgetsRub.reduce((e,t)=>e+t.amount,0),a=e.monthlyAvailableRub,o=t.totalIncome,c=a-i<=0,l=t.totalsByCategory,u=0;for(let[e,t]of Object.entries(l))r.has(s(e))||(u+=t);let d=new Map(e.essentialBudgetsRub.map(e=>[s(e.category),e.amount])),f=0;for(let[e,t]of Object.entries(l)){let n=s(e);if(!r.has(n))continue;let i=d.get(n)??0;f+=Math.max(0,t-i)}let p=a-i,m=p-u-f,h=p>0?Math.max(0,Math.min(1,m/p)):p<0?mt-e)}async function q(){let e=(await a())?.app?.financeProfile?.currentBalanceRub;return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function J(){return(await a())?.app?.financeProfile?.balanceManualSetAtISO}function Y(e,t){return t?e>=t:!0}async function se(e,t){let n=Math.max(0,Math.round(e)),i=new Date().toISOString();if(t?.clearHistory){await P(),await r({app:{financeProfile:{currentBalanceRub:n,updatedAtISO:i,balanceManualSetAtISO:void 0}}});return}await r({app:{financeProfile:{currentBalanceRub:n,updatedAtISO:i,balanceManualSetAtISO:i}}})}function ce(e){if(e===``)return 0;let t=typeof e==`number`?e:Number(e);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function X(e){let t=Math.round(Math.abs(e.amount));return e.type===`income`?t:-t}function Z(e,t){return e.filter(e=>Y(e.createdAt,t)).reduce((e,t)=>e+X(t),0)}async function le(e){let t=(await a())?.app?.financeProfile;!t||t.balanceManualSetAtISO||await r({app:{financeProfile:{currentBalanceRub:Math.round(Z(e)),updatedAtISO:new Date().toISOString()}}})}async function Q(e){if(!e)return;let t=await q()??0;await r({app:{financeProfile:{currentBalanceRub:Math.round(t+e),updatedAtISO:new Date().toISOString()}}})}async function $(e,t){let n=await J();if(!Y(e.createdAt,n))return;let r=X(e);await Q(t===`add`?r:-r)}async function ue(e,t){let n=await J(),r=Y(e.createdAt,n),i=Y(t.createdAt,n),a=r?X(e):0;await Q((i?X(t):0)-a)}export{g as A,S as C,d as D,y as E,h as M,f as N,m as O,C as S,w as T,O as _,Z as a,ne as b,W as c,B as d,K as f,oe as g,I as h,se as i,u as j,p as k,ae as l,L as m,ce as n,re as o,R as p,le as r,U as s,q as t,N as u,x as v,ee as w,b as x,te as y};