PageSourceSearch

https://seodoon-church-admin.web.app/assets/OfferingBulkPage-BV0odrdX.js

js seodoon-church-admin.web.app collected 2026-10-03 12:37:10 UTC 8,883 bytes, 1 lines download raw bytes

1import{j as e}from"./vendor-data-Z5doMMu-.js";import{b as B,r}from"./vendor-react-zNM0AU50.js";import{aD as L,c as $,T as q,aa as K,ae as _,a7 as u}from"./vendor-ui-CW5bJ11U.js";import{u as F}from"./index-D1K3lVhu.js";import{M as H}from"./MemberSearchInput-B4_Iy3N2.js";import{o as V}from"./offeringService-Cuo8E004.js";import{f as z}from"./financeCloseService-C1M9uxKC.js";import{r as A,d as G,P as J}from"./financeConstants-CXKUiVP8.js";import{f as Q}from"./financeSettingsService-Gao7wv_9.js";import"./vendor-firebase-Da9KY1q_.js";import"./vendor-charts-08G1rM8P.js";let U=1;function b(m){return{key:U++,member:null,isAnonymous:!1,type:m,amount:0,envelopeNumber:"",memo:""}}function ce(){const m=B(),{user:l}=F(),d=(l==null?void 0:l.churchId)||"seodoon-church",[x,T]=r.useState(new Date().toISOString().split("T")[0]),[j,E]=r.useState("주일1부"),[v,D]=r.useState("cash"),[p,R]=r.useState(()=>A()),[h,N]=r.useState("tithe"),[g,y]=r.useState([b("tithe")]),[w,f]=r.useState(!1);r.useEffect(()=>{Q.getSettings(d).then(t=>{const a=A(t.offeringTypes);R(a),a.length>0&&N(a[0].value)}).catch(()=>{})},[d]);const M=t=>{var a;return((a=p.find(s=>s.value===t))==null?void 0:a.label)||t},S=()=>y(t=>[...t,b(h)]),o=(t,a)=>{y(s=>s.map(i=>i.key===t?{...i,...a}:i))},O=t=>{y(a=>a.length===1?[b(h)]:a.filter(s=>s.key!==t))},c=g.filter(t=>t.amount>0&&(t.isAnonymous||t.member)),I=c.reduce((t,a)=>t+a.amount,0),P=(t,a)=>{t.key==="Enter"&&(t.preventDefault(),a&&S())},Y=async()=>{if(c.length===0){u.error("입력된 헌금이 없습니다. 교인/무명과 금액을 확인하세요.");return}const t=g.filter(n=>n.amount>0&&!n.isAnonymous&&!n.member);if(t.length>0){u.error(`헌금자가 지정되지 않은 행이 ${t.length}건 있습니다. 무명 체크 또는 교인을 선택하세요.`);return}const a=String(new Date(x).getFullYear()),s=(l==null?void 0:l.uid)||"",i=c.map(n=>{var k,C;return{churchId:d,date:x,fiscalYear:a,amount:n.amount,type:n.type,typeName:M(n.type),memberId:n.isAnonymous||(k=n.member)==null?void 0:k.id,memberName:n.isAnonymous?"무명":(C=n.member)==null?void 0:C.name,isAnonymous:n.isAnonymous,envelopeNumber:n.envelopeNumber||void 0,paymentMethod:v,serviceType:j,status:"pending",receiptRequested:!1,receiptIssued:!1,memo:n.memo||"",createdBy:s}});try{if(f(!0),await z.isMonthClosed(d,x)){u.error("마감된 월입니다. 해당 월에는 헌금을 등록할 수 없습니다."),f(!1);return}await V.createOfferingsBatch(d,i),u.success(`헌금 ${i.length}건이 일괄 등록되었습니다`),m("/finance/offerings")}catch(n){console.error("헌금 일괄 등록 실패:",n),u.error("헌금 일괄 등록에 실패했습니다")}finally{f(!1)}};return e.jsxs("div",{className:"p-6 max-w-6xl mx-auto",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>m("/finance/offerings"),className:"p-2 hover:bg-gray-100 rounded-lg transition-colors",children:e.jsx(L,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"헌금 일괄입력"}),e.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"주일 헌금을 한 화면에서 여러 건 빠르게 등록합니다. 금액칸에서 Enter로 행이 추가됩니다."})]})]}),e.jsxs("div",{className:"bg-white border border-gray-200 rounded-xl p-4 mb-4 grid grid-cols-2 md:grid-cols-4 gap-3",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-1.5 text-xs font-medium text-gray-600 mb-1",children:[e.jsx($,{className:"w-3.5 h-3.5"})," 날짜"]}),e.jsx("input",{type:"date",value:x,onChange:t=>T(t.target.value),className:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"예배"}),e.jsx("select",{value:j,onChange:t=>E(t.target.value),className:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500",children:G.map(t=>e.jsx("option",{value:t,children:t},t))})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"결제방법"}
1),e.jsx("select",{value:v,onChange:t=>D(t.target.value),className:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500",children:J.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value))})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs font-medium text-gray-600 mb-1",children:"기본 헌금유형 (새 행)"}),e.jsx("select",{value:h,onChange:t=>N(t.target.value),className:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500",children:p.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value))})]})]}),e.jsxs("div",{className:"bg-white border border-gray-200 rounded-xl overflow-hidden",children:[e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-gray-50 text-gray-500 text-xs",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left px-3 py-2 font-medium w-10",children:"#"}),e.jsx("th",{className:"text-left px-3 py-2 font-medium",children:"헌금자"}),e.jsx("th",{className:"text-center px-3 py-2 font-medium w-16",children:"무명"}),e.jsx("th",{className:"text-left px-3 py-2 font-medium w-36",children:"헌금유형"}),e.jsx("th",{className:"text-right px-3 py-2 font-medium w-40",children:"금액(원)"}),e.jsx("th",{className:"text-left px-3 py-2 font-medium w-28",children:"봉투번호"}),e.jsx("th",{className:"text-left px-3 py-2 font-medium",children:"메모"}),e.jsx("th",{className:"w-10"})]})}),e.jsx("tbody",{className:"divide-y divide-gray-100",children:g.map((t,a)=>e.jsxs("tr",{className:"hover:bg-gray-50/60",children:[e.jsx("td",{className:"px-3 py-2 text-gray-400",children:a+1}),e.jsx("td",{className:"px-3 py-2 min-w-[180px]",children:t.isAnonymous?e.jsx("span",{className:"text-gray-400 text-sm",children:"무명"}):e.jsx(H,{value:t.member,onChange:s=>o(t.key,{member:s}),placeholder:"이름/전화 검색"})}),e.jsx("td",{className:"px-3 py-2 text-center",children:e.jsx("input",{type:"checkbox",checked:t.isAnonymous,onChange:s=>o(t.key,{isAnonymous:s.target.checked,member:null}),className:"rounded"})}),e.jsx("td",{className:"px-3 py-2",children:e.jsx("select",{value:t.type,onChange:s=>o(t.key,{type:s.target.value}),className:"w-full border border-gray-300 rounded-lg px-2 py-1.5 text-sm focus:ring-2 focus:ring-blue-500",children:p.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})}),e.jsx("td",{className:"px-3 py-2",children:e.jsx("input",{type:"text",inputMode:"numeric",value:t.amount?t.amount.toLocaleString():"",onChange:s=>o(t.key,{amount:Number(s.target.value.replace(/[^0-9]/g,""))||0}),onKeyDown:s=>P(s,a===g.length-1),placeholder:"0",className:"w-full text-right border border-gray-300 rounded-lg px-2 py-1.5 text-sm focus:ring-2 focus:ring-blue-500 tabular-nums"})}),e.jsx("td",{className:"px-3 py-2",children:e.jsx("input",{type:"text",value:t.envelopeNumber,onChange:s=>o(t.key,{envelopeNumber:s.target.value}),className:"w-full border border-gray-300 rounded-lg px-2 py-1.5 text-sm focus:ring-2 focus:ring-blue-500"})}),e.jsx("td",{className:"px-3 py-2",children:e.jsx("input",{type:"text",value:t.memo,onChange:s=>o(t.key,{memo:s.target.value}),className:"w-full border border-gray-300 rounded-lg px-2 py-1.5 text-sm focus:ring-2 focus:ring-blue-500"})}),e.jsx("td",{className:"px-3 py-2 text-center",children:e.jsx("button",{onClick:()=>O(t.key),className:"text-gray-300 hover:text-rose-500",children:e.jsx(q,{className:"w-4 h-4"})})})]},t.key))}),e.jsx("tfoot",{className:"bg-gray-50 border-t border-gray-200",children:e.jsxs("tr",{children:[e.jsxs("td",{colSpan:4,className:"px-3 py-2.5 text-right text-gray-500",children:["유효 ",c.length,"건 합계"]}),e.jsxs("td",{className:"px-3 py-2.5 text-right font-bold text-gray-900 tabular-nums",children:[I.toLocaleString(),"원"]}),e.jsx("td",{colSpan:3})]})})]}),e.jsx("div",{className:"p-3 border-t border-gray-100",children:e.jsxs("button",{onClick:S,className:"flex items-center gap-1.5 text-sm text-gray-600 hover:text-blue-600 px-3 py-1.5 rounded-lg hover:bg-gray-50",children:[e.jsx(K,{className:"w-4 h-4"})," 행 추가"]})})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:()=>m("/finance/offerings"),className:"px-4 py-2.5 text-sm text-gray-600 hover:bg-gray-100 rounded-lg",children:"취소"}),e.jsxs("button",{onClick:Y,disabled:w||c.length===0,className:"flex items-center gap-2 bg-emerald-600 hover:bg-emerald-700 disabled:bg-gray-300 text-white font-semibold px-6 py-2.5 rounded-lg transition-colors",children:[e.jsx(_,{className:"w-4 h-4"}),w?"저장 중...":`${c.length}건 일괄 저장`]})]})]})}export{ce as OfferingBulkPage,ce as default};

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.