Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Reverse auction & procurement SaaS for Indian SMEs: sealed quotes, live bidding, AI requirement reading, approvals and automatic purchase orders. Laravel 12, Reverb, Razorpay.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Reverse-auction procurement SaaS for Indian SMEs. Buyers post a requirement, invite suppliers,
collect sealed quotes, then run a live reverse auction where suppliers bid the price down.
Laravel 12 · PHP 8.2+ · MySQL 8 · Blade + Tailwind 4.
Run tests (in-memory SQLite, no MySQL needed):
• getl1.com: coming-soon page in landing/public (static HTML + subscribe.php waitlist).
• staging.getl1.com: this Laravel app, password-protected.
• Setup and deploy steps: deploy/README.md.查看完整 README ↗Reverse-auction procurement SaaS for Indian SMEs. Buyers post a requirement, invite suppliers, collect sealed quotes, then run a live reverse auction where suppliers bid the price down. Laravel 12 · PHP 8.2+ · MySQL 8 · Blade + Tailwind 4.
composer install
cp .env.example .env
php artisan key:generate
# create an empty MySQL database named `getl1` first
php artisan migrate --seed # plans, categories, and (APP_ENV=local) demo data
npm install && npm run build # or `npm run dev` while working on views
php artisan serve
Demo logins (password password):
| Role | |
|---|---|
| [email protected] | Buyer admin, Demo Packaging Pvt Ltd (30-day trial) |
| [email protected] … [email protected] | Suppliers in the buyer's list |
Run tests (in-memory SQLite, no MySQL needed):
php artisan test
landing/public (static HTML + subscribe.php waitlist).deploy/README.md.Multi-tenant by organization_id. App\Support\Tenancy\CurrentOrganization holds the org a
request acts for, and the org middleware sets it. Buyer-side models (Rfq, Auction, Award,
AiJob) use the BelongsToOrganization trait: queries are auto-filtered and organization_id is
auto-filled. Supplier-side reads of a buyer's RFQ must go through the invite and use
withoutGlobalScope('organization').
Roles live on org_user.role (buyer_admin, buyer_user, approver, supplier_user).
Route middleware: org.type:buyer|supplier, org.role:buyer_admin,buyer_user.
Append-only tables. bids and audit_logs throw on update/delete at the model level. In
production also revoke UPDATE/DELETE on those tables from the app's DB user:
REVOKE UPDATE, DELETE ON getl1.bids FROM 'getl1_app'@'localhost';
REVOKE UPDATE, DELETE ON getl1.audit_logs FROM 'getl1_app'@'localhost';
Money is DECIMAL(15,2) INR. Timestamps are UTC; bid times keep microseconds so the
earlier of two equal bids wins.
Audit: write every state change that matters through App\Services\AuditLogger (table audit_logs).
Security log: storage/logs/security-YYYY-MM-DD.log (90 days) via App\Services\SecurityLog:
failed logins, lockouts, 403 / 419 / 429, rejected uploads. Never log passwords or file contents.
Uploads: KYC files go to the private disk (storage/app/private/kyc/{org}), typed by their bytes,
PDFs with active content refused, and only streamed to the owner or a platform admin.
Platform admin (GetL1 staff): server-only, php artisan getl1:admin [email protected] (--revoke to remove).
Live auctions: every bid is checked and written inside one locked database transaction, and it's acknowledged
only after it's committed. Retries carry the same key and are recorded once. The server clock decides start, end
and extensions. Suppliers only ever receive their own rank and price (plus the L1 price if the buyer allows it),
on private channels. php artisan getl1:auction-stress (staging only) checks this under parallel load.
Awards and POs: PO lines are frozen on the award when it's made; PO numbers are sequential per company (PO-2026-0001) and issuing is idempotent (a retried job never makes a second PO or re-sends emails). PDFs are rendered with remote fetching, PHP and JavaScript disabled, and stored on the private disk.
Billing: money is credited only on proof from Razorpay (checkout signature or signed webhook); each
payment is recorded once (unique Razorpay payment id + row lock), so the browser callback and webhook can
both arrive in any order. Secrets live only in .env.
Access rule: records of another company always return 404, never 403, so IDs can't be probed.