Topics

J'ai eu besoin d'un bon de commande, alors j'ai créé un outil de génération de bons de commande (application de bureau) avec Claude Code

  • column

Au fil de nos opérations quotidiennes, créer de petits systèmes avec Claude Code est devenu une pratique naturelle chaque fois que nous rencontrons quelque chose qui serait fastidieux à faire manuellement.

Cette fois, c'était un cas typique : tout a commencé lorsque notre entreprise a augmenté son capital social.

Notre exercice fiscal commence en février, et nous avons également procédé à l'augmentation de capital en février. Avec cette augmentation, nous avons dû mettre en place des processus plus rigoureux pour les commandes adressées à nos partenaires externes et entreprises partenaires.

C'est ce qu'on appelle la loi sur les sous-traitants, un domaine qui s'appelle désormais la « loi sur les transactions équitables » depuis janvier 2026. En tant que donneur d'ordre, nous avons de plus en plus d'obligations : clarifier le contenu des commandes, créer et conserver les documents commerciaux, fixer les dates de paiement, etc.

Bien sûr, il ne s'agit pas simplement de faire cela parce que la loi l'exige !

Quand on confie du travail à des partenaires externes, il est important pour les deux parties — le donneur d'ordre comme le prestataire — de clarifier le contenu de la commande, le montant, la date et la relation avec les devis. (C'est fondamental.)

Ce n'était pas une fonctionnalité disponible dans nos outils comptables

Chez Liberogic, nous utilisons les outils MoneyForward (ci-après MF) pour la comptabilité, les devis et les factures.
C'est pratique pour les opérations comptables et de facturation courantes, mais ce que nous voulions faire cette fois-ci était un peu différent.

Créer un PDF de bon de commande Liberogic basé sur le PDF de devis reçu d'un partenaire externe

Au moins dans la portée que nous utilisons, Monefo n'a pas exactement la fonctionnalité dont nous avons besoin, et il serait dommage de contracter le service juste pour cela.

Si cela devait être fait manuellement,

  • Créer un modèle de bon de commande
  • Transcrire manuellement les données du devis dans le modèle du bon de commande
  • Indiquer la date de commande
  • Transcrire le numéro de devis
  • Transcrire les détails de ligne
  • Vérifier le contenu, notamment le montant total
  • Corriger le nom du fichier
  • Autres, autres…

C'est fastidieux, n'est-ce pas, quand ces tâches s'accumulent… C'est pourquoi nous avons décidé de créer cet outil.

Mise en production en moins d'une heure avec Claude Code

Le timing était aussi très favorable.

Début février, l'augmentation de capital en février, et le lancement de Claude Code coïncidaient avec sa diffusion au sein de notre équipe.

C'était justement la période où nous avons commencé un mouvement de type hackathon en interne, utilisant Claude Code et d'autres outils pour améliorer nos processus, développer de petites applications internes et déployer des idées créatives.

À partir d'une spécification très simple, en passant par les instructions à Claude Code et les ajustements détaillés…

Nous avons pu mettre en place une solution opérationnelle en moins d'une heure.

Bien sûr, on ne peut pas tout déléguer à l'IA et avoir un produit fini, mais si on sait bien formuler le prompt, c'est rapide et pratique !

Achèvement de l'application de bureau

C'est un simple outil de génération de bon de commande qui fonctionne sur un OS que vous utilisez probablement.

Glissez-déposez un PDF de devis dans le .app dédié, et un script Python s'exécute pour lire le contenu du PDF de devis et générer un PDF de bon de commande dans le même dossier.
Une fois terminé, une notification macOS s'affiche et le PDF de bon de commande généré s'ouvre automatiquement.

La structure est la suivante.

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

Nous voulions que le personnel des services comptables et administratifs puisse l'utiliser sans ouvrir le terminal, nous avons donc utilisé une droplet AppleScript comme point d'entrée et traité la génération réelle du PDF côté Python.

En résumé, c'est une application de bureau où vous glissez-déposez simplement un PDF de devis pour obtenir un PDF de bon de commande. Comme il peut être utilisé sans ouvrir le terminal, nous l'avons rendu facile à manipuler pour les tâches de gestion internes de l'entreprise.

L'apparence du PDF de bon de commande a été alignée sur le format des PDF de facture et de devis que nous utilisons chez Liberogic.
La section des remarques contient le texte suivant.

Ce bon de commande constitue une commande formelle. Nous passons la commande selon le devis numéro XXX.

Le numéro de bon de commande suit le format suivant.

{Abréviation de l'entreprise} Bon de commande {YYYY}{MM}{Numéro de série 3 chiffres}

Par exemple, pour la première commande en février 2026 pour le client ○○,

Commande 〇〇 202602001

se présente comme suit.

Les numéros de série par entreprise et par mois sont gérés via purchase_order_counter.json, et la date de commande est automatiquement calculée comme 5 jours ouvrables après la date du devis. (C'est une spécification temporaire ! Elle sera modifiée ultérieurement par la gestion !)
Pour exclure non seulement les samedis et dimanches, mais aussi les jours fériés japonais, j'ai utilisé jpholiday en Python.

partie légèrement délicate

Le devis à la base de la commande provient de partenaires externes ou de sociétés collaboratrices, de sorte que le format varie d'une entreprise à l'autre.
Il n'est pas possible de se contenter de dire simplement « le nom de l'entreprise est à cette coordonnée » ou « le montant total est à cette position ».

En fin de compte, en utilisant des expressions régulières, nous avons extrait aussi flexiblement que possible le nom du fournisseur, l'adresse, le téléphone, le numéro de devis, la date du devis, l'objet, les détails, le sous-total, la TVA, le total, etc., et nous avons traité les entreprises portant « 御中 » comme notre propre société et les autres comme des destinataires de commandes. Quand le texte est extrait d'un PDF, les informations qui semblent séparées visuellement se collent ensemble dans le texte, et cætera, et cætera.

Comme il y avait des cas où des noms de bâtiments ou des numéros d'étage se mêlaient après l'objet, j'ai aussi inclus un traitement pour supprimer les informations d'adresse inutiles en utilisant des marques comme « ビル » (bâtiment) et « 階 » (étage) comme indices.

Qu'il s'agisse d'IA ou de quoi que ce soit d'autre, c'est toujours des problèmes typiques du traitement PDF.

Invite fournie à Claude Code

Plutôt qu'une demande vague, il est plus économique en termes de consommation de jetons de rédiger aussi précisément que possible : structure des dossiers, flux de traitement, mise en page, règles de numérotation, calcul des jours ouvrables, éléments d'extraction PDF, etc.
Faites-lui lire aussi les exemples de PDF !

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

C'est essentiellement une spécification sommaire, mais au lieu de dire simplement « faites-le bien », il est important de communiquer des contraintes métier et une image finale aussi concrètes que possible.
En fin de compte, charger Claude avec un format différent peut échouer, donc il faut vraiment le pousser à faire des efforts supplémentaires. Mais c'est quand même plus rapide, donc c'est bon.
(Les ressources externes et partenaires avec lesquels nous travaillons ne sont pas assez nombreux pour en faire grand cas !)

Précisément parce que c'est pratique, il faut aussi se préoccuper de la sécurité

En revanche, lorsqu'on utilise l'assistance au développement IA, il est nécessaire de se préoccuper non seulement de la commodité, mais aussi de la sécurité.

En donnant des instructions à Claude Code tout en progressant dans le travail, plusieurs opérations sont effectuées sur l'environnement local.

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

Ce n'est pas grand-chose cette fois-ci, mais octroyer à une IA des droits d'exécution dans un environnement local, c'est vraiment effrayant, non ? 😨

Lorsqu'on confie des opérations en terminal ou sur les fichiers, il existe un risque de création / écrasement / suppression involontaire de fichiers, donc

  • Vérifiez le contenu que vous autorisez !
  • Effectuez une sauvegarde !
  • Pour ce qui peut être géré par git, vérifiez les différences !
  • Séparez les dossiers de travail !

et ainsi de suite constituent des mesures fondamentales essentielles. Si vous l'utilisez dans des tâches de développement, il serait peut-être judicieux de configurer le chargement du fichier .env via 1password. C'est fastidieux, mais cela fait une grande différence. (par notre CTO)

En revanche, dans des cas comme celui-ci où l'exécution se limite uniquement à l'environnement local, les risques sont relativement limités. Il est rare que l'impact s'étende à l'extérieur via le réseau, et dans la plupart des cas, cela reste dans la plage « au pire, seul votre environnement est affecté ».

Il y a bien d'autres points à considérer, mais « pouvoir aller vite » et « pouvoir l'utiliser de manière sécurisée » sont deux choses différentes. Lorsque vous progressez dans le développement en exploitant l'IA, vérifiez les permissions d'exécution, la manipulation de fichiers, les bibliothèques externes et le traitement des données d'entrée au fur et à mesure !

Prochainement : partage avec l'équipe et intégration Supabase

Eh bien, ce que j'ai créé cette fois-ci est un simple outil de génération de bons de commande fonctionnant en environnement local.

Dans la première étape, j'ai utilisé purchase_order_counter.json pour gérer les numéros séquentiels par entreprise et par mois, mais en envisageant une utilisation partagée avec l'équipe à l'avenir, si on gère la numérotation uniquement avec un fichier JSON local, naturellement on se retrouve avec des problèmes comme des numéros de bons de commande en double, et bien d'autres soucis.

Donc je vais implémenter des compteurs par entreprise et par mois côté Supabase pour que plusieurs personnes puissent l'utiliser sans risque de doublon, et j'ajouterai aussi l'historique des émissions de bons de commande, les destinataires, les numéros de devis, les montants, les dates et les emplacements de sauvegarde des PDF !

Auteur de cet article

Président tout en restant un homologue constant. Il aime comprendre les nouvelles technologies, ressent de la joie à l'instant où quelque chose devient pratique, et est un véritable passionné du terrain. Il s'enthousiasme pour les technologies futures et souhaite continuer à explorer de nouvelles expériences, quel que soit son âge.

Morimoto

Chef de projet / Directeur / Fondateur en 2007

Voir les articles de ce membre

Notre équipe fiable et nos capacités de réactivité font notre fierté

Chez Liberogic, nos équipes expérimentées sont reconnues pour diriger activement les projets et sont hautement appréciées par nos clients.
Nous assignons correctement un chef de projet et un directeur, et veillons à assurer le déroulement fluide de l'ensemble du projet. Nous évitons une augmentation inutile des coûts en engagements complets, en allouant les ressources de manière optimale. Notre approche est réputée pour sa rapidité dans la compréhension des besoins, la création et la soumission des devis.

* Veuillez noter que nous n'engageons pas activement de missions d'intégration type SES.

Slack, Teams, Redmine, Backlog, Asana, Jira, Notion, Google Workspace, Zoom, Webex, et pratiquement tous les principaux outils de gestion de projet et de communication que vous utilisez.

Consultez-nous pour toute question ou préoccupation concernant le web.

Études de cas