Skip to content

zigbang/smarthome-eac-cli

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)

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors