En nuestras actividades diarias, cuando surge algo que es «un poco tedioso seguir haciendo manualmente», crear sistemas pequeños con Claude Code se ha convertido en algo natural.
Esta vez fue precisamente un caso típico de eso, y todo comenzó cuando nuestra empresa aumentó su capital social.
Nuestra empresa tiene su ejercicio fiscal en febrero, y también realizamos la ampliación de capital en febrero. Con el aumento del capital social, surgió la necesidad de reforzar aún más nuestros procesos de contratación con socios externos y empresas colaboradoras.
Se refiere a lo que se conoce como la Ley de Subcontratación; en el sistema actual, desde enero de 2026 se llama «Ley de Transacciones Apropiadas». Como empresa contratante, tenemos que cumplir con más requisitos: especificar el contenido de los pedidos, crear y conservar documentos de transacción, establecer fechas de pago, etc.
¡Por supuesto, esto no es solo una cuestión de «tenemos que hacerlo porque lo requiere la ley»!
Cuando le pedimos trabajo a un socio externo, es importante para ambas partes —contratante y contratado— dejar clara la descripción del trabajo, el monto, la fecha y la relación con el presupuesto. (Punto final.)
No era una función que tuviera nuestra herramienta contable
En nuestra empresa utilizamos herramientas de MoneyForward (en adelante, MoneyForward) para contabilidad, presupuestos y facturación.
Es conveniente para nuestras tareas cotidianas de contabilidad y facturación, pero lo que necesitábamos esta vez era algo diferente.
Crear un PDF de orden de compra de Liberogic basado en el PDF de presupuesto recibido del socio externo
Al menos en el rango que utilizamos, no existe una función adecuada en Manefon, y además no vale la pena contratar el servicio solo por eso.
Si fuera trabajo manual,
- Crear el formato de la orden de compra
- Transcribir manualmente los datos del presupuesto al formato de la orden de compra
- Registrar la fecha de la orden
- Transcribir el número de presupuesto
- Transcribir los detalles
- Verificar el contenido, incluido el monto total
- Ajustar el nombre del archivo
- Otros, otros...
Es molesto, ¿verdad?, que las tareas aumenten... así que decidimos crearlo.
Implementación práctica en poco menos de una hora con Claude Code
El momento también fue perfecto.
Coincidieron el cierre del primer trimestre de febrero, la ampliación de capital en febrero, y el lanzamiento de Claude Code junto con su adopción por parte de nuestro personal.
Internamente, ya estábamos en una etapa de hackathon donde usábamos Claude Code y otras herramientas para mejorar procesos, crear pequeñas aplicaciones internas y finalizar despliegues de ideas improvisadas.
Desde una especificación súper simple, instrucciones a Claude Code e incluidos ajustes detallados...
Logramos llevarlo a un punto funcional en poco menos de una hora.
Bueno, no es que delegando todo a la IA se termine mágicamente, pero si lo traducimos correctamente a un prompt, ¡es rápido y conveniente!
Aplicación de escritorio completada
Es una herramienta simple de generación de órdenes de compra que se ejecuta en el sistema operativo que probablemente todos usamos.
Al arrastrar y soltar un PDF de presupuesto en el .app dedicado, se ejecuta un script de Python que lee el contenido del PDF de presupuesto y genera un PDF de orden de compra en la misma carpeta.
Después de completarse, muestra una notificación de macOS y abre automáticamente el PDF de orden de compra generado.
La estructura es la siguiente.
~/Desktop/発注書生成/
見積書をドロップ→発注書生成.app
_lib/
generate_purchase_order.py
liberogic_logo.png
liberogic_seal.png
purchase_order_counter.jsonQueríamos que el personal de contabilidad y administración pudiera usarlo sin abrir la terminal, así que usamos un droplet de AppleScript como punto de entrada y realizamos el procesamiento real de generación de PDF en el lado de Python.
En resumen, es una aplicación de escritorio donde arrastras y sueltas un PDF de presupuesto y obtienes un PDF de orden de compra. Como no requiere abrir la terminal, la hicimos fácil de usar para las tareas administrativas internas de la empresa.
El aspecto del PDF de orden de compra sigue el formato de facturas y presupuestos en PDF que usamos en nuestra empresa.
En la sección de observaciones incluimos el siguiente texto.
Esta orden de compra constituye una orden formal. Se emite basándose en el presupuesto número XXX.
El formato del número de orden de compra es el siguiente.
{Abreviatura de empresa} Orden de compra {YYYY}{MM}{Número secuencial de 3 dígitos}
Por ejemplo, para el primer documento de febrero de 2026 dirigido a ○○,
OO Company PO202602001
se vería así.
Los números secuenciales por empresa y mes se gestionan en purchase_order_counter.json, y la fecha de pedido se calcula automáticamente cinco días hábiles después de la fecha del presupuesto. (¡Esta es solo una especificación provisional! ¡Puede cambiar bajo la supervisión de la administración!)
Para excluir no solo los fines de semana, sino también los días festivos de Japón, utilizamos jpholiday de Python.
Parte ligeramente más complicada
El presupuesto que sirve de base para la orden de compra proviene de socios externos o empresas colaboradoras, por lo que el formato varía según la empresa.
No podemos simplemente decidir «el nombre de la empresa está en estas coordenadas» o «el monto total está en esta posición».
Al final, utilizando expresiones regulares, extraemos con la mayor flexibilidad posible el nombre del proveedor, dirección, teléfono, número de presupuesto, fecha del presupuesto, asunto, detalles, subtotal, impuesto al consumo, total, y tratamos las empresas que llevan «御中» como propias y las demás como destinatarios de pedidos. Además, cuando extraemos texto de PDF, la información que visualmente parece separada puede pegarse en el texto, y otros problemas similares.
En casos donde el nombre del edificio o el piso se mezclan después del asunto, también incluimos procesamiento que elimina la información de dirección innecesaria usando indicadores como «ビル» (edificio) y «階» (piso).
Ya sea con IA o cualquier otra cosa, este sigue siendo un problema típico del procesamiento de PDF.
Indicaciones que pasamos a Claude Code
En lugar de solicitudes vagas, es más económico en cuanto al consumo de tokens escribir de manera específica: estructura de carpetas, flujo de procesamiento, diseño, reglas de numeración, cálculo de días hábiles, elementos a extraer de PDF, etc.
¡Hagamos que lean también los PDF de ejemplo!
以下の条件で、見積書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行
- 合計エリア:小計・消費税・合計のみ
- 備考欄を枠付きで表示
- ページ番号なしAunque es prácticamente una especificación simplificada, es importante transmitir restricciones operativas e imágenes finales de la manera más concreta posible, en lugar de simplemente decir «hazlo bien».
Bueno, al fin y al cabo, cuando se intenta utilizar otro formato, falla, por lo que todavía necesitamos que Claude haga un esfuerzo adicional, pero aún así es rápido, así que está bien.
(El número de personal externo y socios colaboradores con los que trabaja nuestra empresa no llega ni a dos dígitos, ¡así que no es un tema importante!)
Precisamente porque es conveniente, también hay que considerar la seguridad
Por otro lado, cuando se utiliza soporte de desarrollo con IA, es necesario considerar no solo la conveniencia sino también los aspectos de seguridad.
Mientras damos instrucciones a Claude Code y avanzamos en el trabajo, se realizan varias operaciones en el entorno local.
- ~/Desktop へのファイル読み書き
- ~/Library/Services/ へのアクセス検討
- pip install によるPythonライブラリの追加
- osacompile によるAppleScriptアプリの生成
- ~/Library/Fonts/ にあるフォントファイルの読み取りEsta vez no es un tema importante, pero bueno, otorgar permisos de ejecución en el entorno local a una IA definitivamente da miedo 😨
Cuando se delegan operaciones de terminal y operaciones de archivos, existe la posibilidad de que se creen, sobrescriban o eliminen archivos involuntariamente, por lo que
- ¡Confirma el contenido que se permite!
- ¡Haz una copia de seguridad!
- ¡Verifica las diferencias en lo que se puede gestionar con git!
- ¡Separa las carpetas de trabajo!
son medidas fundamentales de este tipo. Si lo usas en tareas de desarrollo, quizá sea mejor leer archivos .env a través de 1password. Es tedioso, pero marca una diferencia importante. (por nuestro CTO)
Por otro lado, cuando se trata de ejecutarse solo en un entorno local como en este caso, el riesgo es relativamente limitado. Es raro que el impacto se propague hacia el exterior a través de la red, y en la mayoría de los casos se limita a "en el peor de los casos, el impacto se contiene en tu propio entorno".
Hay muchas otras consideraciones, pero "poder hacerlo rápido" y "usarlo de forma segura" son cuestiones distintas. Al avanzar en desarrollo con IA, ¡asegúrate de revisar los permisos de ejecución, manipulación de archivos, librerías externas y manejo de datos de entrada!
Próximos pasos: compartir con el equipo e integración con Supabase
Bien, lo que creamos esta vez es una herramienta simple de generación de órdenes de compra que funciona en un entorno local.
En la etapa inicial, usamos purchase_order_counter.json para gestionar números secuenciales por empresa y por mes, pero considerando que en el futuro se compartirá entre el equipo, si solo gestionamos los números secuenciales con un archivo JSON local, naturalmente surgirán problemas como duplicación de números de orden de compra.
Por lo tanto, planeamos tener contadores por empresa y mes en Supabase para que múltiples personas puedan usarlo sin conflictos en los números secuenciales, e implementaremos además historial de emisión de órdenes, proveedores, números de presupuesto, montos de orden, fechas de orden y ubicaciones de almacenamiento de PDF.
CEO que siempre actúa como contraparte. Entiende nuevas tecnologías y siente alegría en los momentos en que algo se vuelve más conveniente; es una persona que adora trabajar en el terreno y se sumerge completamente. Entusiasmado por las tecnologías del futuro, quiere seguir disfrutando de nuevas experiencias sin importar su edad.
Morimoto
Gerente de Proyectos / Director / Fundado en 2007