Topics

Création d'un outil de génération de bons de commande (application de bureau) avec Claude Code, car nous en avions besoin

  • column

Dans notre travail quotidien, lorsqu'une tâche manuelle répétitive devient un peu pénible, il est devenu tout à fait naturel de mettre en place rapidement un petit système avec Claude Code !

Cette fois, l'histoire est typique de ce type de situation, et elle a commencé par une augmentation du capital de notre entreprise.

Notre exercice commence en février, et c'est également en février que nous avons réalisé cette augmentation de capital. Cette opération nous a amenés à structurer encore plus rigoureusement la gestion de nos commandes auprès de partenaires externes et de sous-traitants qu'auparavant.

Il s'agit de ce que l'on appelle la « loi sur la sous-traitance » (shitauke-hô), désormais dénommée « loi sur les pratiques commerciales appropriées » (Torekiteki-hô) depuis janvier 2026 selon le cadre réglementaire actuel. Du côté du donneur d'ordre, les obligations se multiplient : indication précise du contenu de la commande, établissement et conservation des documents commerciaux, fixation des délais de paiement, etc.

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

Lorsque l'on confie un travail à un partenaire externe, il est essentiel pour les deux parties, donneur d'ordre comme prestataire, de clarifier le contenu de la commande, le montant, les dates et la correspondance avec le devis. (Kiri)

Ce n'était pas non plus une fonctionnalité intégrée à un outil de comptabilité.

Our company uses MoneyForward (known in Japanese as "マネフォ") tools for accounting, quotations, and invoicing.
They are convenient for day-to-day accounting and billing work, but what we wanted to do this time was slightly different.

Créer un bon de commande PDF côté Liberogic à partir d'un devis PDF reçu d'un partenaire externe

Du moins dans le cadre de notre utilisation, MoneyForward n'a pas de fonctionnalité adaptée à nos besoins, et souscrire un abonnement uniquement pour cela serait dommage.

Si nous devions le faire manuellement,

  • Créer le format du bon de commande
  • Reporter manuellement les informations du devis dans le format du bon de commande
  • Indiquer la date de commande
  • Reporter le numéro du devis
  • Reporter le détail des lignes
  • Vérifier le contenu, notamment le montant total
  • Harmoniser les noms de fichiers
  • Autres, autres...

Ce genre de tâche répétitive est pénible... alors j'ai décidé de créer un outil pour cela.

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

Le timing était aussi idéal.

Le début d'exercice en février, une augmentation de capital en février et la sortie de Claude Code, ainsi que son adoption par notre équipe, ont coïncidé.

À cette époque, en interne, une dynamique de type hackathon commençait justement : utiliser Claude Code et d'autres outils pour améliorer les processus métier, créer de petites applications internes et aller jusqu'au déploiement de ses propres idées !

De la définition très simple des spécifications jusqu'aux instructions données à Claude Code, en passant par les ajustements fins...

Nous avons pu le rendre utilisable en un peu moins d'une heure.

Bien sûr, il ne suffit pas de tout confier à l'IA pour obtenir un résultat abouti, mais avec des prompts bien structurés, c'est rapide et pratique !

Finalisation de l'application de bureau

Un outil simple de génération de bons de commande qui fonctionne sur le système d'exploitation que vous utilisez probablement aussi.

Il suffit de glisser-déposer un devis PDF sur le .app dédié : un script Python s'exécute, lit le contenu du devis PDF et génère un bon de commande PDF dans le même dossier.
Une fois le traitement terminé, une notification macOS s'affiche et le bon de commande PDF généré s'ouvre automatiquement. C'est un outil volontairement simple.

Voici la structure générale.

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

Nous voulions que le personnel comptable et administratif puisse l'utiliser sans ouvrir de terminal. Nous avons donc utilisé un droplet AppleScript comme point d'entrée, la génération des PDF étant réalisée par Python.

En bref, il s'agit d'une application de bureau qui génère un bon de commande PDF lorsqu'on y glisse-dépose un devis PDF. Comme elle ne nécessite pas d'ouvrir un terminal, elle reste simple à utiliser pour les tâches administratives internes.

Nous avons aligné la mise en page du bon de commande PDF sur celle des factures et devis PDF au format MoneyForward que nous utilisons en interne.
Dans le champ remarques, nous avons inséré le texte suivant :

Le présent bon de commande vaut commande ferme. Commande passée sur la base du devis n° XXX.

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

Bon de commande pour {会社略称} {YYYY}{MM} {3桁連番}

Par exemple, s'il s'agit du premier bon de commande de février 2026 pour le client 〇〇,

〇〇 Bon de commande 202602001

donnera le résultat suivant.

Le numéro de série par entreprise et par mois est géré dans purchase_order_counter.json, et la date de commande est calculée automatiquement en ajoutant 5 jours ouvrés à la date du devis. (Il s'agit d'une spécification provisoire ! Elle sera modifiée ultérieurement en fonction des règles de gestion !)
Pour exclure non seulement les samedis et dimanches mais aussi les jours fériés japonais, la bibliothèque Python jpholiday a été utilisée.

Une partie légèrement délicate

Les devis à partir desquels les bons de commande sont établis proviennent de partenaires externes et de sous-traitants, si bien que le format varie d'une entreprise à l'autre.
Il est impossible de s'en sortir en se contentant de supposer que « le nom de l'entreprise se trouve à telle coordonnée » ou que « le montant total se trouve à tel endroit ».

En fin de compte, j'ai utilisé des expressions régulières pour extraire autant que possible de manière flexible le nom du fournisseur, l'adresse, le téléphone, le numéro de devis, la date du devis, l'objet, les lignes de détail, le sous-total, la TVA et le total. Les entreprises suffixées par « Oncho » (御中) sont traitées comme étant la société elle-même, les autres comme fournisseurs. Par ailleurs, lors de l'extraction de texte depuis un PDF, des informations qui apparaissent séparées visuellement se retrouvent parfois collées les unes aux autres dans le texte brut, etc., etc.

Comme il arrivait que le nom de l'immeuble ou l'étage se glisse après l'objet, j'ai ajouté un traitement qui repère des mots comme « Bldg » ou « étage » pour couper les informations d'adresse superflues.

Que ce soit avec l'IA ou non, ce traitement de PDF reste un classique, toujours aussi pénible.

Prompt transmis à Claude Code

Plutôt que des demandes vagues, il est souvent plus économique en tokens de préciser le plus possible : structure des dossiers, flux de traitement, mise en page, règles de numérotation, calcul des jours ouvrés, éléments extraits des PDF, etc.
Demandez aussi à Claude de lire vos PDF d'exemple !

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

Il s'agit d'une sorte de cahier des charges simplifié, mais il est essentiel de transmettre des contraintes métier et une image du résultat attendu aussi concrètes que possible, plutôt que de demander simplement de « faire quelque chose de bien ».
Au final, si l'on fait lire un autre format, cela échoue parfois, et il faut encore demander à Claude de faire des efforts supplémentaires ; mais c'est tout de même rapide, donc cela me convient.
(Même en comptant les intervenants externes et les partenaires que nous sollicitons, nous ne sommes pas à deux chiffres, donc ce n'est pas un sujet majeur !)

Parce que c'est pratique, il faut aussi veiller à la sécurité

En revanche, lorsqu'on utilise une aide au développement basée sur l'IA, il faut veiller à la sécurité, et pas seulement à la commodité.

Pendant que l'on avance en donnant des instructions à Claude Code, plusieurs opérations sont effectuées sur l'environnement local.

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

Ce n'est pas vraiment un sujet majeur, mais dès lors qu'on donne à une IA des droits d'exécution sur l'environnement local, cela fait forcément un peu peur 😨

Lorsqu'on confie des opérations de terminal ou de fichiers, il existe un risque de création, d'écrasement ou de suppression de fichiers non voulus,

  • Vérifier précisément ce qui est autorisé !
  • Faire une sauvegarde !
  • Vérifier les différences pour ce qui est géré par git !
  • Séparez les dossiers de travail !

Des mesures de base comme celles-ci sont essentielles. Si vous utilisez l'outil dans le cadre de vos activités de développement, il peut être judicieux de charger le fichier .env via 1Password. C'est un peu fastidieux, mais la différence est notable. (par notre CTO)

En revanche, pour une utilisation limitée à un environnement local, comme dans le cas présent, les risques sont relativement restreints. Il est rare que des effets se propagent à l'extérieur via le réseau, et dans la plupart des cas, les conséquences restent circonscrites à « votre propre environnement, au pire ».

Il existe encore de nombreux autres points à surveiller, mais « pouvoir créer rapidement » et « pouvoir utiliser en toute sécurité » sont deux choses distinctes. Lorsque vous développez avec l'IA, vérifiez les droits d'exécution, les opérations sur les fichiers, les bibliothèques externes et la gestion des données en entrée au fil de votre travail !

Prochaine étape : partage avec l'équipe et intégration de Supabase

Voici maintenant l'outil que j'ai créé : un générateur de bons de commande simple, fonctionnant en local.

Dans un premier temps, j'ai utilisé purchase_order_counter.json pour gérer une numérotation séquentielle par entreprise et par mois. Cependant, si l'on envisage de partager l'outil avec l'équipe, la gestion de la numérotation uniquement via un fichier JSON local entraîne naturellement des problèmes, comme des numéros de bons de commande en double.

C'est pourquoi je prévois de stocker les compteurs par entreprise et par mois dans Supabase, afin que plusieurs personnes puissent l'utiliser sans doublons de numérotation. J'ajouterai également l'historique d'émission des bons de commande, le fournisseur, le numéro de devis, le montant de la commande, la date de commande et l'emplacement d'enregistrement des PDF !

Auteur de cet article

Président de l'entreprise, mais toujours du côté des praticiens. Passionné de terrain, j'éprouve une véritable joie à comprendre les nouvelles technologies ou à voir un outil devenir plus pratique, et je m'y plonge sans compter. Enthousiaste face aux technologies de demain, j'aime continuer à découvrir de nouvelles expériences, quel que soit mon âge.

Tadanori Morimoto

Chef de projet / Directeur artistique / Fondée en 2007

Voir les articles de cet auteur

Une équipe fiable et une réactivité rapide, qui font notre fierté

Chez Liberogic, nos collaborateurs expérimentés pilotent activement les projets, ce qui vaut à l'entreprise une grande satisfaction de la part de ses clients.
Nous veillons à désigner des chefs de projet et des directeurs de projet qualifiés afin de faire avancer l'ensemble du projet en douceur. Grâce à un modèle d'allocation des ressources au plus juste, évitant une hausse inutile des coûts liée à un engagement à temps plein, nous sommes également reconnus pour la rapidité avec laquelle nous comprenons les besoins et établissons/soumettons les devis.

Remarque : Liberogic ne propose pas de prestations de type SES (mise à disposition de personnel sur site) et vous remercie de bien vouloir en tenir compte.

Nous prenons en charge pratiquement tous les principaux outils de gestion de projet et de messagerie, notamment Slack, Teams, Redmine, Backlog, Asana, Jira, Notion, Google Workspace, Zoom, Webex, etc.

Contactez-nous pour toute question sur vos problématiques Web.

Études de cas