{"id":20964708,"url":"https://github.com/benjdiasaad/erp","last_synced_at":"2026-07-13T16:31:43.526Z","repository":{"id":345055340,"uuid":"1183313714","full_name":"benjdiasaad/ERP","owner":"benjdiasaad","description":"Multi-company ERP system built with Laravel 12, PostgreSQL, Tailwind CSS \u0026 Sanctum — featuring Sales, Purchasing, Inventory, Finance, HR, CRM, Projects, Events \u0026 Caution modules with granular RBAC permissions and full tenant isolation","archived":false,"fork":false,"pushed_at":"2026-03-17T15:53:46.000Z","size":307,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-18T02:54:03.243Z","etag":null,"topics":["erp","erp-application","kiro","laravel","multi-tenancy","pgsql","postgresql","tailwindcss","tdd"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/benjdiasaad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-16T13:39:15.000Z","updated_at":"2026-03-17T15:53:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/benjdiasaad/ERP","commit_stats":null,"previous_names":["benjdiasaad/erp"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/benjdiasaad/ERP","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benjdiasaad%2FERP","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benjdiasaad%2FERP/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benjdiasaad%2FERP/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benjdiasaad%2FERP/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/benjdiasaad","download_url":"https://codeload.github.com/benjdiasaad/ERP/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benjdiasaad%2FERP/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35429402,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-13T02:00:06.543Z","response_time":119,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["erp","erp-application","kiro","laravel","multi-tenancy","pgsql","postgresql","tailwindcss","tdd"],"created_at":"2024-11-19T02:57:25.020Z","updated_at":"2026-07-13T16:31:43.521Z","avatar_url":"https://github.com/benjdiasaad.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ERP\n\nMulti-company ERP system built with Laravel 12, PostgreSQL, Tailwind CSS \u0026 Sanctum — featuring Sales, Purchasing, Inventory, Finance, HR, CRM, Projects, Events \u0026 Caution modules with granular RBAC permissions and full tenant isolation\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Backend | Laravel 12 (PHP 8.2+) |\n| Database | PostgreSQL |\n| Auth | Laravel Sanctum |\n| Frontend | Blade + Tailwind CSS |\n| Testing | PHPUnit (TDD) |\n| Multi-tenancy | Single DB + `company_id` |\n\n---\n\n## Architecture\n\n```\napp/\n├── Models/{Domain}/           # Eloquent models\n├── Http/\n│   ├── Controllers/{Domain}/  # Thin controllers → delegates to services\n│   ├── Requests/{Domain}/     # FormRequest validation\n│   ├── Resources/{Domain}/    # API Resources\n│   └── Middleware/             # Auth, company, permission\n├── Services/{Domain}/         # Business logic\n├── Policies/{Domain}/         # Authorization\n└── Traits/                    # BelongsToCompany, HasAuditTrail, etc.\n```\n\n**Domains:** Auth, Company, Personnel, Sales, Purchasing, Inventory, Finance, Caution, Event, CRM, Project, Settings\n\n---\n\n## Modules\n\n### Core\n| Module | Description |\n|--------|-------------|\n| Multi-Company | Users belong to N companies, each with isolated data |\n| Users \u0026 Auth | Sanctum tokens, password policy, rate limiting, lockout |\n| Roles \u0026 Permissions | 3-table RBAC — ~480+ permissions, company-scoped roles |\n\n### Sales (Ventes)\n| Module | Description |\n|--------|-------------|\n| Customers | Credit limits, payment terms |\n| Quotes (Devis) | Draft → Sent → Accepted → Converted to Order |\n| Sales Orders (BC) | Delivery \u0026 invoice generation |\n| Invoices (Factures) | Partial payments, overdue tracking, PDF |\n| Credit Notes (Avoirs) | Linked to invoices |\n| Delivery Notes (BL) | Shipping \u0026 tracking |\n\n### Purchasing (Achats)\n| Module | Description |\n|--------|-------------|\n| Suppliers | Bank info, balance tracking |\n| Purchase Requests (DA) | Approval workflow |\n| Purchase Orders (BCA) | Tracks received/invoiced qty |\n| Reception Notes (BR) | Triggers stock movements |\n| Purchase Invoices (FAF) | Payment recording |\n\n### Inventory (Stock)\n| Module | Description |\n|--------|-------------|\n| Products | Categories, pricing, barcodes |\n| Warehouses | Multiple per company |\n| Stock Movements | In/Out/Transfer/Adjustment |\n| Physical Inventory | Count → automatic adjustments |\n\n### Finance\n| Module | Description |\n|--------|-------------|\n| Chart of Accounts | Hierarchical (asset/liability/equity/revenue/expense) |\n| Journal Entries | Double-entry, debit=credit validation |\n| Payments | Auto journal entry + bank balance update |\n| Taxes | TVA 20%, 14%, 10%, 7%, Exempt |\n| Currencies | MAD, EUR, USD, GBP |\n\n### Caution (Dépôts/Garanties)\n| Module | Description |\n|--------|-------------|\n| Caution Management | Given/received, full lifecycle |\n| Tracking | Partial return, extension, forfeiture |\n| Alerts | Expiring caution notifications |\n\n### HR (Personnel)\n| Module | Description |\n|--------|-------------|\n| Personnel | Linked to users via matricule |\n| Departments | Hierarchical with managers |\n| Contracts | CDI, CDD, Stage, Freelance, Interim |\n| Leaves | Request/approval + balance tracking |\n| Attendance | Check-in/out, overtime |\n\n### Events\n| Module | Description |\n|--------|-------------|\n| Events | Meetings, trainings, workshops |\n| Participants | Internal/external RSVP |\n| Calendar | Recurring events, date queries |\n\n### CRM\n| Module | Description |\n|--------|-------------|\n| Contacts | Linked to customers/suppliers |\n| Leads | Qualification pipeline |\n| Opportunities | Stage tracking + forecasting |\n| Activities | Calls, emails, meetings, tasks |\n\n### Project Management\n| Module | Description |\n|--------|-------------|\n| Projects | Budget, progress, customer link |\n| Tasks | Hierarchical + assignment |\n| Timesheets | Billable hours, approval flow |\n\n---\n\n## RBAC\n\n```\nusers ←→ roles (M2M via role_user + company_id)\nroles ←→ permissions (M2M via permission_role)\n```\n\nUsers can have different roles per company. Permissions pattern: `{module}.{action}`\n\n```php\n// Code\n$user-\u003ehasPermission('invoices.create');\n\n// Blade\n@if(auth()-\u003euser()-\u003ehasPermission('invoices.delete'))\n    \u003cbutton\u003eSupprimer\u003c/button\u003e\n@endif\n\n// Route middleware\nRoute::middleware('permission:invoices.create')-\u003epost('/invoices', ...);\n```\n\n**5 default roles:** Super Admin, Admin, Manager, User, Viewer\n\n---\n\n## Multi-Tenancy\n\n`BelongsToCompany` trait on all tenant models:\n- Auto-sets `company_id` on creation\n- Global scope filters by current company\n- Zero cross-company data leakage\n\n---\n\n## Reference Numbers\n\n| Document | Format |\n|----------|--------|\n| Quote | DEV-2026-00001 |\n| Sales Order | BC-2026-00001 |\n| Invoice | FAC-2026-00001 |\n| Credit Note | AV-2026-00001 |\n| Delivery Note | BL-2026-00001 |\n| Purchase Request | DA-2026-00001 |\n| Purchase Order | BCA-2026-00001 |\n| Reception Note | BR-2026-00001 |\n| Purchase Invoice | FAF-2026-00001 |\n| Payment | PAY-2026-00001 |\n| Caution | CAU-2026-00001 |\n| Journal Entry | JE-2026-00001 |\n| Personnel | EMP-2026-00001 |\n\n---\n\n## Installation\n\n```bash\ngit clone https://github.com/benjdiasaad/ERP.git\ncd ERP\n\ncomposer install\nnpm install\n\ncp .env.example .env\nphp artisan key:generate\n\n# Configure PostgreSQL in .env then:\nphp artisan migrate --seed\nnpm run build\nphp artisan serve\n```\n\n---\n\n## Testing\n\n```bash\nphp artisan test                          # All tests\nphp artisan test --filter=InvoiceTest     # Specific module\nphp artisan test --coverage               # With coverage\n```\n\n---\n\n## Security\n\n- Sanctum tokens (24h expiry)\n- Password policy (8+ chars, mixed case, number, symbol)\n- Account lockout (5 failed → 15 min lock)\n- Rate limiting (login 5/min, API 60/min)\n- CSRF + XSS protection\n- Encrypted sensitive fields\n- Full audit trail\n- Tenant isolation on every query\n\n---\n\n## License\n\nProprietary — All rights reserved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenjdiasaad%2Ferp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenjdiasaad%2Ferp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenjdiasaad%2Ferp/lists"}