PageSourceSearch

https://wedraw.kr/assets/VendorListPage.9oGcUOut.js

js wedraw.kr collected 2026-10-04 07:44:24 UTC 16,834 bytes, 4 lines download raw bytes

1import{j as e}from"./vendor-ui.BwPBmVwt.js";import{r as l,L as ae}from"./vendor-react.kR8tqwKZ.js";import{B as N,D as R,f as H,h as X,i as Y,j as q,X as te}from"./index.86ltQqcV.js";import{I as y}from"./input.Bn8hRSEL.js";import{u as re}from"./AdminWriteGuard.xT1R3h4-.js";import{d as w}from"./vendor-utils.D2q0l15H.js";import{l as ne,c as le,u as ce,d as ie,a as oe}from"./itemService.vPxaP3oJ.js";import{T as G,a as U,b as D,c as i,d as W,e as o}from"./table.l4sAptai.js";import{O as $,I as de,f as B}from"./types.B00xrGpD.js";import{S as me}from"./square-pen.DBASX-8w.js";import{T as xe}from"./trash-2.DYInpbaD.js";import{L as _}from"./label.BLlGNrU0.js";import{T as he}from"./textarea.CzIuFU26.js";import{S as V,a as P,b as O,c as z,d as C}from"./select.DEFUaHfV.js";import{B as A}from"./badge.FoetXalN.js";import{C as ue}from"./calculator.71ynEq9C.js";import{P as pe}from"./plus.VSSFQhJP.js";import{S as _e}from"./search.CoLV_vkF.js";import"./vendor-three.C5-HLXBy.js";import"./supabaseExternal.0aby9ahQ.js";import"./accessorySpecKey.BDlbj9rp.js";import"./chevron-down.8Oyg22r0.js";import"./check.Qs6HOoRX.js";import"./chevron-up.B4ORgOxs.js";const M=20;function je(){const[n,m]=l.useState([]),[x,u]=l.useState(0),[j,t]=l.useState(!0),[s,r]=l.useState(""),[h,c]=l.useState("all"),[f,b]=l.useState(1),a=l.useCallback(async()=>{t(!0);try{const{data:d,total:g}=await ne({search:s.trim()||void 0,vendorType:h==="all"?void 0:h,page:f,pageSize:M});m(d),u(g)}catch(d){w.error(`거래처 목록 조회 실패: ${E(d)}`),m([]),u(0)}finally{t(!1)}},[s,h,f]);l.useEffect(()=>{a()},[a]);const v=l.useCallback(d=>{b(1),r(d)},[]),T=l.useCallback(d=>{b(1),c(d)},[]),L=l.useCallback(async d=>{try{return await le(d),w.success("거래처가 등록되었습니다."),await a(),!0}catch(g){return w.error(`거래처 등록 실패: ${E(g)}`),!1}},[a]),S=l.useCallback(async(d,g)=>{try{return await ce(d,g),w.success("거래처가 수정되었습니다."),await a(),!0}catch(F){return w.error(`거래처 수정 실패: ${E(F)}`),!1}},[a]),k=l.useCallback(async d=>{try{return await ie(d),w.success("거래처가 삭제되었습니다."),await a(),!0}catch(g){return w.error(`거래처 삭제 실패: ${E(g)}`),!1}},[a]),I=Math.max(1,Math.ceil(x/M));return{vendors:n,total:x,loading:j,search:s,vendorType:h,page:f,pageSize:M,totalPages:I,handleSearchChange:v,handleTypeChange:T,setPage:b,refresh:a,create:L,update:S,remove:k}}function E(n){return n instanceof Error?n.message:String(n)}function ge({vendors:n,loading:m,onEdit:x,onDelete:u,onViewItems:j,canWrite:t}){return m?e.jsx("div",{className:"py-16 text-center text-sm text-gray-500",children:"불러오는 중…"}):n.length===0?e.jsx("div",{className:"py-16 text-center text-sm text-gray-500",children:"등록된 거래처가 없습니다."}):e.jsx("div",{className:"border rounded-md overflow-hidden",children:e.jsxs(G,{children:[e.jsx(U,{children:e.jsxs(D,{children:[e.jsx(i,{className:"w-[200px]",children:"거래처명"}),e.jsx(i,{className:"w-[140px]",children:"사업자번호"}),e.jsx(i,{className:"w-[140px]",children:"연락처"}),e.jsx(i,{className:"w-[110px]",children:"발주방법"}),e.jsx(i,{className:"w-[180px]",children:"발주정보"}),e.jsx(i,{className:"w-[140px]",children:"결제방법"}),e.jsx(i,{children:"비고"}),e.jsx(i,{className:"w-[110px] text-right",children:"작업"})]})}),e.jsx(W,{children:n.map(s=>e.jsxs(D,{children:[e.jsxs(o,{children:[e.jsx("button",{type:"button",className:"font-medium text-blue-700 hover:underline focus:outline-none focus:underline",onClick:()=>j(s),title:"발주 가능 품목 보기",children:s.name}),s.contact_person&&e.jsxs("div",{className:"text-xs text-gray-500",children:["담당: ",s.contact_person]})]}),e.jsx(o,{className:"text-sm text-gray-600",children:s.business_number??"-"}),e.jsx(o,{className:"text-sm text-gray-600",children:s.contact_phone??"-"}),e.jsx(o,{className:"text-sm text-gray-600",children:s.order_method?$[s.order_method]:"-"}),e.jsx(o,{className:"text-xs text-gray-600 max-w-[180px]",children:s.order_method==="online"&&s.purchase_site_url?e.jsx("a",{href:s.purchase_site_url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline truncate block",title:s.purchase_site_url,children:s.purchase_site_url}):s.order_method==="phone"&&s.contact_phone?e.jsx("div",{className:"truncate",children:s.contact_phone}):s.order_method==="fax"&&s.fax?e.jsxs("div",{className:"truncate",children:["FAX ",s.fax]}):s.order_method==="email"&&s.contact_email?e.jsx("div",{className:"truncate",children:s.contact_email}):s.contact_email||s.fax||s.contact_phone||s.purchase_site_url?e.jsxs(e.Fragment,{children:[s.contact_email&&e.jsx("div",{className:"truncate",children:s.contact_email}),s.fax&&e.jsxs("div",{className:"truncate text-gray-500",children:["FAX ",s.fax]}),s.contact_phone&&!s.contact_email&&!s.fax&&e.jsx("div",{className:"truncate text-gray-500",children:s.contact_phone})]}):"-"}),e.jsx(o,{className:"text-sm text-gray-600 max-w-[140px] truncate",title:s.payment_terms??void 0,children:s.payment_terms??"-"}),e.jsx(o,{className:"text-sm text-gray-600 max-w-[260px] truncate",title:s.memo??void 0,children:s.memo??e.jsx("span",{className:"text-gray-400",children:"-"})}),e.jsx(o,{className:"text-right",children:e.jsx("div",{className:"flex justify-end gap-1",children:t&&e.jsxs(e.Fragment,{children:[e.jsx(N,{size:"sm",variant:"ghost",onClick:()=>x(s),title:"수정",children:e.jsx(me,{className:"h-4 w-4"})}),e.jsx(N,{size:"sm",variant:"ghost",onClick:()=>u(s),title:"삭제",children:e.jsx(xe,{className:"h-4 w-4 text-red-500"})})]})})})]},s.id))})]})})}const Z={name:"",vendor_type:"purchase",business_number:"",contact_person:"",contact_phone:"",contact_email:"",fax:"",memo:"",payment_terms:"",order_method:"",purchase_site_url:"",lead_time_days:"",is_active:!0};function fe(n){return n?{name:n.name??"",vendor_type:n.vendor_type,business_number:n.business_number??"",contact_person:n.contact_person??"",contact_phone:n.contact_phone??"",contact_email:n.contact_email??"",fax:n.fax??"",memo:n.memo??"",payment_terms:n.payment_terms??"",order_method:n.order_method??"",purchase_site_url:n.purchase_site_url??"",lead_time_days:n.lead_time_days!=null?String(n.lead_time_days):"",is_active:n.is_active}:Z}const ye=["선입금","온라인 결제","방문 결제","매월 말일 정산","매월 10일 정산"];function Ne({open:n,onOpenChange:m,mode:x,initial:u,onSubmit:j}){const[t,s]=l.useState(Z),[r,h]=l.useState(!1);l.useEffect(()=>{n&&s(fe(u))},[n,u]);const c=(a,v)=>{s(T=>({...T,[a]:v}))},f=async()=>
1{if(!t.name.trim())return;const a={name:t.name.trim(),vendor_type:t.vendor_type,business_number:t.business_number,contact_person:t.contact_person,contact_phone:t.contact_phone,contact_email:t.contact_email,fax:t.fax,memo:t.memo,payment_terms:t.payment_terms,order_method:t.order_method||null,purchase_site_url:t.purchase_site_url.trim()||null,lead_time_days:t.lead_time_days?Number(t.lead_time_days):null,is_active:t.is_active};x==="create"&&(a.created_by=null),h(!0);const v=await j(a);h(!1),v&&m(!1)},b=x==="create"?"거래처 등록":"거래처 수정";return e.jsx(R,{open:n,onOpenChange:m,children:e.jsxs(H,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[e.jsx(X,{children:e.jsx(Y,{children:b})}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 py-2",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs(_,{htmlFor:"vendor-name",children:["거래처명 ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx(y,{id:"vendor-name",value:t.name,onChange:a=>c("name",a.target.value),placeholder:"예: (주)부자재유통",maxLength:100})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{htmlFor:"vendor-biz",children:"사업자등록번호"}),e.jsx(y,{id:"vendor-biz",value:t.business_number,onChange:a=>c("business_number",a.target.value),placeholder:"000-00-00000",maxLength:20})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{htmlFor:"vendor-person",children:"담당자"}),e.jsx(y,{id:"vendor-person",value:t.contact_person,onChange:a=>c("contact_person",a.target.value),maxLength:50})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{htmlFor:"vendor-phone",children:"연락처"}),e.jsx(y,{id:"vendor-phone",value:t.contact_phone,onChange:a=>c("contact_phone",a.target.value),placeholder:"02-000-0000",maxLength:20})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{htmlFor:"vendor-email",children:"이메일"}),e.jsx(y,{id:"vendor-email",type:"email",value:t.contact_email,onChange:a=>c("contact_email",a.target.value),placeholder:"[email protected]",maxLength:100})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{htmlFor:"vendor-fax",children:"팩스"}),e.jsx(y,{id:"vendor-fax",value:t.fax,onChange:a=>c("fax",a.target.value),placeholder:"02-000-0000",maxLength:20})]}),e.jsxs("div",{className:"col-span-2 space-y-1",children:[e.jsx(_,{htmlFor:"vendor-purchase-site",children:"구매 링크"}),e.jsx(y,{id:"vendor-purchase-site",type:"url",value:t.purchase_site_url,onChange:a=>c("purchase_site_url",a.target.value),placeholder:"https://...",maxLength:500})]}),e.jsxs("div",{className:"col-span-2 grid grid-cols-3 gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{children:"발주 방법"}),e.jsxs(V,{value:t.order_method||"__none__",onValueChange:a=>c("order_method",a==="__none__"?"":a),children:[e.jsx(P,{children:e.jsx(O,{placeholder:"(선택)"})}),e.jsxs(z,{children:[e.jsx(C,{value:"__none__",children:"(선택 안 함)"}),Object.keys($).map(a=>e.jsx(C,{value:a,children:$[a]},a))]})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(_,{children:"결제 방법"}),e.jsxs(V,{value:t.payment_terms||"__none__",onValueChange:a=>c("payment_terms",a==="__none__"?"":a),children:[e.jsx(P,{children:e.jsx(O,{placeholder:"(선택)"})}),e.jsxs(z,{children:[e.jsx(C,{value:"__none__",children:"(선택 안 함)"}),ye.map(a=>e.jsx(C,{value:a,children:a},a))]})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsxs(_,{children:["입고 소요일 ",e.jsx("span",{className:"text-xs font-normal text-gray-400",children:"(영업일 기준)"})]}),e.jsxs(V,{value:t.lead_time_days||"__none__",onValueChange:a=>c("lead_time_days",a==="__none__"?"":a),children:[e.jsx(P,{children:e.jsx(O,{placeholder:"(선택)"})}),e.jsxs(z,{children:[e.jsx(C,{value:"__none__",children:"(선택 안 함)"}),[1,2,3,4,5,6,7].map(a=>e.jsxs(C,{value:String(a),children:["D+",a]},a))]})]})]})]}),e.jsxs("div",{className:"col-span-2 space-y-1",children:[e.jsx(_,{htmlFor:"vendor-memo",children:"특이사항 메모"}),e.jsx(he,{id:"vendor-memo",value:t.memo,onChange:a=>c("memo",a.target.value),rows:3,placeholder:"권한자만 열람 가능한 내부 메모"})]})]}),e.jsxs(q,{children:[e.jsx(N,{variant:"outline",onClick:()=>m(!1),disabled:r,children:"취소"}),e.jsx(N,{onClick:f,disabled:r||!t.name.trim(),children:r?"저장 중…":"저장"})]})]})})}function be({open:n,onOpenChange:m,vendor:x}){const[u,j]=l.useState([]),[t,s]=l.useState(!1);return l.useEffect(()=>{if(!n||!x)return;let r=!1;return s(!0),oe({vendorId:x.id,itemType:["single","hybrid"],pageSize:500}).then(({data:h})=>{r||j(h)}).catch(()=>{r||j([])}).finally(()=>{r||s(!1)}),()=>{r=!0}}
1,[n,x]),x?e.jsx(R,{open:n,onOpenChange:m,children:e.jsxs(H,{className:"max-w-6xl max-h-[85vh] overflow-y-auto",children:[e.jsx(X,{children:e.jsxs(Y,{className:"flex items-center gap-2",children:["발주 가능 품목",e.jsx(A,{variant:"outline",children:x.name}),e.jsxs("span",{className:"text-sm text-gray-500 font-normal",children:["총 ",u.length,"건"]})]})}),t?e.jsx("div",{className:"py-12 text-center text-sm text-gray-500",children:"불러오는 중…"}):u.length===0?e.jsx("div",{className:"py-12 text-center text-sm text-gray-500",children:"이 거래처에 연결된 품목이 없습니다."}):e.jsx("div",{className:"border rounded-md overflow-hidden",children:e.jsxs(G,{children:[e.jsx(U,{children:e.jsxs(D,{children:[e.jsx(i,{className:"w-[80px]",children:"유형"}),e.jsx(i,{className:"w-[120px]",children:"코드"}),e.jsx(i,{className:"w-[50px]","aria-hidden":!0}),e.jsx(i,{className:"w-[120px]",children:"서브 카테고리"}),e.jsx(i,{children:"상품명"}),e.jsx(i,{className:"w-[110px]",children:"발주단위"}),e.jsx(i,{className:"w-[110px]",children:"판매단위"}),e.jsx(i,{className:"w-[110px] text-right",children:"공급가액"}),e.jsx(i,{className:"w-[110px] text-right",children:"판매단가"}),e.jsx(i,{className:"w-[90px] text-right",children:"재고"})]})}),e.jsx(W,{children:u.map(r=>{const h=r.item_type==="assembly"||r.item_type==="subdivided",c=r.item_type==="single"||r.item_type==="hybrid";return e.jsxs(D,{className:r.is_active?void 0:"text-gray-400 bg-gray-50/60",children:[e.jsx(o,{children:e.jsx(A,{variant:"outline",className:"text-xs",children:de[r.item_type]})}),e.jsx(o,{className:"font-mono text-xs font-semibold",children:r.code}),e.jsx(o,{className:"p-0 text-center",children:e.jsxs("div",{className:"flex flex-col gap-0.5 items-center",children:[r.show_in_calculator&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 text-[10px] px-1.5 py-0.5 rounded bg-green-100 text-green-700",title:"견적계산기 노출 중",children:[e.jsx(ue,{className:"h-3 w-3"}),"계산기"]}),!r.is_active&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-gray-200 text-gray-600",title:"비활성",children:"비활성"})]})}),e.jsx(o,{className:"text-sm text-gray-700",children:r.sub_category||e.jsx("span",{className:"text-gray-400",children:"-"})}),e.jsx(o,{children:e.jsx(ae,{to:`/admin/erp/items?editId=${r.id}`,className:"font-medium text-blue-700 hover:underline",onClick:()=>m(!1),title:"품목 관리에서 수정",children:r.product_name})}),e.jsx(o,{className:"text-xs text-gray-600",children:c?B(r.purchase_unit_label,r.purchase_unit,"-"):e.jsx("span",{className:"text-gray-400",children:"-"})}),e.jsx(o,{className:"text-xs text-gray-600",children:r.item_type!=="single"?B(r.sale_unit_label,r.sale_unit,"-"):e.jsx("span",{className:"text-gray-400",children:"-"})}),e.jsx(o,{className:"text-right text-sm",children:c?`₩${r.purchase_price.toLocaleString()}`:e.jsx("span",{className:"text-xs text-gray-400",children:"-"})}),e.jsx(o,{className:"text-right text-sm",children:h||r.item_type==="hybrid"?`₩${r.sale_price.toLocaleString()}`:e.jsx("span",{className:"text-xs text-gray-400",children:"-"})}),e.jsx(o,{className:"text-right text-sm",children:r.original_stock.toLocaleString(void 0,{maximumFractionDigits:2})})]},r.id)})})]})}),e.jsx(q,{children:e.jsx(N,{variant:"outline",onClick:()=>m(!1),children:"닫기"})})]})}):null}function Ge(){const m=!re(),{vendors:x,total:u,loading:j,search:t,page:s,pageSize:r,totalPages:h,handleSearchChange:c,setPage:f,create:b,update:a,remove:v}=je(),[T,L]=l.useState(!1),[S,k]=l.useState(null),[I,d]=l.useState(!1),[g,F]=l.useState(null),J=()=>{k(null),L(!0)},K=p=>{k(p),L(!0)},Q=async p=>S?a(S.id,p):b(p),ee=p=>{F(p),d(!0)},se=p=>{window.confirm(`"${p.name}" 거래처를 삭제하시겠습니까?
2
3연결된 품목은 거래처가 (미지정)으로 설정되고,
4발주 내역이 있으면 삭제가 차단됩니다.`)&&v(p.id)};return e.jsxs("div",{className:"p-6 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"거래처 관리"}),e.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:["부자재 매입/매출 거래처 마스터 (총 ",u.toLocaleStr
4ing(),"건)"]})]}),m&&e.jsxs(N,{onClick:J,children:[e.jsx(pe,{className:"h-4 w-4 mr-1"}),"거래처 등록"]})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e.jsxs("div",{className:"relative flex-1 min-w-[240px] max-w-md",children:[e.jsx(_e,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400"}),e.jsx(y,{value:t,onChange:p=>c(p.target.value),placeholder:"거래처명 또는 사업자번호 검색",className:"pl-8 pr-8"}),t&&e.jsx("button",{type:"button",onClick:()=>c(""),className:"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded hover:bg-gray-100 text-gray-400 hover:text-gray-600",title:"검색어 지우기",children:e.jsx(te,{className:"h-4 w-4"})})]})}),e.jsx(ge,{vendors:x,loading:j,onEdit:K,onDelete:se,onViewItems:ee,canWrite:m}),h>1&&e.jsxs("div",{className:"flex items-center justify-center gap-2 pt-2",children:[e.jsx(N,{variant:"outline",size:"sm",onClick:()=>f(s-1),disabled:s<=1,children:"이전"}),e.jsxs("span",{className:"text-sm text-gray-600",children:[s," / ",h,"  (",u.toLocaleString(),"건, ",r,"건씩)"]}),e.jsx(N,{variant:"outline",size:"sm",onClick:()=>f(s+1),disabled:s>=h,children:"다음"})]}),e.jsx(Ne,{open:T,onOpenChange:L,mode:S?"edit":"create",initial:S,onSubmit:Q}),e.jsx(be,{open:I,onOpenChange:d,vendor:g})]})}export{Ge 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.