En el día a día de la oficina, cada vez es más habitual que, cuando aparece una tarea que "resulta un poco pesada de hacer a mano", la respuesta sea: ¡montemos un pequeño sistema con Claude Code!
Esta vez es un caso muy típico de ese patrón, y el detonante fue un aumento del capital social de la empresa.
Nuestro ejercicio fiscal comienza en febrero, y la ampliación de capital también se realizó en febrero. Al aumentar el capital, hemos visto que necesitamos organizar de forma más rigurosa los procesos de emisión de pedidos a socios externos y empresas colaboradoras.
Se trata del ámbito de la antigua "Ley de Subcontratación" (shitauke-hō), que desde enero de 2026 pasó a denominarse "Ley de Transacciones Justas" (torekihō). Hay más obligaciones para la parte que emite el pedido, como especificar por escrito el contenido del encargo, preparar y conservar los documentos de la operación y establecer los plazos de pago.
Por supuesto, esto no es solo algo que hacemos porque "la ley lo exige"!
Cuando encargamos trabajo a socios externos, es fundamental que tanto la parte que emite el pedido como la que lo recibe tengan claros el contenido del encargo, el importe, las fechas y la correspondencia con el presupuesto. (キリ)
Tampoco era una función que viniera incluida en las herramientas de contabilidad.
En Liberogic utilizamos herramientas de MoneyForward (en adelante, "MF") para la contabilidad, las cotizaciones y la facturación.
Son muy útiles para el trabajo diario de contabilidad y facturación, pero lo que queríamos hacer esta vez era algo un poco distinto.
Crear un PDF de orden de compra de Liberogic a partir del PDF de presupuesto recibido de un socio externo
Al menos en lo que nosotros utilizamos, MF no tiene una función que encaje bien, y contratar un servicio solo para eso sería un desperdicio, ¿verdad?
Si lo hiciéramos manualmente,
- Crear el formato de la orden de compra
- Transcribir manualmente al formato de la orden de compra mientras se consulta el presupuesto
- Registrar la fecha de la orden de compra
- Transcribir el número del presupuesto
- Transcribir las partidas
- Revisar el contenido, como el importe total
- Organizar los nombres de archivo
- Otros, otros...
Es un fastidio que aumenten estas tareas... así que decidimos crear una solución.
Puesta en uso práctico en menos de una hora con Claude Code
El momento también fue acertado.
Coincidieron el inicio del ejercicio fiscal en febrero, la ampliación de capital de febrero y el lanzamiento de Claude Code, así como su adopción por parte de nuestro equipo.
Por aquel entonces, dentro de la empresa empezaba a surgir un ambiente similar a un hackatón: usando Claude Code y otras herramientas, se impulsaba la creación de herramientas internas para mejorar el trabajo, pequeñas aplicaciones internas e incluso despliegues de ideas propias.
Desde una organización muy sencilla de las especificaciones, pasando por las instrucciones a Claude Code, hasta los ajustes detallados...
Logramos llevarlo hasta un punto de uso práctico en poco menos de una hora.
Claro que no basta con delegarlo todo en la IA para que quede terminado, pero si se traduce bien en prompts, resulta rápido y muy útil.
Finalización de la aplicación de escritorio
Es una herramienta sencilla para generar órdenes de compra que funciona en el sistema operativo que probablemente usted también utiliza.
Al arrastrar y soltar un PDF de presupuesto sobre la aplicación .app dedicada, 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.
Una vez completado, muestra una notificación de macOS y abre automáticamente el PDF de orden de compra generado. Es una solución sencilla en ese sentido.
La estructura es la siguiente.
~/Desktop/発注書生成/
見積書をドロップ→発注書生成.app
_lib/
generate_purchase_order.py
liberogic_logo.png
liberogic_seal.png
purchase_order_counter.jsonComo queríamos que el personal de contabilidad y administración pudiera usarla sin abrir la terminal, utilizamos un droplet de AppleScript como punto de entrada, mientras que el procesamiento real de generación de PDF se realiza en Python.
En resumen, es una aplicación de escritorio en la que basta con arrastrar y soltar un PDF de presupuesto para obtener un PDF de orden de compra. Como se puede usar sin abrir la terminal, la hemos diseñado para que sea fácil de manejar en las tareas administrativas internas.
El diseño del PDF de orden de compra se ajusta al formato de las facturas y presupuestos en PDF de Manero Facturas que usamos en nuestra empresa.
En el campo de observaciones, incluimos un texto como el siguiente.
Con el presente documento, esta orden de compra se considera formalmente emitida. Se emite en base al presupuesto número XXX.
El número de orden de compra sigue el siguiente formato.
Orden de compra {abreviatura de la empresa} para {YYYY}{MM}{número secuencial de 3 dígitos}
Por ejemplo, si es la primera orden de compra de febrero de 2026 para el cliente Sr./Sra. OO,
OO Orden de compra 202602001
quedaría así.
El contador secuencial por empresa y por mes se gestiona en purchase_order_counter.json, y la fecha de la orden de compra se calcula automáticamente como 5 días laborables después de la fecha del presupuesto. (Esta es solo una especificación provisional, ¡que después cambiaremos según lo que decida la dirección!)
Para excluir no solo los sábados y domingos, sino también los festivos de Japón, utilicé jpholiday de Python.
Una parte algo complicada
Los presupuestos en los que se basan las órdenes de compra provienen de socios externos y empresas colaboradoras, por lo que el formato varía según la empresa.
No basta con asumir de forma fija que "el nombre de la empresa está en esta coordenada" o que "el importe total está en esta posición".
Al final, utilicé expresiones regulares para extraer de la forma más flexible posible el nombre del proveedor, la dirección, el teléfono, el número de presupuesto, la fecha, el asunto, las partidas, el subtotal, el IVA, el total, etc. Así, la empresa con "Sr./Sra." se trata como nuestra empresa y las demás como proveedores. También ocurre que, al extraer texto de un PDF, la información que visualmente está separada se une en el texto.
También hubo casos en los que el nombre del edificio o el número de planta se colaban detrás del asunto, así que añadí un proceso que corta la información de dirección innecesaria usando indicadores como "ビル" o "階".
Da igual que sea IA o lo que sea: estos problemas típicos del procesamiento de PDF siguen estando ahí.
Prompt enviado a Claude Code
En lugar de pedir algo a grandes rasgos, suele resultar más económico en consumo de tokens describir con el mayor detalle posible la estructura de carpetas, el flujo de procesamiento, el diseño, las reglas de numeración, el cálculo de días hábiles, los campos de extracción de PDF, etc.
¡Y también conviene que lea el PDF de muestra!
以下の条件で、見積書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 sea prácticamente una especificación simplificada, lo importante es transmitir con el mayor detalle posible las restricciones del negocio y la imagen final deseada, en lugar de decir simplemente "hazlo bien".
Al final, si le pasas un formato distinto, a veces falla, así que todavía hay que pedirle a Claude que se esfuerce más, pero aun así me parece bien porque es rápido.
(Los colaboradores externos y socios que colaboran con nosotros no llegan ni a dos dígitos, así que no es gran cosa.)
Por ser cómodo, también hay que cuidar la seguridad
Por otro lado, al usar herramientas de asistencia para el desarrollo con IA, es necesario tener en cuenta la seguridad, no solo la comodidad.
Mientras se trabaja dando instrucciones a Claude Code, se realizan varias operaciones en el entorno local.
- ~/Desktop へのファイル読み書き
- ~/Library/Services/ へのアクセス検討
- pip install によるPythonライブラリの追加
- osacompile によるAppleScriptアプリの生成
- ~/Library/Fonts/ にあるフォントファイルの読み取りEsto no es un tema especialmente importante, pero dar a una IA permisos de ejecución en el entorno local da bastante miedo, ¿verdad? 😨
Al encargar operaciones de terminal o de archivos, puede producirse la creación, sobrescritura o eliminación de archivos no deseados, por lo que
- ¡Revisa qué permisos se conceden!
- ¡Haz una copia de seguridad!
- ¡Revisa las diferencias en lo que esté gestionado con git!
- ¡Separa las carpetas de trabajo!
Medidas básicas como estas son importantes. Si utilizas esto para el trabajo de desarrollo, quizá convenga cargar el archivo .env a través de 1Password. Es un poco engorroso, pero marca una gran diferencia. (por nuestro CTO)
Por otro lado, en un caso como este, en el que solo se ejecuta en un entorno local, el riesgo es relativamente limitado. Rara vez se propaga un impacto externo a través de la red, y en la mayoría de los casos se queda dentro del "peor escenario posible: afectar solo a tu propio entorno".
Hay muchos otros puntos a tener en cuenta, pero "poder crearlo rápido" y "poder usarlo de forma segura" son dos cuestiones distintas. Al desarrollar con IA, revisa los permisos de ejecución, las operaciones sobre archivos, las bibliotecas externas y el manejo de los datos de entrada mientras avanzas.
Próximamente: uso compartido con el equipo e integración con Supabase
Bien, lo que creamos esta vez es una herramienta sencilla para generar órdenes de compra que funciona en un entorno local.
En una primera etapa, usamos purchase_order_counter.json para gestionar la numeración secuencial por empresa y por mes. Sin embargo, si pensamos en compartirla con el equipo, gestionar la numeración solo con un archivo JSON local provocará, como es lógico, que surjan números de orden duplicados y otros problemas.
Por eso, pensamos en mantener contadores por empresa y por mes en Supabase, de modo que varias personas puedan usarla sin repetir números. Además, implementaremos el historial de emisión de órdenes, los proveedores, los números de presupuesto, los importes de compra, las fechas de pedido y la ubicación de guardado de los PDF.
Aunque soy el director general, siempre trabajo como contraparte. Disfruto entender nuevas tecnologías y sentir alegría cuando algo se vuelve más práctico, y me sumerjo en el trabajo de campo con total entusiasmo. Me emociona el futuro de la tecnología y disfruto vivir nuevas experiencias sin importar la edad.
Tadanori Morimoto
Gerente de proyectos / Director creativo / Fundada en 2007