1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9494],{25450:(e,t,a)=>{a.d(t,{A:()=>r});let r=(0,a(46775).A)("square-pen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]])},79494:(e,t,a)=>{a.r(t),a.d(t,{default:()=>C});var r=a(85047),n=a(31615),i=a(82520),s=a(21410),c=a(3208),d=a(866),l=a(96968),o=a(21582),u=a(18534),h=a(41178),x=a(54306),m=a(73521),y=a(24571),p=a(76458),j=a(15418),f=a(96774);let g=j.Ik({userId:j.Yj().min(1,"userId ä¸è½çºç©º"),accountId:j.Yj().min(1,"accountId ä¸è½çºç©º"),type:f.Z,amount:j.ai().positive("éé¡å¿
é å¤§æ¼ 0"),frequency:j.k5(["daily","weekly","monthly"]),startDate:j.Yj().regex(/^\d{4}-\d{2}-\d{2}$/,"æ¥ææ ¼å¼å¿
é çº YYYY-MM-DD"),endDate:j.Yj().regex(/^\d{4}-\d{2}-\d{2}$/,"æ¥ææ ¼å¼å¿
é çº YYYY-MM-DD").optional(),lastExecuted:j.Yj().regex(/^\d{4}-\d{2}$/,"æä»½æ ¼å¼å¿
é çº YYYY-MM").optional(),nextExecution:j.Yj().regex(/^\d{4}-\d{2}$/,"æä»½æ ¼å¼å¿
é çº YYYY-MM"),autoCreate:j.zM().default(!1),enabled:j.zM().default(!0),createdAt:j.bz(),updatedAt:j.bz().optional()}),v="recurring_transactions",w={async getRecurringTransactions(e){if(!p.db)throw Error("Firestore å°æªåå§å");if(!e)throw Error("ç¨æ¶ ID æªæä¾");let t=(0,y.P)((0,y.rJ)(p.db,v),(0,y._M)("userId","==",e));return(await (0,y.GG)(t)).docs.map(e=>({id:e.id,...e.data()}))},async addRecurringTransaction(e,t){if(!p.db)throw Error("Firestore å°æªåå§å");if(!e)throw Error("ç¨æ¶ ID æªæä¾");let a=y.Timestamp.now(),r={userId:e,...t,createdAt:a,updatedAt:a},n=g.parse(r),i=(0,y.doc)((0,y.rJ)(p.db,v));return await (0,y.setDoc)(i,n),i.id},async updateRecurringTransaction(e,t,a){if(!p.db)throw Error("Firestore å°æªåå§å");if(!e)throw Error("ç¨æ¶ ID æªæä¾");let r=(0,y.doc)(p.db,v,t),n=await (0,y.getDoc)(r);if(!n.exists())throw Error("å®æäº¤æä¸åå¨");if(n.data().userId!==e)throw Error("ç¡æ¬éä¿®æ¹æ¤å®æäº¤æ");let i=Object.prototype.hasOwnProperty.call(a,"endDate")&&void 0===a.endDate,{endDate:s,...c}=a,d={...c,...void 0!==s?{endDate:s}:{},updatedAt:y.Timestamp.now()},l={...g.partial().parse(d)};i&&(l.endDate=(0,y.CL)()),await (0,y.setDoc)(r,l,{merge:!0})},async deleteRecurringTransaction(e,t){if(!p.db)throw Error("Firestore å°æªåå§å");if(!e)throw Error("ç¨æ¶ ID æªæä¾");let a=(0,y.doc)(p.db,v,t),r=await (0,y.getDoc)(a);if(!r.exists())throw Error("å®æäº¤æä¸åå¨");if(r.data().userId!==e)throw Error("ç¡æ¬éåªé¤æ¤å®æäº¤æ");await (0,y.kd)(a)}};var b=a(12217),D=a(2687),I=a(18654),Y=a(42119),N=a(25450),E=a(54296);function C({type:e,requestOpenCreate:t}){let{toast:a}=(0,h.dj)(),{user:y,viewingUserId:p}=(0,m.A)(),j=p||y?.uid,[f,g]=(0,n.useState)([]),[v,k]=(0,n.useState)(!1),[q,M]=(0,n.useState)(null),[$,T]=(0,n.useState)([]),[A,S]=(0,n.useState)(!0),[R,J]=(0,n.use
1State)({accountId:"",type:"income",amount:"",frequency:"monthly",startDate:""});(0,n.useEffect)(()=>{j?(async()=>{try{let[t,a]=await Promise.all([w.getRecurringTransactions(j),b.W.getAllAccounts(j)]),r=e?t.filter(t=>t.type===e):t;g(r),T(a)}catch(e){(0,I.vV)("è¼å
¥å®æäº¤æå¤±æ:",e)}finally{S(!1)}})():S(!1)},[j,e]),(0,n.useEffect)(()=>{null==t||t<1||(J({accountId:"",type:e??"income",amount:"",frequency:"monthly",startDate:""}),M(null),k(!0))},[t,e]);let z=$.filter(e=>"income"===R.type?(0,D.Xd)(e.category):(0,D.I2)(e.category)),F=async()=>{if(!R.accountId||!R.amount||!R.startDate)return void a({title:"è«å¡«å¯«å¿
å¡«æ¬ä½",variant:"destructive"});if(j)try{let t=new Date,r=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,n={accountId:R.accountId,type:R.type,amount:Number(R.amount),frequency:R.frequency,startDate:R.startDate,nextExecution:r,endDate:void 0,autoCreate:!1,enabled:!0};q?(await w.updateRecurringTransaction(j,q,n),a({title:"å·²æ´æ°å®æäº¤æ"})):(await w.addRecurringTransaction(j,n),a({title:"已建ç«å®æäº¤æ"}));let i=await w.getRecurringTransactions(j),s=e?i.filter(t=>t.type===e):i;g(s),k(!1),M(null),J({accountId:"",type:e??"income",amount:"",frequency:"monthly",startDate:""})}catch(e){(0,I.vV)("å²åå®æäº¤æå¤±æ:",e),a({title:"æä½å¤±æ",variant:"destructive"})}},_=async t=>{if(j&&confirm("確å®è¦åªé¤æ¤å®æäº¤æåï¼"))try{await w.deleteRecurringTransaction(j,t),a({title:"å·²åªé¤å®æäº¤æ"});let r=await w.getRecurringTransactions(j),n=e?r.filter(t=>t.type===e):r;g(n)}catch(e){(0,I.vV)("åªé¤å®æäº¤æå¤±æ:",e),a({title:"åªé¤å¤±æ",variant:"destructive"})}},V=e=>{let t=(0,D.F$)(e.category);return`${e.name}ï¼${t}ï¼`};return A?(0,r.jsx)(x.default,{size:64}):(0,r.jsxs)(i.Zp,{children:[(0,r.jsx)(i.aR,{children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)(i.ZB,{children:"宿èªåè¨å¸³"}),(0,r.jsx)(i.BT,{children:e?`è¨å®å®æ${"income"===e?"æ¶å
¥":"æ¯åº"}è¦åï¼ç³»çµ±å°å»ºç«å¾
確èªé
ç®`:"è¨å®å®æäº¤æè¦åï¼ç³»çµ±å°å»ºç«å¾
確èªé
ç®"})]}),(0,r.jsxs)(s.$,{onClick:()=>{J({accountId:"",type:e??"income",amount:"",frequency:"monthly",startDate:""}),M(null),k(!0)},children:[(0,r.jsx)(Y.A,{className:"h-4 w-4 mr-2"}),"æ°å¢è¦å"]})]})}),(0,r.jsx)(i.Wu,{children:0===f.length?(0,r.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"å°æªè¨å®ä»»ä½å®æäº¤æè¦å"}):(0,r.jsx)("div",{className:"space-y-2",children:f.map(e=>{let t=$.find(t=>t.id===e.accountId);return(0,r.jsxs)("div",{className:"flex items-center justify-between p-3 border rounded-lg",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"font-medium",children:[t?V(t):"æªç¥å¸³æ¶"," - ",e.amount.toLocaleString()," å
"]}),(0,r.jsxs)("div",{className:"text-sm text-muted-foreground",children:["monthly"===e.frequency?"æ¯æ":"weekly"===e.frequency?"æ¯é±":"æ¯æ¥"," ","| 䏿¬¡å·è¡: ",e.nextExecution]})]}),(0,r.jsx)(c.j,{ariaLabel:"å®æäº¤æè¦åæä½",items:[{id:"edit",label:"編輯",icon:N.A,onSelect:()=>{M(e.id),J({accountId:e.accountId,type:e.type,amount:e.amount.toString(),frequency:e.frequency,startDate:e.startDate}),k(!0)}},{id:"delete",label:"åªé¤",icon:E.A,destructive:!0,onSelect:()=>_(e.id)}]})]},e.id)})})}),(0,r.jsx)(u.lG,{open:v,onOpenChange:k,children:(0,r.jsxs)(u.Cf,{className:"sm:max-w-[500px]",children:[(0,r.jsxs)(u.c7,{children:[(0,r.jsx)(u.L3,{children:q?"ç·¨è¼¯å®æäº¤æ":"æ°å¢å®æäº¤æ"}),(0,r.jsx)(u.rr,{children:"å²åå¾å°ä¾é »çèæç¨ç¢çå¾
確èªè¨éï¼ç¢ºèªå¾ææå¯«å
¥æµæ°´å¸³ã"})]}),(0,r.jsxs)("div",{className:"space-y-4",children:[!e&&(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)(l.J,{children:"é¡å"}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(s.$,{type:"button",variant:"income"===R.type?"default":"outline",className:"flex-1",onClick:()=>J({...R,type:"income",accountId:""}),children:"æ¶å
¥"}),(0,r.jsx)(s.$,{type:"button",variant:"expense"===R.type?"default":"outline",className:"flex-1",onClick:()=>J({...R,type:"expense",accountId:""}),children:"æ¯åº"})]})]}),(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)(l.J,{children:"帳æ¶"}),(0,r.jsxs)(o.l6,{value:R.accountId,onValueChange:e=>J({...R,accountId:e}),children:[(0,r.jsx)(o.bq,{children:(0,r.jsx)(o.yv,{placeholder:"è«é¸æå¸³æ¶"})}),(0,r.jsx)(o.gC,{children:z.map(e=>(0,r.jsx)(o.eb,{value:e.id,children:V(e)},e.id))})]})]}),(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)(l.J,{children:"éé¡"}),(0,r.jsx)(d.p,{type:"number",min:0,value:R.amount,onChange:e=>J({...R,amount:e.target.value}),placeholder:"NT$"})]}),(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)(l.J,{children:"é »ç"}),(0,r.jsxs)(o.l6,{value:R.frequency,onValueChange:e=>J({...R,frequency:e}),children:[(0,r.jsx)(o.bq,{children:(0,r.jsx)(o.yv,{})}),(0,r.jsxs)(o.gC,{children:[(0,r.jsx)(o.eb,{value:"daily",children:"æ¯æ¥"}),(0,r.jsx)(o.eb,{value:"weekly",children:"æ¯é±"}),(0,r.jsx)(o.eb,{value:"monthly",children:"æ¯æ"})]})]})]}),(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)(l.J,{children:"æ°å¢æ¥ï¼çææ¥"}),(0,r.jsx)(d.p,{type:"date",value:R.startDate,onChange:e=>J({...R,startDate:e.target.value})}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"ç¨æ¼è¦åçæèæç¨è¨ç®ä¹åºæºæ¥ï¼YYYY-
1MM-DDï¼ã"})]}),(0,r.jsxs)("div",{className:"flex justify-end gap-2 pt-2",children:[(0,r.jsx)(s.$,{variant:"outline",onClick:()=>k(!1),children:"åæ¶"}),(0,r.jsx)(s.$,{onClick:F,children:q?"æ´æ°":"建ç«"})]})]})]})})]})}}}]);
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.