Topics

Weil ein Bestellformular benötigt wurde, haben wir mit Claude Code ein Tool zur Erstellung von Bestellformularen (Desktop-App) entwickelt

  • column

Wenn im Arbeitsalltag Aufgaben auftauchen, bei denen man sich denkt „Das manuell immer wieder zu machen ist ziemlich mühsam“, dann heißt es inzwischen ganz selbstverständlich: Mit Claude Code schnell ein kleines System bauen!

Dieses Mal ist es genau so ein typischer Fall, und der Auslöser war eine Erhöhung des Stammkapitals unseres Unternehmens.

Unser Geschäftsjahr beginnt im Februar, und auch die aktuelle Kapitalerhöhung haben wir im Februar durchgeführt. Mit der Erhöhung des Stammkapitals ist es jedoch notwendiger geworden, die Auftragsabwicklung mit externen Partnern und Subunternehmen noch sorgfältiger zu organisieren als bisher.

Es handelt sich um den Bereich des sogenannten Subunternehmervertragsgesetzes, das seit Januar 2026 nach der aktuellen Rechtslage als „Gesetz zur angemessenen Transaktionspraxis“ (Torihikitekiho) bezeichnet wird. Auf Auftraggeberseite steigt dadurch die Zahl der Pflichten, etwa die klare Angabe des Auftragsinhalts, die Erstellung und Aufbewahrung von Geschäftsunterlagen sowie die Festlegung von Zahlungsfristen.

Natürlich geht es dabei nicht nur darum, etwas zu tun, weil ein Gesetz es verlangt!

Wenn wir externe Partner mit Arbeiten beauftragen, ist es für beide Seiten, Auftraggeber wie Auftragnehmer, wichtig, Auftragsinhalt, Betrag, Termine und die Zuordnung zum Angebot klar festzulegen. (Kiri)

Es war auch keine Funktion, die in einem Buchhaltungstool ohnehin vorhanden gewesen wäre.

Wir nutzen für Buchhaltung, Angebote und Rechnungen die Tools von MoneyForward (im Folgenden "Manefo").
Für die täglichen Buchhaltungs- und Rechnungsprozesse sind sie praktisch, doch was wir diesmal erreichen wollten, war etwas anderes.

Aus dem Angebots-PDF, das wir von einem externen Partner erhalten haben, eine Bestellung-PDF auf Seiten von Liberogic erstellen

Zumindest im Umfang, den wir nutzen, gibt es bei MoneyForward keine passende Funktion, und einen Dienst nur dafür abzuschließen, wäre auch schade.

Würde man das manuell machen,

  • ein Bestellformat erstellen
  • das Angebot daneben öffnen und die Daten manuell in das Bestellformat übertragen
  • das Bestelldatum eintragen
  • die Angebotsnummer übertragen
  • die Positionen übertragen
  • Inhalte wie den Gesamtbetrag prüfen
  • Dateinamen aufräumen
  • Sonstiges, Sonstiges ...

Mühsam, nicht wahr? Diese zusätzliche Aufgabe... Also haben wir beschlossen, sie selbst zu bauen.

Mit Claude Code in knapp einer Stunde praxistauglich

Auch der Zeitpunkt war günstig.

Der Geschäftsbeginn im Februar, die Kapitalerhöhung im Februar und die Veröffentlichung von Claude Code sowie deren Verbreitung unter unseren Mitarbeitenden fielen zusammen.

Auch intern begann damals eine hackathonartige Dynamik: Mit Claude Code entstanden Tools zur Prozessverbesserung, kleine interne Apps und eigene Ideen wurden bis zur Bereitstellung umgesetzt.

Von einer kurzen Spezifikationsklärung über die Anweisungen an Claude Code bis hin zu feinen Anpassungen...

Nach knapp einer Stunde konnten wir einen praxistauglichen Stand erreichen.

Natürlich entsteht durch das bloße Delegieren an KI nicht automatisch ein fertiges Ergebnis, aber mit präzise formulierten Prompts geht es schnell und komfortabel!

Fertigstellung der Desktop-App

Ein schlankes Tool zur Erstellung von Bestellformularen, das auf dem Betriebssystem läuft, das vermutlich auch Sie verwenden.

Wird eine Angebots-PDF per Drag & Drop auf die eigens erstellte .app gezogen, führt sie ein Python-Skript aus, liest den Inhalt der Angebots-PDF aus und erzeugt im selben Ordner eine Bestell-PDF.
Nach Abschluss zeigt macOS eine Benachrichtigung an, und die erzeugte Bestell-PDF wird automatisch geöffnet. Die Lösung ist bewusst einfach gehalten.

Der Aufbau ist im Wesentlichen wie folgt.

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

Damit auch Mitarbeitende aus Buchhaltung und Verwaltung das Tool nutzen können, ohne das Terminal zu öffnen, dient ein AppleScript-Droplet als Einstiegspunkt. Die eigentliche PDF-Erzeugung übernimmt der Python-Teil.

Kurz gesagt: Eine Desktop-App, bei der Sie eine Angebots-PDF per Drag & Drop ablegen und sofort eine Bestell-PDF erhalten. Da kein Terminal benötigt wird, lässt sie sich auch im internen Verwaltungsalltag unkompliziert einsetzen.

Das Layout der Bestell-PDF orientiert sich an den Rechnungs- und Angebots-PDFs, die wir bei uns im Einsatz haben (Format von MoneyForward).
Im Bemerkungsfeld steht folgender Text:

Mit dieser Bestellung erteilen wir einen verbindlichen Auftrag. Die Bestellung erfolgt auf Grundlage der Angebotsnummer XXX.

Die Bestellnummern folgen diesem Format:

Bestellung {会社略称} {YYYY}{MM}{3桁連番}

Zum Beispiel, wäre es der erste Auftrag im Februar 2026 für Kunde 〇〇, dann

〇〇 Bestellnummer 202602001

ergibt sich daraus.

Die firmenbezogene und monatliche fortlaufende Nummerierung wird über purchase_order_counter.json verwaltet, und das Bestelldatum wird automatisch auf den 5. Werktag nach dem Datum des Angebots berechnet. (Das ist zunächst nur eine vorläufige Spezifikation! Wir passen das später an, sobald die Verwaltung dazu Vorgaben macht!)
Um neben Samstagen und Sonntagen auch japanische Feiertage auszuschließen, habe ich das Python-Paket jpholiday verwendet.

Ein kleiner, aber etwas kniffliger Teil

Die Angebote, auf denen die Bestellungen basieren, stammen von externen Partnern und Zulieferern, weshalb das Format von Unternehmen zu Unternehmen unterschiedlich ist.
Es reicht nicht aus, einfach festzulegen, dass „der Firmenname an dieser Position steht“ oder „der Gesamtbetrag an jener Position steht“.

Letztendlich habe ich mit regulären Ausdrücken gearbeitet, um Lieferantenname, Adresse, Telefonnummer, Angebotsnummer, Angebotsdatum, Betreff, Positionen, Zwischensumme, Umsatzsteuer, Gesamtsumme und weitere Angaben so flexibel wie möglich zu extrahieren. Firmen mit dem Zusatz „御中“ werden als eigene Firma behandelt, alle anderen als Auftragnehmer. Außerdem kommt es vor, dass sich beim Extrahieren von Text aus PDFs Informationen, die optisch getrennt sind, im Text miteinander vermischen.

Da es auch vorkam, dass Gebäudenamen oder Etagenangaben hinter dem Betreff eingefügt wurden, gibt es eine Verarbeitung, die anhand von Angaben wie „ビル“ oder „階“ überflüssige Adressinformationen abschneidet.

Ob KI oder nicht, bei diesen Stellen gibt es bei der PDF-Verarbeitung wie eh und je die typischen Probleme.

An Claude Code übergebener Prompt

Statt vager Anweisungen ist es oft wirtschaftlicher für den Token-Verbrauch, so konkret wie möglich zu beschreiben: Ordnerstruktur, Verarbeitungsablauf, Layout, Nummerierungsregeln, Berechnung von Geschäftstagen, extrahierte PDF-Felder usw.
Lassen Sie es außerdem auch das Beispiel-PDF lesen!

以下の条件で、見積書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行
- 合計エリア:小計・消費税・合計のみ
- 備考欄を枠付きで表示
- ページ番号なし

Das ist im Grunde eine vereinfachte Spezifikation, aber es ist wichtig, geschäftliche Einschränkungen und das gewünschte Endergebnis so konkret wie möglich zu vermitteln, statt nur "mach es irgendwie schön" zu sagen.
Letztlich scheitert es jedoch, wenn man ein anderes Format einlesen lässt, daher muss man Claude weiterhin etwas nachhelfen. Trotzdem ist es schnell, und deshalb finde ich das ganz gut.
(Die externen Mitarbeitenden und Kooperationspartner, mit denen wir zusammenarbeiten, sind zusammen nicht einmal zweistellig, also ist das keine große Sache!)

Gerade weil es praktisch ist, achten wir auch auf die Sicherheit

Wenn man KI-Entwicklungsunterstützung nutzt, muss man neben dem Komfort auch auf die Sicherheit achten.

Während man Claude Code Anweisungen gibt und die Arbeit voranbringt, werden in der lokalen Umgebung mehrere Vorgänge ausgeführt.

- ~/Desktop へのファイル読み書き
- ~/Library/Services/ へのアクセス検討
- pip install によるPythonライブラリの追加
- osacompile によるAppleScriptアプリの生成
- ~/Library/Fonts/ にあるフォントファイルの読み取り

Das ist zwar kein großes Thema, aber wenn eine KI Ausführungsrechte in der lokalen Umgebung erhält, ist das schon beängstigend, oder? 😨

Wenn man Terminal- oder Dateioperationen übergibt, kann es zu unbeabsichtigtem Erstellen, Überschreiben oder Löschen von Dateien kommen,

  • Prüfen Sie, welche Aktionen erlaubt werden!
  • Erstellen Sie ein Backup!
  • Prüfen Sie die Unterschiede bei allem, was sich mit git verwalten lässt!
  • Arbeitsordner trennen!

Grundlegende Schutzmaßnahmen wie diese sind wichtig. Wenn Sie die Entwicklung damit betreiben, sollten Sie die .env-Datei möglicherweise über 1Password einlesen lassen. Das ist zwar umständlich, macht aber einen deutlichen Unterschied. (von unserem CTO)

Bei einer Nutzung wie in diesem Fall, bei der die Anwendung ausschließlich in der lokalen Umgebung läuft, ist das Risiko vergleichsweise begrenzt. Auswirkungen auf Dritte über das Netzwerk sind selten, und in den meisten Fällen bleibt der Schaden auf die eigene Umgebung beschränkt.

Es gibt noch viele weitere Punkte zu beachten, aber „schnell entwickelt“ und „sicher nutzbar“ sind zwei verschiedene Dinge. Bei der KI-gestützten Entwicklung sollten Sie Ausführungsrechte, Dateizugriffe, externe Bibliotheken und den Umgang mit Eingabedaten im Blick behalten!

Als Nächstes folgen die gemeinsame Nutzung im Team und die Anbindung an Supabase.

Das Ergebnis dieses Projekts ist ein einfaches, lokal lauffähiges Tool zur Erstellung von Bestellungen.

Zunächst habe ich purchase_order_counter.json verwendet, um die laufenden Nummern nach Firma und Monat zu verwalten. Sobald das Tool jedoch im Team genutzt werden soll, entstehen zwangsläufig Probleme: Lokale JSON-Dateien allein führen schnell zu doppelten Bestellnummern und anderen Schwierigkeiten.

Deshalb lege ich die Zähler nach Firma und Monat in Supabase an, damit auch mehrere Personen ohne doppelte Nummern arbeiten können. Zusätzlich werde ich den Verlauf der Bestellungen, Lieferanten, Angebotsnummern, Bestellbeträge, Bestelldaten und Speicherorte der PDFs implementieren!

Über den Autor

Als Geschäftsführer immer auf Augenhöhe mit unseren Partnern. Ich verstehe neue Technologien und freue mich, wenn etwas den Alltag einfacher macht. Ich liebe die Arbeit vor Ort und tauche gern tief in Themen ein. Die Zukunftstechnologien begeistern mich, und egal wie alt man wird, möchte ich immer Neues erleben.

Tadanori Morimoto

Projektmanager / Regisseur / Gegründet 2007

Artikel dieses Teammitglieds ansehen

Verlässliches Team und schnelle Reaktionsfähigkeit sind unsere Stärken

Bei Liberogic werden wir von unseren Kunden hoch geschätzt, da unsere erfahrenen Mitarbeiter Projekte proaktiv vorantreiben.
Wir achten darauf, Projektmanager und Direktoren gezielt einzusetzen, damit das gesamte Projekt reibungslos verläuft. Um unnötige Kostensteigerungen durch Vollzeitbindung zu vermeiden, verteilen wir Ressourcen passgenau. Zudem sind wir für unsere Geschwindigkeit bekannt, vom Verständnis der Anforderungen bis zur Erstellung und Einreichung von Angeboten.

Hinweis: Wir bieten keine SES-typischen Vor-Ort-Einsätze an. Wir bitten um Ihr Verständnis.

Sie können nahezu alle gängigen Tools für Projektmanagement und Chat nutzen, darunter Slack, Teams, Redmine, Backlog, Asana, Jira, Notion, Google Workspace, Zoom, Webex und viele weitere.

Sprechen Sie uns gerne auf Ihre Herausforderungen im Web an.

Fallstudien