Topics

Ik had een inkooporder nodig, dus heb ik met Claude Code een tool (desktopapplicatie) gemaakt om inkooporders te genereren.

  • column

Wanneer we in ons dagelijks werk iets tegenkomen dat te vervelend is om handmatig te blijven doen, is het gebruikelijk geworden om gewoon een klein systeem te maken met behulp van Claude Code!

Dit verhaal is daar een perfect voorbeeld van, en het begon allemaal toen we het kapitaal van het bedrijf verhoogden.

Ons boekjaar begint in februari, en deze kapitaalverhoging vond ook in februari plaats. Door de kapitaalverhoging moeten we nu echter onze bestelprocessen met externe partners en samenwerkende bedrijven nauwkeuriger organiseren.

Dit is het gebied dat bekendstaat als de Ondercontracteringswet, die onder het huidige systeem vanaf januari 2026 de "Ondercontracteringswet" zal heten. De opdrachtgever zal met meer zaken te maken krijgen, zoals het duidelijk vermelden van de orderdetails, het opstellen en bewaren van transactiedocumenten en het vaststellen van betalingstermijnen.

Dit is natuurlijk niet zomaar een kwestie van "het doen omdat het wettelijk verplicht is"!

Bij het uitbesteden van werk aan een externe partner is het cruciaal dat zowel de klant als de dienstverlener de orderdetails, de prijs, de datum en de correspondentie met de offerte duidelijk vastleggen.

Het was geen functie die in de boekhoudsoftware was opgenomen.

Ons bedrijf gebruikt de tools van MoneyForward (hierna MoneyForward genoemd) voor boekhouding, offertes en facturering.
Het is handig voor dagelijkse boekhoud- en facturatietaken, maar wat ik deze keer wilde doen, was iets anders.

Op basis van de offerte in PDF-formaat die we van de externe partner hebben ontvangen, maken we een inkooporder in PDF-formaat voor Liberogic.

MoneyForward beschikt, in ieder geval binnen de context van ons bedrijf, niet over de juiste functies, en het zou zonde van het geld zijn om alleen daarvoor een abonnement op de dienst af te sluiten.

Als het handmatig zou moeten gebeuren,

  • Maak een inkoopordersjabloon aan.
  • Transcribeer handmatig de informatie uit de offerte naar het inkooporderformaat.
  • Voer de besteldatum in.
  • Noteer het offertenummer.
  • De details transcriberen
  • Controleer het totaalbedrag en de overige details.
  • Formatteer de bestandsnamen
  • Overige diverse zaken...

Het is lastig om deze extra taak erbij te hebben... dus besloot ik hem zelf te creëren.

Met behulp van Claude Code kan het in minder dan een uur in de praktijk worden gebracht.

Ook de timing was goed.

De start van het fiscale jaar in februari, de kapitaalverhoging in februari en de publicatie van de Claude-code, evenals de goedkeuring ervan door ons personeel, vielen allemaal samen.

Dit was rond de tijd dat er binnen het bedrijf een soort hackathon-beweging op gang kwam, waarbij mensen tools zoals Claude Code gebruikten om tools voor bedrijfsverbetering te creëren, kleine interne apps te ontwikkelen en zelfs spontane ideeën te implementeren!

Van een zeer basale specificatie tot instructies voor de Claude-code, inclusief fijnafstelling...

Ik heb het in iets minder dan een uur in een bruikbare staat weten te krijgen.

Je kunt natuurlijk niet zomaar alles aan AI overlaten en verwachten dat het klaar is, maar als je het goed vertaalt naar prompts, kan het snel en gemakkelijk gaan!

Desktopapplicatie voltooid

Dit is een eenvoudige tool voor het genereren van inkooporders die draait op het besturingssysteem dat u waarschijnlijk al gebruikt.

Stuur het offerte-pdf-bestand naar het daarvoor bestemde adres..appWanneer je het bestand sleept en neerzet, wordt een Python-script uitgevoerd dat de inhoud van het offerte-pdf-bestand leest en een inkooporder-pdf in dezelfde map genereert.
Na voltooiing is het een eenvoudig proces dat een melding op macOS weergeeft en automatisch de gegenereerde inkooporder als pdf opent.

De structuur is als volgt:

~/Desktop/Generate Purchase Order/
Sleep de offerte → Generate Purchase Order.app
_lib/
generate_purchase_order.py
liberogic_logo.png
liberogic_seal.png
purchase_order_counter.json

Om het boekhoud- en administratief personeel in staat te stellen het te gebruiken zonder een terminal te hoeven openen, gebruiken we een AppleScript-droplet als toegangspunt, waarbij het daadwerkelijke genereren van PDF's door Python wordt afgehandeld.

Kortom, voeg gewoon het offerte-pdf-bestand toe.Een desktopapplicatie die een PDF-bestelbon genereert wanneer je deze sleept en neerzet.Het kan worden gebruikt zonder een terminal te openen, waardoor het zelfs voor interne administratieve taken gemakkelijk te bedienen is.

Het uiterlijk van het PDF-bestand van de inkooporder is zo ontworpen dat het lijkt op het PDF-formaat van de facturen en offertes die we binnen ons bedrijf gebruiken.
De volgende tekst is opgenomen in het opmerkingenveld:

Deze inkooporder vormt een formele bestelling. De bestelling is geplaatst op basis van offertenummer XXX.

Het ordernummer had de volgende opmaak:

{会社略称}様 発注書{YYYY}{MM}{3桁連番}

Als het bijvoorbeeld het eerste artikel is voor de heer/mevrouw XX in februari 2026,

Geachte heer/mevrouw XX, Inkooporder 202602001

Het zal er zo uitzien.

De opeenvolgende nummers per bedrijf en maand zijnpurchase_order_counter.jsonHet systeem regelt dit, en de besteldatum wordt automatisch berekend als 5 werkdagen na de datum op de offerte. (Dit is slechts een tijdelijke specificatie! Deze zal later worden aangepast!)
Om niet alleen zaterdagen en zondagen, maar ook Japanse feestdagen uit te sluiten, gebruikt PythonjpholidayIk heb het gebruikt.

Slechts een paar enigszins lastige onderdelen

De offertes die de basis vormen voor inkooporders worden verkregen van externe partners en samenwerkende bedrijven, waardoor het format per bedrijf verschilt.
Het is niet voldoende om er simpelweg van uit te gaan dat "de bedrijfsnaam zich op deze coördinaat bevindt" of "het totale bedrag zich op deze locatie bevindt".

Uiteindelijk houdt het proces in dat reguliere expressies worden gebruikt om de naam, het adres, het telefoonnummer, het offertenummer, de offertedatum, het onderwerp, de details, het subtotaal, de btw en het totaalbedrag van de leverancier zo flexibel mogelijk te extraheren. Bedrijven met "Attn:" erachter worden als ons eigen bedrijf beschouwd en andere als leveranciers. Ook wordt er omgegaan met problemen zoals informatie die visueel gescheiden lijkt, maar die bij het extraheren van tekst uit PDF's in de tekst wordt opgenomen.

Omdat er gevallen waren waarbij gebouwnamen of verdiepingsnummers na de onderwerpregel werden vermeld, hebben we een proces toegevoegd om onnodige adresgegevens eruit te filteren met behulp van termen als 'gebouw' en 'verdieping'.

Of het nu door AI komt of niet, dit blijft een veelvoorkomend probleem bij de verwerking van PDF-bestanden.

De prompt werd doorgegeven aan Claude Code.

In plaats van een vaag verzoek te doen, is het efficiënter om tokens te gebruiken als u zo specifiek mogelijk bent, inclusief mapstructuur, verwerkingsproces, lay-out, nummeringsregels, berekening van werkdagen, items voor PDF-extractie, enz.
Laten we ze ook het voorbeeld-pdf-bestand laten lezen!

以下の条件で、見積書PDFを発注書PDFに自動変換するツールをmacOS向けに作ってください。

## 環境

- macOS / Python3(pip可)
- フォント:`~/Library/Fonts/NotoSansJP-Regular.ttf` / `NotoSansJP-Bold.ttf`

## フォルダ構成

`~/Desktop/発注書生成/
  見積書をドロップ→発注書生成.app
  _lib/
    generate_purchase_order.py
    liberogic_logo.png
    liberogic_seal.png
    purchase_order_counter.json`

## 処理フロー

1. `.app` に見積書PDFをドラッグ&ドロップ
2. Pythonスクリプトを実行し発注書PDFを生成
3. 完了通知(macOS通知)を出して発注書PDFを自動で開く
4. 発注書PDFは見積書と同じフォルダに保存

## 発注書の仕様

出力フォーマットは添付のMoneyForward形式のPDFに合わせること。

このPDFから以下を抽出して使う:

- ロゴ画像
- 押印画像
- レイアウト座標
- 列幅
- 余白
- フォントサイズ

## 自社情報

リベロジック株式会社
登録番号:T2010401081132
〒108-0073 東京都港区三田1-3-37 板金会館2F
TEL: 03-6809-4366 / FAX: 03-6809-4367

## 発注書番号

- 形式:`{会社略称}様 発注書{YYYY}{MM}{3桁連番}`
- 会社別・月別の連番を `purchase_order_counter.json` で管理
- 出力ファイル名もこの発注書番号に揃える

## 発注日

- 見積書の日付から5営業日後
- 土日と日本の祝日を除外する

## 見積書からの情報抽出

- どんな会社のフォーマットでも対応できる柔軟な正規表現で抽出
- 抽出項目:ベンダー名・住所・TEL、見積書番号、見積日、件名、明細、小計・消費税・合計
- ベンダー判定:「御中」の付いた会社=自社、それ以外=発注先
- 件名に住所の建物名が混入するケースに対応

## 発注書レイアウト

- タイトル「発注書」中央大文字
- 左:発注先の社名・住所・TEL
- 右:自社情報+ロゴ+押印+発注書番号・発注日・見積書番号・見積日
- 件名・発注金額を大きく表示
- 明細テーブル:品目/単価/数量/単位/価格
- 交互グレー背景
- 最低8行
- 合計エリア:小計・消費税・合計のみ
- 備考欄を枠付きで表示
- ページ番号なし

Hoewel het in wezen een vereenvoudigd specificatiedocument is, is het belangrijk om zoveel mogelijk details te geven over de zakelijke beperkingen en het gewenste eindproduct, maar een simpelweg te zeggen: "Zorg dat het er goed uitziet."
Uiteindelijk mislukt het echter wanneer ik een ander formaat probeer te lezen, dus moet Claude nog harder werken, maar het is nog steeds snel, dus ik denk dat het wel goed is.
(Het aantal externe medewerkers en samenwerkingspartners waarmee we werken, is zelfs minder dan tien, dus het is geen groot probleem!)

Omdat het zo handig is, moeten we ons ook zorgen maken over de veiligheid.

Aan de andere kant moet je bij het gebruik van AI-ontwikkelingsondersteuning niet alleen rekening houden met gebruiksgemak, maar ook met beveiliging.

Tijdens het proces, waarbij je instructies geeft aan Claude Code, zullen er verschillende bewerkingen in je lokale omgeving worden uitgevoerd.

- Bestanden lezen en schrijven naar ~/Desktop
- Toegang tot ~/Library/Services/ controleren
- Python-bibliotheken toevoegen met pip install
- AppleScript-applicaties genereren met osacompile
- Lettertypebestanden lezen die zich in ~/Library/Fonts/ bevinden

Dit is geen bijzonder belangrijk verhaal, maar het is toch wel een beetje eng om AI uitvoeringsrechten te geven in een lokale omgeving, nietwaar? 😨

Bij het uitvoeren van terminalbewerkingen of bestandsbewerkingen op een systeem bestaat de mogelijkheid dat bestanden onbedoeld worden aangemaakt, overschreven of verwijderd.

  • Kijk goed wat je toelaat!
  • Maak een back-up!
  • Voor alles wat met Git beheerd kan worden, bekijk de verschillen!
  • Laten we aparte werkmappen aanmaken!

Deze basismaatregelen zijn belangrijk. Als je het gebruikt voor ontwikkelwerk, is het misschien beter om het .env-bestand via 1Password te laden. Het is wat omslachtig, maar het maakt een groot verschil. (doorOnze CTO

Aan de andere kant, zoals in dit gevalAls het alleen bedoeld is voor gebruik in een lokale omgeving, zijn de risico's relatief beperkt.In de meeste gevallen verspreidt de impact zich zelden extern via het netwerk en blijft deze in het ergste geval beperkt tot de eigen omgeving.

Er zijn nog veel meer punten om in gedachten te houden, maar "snel iets kunnen creëren" en "het veilig kunnen gebruiken" zijn twee verschillende dingen. Controleer bij het ontwikkelen met AI de uitvoeringsrechten, bestandsbewerkingen, externe bibliotheken en hoe je invoergegevens verwerkt.

In de toekomst zullen we ons richten op het delen van personeel en de integratie met Supabase.

Wat ik dit keer heb gemaakt, is een eenvoudige tool voor het genereren van inkooporders die lokaal draait.

In de beginfase,purchase_order_counter.jsonWe hebben een systeem opgezet om opeenvolgende nummers per bedrijf en maand te beheren, maar aangezien we dit in de toekomst met medewerkers zullen delen, zal het beheren van de opeenvolgende nummers met alleen lokale JSON-bestanden vanzelfsprekend leiden tot problemen zoals dubbele inkoopordernummers.

Daarom ben ik van plan om bedrijfsspecifieke en maandelijkse tellers in Supabase te implementeren, zodat er geen dubbele volgnummers zijn, zelfs niet wanneer meerdere mensen het gebruiken. Ook wil ik functies toevoegen zoals de uitgiftegeschiedenis van inkooporders, leverancier, offertenummer, orderbedrag, orderdatum en de locatie waar PDF's worden opgeslagen.

Geschreven door

Ondanks zijn functie als CEO blijft hij altijd een gelijkwaardige gesprekspartner. Hij haalt plezier uit het begrijpen van nieuwe technologieën en het ervaren van momenten van gemak. Hij is een praktische, toegewijde persoon die zich volledig in zijn werk stort. Hij is enthousiast over toekomstige technologieën en wil, ongeacht zijn leeftijd, blijven genieten van nieuwe ervaringen.

Morimoto

Projectmanager / Directeur / Opgericht in 2007

Bekijk het artikel van deze medewerker

Wij zijn trots op onze betrouwbare teamstructuur en snelle reactiemogelijkheden.

Bij Liberogic stimuleren onze ervaren medewerkers projecten proactief, waardoor we hoog gewaardeerd worden door onze klanten.
Wij zorgen ervoor dat projectmanagers en directeuren correct worden toegewezen om een ​​soepel verloop van het gehele project te garanderen. Wij voorkomen onnodige kostenstijgingen door volledige toezeggingen en wijzen middelen toe aan de juiste mensen op de juiste plaatsen. Bovendien staan ​​we bekend om de snelheid waarmee we de inhoud van het werk begrijpen en offertes opstellen en indienen.

Houd er rekening mee dat we niet actief betrokken zijn bij SES-achtige werkzaamheden op locatie.

We ondersteunen bijna alle belangrijke projectmanagement- en chattools, waaronder Slack, Teams, Redmine, Backlog, Asana, Jira, Notion, Google Workspace, Zoom en Webex.

Neem gerust contact met ons op als u vragen heeft over het web.

Casestudy