Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

14 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

eac-cli

Generic CLI for eac.zigbang.in (E-Accounting / UniDocu).

Drives the UniDocu named-service API directly over HTTP. No headless browser at runtime β€” auth is just the JSESSIONID cookie pulled out of your local Chrome profile.

The CLI intentionally stays domain-agnostic: it only knows about EAC data and verbs. Company-/personal-specific policy (e.g. "μžκΈ°κ΄€λ¦¬λΉ„ ν™˜κΈ‰μ€ 영수증 Γ— 70%") belongs in your own shell scripts or runbooks.


Install

npm install -g @zigbang-smarthome/eac-cli
brew install zigbang-smarthome/tap/eac-cli
curl -fsSL https://github.com/zigbang-smarthome/eac-cli/releases/latest/download/install.sh | sh

Before first use: open Chrome and log in to https://eac.zigbang.in at least once so the session cookie lands in your Chrome cookie store. The CLI reads that cookie each run.

Authentication

  • EAC uses Google SSO + MS Azure AD SAML β€” login itself can't be automated. The CLI piggybacks on your normal Chrome session.

  • Each run, eac copies Chrome's cookie DB to tmpdir, decrypts the JSESSIONID for *.zigbang.in (AES-128-CBC, key from "Chrome Safe Storage" Keychain), and pings EAC to confirm the session is alive.

  • If the session is missing or expired, the CLI opens Chrome at https://eac.zigbang.in/unidocu/view.do and prompts:

    1. Finish the Google SSO login in Chrome.
    2. Quit Chrome (Cmd+Q) so the new JSESSIONID is flushed to disk. Chrome's cookie monster keeps cookies in memory and writes to the SQLite store on a delayed batch schedule β€” without an explicit quit the CLI may keep reading a stale value.
    3. Return to the terminal and hit Enter β€” the CLI re-reads the fresh cookie and continues.
    4. Reopen Chrome normally afterwards.

    Tip: turn on Chrome β†’ Settings β†’ On startup β†’ "Continue where you left off" so the session cookie survives the Cmd+Q cycle. EAC re-login becomes infrequent (only when the SAP-side session truly expires).

  • macOS may prompt for Keychain access the first time (click Always Allow).

  • Override: set EAC_JSESSIONID=<value> to bypass the keychain entirely and use a cookie sourced elsewhere (e.g. extracted from Playwright/CDP-controlled Chrome). Useful when EAC is open in a non-default Chrome profile or in CI scripts.

  • Non-TTY environments (CI, piped scripts) error out instead of prompting β€” pass EAC_JSESSIONID explicitly there.


Concept model

Before the commands it helps to see the data model the CLI talks to. UniDocu has two related document spaces and two separate attachment layers.

두 λ¬Έμ„œ 곡간

곡간 μ‹λ³„μž UI 메뉴 Backend service prefix
μ „ν‘œ (FI) BELNR (SAP λ¬Έμ„œλ²ˆν˜Έ) λΉ„μš©μ •μ‚° β€Ί κ°œμΈλΉ„μš© β€Ί EAμ „ν‘œκ²°μž¬ (UD_0302_000) ZUNIEFI_*
κ²°μž¬λ¬Έμ„œ (WF) GRONO (그룹번호) + WF_KEY κ²°μž¬ν•¨ (UFL_0401_020 λ“±) ZUNIEWF_*

ν•˜λ‚˜μ˜ μ „ν‘œ(BELNR)에 κ²°μž¬μš”μ²­μ„ κ±Έλ©΄ κ²°μž¬λ¬Έμ„œ(GRONO)κ°€ μ˜ˆμ•½λΌ μ „ν‘œμ— λΆ™λŠ”λ‹€. κ΄€κ³„λŠ” 1:1.

두 첨뢀 λ ˆμ΄μ–΄ β€” 결재자 μž…μž₯μ—μ„œ 달라 보인닀

같은 영수증 PDFλ₯Ό μ˜¬λ¦¬λ”λΌλ„ μ–΄λŠ λ ˆμ΄μ–΄μ— λΆ™μ΄λŠλƒκ°€ 결재자 UXλ₯Ό κ°€λ₯Έλ‹€.

  1. μ „ν‘œ λ ˆμ΄μ–΄ (voucher attach) β€” ZUNIEFI_4006 μ €μž₯ μ‹œ ν•¨κ»˜ 연결됨. 세무/νšŒκ³„νŒ€μ΄ μ „ν‘œ μƒμ„Έλ·°μ—μ„œ 확인.
  2. κ²°μž¬λ¬Έμ„œ λ ˆμ΄μ–΄ (approval attach) β€” ApprovalStep body의 EVI_SEQ ν•„λ“œλ‘œ 전달됨. 이게 μžˆμ–΄μ•Ό κ²°μž¬ν•¨ λ¦¬μŠ€νŠΈμ—μ„œ πŸ“Ž μ•„μ΄μ½˜μ΄ λœ¬λ‹€ (WF_ATTACH_FLAG = X). μ—†μœΌλ©΄ 결재자 μž…μž₯μ—μ„œ "첨뢀 μ—†λŠ” λ¬Έμ„œ"둜 λ³΄μž„.

voucher create λŠ” 1번 λ ˆμ΄μ–΄μ—, voucher request-approval 은 2번 λ ˆμ΄μ–΄μ— 각각 μ˜¬λ¦°λ‹€. 두 λͺ…λ Ή λͺ¨λ‘ --attach-dirλ₯Ό λ°›μ•„ 같은 영수증 폴더λ₯Ό 두 번 올림. (같은 파일의 쀑볡 μ—…λ‘œλ“œλŠ” μ„œλ²„ μ €μž₯μ†Œμ— λ³„κ°œ 기둝으둜 λ‚¨λŠ”λ‹€.)

11-step 상세 (μ°Έκ³ )

  1. ZUNIEFI_4003 β€” κΈ°λ³Έκ°’ 계산 (ZFBDT λ“±)
  2. ZUNIECM_5030 β€” μ „ν‘œ λ ˆμ΄μ–΄ EVI_SEQ μ±„λ²ˆ
  3. fineuploader/request.do β€” μ „ν‘œ λ ˆμ΄μ–΄μ— 파일 μ—…λ‘œλ“œ
  4. ZUNIEFI_4006 β€” λΉ„μš©ν•­λͺ© μ €μž₯ (EVI_SEQ μ—°κ²°)
  5. ZUNIEFI_5000 β€” SAP posting β†’ BELNR λ°œκΈ‰
  6. ZUNIEFI_4203 β€” GRONO μ˜ˆμ•½ (아직 상신 μ•„λ‹˜)
  7. ZUNIECM_5030 β€” 결재 λ ˆμ΄μ–΄ EVI_SEQ μ±„λ²ˆ
  8. fineuploader/request.do β€” 결재 λ ˆμ΄μ–΄μ— 파일 μ—…λ‘œλ“œ
  9. ZUNIEWF_2200 β€” κ°œμΈκ²°μž¬μ„  λͺ©λ‘ 쑰회
  10. ZUNIEWF_4101 β€” 결재자 리슀트 쑰회
  11. ApprovalStep (targetNamedServiceId ZUNIEWF_4201) β€” μ΅œμ’… 상신

15 = voucher create, 611 = voucher request-approval.


Command reference

eac
β”œβ”€β”€ voucher            μ „ν‘œ (FI, ZUNIEFI_*)
β”‚   β”œβ”€β”€ list                       ZUNIEFI_4200
β”‚   β”œβ”€β”€ show <BELNR|GRONO>         ZUNIEFI_4207
β”‚   β”œβ”€β”€ create                     μ „ν‘œ μž‘μ„± (Steps 1-5 β†’ BELNR)
β”‚   β”œβ”€β”€ request-approval <BELNR>   κ²°μž¬μš”μ²­ (Steps 6-11 β†’ GRONO + 상신)
β”‚   β”œβ”€β”€ cancel-group <GRONO>       κ·Έλ£Ήλ²ˆν˜Έμ·¨μ†Œ (ZUNIEFI_4202)
β”‚   β”œβ”€β”€ delete <BELNR>             μž„μ‹œμ „ν‘œμ‚­μ œ (ZUNIEFI_4103)
β”‚   └── attach new|upload|list     μ „ν‘œ λ ˆμ΄μ–΄ EVI_SEQ primitive
β”œβ”€β”€ corpcard          λ²•μΈμΉ΄λ“œ(곡용) β€” μΉ΄λ“œμ‚¬ 거래 β†’ μž„μ‹œμ „ν‘œ
β”‚   β”œβ”€β”€ list                       ZUNIEFI_1000 (λ―Έμ •μ‚° 거래)
β”‚   └── create <CRD_SEQ>           ZUNIEFI_4006 + ZUNIEFI_1009 β†’ BELNR
β”œβ”€β”€ approval           κ²°μž¬λ¬Έμ„œ (WF, ZUNIEWF_*)
β”‚   β”œβ”€β”€ list [--box]               ZUNIEWF_4500 (κ²°μž¬ν•¨)
β”‚   β”œβ”€β”€ recall <GRONO>             회수 (ApprovalStep + ZUNIEWF_4320)
β”‚   β”œβ”€β”€ attach new|upload|list     결재 λ ˆμ΄μ–΄ EVI_SEQ primitive
β”‚   └── line
β”‚       β”œβ”€β”€ list                          ZUNIEWF_2200 (κ°œμΈκ²°μž¬μ„  λͺ©λ‘)
β”‚       β”œβ”€β”€ show <SEQ> [--json]           ZUNIEWF_2203 (κ²°μž¬μ„  + 결재자)
β”‚       β”œβ”€β”€ approvers <SEQ> --grono <G>   ZUNIEWF_4101 (νŠΉμ • GRONO용)
β”‚       β”œβ”€β”€ save <SEQ> <approvers.json>   ZUNIEWF_2201 (결재자 톡째 μ €μž₯)
β”‚       β”œβ”€β”€ add <SEQ> <user> [--at lev]   μ‚¬μš©μž μΆ”κ°€ (read β†’ splice β†’ save)
β”‚       β”œβ”€β”€ remove <SEQ> <level|wf_id>    결재자 제거 (read β†’ splice β†’ save)
β”‚       └── search-user <name>            ZUNIEWF_1035 (μ΄λ¦„μœΌλ‘œ EAC μ‚¬μš©μž 검색)
β”œβ”€β”€ call <id> --prog [--data]      raw named-service escape hatch
└── config show|init               ~/.config/eac/config.json

eac voucher

voucher list β€” ZUNIEFI_4200. 기본은 ν˜„μž¬ μ›”, BSTAT=V (μž„μ‹œμ „ν‘œ). --bstat *둜 전체, --stats둜 미상신/진행쀑/승인/회수/반렀 ν•„ν„°.

voucher show <BELNR|GRONO> β€” ZUNIEFI_4207. BELNR/GRONO 아무 κ±°λ‚˜ λ°›μ•„ 상세 ν‘œμ‹œ (BELNR은 μ„œλ²„ 3-κ°œμ›” 쑰회 μœˆλ„μš° λ‚΄μ—μ„œ μžλ™ resolve).

voucher create β€” μ „ν‘œ μž‘μ„±. Steps 1-5. BELNR λ°˜ν™˜. 아직 GRONO μ—†μŒ (결재 μ „).

--item <name>        Preset name from config.items (e.g. "μžκΈ°κ΄€λ¦¬λΉ„")
--title <text>       μ „ν‘œ 제λͺ© (SGTXT)
--bldat <YYYYMMDD>   영수증 λ‚ μ§œ
--budat <YYYYMMDD>   μ „κΈ°μΌμž (default: today)
--amount <won>       κΈˆμ•‘ (μ •μˆ˜)
--attach-dir <path>  첨뢀 폴더 (optional)

voucher request-approval <BELNR> β€” κ²°μž¬μš”μ²­. Steps 6-11. GRONO λ°œκΈ‰ + μ‹€μ œ 상신. --attach-dir ν•„μˆ˜ (결재 λ ˆμ΄μ–΄ 첨뢀).

voucher cancel-group <GRONO> β€” κ·Έλ£Ήλ²ˆν˜Έμ·¨μ†Œ (ZUNIEFI_4202). 회수(STATS=C) λ˜λŠ” 반렀(STATS=R)된 μ „ν‘œμ— 뢙은 GRONOλ₯Ό ν’€μ–΄μ€€λ‹€. ν’€λ¦° BELNR은 λ‹€μ‹œ κ²°μž¬μš”μ²­ κ°€λŠ₯ (μˆ˜μ • 사항이 μ—†μœΌλ©΄ request-approval둜 λ°”λ‘œ μž¬μƒμ‹ , HKONT/μ μš” λ“± μˆ˜μ •ν•΄μ•Ό ν•œλ‹€λ©΄ delete ν›„ μƒˆλ‘œ create).

voucher delete <BELNR> β€” μž„μ‹œμ „ν‘œμ‚­μ œ (ZUNIEFI_4103). GRONOκ°€ λΉ„μ–΄μžˆλŠ”(미상신) μž„μ‹œμ „ν‘œλ₯Ό μ™„μ „ μ‚­μ œν•œλ‹€. λ²•μΈμΉ΄λ“œ μ •μ‚° 건이라면 μ›λž˜μ˜ μΉ΄λ“œ 거래(CRD_SEQ)κ°€ λ―Έμ •μ‚° ν’€λ‘œ λŒμ•„μ™€ corpcard list/corpcard create둜 λ‹€μ‹œ μž‘μ„ 수 μžˆλ‹€. GRONOκ°€ λΆ™μ–΄μžˆμœΌλ©΄ λ¨Όμ € cancel-group을 거쳐야 ν•œλ‹€.

voucher attach {new, upload, list} β€” μ „ν‘œ λ ˆμ΄μ–΄ EVI_SEQ 직접 μ‘°μž‘ (보톡 createκ°€ μžλ™ μ²˜λ¦¬ν•˜λ―€λ‘œ μ“Έ 일 λ§Žμ§€ μ•ŠμŒ).

eac corpcard

λ²•μΈμΉ΄λ“œ(곡용) μ‚¬μš©λ‚΄μ—­μ„ μΉ΄λ“œμ‚¬ 데이터 기반으둜 μž„μ‹œμ „ν‘œν™”ν•œλ‹€. μžκΈ°κ΄€λ¦¬λΉ„/μΌλ°˜κ²½λΉ„μ™€ 달리 μ˜μˆ˜μ¦μ„ 직접 μ²¨λΆ€ν•˜μ§€ μ•ŠλŠ”λ‹€ (μΉ΄λ“œμ‚¬κ°€ SAP 후단에 거래 λ°μ΄ν„°λ‘œ μžλ™ 첨뢀).

corpcard list [--from] [--to] [--merch] β€” λ―Έμ •μ‚° μΉ΄λ“œ 거래 λͺ©λ‘ (ZUNIEFI_1000). 이미 μ „ν‘œν™”λœ κ±°λž˜λŠ” λΉ μ§„λ‹€. 각 행이 CRD_SEQ둜 식별됨.

corpcard create <CRD_SEQ> --hkont --remark [--budat] [--bldat] β€” μΉ΄λ“œ 거래λ₯Ό μž„μ‹œμ „ν‘œλ‘œ λ³€ν™˜ (ZUNIEFI_4006 + ZUNIEFI_1009 β†’ BELNR). 첨뢀 EVI_SEQ 호좜 μ—†μŒ.

--hkont <code>       G/L 계정 (예: 52010102 νšŒμ‹λŒ€ / 52060101 νšŒμ˜λΉ„ / 52050104 μ ‘λŒ€λΉ„-μ‹ μš©μΉ΄λ“œ / 52030203 μ‹œλ‚΄κ΅ν†΅λΉ„)
--hkont-text <name>  ν‘œκΈ°μš© (μ˜΅μ…˜)
--remark <text>      μ μš”. ν˜•μ‹: [λ²•μΈμΉ΄λ“œ/거래처/μ°Έμ„μž] λ˜λŠ” [λ²•μΈμΉ΄λ“œ/μΆœλ°œβ†’λ„μ°©]
--budat <YYYYMMDD>   전기일 (default: today; κ²°μ œμ›” 마감 ν›„μ—” 읡월 1일 κ°•μ œ)
--bldat <YYYYMMDD>   증빙일 (default: μΉ΄λ“œ 승인일)

λ°œκΈ‰λœ BELNR은 κ·ΈλŒ€λ‘œ eac voucher request-approval <BELNR> --item λ²•μΈμΉ΄λ“œ --title "..."둜 κ²°μž¬μš”μ²­. κ²°μž¬μ„ μ€ [개인]-μΌλ°˜κ²½λΉ„ κ·ΈλŒ€λ‘œ (μ„±λ―Όμ§€ β†’ Leah Song).

μ°Έκ³ : λ²•μΈμΉ΄λ“œλŠ” νšŒμ‚¬ 정책상 λΆ€κ°€μ„Έ V3 (뢈곡제 λ§€μž…μ„Έμ•‘)을 κ°•μ œλ‘œ 적용. EVIKB=FI_12 (λ²•μΈμΉ΄λ“œκΈ°λͺ…식). MWSKZ/EVIKBλŠ” μ½”λ“œμ—μ„œ μžλ™ μ„ΈνŒ….

eac approval

approval list [--box progress|approved|rejected|pending] β€” ZUNIEWF_4500. πŸ“Ž ν‘œμ‹œλ‘œ 결재 λ ˆμ΄μ–΄ 첨뢀 유무 ν•œλˆˆμ— λ³΄μž„.

approval recall <GRONO> β€” 진행쀑 κ²°μž¬λ¬Έμ„œ 회수. λ‚΄λΆ€λŠ” ApprovalStep + targetNamedServiceId=ZUNIEWF_4320 + APPR_STAT=E.

approval attach {new, upload, list} β€” 결재 λ ˆμ΄μ–΄ EVI_SEQ 직접 μ‘°μž‘ (보톡 request-approval이 μžλ™ 처리).

approval line list β€” κ°œμΈκ²°μž¬μ„  λͺ©λ‘ (ZUNIEWF_2200).

approval line show <SEQ> β€” κ²°μž¬μ„ μ˜ 결재자λ₯Ό κ·Έ 자체둜 쑰회 (ZUNIEWF_2203). --json을 뢙이면 raw 배열을 좜λ ₯ β€” κ·ΈλŒ€λ‘œ line save μž…λ ₯으둜 μ‚¬μš© κ°€λŠ₯.

approval line approvers <SEQ> --grono <G> β€” νŠΉμ • κ²°μž¬λ¬Έμ„œ(GRONO)에 묢인 결재자 평가 κ²°κ³Ό (ZUNIEWF_4101). κ²°μž¬μ„  μžμ²΄λ³΄λ‹€λŠ” κ·Έ λ¬Έμ„œκ°€ μ§„μ§œ λˆ„κ΅¬λ₯Ό κ±°μΉ˜λŠ”κ°€λ₯Ό λ³Έλ‹€.

approval line save <SEQ> <approvers.json> β€” 결재자 리슀트 톡째 μ €μž₯ (ZUNIEWF_2201). νŒŒμΌμ€ line show --json 좜λ ₯ ν˜•μ‹.

approval line add <SEQ> <name|wf_id> [--at lev] β€” κ²°μž¬μ„ μ— μ‚¬μš©μž ν•œ λͺ… μΆ”κ°€. <name>이면 ZUNIEWF_1035둜 검색해 단일 맀칭일 λ•Œλ§Œ μ§„ν–‰. --at은 1-based μœ„μΉ˜ (μ—†μœΌλ©΄ 끝에 μΆ”κ°€). λ‚΄λΆ€μ μœΌλ‘œ show β†’ splice β†’ save.

approval line remove <SEQ> <level|wf_id> β€” κ²°μž¬μ„ μ—μ„œ ν•œ λͺ… 제거. 숫자면 1-based level, μ•„λ‹ˆλ©΄ WF_ID (예: ZB01010)둜 λ§€μΉ­.

approval line search-user <name> β€” EAC μ‚¬μš©μž 검색 (ZUNIEWF_1035). ν•œκΈ€/영문 λ‹¨νŽΈ λͺ¨λ‘ κ°€λŠ₯.

κ²°μž¬μ„  생성/μ‚­μ œ μžμ²΄λŠ” 아직 μžλ™ν™” μ•ˆ 됨 (μˆ˜λ™ UIμ—μ„œ ν•œ λ²ˆλ„ 캑쳐 μ•ˆ 작힘). μƒˆ 라인이 ν•„μš”ν•˜λ©΄ EAC UIμ—μ„œ μƒμ„±ν•œ λ’€ add/remove/save둜 결재자만 μžλ™ν™”.

eac call

Wrapping μ—†λŠ” μ„œλΉ„μŠ€ 직접 호좜용 escape hatch.

eac call ZUNIEFI_4207 --prog DRAFT_0010 --data '{"GRONO":"FI20260000023922"}'

eac config

  • config show β€” ν˜„μž¬ config JSON ν”„λ¦°νŠΈ
  • config init β€” ~/.config/eac/config.json μ—†μœΌλ©΄ κΈ°λ³Έκ°’ 생성

Standard flow β€” 2 steps

eac-cliλŠ” "μ „ν‘œ μž‘μ„± + κ²°μž¬μš”μ²­ ν•œ λ²ˆμ—"λΌλŠ” compositeλ₯Ό μΌλΆ€λŸ¬ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€. 쀑간에 μ‹€νŒ¨ν•˜λ©΄ μƒνƒœ(BELNR λ°œκΈ‰λλŠ”λ° GRONO μ—†μŒ)κ°€ 숨겨져 볡ꡬ가 μ–΄λ €μ›Œμ§€κΈ° λ•Œλ¬Έ. ν•„μš”ν•˜λ©΄ shell script둜 2 단계λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ‘°ν•©.

# Step 1: μ „ν‘œ μž‘μ„±
BELNR=$(eac voucher create \
  --item  "μžκΈ°κ΄€λ¦¬λΉ„" \
  --title "2026λ…„ 5μ›” μžκΈ°κ΄€λ¦¬λΉ„" \
  --bldat 20260503 \
  --amount 30800 \
  --attach-dir ./μžκΈ°κ΄€λ¦¬λΉ„/202605 \
  | awk '/^BELNR/ {print $2}')
echo "BELNR=$BELNR"

# Step 2: κ²°μž¬μš”μ²­
eac voucher request-approval "$BELNR" \
  --item  "μžκΈ°κ΄€λ¦¬λΉ„" \
  --title "2026λ…„ 5μ›” μžκΈ°κ΄€λ¦¬λΉ„" \
  --attach-dir ./μžκΈ°κ΄€λ¦¬λΉ„/202605

이걸 κ·ΈλŒ€λ‘œ 월별 task script둜 κ°μ‹Έμ„œ ~/bin/ λ˜λŠ” repo의 scripts/에 두면 됨:

#!/usr/bin/env bash
# scripts/μžκΈ°κ΄€λ¦¬λΉ„-상신.sh
set -euo pipefail
month="$1"; bldat="$2"; receipt="$3"
y="${month:0:4}"; m=$((10#${month:4:2}))
title="${y}λ…„ ${m}μ›” μžκΈ°κ΄€λ¦¬λΉ„"
amount=$(( receipt * 7 / 10 ))
dir="./μžκΈ°κ΄€λ¦¬λΉ„/${month}"

BELNR=$(eac voucher create --item "μžκΈ°κ΄€λ¦¬λΉ„" --title "$title" \
  --bldat "$bldat" --amount "$amount" --attach-dir "$dir" \
  | awk '/^BELNR/ {print $2}')

eac voucher request-approval "$BELNR" --item "μžκΈ°κ΄€λ¦¬λΉ„" \
  --title "$title" --attach-dir "$dir"

Recovery flows

상신 ν›„ μ‹€μˆ˜ 발견 β†’ νšŒμˆ˜ν•˜κ³  μž¬μƒμ‹ 

# 예: 23922 μƒμ‹ ν–ˆλŠ”λ° 영수증 잘λͺ» λ„£μ—ˆμŒ
eac approval recall       FI20260000023922
eac voucher cancel-group  FI20260000023922

# 이제 BELNR 3200005520 은 "미상신" μƒνƒœ. λ‹€μ‹œ κ²°μž¬μš”μ²­ κ°€λŠ₯:
eac voucher request-approval 3200005520 \
  --item  "μžκΈ°κ΄€λ¦¬λΉ„" \
  --title "2026λ…„ 5μ›” μžκΈ°κ΄€λ¦¬λΉ„ (μˆ˜μ •)" \
  --attach-dir ./μžκΈ°κ΄€λ¦¬λΉ„/202605

μ•„μ΄ν…œ 자체λ₯Ό 잘λͺ» κ³¨λžμ„ λ•Œ (FI_22 β†’ FI_21)

μ „ν‘œ(BELNR)λŠ” HKONT/EVIKB ν™•μ • ν›„ SAP에 postingλ˜λ―€λ‘œ item을 λ°”κΎΈλ €λ©΄ μƒˆ μ „ν‘œ ν•„μš”. κΈ°μ‘΄ 것은 회수 β†’ κ·Έλ£Ήλ²ˆν˜Έμ·¨μ†Œ β†’ μž„μ‹œμ „ν‘œμ‚­μ œ ν›„ μƒˆλ‘œ create:

# 잘λͺ»λœ item
eac approval recall       FI20260000023877
eac voucher cancel-group  FI20260000023877
eac voucher delete        3200005641   # μž„μ‹œμ „ν‘œ μ™„μ „ μ‚­μ œ

# μ˜¬λ°”λ₯Έ item 으둜 μƒˆλ‘œ μ‹œμž‘
BELNR=$(eac voucher create --item "μžκΈ°κ΄€λ¦¬λΉ„" ...)
eac voucher request-approval "$BELNR" --item "μžκΈ°κ΄€λ¦¬λΉ„" ...

λ²•μΈμΉ΄λ“œ: 반렀된 ν›„ HKONT 잘λͺ» 골랐던 경우

νšŒμ‹λŒ€(52010102) 와 νšŒμ˜λΉ„(52060101) 처럼 잘λͺ» λΆ„λ₯˜ν–ˆλ‹€κ°€ νšŒκ³„νŒ€ 반렀λ₯Ό λ°›μ•˜μ„ λ•Œ. μΉ΄λ“œ 거래(CRD_SEQ)λŠ” 살리고 HKONT/μ μš”λ§Œ λ‹€μ‹œ 작으면 λœλ‹€.

# 1) 반렀 κ²°μž¬λ¬Έμ„œμ˜ GRONO ν’€μ–΄λ‚΄κΈ°
eac voucher cancel-group  FI20260000023988    # GRONO κ°€ λΆ™μ–΄μžˆλ˜ 회수/반렀 μ „ν‘œ detach

# 2) μž„μ‹œμ „ν‘œ 자체λ₯Ό μ‚­μ œ β†’ CRD_SEQ κ°€ λ―Έμ •μ‚° ν’€λ‘œ 볡귀
eac voucher delete        3200005642

# 3) μΉ΄λ“œ 거래 λ‹€μ‹œ 작기 (CRD_SEQ κ·ΈλŒ€λ‘œ β€” list 둜 확인)
eac corpcard list --merch 이마트24
BELNR=$(eac corpcard create 20260421001000020116 \
  --hkont 52010102 \
  --hkont-text "판)볡리후생비-νšŒμ‹λŒ€" \
  --remark "[λ²•μΈμΉ΄λ“œ/이마트24μ²­λ‹΄λ¦¬ν…ŒμΌμ /λ°•μ˜κ±Έ, μ˜€ν˜„μ•„]")

# 4) κ²°μž¬μš”μ²­
eac voucher request-approval "$BELNR" --item λ²•μΈμΉ΄λ“œ --title "[λ²•μΈμΉ΄λ“œ/...]"

πŸ’‘ νšŒκ³„νŒ€ λ£°: μ°Έμ„μžκ°€ 전원 직원이면 νšŒμ‹λŒ€(52010102), 외뢀인 1λͺ… 이상 + 사전 회의 κΈ°μ•ˆμ„œκ°€ μžˆμ–΄μ•Όλ§Œ νšŒμ˜λΉ„(52060101).

쑰회 / 디버깅

eac voucher list                 # λ‚΄ μž„μ‹œμ „ν‘œ
eac voucher list --bstat '*' --stats '*'   # 전체
eac voucher show FI20260000023922
eac approval list                 # 진행쀑
eac approval list --box rejected  # 반렀/회수

# κ²°μž¬μ„  ꡬ쑰 확인
eac approval line list
eac approval line approvers 0000000002 --grono FI20260000023922

Config

~/.config/eac/config.json. ν•œ 번 μ„€μ •ν•˜κ³  --item <name> 으둜 μž¬μ‚¬μš©.

{
  "user": {
    "pernr": "ZB01135",
    "bukrs": "K001",
    "pernrName": "λ°•μ˜κ±Έ",
    "wfIdText": "YG Park (λ°•μ˜κ±Έ)",
    "kostl": "226020",
    "kostlText": "Device Engineering",
    "wfDept": "0000252100",
    "wfDeptText": "Service Engineering"
  },
  "items": {
    "μžκΈ°κ΄€λ¦¬λΉ„": {
      "hkont": "52010108",
      "hkontText": "판)볡리후생비-μžκΈ°κ΄€λ¦¬λΉ„",
      "evikb": "FI_21",
      "evikbText": "μž₯λ €μ§€μ›κΈˆ",
      "wfLineSeq": "0000000002",
      "wfLineLin1": "0000000816"
    }
  }
}

μƒˆ item μΆ”κ°€ μ‹œ ν•„μš”ν•œ κ°’:

  • hkont β€” G/L 계정 (e.g. 52010177 판)볡리후생비-기타)
  • evikb β€” μ „ν‘œ μ’…λ₯˜ μ½”λ“œ (e.g. FI_21 μž₯λ €μ§€μ›κΈˆ, FI_22 μΌλ°˜κ²½λΉ„)
  • wfLineSeq / wfLineLin1 β€” ν•΄λ‹Ή item의 κ°œμΈκ²°μž¬μ„  (μ°Έκ³ : eac approval line list둜 확인)

Preset keyλŠ” ν•œκΈ€ 이름(μžκΈ°κ΄€λ¦¬λΉ„, 가쑱식사비, 원격근무지원비, …) μ‚¬μš© ꢌμž₯.


Development

bun install
bun run src/index.ts --help

Release: gh workflow run release.yml β€” oneupκ°€ version bump + npm/Homebrew publish μžλ™ν™”.

License

MIT

About

CLI for eac.zigbang.in (E-Accounting / UniDocu)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages