SESの社内ERPを生成AIで作ってみよう!〜PRONAVI開発の道のり〜 | 株式会社シスナビ
SESに特化したERPって聞いたことないなぁ。そう思い立って、相当に軽い気持ちで作り始めました。営業部隊とエンジニア部隊でシームレスに情報連携ができるようになったらビジネスも加速するはず!そんな...
https://www.wantedly.com/companies/company_4978634/post_articles/1028870
2ヶ月ほど前でしょうか。私は「ぼくのかんがえたさいきょうのSES」を創るべく、思いつき全振りでERPシステムを作り始めました。今回はようやく次の一歩を踏み出すことができたので、そちらの動向をお届けします。
↓過去記事はこちら↓
前回「ログイン画面が表示されたぞ!」で終わっていたので、今回はその先へ進んでみました。
念のため事前にソースを見てみるとGoogleWorkSpaceのアカウントを使ったGoogle OAuth(Laravel Socialite)で組んでくれています。コードを一部抜粋します。
class AuthController extends Controller
{
public function redirectToGoogle()
{
return Socialite::driver('google')
->with(['hd' => config('app.allowed_domain', 'yourcompany.com')])
->redirect();
}
public function handleGoogleCallback()
{
try {
$googleUser = Socialite::driver('google')->user();
$allowedDomain = config('app.allowed_domain', 'yourcompany.com');
$userDomain = substr(strrchr($googleUser->getEmail(), "@"), 1);
if ($userDomain !== $allowedDomain) {
return redirect('/login')->with('error', '許可されていないドメインです。');
}
$user = User::where('email', $googleUser->getEmail())->first();
if ($user) {
$user->update([
'google_id' => $googleUser->getId(),
'avatar' => $googleUser->getAvatar(),
]);
} else {
$managerEmails = config('app.manager_emails', []);
$role = in_array($googleUser->getEmail(), $managerEmails) ? 'manager' : 'engineer';
$user = User::create([
'name' => $googleUser->getName(),
'email' => $googleUser->getEmail(),
'google_id' => $googleUser->getId(),
'avatar' => $googleUser->getAvatar(),
'role' => $role,
]);
}
Auth::login($user);
return redirect()->intended('/dashboard');
さてGoogleアカウントでログインをクリックしてみますと見慣れたログイン画面が登場。社内のGoogleWorkSpaceアカウント情報を入力していきます。
が..... 駄目っ.....!(すいませんキャプチャ残してなかったですが単にログインに失敗しましたって表示されただけの画面です。
ログを見てみましょ。(大事なとこはマスクしてます)
[2026-02-03 08:23:20] local.ERROR: Google OAuth Error: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'avatar' at row 1 (Connection: mysql, SQL: insert into `users` (`name`, `email`, `google_id`, `avatar`, `role`, `updated_at`, `created_at`) values (hogedahogeo, hoge.hogeo@sysnavi.co.jp, 数字の羅列, https://lh3.googleusercontent.com/a-/1000文字くらいのめっちゃ長い文字列, manager, 2026-02-03 08:23:19, 2026-02-03 08:23:19)) ふむ、avatarっちゅうカラムに対して長すぎるデータをinsertしようとしていると。
ここで初めてDB構造を確認してみると確かに、varcharの256になっていたのでtext型に変えてみたら無事ログイン成功!
何かそれっぽい画面になってるー!!!
ログイントリガーでアカウントを作成してくれるのはありがたし。
管理者がわざわざ事前登録しなくていいし、前述したコードにてGWS内のroleに応じてmanagerかengineerに振り分けるようになっていました。気が利く。
さぁて早速Devinさんにお礼を言わなくちゃ
要件を満たしてくれているか一応確認。
なるべくソースに手を入れないという方針と同じく、ソースを見ずにどこまでいけるかのチャレンジです。
ふむ、必要な機能は搭載されていそうだな....。
ここからテストユーザーを追加するためのmigration作業だの開発用ログインパスを追加依頼したりしたんですが、seederで躓いたりして飽きてきたので割愛。
※いや、だってこういうデバッグは今までやってきたので、そこに時間使っちゃうと趣旨から外れるというか。
解決策はひとつではないっ!
その後も極力手を動かさない姿勢を固辞。私は実装した機能の挙動確認のみやってます。AIだから頼みやすい。
そうして出来上がったたたき台 第2弾!
ダッシュボード再掲。それっぽい画面です。
まずプロジェクトを作ってみよう。ヘッダの「プロジェクト」をポチ。
最初のプロジェクトを作成する。
そうであろう場所にはrequiredのバリデーションをしれっと入れてくれているのがニクイ。(プロジェクト名とステータス)
好(よし)!成功。
次はプロジェクトに人をアサインしよう。
追加がドロップダウンリストにしてくれているのは気が利いてる。
よし次は報告をしてみよう!ヘッダの「報告一覧」をポチ。最初の報告を作成する。
報告作成画面へ移動し、ポチポチ入力していきます。
いいじゃないか(予想以上に)。
適度に選択肢を設けてくれていました。報告を提出してみます。
提出完了ッ!アラートが出ています。
どういうロジックでアラートが出るか、(進捗大幅遅れと業務負荷が非常に高いのが明らかですが)これはさすがにコードを見なきゃか...?いや、後日Devinに訊こう。
さぁダッシュボードに行ってみましょう。
報告は上がっていることが確認できて、アラートであることが視認できる。
しかしこのダッシュボードから当該報告詳細は閲覧できず。クリックしても遷移せずでした。自分で自分の報告を見ようとしているからか?権限の問題かな。
報告一覧からなら詳細に遷移できました。
マネージャーとしてのフィードバックもできます。
むぅ、ほぼ手を加えずにこのレベルは素晴らしい!
ということで、PRONAVI開発第2弾。ローカルではまぁまぁ動くところまでが確認できました。
次はインターネッツ上にデプロイして、シスナビのメンバーに使ってみてもらいましょう。Geminiにおススメデプロイ先を訊いたらGWSとの親和性って観点で「Google Cloud Run」をお勧めしてくれたし、ちょうどlaradockで構成されているので導入もスムーズかも。
PRONAVI開発の道は続く....!次回をご期待ください。