From b7f2455bbb0f6d20b09f498fc64b1191f3909a63 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 18:53:13 +0000 Subject: [PATCH 01/10] Add ALSHUYUKH ACCOUNTING Phase 1: tenancy, auth, RBAC Foundation for a Saudi multi-tenant accounting SaaS, built in a separate alshuyukh-accounting/ folder so the existing docs site is untouched. - PostgreSQL schema with migrations: tenants, settings, users, memberships, sessions, roles, permissions, companies, branches, warehouses, append-only audit log - Tenant isolation in three layers: app-level tenant filters, Row-Level Security under a non-privileged DB role, and composite (id, tenant_id) foreign keys - Auth: argon2id, short-lived JWT, rotating refresh token in an HttpOnly cookie with reuse detection, account lockout, CSRF header - RBAC catalog with 45 permissions and 9 system roles, custom roles, and privilege-escalation checks - Arabic RTL React frontend for the Phase 1 screens - 54 integration tests against a real database Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RiHbDZ5HpzN6NRCMJmydEq --- alshuyukh-accounting/.env.example | 19 + alshuyukh-accounting/.gitignore | 5 + alshuyukh-accounting/README.md | 257 ++ alshuyukh-accounting/apps/api/package.json | 33 + alshuyukh-accounting/apps/api/src/app.ts | 87 + .../apps/api/src/config/env.ts | 29 + .../apps/api/src/db/migrate-cli.ts | 14 + .../apps/api/src/db/migrate.ts | 104 + .../api/src/db/migrations/0001_foundation.sql | 36 + .../db/migrations/0002_identity_tenancy.sql | 86 + .../apps/api/src/db/migrations/0003_rbac.sql | 77 + .../api/src/db/migrations/0004_companies.sql | 89 + .../apps/api/src/db/migrations/0005_audit.sql | 25 + .../src/db/migrations/0006_rls_and_grants.sql | 92 + alshuyukh-accounting/apps/api/src/db/pool.ts | 16 + alshuyukh-accounting/apps/api/src/db/tx.ts | 39 + .../apps/api/src/lib/errors.ts | 20 + .../apps/api/src/lib/password.ts | 19 + .../apps/api/src/lib/tokens.ts | 48 + .../apps/api/src/lib/validation.ts | 33 + .../api/src/modules/audit/audit.routes.ts | 55 + .../api/src/modules/audit/audit.service.ts | 56 + .../apps/api/src/modules/auth/auth.routes.ts | 131 + .../apps/api/src/modules/auth/auth.service.ts | 306 ++ .../src/modules/companies/companies.routes.ts | 251 ++ .../apps/api/src/modules/rbac/catalog.ts | 162 + .../apps/api/src/modules/rbac/rbac.routes.ts | 171 + .../src/modules/settings/settings.routes.ts | 44 + .../api/src/modules/users/users.routes.ts | 149 + .../apps/api/src/plugins/auth.ts | 91 + alshuyukh-accounting/apps/api/src/server.ts | 17 + alshuyukh-accounting/apps/api/src/types.ts | 33 + .../apps/api/test/audit.test.ts | 75 + .../apps/api/test/auth.test.ts | 147 + .../apps/api/test/companies.test.ts | 85 + alshuyukh-accounting/apps/api/test/env.ts | 13 + .../apps/api/test/global-setup.ts | 14 + alshuyukh-accounting/apps/api/test/helpers.ts | 80 + .../apps/api/test/rbac.test.ts | 135 + .../apps/api/test/tenant-isolation.test.ts | 121 + .../apps/api/tsconfig.build.json | 5 + alshuyukh-accounting/apps/api/tsconfig.json | 16 + .../apps/api/vitest.config.ts | 11 + alshuyukh-accounting/apps/web/index.html | 14 + alshuyukh-accounting/apps/web/package.json | 24 + alshuyukh-accounting/apps/web/src/App.tsx | 49 + alshuyukh-accounting/apps/web/src/Shell.tsx | 69 + alshuyukh-accounting/apps/web/src/api.ts | 69 + alshuyukh-accounting/apps/web/src/auth.tsx | 70 + alshuyukh-accounting/apps/web/src/main.tsx | 16 + .../apps/web/src/pages/AuditLog.tsx | 67 + .../apps/web/src/pages/ComingSoon.tsx | 13 + .../apps/web/src/pages/Companies.tsx | 133 + .../apps/web/src/pages/Home.tsx | 46 + .../apps/web/src/pages/Login.tsx | 38 + .../apps/web/src/pages/Register.tsx | 49 + .../apps/web/src/pages/Roles.tsx | 88 + .../apps/web/src/pages/Settings.tsx | 96 + .../apps/web/src/pages/Users.tsx | 101 + alshuyukh-accounting/apps/web/src/styles.css | 169 + alshuyukh-accounting/apps/web/src/ui.tsx | 40 + alshuyukh-accounting/apps/web/tsconfig.json | 15 + alshuyukh-accounting/apps/web/vite.config.ts | 10 + alshuyukh-accounting/docker-compose.yml | 13 + .../docs/screenshots/03-home.png | Bin 0 -> 61640 bytes .../docs/screenshots/04-companies.png | Bin 0 -> 82985 bytes .../docs/screenshots/05-users.png | Bin 0 -> 75017 bytes .../docs/screenshots/06-audit.png | Bin 0 -> 70366 bytes .../docs/screenshots/07-mobile-nav.png | Bin 0 -> 31643 bytes alshuyukh-accounting/package-lock.json | 2909 +++++++++++++++++ alshuyukh-accounting/package.json | 16 + alshuyukh-accounting/scripts/db-setup.sql | 28 + 72 files changed, 7438 insertions(+) create mode 100644 alshuyukh-accounting/.env.example create mode 100644 alshuyukh-accounting/.gitignore create mode 100644 alshuyukh-accounting/README.md create mode 100644 alshuyukh-accounting/apps/api/package.json create mode 100644 alshuyukh-accounting/apps/api/src/app.ts create mode 100644 alshuyukh-accounting/apps/api/src/config/env.ts create mode 100644 alshuyukh-accounting/apps/api/src/db/migrate-cli.ts create mode 100644 alshuyukh-accounting/apps/api/src/db/migrate.ts create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0001_foundation.sql create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0002_identity_tenancy.sql create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0003_rbac.sql create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0004_companies.sql create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0005_audit.sql create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0006_rls_and_grants.sql create mode 100644 alshuyukh-accounting/apps/api/src/db/pool.ts create mode 100644 alshuyukh-accounting/apps/api/src/db/tx.ts create mode 100644 alshuyukh-accounting/apps/api/src/lib/errors.ts create mode 100644 alshuyukh-accounting/apps/api/src/lib/password.ts create mode 100644 alshuyukh-accounting/apps/api/src/lib/tokens.ts create mode 100644 alshuyukh-accounting/apps/api/src/lib/validation.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/audit/audit.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/auth/auth.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/rbac/rbac.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/users/users.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/plugins/auth.ts create mode 100644 alshuyukh-accounting/apps/api/src/server.ts create mode 100644 alshuyukh-accounting/apps/api/src/types.ts create mode 100644 alshuyukh-accounting/apps/api/test/audit.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/auth.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/companies.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/env.ts create mode 100644 alshuyukh-accounting/apps/api/test/global-setup.ts create mode 100644 alshuyukh-accounting/apps/api/test/helpers.ts create mode 100644 alshuyukh-accounting/apps/api/test/rbac.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/tenant-isolation.test.ts create mode 100644 alshuyukh-accounting/apps/api/tsconfig.build.json create mode 100644 alshuyukh-accounting/apps/api/tsconfig.json create mode 100644 alshuyukh-accounting/apps/api/vitest.config.ts create mode 100644 alshuyukh-accounting/apps/web/index.html create mode 100644 alshuyukh-accounting/apps/web/package.json create mode 100644 alshuyukh-accounting/apps/web/src/App.tsx create mode 100644 alshuyukh-accounting/apps/web/src/Shell.tsx create mode 100644 alshuyukh-accounting/apps/web/src/api.ts create mode 100644 alshuyukh-accounting/apps/web/src/auth.tsx create mode 100644 alshuyukh-accounting/apps/web/src/main.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/AuditLog.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/ComingSoon.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Companies.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Home.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Login.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Register.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Roles.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Settings.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/Users.tsx create mode 100644 alshuyukh-accounting/apps/web/src/styles.css create mode 100644 alshuyukh-accounting/apps/web/src/ui.tsx create mode 100644 alshuyukh-accounting/apps/web/tsconfig.json create mode 100644 alshuyukh-accounting/apps/web/vite.config.ts create mode 100644 alshuyukh-accounting/docker-compose.yml create mode 100644 alshuyukh-accounting/docs/screenshots/03-home.png create mode 100644 alshuyukh-accounting/docs/screenshots/04-companies.png create mode 100644 alshuyukh-accounting/docs/screenshots/05-users.png create mode 100644 alshuyukh-accounting/docs/screenshots/06-audit.png create mode 100644 alshuyukh-accounting/docs/screenshots/07-mobile-nav.png create mode 100644 alshuyukh-accounting/package-lock.json create mode 100644 alshuyukh-accounting/package.json create mode 100644 alshuyukh-accounting/scripts/db-setup.sql diff --git a/alshuyukh-accounting/.env.example b/alshuyukh-accounting/.env.example new file mode 100644 index 000000000000..23e61d8b0e14 --- /dev/null +++ b/alshuyukh-accounting/.env.example @@ -0,0 +1,19 @@ +# Runtime connection — uses the restricted application role (RLS enforced) +DATABASE_URL=postgres://alshuyukh_app:app_dev_password@localhost:5432/alshuyukh +# Migration connection — uses the schema owner role +DATABASE_URL_MIGRATE=postgres://alshuyukh_owner:owner_dev_password@localhost:5432/alshuyukh + +# Tests use a separate database (created by scripts/db-setup.sql) +TEST_DATABASE_URL=postgres://alshuyukh_app:app_dev_password@localhost:5432/alshuyukh_test +TEST_DATABASE_URL_MIGRATE=postgres://alshuyukh_owner:owner_dev_password@localhost:5432/alshuyukh_test + +# At least 32 random characters. Generate with: openssl rand -base64 48 +JWT_SECRET=change-me-to-a-long-random-secret-at-least-32-chars +ACCESS_TOKEN_TTL_SECONDS=900 +REFRESH_TOKEN_TTL_DAYS=30 + +PORT=3000 +HOST=0.0.0.0 +NODE_ENV=development +# Comma-separated list of allowed browser origins +CORS_ORIGINS=http://localhost:5173 diff --git a/alshuyukh-accounting/.gitignore b/alshuyukh-accounting/.gitignore new file mode 100644 index 000000000000..1841c967ab3c --- /dev/null +++ b/alshuyukh-accounting/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +.env +*.log +coverage/ diff --git a/alshuyukh-accounting/README.md b/alshuyukh-accounting/README.md new file mode 100644 index 000000000000..1d5e9902de03 --- /dev/null +++ b/alshuyukh-accounting/README.md @@ -0,0 +1,257 @@ +# ALSHUYUKH ACCOUNTING — الشيوخ للمحاسبة + +نظام محاسبي سحابي متعدد المنشآت (Multi-Tenant SaaS) للسوق السعودي. + +**الحالة:** المرحلة 1 مكتملة (تأسيس المشروع، قاعدة البيانات، المصادقة، تعدد المنشآت، الصلاحيات). +الوحدات المحاسبية لم تُبنَ بعد، وتظهر في الواجهة بعلامة «قريبًا» دون أي بيانات تجريبية. + +## التقنيات المستخدمة + +| الطبقة | التقنية | سبب الاختيار | +|---|---|---| +| Backend/API | Node.js 22 + TypeScript + Fastify 5 | أداء عالٍ، أنواع صارمة، Plugins معيارية | +| قاعدة البيانات | PostgreSQL 16 | معاملات ACID، `NUMERIC` للمبالغ، Row-Level Security | +| الوصول للبيانات | `pg` مع SQL صريح ومعاملات (parameterized) | تحكم كامل في المعاملات والأقفال لمحرك المحاسبة | +| التحقق من المدخلات | Zod 4 | تحقق على كل endpoint | +| المصادقة | JWT (HS256، 15 دقيقة) + Refresh Token دوّار في Cookie | جلسات قابلة للإلغاء فورًا | +| كلمات المرور | argon2id (معايير OWASP) | | +| Frontend | React 19 + Vite + React Router، RTL أولًا | | +| الاختبارات | Vitest على قاعدة PostgreSQL حقيقية | | + +## هيكل المشروع + +```text +alshuyukh-accounting/ +├── apps/ +│ ├── api/ +│ │ ├── src/ +│ │ │ ├── app.ts # تجميع التطبيق: الأمان، الأخطاء، المسارات +│ │ │ ├── server.ts # نقطة التشغيل +│ │ │ ├── config/env.ts # التحقق من متغيرات البيئة +│ │ │ ├── db/ +│ │ │ │ ├── migrations/*.sql # مخطط قاعدة البيانات +│ │ │ │ ├── migrate.ts # مشغّل الترحيلات + مزامنة الصلاحيات +│ │ │ │ ├── pool.ts # اتصال UTC، NUMERIC كنص +│ │ │ │ └── tx.ts # withTx: معاملة + سياق المنشأة +│ │ │ ├── lib/ # الأخطاء، التحقق، كلمات المرور، الرموز +│ │ │ ├── plugins/auth.ts # المصادقة وحارس الصلاحيات +│ │ │ └── modules/ +│ │ │ ├── auth/ # التسجيل، الدخول، التجديد، الخروج، التبديل +│ │ │ ├── users/ # أعضاء المنشأة +│ │ │ ├── rbac/ # catalog.ts (مصدر الصلاحيات) + الأدوار +│ │ │ ├── companies/ # الشركات، الفروع، المستودعات +│ │ │ ├── settings/ # إعدادات المنشأة +│ │ │ └── audit/ # سجل التدقيق +│ │ └── test/ # اختبارات تكامل +│ └── web/ # واجهة React عربية +├── scripts/db-setup.sql # إنشاء الأدوار وقواعد البيانات +├── docker-compose.yml # PostgreSQL للتطوير +└── .env.example +``` + +## التشغيل محليًا + +المتطلبات: Node.js 22 أو أحدث، وPostgreSQL 16 (محليًا أو عبر Docker). + +```sh +cd alshuyukh-accounting + +# 1. قاعدة البيانات +docker compose up -d # أو: psql -U postgres -f scripts/db-setup.sql + +# 2. الإعدادات +cp .env.example .env +# غيّر JWT_SECRET إلى قيمة عشوائية: openssl rand -base64 48 + +# 3. الحزم والترحيلات +npm install +npm run db:migrate + +# 4. التشغيل (نافذتان) +npm run dev:api # http://localhost:3000 +npm run dev:web # http://localhost:5173 + +# 5. الاختبارات (تعيد بناء قاعدة alshuyukh_test في كل تشغيل) +npm test +``` + +افتح `http://localhost:5173` واختر «أنشئ منشأة جديدة». + +## مخطط قاعدة البيانات (ERD) + +```mermaid +erDiagram + tenants ||--|| tenant_settings : has + tenants ||--o{ user_tenants : has + users ||--o{ user_tenants : "member of" + users ||--o{ user_sessions : has + tenants ||--o{ user_sessions : "active in" + user_tenants ||--o{ user_roles : "(tenant_id, user_id)" + roles ||--o{ user_roles : assigned + roles ||--o{ role_permissions : grants + permissions ||--o{ role_permissions : in + tenants ||--o{ roles : "custom roles" + tenants ||--o{ companies : owns + companies ||--o{ branches : "(company_id, tenant_id)" + companies ||--o{ warehouses : "(company_id, tenant_id)" + branches ||--o{ warehouses : "(branch_id, tenant_id)" + tenants ||--o{ audit_logs : records + users ||--o{ audit_logs : performed + + tenants { uuid id PK; text name; citext slug UK; text status; timestamptz deleted_at } + tenant_settings { uuid tenant_id PK,FK; char default_currency; text timezone; text locale; smallint fiscal_year_start_month } + users { uuid id PK; citext email UK; text password_hash; text status; bool is_platform_admin; int failed_login_attempts; timestamptz locked_until } + user_tenants { uuid id PK; uuid tenant_id FK; uuid user_id FK; text status; bool is_owner } + user_sessions { uuid id PK; uuid user_id FK; uuid tenant_id FK; text token_hash UK; timestamptz expires_at; timestamptz revoked_at; uuid replaced_by FK } + roles { uuid id PK; uuid tenant_id FK "NULL = system"; text code; bool is_system; timestamptz deleted_at } + permissions { uuid id PK; text code UK; text module } + role_permissions { uuid role_id PK,FK; uuid permission_id PK,FK } + user_roles { uuid id PK; uuid tenant_id; uuid user_id; uuid role_id FK } + companies { uuid id PK; uuid tenant_id FK; text name; text vat_number; text commercial_registration; char currency; text timezone; timestamptz deleted_at } + branches { uuid id PK; uuid tenant_id; uuid company_id; text code; bool is_main; timestamptz deleted_at } + warehouses { uuid id PK; uuid tenant_id; uuid company_id; uuid branch_id; text code; timestamptz deleted_at } + audit_logs { uuid id PK; uuid tenant_id FK; uuid user_id FK; text action; text entity_type; uuid entity_id; jsonb old_values; jsonb new_values; inet ip_address } +``` + +### الجداول + +| الجدول | الغرض | `tenant_id` | Soft delete | RLS | +|---|---|---|---|---| +| `tenants` | المنشأة (حدود العزل) | — (هو المعرّف) | `deleted_at` | ✓ | +| `tenant_settings` | العملة، المنطقة الزمنية، بداية السنة المالية | ✓ (PK) | — | ✓ | +| `users` | هوية عامة (بريد + كلمة مرور) | — | `deleted_at` | — (انظر الملاحظات) | +| `user_tenants` | عضوية المستخدم في منشأة | ✓ | `status` | ✓ | +| `user_sessions` | جلسات Refresh Token (hash فقط) | ✓ | `revoked_at` | — (وصول خدمة المصادقة فقط) | +| `permissions` | كتالوج الصلاحيات | — | — | — (للقراءة فقط) | +| `roles` | أدوار النظام (`tenant_id` فارغ) والأدوار المخصصة | ✓ أو NULL | `deleted_at` | ✓ | +| `role_permissions` | ربط الأدوار بالصلاحيات | عبر الدور | — | ✓ | +| `user_roles` | أدوار المستخدم داخل المنشأة | ✓ | — | ✓ | +| `companies` | الشركات | ✓ | `deleted_at` | ✓ | +| `branches` | الفروع | ✓ | `deleted_at` | ✓ | +| `warehouses` | المستودعات (الأرصدة في المرحلة 5) | ✓ | `deleted_at` | ✓ | +| `audit_logs` | سجل التدقيق، إضافة فقط | ✓ (NULL قبل معرفة المنشأة) | ممنوع | ✓ | +| `schema_migrations` | الترحيلات المطبقة وبصمتها | — | — | — | + +### العلاقات والقيود المهمة + +- `branches (company_id, tenant_id)` → `companies (id, tenant_id)`: مفتاح أجنبي مركّب، فلا يمكن ربط فرع بشركة من منشأة أخرى حتى عبر SQL مباشر. +- `warehouses` يرتبط بالشركة وبالفرع بالطريقة نفسها. +- `user_roles (tenant_id, user_id)` → `user_tenants (tenant_id, user_id)`: لا يُسند دور إلا لعضو في المنشأة. ويتحقق Trigger من أن الدور نظامي أو يتبع المنشأة نفسها. +- `roles`: قيد CHECK يفرض أن أدوار النظام بلا `tenant_id` وأن الأدوار المخصصة لها `tenant_id`. +- قيود CHECK على: الرقم الضريبي السعودي (15 رقمًا يبدأ وينتهي بـ 3)، السجل التجاري (10 أرقام)، رموز العملة والدولة، الحالات. +- `audit_logs`: Trigger يمنع UPDATE وDELETE حتى لمالك المخطط. + +### الفهارس + +| الجدول | الفهرس | +|---|---| +| `tenants` | `slug` (فريد)، `status` | +| `users` | `email` (فريد، غير حساس لحالة الأحرف) | +| `user_tenants` | `(tenant_id, user_id)` (فريد)، `user_id` | +| `user_sessions` | `token_hash` (فريد)، `user_id` للجلسات غير الملغاة | +| `permissions` | `code` (فريد) | +| `roles` | `code` فريد لأدوار النظام؛ `(tenant_id, code)` فريد للأدوار المخصصة غير المحذوفة؛ `tenant_id` | +| `role_permissions` | PK `(role_id, permission_id)`، `permission_id` | +| `user_roles` | `(tenant_id, user_id, role_id)` (فريد)، `role_id` | +| `companies` | `tenant_id`؛ `(tenant_id, name)` فريد؛ `(tenant_id, vat_number)` فريد؛ `(id, tenant_id)` فريد للمفاتيح المركّبة | +| `branches` | `(tenant_id, company_id)`؛ `(tenant_id, company_id, code)` فريد؛ فرع رئيسي واحد لكل شركة | +| `warehouses` | `(tenant_id, company_id)`؛ `(tenant_id, company_id, code)` فريد | +| `audit_logs` | `(tenant_id, created_at DESC)`، `(tenant_id, entity_type, entity_id)`، `(user_id, created_at DESC)`، `(tenant_id, action)` | + +الفهارس الفريدة على الجداول ذات الحذف الناعم جزئية (`WHERE deleted_at IS NULL`) حتى يمكن إعادة استخدام الرمز بعد الحذف. + +## واجهات API (المرحلة 1) + +جميع المدخلات يُتحقق منها بـ Zod. الأخطاء بالشكل `{ "error": { "code", "message", "details" } }`. + +| الطريقة | المسار | الصلاحية | +|---|---|---| +| GET | `/api/health` | عام | +| POST | `/api/auth/register` | عام (10/دقيقة) | +| POST | `/api/auth/login` | عام (10/دقيقة) | +| POST | `/api/auth/refresh` | Cookie + ترويسة `X-CSRF-Protection: 1` | +| POST | `/api/auth/logout` | مسجّل دخول + ترويسة CSRF | +| POST | `/api/auth/switch-tenant` | مسجّل دخول وعضو في المنشأة الهدف | +| POST | `/api/auth/change-password` | مسجّل دخول | +| GET | `/api/auth/me` | مسجّل دخول | +| GET / PATCH | `/api/settings/tenant` | عضو / `settings.manage` | +| GET | `/api/users`، `/api/users/:id` | `user.view` | +| POST | `/api/users` | `user.invite` + `user.manage` | +| PATCH | `/api/users/:id` (تفعيل/تعطيل) | `user.manage` | +| PUT | `/api/users/:id/roles` | `user.manage` | +| GET | `/api/permissions`، `/api/roles` | `role.view` | +| POST / PATCH / DELETE | `/api/roles`، `/api/roles/:id` | `role.manage` | +| GET | `/api/companies`، `/api/companies/:id` | `company.view` | +| POST / PATCH / DELETE | `/api/companies`، `/api/companies/:id` | `company.manage` | +| GET / POST | `/api/companies/:id/branches` | `company.view` / `company.manage` | +| PATCH | `/api/branches/:id` | `company.manage` | +| GET / POST | `/api/companies/:id/warehouses` | `company.view` / `company.manage` | +| PATCH | `/api/warehouses/:id` | `company.manage` | +| GET | `/api/audit-logs` (فلاتر: action، entityType، entityId، userId، from، to، cursor) | `audit.view` | + +## تدفق المصادقة + +1. **التسجيل** ينشئ في معاملة واحدة: المستخدم، المنشأة، إعداداتها (SAR، Asia/Riyadh)، الشركة الافتراضية، الفرع الرئيسي، المستودع الرئيسي، العضوية بدور `TENANT_OWNER`، وسجل تدقيق. +2. **الدخول** يتحقق من كلمة المرور بـ argon2id. البريد غير الموجود يمر بنفس زمن التحقق ويعيد الرسالة نفسها. بعد 5 محاولات فاشلة يُقفل الحساب 15 دقيقة. +3. يُصدر **Access Token** (JWT لمدة 15 دقيقة يحمل `sub` و`tid` المنشأة و`sid` الجلسة) و**Refresh Token** عشوائي (32 بايت) يُخزن hash له فقط، ويُرسل في Cookie بخصائص `HttpOnly` و`SameSite=Strict` و`Secure` في الإنتاج، ومساره `/api/auth`. +4. **في كل طلب** يُعاد التحقق من قاعدة البيانات: الجلسة غير ملغاة، المستخدم نشط، العضوية نشطة، المنشأة غير معلقة. وتُحمَّل الصلاحيات من جديد، فتغيير الأدوار أو التعطيل أو الخروج يسري فورًا. +5. **التجديد** يدوّر الرمز. إذا قُدّم رمز سبق تدويره (سرقة أو إعادة استخدام) تُلغى كل جلسات المستخدم ويُسجل `TOKEN_REUSE_DETECTED`. +6. **تبديل المنشأة** ينقل الجلسة للمنشأة الجديدة، فيصبح الـ Access Token القديم غير صالح. +7. **تغيير كلمة المرور** يُخرج المستخدم من جميع الأجهزة الأخرى. + +الواجهة تحفظ الـ Access Token في الذاكرة فقط (لا `localStorage`)، وتستعيد الجلسة عند تحديث الصفحة عبر الـ Cookie. + +## عزل المنشآت (Tenant Isolation) + +ثلاث طبقات مستقلة: + +1. **التطبيق:** `tenant_id` يؤخذ دائمًا من الجلسة الموثقة، لا من جسم الطلب أو الرابط. كل استعلام يضيف `WHERE tenant_id = $1`. طلب سجل منشأة أخرى يعيد 404 لا 403، حتى لا يكشف وجوده. +2. **قاعدة البيانات (RLS):** الـ API يتصل بدور `alshuyukh_app` غير المميز (`NOBYPASSRLS`). كل معاملة تضبط `app.tenant_id` و`app.user_id` بـ `set_config(..., true)` فتنتهي بانتهاء المعاملة ولا تتسرب لطلب لاحق على الاتصال نفسه. سياسات RLS ترفض القراءة والكتابة خارج المنشأة حتى لو نسي الكود الفلتر. بلا سياق، النتيجة فارغة. +3. **القيود:** مفاتيح أجنبية مركّبة `(id, tenant_id)` تمنع الربط بين منشأتين. دور التطبيق لا يملك صلاحية `DELETE` على الجداول التجارية (حذف ناعم فقط)، ولا يستطيع تعديل أدوار النظام. + +## الصلاحيات (RBAC) + +- المصدر الوحيد: `apps/api/src/modules/rbac/catalog.ts`، يُزامَن مع قاعدة البيانات عند `db:migrate`. +- 45 صلاحية (منها صلاحيات المراحل القادمة، حتى تبقى الأدوار ثابتة). +- أدوار النظام: `TENANT_OWNER`، `COMPANY_ADMIN`، `ACCOUNTANT`، `SALES_MANAGER`، `SALES_EMPLOYEE`، `PURCHASE_MANAGER`، `WAREHOUSE_MANAGER`، `WAREHOUSE_EMPLOYEE`، `VIEWER`. +- `SUPER_ADMIN` ليس دورًا داخل منشأة؛ هو علامة منصة `users.is_platform_admin` ولوحته `/admin` في المرحلة 9. +- **منع تصعيد الصلاحيات:** لا يمكن منح (أو سحب) صلاحية لا تملكها، عند إنشاء دور أو تعديله أو إسناده. لا يمكن تغيير أدوارك أو حالتك بنفسك. المالك لا يُعطّل ولا يُجرّد من دور `TENANT_OWNER`. أدوار النظام غير قابلة للتعديل (ومحمية بـ RLS أيضًا). +- يمكن للمنشأة إنشاء أدوار مخصصة. + +## سجل التدقيق + +يُكتب داخل المعاملة نفسها التي تُجري التغيير، فلا يوجد تغيير بلا سجل. يسجل: `REGISTER`، `LOGIN`، `LOGIN_FAILED`، `LOGOUT`، `TOKEN_REUSE_DETECTED`، `TENANT_SWITCH`، `PASSWORD_CHANGE`، `CREATE`، `UPDATE`، `DELETE`، `SETTINGS_CHANGE`، `PERMISSION_CHANGE`، مع القيم قبل وبعد، وعنوان IP، والـ User-Agent، ومعرّف الطلب. تُحذف كلمات المرور والرموز من القيم قبل الحفظ. + +## الأمان + +argon2id لكلمات المرور · JWT قصير العمر مع جلسات قابلة للإلغاء · RBAC · عزل بثلاث طبقات · Rate limiting (عام 300/دقيقة، الدخول والتسجيل 10/دقيقة، التجديد 120/دقيقة) · Zod على كل المدخلات · SQL بمعاملات فقط، وأسماء الأعمدة في التحديثات من قائمة بيضاء · Helmet (CSP، HSTS، nosniff، frame-ancestors) · CORS بقائمة أصول محددة · حماية CSRF لمسارات الـ Cookie · قفل الحساب · رسائل أخطاء لا تكشف التفاصيل الداخلية. + +## الاختبارات + +54 اختبار تكامل على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: + +| الملف | ما يغطيه | +|---|---| +| `auth.test.ts` | التسجيل وما ينشئه، تخزين argon2id، التحقق من المدخلات، الدخول، تطابق رسائل الفشل، قفل الحساب، رفض الرموز المعدلة، تدوير الرموز، كشف إعادة الاستخدام، الخروج، تغيير كلمة المرور، ترويسات الأمان | +| `tenant-isolation.test.ts` | محاولات منشأة B الوصول لبيانات A عبر المعرفات (قراءة، تعديل، حذف، فروع، مستخدمون، سجل التدقيق، تبديل، أدوار)؛ ثم مباشرة على قاعدة البيانات: الدور لا يتجاوز RLS، الاستعلام بلا فلتر، بلا سياق، الإدخال في منشأة أخرى، المفتاح المركّب، التعديل عبر المنشآت، أدوار النظام، منع الحذف | +| `rbac.test.ts` | سلامة الكتالوج، المحاسب والمشاهد، سريان تغيير الأدوار فورًا، التعطيل الفوري، منع التصعيد، حماية المالك، أدوار النظام، الأدوار المخصصة | +| `audit.test.ts` | تسجيل العمليات، القيم قبل/بعد، عدم تخزين الأسرار، منع التعديل والحذف، الترقيم | +| `companies.test.ts` | القيم السعودية الافتراضية، التحقق، التكرار، الحذف الناعم، ربط المستودع بفرع شركة أخرى، تجاهل `tenant_id` في جسم الطلب، العضوية في منشأتين والتبديل | + +## ملاحظات وقرارات تصميم + +- **المنشأة مقابل الشركة:** المنشأة (tenant) هي حدود العزل والاشتراك. يمكن أن تملك المنشأة أكثر من شركة. السجلات المالية في المراحل القادمة ستحمل `tenant_id` و`company_id` معًا. +- **جدول `users` بلا RLS:** الهوية عامة لأن الدخول يحتاج البحث بالبريد قبل معرفة المنشأة. لا يحتوي على بيانات تجارية، والوصول إليه يمر دائمًا عبر `user_tenants`. يمكن لاحقًا نقل البحث إلى دالة `SECURITY DEFINER` وتفعيل RLS عليه. +- **المبالغ المالية:** `pg` مضبوط ليعيد `NUMERIC` كنص، حتى لا يتحول أي مبلغ إلى float. المرحلة 2 ستستخدم `NUMERIC(19,4)` ومكتبة Decimal. +- **الوقت:** كل الاتصالات بتوقيت UTC، والعرض بتوقيت المنشأة (افتراضيًا Asia/Riyadh). + +## المتبقي (TODO) + +- دعوة المستخدمين بالبريد بدل كلمة المرور المؤقتة (مع نظام الإشعارات). +- تطبيق حدود الباقات (مستخدمون، فروع، شركات) — المرحلة 9. +- لوحة `/admin` لمدير المنصة — المرحلة 9. +- رفع شعار الشركة (حاليًا رابط https فقط). +- نقل ملكية المنشأة. +- منع حذف شركة لها قيود مرحّلة، ومنع تغيير بداية السنة المالية بعد إنشاء سنة — المرحلة 2. +- Rate limiting يعتمد على ذاكرة العملية؛ في الإنتاج بأكثر من نسخة يلزم Redis. +- لم تُطبَّق المصادقة الثنائية (2FA). diff --git a/alshuyukh-accounting/apps/api/package.json b/alshuyukh-accounting/apps/api/package.json new file mode 100644 index 000000000000..ab5e58ce45e7 --- /dev/null +++ b/alshuyukh-accounting/apps/api/package.json @@ -0,0 +1,33 @@ +{ + "name": "@alshuyukh/api", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "tsx watch --env-file=../../.env src/server.ts", + "start": "node --env-file=../../.env dist/server.js", + "build": "tsc -p tsconfig.build.json && cp -r src/db/migrations dist/db/", + "typecheck": "tsc --noEmit", + "db:migrate": "tsx --env-file=../../.env src/db/migrate-cli.ts", + "test": "vitest run" + }, + "dependencies": { + "@fastify/cookie": "^11.1.2", + "@fastify/cors": "^11.3.0", + "@fastify/helmet": "^13.1.1", + "@fastify/rate-limit": "^11.2.0", + "argon2": "^0.45.1", + "fastify": "^5.12.5", + "fastify-plugin": "^5.1.0", + "jose": "^6.2.12", + "pg": "^8.23.1", + "zod": "^4.6.5" + }, + "devDependencies": { + "@types/node": "^22", + "@types/pg": "^8.23.1", + "tsx": "^4.23.15", + "typescript": "^5.9", + "vitest": "^5.0.3" + } +} diff --git a/alshuyukh-accounting/apps/api/src/app.ts b/alshuyukh-accounting/apps/api/src/app.ts new file mode 100644 index 000000000000..c8b0039944d1 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/app.ts @@ -0,0 +1,87 @@ +import cookie from '@fastify/cookie'; +import cors from '@fastify/cors'; +import helmet from '@fastify/helmet'; +import rateLimit from '@fastify/rate-limit'; +import Fastify, { type FastifyInstance } from 'fastify'; +import type pg from 'pg'; +import type { Env } from './config/env.js'; +import { AppError } from './lib/errors.js'; +import { TokenService } from './lib/tokens.js'; +import auditRoutes from './modules/audit/audit.routes.js'; +import authRoutes from './modules/auth/auth.routes.js'; +import companiesRoutes from './modules/companies/companies.routes.js'; +import rbacRoutes from './modules/rbac/rbac.routes.js'; +import settingsRoutes from './modules/settings/settings.routes.js'; +import usersRoutes from './modules/users/users.routes.js'; +import authPlugin from './plugins/auth.js'; + +// PostgreSQL error codes mapped to client errors. +const PG_ERRORS: Record = { + '23505': [409, 'DUPLICATE', 'A record with the same unique value already exists'], + '23503': [400, 'INVALID_REFERENCE', 'A referenced record does not exist'], + '23514': [400, 'CONSTRAINT_VIOLATION', 'A value is outside the allowed range or format'], + '42501': [403, 'FORBIDDEN', 'Operation not permitted'], +}; + +export interface BuildOptions { + env: Env; + pool: pg.Pool; + logger?: boolean; +} + +export async function buildApp({ env, pool, logger = true }: BuildOptions): Promise { + const app = Fastify({ + logger: logger ? { level: env.NODE_ENV === 'production' ? 'info' : 'debug', redact: ['req.headers.authorization', 'req.headers.cookie'] } : false, + trustProxy: env.NODE_ENV === 'production', + bodyLimit: 1_048_576, + genReqId: () => crypto.randomUUID(), + }); + + app.decorate('deps', { env, pool, tokens: new TokenService(env.JWT_SECRET, env.ACCESS_TOKEN_TTL_SECONDS) }); + + await app.register(helmet, { + contentSecurityPolicy: { directives: { defaultSrc: ["'none'"], frameAncestors: ["'none'"] } }, + }); + await app.register(cors, { + origin: env.CORS_ORIGINS.split(',').map((o) => o.trim()).filter(Boolean), + credentials: true, + allowedHeaders: ['Content-Type', 'Authorization', 'X-CSRF-Protection'], + }); + await app.register(cookie); + await app.register(rateLimit, { max: env.NODE_ENV === 'test' ? 10_000 : 300, timeWindow: '1 minute' }); + await app.register(authPlugin); + + app.setErrorHandler((err: Error, req, reply) => { + if (err instanceof AppError) { + return reply.code(err.statusCode).send({ error: { code: err.code, message: err.message, details: err.details } }); + } + const pgCode = (err as { code?: string }).code; + const mapped = pgCode ? PG_ERRORS[pgCode] : undefined; + if (mapped) { + req.log.warn({ err }, 'database constraint'); + return reply.code(mapped[0]).send({ error: { code: mapped[1], message: mapped[2] } }); + } + const status = (err as { statusCode?: number }).statusCode; + if (status && status >= 400 && status < 500) { + return reply.code(status).send({ error: { code: (err as { code?: string }).code ?? 'BAD_REQUEST', message: err.message } }); + } + req.log.error({ err }, 'unhandled error'); + return reply.code(500).send({ error: { code: 'INTERNAL_ERROR', message: 'Internal server error' } }); + }); + + app.get('/api/health', async () => { + await pool.query('SELECT 1'); + return { status: 'ok' }; + }); + + await app.register(authRoutes, { prefix: '/api/auth' }); + await app.register(async (api) => { + await api.register(usersRoutes); + await api.register(rbacRoutes); + await api.register(companiesRoutes); + await api.register(settingsRoutes); + await api.register(auditRoutes); + }, { prefix: '/api' }); + + return app; +} diff --git a/alshuyukh-accounting/apps/api/src/config/env.ts b/alshuyukh-accounting/apps/api/src/config/env.ts new file mode 100644 index 000000000000..75364e2b3eea --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/config/env.ts @@ -0,0 +1,29 @@ +import { z } from 'zod'; + +const schema = z.object({ + NODE_ENV: z.enum(['development', 'test', 'production']).default('development'), + DATABASE_URL: z.string().min(1), + DATABASE_URL_MIGRATE: z.string().min(1).optional(), + JWT_SECRET: z.string().min(32, 'JWT_SECRET must be at least 32 characters'), + ACCESS_TOKEN_TTL_SECONDS: z.coerce.number().int().min(60).max(3600).default(900), + REFRESH_TOKEN_TTL_DAYS: z.coerce.number().int().min(1).max(90).default(30), + PORT: z.coerce.number().int().default(3000), + HOST: z.string().default('0.0.0.0'), + CORS_ORIGINS: z.string().default('http://localhost:5173'), + LOGIN_MAX_ATTEMPTS: z.coerce.number().int().min(3).default(5), + LOGIN_LOCK_MINUTES: z.coerce.number().int().min(1).default(15), +}); + +export type Env = z.infer; + +export function loadEnv(source: NodeJS.ProcessEnv = process.env): Env { + const parsed = schema.safeParse(source); + if (!parsed.success) { + const details = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('\n'); + throw new Error(`Invalid environment configuration:\n${details}`); + } + if (parsed.data.NODE_ENV === 'production' && parsed.data.JWT_SECRET.startsWith('change-me')) { + throw new Error('JWT_SECRET must be changed in production'); + } + return parsed.data; +} diff --git a/alshuyukh-accounting/apps/api/src/db/migrate-cli.ts b/alshuyukh-accounting/apps/api/src/db/migrate-cli.ts new file mode 100644 index 000000000000..dab9bc2e0245 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrate-cli.ts @@ -0,0 +1,14 @@ +import { migrate } from './migrate.js'; + +const url = process.env.DATABASE_URL_MIGRATE; +if (!url) { + console.error('DATABASE_URL_MIGRATE is not set'); + process.exit(1); +} + +migrate(url, (msg) => console.log(msg)) + .then(() => console.log('migrations complete')) + .catch((err: Error) => { + console.error(err.message); + process.exit(1); + }); diff --git a/alshuyukh-accounting/apps/api/src/db/migrate.ts b/alshuyukh-accounting/apps/api/src/db/migrate.ts new file mode 100644 index 000000000000..66fc2afe9fa5 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrate.ts @@ -0,0 +1,104 @@ +import { createHash } from 'node:crypto'; +import { readdir, readFile } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import pg from 'pg'; +import { PERMISSIONS, SYSTEM_ROLES, resolveRolePermissions } from '../modules/rbac/catalog.js'; + +const MIGRATIONS_DIR = join(dirname(fileURLToPath(import.meta.url)), 'migrations'); + +/** + * Applies pending SQL migrations in file-name order, each in its own + * transaction, then syncs the RBAC catalog. An already-applied migration + * whose content changed aborts the run: write a new migration instead. + */ +export async function migrate(connectionString: string, log: (msg: string) => void = () => {}): Promise { + const client = new pg.Client({ connectionString, options: '-c timezone=UTC' }); + await client.connect(); + try { + await client.query(` + CREATE TABLE IF NOT EXISTS schema_migrations ( + version text PRIMARY KEY, + checksum text NOT NULL, + applied_at timestamptz NOT NULL DEFAULT now() + )`); + // Serialize concurrent migration runs. + await client.query(`SELECT pg_advisory_lock(hashtext('alshuyukh_migrations'))`); + + const applied = new Map( + (await client.query<{ version: string; checksum: string }>('SELECT version, checksum FROM schema_migrations')) + .rows.map((r) => [r.version, r.checksum]), + ); + const files = (await readdir(MIGRATIONS_DIR)).filter((f) => f.endsWith('.sql')).sort(); + + for (const file of files) { + const sql = await readFile(join(MIGRATIONS_DIR, file), 'utf8'); + const checksum = createHash('sha256').update(sql).digest('hex'); + const existing = applied.get(file); + if (existing) { + if (existing !== checksum) { + throw new Error(`Migration ${file} was modified after it was applied. Create a new migration instead.`); + } + continue; + } + await client.query('BEGIN'); + try { + await client.query(sql); + await client.query('INSERT INTO schema_migrations (version, checksum) VALUES ($1, $2)', [file, checksum]); + await client.query('COMMIT'); + log(`applied ${file}`); + } catch (err) { + await client.query('ROLLBACK'); + throw new Error(`Migration ${file} failed: ${(err as Error).message}`); + } + } + + await syncRbacCatalog(client); + log('rbac catalog synced'); + } finally { + await client.query(`SELECT pg_advisory_unlock(hashtext('alshuyukh_migrations'))`).catch(() => undefined); + await client.end(); + } +} + +async function syncRbacCatalog(client: pg.Client): Promise { + await client.query('BEGIN'); + try { + for (const p of PERMISSIONS) { + await client.query( + `INSERT INTO permissions (code, module, description_ar, description_en) + VALUES ($1, $2, $3, $4) + ON CONFLICT (code) DO UPDATE SET module = EXCLUDED.module, + description_ar = EXCLUDED.description_ar, description_en = EXCLUDED.description_en`, + [p.code, p.module, p.ar, p.en], + ); + } + for (const role of SYSTEM_ROLES) { + const { rows } = await client.query<{ id: string }>( + `INSERT INTO roles (code, name_ar, name_en, is_system, tenant_id) + VALUES ($1, $2, $3, true, NULL) + ON CONFLICT (code) WHERE tenant_id IS NULL + DO UPDATE SET name_ar = EXCLUDED.name_ar, name_en = EXCLUDED.name_en + RETURNING id`, + [role.code, role.ar, role.en], + ); + const roleId = rows[0]!.id; + const codes = resolveRolePermissions(role); + await client.query( + `DELETE FROM role_permissions WHERE role_id = $1 + AND permission_id NOT IN (SELECT id FROM permissions WHERE code = ANY($2::text[]))`, + [roleId, codes], + ); + await client.query( + `INSERT INTO role_permissions (role_id, permission_id) + SELECT $1, id FROM permissions WHERE code = ANY($2::text[]) + ON CONFLICT DO NOTHING`, + [roleId, codes], + ); + } + await client.query('COMMIT'); + } catch (err) { + await client.query('ROLLBACK'); + throw err; + } +} diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0001_foundation.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0001_foundation.sql new file mode 100644 index 000000000000..f322627a9637 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0001_foundation.sql @@ -0,0 +1,36 @@ +-- 0001 — Foundation: extensions and shared helper functions. +-- All timestamps are stored as timestamptz (UTC). Presentation converts to the +-- company time zone (default Asia/Riyadh). + +CREATE EXTENSION IF NOT EXISTS citext; + +-- Keeps updated_at current on every UPDATE. +CREATE OR REPLACE FUNCTION set_updated_at() RETURNS trigger +LANGUAGE plpgsql AS $$ +BEGIN + NEW.updated_at := now(); + RETURN NEW; +END; +$$; + +-- Request context. The API sets these with set_config(..., true) at the start +-- of every transaction, so they are scoped to that transaction only. +CREATE OR REPLACE FUNCTION app_current_tenant_id() RETURNS uuid +LANGUAGE sql STABLE AS $$ + SELECT NULLIF(current_setting('app.tenant_id', true), '')::uuid +$$; + +CREATE OR REPLACE FUNCTION app_current_user_id() RETURNS uuid +LANGUAGE sql STABLE AS $$ + SELECT NULLIF(current_setting('app.user_id', true), '')::uuid +$$; + +-- Blocks UPDATE and DELETE on append-only tables (audit logs, and later +-- posted financial records). +CREATE OR REPLACE FUNCTION prevent_modification() RETURNS trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE EXCEPTION '% on table % is not allowed (append-only)', TG_OP, TG_TABLE_NAME + USING ERRCODE = 'insufficient_privilege'; +END; +$$; diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0002_identity_tenancy.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0002_identity_tenancy.sql new file mode 100644 index 000000000000..306800a24b1e --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0002_identity_tenancy.sql @@ -0,0 +1,86 @@ +-- 0002 — Identity and multi-tenancy. +-- A tenant is the isolation boundary (one subscribing organization). +-- Users are global identities; membership in a tenant is in user_tenants. + +CREATE TABLE tenants ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + name text NOT NULL CHECK (length(btrim(name)) BETWEEN 2 AND 200), + slug citext NOT NULL CHECK (slug ~ '^[a-z0-9][a-z0-9-]{1,62}$'), + status text NOT NULL DEFAULT 'ACTIVE' CHECK (status IN ('ACTIVE', 'SUSPENDED', 'CANCELLED')), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz +); +CREATE UNIQUE INDEX tenants_slug_uq ON tenants (slug); +CREATE INDEX tenants_status_idx ON tenants (status); +CREATE TRIGGER tenants_updated_at BEFORE UPDATE ON tenants + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE tenant_settings ( + tenant_id uuid PRIMARY KEY REFERENCES tenants (id) ON DELETE RESTRICT, + default_currency char(3) NOT NULL DEFAULT 'SAR' CHECK (default_currency ~ '^[A-Z]{3}$'), + timezone text NOT NULL DEFAULT 'Asia/Riyadh', + locale text NOT NULL DEFAULT 'ar' CHECK (locale IN ('ar', 'en')), + fiscal_year_start_month smallint NOT NULL DEFAULT 1 CHECK (fiscal_year_start_month BETWEEN 1 AND 12), + date_format text NOT NULL DEFAULT 'YYYY-MM-DD', + extra jsonb NOT NULL DEFAULT '{}'::jsonb, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE TRIGGER tenant_settings_updated_at BEFORE UPDATE ON tenant_settings + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE users ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + email citext NOT NULL CHECK (position('@' IN email) > 1), + password_hash text NOT NULL, + full_name text NOT NULL CHECK (length(btrim(full_name)) BETWEEN 2 AND 200), + phone text, + status text NOT NULL DEFAULT 'ACTIVE' CHECK (status IN ('ACTIVE', 'DISABLED')), + -- Platform (Super Admin) access is a platform flag, not a tenant role. + -- The /admin panel that uses it is delivered in Phase 9. + is_platform_admin boolean NOT NULL DEFAULT false, + must_change_password boolean NOT NULL DEFAULT false, + failed_login_attempts integer NOT NULL DEFAULT 0 CHECK (failed_login_attempts >= 0), + locked_until timestamptz, + last_login_at timestamptz, + password_changed_at timestamptz NOT NULL DEFAULT now(), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz +); +CREATE UNIQUE INDEX users_email_uq ON users (email); +CREATE TRIGGER users_updated_at BEFORE UPDATE ON users + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE user_tenants ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL REFERENCES tenants (id) ON DELETE RESTRICT, + user_id uuid NOT NULL REFERENCES users (id) ON DELETE RESTRICT, + status text NOT NULL DEFAULT 'ACTIVE' CHECK (status IN ('ACTIVE', 'INVITED', 'DISABLED')), + is_owner boolean NOT NULL DEFAULT false, + joined_at timestamptz NOT NULL DEFAULT now(), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT user_tenants_tenant_user_uq UNIQUE (tenant_id, user_id) +); +CREATE INDEX user_tenants_user_idx ON user_tenants (user_id); +CREATE TRIGGER user_tenants_updated_at BEFORE UPDATE ON user_tenants + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Refresh-token sessions. Only the SHA-256 hash of the token is stored. +CREATE TABLE user_sessions ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + user_id uuid NOT NULL REFERENCES users (id) ON DELETE RESTRICT, + tenant_id uuid NOT NULL REFERENCES tenants (id) ON DELETE RESTRICT, + token_hash text NOT NULL, + expires_at timestamptz NOT NULL, + revoked_at timestamptz, + replaced_by uuid REFERENCES user_sessions (id), + ip_address inet, + user_agent text, + created_at timestamptz NOT NULL DEFAULT now(), + last_used_at timestamptz +); +CREATE UNIQUE INDEX user_sessions_token_hash_uq ON user_sessions (token_hash); +CREATE INDEX user_sessions_user_idx ON user_sessions (user_id) WHERE revoked_at IS NULL; diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0003_rbac.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0003_rbac.sql new file mode 100644 index 000000000000..ff41a1ff2c5e --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0003_rbac.sql @@ -0,0 +1,77 @@ +-- 0003 — Role-based access control. +-- System roles (tenant_id IS NULL) are shared templates managed by the +-- application catalog. Tenants can add custom roles (tenant_id = tenant). + +CREATE TABLE permissions ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + code text NOT NULL CHECK (code ~ '^[a-z_]+\.[a-z_]+$'), + module text NOT NULL, + description_ar text NOT NULL, + description_en text NOT NULL, + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE UNIQUE INDEX permissions_code_uq ON permissions (code); + +CREATE TABLE roles ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid REFERENCES tenants (id) ON DELETE RESTRICT, + code text NOT NULL CHECK (code ~ '^[A-Z][A-Z0-9_]{1,62}$'), + name_ar text NOT NULL, + name_en text NOT NULL, + description text, + is_system boolean NOT NULL DEFAULT false, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT roles_system_scope_ck CHECK ( + (is_system AND tenant_id IS NULL) OR (NOT is_system AND tenant_id IS NOT NULL) + ) +); +-- A role code is unique among system roles, and unique per tenant. +CREATE UNIQUE INDEX roles_system_code_uq ON roles (code) WHERE tenant_id IS NULL; +CREATE UNIQUE INDEX roles_tenant_code_uq ON roles (tenant_id, code) + WHERE tenant_id IS NOT NULL AND deleted_at IS NULL; +CREATE INDEX roles_tenant_idx ON roles (tenant_id); +CREATE TRIGGER roles_updated_at BEFORE UPDATE ON roles + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE role_permissions ( + role_id uuid NOT NULL REFERENCES roles (id) ON DELETE CASCADE, + permission_id uuid NOT NULL REFERENCES permissions (id) ON DELETE RESTRICT, + created_at timestamptz NOT NULL DEFAULT now(), + PRIMARY KEY (role_id, permission_id) +); +CREATE INDEX role_permissions_permission_idx ON role_permissions (permission_id); + +CREATE TABLE user_roles ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + user_id uuid NOT NULL, + role_id uuid NOT NULL REFERENCES roles (id) ON DELETE RESTRICT, + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + -- The user must be a member of the same tenant. + CONSTRAINT user_roles_membership_fk FOREIGN KEY (tenant_id, user_id) + REFERENCES user_tenants (tenant_id, user_id) ON DELETE RESTRICT, + CONSTRAINT user_roles_uq UNIQUE (tenant_id, user_id, role_id) +); +CREATE INDEX user_roles_role_idx ON user_roles (role_id); + +-- The assigned role must be a system role or a role of the same tenant. +CREATE OR REPLACE FUNCTION check_user_role_tenant() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + role_tenant uuid; + role_found boolean; +BEGIN + SELECT true, tenant_id INTO role_found, role_tenant + FROM roles WHERE id = NEW.role_id AND deleted_at IS NULL; + IF role_found IS NULL OR (role_tenant IS NOT NULL AND role_tenant <> NEW.tenant_id) THEN + RAISE EXCEPTION 'role % is not available in tenant %', NEW.role_id, NEW.tenant_id + USING ERRCODE = 'foreign_key_violation'; + END IF; + RETURN NEW; +END; +$$; +CREATE TRIGGER user_roles_tenant_check BEFORE INSERT OR UPDATE ON user_roles + FOR EACH ROW EXECUTE FUNCTION check_user_role_tenant(); diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0004_companies.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0004_companies.sql new file mode 100644 index 000000000000..b4f9d8aa1823 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0004_companies.sql @@ -0,0 +1,89 @@ +-- 0004 — Companies, branches, warehouses. +-- Every company-related row carries tenant_id. Child tables use composite +-- foreign keys (parent_id, tenant_id) so a row can never point at a parent +-- that belongs to another tenant. +-- +-- fiscal_years / fiscal_periods are delivered with the Accounting Engine in +-- Phase 2, because posting rules depend on them. + +CREATE TABLE companies ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL REFERENCES tenants (id) ON DELETE RESTRICT, + name text NOT NULL CHECK (length(btrim(name)) BETWEEN 2 AND 200), + legal_name text, + commercial_registration text CHECK (commercial_registration ~ '^[0-9]{10}$'), + -- Saudi VAT registration number: 15 digits, starts and ends with 3. + vat_number text CHECK (vat_number ~ '^3[0-9]{13}3$'), + address text, + city text, + country char(2) NOT NULL DEFAULT 'SA' CHECK (country ~ '^[A-Z]{2}$'), + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + timezone text NOT NULL DEFAULT 'Asia/Riyadh', + logo_url text, + email citext, + phone text, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT companies_id_tenant_uq UNIQUE (id, tenant_id) +); +CREATE INDEX companies_tenant_idx ON companies (tenant_id) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX companies_tenant_name_uq ON companies (tenant_id, name) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX companies_tenant_vat_uq ON companies (tenant_id, vat_number) + WHERE vat_number IS NOT NULL AND deleted_at IS NULL; +CREATE TRIGGER companies_updated_at BEFORE UPDATE ON companies + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE branches ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[A-Za-z0-9_-]{1,20}$'), + name text NOT NULL CHECK (length(btrim(name)) BETWEEN 2 AND 200), + address text, + city text, + phone text, + is_main boolean NOT NULL DEFAULT false, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT branches_company_fk FOREIGN KEY (company_id, tenant_id) + REFERENCES companies (id, tenant_id) ON DELETE RESTRICT, + CONSTRAINT branches_id_tenant_uq UNIQUE (id, tenant_id) +); +CREATE INDEX branches_company_idx ON branches (tenant_id, company_id) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX branches_code_uq ON branches (tenant_id, company_id, code) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX branches_one_main_uq ON branches (company_id) WHERE is_main AND deleted_at IS NULL; +CREATE TRIGGER branches_updated_at BEFORE UPDATE ON branches + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE warehouses ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + code text NOT NULL CHECK (code ~ '^[A-Za-z0-9_-]{1,20}$'), + name text NOT NULL CHECK (length(btrim(name)) BETWEEN 2 AND 200), + address text, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT warehouses_company_fk FOREIGN KEY (company_id, tenant_id) + REFERENCES companies (id, tenant_id) ON DELETE RESTRICT, + CONSTRAINT warehouses_branch_fk FOREIGN KEY (branch_id, tenant_id) + REFERENCES branches (id, tenant_id) ON DELETE RESTRICT, + CONSTRAINT warehouses_id_tenant_uq UNIQUE (id, tenant_id) +); +CREATE INDEX warehouses_company_idx ON warehouses (tenant_id, company_id) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX warehouses_code_uq ON warehouses (tenant_id, company_id, code) WHERE deleted_at IS NULL; +CREATE TRIGGER warehouses_updated_at BEFORE UPDATE ON warehouses + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0005_audit.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0005_audit.sql new file mode 100644 index 000000000000..43e189d6d90f --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0005_audit.sql @@ -0,0 +1,25 @@ +-- 0005 — Audit log (append-only). +-- tenant_id is NULL only for events that happen before a tenant is known, +-- such as a failed login for an unknown e-mail address. + +CREATE TABLE audit_logs ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid REFERENCES tenants (id) ON DELETE RESTRICT, + user_id uuid REFERENCES users (id) ON DELETE RESTRICT, + action text NOT NULL CHECK (action ~ '^[A-Z_]+$'), + entity_type text, + entity_id uuid, + old_values jsonb, + new_values jsonb, + ip_address inet, + user_agent text, + request_id text, + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX audit_logs_tenant_created_idx ON audit_logs (tenant_id, created_at DESC); +CREATE INDEX audit_logs_entity_idx ON audit_logs (tenant_id, entity_type, entity_id); +CREATE INDEX audit_logs_user_idx ON audit_logs (user_id, created_at DESC); +CREATE INDEX audit_logs_action_idx ON audit_logs (tenant_id, action); + +CREATE TRIGGER audit_logs_append_only BEFORE UPDATE OR DELETE ON audit_logs + FOR EACH ROW EXECUTE FUNCTION prevent_modification(); diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0006_rls_and_grants.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0006_rls_and_grants.sql new file mode 100644 index 000000000000..b64bc54f70d2 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0006_rls_and_grants.sql @@ -0,0 +1,92 @@ +-- 0006 — Row-Level Security and runtime privileges. +-- +-- The API connects as alshuyukh_app (NOSUPERUSER, NOBYPASSRLS). Every +-- tenant-scoped query runs in a transaction that sets app.tenant_id and +-- app.user_id. These policies make PostgreSQL itself reject cross-tenant +-- access, even if application code forgets a WHERE tenant_id = ... filter. +-- +-- The schema owner (migrations) is not subject to these policies. + +-- tenants ----------------------------------------------------------------- +ALTER TABLE tenants ENABLE ROW LEVEL SECURITY; +CREATE POLICY tenants_select ON tenants FOR SELECT USING ( + id = app_current_tenant_id() + OR id IN (SELECT ut.tenant_id FROM user_tenants ut + WHERE ut.user_id = app_current_user_id() AND ut.status = 'ACTIVE') +); +CREATE POLICY tenants_insert ON tenants FOR INSERT WITH CHECK (id = app_current_tenant_id()); +CREATE POLICY tenants_update ON tenants FOR UPDATE + USING (id = app_current_tenant_id()) WITH CHECK (id = app_current_tenant_id()); + +-- tenant_settings --------------------------------------------------------- +ALTER TABLE tenant_settings ENABLE ROW LEVEL SECURITY; +CREATE POLICY tenant_settings_isolation ON tenant_settings + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +-- user_tenants: a user can see their own memberships (for login and the +-- tenant switcher) plus all memberships of the active tenant. +ALTER TABLE user_tenants ENABLE ROW LEVEL SECURITY; +CREATE POLICY user_tenants_select ON user_tenants FOR SELECT USING ( + tenant_id = app_current_tenant_id() OR user_id = app_current_user_id() +); +CREATE POLICY user_tenants_insert ON user_tenants FOR INSERT + WITH CHECK (tenant_id = app_current_tenant_id()); +CREATE POLICY user_tenants_update ON user_tenants FOR UPDATE + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +-- roles: system roles are readable by everyone, never writable at runtime. +ALTER TABLE roles ENABLE ROW LEVEL SECURITY; +CREATE POLICY roles_select ON roles FOR SELECT USING ( + tenant_id IS NULL OR tenant_id = app_current_tenant_id() +); +CREATE POLICY roles_insert ON roles FOR INSERT WITH CHECK (tenant_id = app_current_tenant_id()); +CREATE POLICY roles_update ON roles FOR UPDATE + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +-- role_permissions follow the visibility and ownership of their role. +ALTER TABLE role_permissions ENABLE ROW LEVEL SECURITY; +CREATE POLICY role_permissions_select ON role_permissions FOR SELECT USING ( + EXISTS (SELECT 1 FROM roles r WHERE r.id = role_id) +); +CREATE POLICY role_permissions_insert ON role_permissions FOR INSERT WITH CHECK ( + EXISTS (SELECT 1 FROM roles r WHERE r.id = role_id AND r.tenant_id = app_current_tenant_id()) +); +CREATE POLICY role_permissions_delete ON role_permissions FOR DELETE USING ( + EXISTS (SELECT 1 FROM roles r WHERE r.id = role_id AND r.tenant_id = app_current_tenant_id()) +); + +-- Plain tenant-scoped tables ----------------------------------------------- +ALTER TABLE user_roles ENABLE ROW LEVEL SECURITY; +CREATE POLICY user_roles_isolation ON user_roles + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +ALTER TABLE companies ENABLE ROW LEVEL SECURITY; +CREATE POLICY companies_isolation ON companies + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +ALTER TABLE branches ENABLE ROW LEVEL SECURITY; +CREATE POLICY branches_isolation ON branches + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +ALTER TABLE warehouses ENABLE ROW LEVEL SECURITY; +CREATE POLICY warehouses_isolation ON warehouses + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +-- audit_logs: read own tenant; insert for own tenant or pre-tenant events. +ALTER TABLE audit_logs ENABLE ROW LEVEL SECURITY; +CREATE POLICY audit_logs_select ON audit_logs FOR SELECT USING (tenant_id = app_current_tenant_id()); +CREATE POLICY audit_logs_insert ON audit_logs FOR INSERT WITH CHECK ( + tenant_id IS NULL OR tenant_id = app_current_tenant_id() +); + +-- Runtime privileges -------------------------------------------------------- +-- No DELETE on business tables: records are soft-deleted (deleted_at). +-- Join tables (user_roles, role_permissions) allow DELETE; every change is audited. +GRANT USAGE ON SCHEMA public TO alshuyukh_app; +GRANT SELECT ON permissions TO alshuyukh_app; +GRANT SELECT, INSERT, UPDATE ON + tenants, tenant_settings, users, user_tenants, user_sessions, + roles, companies, branches, warehouses +TO alshuyukh_app; +GRANT SELECT, INSERT, DELETE ON user_roles, role_permissions TO alshuyukh_app; +GRANT SELECT, INSERT ON audit_logs TO alshuyukh_app; diff --git a/alshuyukh-accounting/apps/api/src/db/pool.ts b/alshuyukh-accounting/apps/api/src/db/pool.ts new file mode 100644 index 000000000000..9416a155d9b0 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/pool.ts @@ -0,0 +1,16 @@ +import pg from 'pg'; + +/** Creates a pool whose sessions always use UTC. */ +export function createPool(connectionString: string): pg.Pool { + return new pg.Pool({ + connectionString, + max: 20, + options: '-c timezone=UTC', + }); +} + +// Return NUMERIC as string so money is never converted to a JS float. +// Business logic converts with a decimal library (introduced in Phase 2). +pg.types.setTypeParser(pg.types.builtins.NUMERIC, (v) => v); +// Return bigint (e.g. COUNT(*)) as string; callers convert explicitly. +pg.types.setTypeParser(pg.types.builtins.INT8, (v) => v); diff --git a/alshuyukh-accounting/apps/api/src/db/tx.ts b/alshuyukh-accounting/apps/api/src/db/tx.ts new file mode 100644 index 000000000000..696dd8a60e8a --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/tx.ts @@ -0,0 +1,39 @@ +import type pg from 'pg'; + +export type Db = pg.PoolClient; + +export interface DbContext { + tenantId?: string | null; + userId?: string | null; +} + +/** + * Runs `fn` inside a transaction with the request context applied. + * + * `app.tenant_id` and `app.user_id` are set with is_local = true, so they + * exist only for this transaction and cannot leak to the next request that + * reuses the pooled connection. Row-Level Security policies read them. + */ +export async function withTx(pool: pg.Pool, ctx: DbContext, fn: (db: Db) => Promise): Promise { + const client = await pool.connect(); + try { + await client.query('BEGIN'); + await client.query( + `SELECT set_config('app.tenant_id', $1, true), set_config('app.user_id', $2, true)`, + [ctx.tenantId ?? '', ctx.userId ?? ''], + ); + const result = await fn(client); + await client.query('COMMIT'); + return result; + } catch (err) { + await client.query('ROLLBACK').catch(() => undefined); + throw err; + } finally { + client.release(); + } +} + +/** Switches the tenant context inside an open transaction (used during registration). */ +export async function setTenantContext(db: Db, tenantId: string): Promise { + await db.query(`SELECT set_config('app.tenant_id', $1, true)`, [tenantId]); +} diff --git a/alshuyukh-accounting/apps/api/src/lib/errors.ts b/alshuyukh-accounting/apps/api/src/lib/errors.ts new file mode 100644 index 000000000000..3cf67d3767ed --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/errors.ts @@ -0,0 +1,20 @@ +export class AppError extends Error { + constructor( + public readonly statusCode: number, + public readonly code: string, + message: string, + public readonly details?: unknown, + ) { + super(message); + } +} + +export const badRequest = (code: string, message: string, details?: unknown) => + new AppError(400, code, message, details); +export const unauthorized = (message = 'Authentication required') => + new AppError(401, 'UNAUTHORIZED', message); +export const forbidden = (message = 'You do not have permission to perform this action') => + new AppError(403, 'FORBIDDEN', message); +// Cross-tenant lookups return 404, never 403, so record existence does not leak. +export const notFound = (entity = 'Resource') => new AppError(404, 'NOT_FOUND', `${entity} not found`); +export const conflict = (code: string, message: string) => new AppError(409, code, message); diff --git a/alshuyukh-accounting/apps/api/src/lib/password.ts b/alshuyukh-accounting/apps/api/src/lib/password.ts new file mode 100644 index 000000000000..1764ae0d3018 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/password.ts @@ -0,0 +1,19 @@ +import argon2 from 'argon2'; + +// OWASP-recommended argon2id parameters. +const OPTIONS = { type: argon2.argon2id, memoryCost: 19456, timeCost: 2, parallelism: 1 } as const; + +export const hashPassword = (plain: string) => argon2.hash(plain, OPTIONS); + +export async function verifyPassword(hash: string, plain: string): Promise { + try { + return await argon2.verify(hash, plain); + } catch { + return false; + } +} + +// Verifying against this hash keeps response time similar when the e-mail +// does not exist, so login timing does not reveal registered addresses. +let dummyHash: Promise | undefined; +export const getDummyHash = () => (dummyHash ??= hashPassword('dummy-password-for-timing-0')); diff --git a/alshuyukh-accounting/apps/api/src/lib/tokens.ts b/alshuyukh-accounting/apps/api/src/lib/tokens.ts new file mode 100644 index 000000000000..b1be0053bd26 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/tokens.ts @@ -0,0 +1,48 @@ +import { createHash, randomBytes } from 'node:crypto'; +import { SignJWT, jwtVerify } from 'jose'; +import { unauthorized } from './errors.js'; + +export interface AccessClaims { + sub: string; // user id + tid: string; // active tenant id + sid: string; // session id +} + +export class TokenService { + private readonly key: Uint8Array; + + constructor(secret: string, private readonly accessTtlSeconds: number) { + this.key = new TextEncoder().encode(secret); + } + + signAccess(claims: AccessClaims): Promise { + return new SignJWT({ tid: claims.tid, sid: claims.sid, typ: 'access' }) + .setProtectedHeader({ alg: 'HS256' }) + .setSubject(claims.sub) + .setIssuer('alshuyukh') + .setAudience('alshuyukh-api') + .setIssuedAt() + .setExpirationTime(`${this.accessTtlSeconds}s`) + .sign(this.key); + } + + async verifyAccess(token: string): Promise { + try { + const { payload } = await jwtVerify(token, this.key, { + issuer: 'alshuyukh', + audience: 'alshuyukh-api', + algorithms: ['HS256'], + }); + if (payload.typ !== 'access' || typeof payload.sub !== 'string' || + typeof payload.tid !== 'string' || typeof payload.sid !== 'string') { + throw new Error('bad claims'); + } + return { sub: payload.sub, tid: payload.tid, sid: payload.sid }; + } catch { + throw unauthorized('Invalid or expired token'); + } + } +} + +export const newRefreshToken = () => randomBytes(32).toString('base64url'); +export const hashToken = (token: string) => createHash('sha256').update(token).digest('hex'); diff --git a/alshuyukh-accounting/apps/api/src/lib/validation.ts b/alshuyukh-accounting/apps/api/src/lib/validation.ts new file mode 100644 index 000000000000..8d61e7f7c9f8 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/validation.ts @@ -0,0 +1,33 @@ +import { z } from 'zod'; +import { badRequest } from './errors.js'; + +/** Parses untrusted input. Throws a 400 with field-level details on failure. */ +export function parse(schema: T, data: unknown): z.infer { + const result = schema.safeParse(data); + if (!result.success) { + throw badRequest( + 'VALIDATION_ERROR', + 'Invalid request', + result.error.issues.map((i) => ({ path: i.path.join('.'), message: i.message })), + ); + } + return result.data; +} + +export const uuidParam = z.object({ id: z.uuid() }); + +const TIMEZONES = new Set(Intl.supportedValuesOf('timeZone')); +export const timezone = z.string().refine((tz) => TIMEZONES.has(tz), 'Unknown time zone'); + +/** Trims, and turns empty strings into null for optional text fields. */ +export const optionalText = (max = 500) => + z.preprocess( + (v) => (typeof v === 'string' && v.trim() === '' ? null : typeof v === 'string' ? v.trim() : v), + z.string().max(max).nullable().optional(), + ); + +export const password = z + .string() + .min(10, 'Password must be at least 10 characters') + .max(200) + .refine((p) => /[A-Za-z]/.test(p) && /[0-9]/.test(p), 'Password must contain letters and digits'); diff --git a/alshuyukh-accounting/apps/api/src/modules/audit/audit.routes.ts b/alshuyukh-accounting/apps/api/src/modules/audit/audit.routes.ts new file mode 100644 index 000000000000..2ad49eb4ed10 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/audit/audit.routes.ts @@ -0,0 +1,55 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import { parse } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; + +const query = z.object({ + action: z.string().regex(/^[A-Z_]+$/).optional(), + entityType: z.string().max(50).optional(), + entityId: z.uuid().optional(), + userId: z.uuid().optional(), + from: z.iso.datetime({ offset: true }).optional(), + to: z.iso.datetime({ offset: true }).optional(), + // Keyset pagination: pass the previous page's nextCursor. + cursor: z.string().regex(/^[^|]+\|[0-9a-f-]{36}$/).optional(), + limit: z.coerce.number().int().min(1).max(200).default(50), +}); + +export default async function auditRoutes(app: FastifyInstance) { + app.get('/audit-logs', { preHandler: requirePermission(app, 'audit.view') }, async (req) => { + const q = parse(query, req.query); + const where = ['a.tenant_id = $1']; + const params: unknown[] = [req.auth!.tenantId]; + const add = (sql: string, value: unknown) => { params.push(value); where.push(sql.replace('?', `$${params.length}`)); }; + if (q.action) add('a.action = ?', q.action); + if (q.entityType) add('a.entity_type = ?', q.entityType); + if (q.entityId) add('a.entity_id = ?', q.entityId); + if (q.userId) add('a.user_id = ?', q.userId); + if (q.from) add('a.created_at >= ?', q.from); + if (q.to) add('a.created_at <= ?', q.to); + if (q.cursor) { + const [ts, id] = q.cursor.split('|'); + params.push(ts, id); + where.push(`(a.created_at, a.id) < ($${params.length - 1}::timestamptz, $${params.length}::uuid)`); + } + params.push(q.limit + 1); + return req.tenantTx(async (db) => { + const { rows } = await db.query<{ id: string; createdAt: Date }>( + `SELECT a.id, a.action, a.entity_type AS "entityType", a.entity_id AS "entityId", + a.user_id AS "userId", u.full_name AS "userName", a.old_values AS "oldValues", + a.new_values AS "newValues", host(a.ip_address) AS "ipAddress", a.user_agent AS "userAgent", + a.created_at AS "createdAt" + FROM audit_logs a LEFT JOIN users u ON u.id = a.user_id + WHERE ${where.join(' AND ')} + ORDER BY a.created_at DESC, a.id DESC + LIMIT $${params.length}`, + params); + const page = rows.slice(0, q.limit); + const last = page[page.length - 1]; + return { + data: page, + nextCursor: rows.length > q.limit && last ? `${last.createdAt.toISOString()}|${last.id}` : null, + }; + }); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts b/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts new file mode 100644 index 000000000000..101e2f52b972 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts @@ -0,0 +1,56 @@ +import type { Db } from '../../db/tx.js'; + +export type AuditAction = + | 'REGISTER' | 'LOGIN' | 'LOGIN_FAILED' | 'LOGOUT' | 'TOKEN_REUSE_DETECTED' + | 'TENANT_SWITCH' | 'PASSWORD_CHANGE' + | 'CREATE' | 'UPDATE' | 'DELETE' + | 'SETTINGS_CHANGE' | 'PERMISSION_CHANGE'; + +export interface AuditMeta { + ip?: string | null; + userAgent?: string | null; + requestId?: string | null; +} + +export interface AuditEntry { + tenantId: string | null; + userId: string | null; + action: AuditAction; + entityType?: string | null; + entityId?: string | null; + oldValues?: unknown; + newValues?: unknown; +} + +const SECRET_KEYS = new Set(['password', 'password_hash', 'passwordHash', 'token', 'token_hash']); + +function redact(value: unknown): unknown { + if (value === null || value === undefined) return null; + if (Array.isArray(value)) return value.map(redact); + if (typeof value === 'object') { + return Object.fromEntries( + Object.entries(value as Record) + .filter(([k]) => !SECRET_KEYS.has(k)) + .map(([k, v]) => [k, redact(v)]), + ); + } + return value; +} + +/** + * Writes an audit record inside the caller's transaction, so the audit row + * commits or rolls back together with the change it describes. + */ +export async function writeAudit(db: Db, entry: AuditEntry, meta: AuditMeta = {}): Promise { + await db.query( + `INSERT INTO audit_logs (tenant_id, user_id, action, entity_type, entity_id, + old_values, new_values, ip_address, user_agent, request_id) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, + [ + entry.tenantId, entry.userId, entry.action, entry.entityType ?? null, entry.entityId ?? null, + entry.oldValues === undefined ? null : JSON.stringify(redact(entry.oldValues)), + entry.newValues === undefined ? null : JSON.stringify(redact(entry.newValues)), + meta.ip ?? null, meta.userAgent?.slice(0, 500) ?? null, meta.requestId ?? null, + ], + ); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/auth/auth.routes.ts b/alshuyukh-accounting/apps/api/src/modules/auth/auth.routes.ts new file mode 100644 index 000000000000..83726a11f665 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/auth/auth.routes.ts @@ -0,0 +1,131 @@ +import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'; +import { z } from 'zod'; +import { withTx } from '../../db/tx.js'; +import { badRequest, unauthorized } from '../../lib/errors.js'; +import { parse, password } from '../../lib/validation.js'; +import { requireAuth } from '../../plugins/auth.js'; +import { AuthService, type IssuedTokens } from './auth.service.js'; + +export const REFRESH_COOKIE = 'ash_rt'; +const CSRF_HEADER = 'x-csrf-protection'; + +const email = z.string().trim().toLowerCase().pipe(z.email().max(254)); + +const registerBody = z.object({ + fullName: z.string().trim().min(2).max(200), + email, + password, + tenantName: z.string().trim().min(2).max(200), + companyName: z.string().trim().min(2).max(200), + vatNumber: z.string().regex(/^3\d{13}3$/, 'Saudi VAT number must be 15 digits starting and ending with 3').nullish(), + commercialRegistration: z.string().regex(/^\d{10}$/, 'Commercial registration must be 10 digits').nullish(), +}); + +const loginBody = z.object({ + email, + password: z.string().min(1).max(200), + tenantId: z.uuid().optional(), +}); + +/** + * The refresh token travels only in an HttpOnly, SameSite=Strict cookie + * scoped to /api/auth. Endpoints that read it also require a custom header, + * which a cross-site form cannot send and which triggers a CORS preflight + * for scripts on other origins (CSRF protection). + */ +function requireCsrfHeader(req: FastifyRequest) { + if (req.headers[CSRF_HEADER] !== '1') throw badRequest('CSRF_HEADER_MISSING', `Missing ${CSRF_HEADER} header`); +} + +export default async function authRoutes(app: FastifyInstance) { + const service = new AuthService(app.deps); + const { env } = app.deps; + const isTest = env.NODE_ENV === 'test'; + // Credential endpoints: tight per-IP limit against password guessing. + const strictLimit = { rateLimit: { max: isTest ? 1000 : 10, timeWindow: '1 minute' } }; + // Refresh runs on every page load, and an office may share one IP. + const refreshLimit = { rateLimit: { max: isTest ? 1000 : 120, timeWindow: '1 minute' } }; + + const setRefreshCookie = (reply: FastifyReply, token: string) => + reply.setCookie(REFRESH_COOKIE, token, { + httpOnly: true, + secure: env.NODE_ENV === 'production', + sameSite: 'strict', + path: '/api/auth', + maxAge: env.REFRESH_TOKEN_TTL_DAYS * 86400, + }); + + const respond = async (reply: FastifyReply, t: IssuedTokens) => { + setRefreshCookie(reply, t.refreshToken); + return { accessToken: t.accessToken, expiresIn: t.expiresIn, tenantId: t.tenantId, userId: t.userId }; + }; + + app.post('/register', { config: strictLimit }, async (req, reply) => { + const body = parse(registerBody, req.body); + reply.code(201); + return respond(reply, await service.register(body, req.auditMeta())); + }); + + app.post('/login', { config: strictLimit }, async (req, reply) => { + const body = parse(loginBody, req.body); + return respond(reply, await service.login(body.email, body.password, body.tenantId, req.auditMeta())); + }); + + app.post('/refresh', { config: refreshLimit }, async (req, reply) => { + requireCsrfHeader(req); + const token = req.cookies[REFRESH_COOKIE]; + if (!token) throw unauthorized('Missing refresh token'); + try { + return await respond(reply, await service.refresh(token, req.auditMeta())); + } catch (err) { + reply.clearCookie(REFRESH_COOKIE, { path: '/api/auth' }); + throw err; + } + }); + + app.post('/logout', { preHandler: requireAuth(app) }, async (req, reply) => { + requireCsrfHeader(req); + const a = req.auth!; + await service.logout(a.sessionId, a.userId, a.tenantId, req.auditMeta()); + reply.clearCookie(REFRESH_COOKIE, { path: '/api/auth' }); + return reply.code(204).send(); + }); + + app.post('/switch-tenant', { preHandler: requireAuth(app) }, async (req) => { + const { tenantId } = parse(z.object({ tenantId: z.uuid() }), req.body); + const a = req.auth!; + return service.switchTenant(a.sessionId, a.userId, a.tenantId, tenantId, req.auditMeta()); + }); + + app.post('/change-password', { preHandler: requireAuth(app), config: strictLimit }, async (req, reply) => { + const body = parse(z.object({ currentPassword: z.string().min(1).max(200), newPassword: password }), req.body); + const a = req.auth!; + await service.changePassword(a.userId, a.tenantId, a.sessionId, body.currentPassword, body.newPassword, req.auditMeta()); + return reply.code(204).send(); + }); + + app.get('/me', { preHandler: requireAuth(app) }, async (req) => { + const a = req.auth!; + const profile = await withTx(app.deps.pool, { tenantId: a.tenantId, userId: a.userId }, async (db) => { + const { rows: [u] } = await db.query<{ id: string; email: string; full_name: string; must_change_password: boolean }>( + `SELECT id, email, full_name, must_change_password FROM users WHERE id = $1`, [a.userId]); + const { rows: roles } = await db.query<{ id: string; code: string; name_ar: string; name_en: string }>( + `SELECT r.id, r.code, r.name_ar, r.name_en FROM user_roles ur JOIN roles r ON r.id = ur.role_id + WHERE ur.tenant_id = $1 AND ur.user_id = $2 AND r.deleted_at IS NULL ORDER BY r.code`, + [a.tenantId, a.userId]); + const { rows: [tenant] } = await db.query<{ id: string; name: string; status: string }>( + `SELECT id, name, status FROM tenants WHERE id = $1`, [a.tenantId]); + return { u: u!, roles, tenant: tenant! }; + }); + return { + user: { + id: profile.u.id, email: profile.u.email, fullName: profile.u.full_name, + mustChangePassword: profile.u.must_change_password, isPlatformAdmin: a.isPlatformAdmin, + }, + tenant: { ...profile.tenant, isOwner: a.isOwner }, + roles: profile.roles.map((r) => ({ id: r.id, code: r.code, nameAr: r.name_ar, nameEn: r.name_en })), + permissions: [...a.permissions].sort(), + memberships: await service.listMemberships(a.userId), + }; + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts b/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts new file mode 100644 index 000000000000..b4be4c25568f --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts @@ -0,0 +1,306 @@ +import { randomUUID } from 'node:crypto'; +import { withTx, type Db } from '../../db/tx.js'; +import { AppError, conflict, forbidden, unauthorized } from '../../lib/errors.js'; +import { getDummyHash, hashPassword, verifyPassword } from '../../lib/password.js'; +import { hashToken, newRefreshToken } from '../../lib/tokens.js'; +import type { Deps } from '../../types.js'; +import { writeAudit, type AuditMeta } from '../audit/audit.service.js'; + +export interface Membership { + tenantId: string; + tenantName: string; + tenantStatus: string; + isOwner: boolean; +} + +export interface IssuedTokens { + accessToken: string; + refreshToken: string; + expiresIn: number; + tenantId: string; + userId: string; +} + +export interface RegisterInput { + fullName: string; + email: string; + password: string; + tenantName: string; + companyName: string; + vatNumber?: string | null; + commercialRegistration?: string | null; +} + +export class AuthService { + constructor(private readonly deps: Deps) {} + + /** Self-service sign-up: creates the user, tenant, default company, main branch and warehouse. */ + async register(input: RegisterInput, meta: AuditMeta): Promise { + const passwordHash = await hashPassword(input.password); + const tenantId = randomUUID(); + const slug = `org-${tenantId.slice(0, 8)}`; + + // TODO(Phase 9): enforce plan limits and attach a trial subscription here. + const userId = await withTx(this.deps.pool, { tenantId, userId: null }, async (db) => { + const existing = await db.query('SELECT 1 FROM users WHERE email = $1', [input.email]); + if (existing.rowCount) throw conflict('EMAIL_TAKEN', 'An account with this e-mail already exists'); + + const { rows: [user] } = await db.query<{ id: string }>( + `INSERT INTO users (email, password_hash, full_name) VALUES ($1, $2, $3) RETURNING id`, + [input.email, passwordHash, input.fullName], + ); + const uid = user!.id; + await db.query(`SELECT set_config('app.user_id', $1, true)`, [uid]); + + await db.query(`INSERT INTO tenants (id, name, slug) VALUES ($1, $2, $3)`, [tenantId, input.tenantName, slug]); + await db.query(`INSERT INTO tenant_settings (tenant_id) VALUES ($1)`, [tenantId]); + await db.query( + `INSERT INTO user_tenants (tenant_id, user_id, is_owner) VALUES ($1, $2, true)`, + [tenantId, uid], + ); + await db.query( + `INSERT INTO user_roles (tenant_id, user_id, role_id, created_by) + SELECT $1, $2, id, $2 FROM roles WHERE code = 'TENANT_OWNER' AND tenant_id IS NULL`, + [tenantId, uid], + ); + const { rows: [company] } = await db.query<{ id: string }>( + `INSERT INTO companies (tenant_id, name, legal_name, vat_number, commercial_registration, created_by) + VALUES ($1, $2, $2, $3, $4, $5) RETURNING id`, + [tenantId, input.companyName, input.vatNumber ?? null, input.commercialRegistration ?? null, uid], + ); + const { rows: [branch] } = await db.query<{ id: string }>( + `INSERT INTO branches (tenant_id, company_id, code, name, is_main, created_by) + VALUES ($1, $2, 'MAIN', 'الفرع الرئيسي', true, $3) RETURNING id`, + [tenantId, company!.id, uid], + ); + await db.query( + `INSERT INTO warehouses (tenant_id, company_id, branch_id, code, name, created_by) + VALUES ($1, $2, $3, 'MAIN', 'المستودع الرئيسي', $4)`, + [tenantId, company!.id, branch!.id, uid], + ); + await writeAudit(db, { + tenantId, userId: uid, action: 'REGISTER', entityType: 'tenant', entityId: tenantId, + newValues: { tenantName: input.tenantName, companyName: input.companyName, email: input.email }, + }, meta); + return uid; + }); + + return this.issueSession(userId, tenantId, meta); + } + + async login(email: string, password: string, tenantId: string | undefined, meta: AuditMeta): Promise { + const { env, pool } = this.deps; + + const user = await withTx(pool, {}, async (db) => { + const { rows } = await db.query<{ + id: string; password_hash: string; status: string; deleted_at: Date | null; + failed_login_attempts: number; locked_until: Date | null; + }>( + `SELECT id, password_hash, status, deleted_at, failed_login_attempts, locked_until + FROM users WHERE email = $1`, + [email], + ); + return rows[0]; + }); + + if (!user) { + await verifyPassword(await getDummyHash(), password); + await this.auditFailedLogin(null, email, 'unknown_email', meta); + throw unauthorized('Invalid e-mail or password'); + } + if (user.locked_until && user.locked_until > new Date()) { + await this.auditFailedLogin(user.id, email, 'locked', meta); + throw new AppError(423, 'ACCOUNT_LOCKED', 'Too many failed attempts. Try again later.'); + } + + const ok = await verifyPassword(user.password_hash, password); + if (!ok) { + await withTx(pool, { userId: user.id }, async (db) => { + await db.query( + `UPDATE users SET failed_login_attempts = failed_login_attempts + 1, + locked_until = CASE WHEN failed_login_attempts + 1 >= $2 + THEN now() + make_interval(mins => $3) ELSE locked_until END + WHERE id = $1`, + [user.id, env.LOGIN_MAX_ATTEMPTS, env.LOGIN_LOCK_MINUTES], + ); + }); + await this.auditFailedLogin(user.id, email, 'bad_password', meta); + throw unauthorized('Invalid e-mail or password'); + } + if (user.status !== 'ACTIVE' || user.deleted_at) { + await this.auditFailedLogin(user.id, email, 'disabled', meta); + throw unauthorized('Account is disabled'); + } + + const memberships = await this.listMemberships(user.id); + const active = memberships.filter((m) => m.tenantStatus === 'ACTIVE'); + const target = tenantId ? active.find((m) => m.tenantId === tenantId) : active[0]; + if (!target) { + await this.auditFailedLogin(user.id, email, 'no_active_membership', meta); + throw forbidden('No active organization is available for this account'); + } + + await withTx(pool, { userId: user.id }, (db) => + db.query(`UPDATE users SET failed_login_attempts = 0, locked_until = NULL, last_login_at = now() WHERE id = $1`, [user.id]), + ); + return this.issueSession(user.id, target.tenantId, meta, 'LOGIN'); + } + + /** + * Rotates the refresh token. Presenting an already-rotated token means it + * was stolen or replayed, so every session of that user is revoked. + */ + async refresh(refreshToken: string, meta: AuditMeta): Promise { + const tokenHash = hashToken(refreshToken); + const { pool, env, tokens } = this.deps; + const newToken = newRefreshToken(); + + const result = await withTx(pool, {}, async (db) => { + const { rows: [s] } = await db.query<{ + id: string; user_id: string; tenant_id: string; expires_at: Date; revoked_at: Date | null; replaced_by: string | null; + }>( + `SELECT id, user_id, tenant_id, expires_at, revoked_at, replaced_by + FROM user_sessions WHERE token_hash = $1 FOR UPDATE`, + [tokenHash], + ); + if (!s) throw unauthorized('Invalid refresh token'); + if (s.revoked_at) { + // Handled after this transaction, because throwing here would roll back the revocation. + if (s.replaced_by) return { kind: 'reused', session: { id: s.id, user_id: s.user_id, tenant_id: s.tenant_id } } as const; + throw unauthorized('Invalid refresh token'); + } + if (s.expires_at < new Date()) throw unauthorized('Refresh token expired'); + + await db.query(`SELECT set_config('app.tenant_id', $1, true), set_config('app.user_id', $2, true)`, [s.tenant_id, s.user_id]); + await this.assertCanUseTenant(db, s.user_id, s.tenant_id); + + const { rows: [next] } = await db.query<{ id: string }>( + `INSERT INTO user_sessions (user_id, tenant_id, token_hash, expires_at, ip_address, user_agent) + VALUES ($1, $2, $3, now() + make_interval(days => $4), $5, $6) RETURNING id`, + [s.user_id, s.tenant_id, hashToken(newToken), env.REFRESH_TOKEN_TTL_DAYS, meta.ip ?? null, meta.userAgent ?? null], + ); + await db.query( + `UPDATE user_sessions SET revoked_at = now(), replaced_by = $2, last_used_at = now() WHERE id = $1`, + [s.id, next!.id], + ); + return { + kind: 'ok', + tokens: { + accessToken: await tokens.signAccess({ sub: s.user_id, tid: s.tenant_id, sid: next!.id }), + refreshToken: newToken, + expiresIn: env.ACCESS_TOKEN_TTL_SECONDS, + tenantId: s.tenant_id, + userId: s.user_id, + }, + } as const; + }); + + if (result.kind === 'reused') { + const s = result.session; + await withTx(pool, { tenantId: s.tenant_id, userId: s.user_id }, async (db) => { + await db.query(`UPDATE user_sessions SET revoked_at = now() WHERE user_id = $1 AND revoked_at IS NULL`, [s.user_id]); + await writeAudit(db, { tenantId: s.tenant_id, userId: s.user_id, action: 'TOKEN_REUSE_DETECTED', entityType: 'session', entityId: s.id }, meta); + }); + throw unauthorized('Invalid refresh token'); + } + return result.tokens; + } + + async logout(sessionId: string, userId: string, tenantId: string, meta: AuditMeta): Promise { + await withTx(this.deps.pool, { tenantId, userId }, async (db) => { + await db.query(`UPDATE user_sessions SET revoked_at = now() WHERE id = $1 AND user_id = $2 AND revoked_at IS NULL`, [sessionId, userId]); + await writeAudit(db, { tenantId, userId, action: 'LOGOUT', entityType: 'session', entityId: sessionId }, meta); + }); + } + + /** Moves the current session to another tenant the user belongs to. */ + async switchTenant(sessionId: string, userId: string, fromTenantId: string, toTenantId: string, meta: AuditMeta) { + const { pool, tokens, env } = this.deps; + await withTx(pool, { tenantId: toTenantId, userId }, async (db) => { + await this.assertCanUseTenant(db, userId, toTenantId); + await db.query(`UPDATE user_sessions SET tenant_id = $3 WHERE id = $1 AND user_id = $2`, [sessionId, userId, toTenantId]); + await writeAudit(db, { + tenantId: toTenantId, userId, action: 'TENANT_SWITCH', entityType: 'tenant', entityId: toTenantId, + oldValues: { tenantId: fromTenantId }, newValues: { tenantId: toTenantId }, + }, meta); + }); + return { + accessToken: await tokens.signAccess({ sub: userId, tid: toTenantId, sid: sessionId }), + expiresIn: env.ACCESS_TOKEN_TTL_SECONDS, + tenantId: toTenantId, + }; + } + + async changePassword(userId: string, tenantId: string, sessionId: string, current: string, next: string, meta: AuditMeta) { + const { pool } = this.deps; + const hash = await withTx(pool, { userId }, async (db) => + (await db.query<{ password_hash: string }>('SELECT password_hash FROM users WHERE id = $1', [userId])).rows[0]?.password_hash); + if (!hash || !(await verifyPassword(hash, current))) throw badCurrentPassword(); + if (current === next) throw new AppError(400, 'PASSWORD_REUSED', 'New password must differ from the current password'); + const newHash = await hashPassword(next); + await withTx(pool, { tenantId, userId }, async (db) => { + await db.query( + `UPDATE users SET password_hash = $2, password_changed_at = now(), must_change_password = false WHERE id = $1`, + [userId, newHash], + ); + // Sign out every other device. + await db.query(`UPDATE user_sessions SET revoked_at = now() WHERE user_id = $1 AND id <> $2 AND revoked_at IS NULL`, [userId, sessionId]); + await writeAudit(db, { tenantId, userId, action: 'PASSWORD_CHANGE', entityType: 'user', entityId: userId }, meta); + }); + } + + async listMemberships(userId: string): Promise { + return withTx(this.deps.pool, { userId }, async (db) => { + const { rows } = await db.query<{ tenant_id: string; name: string; status: string; is_owner: boolean }>( + `SELECT t.id AS tenant_id, t.name, t.status, ut.is_owner + FROM user_tenants ut JOIN tenants t ON t.id = ut.tenant_id + WHERE ut.user_id = $1 AND ut.status = 'ACTIVE' AND t.deleted_at IS NULL + ORDER BY ut.joined_at`, + [userId], + ); + return rows.map((r) => ({ tenantId: r.tenant_id, tenantName: r.name, tenantStatus: r.status, isOwner: r.is_owner })); + }); + } + + private async assertCanUseTenant(db: Db, userId: string, tenantId: string): Promise { + const { rows: [r] } = await db.query<{ member_status: string; tenant_status: string; user_status: string }>( + `SELECT ut.status AS member_status, t.status AS tenant_status, u.status AS user_status + FROM user_tenants ut JOIN tenants t ON t.id = ut.tenant_id JOIN users u ON u.id = ut.user_id + WHERE ut.user_id = $1 AND ut.tenant_id = $2 AND u.deleted_at IS NULL`, + [userId, tenantId], + ); + // Not-a-member and no-such-tenant look identical to the caller. + if (!r || r.member_status !== 'ACTIVE' || r.user_status !== 'ACTIVE') throw forbidden('No access to this organization'); + if (r.tenant_status !== 'ACTIVE') throw new AppError(403, 'TENANT_SUSPENDED', 'This organization is suspended'); + } + + private async issueSession(userId: string, tenantId: string, meta: AuditMeta, auditAction?: 'LOGIN'): Promise { + const { pool, env, tokens } = this.deps; + const refreshToken = newRefreshToken(); + const sessionId = await withTx(pool, { tenantId, userId }, async (db) => { + const { rows: [s] } = await db.query<{ id: string }>( + `INSERT INTO user_sessions (user_id, tenant_id, token_hash, expires_at, ip_address, user_agent) + VALUES ($1, $2, $3, now() + make_interval(days => $4), $5, $6) RETURNING id`, + [userId, tenantId, hashToken(refreshToken), env.REFRESH_TOKEN_TTL_DAYS, meta.ip ?? null, meta.userAgent ?? null], + ); + if (auditAction) { + await writeAudit(db, { tenantId, userId, action: auditAction, entityType: 'session', entityId: s!.id }, meta); + } + return s!.id; + }); + return { + accessToken: await tokens.signAccess({ sub: userId, tid: tenantId, sid: sessionId }), + refreshToken, + expiresIn: env.ACCESS_TOKEN_TTL_SECONDS, + tenantId, + userId, + }; + } + + private async auditFailedLogin(userId: string | null, email: string, reason: string, meta: AuditMeta) { + await withTx(this.deps.pool, { userId }, (db) => + writeAudit(db, { tenantId: null, userId, action: 'LOGIN_FAILED', newValues: { email, reason } }, meta)); + } +} + +const badCurrentPassword = () => new AppError(400, 'INVALID_CURRENT_PASSWORD', 'Current password is incorrect'); diff --git a/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts b/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts new file mode 100644 index 000000000000..dc6da4290713 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts @@ -0,0 +1,251 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { conflict, notFound } from '../../lib/errors.js'; +import { optionalText, parse, timezone, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { writeAudit } from '../audit/audit.service.js'; + +const companyFields = { + name: z.string().trim().min(2).max(200), + legalName: optionalText(200), + commercialRegistration: z.string().regex(/^\d{10}$/, 'Commercial registration must be 10 digits').nullish(), + vatNumber: z.string().regex(/^3\d{13}3$/, 'Saudi VAT number must be 15 digits starting and ending with 3').nullish(), + address: optionalText(500), + city: optionalText(100), + country: z.string().regex(/^[A-Z]{2}$/).optional(), + currency: z.string().regex(/^[A-Z]{3}$/).optional(), + timezone: timezone.optional(), + // TODO(Storage): logo upload endpoint. For now only an https URL is accepted. + logoUrl: z.url({ protocol: /^https$/ }).max(1000).nullish(), + email: z.string().trim().toLowerCase().pipe(z.email().max(254)).nullish(), + phone: z.string().regex(/^\+?[0-9 ()-]{6,20}$/).nullish(), +}; +const companyCreate = z.object(companyFields); +const companyUpdate = z.object({ ...companyFields, isActive: z.boolean() }).partial(); + +const COMPANY_COLUMNS: Record = { + name: 'name', legalName: 'legal_name', commercialRegistration: 'commercial_registration', + vatNumber: 'vat_number', address: 'address', city: 'city', country: 'country', currency: 'currency', + timezone: 'timezone', logoUrl: 'logo_url', email: 'email', phone: 'phone', isActive: 'is_active', +}; + +const COMPANY_SELECT = `SELECT id, name, legal_name AS "legalName", commercial_registration AS "commercialRegistration", + vat_number AS "vatNumber", address, city, country, currency, timezone, logo_url AS "logoUrl", email, phone, + is_active AS "isActive", created_at AS "createdAt", updated_at AS "updatedAt" FROM companies`; + +const branchFields = { + code: z.string().regex(/^[A-Za-z0-9_-]{1,20}$/), + name: z.string().trim().min(2).max(200), + address: optionalText(500), + city: optionalText(100), + phone: z.string().regex(/^\+?[0-9 ()-]{6,20}$/).nullish(), +}; +const BRANCH_COLUMNS: Record = { code: 'code', name: 'name', address: 'address', city: 'city', phone: 'phone', isActive: 'is_active' }; +const BRANCH_SELECT = `SELECT id, company_id AS "companyId", code, name, address, city, phone, is_main AS "isMain", + is_active AS "isActive", created_at AS "createdAt", updated_at AS "updatedAt" FROM branches`; + +const warehouseFields = { + code: z.string().regex(/^[A-Za-z0-9_-]{1,20}$/), + name: z.string().trim().min(2).max(200), + branchId: z.uuid().nullish(), + address: optionalText(500), +}; +const WAREHOUSE_COLUMNS: Record = { code: 'code', name: 'name', branchId: 'branch_id', address: 'address', isActive: 'is_active' }; +const WAREHOUSE_SELECT = `SELECT id, company_id AS "companyId", branch_id AS "branchId", code, name, address, + is_active AS "isActive", created_at AS "createdAt", updated_at AS "updatedAt" FROM warehouses`; + +/** Builds "col = $n" pairs only from whitelisted columns, so no input reaches SQL text. */ +function buildSet(body: Record, columns: Record, startAt: number) { + const sets: string[] = []; + const values: unknown[] = []; + for (const [key, col] of Object.entries(columns)) { + if (body[key] !== undefined) { + values.push(body[key]); + sets.push(`${col} = $${startAt + values.length - 1}`); + } + } + return { sets, values }; +} + +async function findOne(db: Db, select: string, tenantId: string, id: string): Promise { + const { rows } = await db.query(`${select} WHERE tenant_id = $1 AND id = $2 AND deleted_at IS NULL`, [tenantId, id]); + return rows[0] as T | undefined; +} + +async function assertCompany(db: Db, tenantId: string, companyId: string) { + if (!(await findOne(db, COMPANY_SELECT, tenantId, companyId))) throw notFound('Company'); +} + +export default async function companiesRoutes(app: FastifyInstance) { + const canView = requirePermission(app, 'company.view'); + const canManage = requirePermission(app, 'company.manage'); + + // Companies --------------------------------------------------------------- + app.get('/companies', { preHandler: canView }, async (req) => + req.tenantTx(async (db) => { + const { rows } = await db.query(`${COMPANY_SELECT} WHERE tenant_id = $1 AND deleted_at IS NULL ORDER BY created_at`, [req.auth!.tenantId]); + return { data: rows }; + })); + + app.get('/companies/:id', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + const company = await req.tenantTx((db) => findOne(db, COMPANY_SELECT, req.auth!.tenantId, id)); + if (!company) throw notFound('Company'); + return company; + }); + + app.post('/companies', { preHandler: canManage }, async (req, reply) => { + const body = parse(companyCreate, req.body); + const a = req.auth!; + // TODO(Phase 9): enforce the plan's company limit. + const company = await req.tenantTx(async (db) => { + const { sets, values } = buildSet(body, COMPANY_COLUMNS, 4); + const cols = sets.map((s) => s.split(' = ')[0]); + const { rows: [c] } = await db.query<{ id: string }>( + `INSERT INTO companies (tenant_id, created_by, updated_by${cols.map((c) => `, ${c}`).join('')}) + VALUES ($1, $2, $3${values.map((_, i) => `, $${i + 4}`).join('')}) RETURNING id`, + [a.tenantId, a.userId, a.userId, ...values]); + const created = await findOne(db, COMPANY_SELECT, a.tenantId, c!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'company', entityId: c!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return company; + }); + + app.patch('/companies/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(companyUpdate, req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await findOne(db, COMPANY_SELECT, a.tenantId, id); + if (!before) throw notFound('Company'); + const { sets, values } = buildSet(body, COMPANY_COLUMNS, 4); + if (sets.length) { + await db.query(`UPDATE companies SET ${sets.join(', ')}, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, + [a.tenantId, id, a.userId, ...values]); + } + const after = await findOne(db, COMPANY_SELECT, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'company', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + app.delete('/companies/:id', { preHandler: canManage }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + await req.tenantTx(async (db) => { + const before = await findOne(db, COMPANY_SELECT, a.tenantId, id); + if (!before) throw notFound('Company'); + const { rows: [count] } = await db.query<{ n: string }>( + `SELECT count(*) AS n FROM companies WHERE tenant_id = $1 AND deleted_at IS NULL`, [a.tenantId]); + if (Number(count!.n) <= 1) throw conflict('LAST_COMPANY', 'An organization must keep at least one company'); + // TODO(Phase 2): refuse when the company has posted journal entries. + await db.query(`UPDATE companies SET deleted_at = now(), is_active = false, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, [a.tenantId, id, a.userId]); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'company', entityId: id, oldValues: before }, req.auditMeta()); + }); + return reply.code(204).send(); + }); + + // Branches ---------------------------------------------------------------- + app.get('/companies/:id/branches', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx(async (db) => { + await assertCompany(db, req.auth!.tenantId, id); + const { rows } = await db.query(`${BRANCH_SELECT} WHERE tenant_id = $1 AND company_id = $2 AND deleted_at IS NULL ORDER BY is_main DESC, code`, [req.auth!.tenantId, id]); + return { data: rows }; + }); + }); + + app.post('/companies/:id/branches', { preHandler: canManage }, async (req, reply) => { + const { id: companyId } = parse(uuidParam, req.params); + const body = parse(z.object(branchFields), req.body); + const a = req.auth!; + // TODO(Phase 9): enforce the plan's branch limit. + const branch = await req.tenantTx(async (db) => { + await assertCompany(db, a.tenantId, companyId); + const { rows: [b] } = await db.query<{ id: string }>( + `INSERT INTO branches (tenant_id, company_id, code, name, address, city, phone, created_by, updated_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $8) RETURNING id`, + [a.tenantId, companyId, body.code, body.name, body.address ?? null, body.city ?? null, body.phone ?? null, a.userId]); + const created = await findOne(db, BRANCH_SELECT, a.tenantId, b!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'branch', entityId: b!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return branch; + }); + + app.patch('/branches/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ ...branchFields, isActive: z.boolean() }).partial(), req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await findOne(db, BRANCH_SELECT, a.tenantId, id); + if (!before) throw notFound('Branch'); + const { sets, values } = buildSet(body, BRANCH_COLUMNS, 4); + if (sets.length) { + await db.query(`UPDATE branches SET ${sets.join(', ')}, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, [a.tenantId, id, a.userId, ...values]); + } + const after = await findOne(db, BRANCH_SELECT, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'branch', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + // Warehouses -------------------------------------------------------------- + // Stock itself is handled by the Inventory Engine (Phase 5). + app.get('/companies/:id/warehouses', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx(async (db) => { + await assertCompany(db, req.auth!.tenantId, id); + const { rows } = await db.query(`${WAREHOUSE_SELECT} WHERE tenant_id = $1 AND company_id = $2 AND deleted_at IS NULL ORDER BY code`, [req.auth!.tenantId, id]); + return { data: rows }; + }); + }); + + app.post('/companies/:id/warehouses', { preHandler: canManage }, async (req, reply) => { + const { id: companyId } = parse(uuidParam, req.params); + const body = parse(z.object(warehouseFields), req.body); + const a = req.auth!; + // TODO(Phase 9): enforce the plan's warehouse limit. + const warehouse = await req.tenantTx(async (db) => { + await assertCompany(db, a.tenantId, companyId); + if (body.branchId) { + const b = await db.query(`SELECT 1 FROM branches WHERE tenant_id = $1 AND id = $2 AND company_id = $3 AND deleted_at IS NULL`, [a.tenantId, body.branchId, companyId]); + if (!b.rowCount) throw notFound('Branch'); + } + const { rows: [w] } = await db.query<{ id: string }>( + `INSERT INTO warehouses (tenant_id, company_id, branch_id, code, name, address, created_by, updated_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $7) RETURNING id`, + [a.tenantId, companyId, body.branchId ?? null, body.code, body.name, body.address ?? null, a.userId]); + const created = await findOne(db, WAREHOUSE_SELECT, a.tenantId, w!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'warehouse', entityId: w!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return warehouse; + }); + + app.patch('/warehouses/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ ...warehouseFields, isActive: z.boolean() }).partial(), req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await findOne<{ companyId: string }>(db, WAREHOUSE_SELECT, a.tenantId, id); + if (!before) throw notFound('Warehouse'); + if (body.branchId) { + const b = await db.query(`SELECT 1 FROM branches WHERE tenant_id = $1 AND id = $2 AND company_id = $3 AND deleted_at IS NULL`, [a.tenantId, body.branchId, before.companyId]); + if (!b.rowCount) throw notFound('Branch'); + } + const { sets, values } = buildSet(body, WAREHOUSE_COLUMNS, 4); + if (sets.length) { + await db.query(`UPDATE warehouses SET ${sets.join(', ')}, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, [a.tenantId, id, a.userId, ...values]); + } + const after = await findOne(db, WAREHOUSE_SELECT, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'warehouse', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts b/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts new file mode 100644 index 000000000000..36a7e6760a49 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts @@ -0,0 +1,162 @@ +/** + * Permission and system-role catalog. + * + * This file is the single source of truth. `npm run db:migrate` syncs it into + * the `permissions`, `roles` (system rows) and `role_permissions` tables. + * Tenants can create additional custom roles from these permissions. + * + * Permissions for modules delivered in later phases are defined now so that + * role definitions stay stable; the endpoints that check them arrive with + * their phase. + */ + +export interface PermissionDef { + code: string; + module: string; + ar: string; + en: string; +} + +export const PERMISSIONS: readonly PermissionDef[] = [ + // Phase 1 — platform foundations + { code: 'user.view', module: 'users', ar: 'عرض المستخدمين', en: 'View users' }, + { code: 'user.invite', module: 'users', ar: 'إضافة مستخدمين', en: 'Add users' }, + { code: 'user.manage', module: 'users', ar: 'إدارة المستخدمين وأدوارهم', en: 'Manage users and their roles' }, + { code: 'role.view', module: 'roles', ar: 'عرض الأدوار', en: 'View roles' }, + { code: 'role.manage', module: 'roles', ar: 'إدارة الأدوار والصلاحيات', en: 'Manage roles and permissions' }, + { code: 'company.view', module: 'companies', ar: 'عرض الشركات والفروع', en: 'View companies and branches' }, + { code: 'company.manage', module: 'companies', ar: 'إدارة الشركات والفروع والمستودعات', en: 'Manage companies, branches, and warehouses' }, + { code: 'settings.manage', module: 'settings', ar: 'إدارة الإعدادات', en: 'Manage settings' }, + { code: 'audit.view', module: 'audit', ar: 'عرض سجل التدقيق', en: 'View audit log' }, + { code: 'subscription.manage', module: 'subscriptions', ar: 'إدارة الاشتراك', en: 'Manage subscription' }, + + // Phase 2 — accounting + { code: 'account.view', module: 'accounting', ar: 'عرض دليل الحسابات', en: 'View chart of accounts' }, + { code: 'account.manage', module: 'accounting', ar: 'إدارة دليل الحسابات', en: 'Manage chart of accounts' }, + { code: 'journal.view', module: 'accounting', ar: 'عرض القيود', en: 'View journal entries' }, + { code: 'journal.create', module: 'accounting', ar: 'إنشاء القيود', en: 'Create journal entries' }, + { code: 'journal.post', module: 'accounting', ar: 'ترحيل القيود', en: 'Post journal entries' }, + { code: 'journal.reverse', module: 'accounting', ar: 'عكس القيود', en: 'Reverse journal entries' }, + { code: 'fiscal.manage', module: 'accounting', ar: 'إدارة السنوات والفترات المالية', en: 'Manage fiscal years and periods' }, + + // Phase 3–4 — sales, purchases, payments + { code: 'customer.view', module: 'sales', ar: 'عرض العملاء', en: 'View customers' }, + { code: 'customer.manage', module: 'sales', ar: 'إدارة العملاء', en: 'Manage customers' }, + { code: 'supplier.view', module: 'purchases', ar: 'عرض الموردين', en: 'View suppliers' }, + { code: 'supplier.manage', module: 'purchases', ar: 'إدارة الموردين', en: 'Manage suppliers' }, + { code: 'product.view', module: 'inventory', ar: 'عرض المنتجات', en: 'View products' }, + { code: 'product.manage', module: 'inventory', ar: 'إدارة المنتجات', en: 'Manage products' }, + { code: 'invoice.view', module: 'sales', ar: 'عرض الفواتير', en: 'View invoices' }, + { code: 'invoice.create', module: 'sales', ar: 'إنشاء الفواتير', en: 'Create invoices' }, + { code: 'invoice.edit', module: 'sales', ar: 'تعديل الفواتير (مسودة)', en: 'Edit draft invoices' }, + { code: 'invoice.delete', module: 'sales', ar: 'حذف الفواتير (مسودة)', en: 'Delete draft invoices' }, + { code: 'invoice.post', module: 'sales', ar: 'اعتماد الفواتير', en: 'Issue invoices' }, + { code: 'invoice.cancel', module: 'sales', ar: 'إلغاء الفواتير', en: 'Cancel invoices' }, + { code: 'purchase.view', module: 'purchases', ar: 'عرض المشتريات', en: 'View purchases' }, + { code: 'purchase.create', module: 'purchases', ar: 'إنشاء المشتريات', en: 'Create purchases' }, + { code: 'purchase.post', module: 'purchases', ar: 'اعتماد المشتريات', en: 'Post purchases' }, + { code: 'payment.view', module: 'payments', ar: 'عرض المدفوعات', en: 'View payments' }, + { code: 'payment.create', module: 'payments', ar: 'تسجيل المدفوعات', en: 'Record payments' }, + + // Phase 5–6 — inventory, expenses, tax + { code: 'inventory.view', module: 'inventory', ar: 'عرض المخزون', en: 'View inventory' }, + { code: 'inventory.adjust', module: 'inventory', ar: 'تسوية المخزون', en: 'Adjust inventory' }, + { code: 'inventory.transfer', module: 'inventory', ar: 'تحويل المخزون', en: 'Transfer inventory' }, + { code: 'expense.view', module: 'expenses', ar: 'عرض المصروفات', en: 'View expenses' }, + { code: 'expense.create', module: 'expenses', ar: 'إنشاء المصروفات', en: 'Create expenses' }, + { code: 'expense.post', module: 'expenses', ar: 'اعتماد المصروفات', en: 'Post expenses' }, + { code: 'tax.manage', module: 'tax', ar: 'إدارة الضرائب', en: 'Manage tax rates' }, + + // Phase 7–8 — reports, e-invoicing + { code: 'report.view', module: 'reports', ar: 'عرض التقارير', en: 'View reports' }, + { code: 'zatca.view', module: 'zatca', ar: 'عرض الفوترة الإلكترونية', en: 'View e-invoicing' }, + { code: 'zatca.manage', module: 'zatca', ar: 'إدارة الفوترة الإلكترونية', en: 'Manage e-invoicing' }, +] as const; + +export const ALL_PERMISSION_CODES = PERMISSIONS.map((p) => p.code); + +export interface SystemRoleDef { + code: string; + ar: string; + en: string; + permissions: readonly string[] | 'ALL'; +} + +const ADMIN_EXCLUDED = new Set(['subscription.manage']); + +/** + * SUPER_ADMIN is not a tenant role. Platform administration uses + * users.is_platform_admin and a separate /admin surface (Phase 9). + */ +export const SYSTEM_ROLES: readonly SystemRoleDef[] = [ + { code: 'TENANT_OWNER', ar: 'مالك المنشأة', en: 'Tenant owner', permissions: 'ALL' }, + { + code: 'COMPANY_ADMIN', + ar: 'مدير الشركة', + en: 'Company admin', + permissions: ALL_PERMISSION_CODES.filter((c) => !ADMIN_EXCLUDED.has(c)), + }, + { + code: 'ACCOUNTANT', + ar: 'محاسب', + en: 'Accountant', + permissions: [ + 'company.view', 'account.view', 'account.manage', 'journal.view', 'journal.create', + 'journal.post', 'journal.reverse', 'fiscal.manage', 'customer.view', 'supplier.view', + 'product.view', 'invoice.view', 'invoice.create', 'invoice.edit', 'invoice.post', + 'invoice.cancel', 'purchase.view', 'purchase.create', 'purchase.post', 'payment.view', + 'payment.create', 'inventory.view', 'expense.view', 'expense.create', 'expense.post', + 'tax.manage', 'report.view', 'zatca.view', + ], + }, + { + code: 'SALES_MANAGER', + ar: 'مدير المبيعات', + en: 'Sales manager', + permissions: [ + 'company.view', 'customer.view', 'customer.manage', 'product.view', 'invoice.view', + 'invoice.create', 'invoice.edit', 'invoice.delete', 'invoice.post', 'invoice.cancel', + 'payment.view', 'payment.create', 'inventory.view', 'report.view', 'zatca.view', + ], + }, + { + code: 'SALES_EMPLOYEE', + ar: 'موظف مبيعات', + en: 'Sales employee', + permissions: ['company.view', 'customer.view', 'product.view', 'invoice.view', 'invoice.create', 'invoice.edit'], + }, + { + code: 'PURCHASE_MANAGER', + ar: 'مدير المشتريات', + en: 'Purchase manager', + permissions: [ + 'company.view', 'supplier.view', 'supplier.manage', 'product.view', 'purchase.view', + 'purchase.create', 'purchase.post', 'payment.view', 'inventory.view', 'report.view', + ], + }, + { + code: 'WAREHOUSE_MANAGER', + ar: 'مدير المستودع', + en: 'Warehouse manager', + permissions: [ + 'company.view', 'product.view', 'product.manage', 'inventory.view', 'inventory.adjust', + 'inventory.transfer', 'report.view', + ], + }, + { + code: 'WAREHOUSE_EMPLOYEE', + ar: 'موظف مستودع', + en: 'Warehouse employee', + permissions: ['company.view', 'product.view', 'inventory.view', 'inventory.transfer'], + }, + { + code: 'VIEWER', + ar: 'مشاهد', + en: 'Viewer', + permissions: ALL_PERMISSION_CODES.filter((c) => c.endsWith('.view')), + }, +]; + +export function resolveRolePermissions(role: SystemRoleDef): string[] { + return role.permissions === 'ALL' ? [...ALL_PERMISSION_CODES] : [...role.permissions]; +} diff --git a/alshuyukh-accounting/apps/api/src/modules/rbac/rbac.routes.ts b/alshuyukh-accounting/apps/api/src/modules/rbac/rbac.routes.ts new file mode 100644 index 000000000000..5fbb9235e38b --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/rbac/rbac.routes.ts @@ -0,0 +1,171 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict, forbidden, notFound } from '../../lib/errors.js'; +import { parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import type { AuthContext } from '../../types.js'; +import { writeAudit } from '../audit/audit.service.js'; + +/** + * Resolves role IDs visible to the current tenant and the union of their + * permissions. Unknown, deleted, or other-tenant roles are rejected. + */ +export async function resolveRoles(db: Db, roleIds: string[]) { + const unique = [...new Set(roleIds)]; + if (unique.length === 0) return { roles: [], permissions: new Set() }; + const { rows } = await db.query<{ id: string; code: string; perms: string[] }>( + `SELECT r.id, r.code, COALESCE(array_agg(p.code) FILTER (WHERE p.code IS NOT NULL), '{}') AS perms + FROM roles r + LEFT JOIN role_permissions rp ON rp.role_id = r.id + LEFT JOIN permissions p ON p.id = rp.permission_id + WHERE r.id = ANY($1::uuid[]) AND r.deleted_at IS NULL + GROUP BY r.id, r.code`, + [unique], + ); + if (rows.length !== unique.length) throw badRequest('INVALID_ROLE', 'One or more roles do not exist'); + return { roles: rows, permissions: new Set(rows.flatMap((r) => r.perms)) }; +} + +/** Prevents privilege escalation: nobody can grant a permission they do not hold. */ +export function assertCanGrant(actor: AuthContext, permissions: Iterable) { + const missing = [...permissions].filter((p) => !actor.permissions.has(p)); + if (missing.length) throw forbidden(`You cannot grant permissions you do not have: ${missing.join(', ')}`); +} + +async function validPermissionIds(db: Db, codes: string[]) { + const { rows } = await db.query<{ id: string; code: string }>( + `SELECT id, code FROM permissions WHERE code = ANY($1::text[])`, [codes]); + const known = new Set(rows.map((r) => r.code)); + const unknown = codes.filter((c) => !known.has(c)); + if (unknown.length) throw badRequest('INVALID_PERMISSION', `Unknown permissions: ${unknown.join(', ')}`); + return rows.map((r) => r.id); +} + +const roleBody = z.object({ + code: z.string().trim().toUpperCase().regex(/^[A-Z][A-Z0-9_]{1,62}$/), + nameAr: z.string().trim().min(2).max(100), + nameEn: z.string().trim().min(2).max(100), + description: z.string().trim().max(500).nullish(), + permissions: z.array(z.string()).max(500), +}); + +type RoleRow = { id: string; code: string; name_ar: string; name_en: string; description: string | null; is_system: boolean; permissions: string[] }; + +const toRole = (r: RoleRow) => ({ + id: r.id, code: r.code, nameAr: r.name_ar, nameEn: r.name_en, + description: r.description, isSystem: r.is_system, permissions: r.permissions, +}); + +async function loadRole(db: Db, id: string): Promise { + const { rows } = await db.query( + `SELECT r.id, r.code, r.name_ar, r.name_en, r.description, r.is_system, + COALESCE(array_agg(p.code ORDER BY p.code) FILTER (WHERE p.code IS NOT NULL), '{}') AS permissions + FROM roles r + LEFT JOIN role_permissions rp ON rp.role_id = r.id + LEFT JOIN permissions p ON p.id = rp.permission_id + WHERE r.id = $1 AND r.deleted_at IS NULL + GROUP BY r.id`, + [id], + ); + return rows[0]; +} + +export default async function rbacRoutes(app: FastifyInstance) { + app.get('/permissions', { preHandler: requirePermission(app, 'role.view') }, async (req) => + req.tenantTx(async (db) => { + const { rows } = await db.query( + `SELECT code, module, description_ar AS "descriptionAr", description_en AS "descriptionEn" + FROM permissions ORDER BY module, code`); + return { data: rows }; + })); + + app.get('/roles', { preHandler: requirePermission(app, 'role.view') }, async (req) => + req.tenantTx(async (db) => { + const { rows } = await db.query( + `SELECT r.id, r.code, r.name_ar, r.name_en, r.description, r.is_system, + COALESCE(array_agg(p.code ORDER BY p.code) FILTER (WHERE p.code IS NOT NULL), '{}') AS permissions + FROM roles r + LEFT JOIN role_permissions rp ON rp.role_id = r.id + LEFT JOIN permissions p ON p.id = rp.permission_id + WHERE r.deleted_at IS NULL AND (r.tenant_id IS NULL OR r.tenant_id = $1) + GROUP BY r.id + ORDER BY r.is_system DESC, r.code`, + [req.auth!.tenantId]); + return { data: rows.map(toRole) }; + })); + + app.post('/roles', { preHandler: requirePermission(app, 'role.manage') }, async (req, reply) => { + const body = parse(roleBody, req.body); + const a = req.auth!; + const role = await req.tenantTx(async (db) => { + const sys = await db.query(`SELECT 1 FROM roles WHERE tenant_id IS NULL AND code = $1`, [body.code]); + if (sys.rowCount) throw conflict('ROLE_CODE_RESERVED', 'This code is reserved for a system role'); + const permIds = await validPermissionIds(db, body.permissions); + assertCanGrant(a, body.permissions); + const { rows: [r] } = await db.query<{ id: string }>( + `INSERT INTO roles (tenant_id, code, name_ar, name_en, description, is_system) + VALUES ($1, $2, $3, $4, $5, false) RETURNING id`, + [a.tenantId, body.code, body.nameAr, body.nameEn, body.description ?? null]); + await db.query( + `INSERT INTO role_permissions (role_id, permission_id) SELECT $1, unnest($2::uuid[])`, [r!.id, permIds]); + const created = (await loadRole(db, r!.id))!; + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: 'PERMISSION_CHANGE', entityType: 'role', entityId: r!.id, + newValues: toRole(created), + }, req.auditMeta()); + return created; + }); + reply.code(201); + return toRole(role); + }); + + app.patch('/roles/:id', { preHandler: requirePermission(app, 'role.manage') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(roleBody.omit({ code: true }).partial(), req.body); + const a = req.auth!; + const role = await req.tenantTx(async (db) => { + const before = await loadRole(db, id); + if (!before) throw notFound('Role'); + if (before.is_system) throw forbidden('System roles cannot be modified'); + // Editing a role you hold could strip your own access mid-session; allowed, + // but you also cannot remove permissions you are not allowed to grant. + assertCanGrant(a, before.permissions); + await db.query( + `UPDATE roles SET name_ar = COALESCE($2, name_ar), name_en = COALESCE($3, name_en), + description = CASE WHEN $4::boolean THEN $5 ELSE description END + WHERE id = $1`, + [id, body.nameAr ?? null, body.nameEn ?? null, body.description !== undefined, body.description ?? null]); + if (body.permissions) { + const permIds = await validPermissionIds(db, body.permissions); + assertCanGrant(a, body.permissions); + await db.query(`DELETE FROM role_permissions WHERE role_id = $1`, [id]); + await db.query(`INSERT INTO role_permissions (role_id, permission_id) SELECT $1, unnest($2::uuid[])`, [id, permIds]); + } + const after = (await loadRole(db, id))!; + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: 'PERMISSION_CHANGE', entityType: 'role', entityId: id, + oldValues: toRole(before), newValues: toRole(after), + }, req.auditMeta()); + return after; + }); + return toRole(role); + }); + + app.delete('/roles/:id', { preHandler: requirePermission(app, 'role.manage') }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + await req.tenantTx(async (db) => { + const before = await loadRole(db, id); + if (!before) throw notFound('Role'); + if (before.is_system) throw forbidden('System roles cannot be deleted'); + const used = await db.query(`SELECT 1 FROM user_roles WHERE role_id = $1 LIMIT 1`, [id]); + if (used.rowCount) throw conflict('ROLE_IN_USE', 'Remove this role from all users before deleting it'); + await db.query(`UPDATE roles SET deleted_at = now() WHERE id = $1`, [id]); + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'role', entityId: id, oldValues: toRole(before), + }, req.auditMeta()); + }); + return reply.code(204).send(); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts b/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts new file mode 100644 index 000000000000..9cd1b8f3533c --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts @@ -0,0 +1,44 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import { parse, timezone } from '../../lib/validation.js'; +import { requireAuth, requirePermission } from '../../plugins/auth.js'; +import { writeAudit } from '../audit/audit.service.js'; + +const SELECT = `SELECT t.name AS "tenantName", s.default_currency AS "defaultCurrency", s.timezone, s.locale, + s.fiscal_year_start_month AS "fiscalYearStartMonth", s.date_format AS "dateFormat", s.updated_at AS "updatedAt" + FROM tenant_settings s JOIN tenants t ON t.id = s.tenant_id WHERE s.tenant_id = $1`; + +const updateBody = z.object({ + tenantName: z.string().trim().min(2).max(200), + defaultCurrency: z.string().regex(/^[A-Z]{3}$/), + timezone, + locale: z.enum(['ar', 'en']), + fiscalYearStartMonth: z.number().int().min(1).max(12), + dateFormat: z.enum(['YYYY-MM-DD', 'DD/MM/YYYY', 'MM/DD/YYYY']), +}).partial(); + +export default async function settingsRoutes(app: FastifyInstance) { + app.get('/settings/tenant', { preHandler: requireAuth(app) }, async (req) => + req.tenantTx(async (db) => (await db.query(SELECT, [req.auth!.tenantId])).rows[0])); + + app.patch('/settings/tenant', { preHandler: requirePermission(app, 'settings.manage') }, async (req) => { + const body = parse(updateBody, req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = (await db.query(SELECT, [a.tenantId])).rows[0]; + if (body.tenantName) await db.query(`UPDATE tenants SET name = $2 WHERE id = $1`, [a.tenantId, body.tenantName]); + // TODO(Phase 2): block fiscalYearStartMonth changes once a fiscal year exists. + await db.query( + `UPDATE tenant_settings SET + default_currency = COALESCE($2, default_currency), timezone = COALESCE($3, timezone), + locale = COALESCE($4, locale), fiscal_year_start_month = COALESCE($5, fiscal_year_start_month), + date_format = COALESCE($6, date_format) + WHERE tenant_id = $1`, + [a.tenantId, body.defaultCurrency ?? null, body.timezone ?? null, body.locale ?? null, + body.fiscalYearStartMonth ?? null, body.dateFormat ?? null]); + const after = (await db.query(SELECT, [a.tenantId])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'SETTINGS_CHANGE', entityType: 'tenant_settings', entityId: a.tenantId, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/users/users.routes.ts b/alshuyukh-accounting/apps/api/src/modules/users/users.routes.ts new file mode 100644 index 000000000000..80ae9a62850d --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/users/users.routes.ts @@ -0,0 +1,149 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict, forbidden, notFound } from '../../lib/errors.js'; +import { hashPassword } from '../../lib/password.js'; +import { parse, password, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { writeAudit } from '../audit/audit.service.js'; +import { assertCanGrant, resolveRoles } from '../rbac/rbac.routes.js'; + +type MemberRow = { + id: string; email: string; full_name: string; user_status: string; member_status: string; + is_owner: boolean; last_login_at: Date | null; joined_at: Date; + roles: { id: string; code: string; nameAr: string; nameEn: string }[]; +}; + +const MEMBER_SELECT = ` + SELECT u.id, u.email, u.full_name, u.status AS user_status, ut.status AS member_status, + ut.is_owner, u.last_login_at, ut.joined_at, + COALESCE(json_agg(json_build_object('id', r.id, 'code', r.code, 'nameAr', r.name_ar, 'nameEn', r.name_en) + ORDER BY r.code) FILTER (WHERE r.id IS NOT NULL), '[]') AS roles + FROM user_tenants ut + JOIN users u ON u.id = ut.user_id + LEFT JOIN user_roles ur ON ur.tenant_id = ut.tenant_id AND ur.user_id = ut.user_id + LEFT JOIN roles r ON r.id = ur.role_id AND r.deleted_at IS NULL + WHERE ut.tenant_id = $1 AND u.deleted_at IS NULL`; + +const toMember = (m: MemberRow) => ({ + id: m.id, email: m.email, fullName: m.full_name, status: m.member_status === 'ACTIVE' && m.user_status === 'ACTIVE' ? 'ACTIVE' : 'DISABLED', + isOwner: m.is_owner, lastLoginAt: m.last_login_at, joinedAt: m.joined_at, roles: m.roles, +}); + +async function loadMember(db: Db, tenantId: string, userId: string) { + const { rows } = await db.query(`${MEMBER_SELECT} AND u.id = $2 GROUP BY u.id, ut.id`, [tenantId, userId]); + return rows[0]; +} + +const createBody = z.object({ + email: z.string().trim().toLowerCase().pipe(z.email().max(254)), + fullName: z.string().trim().min(2).max(200), + // Initial password for a new account. The user must change it at first login. + // TODO(Notification System): replace with an e-mailed invitation link. + initialPassword: password.optional(), + roleIds: z.array(z.uuid()).min(1).max(20), +}); + +export default async function usersRoutes(app: FastifyInstance) { + app.get('/users', { preHandler: requirePermission(app, 'user.view') }, async (req) => + req.tenantTx(async (db) => { + const { rows } = await db.query(`${MEMBER_SELECT} GROUP BY u.id, ut.id ORDER BY ut.joined_at`, [req.auth!.tenantId]); + return { data: rows.map(toMember) }; + })); + + app.get('/users/:id', { preHandler: requirePermission(app, 'user.view') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const member = await req.tenantTx((db) => loadMember(db, req.auth!.tenantId, id)); + if (!member) throw notFound('User'); + return toMember(member); + }); + + /** Adds a user to the tenant. Creates the account if the e-mail is new. */ + app.post('/users', { preHandler: requirePermission(app, 'user.invite', 'user.manage') }, async (req, reply) => { + const body = parse(createBody, req.body); + const a = req.auth!; + const passwordHash = body.initialPassword ? await hashPassword(body.initialPassword) : null; + // TODO(Phase 9): enforce the plan's user limit. + const member = await req.tenantTx(async (db) => { + const { permissions } = await resolveRoles(db, body.roleIds); + assertCanGrant(a, permissions); + + let { rows: [user] } = await db.query<{ id: string }>(`SELECT id FROM users WHERE email = $1 AND deleted_at IS NULL`, [body.email]); + let created = false; + if (!user) { + if (!passwordHash) throw badRequest('INITIAL_PASSWORD_REQUIRED', 'initialPassword is required for a new account'); + ({ rows: [user] } = await db.query<{ id: string }>( + `INSERT INTO users (email, password_hash, full_name, must_change_password) VALUES ($1, $2, $3, true) RETURNING id`, + [body.email, passwordHash, body.fullName])); + created = true; + } + const exists = await db.query(`SELECT 1 FROM user_tenants WHERE tenant_id = $1 AND user_id = $2`, [a.tenantId, user!.id]); + if (exists.rowCount) throw conflict('ALREADY_MEMBER', 'This user is already a member of the organization'); + + await db.query(`INSERT INTO user_tenants (tenant_id, user_id) VALUES ($1, $2)`, [a.tenantId, user!.id]); + await db.query( + `INSERT INTO user_roles (tenant_id, user_id, role_id, created_by) SELECT $1, $2, unnest($3::uuid[]), $4`, + [a.tenantId, user!.id, [...new Set(body.roleIds)], a.userId]); + const m = (await loadMember(db, a.tenantId, user!.id))!; + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'user', entityId: user!.id, + newValues: { email: body.email, accountCreated: created, roles: m.roles.map((r) => r.code) }, + }, req.auditMeta()); + return m; + }); + reply.code(201); + return toMember(member); + }); + + app.patch('/users/:id', { preHandler: requirePermission(app, 'user.manage') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ status: z.enum(['ACTIVE', 'DISABLED']) }), req.body); + const a = req.auth!; + if (id === a.userId) throw forbidden('You cannot change your own status'); + const member = await req.tenantTx(async (db) => { + const before = await loadMember(db, a.tenantId, id); + if (!before) throw notFound('User'); + if (before.is_owner) throw forbidden('The organization owner cannot be disabled'); + await db.query(`UPDATE user_tenants SET status = $3 WHERE tenant_id = $1 AND user_id = $2`, [a.tenantId, id, body.status]); + if (body.status === 'DISABLED') { + await db.query(`UPDATE user_sessions SET revoked_at = now() WHERE user_id = $1 AND tenant_id = $2 AND revoked_at IS NULL`, [id, a.tenantId]); + } + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'user', entityId: id, + oldValues: { status: before.member_status }, newValues: { status: body.status }, + }, req.auditMeta()); + return (await loadMember(db, a.tenantId, id))!; + }); + return toMember(member); + }); + + app.put('/users/:id/roles', { preHandler: requirePermission(app, 'user.manage') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ roleIds: z.array(z.uuid()).min(1).max(20) }), req.body); + const a = req.auth!; + if (id === a.userId) throw forbidden('You cannot change your own roles'); + const member = await req.tenantTx(async (db) => { + const before = await loadMember(db, a.tenantId, id); + if (!before) throw notFound('User'); + const { roles, permissions } = await resolveRoles(db, body.roleIds); + assertCanGrant(a, permissions); + // Removing a role is also a privilege change: you must hold everything it grants. + const removed = before.roles.filter((r) => !body.roleIds.includes(r.id)).map((r) => r.id); + if (removed.length) assertCanGrant(a, (await resolveRoles(db, removed)).permissions); + if (before.is_owner && !roles.some((r) => r.code === 'TENANT_OWNER')) { + throw forbidden('The organization owner must keep the TENANT_OWNER role'); + } + await db.query(`DELETE FROM user_roles WHERE tenant_id = $1 AND user_id = $2`, [a.tenantId, id]); + await db.query( + `INSERT INTO user_roles (tenant_id, user_id, role_id, created_by) SELECT $1, $2, unnest($3::uuid[]), $4`, + [a.tenantId, id, [...new Set(body.roleIds)], a.userId]); + const after = (await loadMember(db, a.tenantId, id))!; + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: 'PERMISSION_CHANGE', entityType: 'user', entityId: id, + oldValues: { roles: before.roles.map((r) => r.code) }, newValues: { roles: after.roles.map((r) => r.code) }, + }, req.auditMeta()); + return after; + }); + return toMember(member); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/plugins/auth.ts b/alshuyukh-accounting/apps/api/src/plugins/auth.ts new file mode 100644 index 000000000000..911d5ac1e38b --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/plugins/auth.ts @@ -0,0 +1,91 @@ +import type { FastifyInstance, FastifyRequest, preHandlerAsyncHookHandler } from 'fastify'; +import fp from 'fastify-plugin'; +import { withTx, type Db } from '../db/tx.js'; +import { AppError, forbidden, unauthorized } from '../lib/errors.js'; +import type { AuthContext } from '../types.js'; + +export async function loadPermissions(db: Db, tenantId: string, userId: string): Promise> { + const { rows } = await db.query<{ code: string }>( + `SELECT DISTINCT p.code + FROM user_roles ur + JOIN roles r ON r.id = ur.role_id AND r.deleted_at IS NULL + JOIN role_permissions rp ON rp.role_id = r.id + JOIN permissions p ON p.id = rp.permission_id + WHERE ur.tenant_id = $1 AND ur.user_id = $2`, + [tenantId, userId], + ); + return new Set(rows.map((r) => r.code)); +} + +/** + * Verifies the access token, then re-checks the database on every request: + * the session is not revoked, the user is active, the membership in the + * token's tenant is active, and the tenant is not suspended. Permissions are + * loaded fresh, so role changes apply immediately. + */ +async function authenticate(this: FastifyInstance, req: FastifyRequest): Promise { + if (req.auth) return; + const header = req.headers.authorization; + if (!header?.startsWith('Bearer ')) throw unauthorized(); + const claims = await this.deps.tokens.verifyAccess(header.slice(7)); + + req.auth = await withTx(this.deps.pool, { tenantId: claims.tid, userId: claims.sub }, async (db) => { + const { rows } = await db.query<{ + user_status: string; user_deleted: Date | null; is_platform_admin: boolean; + member_status: string; is_owner: boolean; tenant_status: string; + session_revoked: Date | null; session_expires: Date; session_tenant: string; + }>( + `SELECT u.status AS user_status, u.deleted_at AS user_deleted, u.is_platform_admin, + ut.status AS member_status, ut.is_owner, t.status AS tenant_status, + s.revoked_at AS session_revoked, s.expires_at AS session_expires, s.tenant_id AS session_tenant + FROM users u + JOIN user_tenants ut ON ut.user_id = u.id AND ut.tenant_id = $2 + JOIN tenants t ON t.id = ut.tenant_id + JOIN user_sessions s ON s.id = $3 AND s.user_id = u.id + WHERE u.id = $1`, + [claims.sub, claims.tid, claims.sid], + ); + const r = rows[0]; + if (!r || r.session_revoked || r.session_expires < new Date() || r.session_tenant !== claims.tid) { + throw unauthorized('Session is no longer valid'); + } + if (r.user_status !== 'ACTIVE' || r.user_deleted) throw unauthorized('Account is disabled'); + if (r.member_status !== 'ACTIVE') throw forbidden('Your access to this organization is disabled'); + if (r.tenant_status !== 'ACTIVE') throw new AppError(403, 'TENANT_SUSPENDED', 'This organization is suspended'); + + const ctx: AuthContext = { + userId: claims.sub, + tenantId: claims.tid, + sessionId: claims.sid, + isOwner: r.is_owner, + isPlatformAdmin: r.is_platform_admin, + permissions: await loadPermissions(db, claims.tid, claims.sub), + }; + return ctx; + }); +} + +export default fp(async (app) => { + app.decorate('authenticate', authenticate); + app.decorateRequest('auth', null); + app.decorateRequest('tenantTx', function (this: FastifyRequest, fn: (db: Db) => Promise) { + if (!this.auth) throw unauthorized(); + return withTx(app.deps.pool, { tenantId: this.auth.tenantId, userId: this.auth.userId }, fn); + }); + app.decorateRequest('auditMeta', function (this: FastifyRequest) { + return { ip: this.ip, userAgent: this.headers['user-agent'] ?? null, requestId: String(this.id) }; + }); +}); + +/** Route guard: authenticated and holding every listed permission. */ +export function requirePermission(app: FastifyInstance, ...codes: string[]): preHandlerAsyncHookHandler { + return async (req) => { + await app.authenticate(req); + const missing = codes.filter((c) => !req.auth!.permissions.has(c)); + if (missing.length) throw forbidden(`Missing permission: ${missing.join(', ')}`); + }; +} + +export function requireAuth(app: FastifyInstance): preHandlerAsyncHookHandler { + return async (req) => app.authenticate(req); +} diff --git a/alshuyukh-accounting/apps/api/src/server.ts b/alshuyukh-accounting/apps/api/src/server.ts new file mode 100644 index 000000000000..ead145003c16 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/server.ts @@ -0,0 +1,17 @@ +import { buildApp } from './app.js'; +import { loadEnv } from './config/env.js'; +import { createPool } from './db/pool.js'; + +const env = loadEnv(); +const pool = createPool(env.DATABASE_URL); +const app = await buildApp({ env, pool }); + +const shutdown = async () => { + await app.close(); + await pool.end(); + process.exit(0); +}; +process.on('SIGINT', shutdown); +process.on('SIGTERM', shutdown); + +await app.listen({ port: env.PORT, host: env.HOST }); diff --git a/alshuyukh-accounting/apps/api/src/types.ts b/alshuyukh-accounting/apps/api/src/types.ts new file mode 100644 index 000000000000..591506034834 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/types.ts @@ -0,0 +1,33 @@ +import type pg from 'pg'; +import type { Env } from './config/env.js'; +import type { Db } from './db/tx.js'; +import type { TokenService } from './lib/tokens.js'; +import type { AuditMeta } from './modules/audit/audit.service.js'; + +export interface Deps { + env: Env; + pool: pg.Pool; + tokens: TokenService; +} + +export interface AuthContext { + userId: string; + tenantId: string; + sessionId: string; + isOwner: boolean; + isPlatformAdmin: boolean; + permissions: ReadonlySet; +} + +declare module 'fastify' { + interface FastifyInstance { + deps: Deps; + authenticate: (req: FastifyRequest) => Promise; + } + interface FastifyRequest { + auth: AuthContext | null; + /** Runs fn in a transaction scoped to the authenticated user's tenant. */ + tenantTx(fn: (db: Db) => Promise): Promise; + auditMeta(): AuditMeta; + } +} diff --git a/alshuyukh-accounting/apps/api/test/audit.test.ts b/alshuyukh-accounting/apps/api/test/audit.test.ts new file mode 100644 index 000000000000..44a52de15074 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/audit.test.ts @@ -0,0 +1,75 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { client, login, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); +}); +afterAll(async () => { await t.close(); }); + +const logs = async (query = '') => (await client(t.app, owner.token).get(`/api/audit-logs?limit=200${query}`)).json().data as Array>; + +describe('audit log', () => { + it('records registration and login', async () => { + await login(t.app, owner.email); + const actions = (await logs()).map((l) => l.action); + expect(actions).toContain('REGISTER'); + expect(actions).toContain('LOGIN'); + }); + + it('records failed logins with the reason and request metadata', async () => { + await t.app.inject({ method: 'POST', url: '/api/auth/login', payload: { email: owner.email, password: 'Wrong-passw0rd' }, headers: { 'user-agent': 'audit-test' } }); + const { rows } = await t.ownerPool.query( + `SELECT new_values, user_agent, host(ip_address) AS ip FROM audit_logs WHERE action = 'LOGIN_FAILED' AND user_id = $1`, [owner.userId]); + expect(rows[0].new_values).toMatchObject({ reason: 'bad_password' }); + expect(rows[0].user_agent).toBe('audit-test'); + expect(rows[0].ip).toBe('127.0.0.1'); + }); + + it('records updates with old and new values', async () => { + const api = client(t.app, owner.token); + const company = (await api.get('/api/companies')).json().data[0]; + await api.patch(`/api/companies/${company.id}`, { city: 'الرياض' }); + const [entry] = await logs(`&entityId=${company.id}&action=UPDATE`); + expect(entry!.oldValues.city).toBeNull(); + expect(entry!.newValues.city).toBe('الرياض'); + expect(entry!.userId).toBe(owner.userId); + }); + + it('records settings and permission changes', async () => { + const api = client(t.app, owner.token); + await api.patch('/api/settings/tenant', { fiscalYearStartMonth: 7 }); + await api.post('/api/roles', { code: 'AUDIT_TEST', nameAr: 'اختبار', nameEn: 'Test', permissions: ['company.view'] }); + const actions = (await logs()).map((l) => l.action); + expect(actions).toContain('SETTINGS_CHANGE'); + expect(actions).toContain('PERMISSION_CHANGE'); + }); + + it('never stores password hashes or secrets', async () => { + await client(t.app, owner.token).post('/api/users', { + email: `aud-${Date.now()}@example.test`, fullName: 'Audit Member', initialPassword: 'Str0ng-Passw0rd!', + roleIds: [(await client(t.app, owner.token).get('/api/roles')).json().data.find((r: { code: string }) => r.code === 'VIEWER').id], + }); + const { rows } = await t.ownerPool.query(`SELECT old_values::text || new_values::text AS v FROM audit_logs WHERE tenant_id = $1`, [owner.tenantId]); + for (const r of rows) { + expect(r.v ?? '').not.toContain('argon2'); + expect(r.v ?? '').not.toContain('Str0ng-Passw0rd!'); + } + }); + + it('is append-only, even for the schema owner', async () => { + await expect(t.ownerPool.query(`UPDATE audit_logs SET action = 'TAMPERED' WHERE tenant_id = $1`, [owner.tenantId])).rejects.toThrow(/append-only/); + await expect(t.ownerPool.query(`DELETE FROM audit_logs WHERE tenant_id = $1`, [owner.tenantId])).rejects.toThrow(/append-only/); + }); + + it('paginates with a cursor', async () => { + const first = (await client(t.app, owner.token).get('/api/audit-logs?limit=2')).json(); + expect(first.data).toHaveLength(2); + expect(first.nextCursor).toBeTruthy(); + const second = (await client(t.app, owner.token).get(`/api/audit-logs?limit=2&cursor=${encodeURIComponent(first.nextCursor)}`)).json(); + expect(second.data[0].id).not.toBe(first.data[1].id); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/auth.test.ts b/alshuyukh-accounting/apps/api/test/auth.test.ts new file mode 100644 index 000000000000..2e7767f18cc0 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/auth.test.ts @@ -0,0 +1,147 @@ +import { randomUUID } from 'node:crypto'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { PASSWORD, client, login, refreshCookieOf, register, setupApp, type TestContext } from './helpers.js'; + +let t: TestContext; +beforeAll(async () => { t = await setupApp(); }); +afterAll(async () => { await t.close(); }); + +const refresh = (cookie: string, csrf = true) => + t.app.inject({ + method: 'POST', url: '/api/auth/refresh', + cookies: { ash_rt: cookie }, + headers: csrf ? { 'x-csrf-protection': '1' } : {}, + }); + +describe('registration', () => { + it('creates the user, tenant, settings, default company, main branch and warehouse', async () => { + const s = await register(t.app, { companyName: 'شركة الشيوخ التجارية', vatNumber: '300000000000003' }); + const api = client(t.app, s.token); + + const me = (await api.get('/api/auth/me')).json(); + expect(me.tenant.id).toBe(s.tenantId); + expect(me.tenant.isOwner).toBe(true); + expect(me.roles.map((r: { code: string }) => r.code)).toEqual(['TENANT_OWNER']); + expect(me.permissions).toContain('subscription.manage'); + + const companies = (await api.get('/api/companies')).json().data; + expect(companies).toHaveLength(1); + expect(companies[0]).toMatchObject({ name: 'شركة الشيوخ التجارية', currency: 'SAR', timezone: 'Asia/Riyadh', country: 'SA', vatNumber: '300000000000003' }); + + const branches = (await api.get(`/api/companies/${companies[0].id}/branches`)).json().data; + expect(branches).toEqual([expect.objectContaining({ code: 'MAIN', isMain: true })]); + const warehouses = (await api.get(`/api/companies/${companies[0].id}/warehouses`)).json().data; + expect(warehouses).toEqual([expect.objectContaining({ code: 'MAIN', branchId: branches[0].id })]); + + const settings = (await api.get('/api/settings/tenant')).json(); + expect(settings).toMatchObject({ defaultCurrency: 'SAR', timezone: 'Asia/Riyadh', locale: 'ar' }); + }); + + it('stores an argon2id hash, never the plain password', async () => { + const s = await register(t.app); + const { rows: [u] } = await t.ownerPool.query('SELECT password_hash FROM users WHERE id = $1', [s.userId]); + expect(u.password_hash).toMatch(/^\$argon2id\$/); + expect(u.password_hash).not.toContain(PASSWORD); + }); + + it('rejects a duplicate e-mail, weak password and malformed VAT number', async () => { + const s = await register(t.app); + const base = { fullName: 'X Y', tenantName: 'Org', companyName: 'Co' }; + const dup = await t.app.inject({ method: 'POST', url: '/api/auth/register', payload: { ...base, email: s.email, password: PASSWORD } }); + expect(dup.statusCode).toBe(409); + const weak = await t.app.inject({ method: 'POST', url: '/api/auth/register', payload: { ...base, email: `w-${randomUUID()}@example.test`, password: 'short' } }); + expect(weak.statusCode).toBe(400); + expect(weak.json().error.code).toBe('VALIDATION_ERROR'); + const vat = await t.app.inject({ method: 'POST', url: '/api/auth/register', payload: { ...base, email: `v-${randomUUID()}@example.test`, password: PASSWORD, vatNumber: '123' } }); + expect(vat.statusCode).toBe(400); + }); +}); + +describe('login', () => { + it('logs in with valid credentials (e-mail is case-insensitive)', async () => { + const s = await register(t.app); + const l = await login(t.app, s.email.toUpperCase()); + expect(l.tenantId).toBe(s.tenantId); + expect((await client(t.app, l.token).get('/api/auth/me')).statusCode).toBe(200); + }); + + it('returns the same 401 for a wrong password and an unknown e-mail', async () => { + const s = await register(t.app); + const wrong = await t.app.inject({ method: 'POST', url: '/api/auth/login', payload: { email: s.email, password: 'Wrong-passw0rd' } }); + const unknown = await t.app.inject({ method: 'POST', url: '/api/auth/login', payload: { email: `nobody-${randomUUID()}@example.test`, password: 'Wrong-passw0rd' } }); + expect(wrong.statusCode).toBe(401); + expect(unknown.statusCode).toBe(401); + expect(wrong.json().error.message).toBe(unknown.json().error.message); + }); + + it('locks the account after repeated failures', async () => { + const s = await register(t.app); + for (let i = 0; i < 5; i++) { + await t.app.inject({ method: 'POST', url: '/api/auth/login', payload: { email: s.email, password: 'Wrong-passw0rd' } }); + } + const res = await t.app.inject({ method: 'POST', url: '/api/auth/login', payload: { email: s.email, password: PASSWORD } }); + expect(res.statusCode).toBe(423); + }); + + it('rejects requests without a token or with a tampered token', async () => { + expect((await t.app.inject({ method: 'GET', url: '/api/companies' })).statusCode).toBe(401); + const s = await register(t.app); + const tampered = s.token.slice(0, -2) + (s.token.endsWith('AA') ? 'BB' : 'AA'); + expect((await client(t.app, tampered).get('/api/companies')).statusCode).toBe(401); + }); +}); + +describe('sessions', () => { + it('rotates the refresh token', async () => { + const s = await register(t.app); + const r1 = await refresh(s.refreshCookie); + expect(r1.statusCode).toBe(200); + const next = refreshCookieOf(r1); + expect(next).not.toBe(s.refreshCookie); + expect((await client(t.app, r1.json().accessToken).get('/api/auth/me')).statusCode).toBe(200); + }); + + it('requires the CSRF header on refresh', async () => { + const s = await register(t.app); + expect((await refresh(s.refreshCookie, false)).statusCode).toBe(400); + }); + + it('revokes all sessions when a rotated refresh token is reused', async () => { + const s = await register(t.app); + const r1 = await refresh(s.refreshCookie); + const newAccess = r1.json().accessToken; + const replay = await refresh(s.refreshCookie); + expect(replay.statusCode).toBe(401); + expect((await refresh(refreshCookieOf(r1))).statusCode).toBe(401); + expect((await client(t.app, newAccess).get('/api/auth/me')).statusCode).toBe(401); + expect((await client(t.app, s.token).get('/api/auth/me')).statusCode).toBe(401); + }); + + it('logout invalidates the access token immediately', async () => { + const s = await register(t.app); + const out = await t.app.inject({ method: 'POST', url: '/api/auth/logout', headers: { authorization: `Bearer ${s.token}`, 'x-csrf-protection': '1' } }); + expect(out.statusCode).toBe(204); + expect((await client(t.app, s.token).get('/api/auth/me')).statusCode).toBe(401); + expect((await refresh(s.refreshCookie)).statusCode).toBe(401); + }); + + it('changing the password signs out other sessions', async () => { + const s = await register(t.app); + const other = await login(t.app, s.email); + const res = await client(t.app, s.token).post('/api/auth/change-password', { currentPassword: PASSWORD, newPassword: 'An0ther-Strong-Pass' }); + expect(res.statusCode).toBe(204); + expect((await client(t.app, other.token).get('/api/auth/me')).statusCode).toBe(401); + expect((await client(t.app, s.token).get('/api/auth/me')).statusCode).toBe(200); + await login(t.app, s.email, 'An0ther-Strong-Pass'); + }); +}); + +describe('security headers', () => { + it('sets secure headers', async () => { + const res = await t.app.inject({ method: 'GET', url: '/api/health' }); + expect(res.statusCode).toBe(200); + expect(res.headers['x-content-type-options']).toBe('nosniff'); + expect(res.headers['content-security-policy']).toContain("default-src 'none'"); + expect(res.headers['strict-transport-security']).toBeDefined(); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/companies.test.ts b/alshuyukh-accounting/apps/api/test/companies.test.ts new file mode 100644 index 000000000000..5c6f68369501 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/companies.test.ts @@ -0,0 +1,85 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { client, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); +}); +afterAll(async () => { await t.close(); }); + +describe('companies, branches, warehouses', () => { + it('creates a company with Saudi defaults and validates input', async () => { + const api = client(t.app, owner.token); + const res = await api.post('/api/companies', { name: 'فرع جدة للتجارة', commercialRegistration: '4030000000', vatNumber: '311111111111113' }); + expect(res.statusCode).toBe(201); + expect(res.json()).toMatchObject({ currency: 'SAR', timezone: 'Asia/Riyadh', country: 'SA' }); + + expect((await api.post('/api/companies', { name: 'Bad TZ', timezone: 'Mars/Base' })).statusCode).toBe(400); + expect((await api.post('/api/companies', { name: 'Bad CR', commercialRegistration: '12' })).statusCode).toBe(400); + expect((await api.post('/api/companies', { name: 'فرع جدة للتجارة' })).statusCode).toBe(409); + }); + + it('enforces unique branch codes and a single main branch', async () => { + const api = client(t.app, owner.token); + const company = (await api.post('/api/companies', { name: `Co ${Date.now()}` })).json(); + expect((await api.post(`/api/companies/${company.id}/branches`, { code: 'RUH', name: 'الرياض' })).statusCode).toBe(201); + expect((await api.post(`/api/companies/${company.id}/branches`, { code: 'RUH', name: 'مكرر' })).statusCode).toBe(409); + }); + + it('soft-deletes a company but keeps at least one', async () => { + const api = client(t.app, owner.token); + const extra = (await api.post('/api/companies', { name: `Temp ${Date.now()}` })).json(); + expect((await api.del(`/api/companies/${extra.id}`)).statusCode).toBe(204); + expect((await api.get(`/api/companies/${extra.id}`)).statusCode).toBe(404); + const { rows } = await t.ownerPool.query('SELECT deleted_at FROM companies WHERE id = $1', [extra.id]); + expect(rows[0].deleted_at).not.toBeNull(); + + const fresh = await register(t.app); + const only = (await client(t.app, fresh.token).get('/api/companies')).json().data[0]; + expect((await client(t.app, fresh.token).del(`/api/companies/${only.id}`)).statusCode).toBe(409); + }); + + it('rejects a warehouse linked to a branch of another company', async () => { + const api = client(t.app, owner.token); + const c1 = (await api.post('/api/companies', { name: `C1 ${Date.now()}` })).json(); + const c2 = (await api.post('/api/companies', { name: `C2 ${Date.now()}` })).json(); + const b1 = (await api.post(`/api/companies/${c1.id}/branches`, { code: 'B1', name: 'Branch one' })).json(); + expect((await api.post(`/api/companies/${c2.id}/warehouses`, { code: 'W', name: 'Wrong', branchId: b1.id })).statusCode).toBe(404); + expect((await api.post(`/api/companies/${c1.id}/warehouses`, { code: 'W', name: 'Right', branchId: b1.id })).statusCode).toBe(201); + }); + + it('rejects unknown fields from reaching SQL and ignores tenant_id in the body', async () => { + const other = await register(t.app); + const api = client(t.app, owner.token); + const res = await api.post('/api/companies', { name: `Spoof ${Date.now()}`, tenantId: other.tenantId, tenant_id: other.tenantId }); + expect(res.statusCode).toBe(201); + const { rows } = await t.ownerPool.query('SELECT tenant_id FROM companies WHERE id = $1', [res.json().id]); + expect(rows[0].tenant_id).toBe(owner.tenantId); + }); +}); + +describe('multi-tenant membership', () => { + it('lets one user belong to two tenants and switch between them', async () => { + const t1 = await register(t.app, { tenantName: 'Org One' }); + const t2 = await register(t.app, { tenantName: 'Org Two' }); + const viewerRole = (await client(t.app, t2.token).get('/api/roles')).json().data.find((r: { code: string }) => r.code === 'VIEWER').id; + const add = await client(t.app, t2.token).post('/api/users', { email: t1.email, fullName: 'Shared', roleIds: [viewerRole] }); + expect(add.statusCode).toBe(201); + + const me = (await client(t.app, t1.token).get('/api/auth/me')).json(); + expect(me.memberships.map((m: { tenantName: string }) => m.tenantName).sort()).toEqual(['Org One', 'Org Two']); + + const sw = await client(t.app, t1.token).post('/api/auth/switch-tenant', { tenantId: t2.tenantId }); + expect(sw.statusCode).toBe(200); + const api2 = client(t.app, sw.json().accessToken); + const me2 = (await api2.get('/api/auth/me')).json(); + expect(me2.tenant.id).toBe(t2.tenantId); + expect(me2.roles.map((r: { code: string }) => r.code)).toEqual(['VIEWER']); + expect((await api2.post('/api/companies', { name: 'Not allowed' })).statusCode).toBe(403); + // The pre-switch token is bound to the old tenant and is no longer valid. + expect((await client(t.app, t1.token).get('/api/companies')).statusCode).toBe(401); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/env.ts b/alshuyukh-accounting/apps/api/test/env.ts new file mode 100644 index 000000000000..65ee97211c21 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/env.ts @@ -0,0 +1,13 @@ +import { existsSync } from 'node:fs'; +import { resolve } from 'node:path'; + +const envFile = resolve(import.meta.dirname, '../../../.env'); +if (existsSync(envFile)) process.loadEnvFile(envFile); + +if (!process.env.TEST_DATABASE_URL || !process.env.TEST_DATABASE_URL_MIGRATE) { + throw new Error('TEST_DATABASE_URL and TEST_DATABASE_URL_MIGRATE must be set (see .env.example)'); +} +process.env.NODE_ENV = 'test'; +process.env.DATABASE_URL = process.env.TEST_DATABASE_URL; +process.env.DATABASE_URL_MIGRATE = process.env.TEST_DATABASE_URL_MIGRATE; +process.env.JWT_SECRET ??= 'test-secret-that-is-long-enough-for-hs256-signing'; diff --git a/alshuyukh-accounting/apps/api/test/global-setup.ts b/alshuyukh-accounting/apps/api/test/global-setup.ts new file mode 100644 index 000000000000..3841cf080b28 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/global-setup.ts @@ -0,0 +1,14 @@ +import pg from 'pg'; +import { migrate } from '../src/db/migrate.js'; +import './env.js'; + +/** Rebuilds the test database schema from scratch, then applies all migrations. */ +export default async function setup() { + const url = process.env.TEST_DATABASE_URL_MIGRATE!; + if (!/_test\b/.test(new URL(url).pathname)) throw new Error('Refusing to reset a database whose name does not end in _test'); + const client = new pg.Client({ connectionString: url }); + await client.connect(); + await client.query('DROP SCHEMA public CASCADE; CREATE SCHEMA public;'); + await client.end(); + await migrate(url); +} diff --git a/alshuyukh-accounting/apps/api/test/helpers.ts b/alshuyukh-accounting/apps/api/test/helpers.ts new file mode 100644 index 000000000000..a19989fe2643 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/helpers.ts @@ -0,0 +1,80 @@ +import { randomUUID } from 'node:crypto'; +import type { FastifyInstance, LightMyRequestResponse } from 'fastify'; +import pg from 'pg'; +import { buildApp } from '../src/app.js'; +import { loadEnv } from '../src/config/env.js'; +import { createPool } from '../src/db/pool.js'; + +export interface TestContext { + app: FastifyInstance; + pool: pg.Pool; // restricted app role (RLS applies) + ownerPool: pg.Pool; // schema owner (bypasses RLS) — only for assertions + close(): Promise; +} + +export async function setupApp(): Promise { + const env = loadEnv(); + const pool = createPool(env.DATABASE_URL); + const ownerPool = createPool(process.env.DATABASE_URL_MIGRATE!); + const app = await buildApp({ env, pool, logger: false }); + await app.ready(); + return { app, pool, ownerPool, close: async () => { await app.close(); await pool.end(); await ownerPool.end(); } }; +} + +export const PASSWORD = 'Str0ng-Passw0rd!'; + +export interface Session { + token: string; + refreshCookie: string; + tenantId: string; + userId: string; + email: string; +} + +export function refreshCookieOf(res: LightMyRequestResponse): string { + const c = res.cookies.find((x) => x.name === 'ash_rt'); + if (!c) throw new Error('refresh cookie not set'); + return c.value; +} + +export async function register(app: FastifyInstance, overrides: Record = {}): Promise { + const email = `owner-${randomUUID()}@example.test`; + const res = await app.inject({ + method: 'POST', url: '/api/auth/register', + payload: { fullName: 'Test Owner', email, password: PASSWORD, tenantName: 'Test Org', companyName: `Company ${randomUUID().slice(0, 8)}`, ...overrides }, + }); + if (res.statusCode !== 201) throw new Error(`register failed: ${res.statusCode} ${res.body}`); + const body = res.json(); + return { token: body.accessToken, refreshCookie: refreshCookieOf(res), tenantId: body.tenantId, userId: body.userId, email }; +} + +export async function login(app: FastifyInstance, email: string, password = PASSWORD, tenantId?: string): Promise { + const res = await app.inject({ method: 'POST', url: '/api/auth/login', payload: { email, password, tenantId } }); + if (res.statusCode !== 200) throw new Error(`login failed: ${res.statusCode} ${res.body}`); + const body = res.json(); + return { token: body.accessToken, refreshCookie: refreshCookieOf(res), tenantId: body.tenantId, userId: body.userId, email }; +} + +/** Small request helper with a bearer token. */ +export function client(app: FastifyInstance, token: string) { + const call = (method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE') => (url: string, payload?: unknown) => + app.inject({ method, url, payload: payload as never, headers: { authorization: `Bearer ${token}` } }); + return { get: call('GET'), post: call('POST'), patch: call('PATCH'), put: call('PUT'), del: call('DELETE') }; +} + +export async function roleId(app: FastifyInstance, token: string, code: string): Promise { + const res = await client(app, token).get('/api/roles'); + const role = res.json().data.find((r: { code: string }) => r.code === code); + if (!role) throw new Error(`role ${code} not found`); + return role.id; +} + +/** Adds a member with the given system role and logs them in. */ +export async function addMember(app: FastifyInstance, owner: Session, roleCode: string): Promise { + const email = `${roleCode.toLowerCase()}-${randomUUID()}@example.test`; + const res = await client(app, owner.token).post('/api/users', { + email, fullName: `Member ${roleCode}`, initialPassword: PASSWORD, roleIds: [await roleId(app, owner.token, roleCode)], + }); + if (res.statusCode !== 201) throw new Error(`addMember failed: ${res.statusCode} ${res.body}`); + return login(app, email, PASSWORD, owner.tenantId); +} diff --git a/alshuyukh-accounting/apps/api/test/rbac.test.ts b/alshuyukh-accounting/apps/api/test/rbac.test.ts new file mode 100644 index 000000000000..dce3fee685e7 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/rbac.test.ts @@ -0,0 +1,135 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { ALL_PERMISSION_CODES, SYSTEM_ROLES, resolveRolePermissions } from '../src/modules/rbac/catalog.js'; +import { addMember, client, register, roleId, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; +let companyId: string; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); + companyId = (await client(t.app, owner.token).get('/api/companies')).json().data[0].id; +}); +afterAll(async () => { await t.close(); }); + +describe('catalog', () => { + it('only references permissions that exist', () => { + for (const role of SYSTEM_ROLES) { + for (const p of resolveRolePermissions(role)) expect(ALL_PERMISSION_CODES).toContain(p); + } + }); + + it('gives VIEWER read-only permissions', () => { + const viewer = SYSTEM_ROLES.find((r) => r.code === 'VIEWER')!; + expect(resolveRolePermissions(viewer).every((p) => p.endsWith('.view'))).toBe(true); + }); + + it('is synced to the database', async () => { + const { rows } = await t.ownerPool.query(`SELECT code FROM roles WHERE is_system ORDER BY code`); + expect(rows.map((r) => r.code).sort()).toEqual(SYSTEM_ROLES.map((r) => r.code).sort()); + }); +}); + +describe('permission checks', () => { + it('lets an accountant view companies but not create them or manage users', async () => { + const acc = await addMember(t.app, owner, 'ACCOUNTANT'); + const api = client(t.app, acc.token); + expect((await api.get('/api/companies')).statusCode).toBe(200); + expect((await api.post('/api/companies', { name: 'Nope' })).statusCode).toBe(403); + expect((await api.get('/api/users')).statusCode).toBe(403); + expect((await api.patch('/api/settings/tenant', { locale: 'en' })).statusCode).toBe(403); + expect((await api.get('/api/audit-logs')).statusCode).toBe(403); + }); + + it('lets a viewer read but not write', async () => { + const viewer = await addMember(t.app, owner, 'VIEWER'); + const api = client(t.app, viewer.token); + expect((await api.get('/api/users')).statusCode).toBe(200); + expect((await api.patch(`/api/companies/${companyId}`, { city: 'Riyadh' })).statusCode).toBe(403); + expect((await api.post(`/api/companies/${companyId}/branches`, { code: 'B2', name: 'Jeddah' })).statusCode).toBe(403); + }); + + it('applies role changes to existing tokens immediately', async () => { + const viewer = await addMember(t.app, owner, 'VIEWER'); + const api = client(t.app, viewer.token); + expect((await api.post(`/api/companies/${companyId}/branches`, { code: 'DMM', name: 'Dammam' })).statusCode).toBe(403); + const res = await client(t.app, owner.token).put(`/api/users/${viewer.userId}/roles`, { roleIds: [await roleId(t.app, owner.token, 'COMPANY_ADMIN')] }); + expect(res.statusCode).toBe(200); + expect((await api.post(`/api/companies/${companyId}/branches`, { code: 'DMM', name: 'Dammam' })).statusCode).toBe(201); + }); + + it('blocks a disabled member immediately', async () => { + const m = await addMember(t.app, owner, 'VIEWER'); + expect((await client(t.app, owner.token).patch(`/api/users/${m.userId}`, { status: 'DISABLED' })).statusCode).toBe(200); + expect((await client(t.app, m.token).get('/api/companies')).statusCode).toBe(401); + const relogin = await t.app.inject({ method: 'POST', url: '/api/auth/login', payload: { email: m.email, password: 'Str0ng-Passw0rd!' } }); + expect(relogin.statusCode).toBe(403); + }); +}); + +describe('privilege escalation', () => { + it('prevents a company admin from granting TENANT_OWNER', async () => { + const admin = await addMember(t.app, owner, 'COMPANY_ADMIN'); + const res = await client(t.app, admin.token).post('/api/users', { + email: `esc-${Date.now()}@example.test`, fullName: 'Escalate', initialPassword: 'Str0ng-Passw0rd!', + roleIds: [await roleId(t.app, owner.token, 'TENANT_OWNER')], + }); + expect(res.statusCode).toBe(403); + }); + + it('prevents creating a custom role with permissions the actor lacks', async () => { + const admin = await addMember(t.app, owner, 'COMPANY_ADMIN'); + const res = await client(t.app, admin.token).post('/api/roles', { + code: 'SNEAKY', nameAr: 'خفي', nameEn: 'Sneaky', permissions: ['subscription.manage'], + }); + expect(res.statusCode).toBe(403); + }); + + it('prevents users from changing their own roles or status', async () => { + const admin = await addMember(t.app, owner, 'COMPANY_ADMIN'); + const api = client(t.app, admin.token); + expect((await api.put(`/api/users/${admin.userId}/roles`, { roleIds: [await roleId(t.app, owner.token, 'VIEWER')] })).statusCode).toBe(403); + expect((await api.patch(`/api/users/${admin.userId}`, { status: 'DISABLED' })).statusCode).toBe(403); + }); + + it('protects the owner from being disabled or demoted', async () => { + const admin = await addMember(t.app, owner, 'COMPANY_ADMIN'); + const api = client(t.app, admin.token); + expect((await api.patch(`/api/users/${owner.userId}`, { status: 'DISABLED' })).statusCode).toBe(403); + expect((await api.put(`/api/users/${owner.userId}/roles`, { roleIds: [await roleId(t.app, owner.token, 'VIEWER')] })).statusCode).toBe(403); + }); + + it('refuses to modify or delete system roles', async () => { + const id = await roleId(t.app, owner.token, 'ACCOUNTANT'); + const api = client(t.app, owner.token); + expect((await api.patch(`/api/roles/${id}`, { nameEn: 'Changed' })).statusCode).toBe(403); + expect((await api.del(`/api/roles/${id}`)).statusCode).toBe(403); + }); +}); + +describe('custom roles', () => { + it('creates, assigns and soft-deletes a custom role', async () => { + const api = client(t.app, owner.token); + const created = await api.post('/api/roles', { + code: 'branch_auditor', nameAr: 'مدقق فروع', nameEn: 'Branch auditor', permissions: ['company.view', 'audit.view'], + }); + expect(created.statusCode).toBe(201); + expect(created.json()).toMatchObject({ code: 'BRANCH_AUDITOR', isSystem: false, permissions: ['audit.view', 'company.view'] }); + + const dup = await api.post('/api/roles', { code: 'BRANCH_AUDITOR', nameAr: 'مكرر', nameEn: 'Dup', permissions: [] }); + expect(dup.statusCode).toBe(409); + const reserved = await api.post('/api/roles', { code: 'VIEWER', nameAr: 'مشاهد', nameEn: 'Viewer', permissions: [] }); + expect(reserved.statusCode).toBe(409); + const unknown = await api.post('/api/roles', { code: 'BAD', nameAr: 'سيء', nameEn: 'Bad', permissions: ['does.not_exist'] }); + expect(unknown.statusCode).toBe(400); + + const m = await addMember(t.app, owner, 'VIEWER'); + await api.put(`/api/users/${m.userId}/roles`, { roleIds: [created.json().id] }); + expect((await api.del(`/api/roles/${created.json().id}`)).statusCode).toBe(409); + await api.put(`/api/users/${m.userId}/roles`, { roleIds: [await roleId(t.app, owner.token, 'VIEWER')] }); + expect((await api.del(`/api/roles/${created.json().id}`)).statusCode).toBe(204); + const roles = (await api.get('/api/roles')).json().data; + expect(roles.find((r: { code: string }) => r.code === 'BRANCH_AUDITOR')).toBeUndefined(); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/tenant-isolation.test.ts b/alshuyukh-accounting/apps/api/test/tenant-isolation.test.ts new file mode 100644 index 000000000000..820d2b0301ce --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/tenant-isolation.test.ts @@ -0,0 +1,121 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { withTx } from '../src/db/tx.js'; +import { client, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let a: Session; +let b: Session; +let companyA: { id: string }; +let branchA: { id: string }; + +beforeAll(async () => { + t = await setupApp(); + a = await register(t.app, { tenantName: 'Tenant A', companyName: 'Company A' }); + b = await register(t.app, { tenantName: 'Tenant B', companyName: 'Company B' }); + companyA = (await client(t.app, a.token).get('/api/companies')).json().data[0]; + branchA = (await client(t.app, a.token).get(`/api/companies/${companyA.id}/branches`)).json().data[0]; +}); +afterAll(async () => { await t.close(); }); + +describe('API-level isolation (tenant B attacking tenant A by ID)', () => { + it('lists only its own companies', async () => { + const list = (await client(t.app, b.token).get('/api/companies')).json().data; + expect(list.map((c: { name: string }) => c.name)).toEqual(['Company B']); + }); + + it('cannot read, update or delete another tenant\'s company (404, no existence leak)', async () => { + const api = client(t.app, b.token); + expect((await api.get(`/api/companies/${companyA.id}`)).statusCode).toBe(404); + expect((await api.patch(`/api/companies/${companyA.id}`, { name: 'Hacked' })).statusCode).toBe(404); + expect((await api.del(`/api/companies/${companyA.id}`)).statusCode).toBe(404); + const still = (await client(t.app, a.token).get(`/api/companies/${companyA.id}`)).json(); + expect(still.name).toBe('Company A'); + }); + + it('cannot list or create branches/warehouses under another tenant\'s company', async () => { + const api = client(t.app, b.token); + expect((await api.get(`/api/companies/${companyA.id}/branches`)).statusCode).toBe(404); + expect((await api.post(`/api/companies/${companyA.id}/branches`, { code: 'X1', name: 'Injected' })).statusCode).toBe(404); + expect((await api.patch(`/api/branches/${branchA.id}`, { name: 'Hacked' })).statusCode).toBe(404); + expect((await api.post(`/api/companies/${companyA.id}/warehouses`, { code: 'W1', name: 'Injected' })).statusCode).toBe(404); + }); + + it('cannot see or manage another tenant\'s users', async () => { + const api = client(t.app, b.token); + const users = (await api.get('/api/users')).json().data; + expect(users.map((u: { id: string }) => u.id)).toEqual([b.userId]); + expect((await api.get(`/api/users/${a.userId}`)).statusCode).toBe(404); + expect((await api.patch(`/api/users/${a.userId}`, { status: 'DISABLED' })).statusCode).toBe(404); + }); + + it('cannot read another tenant\'s audit log', async () => { + const logs = (await client(t.app, b.token).get('/api/audit-logs?limit=200')).json().data; + expect(logs.every((l: { userId: string | null }) => l.userId === b.userId)).toBe(true); + const byEntity = (await client(t.app, b.token).get(`/api/audit-logs?entityId=${a.tenantId}`)).json().data; + expect(byEntity).toEqual([]); + }); + + it('cannot switch into a tenant it is not a member of', async () => { + const res = await client(t.app, b.token).post('/api/auth/switch-tenant', { tenantId: a.tenantId }); + expect(res.statusCode).toBe(403); + }); + + it('cannot assign another tenant\'s custom role', async () => { + const role = await client(t.app, a.token).post('/api/roles', { code: 'A_ONLY', nameAr: 'دور خاص', nameEn: 'A only', permissions: ['company.view'] }); + expect(role.statusCode).toBe(201); + const res = await client(t.app, b.token).post('/api/users', { + email: 'victim@example.test', fullName: 'Victim', initialPassword: 'Str0ng-Passw0rd!', roleIds: [role.json().id], + }); + expect(res.statusCode).toBe(400); + expect(res.json().error.code).toBe('INVALID_ROLE'); + }); +}); + +describe('database-level isolation (Row-Level Security)', () => { + it('runs the API with a role that cannot bypass RLS', async () => { + const { rows: [r] } = await t.pool.query(`SELECT rolsuper, rolbypassrls FROM pg_roles WHERE rolname = current_user`); + expect(r).toEqual({ rolsuper: false, rolbypassrls: false }); + }); + + it('returns only the context tenant\'s rows even without a WHERE tenant_id filter', async () => { + const rows = await withTx(t.pool, { tenantId: b.tenantId, userId: b.userId }, async (db) => + (await db.query<{ tenant_id: string }>('SELECT tenant_id FROM companies')).rows); + expect(rows.length).toBeGreaterThan(0); + expect(rows.every((r) => r.tenant_id === b.tenantId)).toBe(true); + }); + + it('returns nothing when no tenant context is set', async () => { + const rows = await withTx(t.pool, {}, async (db) => (await db.query('SELECT id FROM companies')).rows); + expect(rows).toEqual([]); + }); + + it('rejects writing a row into another tenant', async () => { + await expect(withTx(t.pool, { tenantId: b.tenantId, userId: b.userId }, (db) => + db.query(`INSERT INTO companies (tenant_id, name) VALUES ($1, 'Injected')`, [a.tenantId]), + )).rejects.toThrow(/row-level security/); + }); + + it('rejects linking a branch to another tenant\'s company (composite FK)', async () => { + await expect(withTx(t.pool, { tenantId: b.tenantId, userId: b.userId }, (db) => + db.query(`INSERT INTO branches (tenant_id, company_id, code, name) VALUES ($1, $2, 'X', 'Injected')`, [b.tenantId, companyA.id]), + )).rejects.toThrow(/foreign key/); + }); + + it('makes cross-tenant UPDATEs affect zero rows', async () => { + const res = await withTx(t.pool, { tenantId: b.tenantId, userId: b.userId }, (db) => + db.query(`UPDATE companies SET name = 'Hacked' WHERE id = $1`, [companyA.id])); + expect(res.rowCount).toBe(0); + }); + + it('does not allow the app role to modify system roles', async () => { + const res = await withTx(t.pool, { tenantId: b.tenantId, userId: b.userId }, (db) => + db.query(`UPDATE roles SET name_en = 'pwned' WHERE code = 'TENANT_OWNER' AND tenant_id IS NULL`)); + expect(res.rowCount).toBe(0); + }); + + it('does not allow the app role to hard-delete business records', async () => { + await expect(withTx(t.pool, { tenantId: a.tenantId, userId: a.userId }, (db) => + db.query('DELETE FROM companies WHERE id = $1', [companyA.id]), + )).rejects.toThrow(/permission denied/); + }); +}); diff --git a/alshuyukh-accounting/apps/api/tsconfig.build.json b/alshuyukh-accounting/apps/api/tsconfig.build.json new file mode 100644 index 000000000000..077691c26883 --- /dev/null +++ b/alshuyukh-accounting/apps/api/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { "rootDir": "src", "outDir": "dist" }, + "include": ["src"] +} diff --git a/alshuyukh-accounting/apps/api/tsconfig.json b/alshuyukh-accounting/apps/api/tsconfig.json new file mode 100644 index 000000000000..0cbc993ccd23 --- /dev/null +++ b/alshuyukh-accounting/apps/api/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2023", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "noUncheckedIndexedAccess": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist", + "rootDir": ".", + "resolveJsonModule": true, + "types": ["node"] + }, + "include": ["src", "test", "vitest.config.ts"] +} diff --git a/alshuyukh-accounting/apps/api/vitest.config.ts b/alshuyukh-accounting/apps/api/vitest.config.ts new file mode 100644 index 000000000000..06d5b86cb772 --- /dev/null +++ b/alshuyukh-accounting/apps/api/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globalSetup: ['./test/global-setup.ts'], + setupFiles: ['./test/env.ts'], + fileParallelism: false, + testTimeout: 30_000, + hookTimeout: 60_000, + }, +}); diff --git a/alshuyukh-accounting/apps/web/index.html b/alshuyukh-accounting/apps/web/index.html new file mode 100644 index 000000000000..698ca1d538f8 --- /dev/null +++ b/alshuyukh-accounting/apps/web/index.html @@ -0,0 +1,14 @@ + + + + + + + + الشيوخ للمحاسبة + + +
+ + + diff --git a/alshuyukh-accounting/apps/web/package.json b/alshuyukh-accounting/apps/web/package.json new file mode 100644 index 000000000000..55c912ff1767 --- /dev/null +++ b/alshuyukh-accounting/apps/web/package.json @@ -0,0 +1,24 @@ +{ + "name": "@alshuyukh/web", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc --noEmit && vite build", + "typecheck": "tsc --noEmit", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.3.0", + "react-dom": "^19.3.0", + "react-router-dom": "^7.18.4" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.1", + "typescript": "^5.9", + "vite": "^8.3.2" + } +} diff --git a/alshuyukh-accounting/apps/web/src/App.tsx b/alshuyukh-accounting/apps/web/src/App.tsx new file mode 100644 index 000000000000..0150cc08cc6e --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/App.tsx @@ -0,0 +1,49 @@ +import { Navigate, Route, Routes } from 'react-router-dom'; +import { useAuth } from './auth'; +import Shell from './Shell'; +import AuditLog from './pages/AuditLog'; +import Companies from './pages/Companies'; +import ComingSoon from './pages/ComingSoon'; +import Home from './pages/Home'; +import Login from './pages/Login'; +import Register from './pages/Register'; +import Roles from './pages/Roles'; +import Settings from './pages/Settings'; +import Users from './pages/Users'; + +export default function App() { + const { me, loading } = useAuth(); + if (loading) return
جارٍ التحميل…
; + + if (!me) { + return ( + + } /> + } /> + + ); + } + + return ( + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/Shell.tsx b/alshuyukh-accounting/apps/web/src/Shell.tsx new file mode 100644 index 000000000000..1064ca222c46 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/Shell.tsx @@ -0,0 +1,69 @@ +import { useState } from 'react'; +import { NavLink, Outlet } from 'react-router-dom'; +import { useAuth } from './auth'; + +const NAV: { to: string; label: string; icon: string; phase?: number }[] = [ + { to: '/', label: 'الرئيسية', icon: '⌂' }, + { to: '/sales', label: 'المبيعات', icon: '↗', phase: 4 }, + { to: '/purchases', label: 'المشتريات', icon: '↙', phase: 4 }, + { to: '/inventory', label: 'المخزون', icon: '▦', phase: 5 }, + { to: '/customers', label: 'العملاء', icon: '☺', phase: 3 }, + { to: '/suppliers', label: 'الموردون', icon: '⚑', phase: 3 }, + { to: '/expenses', label: 'المصروفات', icon: '−', phase: 6 }, + { to: '/accounting', label: 'المحاسبة', icon: '⚖', phase: 2 }, + { to: '/reports', label: 'التقارير', icon: '▤', phase: 7 }, + { to: '/e-invoicing', label: 'الفوترة الإلكترونية', icon: '⎙', phase: 8 }, + { to: '/settings', label: 'الإعدادات', icon: '⚙' }, +]; + +export default function Shell() { + const { me, logout, switchTenant } = useAuth(); + const [open, setOpen] = useState(false); + if (!me) return null; + + return ( +
+ + {open &&
setOpen(false)} />} + +
+
+ +
+ {me.memberships.length > 1 ? ( + + ) : {me.tenant.name}} +
+
+ {me.user.fullName} + {me.roles.map((r) => r.nameAr).join('، ')} +
+ +
+
+ {me.user.mustChangePassword && ( +
يجب تغيير كلمة المرور المؤقتة من صفحة الإعدادات.
+ )} + +
+
+
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/api.ts b/alshuyukh-accounting/apps/web/src/api.ts new file mode 100644 index 000000000000..eb02d98ae569 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/api.ts @@ -0,0 +1,69 @@ +/** + * API client. The access token is kept in memory only (never localStorage). + * The refresh token lives in an HttpOnly cookie the browser sends to + * /api/auth/refresh; on a 401 the client refreshes once and retries. + */ +let accessToken: string | null = null; +let refreshing: Promise | null = null; +let onSessionExpired: () => void = () => {}; + +export const setAccessToken = (t: string | null) => { accessToken = t; }; +export const setSessionExpiredHandler = (fn: () => void) => { onSessionExpired = fn; }; + +export class ApiError extends Error { + constructor(public status: number, public code: string, message: string, public details?: { path: string; message: string }[]) { + super(message); + } +} + +export async function refreshSession(): Promise { + refreshing ??= (async () => { + try { + const res = await fetch('/api/auth/refresh', { method: 'POST', credentials: 'include', headers: { 'X-CSRF-Protection': '1' } }); + if (!res.ok) return false; + setAccessToken((await res.json()).accessToken); + return true; + } catch { + return false; + } finally { + setTimeout(() => { refreshing = null; }, 0); + } + })(); + return refreshing; +} + +export async function api(method: string, path: string, body?: unknown, retry = true): Promise { + const headers: Record = { 'X-CSRF-Protection': '1' }; + if (body !== undefined) headers['Content-Type'] = 'application/json'; + if (accessToken) headers.Authorization = `Bearer ${accessToken}`; + const res = await fetch(path, { method, headers, credentials: 'include', body: body === undefined ? undefined : JSON.stringify(body) }); + + if (res.status === 401 && retry && !path.startsWith('/api/auth/login') && !path.startsWith('/api/auth/register')) { + if (await refreshSession()) return api(method, path, body, false); + setAccessToken(null); + onSessionExpired(); + } + if (res.status === 204) return undefined as T; + const data = await res.json().catch(() => ({})); + if (!res.ok) { + const e = data?.error ?? {}; + throw new ApiError(res.status, e.code ?? 'ERROR', translateError(e.code, e.message), e.details); + } + return data as T; +} + +const MESSAGES: Record = { + UNAUTHORIZED: 'البريد الإلكتروني أو كلمة المرور غير صحيحة', + ACCOUNT_LOCKED: 'تم إيقاف الحساب مؤقتًا بسبب محاولات دخول فاشلة متكررة. حاول لاحقًا.', + EMAIL_TAKEN: 'يوجد حساب مسجل بهذا البريد الإلكتروني', + FORBIDDEN: 'لا تملك صلاحية تنفيذ هذا الإجراء', + NOT_FOUND: 'السجل غير موجود', + VALIDATION_ERROR: 'تحقق من البيانات المدخلة', + DUPLICATE: 'توجد قيمة مكررة لحقل يجب أن يكون فريدًا', + TENANT_SUSPENDED: 'تم تعليق هذه المنشأة', + ALREADY_MEMBER: 'المستخدم عضو في المنشأة بالفعل', + LAST_COMPANY: 'يجب أن تبقى شركة واحدة على الأقل', + ROLE_IN_USE: 'الدور مُسند لمستخدمين؛ أزله منهم أولًا', + INVALID_CURRENT_PASSWORD: 'كلمة المرور الحالية غير صحيحة', +}; +const translateError = (code?: string, fallback?: string) => (code && MESSAGES[code]) || fallback || 'حدث خطأ غير متوقع'; diff --git a/alshuyukh-accounting/apps/web/src/auth.tsx b/alshuyukh-accounting/apps/web/src/auth.tsx new file mode 100644 index 000000000000..77cf7633838e --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/auth.tsx @@ -0,0 +1,70 @@ +import { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from 'react'; +import { api, refreshSession, setAccessToken, setSessionExpiredHandler } from './api'; + +export interface Me { + user: { id: string; email: string; fullName: string; mustChangePassword: boolean }; + tenant: { id: string; name: string; status: string; isOwner: boolean }; + roles: { id: string; code: string; nameAr: string }[]; + permissions: string[]; + memberships: { tenantId: string; tenantName: string; isOwner: boolean }[]; +} + +interface AuthState { + me: Me | null; + loading: boolean; + can: (permission: string) => boolean; + login: (email: string, password: string) => Promise; + register: (data: Record) => Promise; + logout: () => Promise; + switchTenant: (tenantId: string) => Promise; + reload: () => Promise; +} + +const Ctx = createContext(null); + +export function AuthProvider({ children }: { children: ReactNode }) { + const [me, setMe] = useState(null); + const [loading, setLoading] = useState(true); + + const reload = useCallback(async () => setMe(await api('GET', '/api/auth/me')), []); + + useEffect(() => { + setSessionExpiredHandler(() => setMe(null)); + // Restore the session from the refresh cookie on page load. + refreshSession().then(async (ok) => { if (ok) await reload().catch(() => setMe(null)); }).finally(() => setLoading(false)); + }, [reload]); + + const value: AuthState = { + me, + loading, + can: (p) => !!me?.permissions.includes(p), + login: async (email, password) => { + const r = await api<{ accessToken: string }>('POST', '/api/auth/login', { email, password }); + setAccessToken(r.accessToken); + await reload(); + }, + register: async (data) => { + const r = await api<{ accessToken: string }>('POST', '/api/auth/register', data); + setAccessToken(r.accessToken); + await reload(); + }, + logout: async () => { + await api('POST', '/api/auth/logout').catch(() => undefined); + setAccessToken(null); + setMe(null); + }, + switchTenant: async (tenantId) => { + const r = await api<{ accessToken: string }>('POST', '/api/auth/switch-tenant', { tenantId }); + setAccessToken(r.accessToken); + await reload(); + }, + reload, + }; + return {children}; +} + +export function useAuth(): AuthState { + const v = useContext(Ctx); + if (!v) throw new Error('useAuth outside AuthProvider'); + return v; +} diff --git a/alshuyukh-accounting/apps/web/src/main.tsx b/alshuyukh-accounting/apps/web/src/main.tsx new file mode 100644 index 000000000000..e8b9acb2b9b5 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/main.tsx @@ -0,0 +1,16 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; +import App from './App'; +import { AuthProvider } from './auth'; +import './styles.css'; + +createRoot(document.getElementById('root')!).render( + + + + + + + , +); diff --git a/alshuyukh-accounting/apps/web/src/pages/AuditLog.tsx b/alshuyukh-accounting/apps/web/src/pages/AuditLog.tsx new file mode 100644 index 000000000000..65a9aa2059c5 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/AuditLog.tsx @@ -0,0 +1,67 @@ +import { Fragment, useState } from 'react'; +import { api } from '../api'; +import { ErrorBox, PageHeader, formatDateTime, useLoad } from '../ui'; + +interface Entry { id: string; action: string; entityType: string | null; entityId: string | null; userName: string | null; ipAddress: string | null; createdAt: string; oldValues: unknown; newValues: unknown } + +const ACTIONS: Record = { + REGISTER: 'تسجيل منشأة', LOGIN: 'تسجيل دخول', LOGOUT: 'تسجيل خروج', LOGIN_FAILED: 'دخول فاشل', + TOKEN_REUSE_DETECTED: 'إعادة استخدام رمز', TENANT_SWITCH: 'تبديل المنشأة', PASSWORD_CHANGE: 'تغيير كلمة المرور', + CREATE: 'إنشاء', UPDATE: 'تعديل', DELETE: 'حذف', SETTINGS_CHANGE: 'تغيير الإعدادات', PERMISSION_CHANGE: 'تغيير الصلاحيات', +}; + +export default function AuditLog() { + const [action, setAction] = useState(''); + const [cursor, setCursor] = useState(null); + const [open, setOpen] = useState(null); + const page = useLoad(() => { + const q = new URLSearchParams({ limit: '50' }); + if (action) q.set('action', action); + if (cursor) q.set('cursor', cursor); + return api<{ data: Entry[]; nextCursor: string | null }>('GET', `/api/audit-logs?${q}`); + }, [action, cursor]); + + return ( + <> + + + + +
+
+ + + + {page.data?.data.map((e) => ( + + setOpen(open === e.id ? null : e.id)}> + + + + + + + {open === e.id && ( + + )} + + ))} + +
الوقتالمستخدمالعمليةالكيانIP
{formatDateTime(e.createdAt)}{e.userName ?? '—'}{ACTIONS[e.action] ?? e.action}{e.entityType ?? '—'}{e.ipAddress ?? '—'}
+
+
قبل
{JSON.stringify(e.oldValues, null, 2)}
+
بعد
{JSON.stringify(e.newValues, null, 2)}
+
+
+
+
+ {cursor && } + {page.data?.nextCursor && } +
+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/ComingSoon.tsx b/alshuyukh-accounting/apps/web/src/pages/ComingSoon.tsx new file mode 100644 index 000000000000..3a474386ea58 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/ComingSoon.tsx @@ -0,0 +1,13 @@ +import { PageHeader } from '../ui'; + +export default function ComingSoon({ title, phase }: { title: string; phase: number }) { + return ( + <> + +
+

هذه الوحدة غير متاحة بعد، وسيتم بناؤها في المرحلة {phase}.

+

لا تُعرض هنا أي بيانات تجريبية.

+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Companies.tsx b/alshuyukh-accounting/apps/web/src/pages/Companies.tsx new file mode 100644 index 000000000000..ee8f5b3fe9d9 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Companies.tsx @@ -0,0 +1,133 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../api'; +import { useAuth } from '../auth'; +import { ErrorBox, PageHeader, useLoad } from '../ui'; + +interface Company { id: string; name: string; legalName: string | null; vatNumber: string | null; commercialRegistration: string | null; city: string | null; address: string | null; phone: string | null; email: string | null; currency: string } +interface Branch { id: string; code: string; name: string; city: string | null; isMain: boolean; isActive: boolean } +interface Warehouse { id: string; code: string; name: string; branchId: string | null; isActive: boolean } + +const nullIfEmpty = (v: FormDataEntryValue | null) => (v === null || String(v).trim() === '' ? null : String(v).trim()); + +export default function Companies() { + const { can } = useAuth(); + const companies = useLoad(() => api<{ data: Company[] }>('GET', '/api/companies')); + const [selected, setSelected] = useState(null); + const companyId = selected ?? companies.data?.data[0]?.id ?? null; + const company = companies.data?.data.find((c) => c.id === companyId); + const branches = useLoad(() => (companyId ? api<{ data: Branch[] }>('GET', `/api/companies/${companyId}/branches`) : Promise.resolve({ data: [] })), [companyId]); + const warehouses = useLoad(() => (companyId ? api<{ data: Warehouse[] }>('GET', `/api/companies/${companyId}/warehouses`) : Promise.resolve({ data: [] })), [companyId]); + const [error, setError] = useState(null); + const [saved, setSaved] = useState(false); + const manage = can('company.manage'); + + async function run(fn: () => Promise, after: () => void) { + setError(null); setSaved(false); + try { await fn(); setSaved(true); after(); } catch (err) { setError(err); } + } + + function saveCompany(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + void run(() => api('PATCH', `/api/companies/${companyId}`, { + name: String(f.get('name')), legalName: nullIfEmpty(f.get('legalName')), vatNumber: nullIfEmpty(f.get('vatNumber')), + commercialRegistration: nullIfEmpty(f.get('commercialRegistration')), city: nullIfEmpty(f.get('city')), + address: nullIfEmpty(f.get('address')), phone: nullIfEmpty(f.get('phone')), email: nullIfEmpty(f.get('email')), + }), companies.reload); + } + + function addBranch(e: FormEvent) { + e.preventDefault(); + const form = e.currentTarget; + const f = new FormData(form); + void run(() => api('POST', `/api/companies/${companyId}/branches`, { code: String(f.get('code')), name: String(f.get('name')), city: nullIfEmpty(f.get('city')) }), + () => { form.reset(); branches.reload(); }); + } + + function addWarehouse(e: FormEvent) { + e.preventDefault(); + const form = e.currentTarget; + const f = new FormData(form); + void run(() => api('POST', `/api/companies/${companyId}/warehouses`, { code: String(f.get('code')), name: String(f.get('name')), branchId: nullIfEmpty(f.get('branchId')) }), + () => { form.reset(); warehouses.reload(); }); + } + + return ( + <> + + {(companies.data?.data.length ?? 0) > 1 && ( + + )} + + + {saved &&
تم الحفظ
} + + {company && ( +
+

بيانات الشركة

+
+
+ + + + + + + + +
+

العملة: {company.currency}

+ {manage && } +
+
+ )} + +
+
+

الفروع

+ + + + {branches.data?.data.map((b) => ( + + ))} + +
الرمزالاسمالمدينة
{b.code}{b.name}{b.city ?? '—'}{b.isMain && رئيسي}
+ {manage && ( +
+ + + + +
+ )} +
+ +
+

المستودعات

+ + + + {warehouses.data?.data.map((w) => ( + + ))} + +
الرمزالاسمالفرع
{w.code}{w.name}{branches.data?.data.find((b) => b.id === w.branchId)?.name ?? '—'}
+ {manage && ( +
+ + + + +
+ )} +
+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Home.tsx b/alshuyukh-accounting/apps/web/src/pages/Home.tsx new file mode 100644 index 000000000000..5fcec2f8b972 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Home.tsx @@ -0,0 +1,46 @@ +import { Link } from 'react-router-dom'; +import { api } from '../api'; +import { useAuth } from '../auth'; +import { PageHeader, useLoad } from '../ui'; + +interface Company { id: string; name: string; vatNumber: string | null; commercialRegistration: string | null; city: string | null; currency: string } + +export default function Home() { + const { me, can } = useAuth(); + const companies = useLoad(() => (can('company.view') ? api<{ data: Company[] }>('GET', '/api/companies') : Promise.resolve({ data: [] }))); + const company = companies.data?.data[0]; + + const steps = [ + { done: !!company?.vatNumber, label: 'أضف الرقم الضريبي للشركة', to: '/settings/companies' }, + { done: !!company?.commercialRegistration, label: 'أضف رقم السجل التجاري', to: '/settings/companies' }, + { done: !!company?.city, label: 'أكمل عنوان الشركة', to: '/settings/companies' }, + ]; + + return ( + <> + +
+
+

المؤشرات المالية

+

+ تُحسب المبيعات والأرباح والذمم والنقدية من القيود المحاسبية المرحّلة فقط. + ستظهر هنا بعد تفعيل محرك المحاسبة في المرحلة 2. +

+
+ {company && can('company.manage') && ( +
+

إعداد الشركة

+
    + {steps.map((s) => ( +
  • + {s.done ? '✓' : '○'} + {s.done ? s.label : {s.label}} +
  • + ))} +
+
+ )} +
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Login.tsx b/alshuyukh-accounting/apps/web/src/pages/Login.tsx new file mode 100644 index 000000000000..bf7fb8542ee0 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Login.tsx @@ -0,0 +1,38 @@ +import { useState, type FormEvent } from 'react'; +import { Link } from 'react-router-dom'; +import { useAuth } from '../auth'; +import { ErrorBox } from '../ui'; + +export default function Login() { + const { login } = useAuth(); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + async function submit(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + setBusy(true); + setError(null); + try { + await login(String(f.get('email')), String(f.get('password'))); + } catch (err) { + setError(err); + } finally { + setBusy(false); + } + } + + return ( +
+
+
ش الشيوخ للمحاسبة
+

تسجيل الدخول

+ + + + +

ليس لديك حساب؟ أنشئ منشأة جديدة

+ +
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Register.tsx b/alshuyukh-accounting/apps/web/src/pages/Register.tsx new file mode 100644 index 000000000000..ef3dee0bdabf --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Register.tsx @@ -0,0 +1,49 @@ +import { useState, type FormEvent } from 'react'; +import { Link } from 'react-router-dom'; +import { useAuth } from '../auth'; +import { ErrorBox } from '../ui'; + +export default function Register() { + const { register } = useAuth(); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + async function submit(e: FormEvent) { + e.preventDefault(); + const f = Object.fromEntries(new FormData(e.currentTarget)) as Record; + setBusy(true); + setError(null); + try { + await register({ + fullName: f.fullName, email: f.email, password: f.password, + tenantName: f.companyName, companyName: f.companyName, + vatNumber: f.vatNumber || null, commercialRegistration: f.commercialRegistration || null, + }); + } catch (err) { + setError(err); + } finally { + setBusy(false); + } + } + + return ( +
+
+
ش الشيوخ للمحاسبة
+

إنشاء منشأة جديدة

+ + + + + +
+ + +
+ +

لديك حساب؟ تسجيل الدخول

+ +
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Roles.tsx b/alshuyukh-accounting/apps/web/src/pages/Roles.tsx new file mode 100644 index 000000000000..d2ca7e3d768a --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Roles.tsx @@ -0,0 +1,88 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../api'; +import { useAuth } from '../auth'; +import { ErrorBox, PageHeader, useLoad } from '../ui'; + +interface Role { id: string; code: string; nameAr: string; nameEn: string; isSystem: boolean; permissions: string[] } +interface Permission { code: string; module: string; descriptionAr: string } + +export default function Roles() { + const { can } = useAuth(); + const roles = useLoad(() => api<{ data: Role[] }>('GET', '/api/roles')); + const perms = useLoad(() => api<{ data: Permission[] }>('GET', '/api/permissions')); + const [open, setOpen] = useState(null); + const [error, setError] = useState(null); + const manage = can('role.manage'); + + const byModule = (perms.data?.data ?? []).reduce>((acc, p) => { + (acc[p.module] ??= []).push(p); + return acc; + }, {}); + const label = (code: string) => perms.data?.data.find((p) => p.code === code)?.descriptionAr ?? code; + + async function create(e: FormEvent) { + e.preventDefault(); + const form = e.currentTarget; + const f = new FormData(form); + setError(null); + try { + await api('POST', '/api/roles', { + code: String(f.get('code')), nameAr: String(f.get('nameAr')), nameEn: String(f.get('nameEn')), + permissions: f.getAll('permissions').map(String), + }); + form.reset(); + roles.reload(); + } catch (err) { setError(err); } + } + + async function remove(id: string) { + setError(null); + try { await api('DELETE', `/api/roles/${id}`); roles.reload(); } catch (err) { setError(err); } + } + + return ( + <> + + +
+ {roles.data?.data.map((r) => ( +
+ + {open === r.id && ( +
+
    {r.permissions.map((p) =>
  • {label(p)}
  • )}
+ {manage && !r.isSystem && } +
+ )} +
+ ))} +
+ + {manage && ( +
+

دور مخصص جديد

+
+ + + +
+

لا يمكنك منح صلاحيات لا تملكها.

+
+ {Object.entries(byModule).map(([mod, list]) => ( +
+ {mod} + {list.map((p) => )} +
+ ))} +
+ +
+ )} + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Settings.tsx b/alshuyukh-accounting/apps/web/src/pages/Settings.tsx new file mode 100644 index 000000000000..98f83f6205b0 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Settings.tsx @@ -0,0 +1,96 @@ +import { useState, type FormEvent } from 'react'; +import { Link } from 'react-router-dom'; +import { api } from '../api'; +import { useAuth } from '../auth'; +import { ErrorBox, PageHeader, useLoad } from '../ui'; + +interface TenantSettings { tenantName: string; defaultCurrency: string; timezone: string; locale: string; fiscalYearStartMonth: number; dateFormat: string } + +const MONTHS = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر']; + +export default function Settings() { + const { can, reload } = useAuth(); + const settings = useLoad(() => api('GET', '/api/settings/tenant')); + const [error, setError] = useState(null); + const [saved, setSaved] = useState(false); + const [pwError, setPwError] = useState(null); + const [pwSaved, setPwSaved] = useState(false); + const editable = can('settings.manage'); + + async function save(e: FormEvent) { + e.preventDefault(); + const f = Object.fromEntries(new FormData(e.currentTarget)) as Record; + setError(null); setSaved(false); + try { + await api('PATCH', '/api/settings/tenant', { + tenantName: f.tenantName, defaultCurrency: f.defaultCurrency, timezone: f.timezone, + fiscalYearStartMonth: Number(f.fiscalYearStartMonth), dateFormat: f.dateFormat, + }); + setSaved(true); + await reload(); + } catch (err) { setError(err); } + } + + async function changePassword(e: FormEvent) { + e.preventDefault(); + const form = e.currentTarget; + const f = Object.fromEntries(new FormData(form)) as Record; + setPwError(null); setPwSaved(false); + try { + await api('POST', '/api/auth/change-password', { currentPassword: f.currentPassword, newPassword: f.newPassword }); + setPwSaved(true); + form.reset(); + await reload(); + } catch (err) { setPwError(err); } + } + + const s = settings.data; + return ( + <> + +
+ {can('company.view') && الشركات والفروع والمستودعات} + {can('user.view') && المستخدمون} + {can('role.view') && الأدوار والصلاحيات} + {can('audit.view') && سجل التدقيق} +
+ + {s && ( +
+

إعدادات المنشأة

+ + {saved &&
تم الحفظ
} +
+ +
+ + + + +
+ {editable && } +
+ + )} + +
+

تغيير كلمة المرور

+ + {pwSaved &&
تم تغيير كلمة المرور وتسجيل الخروج من الأجهزة الأخرى
} +
+ + +
+ + + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/Users.tsx b/alshuyukh-accounting/apps/web/src/pages/Users.tsx new file mode 100644 index 000000000000..b1da6ef07751 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/Users.tsx @@ -0,0 +1,101 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../api'; +import { useAuth } from '../auth'; +import { ErrorBox, PageHeader, formatDateTime, useLoad } from '../ui'; + +interface Member { id: string; email: string; fullName: string; status: string; isOwner: boolean; lastLoginAt: string | null; roles: { id: string; code: string; nameAr: string }[] } +interface Role { id: string; code: string; nameAr: string; isSystem: boolean } + +export default function Users() { + const { me, can } = useAuth(); + const users = useLoad(() => api<{ data: Member[] }>('GET', '/api/users')); + const roles = useLoad(() => (can('role.view') ? api<{ data: Role[] }>('GET', '/api/roles') : Promise.resolve({ data: [] }))); + const [error, setError] = useState(null); + const [editing, setEditing] = useState(null); + const manage = can('user.manage'); + + async function run(fn: () => Promise) { + setError(null); + try { await fn(); users.reload(); return true; } catch (err) { setError(err); return false; } + } + + async function add(e: FormEvent) { + e.preventDefault(); + const form = e.currentTarget; + const f = new FormData(form); + const ok = await run(() => api('POST', '/api/users', { + email: String(f.get('email')), fullName: String(f.get('fullName')), + initialPassword: String(f.get('initialPassword')) || undefined, roleIds: [String(f.get('roleId'))], + })); + if (ok) form.reset(); + } + + async function saveRoles(e: FormEvent, userId: string) { + e.preventDefault(); + const roleIds = new FormData(e.currentTarget).getAll('roleIds').map(String); + if (await run(() => api('PUT', `/api/users/${userId}/roles`, { roleIds }))) setEditing(null); + } + + return ( + <> + + +
+
+ + + + {users.data?.data.map((u) => ( + + + + + + + + + ))} + +
الاسمالبريدالأدوارالحالةآخر دخول
{u.fullName} {u.isOwner && المالك}{u.email} + {editing === u.id ? ( +
saveRoles(e, u.id)} className="role-picker"> + {roles.data?.data.map((r) => ( + + ))} + + +
+ ) : u.roles.map((r) => r.nameAr).join('، ')} +
{u.status === 'ACTIVE' ? 'نشط' : 'معطّل'}{formatDateTime(u.lastLoginAt)} + {manage && u.id !== me?.user.id && !u.isOwner && ( + <> + + + + )} +
+
+
+ + {can('user.invite') && manage && ( +
+

إضافة مستخدم

+
+ + + + +
+ +
+ )} + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/styles.css b/alshuyukh-accounting/apps/web/src/styles.css new file mode 100644 index 000000000000..c87b0171a6d4 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/styles.css @@ -0,0 +1,169 @@ +:root { + --bg: #f4f6f8; + --surface: #ffffff; + --text: #17212b; + --muted: #5f6b7a; + --border: #dde3ea; + --primary: #0f6e5a; + --primary-ink: #ffffff; + --primary-soft: #e3f2ee; + --danger: #b42318; + --warn-bg: #fff6e0; + --warn-ink: #7a4b00; + --ok-bg: #e7f6ec; + --ok-ink: #17643a; + --err-bg: #fdecea; + --sidebar: #0e2a2f; + --sidebar-ink: #cfe0dd; + --radius: 10px; + --shadow: 0 1px 2px rgb(16 24 40 / 6%), 0 1px 3px rgb(16 24 40 / 8%); + color-scheme: light; +} + +* { box-sizing: border-box; } +html, body, #root { height: 100%; } +body { + margin: 0; + font-family: 'IBM Plex Sans Arabic', system-ui, -apple-system, 'Segoe UI', Tahoma, sans-serif; + background: var(--bg); + color: var(--text); + font-size: 15px; + line-height: 1.6; +} +a { color: var(--primary); } +h1 { font-size: 1.4rem; margin: 0; } +h2 { font-size: 1.05rem; margin: 0 0 12px; } +code, pre { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.85em; } +pre { white-space: pre-wrap; word-break: break-word; margin: 4px 0 0; background: var(--bg); padding: 8px; border-radius: 6px; } +.muted { color: var(--muted); } +.small { font-size: 0.82rem; } +.center-screen { display: grid; place-items: center; height: 100%; color: var(--muted); } + +/* Layout ------------------------------------------------------------------ */ +.shell { display: flex; min-height: 100%; } +.sidebar { + width: 248px; flex-shrink: 0; background: var(--sidebar); color: var(--sidebar-ink); + padding: 16px 12px; position: sticky; top: 0; height: 100vh; overflow-y: auto; +} +.brand { display: flex; align-items: center; gap: 10px; font-weight: 700; color: #fff; padding: 4px 8px 18px; } +.brand-lg { color: var(--text); justify-content: center; font-size: 1.15rem; padding-bottom: 8px; } +.brand-mark { + display: inline-grid; place-items: center; width: 34px; height: 34px; border-radius: 9px; + background: var(--primary); color: #fff; font-weight: 700; +} +.nav-item { + display: flex; align-items: center; gap: 10px; padding: 9px 10px; border-radius: 8px; + color: var(--sidebar-ink); text-decoration: none; margin-bottom: 2px; +} +.nav-item:hover { background: rgb(255 255 255 / 6%); } +.nav-item.active { background: rgb(255 255 255 / 12%); color: #fff; font-weight: 600; } +.nav-icon { width: 20px; text-align: center; opacity: 0.85; } +.badge-soon { margin-inline-start: auto; font-size: 0.7rem; padding: 1px 7px; border-radius: 99px; background: rgb(255 255 255 / 10%); } +.main { flex: 1; min-width: 0; display: flex; flex-direction: column; } +.topbar { + display: flex; align-items: center; gap: 16px; padding: 10px 24px; background: var(--surface); + border-bottom: 1px solid var(--border); position: sticky; top: 0; z-index: 5; +} +.topbar .tenant { flex: 1; } +.user { display: flex; flex-direction: column; text-align: end; line-height: 1.3; } +.user-name { font-weight: 600; } +.content { padding: 24px; max-width: 1200px; width: 100%; } +.page-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; } +.page-header .actions { display: flex; gap: 8px; } +.menu-btn, .scrim { display: none; } + +/* Components --------------------------------------------------------------- */ +.card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; box-shadow: var(--shadow); margin-bottom: 18px; } +.grid-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 18px; } +.grid-cards .card { margin-bottom: 0; } +.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; } +.empty { text-align: center; padding: 40px 20px; } + +.btn { + font: inherit; border: 1px solid var(--border); background: var(--surface); color: var(--text); + padding: 8px 16px; border-radius: 8px; cursor: pointer; font-weight: 500; +} +.btn:hover { border-color: var(--primary); } +.btn:disabled { opacity: 0.6; cursor: default; } +.btn-primary { background: var(--primary); border-color: var(--primary); color: var(--primary-ink); } +.btn-primary:hover { filter: brightness(1.08); } +.btn-ghost { background: transparent; border-color: transparent; } +.btn-danger { color: var(--danger); border-color: var(--danger); } +.btn-small { padding: 3px 10px; font-size: 0.85rem; } +.icon-btn { font: inherit; background: none; border: none; font-size: 1.3rem; cursor: pointer; } + +label { display: flex; flex-direction: column; gap: 4px; font-weight: 500; margin-bottom: 14px; font-size: 0.92rem; } +input, select { + font: inherit; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; + background: var(--surface); color: var(--text); min-width: 0; +} +input:focus, select:focus, .btn:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; } +input:invalid:not(:placeholder-shown):not(:focus) { border-color: var(--danger); } +fieldset { border: none; padding: 0; margin: 0; min-width: 0; } +.hint { font-weight: 400; font-size: 0.8rem; color: var(--muted); } +.check { flex-direction: row; align-items: center; gap: 8px; font-weight: 400; margin-bottom: 6px; } +.form .btn-primary { min-width: 120px; } + +.alert { padding: 10px 14px; border-radius: 8px; margin-bottom: 14px; } +.alert ul { margin: 6px 0 0; padding-inline-start: 18px; } +.alert-error { background: var(--err-bg); color: var(--danger); } +.alert-warn { background: var(--warn-bg); color: var(--warn-ink); } +.alert-ok { background: var(--ok-bg); color: var(--ok-ink); } + +.table-wrap { overflow-x: auto; } +.table { width: 100%; border-collapse: collapse; font-size: 0.92rem; } +.table th, .table td { text-align: start; padding: 10px 8px; border-bottom: 1px solid var(--border); vertical-align: top; } +.table th { color: var(--muted); font-weight: 600; font-size: 0.82rem; } +.table tr.clickable { cursor: pointer; } +.table tr.clickable:hover { background: var(--bg); } +.row-actions { display: flex; gap: 6px; white-space: nowrap; } +.tag { display: inline-block; padding: 1px 8px; border-radius: 99px; font-size: 0.78rem; background: var(--bg); border: 1px solid var(--border); } +.tag-ok { background: var(--ok-bg); color: var(--ok-ink); border-color: transparent; } +.tag-off { background: var(--err-bg); color: var(--danger); border-color: transparent; } +.inline-form { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 14px; } +.inline-form input, .inline-form select { flex: 1 1 120px; } +.pager { display: flex; justify-content: flex-end; gap: 8px; margin-top: 12px; } +.diff { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } + +.checklist { list-style: none; padding: 0; margin: 0; } +.checklist li { display: flex; gap: 10px; padding: 6px 0; } +.checklist li.done { color: var(--muted); } +.checklist li.done span { color: var(--ok-ink); } +.settings-links { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-bottom: 18px; } +.link-card { margin: 0; text-decoration: none; color: var(--text); font-weight: 600; } +.link-card:hover { border-color: var(--primary); } + +.role-row { border-bottom: 1px solid var(--border); } +.role-row:last-child { border-bottom: none; } +.role-head { all: unset; box-sizing: border-box; width: 100%; display: flex; gap: 14px; align-items: center; padding: 12px 4px; cursor: pointer; } +.role-head > span:first-child { font-weight: 600; flex: 1; } +.role-body { padding: 0 4px 14px; } +.perm-list { columns: 3 220px; margin: 0 0 10px; padding-inline-start: 18px; font-size: 0.88rem; } +.perm-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; margin-bottom: 14px; } +.perm-grid fieldset { border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px; } +.perm-grid legend { font-size: 0.8rem; color: var(--muted); padding: 0 4px; } +.role-picker { display: flex; flex-direction: column; gap: 2px; } + +.auth-page { min-height: 100%; display: grid; place-items: center; padding: 24px 16px; background: linear-gradient(160deg, #e3f2ee, var(--bg)); } +.auth-card { width: 100%; max-width: 460px; } +.auth-card h1 { text-align: center; margin-bottom: 18px; font-size: 1.2rem; } +.auth-card .btn-primary { width: 100%; padding: 10px; margin-top: 4px; } +.auth-card p { text-align: center; margin-bottom: 0; } + +/* Responsive --------------------------------------------------------------- */ +@media (max-width: 900px) { + .sidebar { + position: fixed; inset-block: 0; inset-inline-start: 0; z-index: 20; + transform: translateX(100%); transition: transform 0.2s ease; + } + .nav-open .sidebar { transform: none; } + .nav-open .scrim { display: block; position: fixed; inset: 0; background: rgb(0 0 0 / 35%); z-index: 15; } + .menu-btn { display: inline-block; } + .content { padding: 16px; } + .topbar { padding: 10px 16px; gap: 10px; } +} +@media (max-width: 600px) { + .grid-2, .diff { grid-template-columns: 1fr; } + .user { display: none; } + .grid-cards { grid-template-columns: 1fr; } +} diff --git a/alshuyukh-accounting/apps/web/src/ui.tsx b/alshuyukh-accounting/apps/web/src/ui.tsx new file mode 100644 index 000000000000..83b663e90a1d --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/ui.tsx @@ -0,0 +1,40 @@ +import { useEffect, useState, type ReactNode } from 'react'; +import { ApiError } from './api'; + +export function useLoad(load: () => Promise, deps: unknown[] = []) { + const [data, setData] = useState(null); + const [error, setError] = useState(null); + const [version, setVersion] = useState(0); + useEffect(() => { + let alive = true; + setError(null); + load().then((d) => alive && setData(d)).catch((e: Error) => alive && setError(e.message)); + return () => { alive = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [...deps, version]); + return { data, error, reload: () => setVersion((v) => v + 1) }; +} + +export function ErrorBox({ error }: { error: unknown }) { + if (!error) return null; + const msg = error instanceof Error ? error.message : String(error); + const details = error instanceof ApiError ? error.details : undefined; + return ( +
+ {msg} + {details &&
    {details.map((d) =>
  • {d.path}: {d.message}
  • )}
} +
+ ); +} + +export function PageHeader({ title, children }: { title: string; children?: ReactNode }) { + return ( +
+

{title}

+
{children}
+
+ ); +} + +export const formatDateTime = (iso: string | null) => + iso ? new Intl.DateTimeFormat('ar-SA-u-nu-latn', { dateStyle: 'medium', timeStyle: 'short', timeZone: 'Asia/Riyadh' }).format(new Date(iso)) : '—'; diff --git a/alshuyukh-accounting/apps/web/tsconfig.json b/alshuyukh-accounting/apps/web/tsconfig.json new file mode 100644 index 000000000000..ea31880993ac --- /dev/null +++ b/alshuyukh-accounting/apps/web/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "noUncheckedIndexedAccess": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["vite/client"] + }, + "include": ["src", "vite.config.ts"] +} diff --git a/alshuyukh-accounting/apps/web/vite.config.ts b/alshuyukh-accounting/apps/web/vite.config.ts new file mode 100644 index 000000000000..1466b85634ec --- /dev/null +++ b/alshuyukh-accounting/apps/web/vite.config.ts @@ -0,0 +1,10 @@ +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [react()], + server: { + port: 5173, + proxy: { '/api': 'http://localhost:3000' }, + }, +}); diff --git a/alshuyukh-accounting/docker-compose.yml b/alshuyukh-accounting/docker-compose.yml new file mode 100644 index 000000000000..5aaeadb64d3e --- /dev/null +++ b/alshuyukh-accounting/docker-compose.yml @@ -0,0 +1,13 @@ +services: + postgres: + image: postgres:16 + environment: + POSTGRES_PASSWORD: postgres + TZ: UTC + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + - ./scripts/db-setup.sql:/docker-entrypoint-initdb.d/01-setup.sql:ro +volumes: + pgdata: diff --git a/alshuyukh-accounting/docs/screenshots/03-home.png b/alshuyukh-accounting/docs/screenshots/03-home.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcaf77bb80283d48e1ec982619c50442f089fcc GIT binary patch literal 61640 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 H??3rBBiSP4 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/04-companies.png b/alshuyukh-accounting/docs/screenshots/04-companies.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff14bc60fb006751ac938e28bf1f1aa88a361c0 GIT binary patch literal 82985 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

iM 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 Jg-?v${2%b5s~P|R literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/05-users.png b/alshuyukh-accounting/docs/screenshots/05-users.png new file mode 100644 index 0000000000000000000000000000000000000000..65a9d7c94f968ba30e133b05f073cbff5ca46e4f GIT binary patch literal 75017 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

VAM%$^3~OS|g8 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�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 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/06-audit.png b/alshuyukh-accounting/docs/screenshots/06-audit.png new file mode 100644 index 0000000000000000000000000000000000000000..5458e161931af9c861f8619b82cee7f238fd0588 GIT binary patch literal 70366 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 z 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" + } + }, + "apps/api": { + "name": "@alshuyukh/api", + "version": "0.1.0", + "dependencies": { + "@fastify/cookie": "^11.1.2", + "@fastify/cors": "^11.3.0", + "@fastify/helmet": "^13.1.1", + "@fastify/rate-limit": "^11.2.0", + "argon2": "^0.45.1", + "fastify": "^5.12.5", + "fastify-plugin": "^5.1.0", + "jose": "^6.2.12", + "pg": "^8.23.1", + "zod": "^4.6.5" + }, + "devDependencies": { + "@types/node": "^22", + "@types/pg": "^8.23.1", + "tsx": "^4.23.15", + "typescript": "^5.9", + "vitest": "^5.0.3" + } + }, + "apps/api/node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "apps/web": { + "name": "@alshuyukh/web", + "version": "0.1.0", + "dependencies": { + "react": "^19.3.0", + "react-dom": "^19.3.0", + "react-router-dom": "^7.18.4" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.1", + "typescript": "^5.9", + "vite": "^8.3.2" + } + }, + "node_modules/@alshuyukh/api": { + "resolved": "apps/api", + "link": true + }, + "node_modules/@alshuyukh/web": { + "resolved": "apps/web", + "link": true + }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.6.tgz", + "integrity": "sha512-NtuzM0SfaMJbGlnjr9LWQUN5LzgSrbB8tf/wRZNas+4E1O/Nmzl53e7ruT61HDZyRCJGC6FxIogmNZO1c5ETBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^4.0.0" + } + }, + "node_modules/@fastify/cookie": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@fastify/cookie/-/cookie-11.1.2.tgz", + "integrity": "sha512-Dtrpk/YOGUsbRMvP/8ZqPpwnMRv0qSqodFdoQ2B589Obc7jw4s4Qla+cV72Bsm7WsZJnqlYFX/i7uSBq0xzg6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "cookie": "^2.0.0", + "fastify-plugin": "^6.0.0" + } + }, + "node_modules/@fastify/cors": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.3.0.tgz", + "integrity": "sha512-ggQGua+xHv1MvePbPr0v//xLYEsCXbWspquXCJS9Ot5YoRXq8J8ZWzHnxDBVnbtXosvistXo6LtNzOJswf64Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fastify-plugin": "^6.0.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.1.0.tgz", + "integrity": "sha512-PxcYtKLbQ8Z+yApiqjK8FwxIwvEj38k2OiLc17u8dkJSlmfi2wHHPaSnaoqBPQqtvF8YVsDgDpP2snDCfFrpfw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^7.0.0" + } + }, + "node_modules/@fastify/forwarded": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.2.tgz", + "integrity": "sha512-NE8HgKLgYejV9lDpqkEFaDKMLYelJBVfHekhB0UKvX0ghagXRJqg68feg8er1NPXxG4N9i6vPxzt8E+3wHfcmA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/helmet": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@fastify/helmet/-/helmet-13.1.1.tgz", + "integrity": "sha512-bSat5DTq8geASv8G6P0KW1UbltZ+xGD/zyd9S72pT7ogAHehcsWL85GdjMRCjDsExJvaEvgEZ52qU/2HXirVCw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fastify-plugin": "^6.0.0", + "helmet": "^8.0.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.1.tgz", + "integrity": "sha512-zv07Y9GEuDsJPegZoDFd4SDWaZOW8N2pa0GSrYmKpId/tjt1Hgo3BjZBVjdVpfVrHaA+Qv5jawtS2O50J5xM9g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@fastify/rate-limit": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@fastify/rate-limit/-/rate-limit-11.2.0.tgz", + "integrity": "sha512-X7osJd4XSvMoejYrnJkSZYYjY1eNYoBqhjlzf1RakC2204qExFqZFTKj5+T7VuzA/iUI9Z3UoSqQRkB2HpG0oQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@lukeed/ms": "^2.0.2", + "fastify-plugin": "^6.0.0", + "ip-address": "^10.2.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.152.0.tgz", + "integrity": "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.12.tgz", + "integrity": "sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.12.tgz", + "integrity": "sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.12.tgz", + "integrity": "sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.12.tgz", + "integrity": "sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.12.tgz", + "integrity": "sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.12.tgz", + "integrity": "sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.12.tgz", + "integrity": "sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.12.tgz", + "integrity": "sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.12.tgz", + "integrity": "sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.12.tgz", + "integrity": "sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.12.tgz", + "integrity": "sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.12.tgz", + "integrity": "sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.12.tgz", + "integrity": "sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.12.tgz", + "integrity": "sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.12.tgz", + "integrity": "sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.3.tgz", + "integrity": "sha512-T8sWAIbkSyAjkwTcaEc3Iu0o9A27X1/kdXrizhZkGuSKScRQtRzclfAMpOTcGdXCsqxeWlpGy3XjqaW8CpLORg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.3", + "estree-walker": "^3.0.3", + "magic-string": "^1.2.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/spy": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.3.tgz", + "integrity": "sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/argon2": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.45.1.tgz", + "integrity": "sha512-skm+/WCjkGqCQxF7FG1LuZXM5yvbFjgbfiCGsud2oLgaDhh6b6dbH0b1EkghbM+xx4Bj8Ape+KKgixoIlWZicQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@phc/format": "^1.0.0", + "cross-env": "^10.1.0", + "node-addon-api": "^8.9.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.3.0.tgz", + "integrity": "sha512-g2tQ7LE7oOSqDfwEm3M+ZCMTJc7KiZCdJ4UwyZJb5ckTKyYu50OYmvv0mCFXPuYXoM4zkSt8zM9XQ9KCvxA74A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, + "node_modules/chai": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-7.0.1.tgz", + "integrity": "sha512-eRSayARSbbwlBjpP4vnTTIRD5QPcIrmihPxDeN1DtKnHPg66UuJLx+8hlK1kaFdjvzyQ/dzALoi4vwAQ+T+iZA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^4.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.2.1.tgz", + "integrity": "sha512-TmHQgewjHtMq1E5QKA0tOE0yeYGQs25KZC/ziJpubRtWI15W92e6vPFydWOeZBVROSHBYw/QhD9d5OefdD6LDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastify": { + "version": "5.12.5", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.12.5.tgz", + "integrity": "sha512-OB2k1dlxs5/NAABqeKV2FUHkSD2BbENsCak8yULVcymn3fHIPDVa9TI3SDnJSWYSllZmSYuZXy2gTnsT+Sut1A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^7.0.0", + "find-my-way": "^9.6.0", + "light-my-request": "^6.0.0", + "pino": "^9.14.0 || ^10.1.0", + "process-warning": "^5.1.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastify-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", + "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-my-way": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.9.0.tgz", + "integrity": "sha512-sJsgZ1sQH2UDuowPuMKg8az7Qc8F0jnj+SKkFWU/+T0xcFlgV5skgXOGUqmQzOdmW6ALA7AhJINWx3qFBkbLHA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/helmet": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.3.0.tgz", + "integrity": "sha512-Qgpiaws3Sm30Av8Eah6sjMCZZwjlBu+E68rhpCWBshY1lb09HtLwj5GviX0OyQIn+ulUS0iX0AxN5n3tLZzz1w==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/EvanHahn" + } + }, + "node_modules/ip-address": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.3.tgz", + "integrity": "sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.5.0.tgz", + "integrity": "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jose": { + "version": "6.2.12", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz", + "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" + } + }, + "node_modules/light-my-request/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", + "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", + "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.14.1", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.16.1", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.1.tgz", + "integrity": "sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.1.tgz", + "integrity": "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.4.0.tgz", + "integrity": "sha512-bk1ZMTwG/Vymx+zPoa28MhNzucFvXJWp3csrSuxuHPSMeUettaCoQ5Jvg07mtC4JGNpcfTwz41oVCnNgBK9+vA==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^1.0.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-warning": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.0.tgz", + "integrity": "sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/react-router": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.4.tgz", + "integrity": "sha512-PUPQcMhMGRAslLcvtlPz/kmzBEWPhLdgLFrL7pLNepBL6dX0lWj4WD2cUYVgYCuT3jxvghYFg81cDTj44DhetQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.4.tgz", + "integrity": "sha512-yrfmJHIpDG7taCpqKjT1G5B6q3O2K+RN8/fgNf0lTjCwiPbQ0ei6vXX9ZjQR+7ld8Tr7Z5xmyMnZ8YJrphWQUw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.4" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/real-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", + "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.12.tgz", + "integrity": "sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.152.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.12", + "@rolldown/binding-android-arm64": "1.2.12", + "@rolldown/binding-darwin-arm64": "1.2.12", + "@rolldown/binding-darwin-x64": "1.2.12", + "@rolldown/binding-freebsd-x64": "1.2.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.12", + "@rolldown/binding-linux-arm64-gnu": "1.2.12", + "@rolldown/binding-linux-arm64-musl": "1.2.12", + "@rolldown/binding-linux-ppc64-gnu": "1.2.12", + "@rolldown/binding-linux-s390x-gnu": "1.2.12", + "@rolldown/binding-linux-x64-gnu": "1.2.12", + "@rolldown/binding-linux-x64-musl": "1.2.12", + "@rolldown/binding-openharmony-arm64": "1.2.12", + "@rolldown/binding-win32-arm64-msvc": "1.2.12", + "@rolldown/binding-win32-x64-msvc": "1.2.12" + } + }, + "node_modules/safe-regex2": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", + "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/std-env": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.3.0.tgz", + "integrity": "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==", + "dev": true, + "license": "MIT" + }, + "node_modules/thread-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", + "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", + "license": "MIT", + "dependencies": { + "real-require": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tinybench": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.0.tgz", + "integrity": "sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toad-cache": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz", + "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/tsx": { + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.2.tgz", + "integrity": "sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.11", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.3.tgz", + "integrity": "sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.3", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "^6.1.4", + "tinyexec": "^1.3.0", + "tinyglobby": "^0.2.17", + "why-is-node-running": "3.2.1" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.3", + "@vitest/browser-preview": "5.0.3", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.3", + "@vitest/coverage-v8": "5.0.3", + "@vitest/ui": "5.0.3", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-3.2.1.tgz", + "integrity": "sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==", + "dev": true, + "license": "MIT", + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=20.11" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/alshuyukh-accounting/package.json b/alshuyukh-accounting/package.json new file mode 100644 index 000000000000..0eb2be808908 --- /dev/null +++ b/alshuyukh-accounting/package.json @@ -0,0 +1,16 @@ +{ + "name": "alshuyukh-accounting", + "private": true, + "version": "0.1.0", + "description": "ALSHUYUKH ACCOUNTING — Saudi multi-tenant cloud accounting SaaS", + "workspaces": ["apps/api", "apps/web"], + "scripts": { + "dev:api": "npm run dev -w apps/api", + "dev:web": "npm run dev -w apps/web", + "db:migrate": "npm run db:migrate -w apps/api", + "test": "npm test -w apps/api", + "typecheck": "npm run typecheck -w apps/api && npm run typecheck -w apps/web", + "build": "npm run build -w apps/api && npm run build -w apps/web" + }, + "engines": { "node": ">=22" } +} diff --git a/alshuyukh-accounting/scripts/db-setup.sql b/alshuyukh-accounting/scripts/db-setup.sql new file mode 100644 index 000000000000..b9b0b8f091ea --- /dev/null +++ b/alshuyukh-accounting/scripts/db-setup.sql @@ -0,0 +1,28 @@ +-- Run once as a PostgreSQL superuser: +-- psql -U postgres -f scripts/db-setup.sql +-- +-- Two roles: +-- alshuyukh_owner : owns the schema, runs migrations. +-- alshuyukh_app : used by the API at runtime. NOT a superuser and has +-- NOBYPASSRLS, so PostgreSQL Row-Level Security applies. +-- Change the passwords for any non-local environment. + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'alshuyukh_owner') THEN + CREATE ROLE alshuyukh_owner LOGIN PASSWORD 'owner_dev_password' NOSUPERUSER NOCREATEROLE; + END IF; + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'alshuyukh_app') THEN + CREATE ROLE alshuyukh_app LOGIN PASSWORD 'app_dev_password' NOSUPERUSER NOCREATEROLE NOBYPASSRLS; + END IF; +END +$$; + +SELECT 'CREATE DATABASE alshuyukh OWNER alshuyukh_owner' +WHERE NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'alshuyukh')\gexec + +SELECT 'CREATE DATABASE alshuyukh_test OWNER alshuyukh_owner' +WHERE NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'alshuyukh_test')\gexec + +GRANT CONNECT ON DATABASE alshuyukh TO alshuyukh_app; +GRANT CONNECT ON DATABASE alshuyukh_test TO alshuyukh_app; From 7a685ac3395e31f4b8ca2612405d5284d1cfe36a Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 19:23:10 +0000 Subject: [PATCH 02/10] Add Phase 2: chart of accounts and accounting engine - Schema: fiscal years and periods (no overlaps), account groups, hierarchical chart of accounts, cost centers, journal entries and lines, gap-free numbering per fiscal year - Ledger rules enforced in the database as well as the API: balanced posting, open-period posting, postable active same-company accounts, posted entries immutable except for being marked reversed, no deletes - Engine: draft, post, reverse with linked correcting entry, year-end closing to retained earnings; works inside the caller's transaction so later documents (invoices, payments) post atomically - Default Saudi chart and current fiscal year created for every company; the engine finds accounts by system key, not code - Trial balance with opening, period, and closing columns - Arabic RTL screens: journal list, entry form with live balance, entry detail with post and reverse, chart, fiscal years, trial balance - Fixes found while testing: premature red borders on required inputs, error box crash on structured error details, save-and-post sending a draft - 40 new tests (94 total) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RiHbDZ5HpzN6NRCMJmydEq --- alshuyukh-accounting/README.md | 134 ++++- alshuyukh-accounting/apps/api/package.json | 1 + alshuyukh-accounting/apps/api/src/app.ts | 12 +- .../api/src/db/migrations/0007_accounting.sql | 484 ++++++++++++++++++ .../apps/api/src/lib/dates.ts | 25 + .../apps/api/src/lib/money.ts | 20 + .../src/modules/accounting/accounts.routes.ts | 242 +++++++++ .../src/modules/accounting/chart-template.ts | 71 +++ .../src/modules/accounting/company-context.ts | 17 + .../apps/api/src/modules/accounting/engine.ts | 402 +++++++++++++++ .../src/modules/accounting/fiscal.routes.ts | 83 +++ .../src/modules/accounting/journal.routes.ts | 132 +++++ .../apps/api/src/modules/accounting/setup.ts | 102 ++++ .../accounting/trial-balance.routes.ts | 70 +++ .../api/src/modules/audit/audit.service.ts | 3 +- .../apps/api/src/modules/auth/auth.service.ts | 2 + .../src/modules/companies/companies.routes.ts | 7 +- .../src/modules/settings/settings.routes.ts | 6 +- .../apps/api/test/audit.test.ts | 2 +- .../apps/api/test/chart-of-accounts.test.ts | 133 +++++ .../apps/api/test/fiscal-years.test.ts | 121 +++++ alshuyukh-accounting/apps/api/test/helpers.ts | 32 ++ .../apps/api/test/journal-entries.test.ts | 317 ++++++++++++ alshuyukh-accounting/apps/web/src/App.tsx | 17 +- alshuyukh-accounting/apps/web/src/Shell.tsx | 2 +- alshuyukh-accounting/apps/web/src/api.ts | 23 +- alshuyukh-accounting/apps/web/src/money.ts | 30 ++ .../web/src/pages/accounting/Accounting.tsx | 22 + .../src/pages/accounting/ChartOfAccounts.tsx | 137 +++++ .../web/src/pages/accounting/FiscalYears.tsx | 76 +++ .../src/pages/accounting/JournalDetail.tsx | 114 +++++ .../web/src/pages/accounting/JournalForm.tsx | 114 +++++ .../web/src/pages/accounting/JournalList.tsx | 64 +++ .../web/src/pages/accounting/TrialBalance.tsx | 60 +++ alshuyukh-accounting/apps/web/src/styles.css | 42 +- alshuyukh-accounting/apps/web/src/ui.tsx | 3 +- .../docs/screenshots/p2-01-chart.png | Bin 0 -> 188186 bytes .../docs/screenshots/p2-03-posted.png | Bin 0 -> 68102 bytes .../docs/screenshots/p2-04-reversal.png | Bin 0 -> 72060 bytes .../docs/screenshots/p2-06-trial-balance.png | Bin 0 -> 66887 bytes .../docs/screenshots/p2-07-fiscal.png | Bin 0 -> 124782 bytes alshuyukh-accounting/package-lock.json | 7 + 42 files changed, 3112 insertions(+), 17 deletions(-) create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0007_accounting.sql create mode 100644 alshuyukh-accounting/apps/api/src/lib/dates.ts create mode 100644 alshuyukh-accounting/apps/api/src/lib/money.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/accounts.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/company-context.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/fiscal.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/accounting/trial-balance.routes.ts create mode 100644 alshuyukh-accounting/apps/api/test/chart-of-accounts.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/fiscal-years.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/journal-entries.test.ts create mode 100644 alshuyukh-accounting/apps/web/src/money.ts create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/Accounting.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/ChartOfAccounts.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/FiscalYears.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/JournalList.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/accounting/TrialBalance.tsx create mode 100644 alshuyukh-accounting/docs/screenshots/p2-01-chart.png create mode 100644 alshuyukh-accounting/docs/screenshots/p2-03-posted.png create mode 100644 alshuyukh-accounting/docs/screenshots/p2-04-reversal.png create mode 100644 alshuyukh-accounting/docs/screenshots/p2-06-trial-balance.png create mode 100644 alshuyukh-accounting/docs/screenshots/p2-07-fiscal.png diff --git a/alshuyukh-accounting/README.md b/alshuyukh-accounting/README.md index 1d5e9902de03..274c46bcadb4 100644 --- a/alshuyukh-accounting/README.md +++ b/alshuyukh-accounting/README.md @@ -2,8 +2,12 @@ نظام محاسبي سحابي متعدد المنشآت (Multi-Tenant SaaS) للسوق السعودي. -**الحالة:** المرحلة 1 مكتملة (تأسيس المشروع، قاعدة البيانات، المصادقة، تعدد المنشآت، الصلاحيات). -الوحدات المحاسبية لم تُبنَ بعد، وتظهر في الواجهة بعلامة «قريبًا» دون أي بيانات تجريبية. +**الحالة:** + +- المرحلة 1 مكتملة: تأسيس المشروع، قاعدة البيانات، المصادقة، تعدد المنشآت، الصلاحيات. +- المرحلة 2 مكتملة: دليل الحسابات، المحرك المحاسبي، القيود اليومية، السنوات والفترات المالية. + +بقية الوحدات تظهر في الواجهة بعلامة «قريبًا» دون أي بيانات تجريبية. ## التقنيات المستخدمة @@ -33,12 +37,17 @@ alshuyukh-accounting/ │ │ │ │ ├── migrate.ts # مشغّل الترحيلات + مزامنة الصلاحيات │ │ │ │ ├── pool.ts # اتصال UTC، NUMERIC كنص │ │ │ │ └── tx.ts # withTx: معاملة + سياق المنشأة -│ │ │ ├── lib/ # الأخطاء، التحقق، كلمات المرور، الرموز +│ │ │ ├── lib/ # الأخطاء، التحقق، كلمات المرور، الرموز، المبالغ، التواريخ │ │ │ ├── plugins/auth.ts # المصادقة وحارس الصلاحيات │ │ │ └── modules/ │ │ │ ├── auth/ # التسجيل، الدخول، التجديد، الخروج، التبديل │ │ │ ├── users/ # أعضاء المنشأة │ │ │ ├── rbac/ # catalog.ts (مصدر الصلاحيات) + الأدوار +│ │ │ ├── accounting/ # المحرك المحاسبي (المرحلة 2) +│ │ │ │ ├── engine.ts # إنشاء القيود، الترحيل، العكس، إقفال السنة +│ │ │ │ ├── chart-template.ts # دليل الحسابات الافتراضي +│ │ │ │ ├── setup.ts # تجهيز الشركة: الدليل + السنة المالية +│ │ │ │ └── *.routes.ts # الحسابات، القيود، السنوات، ميزان المراجعة │ │ │ ├── companies/ # الشركات، الفروع، المستودعات │ │ │ ├── settings/ # إعدادات المنشأة │ │ │ └── audit/ # سجل التدقيق @@ -189,6 +198,110 @@ erDiagram | PATCH | `/api/warehouses/:id` | `company.manage` | | GET | `/api/audit-logs` (فلاتر: action، entityType، entityId، userId، from، to، cursor) | `audit.view` | +## المرحلة 2: المحرك المحاسبي + +### القواعد + +كل عملية مالية في النظام (يدوية الآن، ومن الفواتير والمدفوعات لاحقًا) تمر عبر `modules/accounting/engine.ts`. دوال المحرك تعمل داخل معاملة المستدعي، فالمستند وقيده يُحفظان معًا أو يُلغيان معًا. + +| القاعدة | التطبيق | قاعدة البيانات | +|---|---|---| +| مجموع المدين = مجموع الدائن، وأكبر من صفر | عند الترحيل (decimal.js) | Trigger يعيد الحساب عند `POSTED` | +| سطران على الأقل | ✓ | ✓ | +| كل سطر مدين **أو** دائن فقط، موجب، بخانتين عشريتين | ✓ (المبالغ نصوص، لا float) | `CHECK` + `NUMERIC(18,2)` | +| الحساب فرعي (يقبل القيود)، نشط، ومن نفس الشركة | ✓ | Trigger + مفتاح أجنبي مركّب | +| التاريخ داخل فترة مالية مفتوحة في سنة مفتوحة | ✓ مع قفل `FOR SHARE` | Trigger | +| القيد المرحّل لا يُعدَّل ولا يُحذف، وكذلك سطوره | ✓ | Trigger يرفض أي تغيير إلا التحول إلى `REVERSED` | +| لا حذف نهائي للقيود | حذف ناعم للمسودات فقط | دور التطبيق بلا صلاحية `DELETE` | +| ترقيم متسلسل بلا فجوات لكل شركة وسنة | يُسند عند الترحيل `JV-2026-000001` | جدول تسلسل بقفل صف، وفهرس فريد | + +**دورة حياة القيد:** `DRAFT` ← `POSTED` ← `REVERSED`. + +- المسودة تُعدَّل وتُحذف (حذفًا ناعمًا). +- القيد المرحّل يُصحَّح فقط بقيد عكسي (`REVERSAL`) بنفس الحسابات والمبالغ معكوسة، ثم بقيد تصحيح جديد. نقطة `reverse` تنشئ الاثنين في معاملة واحدة إذا أُرسل `correction`. +- القيد الأصلي يبقى في الدفتر بحالة `REVERSED`، والقيدان معًا يصفّران الأثر. +- لا يمكن عكس قيد عكسي، ولا عكس قيد صادر عن مستند (`source = SYSTEM`) يدويًا؛ يُصحَّح من المستند نفسه. + +**إقفال السنة المالية:** + +1. يتطلب أن تكون السنوات السابقة مقفلة، وألا توجد مسودات داخل السنة. +2. يرحّل قيد إقفال (`YEAR_CLOSING`) بتاريخ آخر يوم في السنة، يصفّر حسابات الإيرادات والتكاليف والمصروفات، ويحوّل صافي الربح أو الخسارة إلى الأرباح المحتجزة. +3. يقفل جميع الفترات ثم السنة. لا يمكن بعدها الترحيل في السنة ولا إعادة فتح فتراتها. + +**دليل الحسابات:** يُنشأ تلقائيًا لكل شركة جديدة، مع السنة المالية الحالية (12 فترة شهرية حسب شهر بداية السنة في إعدادات المنشأة). + +- يستخدم المحرك «مفتاح النظام» (`system_key`) مثل `ACCOUNTS_RECEIVABLE` و `VAT_OUTPUT` و `RETAINED_EARNINGS`، لا رمز الحساب، فيمكن للمستخدم إعادة ترقيم الحسابات. +- قواعد الشجرة مفروضة في قاعدة البيانات: نوع الفرع = نوع الأصل، الأصل حساب تجميعي، لا دوائر، والمستوى يُحسب تلقائيًا. +- لا يمكن تغيير نوع حساب له قيود أو فروع، ولا إيقاف حساب له رصيد، ولا حذف حساب عليه قيود أو حساب نظامي. + +### الجداول الجديدة + +| الجدول | الغرض | +|---|---| +| `fiscal_years` | السنوات المالية؛ قيد `EXCLUDE` يمنع التداخل لنفس الشركة | +| `fiscal_periods` | الفترات الشهرية؛ لا تداخل، ولا تُعاد فتح فترة في سنة مقفلة | +| `account_groups` | تصنيف الحسابات للقوائم المالية (أصول متداولة، مصروفات تشغيلية…) | +| `accounts` | دليل الحسابات الشجري | +| `cost_centers` | مراكز التكلفة | +| `journal_entries` | رؤوس القيود | +| `journal_entry_lines` | سطور القيود | +| `journal_sequences` | عداد الترقيم لكل سنة مالية | + +```mermaid +erDiagram + companies ||--o{ fiscal_years : has + fiscal_years ||--o{ fiscal_periods : "split into" + fiscal_years ||--|| journal_sequences : numbers + companies ||--o{ account_groups : has + companies ||--o{ accounts : has + accounts ||--o{ accounts : "parent_id" + account_groups ||--o{ accounts : classifies + companies ||--o{ cost_centers : has + companies ||--o{ journal_entries : has + fiscal_periods ||--o{ journal_entries : "posted in" + journal_entries ||--o{ journal_entry_lines : has + accounts ||--o{ journal_entry_lines : "(account_id, company_id)" + cost_centers ||--o{ journal_entry_lines : tags + branches ||--o{ journal_entry_lines : tags + journal_entries ||--o| journal_entries : "reversal_of_id / correction_of_id" + + accounts { uuid id PK; uuid company_id; text code; text account_type; uuid parent_id; smallint level; bool is_postable; text system_key } + journal_entries { uuid id PK; uuid company_id; text entry_number; date entry_date; text status; text source; numeric total_debit; numeric total_credit; uuid reversal_of_id } + journal_entry_lines { uuid id PK; uuid journal_entry_id; smallint line_no; uuid account_id; numeric debit; numeric credit; uuid cost_center_id; uuid branch_id } + fiscal_years { uuid id PK; uuid company_id; date start_date; date end_date; text status; uuid closing_entry_id } + fiscal_periods { uuid id PK; uuid fiscal_year_id; smallint period_number; date start_date; date end_date; text status } +``` + +كل الجداول الجديدة عليها `tenant_id` و RLS، وكل المراجع بينها مفاتيح أجنبية مركّبة مع `company_id`، فلا يمكن لسطر قيد أن يشير إلى حساب أو مركز تكلفة أو فرع من شركة أخرى. + +**الفهارس الرئيسية:** + +- `journal_entries`: `(company_id, fiscal_year_id, entry_number)` فريد؛ `(tenant_id, company_id, entry_date)`؛ `(company_id, status)`؛ `(company_id, reference_type, reference_id)`؛ قيد عكسي واحد فقط لكل قيد. +- `journal_entry_lines`: `account_id`؛ `(tenant_id, company_id, account_id)`؛ `(journal_entry_id, line_no)` فريد. +- `accounts`: `(company_id, code)` و `(company_id, system_key)` فريدان لغير المحذوفة؛ `parent_id`. +- `fiscal_periods`: `(company_id, start_date, end_date)`. + +### واجهات API (المرحلة 2) + +`companyId` اختياري عندما تملك المنشأة شركة واحدة. المبالغ تُرسل وتُستقبل نصوصًا (`"1150.00"`). + +| الطريقة | المسار | الصلاحية | +|---|---|---| +| POST | `/api/accounting/setup` (للشركات القديمة؛ آمن للتكرار) | `account.manage` + `fiscal.manage` | +| GET | `/api/accounts`، `/api/accounts/:id` (مع الرصيد)، `/api/account-groups` | `account.view` | +| POST / PATCH / DELETE | `/api/accounts`، `/api/accounts/:id` | `account.manage` | +| GET / POST / PATCH | `/api/cost-centers`، `/api/cost-centers/:id` | `account.view` / `account.manage` | +| GET / POST | `/api/fiscal-years` | `account.view` / `fiscal.manage` | +| POST | `/api/fiscal-years/:id/close` | `fiscal.manage` | +| POST | `/api/fiscal-periods/:id/close`، `/api/fiscal-periods/:id/reopen` | `fiscal.manage` | +| GET | `/api/journal-entries` (فلاتر: status، dateFrom، dateTo، accountId، referenceType، search) | `journal.view` | +| GET | `/api/journal-entries/:id` | `journal.view` | +| POST | `/api/journal-entries` (مع `post: true` يتطلب `journal.post`) | `journal.create` | +| PATCH / DELETE | `/api/journal-entries/:id` (المسودات فقط) | `journal.create` | +| POST | `/api/journal-entries/:id/post` | `journal.post` | +| POST | `/api/journal-entries/:id/reverse` (`reason`، `date`، `correction`) | `journal.reverse` | +| GET | `/api/reports/trial-balance?dateFrom&dateTo` (رصيد افتتاحي، حركة، ختامي) | `report.view` | + ## تدفق المصادقة 1. **التسجيل** ينشئ في معاملة واحدة: المستخدم، المنشأة، إعداداتها (SAR، Asia/Riyadh)، الشركة الافتراضية، الفرع الرئيسي، المستودع الرئيسي، العضوية بدور `TENANT_OWNER`، وسجل تدقيق. @@ -228,7 +341,7 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق ## الاختبارات -54 اختبار تكامل على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: +94 اختبار تكامل على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: | الملف | ما يغطيه | |---|---| @@ -236,13 +349,17 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق | `tenant-isolation.test.ts` | محاولات منشأة B الوصول لبيانات A عبر المعرفات (قراءة، تعديل، حذف، فروع، مستخدمون، سجل التدقيق، تبديل، أدوار)؛ ثم مباشرة على قاعدة البيانات: الدور لا يتجاوز RLS، الاستعلام بلا فلتر، بلا سياق، الإدخال في منشأة أخرى، المفتاح المركّب، التعديل عبر المنشآت، أدوار النظام، منع الحذف | | `rbac.test.ts` | سلامة الكتالوج، المحاسب والمشاهد، سريان تغيير الأدوار فورًا، التعطيل الفوري، منع التصعيد، حماية المالك، أدوار النظام، الأدوار المخصصة | | `audit.test.ts` | تسجيل العمليات، القيم قبل/بعد، عدم تخزين الأسرار، منع التعديل والحذف، الترقيم | +| `journal-entries.test.ts` | مثال الفاتورة 1000 + ضريبة 150؛ الترحيل والترقيم المتسلسل؛ رفض القيد غير المتوازن مع التفاصيل؛ التراجع الكامل عند الفشل؛ دقة الكسور (0.10 + 0.20)؛ التحقق من كل سطر؛ الحسابات التجميعية وغير النشطة والأجنبية؛ غياب الفترة؛ ترقيم بلا فجوات تحت التزامن؛ تعديل وحذف المسودات؛ رفض تعديل القيد المرحّل عبر API وعبر SQL مباشر؛ فرض التوازن في قاعدة البيانات؛ العكس والتصحيح؛ الفترات المقفلة؛ الصلاحيات؛ العزل؛ سجل التدقيق؛ ميزان المراجعة | +| `chart-of-accounts.test.ts` | الدليل الافتراضي ومفاتيح النظام؛ السنة المالية التلقائية؛ تجهيز الشركات اللاحقة؛ الحسابات الفرعية وتحويل الحساب إلى تجميعي؛ منع الدوائر والتكرار وعدم تطابق النوع؛ حماية الحسابات النظامية وذات الرصيد؛ الإيقاف والحذف الناعم؛ مراكز التكلفة؛ العزل | +| `fiscal-years.test.ts` | إنشاء السنوات ومنع التداخل؛ السنة القصيرة؛ قفل شهر البداية؛ إقفال السنة بربح وبخسارة وبلا حركة؛ منع الترحيل وإعادة الفتح بعد الإقفال؛ اشتراط إقفال السنوات السابقة | | `companies.test.ts` | القيم السعودية الافتراضية، التحقق، التكرار، الحذف الناعم، ربط المستودع بفرع شركة أخرى، تجاهل `tenant_id` في جسم الطلب، العضوية في منشأتين والتبديل | ## ملاحظات وقرارات تصميم - **المنشأة مقابل الشركة:** المنشأة (tenant) هي حدود العزل والاشتراك. يمكن أن تملك المنشأة أكثر من شركة. السجلات المالية في المراحل القادمة ستحمل `tenant_id` و`company_id` معًا. - **جدول `users` بلا RLS:** الهوية عامة لأن الدخول يحتاج البحث بالبريد قبل معرفة المنشأة. لا يحتوي على بيانات تجارية، والوصول إليه يمر دائمًا عبر `user_tenants`. يمكن لاحقًا نقل البحث إلى دالة `SECURITY DEFINER` وتفعيل RLS عليه. -- **المبالغ المالية:** `pg` مضبوط ليعيد `NUMERIC` كنص، حتى لا يتحول أي مبلغ إلى float. المرحلة 2 ستستخدم `NUMERIC(19,4)` ومكتبة Decimal. +- **المبالغ المالية:** مخزنة `NUMERIC(18,2)` (حتى الهللة). `pg` مضبوط ليعيد `NUMERIC` كنص، والحسابات في الخادم بـ decimal.js، والـ API يقبل المبالغ نصوصًا فقط. الواجهة تعرض المجاميع أثناء الكتابة بالهللات (أعداد صحيحة) للعرض فقط، والخادم هو المرجع. +- **القيود العكسية:** الأصل يبقى بحالة `REVERSED` ويُحسب في الأرصدة مع قيده العكسي، فيبقى الدفتر كاملًا والأثر صفرًا. - **الوقت:** كل الاتصالات بتوقيت UTC، والعرض بتوقيت المنشأة (افتراضيًا Asia/Riyadh). ## المتبقي (TODO) @@ -252,6 +369,11 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق - لوحة `/admin` لمدير المنصة — المرحلة 9. - رفع شعار الشركة (حاليًا رابط https فقط). - نقل ملكية المنشأة. -- منع حذف شركة لها قيود مرحّلة، ومنع تغيير بداية السنة المالية بعد إنشاء سنة — المرحلة 2. - Rate limiting يعتمد على ذاكرة العملية؛ في الإنتاج بأكثر من نسخة يلزم Redis. - لم تُطبَّق المصادقة الثنائية (2FA). +- **المرحلة 2:** + - تعدد العملات وأسعار الصرف: القيود حاليًا بعملة الشركة فقط. + - إعادة فتح سنة مالية مقفلة (عكس قيد الإقفال) غير مدعومة. + - استيراد الأرصدة الافتتاحية من ملف: حاليًا تُدخل بقيد يدوي. + - سير موافقات للقيود (من يُنشئ لا يُرحّل) غير مطبق؛ الفصل الحالي عبر صلاحيتي `journal.create` و `journal.post` فقط. + - دفتر الأستاذ وبقية التقارير في المرحلة 7. التقارير يجب أن تستثني قيد `YEAR_CLOSING` من قائمة الدخل. diff --git a/alshuyukh-accounting/apps/api/package.json b/alshuyukh-accounting/apps/api/package.json index ab5e58ce45e7..bbf13d7fce6f 100644 --- a/alshuyukh-accounting/apps/api/package.json +++ b/alshuyukh-accounting/apps/api/package.json @@ -17,6 +17,7 @@ "@fastify/helmet": "^13.1.1", "@fastify/rate-limit": "^11.2.0", "argon2": "^0.45.1", + "decimal.js": "^10.6.0", "fastify": "^5.12.5", "fastify-plugin": "^5.1.0", "jose": "^6.2.12", diff --git a/alshuyukh-accounting/apps/api/src/app.ts b/alshuyukh-accounting/apps/api/src/app.ts index c8b0039944d1..0a67585aadb1 100644 --- a/alshuyukh-accounting/apps/api/src/app.ts +++ b/alshuyukh-accounting/apps/api/src/app.ts @@ -7,6 +7,10 @@ import type pg from 'pg'; import type { Env } from './config/env.js'; import { AppError } from './lib/errors.js'; import { TokenService } from './lib/tokens.js'; +import accountsRoutes from './modules/accounting/accounts.routes.js'; +import fiscalRoutes from './modules/accounting/fiscal.routes.js'; +import journalRoutes from './modules/accounting/journal.routes.js'; +import trialBalanceRoutes from './modules/accounting/trial-balance.routes.js'; import auditRoutes from './modules/audit/audit.routes.js'; import authRoutes from './modules/auth/auth.routes.js'; import companiesRoutes from './modules/companies/companies.routes.js'; @@ -59,7 +63,9 @@ export async function buildApp({ env, pool, logger = true }: BuildOptions): Prom const mapped = pgCode ? PG_ERRORS[pgCode] : undefined; if (mapped) { req.log.warn({ err }, 'database constraint'); - return reply.code(mapped[0]).send({ error: { code: mapped[1], message: mapped[2] } }); + // Messages raised by our own ledger triggers are safe and useful to show. + const fromTrigger = /PL\/pgSQL function/.test((err as { where?: string }).where ?? ''); + return reply.code(mapped[0]).send({ error: { code: fromTrigger ? 'LEDGER_RULE' : mapped[1], message: fromTrigger ? err.message : mapped[2] } }); } const status = (err as { statusCode?: number }).statusCode; if (status && status >= 400 && status < 500) { @@ -81,6 +87,10 @@ export async function buildApp({ env, pool, logger = true }: BuildOptions): Prom await api.register(companiesRoutes); await api.register(settingsRoutes); await api.register(auditRoutes); + await api.register(accountsRoutes); + await api.register(fiscalRoutes); + await api.register(journalRoutes); + await api.register(trialBalanceRoutes); }, { prefix: '/api' }); return app; diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0007_accounting.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0007_accounting.sql new file mode 100644 index 000000000000..72ac9ded8814 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0007_accounting.sql @@ -0,0 +1,484 @@ +-- 0007 — Accounting core: fiscal calendar, chart of accounts, cost centers, +-- journal entries. +-- +-- Money is NUMERIC(18,2) (SAR to the halala). Never float. +-- Every rule that protects the ledger is enforced here in the database, not +-- only in the API: balanced posting, open-period posting, immutability of +-- posted entries, and same-company references. + +CREATE EXTENSION IF NOT EXISTS btree_gist; + +-- Branches need (id, company_id) as a composite FK target for journal lines. +ALTER TABLE branches ADD CONSTRAINT branches_id_company_uq UNIQUE (id, company_id); + +-- Fiscal calendar ------------------------------------------------------------ +CREATE TABLE fiscal_years ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + name text NOT NULL CHECK (length(btrim(name)) BETWEEN 1 AND 100), + start_date date NOT NULL, + end_date date NOT NULL, + status text NOT NULL DEFAULT 'OPEN' CHECK (status IN ('OPEN', 'CLOSED')), + closing_entry_id uuid, + closed_at timestamptz, + closed_by uuid REFERENCES users (id), + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT fiscal_years_dates_ck CHECK (end_date > start_date AND end_date - start_date < 550), + CONSTRAINT fiscal_years_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT fiscal_years_id_tenant_uq UNIQUE (id, tenant_id), + CONSTRAINT fiscal_years_id_company_uq UNIQUE (id, company_id), + CONSTRAINT fiscal_years_no_overlap EXCLUDE USING gist + (company_id WITH =, daterange(start_date, end_date, '[]') WITH &&) +); +CREATE INDEX fiscal_years_company_idx ON fiscal_years (tenant_id, company_id, start_date); +CREATE TRIGGER fiscal_years_updated_at BEFORE UPDATE ON fiscal_years + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE fiscal_periods ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + fiscal_year_id uuid NOT NULL, + period_number smallint NOT NULL CHECK (period_number BETWEEN 1 AND 18), + name text NOT NULL, + start_date date NOT NULL, + end_date date NOT NULL, + status text NOT NULL DEFAULT 'OPEN' CHECK (status IN ('OPEN', 'CLOSED')), + closed_at timestamptz, + closed_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT fiscal_periods_dates_ck CHECK (end_date >= start_date), + CONSTRAINT fiscal_periods_year_fk FOREIGN KEY (fiscal_year_id, company_id) REFERENCES fiscal_years (id, company_id), + CONSTRAINT fiscal_periods_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT fiscal_periods_number_uq UNIQUE (fiscal_year_id, period_number), + CONSTRAINT fiscal_periods_id_tenant_uq UNIQUE (id, tenant_id), + CONSTRAINT fiscal_periods_id_company_uq UNIQUE (id, company_id), + CONSTRAINT fiscal_periods_no_overlap EXCLUDE USING gist + (company_id WITH =, daterange(start_date, end_date, '[]') WITH &&) +); +CREATE INDEX fiscal_periods_lookup_idx ON fiscal_periods (company_id, start_date, end_date); +CREATE TRIGGER fiscal_periods_updated_at BEFORE UPDATE ON fiscal_periods + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- A period of a closed year cannot be reopened. +CREATE OR REPLACE FUNCTION fiscal_periods_guard() RETURNS trigger +LANGUAGE plpgsql AS $$ +BEGIN + IF NEW.status = 'OPEN' AND OLD.status = 'CLOSED' AND EXISTS ( + SELECT 1 FROM fiscal_years y WHERE y.id = NEW.fiscal_year_id AND y.status = 'CLOSED' + ) THEN + RAISE EXCEPTION 'cannot reopen a period of a closed fiscal year' USING ERRCODE = 'check_violation'; + END IF; + IF NEW.start_date <> OLD.start_date OR NEW.end_date <> OLD.end_date OR NEW.fiscal_year_id <> OLD.fiscal_year_id THEN + RAISE EXCEPTION 'fiscal period dates cannot change' USING ERRCODE = 'check_violation'; + END IF; + RETURN NEW; +END; +$$; +CREATE TRIGGER fiscal_periods_guard BEFORE UPDATE ON fiscal_periods + FOR EACH ROW EXECUTE FUNCTION fiscal_periods_guard(); + +-- Chart of accounts ----------------------------------------------------------- +-- Groups classify accounts for financial statements (current assets, etc.). +CREATE TABLE account_groups ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[A-Z][A-Z0-9_]{1,62}$'), + name_ar text NOT NULL, + name_en text NOT NULL, + account_type text NOT NULL CHECK (account_type IN ('ASSET', 'LIABILITY', 'EQUITY', 'REVENUE', 'EXPENSE', 'COST_OF_GOODS_SOLD')), + sort_order integer NOT NULL DEFAULT 0, + is_system boolean NOT NULL DEFAULT false, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT account_groups_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT account_groups_code_uq UNIQUE (company_id, code), + CONSTRAINT account_groups_id_company_uq UNIQUE (id, company_id) +); +CREATE TRIGGER account_groups_updated_at BEFORE UPDATE ON account_groups + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE accounts ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[0-9A-Za-z.-]{1,20}$'), + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 1 AND 200), + name_en text, + account_type text NOT NULL CHECK (account_type IN ('ASSET', 'LIABILITY', 'EQUITY', 'REVENUE', 'EXPENSE', 'COST_OF_GOODS_SOLD')), + parent_id uuid, + level smallint NOT NULL DEFAULT 1 CHECK (level BETWEEN 1 AND 10), + group_id uuid, + -- Only postable (leaf) accounts accept journal lines; others are headers. + is_postable boolean NOT NULL DEFAULT true, + is_active boolean NOT NULL DEFAULT true, + is_system boolean NOT NULL DEFAULT false, + -- Stable role used by the engine (AR, AP, VAT_OUTPUT, ...). Codes may be + -- renumbered by the user; system keys never change. + system_key text CHECK (system_key ~ '^[A-Z][A-Z0-9_]{1,62}$'), + description text, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT accounts_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT accounts_parent_fk FOREIGN KEY (parent_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT accounts_group_fk FOREIGN KEY (group_id, company_id) REFERENCES account_groups (id, company_id), + CONSTRAINT accounts_id_company_uq UNIQUE (id, company_id), + CONSTRAINT accounts_not_own_parent CHECK (parent_id IS NULL OR parent_id <> id) +); +CREATE UNIQUE INDEX accounts_code_uq ON accounts (company_id, code) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX accounts_system_key_uq ON accounts (company_id, system_key) + WHERE system_key IS NOT NULL AND deleted_at IS NULL; +CREATE INDEX accounts_parent_idx ON accounts (parent_id); +CREATE INDEX accounts_company_idx ON accounts (tenant_id, company_id) WHERE deleted_at IS NULL; +CREATE TRIGGER accounts_updated_at BEFORE UPDATE ON accounts + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Keeps the tree consistent: same type as parent, parent is a header, +-- no cycles, level derived from the parent, group type matches. +CREATE OR REPLACE FUNCTION accounts_validate() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + p record; + g_type text; +BEGIN + IF NEW.parent_id IS NULL THEN + NEW.level := 1; + ELSE + SELECT account_type, is_postable, level, deleted_at INTO p FROM accounts WHERE id = NEW.parent_id; + IF NOT FOUND OR p.deleted_at IS NOT NULL THEN + RAISE EXCEPTION 'parent account not found' USING ERRCODE = 'foreign_key_violation'; + END IF; + IF p.account_type <> NEW.account_type THEN + RAISE EXCEPTION 'account type must match its parent (%)', p.account_type USING ERRCODE = 'check_violation'; + END IF; + IF p.is_postable THEN + RAISE EXCEPTION 'parent account must be a header (non-postable) account' USING ERRCODE = 'check_violation'; + END IF; + IF TG_OP = 'UPDATE' AND NEW.parent_id IS DISTINCT FROM OLD.parent_id AND EXISTS ( + WITH RECURSIVE descendants AS ( + SELECT id FROM accounts WHERE parent_id = NEW.id + UNION ALL + SELECT a.id FROM accounts a JOIN descendants d ON a.parent_id = d.id + ) SELECT 1 FROM descendants WHERE id = NEW.parent_id + ) THEN + RAISE EXCEPTION 'an account cannot be moved under its own descendant' USING ERRCODE = 'check_violation'; + END IF; + NEW.level := p.level + 1; + END IF; + + IF NEW.group_id IS NOT NULL THEN + SELECT account_type INTO g_type FROM account_groups WHERE id = NEW.group_id; + IF g_type IS DISTINCT FROM NEW.account_type THEN + RAISE EXCEPTION 'account group type must match account type' USING ERRCODE = 'check_violation'; + END IF; + END IF; + + IF TG_OP = 'UPDATE' THEN + IF NEW.account_type <> OLD.account_type AND ( + EXISTS (SELECT 1 FROM journal_entry_lines l WHERE l.account_id = NEW.id) + OR EXISTS (SELECT 1 FROM accounts c WHERE c.parent_id = NEW.id AND c.deleted_at IS NULL) + ) THEN + RAISE EXCEPTION 'account type cannot change once the account has children or journal lines' USING ERRCODE = 'check_violation'; + END IF; + IF NEW.is_postable AND NOT OLD.is_postable + AND EXISTS (SELECT 1 FROM accounts c WHERE c.parent_id = NEW.id AND c.deleted_at IS NULL) THEN + RAISE EXCEPTION 'an account with children must stay a header' USING ERRCODE = 'check_violation'; + END IF; + IF NOT NEW.is_postable AND OLD.is_postable + AND EXISTS (SELECT 1 FROM journal_entry_lines l WHERE l.account_id = NEW.id) THEN + RAISE EXCEPTION 'an account with journal lines cannot become a header' USING ERRCODE = 'check_violation'; + END IF; + IF NEW.deleted_at IS NOT NULL AND OLD.deleted_at IS NULL AND ( + OLD.is_system + OR EXISTS (SELECT 1 FROM journal_entry_lines l WHERE l.account_id = NEW.id) + OR EXISTS (SELECT 1 FROM accounts c WHERE c.parent_id = NEW.id AND c.deleted_at IS NULL) + ) THEN + RAISE EXCEPTION 'system accounts and accounts with children or journal lines cannot be deleted' USING ERRCODE = 'check_violation'; + END IF; + IF OLD.is_system AND NEW.system_key IS DISTINCT FROM OLD.system_key THEN + RAISE EXCEPTION 'system key of a system account cannot change' USING ERRCODE = 'check_violation'; + END IF; + END IF; + RETURN NEW; +END; +$$; + +-- Cost centers ------------------------------------------------------------------ +CREATE TABLE cost_centers ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[0-9A-Za-z_-]{1,20}$'), + name text NOT NULL CHECK (length(btrim(name)) BETWEEN 2 AND 200), + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT cost_centers_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT cost_centers_id_company_uq UNIQUE (id, company_id) +); +CREATE UNIQUE INDEX cost_centers_code_uq ON cost_centers (company_id, code) WHERE deleted_at IS NULL; +CREATE TRIGGER cost_centers_updated_at BEFORE UPDATE ON cost_centers + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Journal entries ----------------------------------------------------------------- +CREATE TABLE journal_entries ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + -- Assigned at posting. Gap-free per company and fiscal year. + fiscal_year_id uuid, + fiscal_period_id uuid, + entry_number text, + entry_date date NOT NULL, + description text NOT NULL CHECK (length(btrim(description)) BETWEEN 1 AND 1000), + -- MANUAL, REVERSAL, YEAR_CLOSING, and later SALES_INVOICE, PURCHASE_INVOICE, ... + reference_type text NOT NULL DEFAULT 'MANUAL' CHECK (reference_type ~ '^[A-Z][A-Z0-9_]{1,62}$'), + reference_id uuid, + source text NOT NULL DEFAULT 'MANUAL' CHECK (source IN ('MANUAL', 'SYSTEM')), + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'POSTED', 'REVERSED')), + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + total_debit numeric(18,2) NOT NULL DEFAULT 0, + total_credit numeric(18,2) NOT NULL DEFAULT 0, + reversal_of_id uuid, + reversed_by_entry_id uuid, + correction_of_id uuid, + created_by uuid REFERENCES users (id), + posted_by uuid REFERENCES users (id), + posted_at timestamptz, + reversed_by uuid REFERENCES users (id), + reversed_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT journal_entries_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT journal_entries_year_fk FOREIGN KEY (fiscal_year_id, company_id) REFERENCES fiscal_years (id, company_id), + CONSTRAINT journal_entries_period_fk FOREIGN KEY (fiscal_period_id, company_id) REFERENCES fiscal_periods (id, company_id), + CONSTRAINT journal_entries_id_company_uq UNIQUE (id, company_id), + CONSTRAINT journal_entries_reversal_fk FOREIGN KEY (reversal_of_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT journal_entries_reversed_by_fk FOREIGN KEY (reversed_by_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT journal_entries_correction_fk FOREIGN KEY (correction_of_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT journal_entries_posted_ck CHECK ( + status = 'DRAFT' OR (entry_number IS NOT NULL AND posted_at IS NOT NULL + AND fiscal_period_id IS NOT NULL AND fiscal_year_id IS NOT NULL + AND total_debit = total_credit AND total_debit > 0) + ), + CONSTRAINT journal_entries_reversed_ck CHECK ( + status <> 'REVERSED' OR (reversed_by_entry_id IS NOT NULL AND reversed_at IS NOT NULL) + ), + CONSTRAINT journal_entries_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT') +); +CREATE UNIQUE INDEX journal_entries_number_uq ON journal_entries (company_id, fiscal_year_id, entry_number) + WHERE entry_number IS NOT NULL; +CREATE UNIQUE INDEX journal_entries_one_reversal_uq ON journal_entries (reversal_of_id) WHERE reversal_of_id IS NOT NULL; +CREATE INDEX journal_entries_date_idx ON journal_entries (tenant_id, company_id, entry_date DESC); +CREATE INDEX journal_entries_status_idx ON journal_entries (company_id, status); +CREATE INDEX journal_entries_reference_idx ON journal_entries (company_id, reference_type, reference_id); +CREATE TRIGGER journal_entries_updated_at BEFORE UPDATE ON journal_entries + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE journal_entry_lines ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + journal_entry_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + account_id uuid NOT NULL, + debit numeric(18,2) NOT NULL DEFAULT 0, + credit numeric(18,2) NOT NULL DEFAULT 0, + description text, + cost_center_id uuid, + branch_id uuid, + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT journal_lines_amounts_ck CHECK ( + debit >= 0 AND credit >= 0 AND ((debit > 0 AND credit = 0) OR (credit > 0 AND debit = 0)) + ), + CONSTRAINT journal_lines_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT journal_lines_entry_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT journal_lines_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT journal_lines_cost_center_fk FOREIGN KEY (cost_center_id, company_id) REFERENCES cost_centers (id, company_id), + CONSTRAINT journal_lines_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT journal_lines_line_no_uq UNIQUE (journal_entry_id, line_no) +); +CREATE INDEX journal_lines_account_idx ON journal_entry_lines (account_id); +CREATE INDEX journal_lines_tenant_account_idx ON journal_entry_lines (tenant_id, company_id, account_id); +CREATE INDEX journal_lines_cost_center_idx ON journal_entry_lines (cost_center_id) WHERE cost_center_id IS NOT NULL; +CREATE INDEX journal_lines_branch_idx ON journal_entry_lines (branch_id) WHERE branch_id IS NOT NULL; + +-- Now that journal_entry_lines exists, attach the account validation trigger. +CREATE TRIGGER accounts_validate BEFORE INSERT OR UPDATE ON accounts + FOR EACH ROW EXECUTE FUNCTION accounts_validate(); + +ALTER TABLE fiscal_years ADD CONSTRAINT fiscal_years_closing_entry_fk + FOREIGN KEY (closing_entry_id, company_id) REFERENCES journal_entries (id, company_id); + +-- Gap-free entry numbering per company and fiscal year. +CREATE TABLE journal_sequences ( + fiscal_year_id uuid PRIMARY KEY, + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + last_number integer NOT NULL DEFAULT 0 CHECK (last_number >= 0), + CONSTRAINT journal_sequences_year_fk FOREIGN KEY (fiscal_year_id, company_id) REFERENCES fiscal_years (id, company_id), + CONSTRAINT journal_sequences_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id) +); + +-- Ledger protection triggers ------------------------------------------------------ + +-- Lines can change only while their entry is a draft, and may reference only +-- active postable accounts. +CREATE OR REPLACE FUNCTION journal_lines_guard() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + entry_status text; + acc record; +BEGIN + IF TG_OP IN ('UPDATE', 'DELETE') THEN + SELECT status INTO entry_status FROM journal_entries WHERE id = OLD.journal_entry_id; + IF entry_status IS DISTINCT FROM 'DRAFT' THEN + RAISE EXCEPTION 'lines of a posted journal entry cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF TG_OP = 'DELETE' THEN RETURN OLD; END IF; + END IF; + + SELECT status INTO entry_status FROM journal_entries WHERE id = NEW.journal_entry_id; + IF entry_status IS DISTINCT FROM 'DRAFT' THEN + RAISE EXCEPTION 'lines of a posted journal entry cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + SELECT is_postable, is_active, deleted_at INTO acc FROM accounts WHERE id = NEW.account_id; + IF NOT FOUND OR acc.deleted_at IS NOT NULL OR NOT acc.is_active OR NOT acc.is_postable THEN + RAISE EXCEPTION 'account % is not an active postable account', NEW.account_id USING ERRCODE = 'check_violation'; + END IF; + RETURN NEW; +END; +$$; +CREATE TRIGGER journal_lines_guard BEFORE INSERT OR UPDATE OR DELETE ON journal_entry_lines + FOR EACH ROW EXECUTE FUNCTION journal_lines_guard(); + +-- Entries are created as drafts. Posting re-validates everything. Posted +-- entries are immutable except for being marked REVERSED. +CREATE OR REPLACE FUNCTION journal_entries_guard() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + v_debit numeric(18,2); + v_credit numeric(18,2); + v_lines integer; + v_bad integer; + v_period record; + mutable text[] := ARRAY['status', 'reversed_at', 'reversed_by', 'reversed_by_entry_id', 'updated_at']; +BEGIN + IF TG_OP = 'INSERT' THEN + IF NEW.status <> 'DRAFT' THEN + RAISE EXCEPTION 'journal entries must be created as DRAFT and then posted' USING ERRCODE = 'check_violation'; + END IF; + RETURN NEW; + END IF; + + IF TG_OP = 'DELETE' THEN + RAISE EXCEPTION 'journal entries cannot be deleted' USING ERRCODE = 'insufficient_privilege'; + END IF; + + -- UPDATE + IF OLD.status = 'REVERSED' THEN + RAISE EXCEPTION 'a reversed journal entry cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + + IF OLD.status = 'POSTED' THEN + IF NEW.status <> 'REVERSED' + OR (to_jsonb(NEW) - mutable) IS DISTINCT FROM (to_jsonb(OLD) - mutable) THEN + RAISE EXCEPTION 'a posted journal entry cannot be modified; reverse it instead' USING ERRCODE = 'insufficient_privilege'; + END IF; + RETURN NEW; + END IF; + + -- OLD.status = 'DRAFT' + IF OLD.deleted_at IS NOT NULL THEN + RAISE EXCEPTION 'a deleted draft cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF NEW.status = 'REVERSED' THEN + RAISE EXCEPTION 'a draft cannot be reversed' USING ERRCODE = 'check_violation'; + END IF; + + IF NEW.status = 'POSTED' THEN + SELECT count(*), COALESCE(sum(debit), 0), COALESCE(sum(credit), 0) + INTO v_lines, v_debit, v_credit + FROM journal_entry_lines WHERE journal_entry_id = NEW.id; + IF v_lines < 2 THEN + RAISE EXCEPTION 'a journal entry needs at least two lines' USING ERRCODE = 'check_violation'; + END IF; + IF v_debit <> v_credit OR v_debit = 0 THEN + RAISE EXCEPTION 'journal entry is not balanced (debit %, credit %)', v_debit, v_credit USING ERRCODE = 'check_violation'; + END IF; + + SELECT count(*) INTO v_bad + FROM journal_entry_lines l JOIN accounts a ON a.id = l.account_id + WHERE l.journal_entry_id = NEW.id + AND (a.deleted_at IS NOT NULL OR NOT a.is_active OR NOT a.is_postable); + IF v_bad > 0 THEN + RAISE EXCEPTION 'journal entry uses inactive or non-postable accounts' USING ERRCODE = 'check_violation'; + END IF; + + SELECT p.id, p.status AS period_status, y.id AS year_id, y.status AS year_status INTO v_period + FROM fiscal_periods p JOIN fiscal_years y ON y.id = p.fiscal_year_id + WHERE p.company_id = NEW.company_id AND NEW.entry_date BETWEEN p.start_date AND p.end_date; + IF NOT FOUND THEN + RAISE EXCEPTION 'no fiscal period covers %', NEW.entry_date USING ERRCODE = 'check_violation'; + END IF; + IF v_period.period_status <> 'OPEN' OR v_period.year_status <> 'OPEN' THEN + RAISE EXCEPTION 'fiscal period for % is closed', NEW.entry_date USING ERRCODE = 'check_violation'; + END IF; + IF NEW.fiscal_period_id IS DISTINCT FROM v_period.id OR NEW.fiscal_year_id IS DISTINCT FROM v_period.year_id THEN + RAISE EXCEPTION 'fiscal period does not match the entry date' USING ERRCODE = 'check_violation'; + END IF; + + NEW.total_debit := v_debit; + NEW.total_credit := v_credit; + END IF; + RETURN NEW; +END; +$$; +CREATE TRIGGER journal_entries_guard BEFORE INSERT OR UPDATE OR DELETE ON journal_entries + FOR EACH ROW EXECUTE FUNCTION journal_entries_guard(); + +-- Row-Level Security -------------------------------------------------------------- +ALTER TABLE fiscal_years ENABLE ROW LEVEL SECURITY; +CREATE POLICY fiscal_years_isolation ON fiscal_years + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE fiscal_periods ENABLE ROW LEVEL SECURITY; +CREATE POLICY fiscal_periods_isolation ON fiscal_periods + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE account_groups ENABLE ROW LEVEL SECURITY; +CREATE POLICY account_groups_isolation ON account_groups + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE accounts ENABLE ROW LEVEL SECURITY; +CREATE POLICY accounts_isolation ON accounts + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE cost_centers ENABLE ROW LEVEL SECURITY; +CREATE POLICY cost_centers_isolation ON cost_centers + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE journal_entries ENABLE ROW LEVEL SECURITY; +CREATE POLICY journal_entries_isolation ON journal_entries + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE journal_entry_lines ENABLE ROW LEVEL SECURITY; +CREATE POLICY journal_entry_lines_isolation ON journal_entry_lines + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); +ALTER TABLE journal_sequences ENABLE ROW LEVEL SECURITY; +CREATE POLICY journal_sequences_isolation ON journal_sequences + USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id()); + +-- Runtime privileges: no DELETE on the ledger. Draft lines are replaced by +-- DELETE + INSERT; the line trigger refuses that once the entry is posted. +GRANT SELECT, INSERT, UPDATE ON + fiscal_years, fiscal_periods, account_groups, accounts, cost_centers, + journal_entries, journal_sequences +TO alshuyukh_app; +GRANT SELECT, INSERT, UPDATE, DELETE ON journal_entry_lines TO alshuyukh_app; diff --git a/alshuyukh-accounting/apps/api/src/lib/dates.ts b/alshuyukh-accounting/apps/api/src/lib/dates.ts new file mode 100644 index 000000000000..4118f1f92085 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/dates.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; + +/** Calendar date (YYYY-MM-DD) that actually exists. */ +export const isoDate = z.string().regex(/^\d{4}-\d{2}-\d{2}$/).refine((s) => { + const d = new Date(`${s}T00:00:00Z`); + return !Number.isNaN(d.getTime()) && d.toISOString().slice(0, 10) === s; +}, 'Invalid date'); + +/** Today's date in the given time zone, e.g. Asia/Riyadh. */ +export function todayIn(timeZone: string): string { + return new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).format(new Date()); +} + +/** Adds whole months to a YYYY-MM-DD date that is the 1st of a month. */ +export function addMonths(date: string, months: number): string { + const d = new Date(`${date}T00:00:00Z`); + d.setUTCMonth(d.getUTCMonth() + months); + return d.toISOString().slice(0, 10); +} + +export function addDays(date: string, days: number): string { + const d = new Date(`${date}T00:00:00Z`); + d.setUTCDate(d.getUTCDate() + days); + return d.toISOString().slice(0, 10); +} diff --git a/alshuyukh-accounting/apps/api/src/lib/money.ts b/alshuyukh-accounting/apps/api/src/lib/money.ts new file mode 100644 index 000000000000..8622813ed4b6 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/money.ts @@ -0,0 +1,20 @@ +import { Decimal } from 'decimal.js'; +import { z } from 'zod'; + +/** + * Money handling. Amounts travel as strings ("1150.00") in the API and come + * back from PostgreSQL NUMERIC as strings. Arithmetic uses decimal.js; a JS + * number is never used for money. + */ +Decimal.set({ precision: 40, rounding: Decimal.ROUND_HALF_UP }); + +export { Decimal }; + +/** Positive or zero amount with at most 2 decimal places, as a string. */ +export const amountString = z + .string() + .trim() + .regex(/^\d{1,16}(\.\d{1,2})?$/, 'Amount must be a non-negative number with at most 2 decimal places, sent as a string'); + +export const toMoney = (v: Decimal.Value) => new Decimal(v).toFixed(2); +export const sum = (values: Decimal.Value[]) => values.reduce((acc, v) => acc.plus(v), new Decimal(0)); diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/accounts.routes.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/accounts.routes.ts new file mode 100644 index 000000000000..0a00bf50e555 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/accounts.routes.ts @@ -0,0 +1,242 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict, notFound } from '../../lib/errors.js'; +import { Decimal } from '../../lib/money.js'; +import { optionalText, parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { writeAudit } from '../audit/audit.service.js'; +import { ACCOUNT_TYPES } from './chart-template.js'; +import { resolveCompanyId } from './company-context.js'; +import { setupCompanyAccounting } from './setup.js'; + +const ACCOUNT_SELECT = ` + SELECT a.id, a.company_id AS "companyId", a.code, a.name_ar AS "nameAr", a.name_en AS "nameEn", + a.account_type AS "type", a.parent_id AS "parentId", a.level, a.group_id AS "groupId", + a.is_postable AS "isPostable", a.is_active AS "isActive", a.is_system AS "isSystem", + a.system_key AS "systemKey", a.description, + COALESCE(b.debit, 0)::numeric(18,2)::text AS "totalDebit", + COALESCE(b.credit, 0)::numeric(18,2)::text AS "totalCredit", + COALESCE(b.debit - b.credit, 0)::numeric(18,2)::text AS "balance" + FROM accounts a + LEFT JOIN LATERAL ( + SELECT sum(l.debit) AS debit, sum(l.credit) AS credit + FROM journal_entry_lines l JOIN journal_entries e ON e.id = l.journal_entry_id + WHERE l.account_id = a.id AND e.status IN ('POSTED', 'REVERSED') + ) b ON true`; + +type AccountRow = { id: string; companyId: string; isSystem: boolean; isActive: boolean; isPostable: boolean; balance: string; type: string }; + +async function findAccount(db: Db, tenantId: string, id: string): Promise { + const { rows } = await db.query(`${ACCOUNT_SELECT} WHERE a.tenant_id = $1 AND a.id = $2 AND a.deleted_at IS NULL`, [tenantId, id]); + return rows[0]; +} + +const accountCode = z.string().trim().regex(/^[0-9A-Za-z.-]{1,20}$/, 'Code: up to 20 letters, digits, dots or dashes'); + +const createBody = z.object({ + companyId: z.uuid().optional(), + code: accountCode, + nameAr: z.string().trim().min(1).max(200), + nameEn: optionalText(200), + type: z.enum(ACCOUNT_TYPES as [string, ...string[]]).optional(), + parentId: z.uuid().nullish(), + groupId: z.uuid().nullish(), + isPostable: z.boolean().default(true), + description: optionalText(1000), +}); + +const updateBody = z.object({ + code: accountCode, + nameAr: z.string().trim().min(1).max(200), + nameEn: optionalText(200), + parentId: z.uuid().nullable(), + groupId: z.uuid().nullable(), + isPostable: z.boolean(), + isActive: z.boolean(), + description: optionalText(1000), +}).partial(); + +export default async function accountsRoutes(app: FastifyInstance) { + const canView = requirePermission(app, 'account.view'); + const canManage = requirePermission(app, 'account.manage'); + + /** Seeds the default chart and current fiscal year for a company that has none (idempotent). */ + app.post('/accounting/setup', { preHandler: requirePermission(app, 'account.manage', 'fiscal.manage') }, async (req) => { + const body = parse(z.object({ companyId: z.uuid().optional() }), req.body ?? {}); + const a = req.auth!; + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + const { rows: [c] } = await db.query<{ timezone: string }>(`SELECT timezone FROM companies WHERE id = $1`, [companyId]); + const result = await setupCompanyAccounting(db, { tenantId: a.tenantId, companyId, userId: a.userId }, c!.timezone); + if (result.chartCreated || result.fiscalYearCreated) { + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'accounting_setup', entityId: companyId, newValues: result }, req.auditMeta()); + } + return { companyId, ...result }; + }); + }); + + app.get('/account-groups', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query( + `SELECT id, code, name_ar AS "nameAr", name_en AS "nameEn", account_type AS "type", sort_order AS "sortOrder" + FROM account_groups WHERE tenant_id = $1 AND company_id = $2 ORDER BY sort_order`, [req.auth!.tenantId, companyId]); + return { data: rows }; + }); + }); + + app.get('/accounts', { preHandler: canView }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), + includeInactive: z.enum(['true', 'false']).optional(), + postableOnly: z.enum(['true', 'false']).optional(), + }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query( + `${ACCOUNT_SELECT} + WHERE a.tenant_id = $1 AND a.company_id = $2 AND a.deleted_at IS NULL + AND ($3::boolean OR a.is_active) AND (NOT $4::boolean OR a.is_postable) + ORDER BY a.code`, + [req.auth!.tenantId, companyId, q.includeInactive === 'true', q.postableOnly === 'true']); + return { data: rows }; + }); + }); + + app.get('/accounts/:id', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + const account = await req.tenantTx((db) => findAccount(db, req.auth!.tenantId, id)); + if (!account) throw notFound('Account'); + return account; + }); + + app.post('/accounts', { preHandler: canManage }, async (req, reply) => { + const body = parse(createBody, req.body); + const a = req.auth!; + const account = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + let type = body.type; + if (body.parentId) { + const { rows: [parent] } = await db.query<{ account_type: string }>( + `SELECT account_type FROM accounts WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, body.parentId]); + if (!parent) throw badRequest('INVALID_PARENT', 'Parent account does not exist in this company'); + if (type && type !== parent.account_type) throw badRequest('TYPE_MISMATCH', 'Account type must match its parent'); + type = parent.account_type; + } + if (!type) throw badRequest('TYPE_REQUIRED', 'type is required for a top-level account'); + if (body.parentId) { + // A postable parent with no postings can become a header automatically. + const { rows: [p] } = await db.query<{ is_postable: boolean; has_lines: boolean }>( + `SELECT is_postable, EXISTS (SELECT 1 FROM journal_entry_lines WHERE account_id = $1) AS has_lines FROM accounts WHERE id = $1`, [body.parentId]); + if (p!.is_postable) { + if (p!.has_lines) throw conflict('PARENT_HAS_POSTINGS', 'The parent account has journal lines and cannot become a header'); + await db.query(`UPDATE accounts SET is_postable = false, updated_by = $2 WHERE id = $1`, [body.parentId, a.userId]); + } + } + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO accounts (tenant_id, company_id, code, name_ar, name_en, account_type, parent_id, group_id, + is_postable, description, created_by, updated_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $11) RETURNING id`, + [a.tenantId, companyId, body.code, body.nameAr, body.nameEn ?? null, type, body.parentId ?? null, + body.groupId ?? null, body.isPostable, body.description ?? null, a.userId]); + const created = await findAccount(db, a.tenantId, row!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'account', entityId: row!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return account; + }); + + app.patch('/accounts/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(updateBody, req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await findAccount(db, a.tenantId, id); + if (!before) throw notFound('Account'); + if (body.isActive === false && before.isActive) { + if (before.isSystem) throw conflict('SYSTEM_ACCOUNT', 'System accounts are used by the accounting engine and cannot be deactivated'); + if (!new Decimal(before.balance).isZero()) throw conflict('ACCOUNT_HAS_BALANCE', 'Only accounts with a zero balance can be deactivated'); + } + await db.query( + `UPDATE accounts SET + code = COALESCE($2, code), name_ar = COALESCE($3, name_ar), + name_en = CASE WHEN $4::boolean THEN $5 ELSE name_en END, + parent_id = CASE WHEN $6::boolean THEN $7::uuid ELSE parent_id END, + group_id = CASE WHEN $8::boolean THEN $9::uuid ELSE group_id END, + is_postable = COALESCE($10, is_postable), is_active = COALESCE($11, is_active), + description = CASE WHEN $12::boolean THEN $13 ELSE description END, + updated_by = $14 + WHERE tenant_id = $1 AND id = $15`, + [a.tenantId, body.code ?? null, body.nameAr ?? null, body.nameEn !== undefined, body.nameEn ?? null, + body.parentId !== undefined, body.parentId ?? null, body.groupId !== undefined, body.groupId ?? null, + body.isPostable ?? null, body.isActive ?? null, body.description !== undefined, body.description ?? null, + a.userId, id]); + const after = await findAccount(db, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'account', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + app.delete('/accounts/:id', { preHandler: canManage }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + await req.tenantTx(async (db) => { + const before = await findAccount(db, a.tenantId, id); + if (!before) throw notFound('Account'); + if (before.isSystem) throw conflict('SYSTEM_ACCOUNT', 'System accounts cannot be deleted'); + const used = await db.query(`SELECT 1 FROM journal_entry_lines WHERE account_id = $1 LIMIT 1`, [id]); + if (used.rowCount) throw conflict('ACCOUNT_IN_USE', 'Accounts with journal lines cannot be deleted. Deactivate it instead.'); + const children = await db.query(`SELECT 1 FROM accounts WHERE parent_id = $1 AND deleted_at IS NULL LIMIT 1`, [id]); + if (children.rowCount) throw conflict('ACCOUNT_HAS_CHILDREN', 'Delete or move the sub-accounts first'); + await db.query(`UPDATE accounts SET deleted_at = now(), is_active = false, updated_by = $2 WHERE id = $1`, [id, a.userId]); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'account', entityId: id, oldValues: before }, req.auditMeta()); + }); + return reply.code(204).send(); + }); + + // Cost centers ---------------------------------------------------------------- + const CC_SELECT = `SELECT id, company_id AS "companyId", code, name, is_active AS "isActive" FROM cost_centers`; + + app.get('/cost-centers', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query(`${CC_SELECT} WHERE tenant_id = $1 AND company_id = $2 AND deleted_at IS NULL ORDER BY code`, [req.auth!.tenantId, companyId]); + return { data: rows }; + }); + }); + + app.post('/cost-centers', { preHandler: canManage }, async (req, reply) => { + const body = parse(z.object({ companyId: z.uuid().optional(), code: z.string().regex(/^[0-9A-Za-z_-]{1,20}$/), name: z.string().trim().min(2).max(200) }), req.body); + const a = req.auth!; + const cc = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO cost_centers (tenant_id, company_id, code, name, created_by, updated_by) VALUES ($1, $2, $3, $4, $5, $5) RETURNING id`, + [a.tenantId, companyId, body.code, body.name, a.userId]); + const created = (await db.query(`${CC_SELECT} WHERE id = $1`, [row!.id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'cost_center', entityId: row!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return cc; + }); + + app.patch('/cost-centers/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ name: z.string().trim().min(2).max(200), isActive: z.boolean() }).partial(), req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = (await db.query(`${CC_SELECT} WHERE tenant_id = $1 AND id = $2 AND deleted_at IS NULL`, [a.tenantId, id])).rows[0]; + if (!before) throw notFound('Cost center'); + await db.query(`UPDATE cost_centers SET name = COALESCE($2, name), is_active = COALESCE($3, is_active), updated_by = $4 WHERE id = $1`, + [id, body.name ?? null, body.isActive ?? null, a.userId]); + const after = (await db.query(`${CC_SELECT} WHERE id = $1`, [id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'cost_center', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts new file mode 100644 index 000000000000..7be6c9754459 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts @@ -0,0 +1,71 @@ +/** + * Default chart of accounts created for every new company. + * Users can rename, renumber, extend, or deactivate accounts. The engine + * finds accounts by systemKey, never by code. + */ + +export type AccountType = 'ASSET' | 'LIABILITY' | 'EQUITY' | 'REVENUE' | 'EXPENSE' | 'COST_OF_GOODS_SOLD'; + +export const ACCOUNT_TYPES: readonly AccountType[] = ['ASSET', 'LIABILITY', 'EQUITY', 'REVENUE', 'EXPENSE', 'COST_OF_GOODS_SOLD']; + +/** Types whose balances close into retained earnings at year end. */ +export const PROFIT_AND_LOSS_TYPES: readonly AccountType[] = ['REVENUE', 'EXPENSE', 'COST_OF_GOODS_SOLD']; + +/** Debit-normal types; the rest are credit-normal. */ +export const DEBIT_NORMAL: ReadonlySet = new Set(['ASSET', 'EXPENSE', 'COST_OF_GOODS_SOLD']); + +export interface GroupTemplate { code: string; ar: string; en: string; type: AccountType; sort: number } + +export const DEFAULT_GROUPS: readonly GroupTemplate[] = [ + { code: 'CURRENT_ASSETS', ar: 'الأصول المتداولة', en: 'Current assets', type: 'ASSET', sort: 10 }, + { code: 'NON_CURRENT_ASSETS', ar: 'الأصول غير المتداولة', en: 'Non-current assets', type: 'ASSET', sort: 20 }, + { code: 'CURRENT_LIABILITIES', ar: 'الالتزامات المتداولة', en: 'Current liabilities', type: 'LIABILITY', sort: 30 }, + { code: 'NON_CURRENT_LIABILITIES', ar: 'الالتزامات غير المتداولة', en: 'Non-current liabilities', type: 'LIABILITY', sort: 40 }, + { code: 'EQUITY', ar: 'حقوق الملكية', en: 'Equity', type: 'EQUITY', sort: 50 }, + { code: 'OPERATING_REVENUE', ar: 'الإيرادات التشغيلية', en: 'Operating revenue', type: 'REVENUE', sort: 60 }, + { code: 'OTHER_REVENUE', ar: 'إيرادات أخرى', en: 'Other revenue', type: 'REVENUE', sort: 70 }, + { code: 'COST_OF_SALES', ar: 'تكلفة المبيعات', en: 'Cost of sales', type: 'COST_OF_GOODS_SOLD', sort: 80 }, + { code: 'OPERATING_EXPENSES', ar: 'المصروفات التشغيلية', en: 'Operating expenses', type: 'EXPENSE', sort: 90 }, + { code: 'OTHER_EXPENSES', ar: 'مصروفات أخرى', en: 'Other expenses', type: 'EXPENSE', sort: 100 }, +]; + +export interface AccountTemplate { + code: string; + ar: string; + en: string; + type: AccountType; + parent?: string; + group?: string; + postable: boolean; + systemKey?: string; +} + +export const DEFAULT_ACCOUNTS: readonly AccountTemplate[] = [ + { code: '1000', ar: 'الأصول', en: 'Assets', type: 'ASSET', postable: false }, + { code: '1100', ar: 'النقدية', en: 'Cash', type: 'ASSET', parent: '1000', group: 'CURRENT_ASSETS', postable: true, systemKey: 'CASH' }, + { code: '1200', ar: 'البنك', en: 'Bank', type: 'ASSET', parent: '1000', group: 'CURRENT_ASSETS', postable: true, systemKey: 'BANK' }, + { code: '1300', ar: 'العملاء', en: 'Accounts receivable', type: 'ASSET', parent: '1000', group: 'CURRENT_ASSETS', postable: true, systemKey: 'ACCOUNTS_RECEIVABLE' }, + { code: '1400', ar: 'المخزون', en: 'Inventory', type: 'ASSET', parent: '1000', group: 'CURRENT_ASSETS', postable: true, systemKey: 'INVENTORY' }, + + { code: '2000', ar: 'الالتزامات', en: 'Liabilities', type: 'LIABILITY', postable: false }, + { code: '2100', ar: 'الموردون', en: 'Accounts payable', type: 'LIABILITY', parent: '2000', group: 'CURRENT_LIABILITIES', postable: true, systemKey: 'ACCOUNTS_PAYABLE' }, + { code: '2200', ar: 'ضريبة القيمة المضافة', en: 'Value added tax', type: 'LIABILITY', parent: '2000', postable: false }, + { code: '2210', ar: 'ضريبة القيمة المضافة - المخرجات', en: 'VAT output', type: 'LIABILITY', parent: '2200', group: 'CURRENT_LIABILITIES', postable: true, systemKey: 'VAT_OUTPUT' }, + { code: '2220', ar: 'ضريبة القيمة المضافة - المدخلات', en: 'VAT input', type: 'LIABILITY', parent: '2200', group: 'CURRENT_LIABILITIES', postable: true, systemKey: 'VAT_INPUT' }, + + { code: '3000', ar: 'حقوق الملكية', en: 'Equity', type: 'EQUITY', postable: false }, + { code: '3100', ar: 'رأس المال', en: 'Capital', type: 'EQUITY', parent: '3000', group: 'EQUITY', postable: true, systemKey: 'CAPITAL' }, + { code: '3200', ar: 'الأرباح المحتجزة', en: 'Retained earnings', type: 'EQUITY', parent: '3000', group: 'EQUITY', postable: true, systemKey: 'RETAINED_EARNINGS' }, + + { code: '4000', ar: 'الإيرادات', en: 'Revenue', type: 'REVENUE', postable: false }, + { code: '4100', ar: 'المبيعات', en: 'Sales', type: 'REVENUE', parent: '4000', group: 'OPERATING_REVENUE', postable: true, systemKey: 'SALES' }, + + { code: '5000', ar: 'تكلفة المبيعات', en: 'Cost of goods sold', type: 'COST_OF_GOODS_SOLD', postable: false }, + { code: '5100', ar: 'تكلفة البضاعة المباعة', en: 'Cost of goods sold', type: 'COST_OF_GOODS_SOLD', parent: '5000', group: 'COST_OF_SALES', postable: true, systemKey: 'COGS' }, + + { code: '6000', ar: 'المصروفات', en: 'Expenses', type: 'EXPENSE', postable: false }, + { code: '6100', ar: 'الإيجار', en: 'Rent', type: 'EXPENSE', parent: '6000', group: 'OPERATING_EXPENSES', postable: true }, + { code: '6200', ar: 'الرواتب', en: 'Salaries', type: 'EXPENSE', parent: '6000', group: 'OPERATING_EXPENSES', postable: true }, + { code: '6300', ar: 'التسويق', en: 'Marketing', type: 'EXPENSE', parent: '6000', group: 'OPERATING_EXPENSES', postable: true }, + { code: '6400', ar: 'الكهرباء', en: 'Electricity', type: 'EXPENSE', parent: '6000', group: 'OPERATING_EXPENSES', postable: true }, +]; diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/company-context.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/company-context.ts new file mode 100644 index 000000000000..094a576762a0 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/company-context.ts @@ -0,0 +1,17 @@ +import type { Db } from '../../db/tx.js'; +import { badRequest, notFound } from '../../lib/errors.js'; + +/** + * Resolves the company a request works on. When the tenant has a single + * company, companyId may be omitted. + */ +export async function resolveCompanyId(db: Db, tenantId: string, companyId?: string | null): Promise { + if (companyId) { + const { rowCount } = await db.query(`SELECT 1 FROM companies WHERE tenant_id = $1 AND id = $2 AND deleted_at IS NULL`, [tenantId, companyId]); + if (!rowCount) throw notFound('Company'); + return companyId; + } + const { rows } = await db.query<{ id: string }>(`SELECT id FROM companies WHERE tenant_id = $1 AND deleted_at IS NULL LIMIT 2`, [tenantId]); + if (rows.length === 1) return rows[0]!.id; + throw badRequest('COMPANY_REQUIRED', 'companyId is required because this organization has more than one company'); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts new file mode 100644 index 000000000000..b24fc73735ba --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts @@ -0,0 +1,402 @@ +import type { Db } from '../../db/tx.js'; +import { AppError, badRequest, conflict, notFound } from '../../lib/errors.js'; +import { Decimal, sum, toMoney } from '../../lib/money.js'; +import { writeAudit, type AuditMeta } from '../audit/audit.service.js'; +import { PROFIT_AND_LOSS_TYPES } from './chart-template.js'; + +/** + * Accounting Engine. + * + * Every financial event in the system becomes a journal entry through this + * module. All functions take the caller's transaction (`db`) so a business + * document and its journal entry commit or roll back together. + * + * Life cycle: DRAFT → POSTED → (REVERSED). Posted entries are immutable; the + * database refuses changes even if this code had a bug. Corrections are made + * with a reversal entry followed by a new correcting entry. + */ + +export interface EngineContext { + tenantId: string; + userId: string; + meta?: AuditMeta; +} + +export interface LineInput { + accountId: string; + debit?: string; + credit?: string; + description?: string | null; + costCenterId?: string | null; + branchId?: string | null; +} + +export interface EntryInput { + companyId: string; + entryDate: string; + description: string; + lines: LineInput[]; + referenceType?: string; + referenceId?: string | null; + source?: 'MANUAL' | 'SYSTEM'; + correctionOfId?: string | null; +} + +interface NormalizedLine extends Required> { debit: string; credit: string } + +const unbalanced = (debit: Decimal, credit: Decimal) => + new AppError(400, 'UNBALANCED_ENTRY', `Journal entry is not balanced: debit ${toMoney(debit)}, credit ${toMoney(credit)}`, + { totalDebit: toMoney(debit), totalCredit: toMoney(credit), difference: toMoney(debit.minus(credit).abs()) }); + +/** Checks line shape and references. Balance is checked at posting. */ +async function normalizeLines(db: Db, companyId: string, lines: LineInput[]): Promise { + if (lines.length < 2) throw badRequest('TOO_FEW_LINES', 'A journal entry needs at least two lines'); + if (lines.length > 1000) throw badRequest('TOO_MANY_LINES', 'A journal entry can have at most 1000 lines'); + + const normalized = lines.map((l, i) => { + const debit = new Decimal(l.debit || '0'); + const credit = new Decimal(l.credit || '0'); + if (debit.isNegative() || credit.isNegative()) throw badRequest('INVALID_AMOUNT', `Line ${i + 1}: amounts cannot be negative`); + if (debit.decimalPlaces() > 2 || credit.decimalPlaces() > 2) throw badRequest('INVALID_AMOUNT', `Line ${i + 1}: at most 2 decimal places`); + if (debit.isZero() === credit.isZero()) { + throw badRequest('INVALID_LINE', `Line ${i + 1}: enter either a debit or a credit amount, not both or neither`); + } + return { + accountId: l.accountId, debit: toMoney(debit), credit: toMoney(credit), + description: l.description ?? null, costCenterId: l.costCenterId ?? null, branchId: l.branchId ?? null, + }; + }); + + const accountIds = [...new Set(normalized.map((l) => l.accountId))]; + const { rows: accounts } = await db.query<{ id: string; is_postable: boolean; is_active: boolean; code: string }>( + `SELECT id, is_postable, is_active, code FROM accounts + WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL`, + [companyId, accountIds]); + const byId = new Map(accounts.map((a) => [a.id, a])); + normalized.forEach((l, i) => { + const a = byId.get(l.accountId); + if (!a) throw badRequest('INVALID_ACCOUNT', `Line ${i + 1}: account does not exist in this company`); + if (!a.is_postable) throw badRequest('ACCOUNT_NOT_POSTABLE', `Line ${i + 1}: account ${a.code} is a header account`); + if (!a.is_active) throw badRequest('ACCOUNT_INACTIVE', `Line ${i + 1}: account ${a.code} is inactive`); + }); + + const costCenters = [...new Set(normalized.map((l) => l.costCenterId).filter(Boolean))] as string[]; + if (costCenters.length) { + const { rowCount } = await db.query( + `SELECT 1 FROM cost_centers WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL AND is_active`, + [companyId, costCenters]); + if (rowCount !== costCenters.length) throw badRequest('INVALID_COST_CENTER', 'A cost center does not exist or is inactive'); + } + const branches = [...new Set(normalized.map((l) => l.branchId).filter(Boolean))] as string[]; + if (branches.length) { + const { rowCount } = await db.query( + `SELECT 1 FROM branches WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL`, + [companyId, branches]); + if (rowCount !== branches.length) throw badRequest('INVALID_BRANCH', 'A branch does not exist in this company'); + } + return normalized; +} + +async function insertLines(db: Db, tenantId: string, companyId: string, entryId: string, lines: NormalizedLine[]) { + // One statement for all lines keeps large entries fast. + await db.query( + `INSERT INTO journal_entry_lines + (tenant_id, company_id, journal_entry_id, line_no, account_id, debit, credit, description, cost_center_id, branch_id) + SELECT $1, $2, $3, l.ord::smallint, l.account_id, l.debit, l.credit, l.description, l.cost_center_id, l.branch_id + FROM unnest($4::uuid[], $5::numeric[], $6::numeric[], $7::text[], $8::uuid[], $9::uuid[]) + WITH ORDINALITY AS l(account_id, debit, credit, description, cost_center_id, branch_id, ord)`, + [tenantId, companyId, entryId, + lines.map((l) => l.accountId), lines.map((l) => l.debit), lines.map((l) => l.credit), + lines.map((l) => l.description), lines.map((l) => l.costCenterId), lines.map((l) => l.branchId)]); +} + +async function assertCompany(db: Db, tenantId: string, companyId: string): Promise<{ currency: string }> { + const { rows: [c] } = await db.query<{ currency: string }>( + `SELECT currency FROM companies WHERE tenant_id = $1 AND id = $2 AND deleted_at IS NULL`, [tenantId, companyId]); + if (!c) throw notFound('Company'); + return c; +} + +export async function createDraft(db: Db, ctx: EngineContext, input: EntryInput): Promise { + const company = await assertCompany(db, ctx.tenantId, input.companyId); + const lines = await normalizeLines(db, input.companyId, input.lines); + const { rows: [entry] } = await db.query<{ id: string }>( + `INSERT INTO journal_entries (tenant_id, company_id, entry_date, description, reference_type, reference_id, + source, currency, correction_of_id, created_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id`, + [ctx.tenantId, input.companyId, input.entryDate, input.description, input.referenceType ?? 'MANUAL', + input.referenceId ?? null, input.source ?? 'MANUAL', company.currency, input.correctionOfId ?? null, ctx.userId]); + await insertLines(db, ctx.tenantId, input.companyId, entry!.id, lines); + await writeAudit(db, { + tenantId: ctx.tenantId, userId: ctx.userId, action: 'CREATE', entityType: 'journal_entry', entityId: entry!.id, + newValues: { ...input, lines }, + }, ctx.meta); + return entry!.id; +} + +async function lockEntry(db: Db, tenantId: string, id: string) { + const { rows: [e] } = await db.query<{ + id: string; company_id: string; status: string; entry_date: string; description: string; + source: string; reference_type: string; deleted_at: Date | null; fiscal_year_id: string | null; + }>( + `SELECT id, company_id, status, to_char(entry_date, 'YYYY-MM-DD') AS entry_date, description, source, + reference_type, deleted_at, fiscal_year_id + FROM journal_entries WHERE tenant_id = $1 AND id = $2 FOR UPDATE`, + [tenantId, id]); + if (!e || e.deleted_at) throw notFound('Journal entry'); + return e; +} + +export async function updateDraft(db: Db, ctx: EngineContext, id: string, input: Partial>) { + const e = await lockEntry(db, ctx.tenantId, id); + if (e.status !== 'DRAFT') throw conflict('ENTRY_NOT_DRAFT', 'Only draft entries can be edited. Reverse a posted entry instead.'); + if (e.source !== 'MANUAL') throw conflict('SYSTEM_ENTRY', 'System-generated entries cannot be edited here'); + const before = await getEntry(db, ctx.tenantId, id); + await db.query( + `UPDATE journal_entries SET entry_date = COALESCE($2, entry_date), description = COALESCE($3, description) WHERE id = $1`, + [id, input.entryDate ?? null, input.description ?? null]); + if (input.lines) { + const lines = await normalizeLines(db, e.company_id, input.lines); + await db.query(`DELETE FROM journal_entry_lines WHERE journal_entry_id = $1`, [id]); + await insertLines(db, ctx.tenantId, e.company_id, id, lines); + } + const after = await getEntry(db, ctx.tenantId, id); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'UPDATE', entityType: 'journal_entry', entityId: id, oldValues: before, newValues: after }, ctx.meta); + return after; +} + +export async function deleteDraft(db: Db, ctx: EngineContext, id: string) { + const e = await lockEntry(db, ctx.tenantId, id); + if (e.status !== 'DRAFT') throw conflict('ENTRY_NOT_DRAFT', 'Posted entries cannot be deleted. Reverse them instead.'); + if (e.source !== 'MANUAL') throw conflict('SYSTEM_ENTRY', 'System-generated entries cannot be deleted here'); + await db.query(`UPDATE journal_entries SET deleted_at = now() WHERE id = $1`, [id]); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'DELETE', entityType: 'journal_entry', entityId: id }, ctx.meta); +} + +/** + * Posts a draft: validates balance, accounts and the fiscal period, assigns + * the next gap-free number, and makes the entry immutable. + */ +export async function post(db: Db, ctx: EngineContext, id: string) { + const e = await lockEntry(db, ctx.tenantId, id); + if (e.status !== 'DRAFT') throw conflict('ENTRY_NOT_DRAFT', 'This entry is already posted'); + + // FOR SHARE blocks a concurrent period close until this transaction ends. + const { rows: [period] } = await db.query<{ id: string; status: string; year_id: string; year_status: string; year_start: string }>( + `SELECT p.id, p.status, y.id AS year_id, y.status AS year_status, to_char(y.start_date, 'YYYY') AS year_start + FROM fiscal_periods p JOIN fiscal_years y ON y.id = p.fiscal_year_id + WHERE p.company_id = $1 AND $2::date BETWEEN p.start_date AND p.end_date + FOR SHARE OF p, y`, + [e.company_id, e.entry_date]); + if (!period) throw badRequest('NO_FISCAL_PERIOD', `No fiscal period covers ${e.entry_date}. Create the fiscal year first.`); + if (period.status !== 'OPEN' || period.year_status !== 'OPEN') { + throw conflict('PERIOD_CLOSED', `The fiscal period for ${e.entry_date} is closed`); + } + + const { rows: lines } = await db.query<{ debit: string; credit: string; is_postable: boolean; is_active: boolean; deleted_at: Date | null; code: string }>( + `SELECT l.debit, l.credit, a.is_postable, a.is_active, a.deleted_at, a.code + FROM journal_entry_lines l JOIN accounts a ON a.id = l.account_id + WHERE l.journal_entry_id = $1`, + [id]); + if (lines.length < 2) throw badRequest('TOO_FEW_LINES', 'A journal entry needs at least two lines'); + const bad = lines.find((l) => !l.is_postable || !l.is_active || l.deleted_at); + if (bad) throw badRequest('ACCOUNT_INACTIVE', `Account ${bad.code} can no longer receive postings`); + const debit = sum(lines.map((l) => l.debit)); + const credit = sum(lines.map((l) => l.credit)); + if (!debit.equals(credit) || debit.isZero()) throw unbalanced(debit, credit); + + const { rows: [seq] } = await db.query<{ last_number: number }>( + `UPDATE journal_sequences SET last_number = last_number + 1 WHERE fiscal_year_id = $1 RETURNING last_number`, + [period.year_id]); + if (!seq) throw new AppError(500, 'SEQUENCE_MISSING', 'Journal sequence for the fiscal year is missing'); + const number = `JV-${period.year_start}-${String(seq.last_number).padStart(6, '0')}`; + + await db.query( + `UPDATE journal_entries + SET status = 'POSTED', entry_number = $2, fiscal_year_id = $3, fiscal_period_id = $4, + posted_by = $5, posted_at = now() + WHERE id = $1`, + [id, number, period.year_id, period.id, ctx.userId]); + await writeAudit(db, { + tenantId: ctx.tenantId, userId: ctx.userId, action: 'POST', entityType: 'journal_entry', entityId: id, + newValues: { entryNumber: number, totalDebit: toMoney(debit), totalCredit: toMoney(credit) }, + }, ctx.meta); + return getEntry(db, ctx.tenantId, id); +} + +/** Creates and posts an entry in one step. Used by sales, purchases, payments, etc. */ +export async function postEntry(db: Db, ctx: EngineContext, input: EntryInput) { + const id = await createDraft(db, ctx, input); + return post(db, ctx, id); +} + +export interface ReverseOptions { + date?: string; + reason: string; + /** System documents (invoices…) reverse their own entries; manual reversal is limited to manual entries. */ + allowSystem?: boolean; +} + +/** + * Reverses a posted entry with a mirror entry (debits and credits swapped) + * and marks the original REVERSED. The original stays in the ledger. + */ +export async function reverse(db: Db, ctx: EngineContext, id: string, opts: ReverseOptions) { + const e = await lockEntry(db, ctx.tenantId, id); + if (e.status === 'REVERSED') throw conflict('ALREADY_REVERSED', 'This entry has already been reversed'); + if (e.status !== 'POSTED') throw conflict('ENTRY_NOT_POSTED', 'Only posted entries can be reversed. Delete or edit the draft instead.'); + if (e.reference_type === 'REVERSAL') { + throw conflict('CANNOT_REVERSE_REVERSAL', 'A reversal entry cannot be reversed. Post a new entry instead.'); + } + if (e.source === 'SYSTEM' && !opts.allowSystem) { + throw conflict('SYSTEM_ENTRY', 'This entry was generated by a document. Cancel or return the document instead.'); + } + + const { rows: lines } = await db.query<{ account_id: string; debit: string; credit: string; description: string | null; cost_center_id: string | null; branch_id: string | null }>( + `SELECT account_id, debit, credit, description, cost_center_id, branch_id + FROM journal_entry_lines WHERE journal_entry_id = $1 ORDER BY line_no`, [id]); + + const reversalId = await createDraft(db, ctx, { + companyId: e.company_id, + entryDate: opts.date ?? e.entry_date, + description: `عكس القيد: ${e.description} — ${opts.reason}`.slice(0, 1000), + referenceType: 'REVERSAL', + referenceId: id, + source: e.source as 'MANUAL' | 'SYSTEM', + lines: lines.map((l) => ({ + accountId: l.account_id, debit: l.credit, credit: l.debit, + description: l.description, costCenterId: l.cost_center_id, branchId: l.branch_id, + })), + }); + await db.query(`UPDATE journal_entries SET reversal_of_id = $2 WHERE id = $1`, [reversalId, id]); + const reversal = await post(db, ctx, reversalId); + + await db.query( + `UPDATE journal_entries SET status = 'REVERSED', reversed_by_entry_id = $2, reversed_at = now(), reversed_by = $3 WHERE id = $1`, + [id, reversalId, ctx.userId]); + await writeAudit(db, { + tenantId: ctx.tenantId, userId: ctx.userId, action: 'REVERSE', entityType: 'journal_entry', entityId: id, + newValues: { reversalEntryId: reversalId, reversalNumber: reversal.entryNumber, reason: opts.reason }, + }, ctx.meta); + return reversal; +} + +/** + * Closes a fiscal year: transfers the net of all revenue, cost of sales and + * expense accounts to retained earnings with a posted closing entry, then + * closes every period and the year. + */ +export async function closeFiscalYear(db: Db, ctx: EngineContext, yearId: string) { + const { rows: [year] } = await db.query<{ id: string; company_id: string; status: string; start_date: string; end_date: string }>( + `SELECT id, company_id, status, to_char(start_date, 'YYYY-MM-DD') AS start_date, to_char(end_date, 'YYYY-MM-DD') AS end_date + FROM fiscal_years WHERE tenant_id = $1 AND id = $2 FOR UPDATE`, [ctx.tenantId, yearId]); + if (!year) throw notFound('Fiscal year'); + if (year.status === 'CLOSED') throw conflict('YEAR_CLOSED', 'This fiscal year is already closed'); + + const earlierOpen = await db.query( + `SELECT 1 FROM fiscal_years WHERE company_id = $1 AND end_date < $2 AND status = 'OPEN' LIMIT 1`, [year.company_id, year.start_date]); + if (earlierOpen.rowCount) throw conflict('EARLIER_YEAR_OPEN', 'Close earlier fiscal years first'); + + const drafts = await db.query( + `SELECT 1 FROM journal_entries WHERE company_id = $1 AND status = 'DRAFT' AND deleted_at IS NULL + AND entry_date BETWEEN $2 AND $3 LIMIT 1`, [year.company_id, year.start_date, year.end_date]); + if (drafts.rowCount) throw conflict('DRAFTS_EXIST', 'Post or delete the draft entries of this year before closing it'); + + const { rows: [re] } = await db.query<{ id: string }>( + `SELECT id FROM accounts WHERE company_id = $1 AND system_key = 'RETAINED_EARNINGS' AND deleted_at IS NULL AND is_active AND is_postable`, + [year.company_id]); + if (!re) throw conflict('RETAINED_EARNINGS_MISSING', 'An active retained earnings account (system key RETAINED_EARNINGS) is required'); + + const { rows: balances } = await db.query<{ account_id: string; net: string }>( + `SELECT l.account_id, sum(l.debit - l.credit) AS net + FROM journal_entry_lines l + JOIN journal_entries e ON e.id = l.journal_entry_id + JOIN accounts a ON a.id = l.account_id + WHERE e.company_id = $1 AND e.status IN ('POSTED', 'REVERSED') + AND e.entry_date BETWEEN $2 AND $3 + AND a.account_type = ANY($4::text[]) + GROUP BY l.account_id + HAVING sum(l.debit - l.credit) <> 0`, + [year.company_id, year.start_date, year.end_date, PROFIT_AND_LOSS_TYPES]); + + let closingEntryId: string | null = null; + if (balances.length) { + const lines: LineInput[] = balances.map((b) => { + const net = new Decimal(b.net); + return net.isPositive() ? { accountId: b.account_id, credit: toMoney(net) } : { accountId: b.account_id, debit: toMoney(net.abs()) }; + }); + // Positive total = expenses exceed revenue (a loss) → debit retained earnings. + const result = sum(balances.map((b) => b.net)); + if (!result.isZero()) { + lines.push(result.isPositive() ? { accountId: re.id, debit: toMoney(result) } : { accountId: re.id, credit: toMoney(result.abs()) }); + } + const closing = await postEntry(db, ctx, { + companyId: year.company_id, entryDate: year.end_date, description: 'قيد إقفال السنة المالية', + referenceType: 'YEAR_CLOSING', referenceId: year.id, source: 'SYSTEM', lines, + }); + closingEntryId = closing.id; + } + + await db.query( + `UPDATE fiscal_periods SET status = 'CLOSED', closed_at = COALESCE(closed_at, now()), closed_by = COALESCE(closed_by, $2) + WHERE fiscal_year_id = $1 AND status = 'OPEN'`, [year.id, ctx.userId]); + await db.query( + `UPDATE fiscal_years SET status = 'CLOSED', closing_entry_id = $2, closed_at = now(), closed_by = $3 WHERE id = $1`, + [year.id, closingEntryId, ctx.userId]); + await writeAudit(db, { + tenantId: ctx.tenantId, userId: ctx.userId, action: 'CLOSE', entityType: 'fiscal_year', entityId: year.id, + newValues: { closingEntryId }, + }, ctx.meta); + return { closingEntryId }; +} + +export interface EntryView { + id: string; + companyId: string; + entryNumber: string | null; + entryDate: string; + description: string; + referenceType: string; + referenceId: string | null; + source: string; + status: string; + currency: string; + totalDebit: string; + totalCredit: string; + fiscalPeriodId: string | null; + reversalOfId: string | null; + reversedByEntryId: string | null; + correctionOfId: string | null; + createdBy: string | null; + postedAt: Date | null; + postedBy: string | null; + reversedAt: Date | null; + createdAt: Date; + lines: { + id: string; lineNo: number; accountId: string; accountCode: string; accountName: string; + debit: string; credit: string; description: string | null; costCenterId: string | null; branchId: string | null; + }[]; +} + +export async function getEntry(db: Db, tenantId: string, id: string): Promise { + const { rows: [e] } = await db.query>( + `SELECT e.id, e.company_id AS "companyId", e.entry_number AS "entryNumber", + to_char(e.entry_date, 'YYYY-MM-DD') AS "entryDate", e.description, + e.reference_type AS "referenceType", e.reference_id AS "referenceId", e.source, e.status, e.currency, + CASE WHEN e.status = 'DRAFT' THEN COALESCE((SELECT sum(debit) FROM journal_entry_lines WHERE journal_entry_id = e.id), 0) ELSE e.total_debit END::numeric(18,2)::text AS "totalDebit", + CASE WHEN e.status = 'DRAFT' THEN COALESCE((SELECT sum(credit) FROM journal_entry_lines WHERE journal_entry_id = e.id), 0) ELSE e.total_credit END::numeric(18,2)::text AS "totalCredit", + e.fiscal_period_id AS "fiscalPeriodId", e.reversal_of_id AS "reversalOfId", + e.reversed_by_entry_id AS "reversedByEntryId", e.correction_of_id AS "correctionOfId", + e.created_by AS "createdBy", e.posted_at AS "postedAt", e.posted_by AS "postedBy", + e.reversed_at AS "reversedAt", e.created_at AS "createdAt" + FROM journal_entries e WHERE e.tenant_id = $1 AND e.id = $2 AND e.deleted_at IS NULL`, + [tenantId, id]); + if (!e) throw notFound('Journal entry'); + const { rows: lines } = await db.query( + `SELECT l.id, l.line_no AS "lineNo", l.account_id AS "accountId", a.code AS "accountCode", a.name_ar AS "accountName", + l.debit::text AS debit, l.credit::text AS credit, l.description, + l.cost_center_id AS "costCenterId", l.branch_id AS "branchId" + FROM journal_entry_lines l JOIN accounts a ON a.id = l.account_id + WHERE l.journal_entry_id = $1 ORDER BY l.line_no`, [id]); + return { ...e, lines }; +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/fiscal.routes.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/fiscal.routes.ts new file mode 100644 index 000000000000..0ba7bce851c7 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/fiscal.routes.ts @@ -0,0 +1,83 @@ +import type { FastifyInstance, FastifyRequest } from 'fastify'; +import { z } from 'zod'; +import { isoDate } from '../../lib/dates.js'; +import { conflict, notFound } from '../../lib/errors.js'; +import { parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { writeAudit } from '../audit/audit.service.js'; +import { resolveCompanyId } from './company-context.js'; +import { closeFiscalYear } from './engine.js'; +import { createFiscalYear } from './setup.js'; + +export default async function fiscalRoutes(app: FastifyInstance) { + const canView = requirePermission(app, 'account.view'); + const canManage = requirePermission(app, 'fiscal.manage'); + + app.get('/fiscal-years', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query( + `SELECT y.id, y.name, to_char(y.start_date, 'YYYY-MM-DD') AS "startDate", to_char(y.end_date, 'YYYY-MM-DD') AS "endDate", + y.status, y.closing_entry_id AS "closingEntryId", y.closed_at AS "closedAt", + COALESCE(json_agg(json_build_object( + 'id', p.id, 'periodNumber', p.period_number, 'name', p.name, + 'startDate', to_char(p.start_date, 'YYYY-MM-DD'), 'endDate', to_char(p.end_date, 'YYYY-MM-DD'), + 'status', p.status) ORDER BY p.period_number), '[]') AS periods + FROM fiscal_years y LEFT JOIN fiscal_periods p ON p.fiscal_year_id = y.id + WHERE y.tenant_id = $1 AND y.company_id = $2 + GROUP BY y.id ORDER BY y.start_date DESC`, + [req.auth!.tenantId, companyId]); + return { data: rows }; + }); + }); + + app.post('/fiscal-years', { preHandler: canManage }, async (req, reply) => { + const body = parse(z.object({ + companyId: z.uuid().optional(), + startDate: isoDate, + endDate: isoDate.optional(), + name: z.string().trim().min(1).max(100).optional(), + }), req.body); + const a = req.auth!; + const id = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + const yearId = await createFiscalYear(db, { tenantId: a.tenantId, companyId, userId: a.userId }, body.startDate, body.endDate, body.name); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'fiscal_year', entityId: yearId, newValues: body }, req.auditMeta()); + return yearId; + }); + reply.code(201); + return { id }; + }); + + app.post('/fiscal-years/:id/close', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + return req.tenantTx((db) => closeFiscalYear(db, { tenantId: a.tenantId, userId: a.userId, meta: req.auditMeta() }, id)); + }); + + const setPeriodStatus = (status: 'OPEN' | 'CLOSED') => async (req: FastifyRequest) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + return req.tenantTx(async (db) => { + // FOR UPDATE waits for postings that hold the period FOR SHARE. + const { rows: [p] } = await db.query<{ status: string; year_status: string }>( + `SELECT p.status, y.status AS year_status FROM fiscal_periods p JOIN fiscal_years y ON y.id = p.fiscal_year_id + WHERE p.tenant_id = $1 AND p.id = $2 FOR UPDATE OF p`, [a.tenantId, id]); + if (!p) throw notFound('Fiscal period'); + if (p.year_status === 'CLOSED') throw conflict('YEAR_CLOSED', 'The fiscal year is closed'); + if (p.status === status) throw conflict('NO_CHANGE', `The period is already ${status.toLowerCase()}`); + await db.query( + `UPDATE fiscal_periods SET status = $2, + closed_at = CASE WHEN $2 = 'CLOSED' THEN now() END, closed_by = CASE WHEN $2 = 'CLOSED' THEN $3::uuid END + WHERE id = $1`, [id, status, a.userId]); + await writeAudit(db, { + tenantId: a.tenantId, userId: a.userId, action: status === 'CLOSED' ? 'CLOSE' : 'REOPEN', + entityType: 'fiscal_period', entityId: id, oldValues: { status: p.status }, newValues: { status }, + }, req.auditMeta()); + return { id, status }; + }); + }; + app.post('/fiscal-periods/:id/close', { preHandler: canManage }, setPeriodStatus('CLOSED')); + app.post('/fiscal-periods/:id/reopen', { preHandler: canManage }, setPeriodStatus('OPEN')); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts new file mode 100644 index 000000000000..e76b45117ab0 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts @@ -0,0 +1,132 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import { isoDate } from '../../lib/dates.js'; +import { forbidden } from '../../lib/errors.js'; +import { amountString } from '../../lib/money.js'; +import { parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { resolveCompanyId } from './company-context.js'; +import { createDraft, deleteDraft, getEntry, post, reverse, updateDraft, type EngineContext } from './engine.js'; + +const line = z.object({ + accountId: z.uuid(), + debit: amountString.optional(), + credit: amountString.optional(), + description: z.string().trim().max(500).nullish(), + costCenterId: z.uuid().nullish(), + branchId: z.uuid().nullish(), +}); +const lines = z.array(line).min(2).max(1000); + +const createBody = z.object({ + companyId: z.uuid().optional(), + entryDate: isoDate, + description: z.string().trim().min(1).max(1000), + lines, + /** Post immediately (requires journal.post). */ + post: z.boolean().default(false), +}); + +const listQuery = z.object({ + companyId: z.uuid().optional(), + status: z.enum(['DRAFT', 'POSTED', 'REVERSED']).optional(), + dateFrom: isoDate.optional(), + dateTo: isoDate.optional(), + accountId: z.uuid().optional(), + referenceType: z.string().regex(/^[A-Z_]+$/).optional(), + search: z.string().trim().max(100).optional(), + limit: z.coerce.number().int().min(1).max(200).default(50), + offset: z.coerce.number().int().min(0).default(0), +}); + +export default async function journalRoutes(app: FastifyInstance) { + const ctxOf = (req: { auth: { tenantId: string; userId: string } | null; auditMeta: () => EngineContext['meta'] }): EngineContext => + ({ tenantId: req.auth!.tenantId, userId: req.auth!.userId, meta: req.auditMeta() }); + + app.get('/journal-entries', { preHandler: requirePermission(app, 'journal.view') }, async (req) => { + const q = parse(listQuery, req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query<{ total: string }>( + `SELECT e.id, e.entry_number AS "entryNumber", to_char(e.entry_date, 'YYYY-MM-DD') AS "entryDate", + e.description, e.reference_type AS "referenceType", e.source, e.status, + CASE WHEN e.status = 'DRAFT' THEN COALESCE((SELECT sum(debit) FROM journal_entry_lines WHERE journal_entry_id = e.id), 0) + ELSE e.total_debit END::numeric(18,2)::text AS "totalDebit", + e.posted_at AS "postedAt", e.created_at AS "createdAt", + count(*) OVER () AS total + FROM journal_entries e + WHERE e.tenant_id = $1 AND e.company_id = $2 AND e.deleted_at IS NULL + AND ($3::text IS NULL OR e.status = $3) + AND ($4::date IS NULL OR e.entry_date >= $4) + AND ($5::date IS NULL OR e.entry_date <= $5) + AND ($6::uuid IS NULL OR EXISTS (SELECT 1 FROM journal_entry_lines l WHERE l.journal_entry_id = e.id AND l.account_id = $6)) + AND ($7::text IS NULL OR e.reference_type = $7) + AND ($8::text IS NULL OR e.description ILIKE '%' || $8 || '%' OR e.entry_number ILIKE '%' || $8 || '%') + ORDER BY e.entry_date DESC, e.entry_number DESC NULLS FIRST, e.created_at DESC + LIMIT $9 OFFSET $10`, + [req.auth!.tenantId, companyId, q.status ?? null, q.dateFrom ?? null, q.dateTo ?? null, q.accountId ?? null, + q.referenceType ?? null, q.search?.replace(/[%_\\]/g, (m) => `\\${m}`) ?? null, q.limit, q.offset]); + return { data: rows.map(({ total: _t, ...r }) => r), total: Number(rows[0]?.total ?? 0) }; + }); + }); + + app.get('/journal-entries/:id', { preHandler: requirePermission(app, 'journal.view') }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx((db) => getEntry(db, req.auth!.tenantId, id)); + }); + + app.post('/journal-entries', { preHandler: requirePermission(app, 'journal.create') }, async (req, reply) => { + const body = parse(createBody, req.body); + if (body.post && !req.auth!.permissions.has('journal.post')) throw forbidden('Missing permission: journal.post'); + const ctx = ctxOf(req); + const entry = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, ctx.tenantId, body.companyId); + const id = await createDraft(db, ctx, { companyId, entryDate: body.entryDate, description: body.description, lines: body.lines }); + return body.post ? post(db, ctx, id) : getEntry(db, ctx.tenantId, id); + }); + reply.code(201); + return entry; + }); + + app.patch('/journal-entries/:id', { preHandler: requirePermission(app, 'journal.create') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ entryDate: isoDate, description: z.string().trim().min(1).max(1000), lines }).partial(), req.body); + return req.tenantTx((db) => updateDraft(db, ctxOf(req), id, body)); + }); + + app.delete('/journal-entries/:id', { preHandler: requirePermission(app, 'journal.create') }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + await req.tenantTx((db) => deleteDraft(db, ctxOf(req), id)); + return reply.code(204).send(); + }); + + app.post('/journal-entries/:id/post', { preHandler: requirePermission(app, 'journal.post') }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx((db) => post(db, ctxOf(req), id)); + }); + + /** + * Reverses a posted manual entry. With `correction`, also creates the + * correcting entry as a draft linked to the original, in the same transaction. + */ + app.post('/journal-entries/:id/reverse', { preHandler: requirePermission(app, 'journal.reverse') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ + reason: z.string().trim().min(3).max(500), + date: isoDate.optional(), + correction: z.object({ entryDate: isoDate, description: z.string().trim().min(1).max(1000), lines }).optional(), + }), req.body); + if (body.correction && !req.auth!.permissions.has('journal.create')) throw forbidden('Missing permission: journal.create'); + const ctx = ctxOf(req); + return req.tenantTx(async (db) => { + const original = await getEntry(db, ctx.tenantId, id); + const reversal = await reverse(db, ctx, id, { reason: body.reason, date: body.date }); + let correction = null; + if (body.correction) { + const cid = await createDraft(db, ctx, { companyId: original.companyId, ...body.correction, correctionOfId: id }); + correction = await getEntry(db, ctx.tenantId, cid); + } + return { original: await getEntry(db, ctx.tenantId, id), reversal, correction }; + }); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts new file mode 100644 index 000000000000..855e86a2d79f --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts @@ -0,0 +1,102 @@ +import type { Db } from '../../db/tx.js'; +import { addDays, addMonths, todayIn } from '../../lib/dates.js'; +import { badRequest, conflict } from '../../lib/errors.js'; +import { DEFAULT_ACCOUNTS, DEFAULT_GROUPS } from './chart-template.js'; + +export interface CompanyRef { tenantId: string; companyId: string; userId: string } + +/** Creates the default account groups and chart of accounts. Skips if the company already has accounts. */ +export async function seedDefaultChart(db: Db, ref: CompanyRef): Promise { + const existing = await db.query(`SELECT 1 FROM accounts WHERE company_id = $1 AND deleted_at IS NULL LIMIT 1`, [ref.companyId]); + if (existing.rowCount) return false; + + const groupIds = new Map(); + for (const g of DEFAULT_GROUPS) { + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO account_groups (tenant_id, company_id, code, name_ar, name_en, account_type, sort_order, is_system) + VALUES ($1, $2, $3, $4, $5, $6, $7, true) + ON CONFLICT (company_id, code) DO UPDATE SET code = EXCLUDED.code + RETURNING id`, + [ref.tenantId, ref.companyId, g.code, g.ar, g.en, g.type, g.sort]); + groupIds.set(g.code, row!.id); + } + + const accountIds = new Map(); + for (const a of DEFAULT_ACCOUNTS) { + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO accounts (tenant_id, company_id, code, name_ar, name_en, account_type, parent_id, group_id, + is_postable, is_system, system_key, created_by, updated_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true, $10, $11, $11) RETURNING id`, + [ref.tenantId, ref.companyId, a.code, a.ar, a.en, a.type, + a.parent ? accountIds.get(a.parent)! : null, a.group ? groupIds.get(a.group)! : null, + a.postable, a.systemKey ?? null, ref.userId]); + accountIds.set(a.code, row!.id); + } + return true; +} + +const MONTHS_AR = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر']; + +/** + * Creates a fiscal year with monthly periods. `startDate` must be the 1st of + * a month. Without `endDate` the year is 12 months. The last period may be + * shorter or longer only through an explicit endDate (first/last years). + */ +export async function createFiscalYear(db: Db, ref: CompanyRef, startDate: string, endDate?: string, name?: string) { + if (!startDate.endsWith('-01')) throw badRequest('INVALID_FISCAL_START', 'A fiscal year must start on the first day of a month'); + const end = endDate ?? addDays(addMonths(startDate, 12), -1); + if (end <= startDate) throw badRequest('INVALID_FISCAL_END', 'Fiscal year end must be after its start'); + + const overlap = await db.query( + `SELECT 1 FROM fiscal_years WHERE company_id = $1 AND daterange(start_date, end_date, '[]') && daterange($2::date, $3::date, '[]')`, + [ref.companyId, startDate, end]); + if (overlap.rowCount) throw conflict('FISCAL_YEAR_OVERLAP', 'This fiscal year overlaps an existing one'); + + const yearName = name ?? (startDate.slice(0, 4) === end.slice(0, 4) ? startDate.slice(0, 4) : `${startDate.slice(0, 4)}/${end.slice(0, 4)}`); + const { rows: [year] } = await db.query<{ id: string }>( + `INSERT INTO fiscal_years (tenant_id, company_id, name, start_date, end_date, created_by) + VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`, + [ref.tenantId, ref.companyId, yearName, startDate, end, ref.userId]); + + let periodStart = startDate; + let n = 1; + while (periodStart <= end) { + const monthEnd = addDays(addMonths(periodStart, 1), -1); + const periodEnd = monthEnd > end ? end : monthEnd; + const month = Number(periodStart.slice(5, 7)); + await db.query( + `INSERT INTO fiscal_periods (tenant_id, company_id, fiscal_year_id, period_number, name, start_date, end_date) + VALUES ($1, $2, $3, $4, $5, $6, $7)`, + [ref.tenantId, ref.companyId, year!.id, n, `${MONTHS_AR[month - 1]} ${periodStart.slice(0, 4)}`, periodStart, periodEnd]); + periodStart = addDays(periodEnd, 1); + n += 1; + if (n > 18) throw badRequest('FISCAL_YEAR_TOO_LONG', 'A fiscal year can have at most 18 periods'); + } + await db.query(`INSERT INTO journal_sequences (fiscal_year_id, tenant_id, company_id) VALUES ($1, $2, $3)`, + [year!.id, ref.tenantId, ref.companyId]); + return year!.id; +} + +/** Start date (1st of month) of the fiscal year that contains `today`. */ +export function currentFiscalYearStart(today: string, startMonth: number): string { + const year = Number(today.slice(0, 4)); + const month = Number(today.slice(5, 7)); + const startYear = month >= startMonth ? year : year - 1; + return `${startYear}-${String(startMonth).padStart(2, '0')}-01`; +} + +/** + * Prepares a new company for accounting: default chart and the current + * fiscal year. Safe to call again; existing setup is left as is. + */ +export async function setupCompanyAccounting(db: Db, ref: CompanyRef, timezone = 'Asia/Riyadh') { + const chartCreated = await seedDefaultChart(db, ref); + let fiscalYearId: string | null = null; + const hasYear = await db.query(`SELECT 1 FROM fiscal_years WHERE company_id = $1 LIMIT 1`, [ref.companyId]); + if (!hasYear.rowCount) { + const { rows: [s] } = await db.query<{ fiscal_year_start_month: number }>( + `SELECT fiscal_year_start_month FROM tenant_settings WHERE tenant_id = $1`, [ref.tenantId]); + fiscalYearId = await createFiscalYear(db, ref, currentFiscalYearStart(todayIn(timezone), s?.fiscal_year_start_month ?? 1)); + } + return { chartCreated, fiscalYearCreated: fiscalYearId !== null }; +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/trial-balance.routes.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/trial-balance.routes.ts new file mode 100644 index 000000000000..e03b26ca481c --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/trial-balance.routes.ts @@ -0,0 +1,70 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import { isoDate } from '../../lib/dates.js'; +import { badRequest } from '../../lib/errors.js'; +import { Decimal, sum, toMoney } from '../../lib/money.js'; +import { parse } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { resolveCompanyId } from './company-context.js'; + +/** + * Trial balance from posted journal lines only (reversed entries and their + * reversals both count, so they cancel out). Other reports arrive in Phase 7. + */ +export default async function trialBalanceRoutes(app: FastifyInstance) { + app.get('/reports/trial-balance', { preHandler: requirePermission(app, 'report.view') }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), + dateFrom: isoDate, + dateTo: isoDate, + includeZero: z.enum(['true', 'false']).optional(), + branchId: z.uuid().optional(), + }), req.query); + if (q.dateFrom > q.dateTo) throw badRequest('INVALID_RANGE', 'dateFrom must be on or before dateTo'); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query<{ + accountId: string; code: string; nameAr: string; type: string; + openingDebit: string; openingCredit: string; periodDebit: string; periodCredit: string; + }>( + `WITH movements AS ( + SELECT l.account_id, + sum(CASE WHEN e.entry_date < $3 THEN l.debit - l.credit ELSE 0 END) AS opening, + sum(CASE WHEN e.entry_date >= $3 THEN l.debit ELSE 0 END) AS period_debit, + sum(CASE WHEN e.entry_date >= $3 THEN l.credit ELSE 0 END) AS period_credit + FROM journal_entry_lines l JOIN journal_entries e ON e.id = l.journal_entry_id + WHERE e.tenant_id = $1 AND e.company_id = $2 AND e.status IN ('POSTED', 'REVERSED') + AND e.entry_date <= $4 AND ($6::uuid IS NULL OR l.branch_id = $6) + GROUP BY l.account_id) + SELECT a.id AS "accountId", a.code, a.name_ar AS "nameAr", a.account_type AS type, + GREATEST(COALESCE(m.opening, 0), 0)::numeric(18,2)::text AS "openingDebit", + GREATEST(-COALESCE(m.opening, 0), 0)::numeric(18,2)::text AS "openingCredit", + COALESCE(m.period_debit, 0)::numeric(18,2)::text AS "periodDebit", + COALESCE(m.period_credit, 0)::numeric(18,2)::text AS "periodCredit" + FROM accounts a LEFT JOIN movements m ON m.account_id = a.id + WHERE a.tenant_id = $1 AND a.company_id = $2 AND a.is_postable AND a.deleted_at IS NULL + AND ($5::boolean OR m.account_id IS NOT NULL) + ORDER BY a.code`, + [req.auth!.tenantId, companyId, q.dateFrom, q.dateTo, q.includeZero === 'true', q.branchId ?? null]); + + const data = rows.map((r) => { + const closing = new Decimal(r.openingDebit).minus(r.openingCredit).plus(r.periodDebit).minus(r.periodCredit); + return { + ...r, + closingDebit: toMoney(Decimal.max(closing, 0)), + closingCredit: toMoney(Decimal.max(closing.neg(), 0)), + }; + }); + const total = (k: keyof (typeof data)[number]) => toMoney(sum(data.map((r) => r[k] as string))); + const totals = { + openingDebit: total('openingDebit'), openingCredit: total('openingCredit'), + periodDebit: total('periodDebit'), periodCredit: total('periodCredit'), + closingDebit: total('closingDebit'), closingCredit: total('closingCredit'), + }; + return { + companyId, dateFrom: q.dateFrom, dateTo: q.dateTo, data, totals, + balanced: totals.openingDebit === totals.openingCredit && totals.periodDebit === totals.periodCredit && totals.closingDebit === totals.closingCredit, + }; + }); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts b/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts index 101e2f52b972..4de16a43e589 100644 --- a/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts +++ b/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts @@ -4,7 +4,8 @@ export type AuditAction = | 'REGISTER' | 'LOGIN' | 'LOGIN_FAILED' | 'LOGOUT' | 'TOKEN_REUSE_DETECTED' | 'TENANT_SWITCH' | 'PASSWORD_CHANGE' | 'CREATE' | 'UPDATE' | 'DELETE' - | 'SETTINGS_CHANGE' | 'PERMISSION_CHANGE'; + | 'SETTINGS_CHANGE' | 'PERMISSION_CHANGE' + | 'POST' | 'REVERSE' | 'CLOSE' | 'REOPEN'; export interface AuditMeta { ip?: string | null; diff --git a/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts b/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts index b4be4c25568f..b2a158005cbd 100644 --- a/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts +++ b/alshuyukh-accounting/apps/api/src/modules/auth/auth.service.ts @@ -4,6 +4,7 @@ import { AppError, conflict, forbidden, unauthorized } from '../../lib/errors.js import { getDummyHash, hashPassword, verifyPassword } from '../../lib/password.js'; import { hashToken, newRefreshToken } from '../../lib/tokens.js'; import type { Deps } from '../../types.js'; +import { setupCompanyAccounting } from '../accounting/setup.js'; import { writeAudit, type AuditMeta } from '../audit/audit.service.js'; export interface Membership { @@ -78,6 +79,7 @@ export class AuthService { VALUES ($1, $2, $3, 'MAIN', 'المستودع الرئيسي', $4)`, [tenantId, company!.id, branch!.id, uid], ); + await setupCompanyAccounting(db, { tenantId, companyId: company!.id, userId: uid }); await writeAudit(db, { tenantId, userId: uid, action: 'REGISTER', entityType: 'tenant', entityId: tenantId, newValues: { tenantName: input.tenantName, companyName: input.companyName, email: input.email }, diff --git a/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts b/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts index dc6da4290713..4108a0a4e24a 100644 --- a/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts +++ b/alshuyukh-accounting/apps/api/src/modules/companies/companies.routes.ts @@ -4,6 +4,7 @@ import type { Db } from '../../db/tx.js'; import { conflict, notFound } from '../../lib/errors.js'; import { optionalText, parse, timezone, uuidParam } from '../../lib/validation.js'; import { requirePermission } from '../../plugins/auth.js'; +import { setupCompanyAccounting } from '../accounting/setup.js'; import { writeAudit } from '../audit/audit.service.js'; const companyFields = { @@ -106,7 +107,8 @@ export default async function companiesRoutes(app: FastifyInstance) { `INSERT INTO companies (tenant_id, created_by, updated_by${cols.map((c) => `, ${c}`).join('')}) VALUES ($1, $2, $3${values.map((_, i) => `, $${i + 4}`).join('')}) RETURNING id`, [a.tenantId, a.userId, a.userId, ...values]); - const created = await findOne(db, COMPANY_SELECT, a.tenantId, c!.id); + const created = await findOne<{ timezone: string }>(db, COMPANY_SELECT, a.tenantId, c!.id); + await setupCompanyAccounting(db, { tenantId: a.tenantId, companyId: c!.id, userId: a.userId }, created!.timezone); await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'company', entityId: c!.id, newValues: created }, req.auditMeta()); return created; }); @@ -141,7 +143,8 @@ export default async function companiesRoutes(app: FastifyInstance) { const { rows: [count] } = await db.query<{ n: string }>( `SELECT count(*) AS n FROM companies WHERE tenant_id = $1 AND deleted_at IS NULL`, [a.tenantId]); if (Number(count!.n) <= 1) throw conflict('LAST_COMPANY', 'An organization must keep at least one company'); - // TODO(Phase 2): refuse when the company has posted journal entries. + const posted = await db.query(`SELECT 1 FROM journal_entries WHERE company_id = $1 AND status <> 'DRAFT' LIMIT 1`, [id]); + if (posted.rowCount) throw conflict('COMPANY_HAS_LEDGER', 'A company with posted journal entries cannot be deleted. Deactivate it instead.'); await db.query(`UPDATE companies SET deleted_at = now(), is_active = false, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, [a.tenantId, id, a.userId]); await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'company', entityId: id, oldValues: before }, req.auditMeta()); }); diff --git a/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts b/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts index 9cd1b8f3533c..2dc6b63a7d2d 100644 --- a/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts +++ b/alshuyukh-accounting/apps/api/src/modules/settings/settings.routes.ts @@ -1,5 +1,6 @@ import type { FastifyInstance } from 'fastify'; import { z } from 'zod'; +import { conflict } from '../../lib/errors.js'; import { parse, timezone } from '../../lib/validation.js'; import { requireAuth, requirePermission } from '../../plugins/auth.js'; import { writeAudit } from '../audit/audit.service.js'; @@ -27,7 +28,10 @@ export default async function settingsRoutes(app: FastifyInstance) { return req.tenantTx(async (db) => { const before = (await db.query(SELECT, [a.tenantId])).rows[0]; if (body.tenantName) await db.query(`UPDATE tenants SET name = $2 WHERE id = $1`, [a.tenantId, body.tenantName]); - // TODO(Phase 2): block fiscalYearStartMonth changes once a fiscal year exists. + if (body.fiscalYearStartMonth !== undefined && body.fiscalYearStartMonth !== before.fiscalYearStartMonth) { + const years = await db.query(`SELECT 1 FROM fiscal_years WHERE tenant_id = $1 LIMIT 1`, [a.tenantId]); + if (years.rowCount) throw conflict('FISCAL_YEARS_EXIST', 'The fiscal year start month cannot change after fiscal years have been created'); + } await db.query( `UPDATE tenant_settings SET default_currency = COALESCE($2, default_currency), timezone = COALESCE($3, timezone), diff --git a/alshuyukh-accounting/apps/api/test/audit.test.ts b/alshuyukh-accounting/apps/api/test/audit.test.ts index 44a52de15074..13941d9c6586 100644 --- a/alshuyukh-accounting/apps/api/test/audit.test.ts +++ b/alshuyukh-accounting/apps/api/test/audit.test.ts @@ -41,7 +41,7 @@ describe('audit log', () => { it('records settings and permission changes', async () => { const api = client(t.app, owner.token); - await api.patch('/api/settings/tenant', { fiscalYearStartMonth: 7 }); + await api.patch('/api/settings/tenant', { dateFormat: 'DD/MM/YYYY' }); await api.post('/api/roles', { code: 'AUDIT_TEST', nameAr: 'اختبار', nameEn: 'Test', permissions: ['company.view'] }); const actions = (await logs()).map((l) => l.action); expect(actions).toContain('SETTINGS_CHANGE'); diff --git a/alshuyukh-accounting/apps/api/test/chart-of-accounts.test.ts b/alshuyukh-accounting/apps/api/test/chart-of-accounts.test.ts new file mode 100644 index 000000000000..9d8920a8a5b4 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/chart-of-accounts.test.ts @@ -0,0 +1,133 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { DEFAULT_ACCOUNTS } from '../src/modules/accounting/chart-template.js'; +import { chart, client, cr, dateInYear, dr, fiscalYears, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); +}); +afterAll(async () => { await t.close(); }); + +describe('default setup for a new company', () => { + it('creates the default Saudi chart of accounts with system keys', async () => { + const accounts = (await client(t.app, owner.token).get('/api/accounts')).json().data; + expect(accounts.map((a: { code: string }) => a.code)).toEqual(DEFAULT_ACCOUNTS.map((a) => a.code).sort()); + const byCode = Object.fromEntries(accounts.map((a: { code: string }) => [a.code, a])); + expect(byCode['1000']).toMatchObject({ nameAr: 'الأصول', type: 'ASSET', isPostable: false, level: 1 }); + expect(byCode['1300']).toMatchObject({ nameAr: 'العملاء', systemKey: 'ACCOUNTS_RECEIVABLE', isPostable: true, level: 2, balance: '0.00' }); + expect(byCode['2210']).toMatchObject({ systemKey: 'VAT_OUTPUT', level: 3, type: 'LIABILITY' }); + expect(byCode['3200']).toMatchObject({ systemKey: 'RETAINED_EARNINGS', type: 'EQUITY' }); + expect(byCode['4100']).toMatchObject({ systemKey: 'SALES', type: 'REVENUE' }); + expect(byCode['5100']).toMatchObject({ systemKey: 'COGS', type: 'COST_OF_GOODS_SOLD' }); + }); + + it('creates the current fiscal year with 12 open monthly periods', async () => { + const [year] = await fiscalYears(t.app, owner.token); + expect(year!.status).toBe('OPEN'); + expect(year!.periods).toHaveLength(12); + expect(year!.startDate).toMatch(/-01-01$/); + expect(year!.endDate).toMatch(/-12-31$/); + expect(year!.periods[1]).toMatchObject({ startDate: `${year!.startDate.slice(0, 4)}-02-01`, status: 'OPEN' }); + expect(year!.periods.every((p) => p.status === 'OPEN')).toBe(true); + }); + + it('sets up accounting for companies created later, and the setup call is idempotent', async () => { + const api = client(t.app, owner.token); + const company = (await api.post('/api/companies', { name: `Second ${Date.now()}` })).json(); + const accounts = (await api.get(`/api/accounts?companyId=${company.id}`)).json().data; + expect(accounts.length).toBe(DEFAULT_ACCOUNTS.length); + const again = await api.post('/api/accounting/setup', { companyId: company.id }); + expect(again.json()).toMatchObject({ chartCreated: false, fiscalYearCreated: false }); + // With two companies, list endpoints require companyId. + expect((await api.get('/api/accounts')).statusCode).toBe(400); + }); +}); + +describe('managing accounts', () => { + let session: Session; + beforeAll(async () => { session = await register(t.app); }); + + it('creates a sub-account that inherits the parent type', async () => { + const api = client(t.app, session.token); + const c = await chart(t.app, session.token); + const res = await api.post('/api/accounts', { code: '6500', nameAr: 'مصروفات الصيانة', parentId: c.byCode.get('6000') }); + expect(res.statusCode).toBe(201); + expect(res.json()).toMatchObject({ type: 'EXPENSE', level: 2, isPostable: true, isSystem: false }); + }); + + it('turns an unused leaf into a header when a child is added under it', async () => { + const api = client(t.app, session.token); + const c = await chart(t.app, session.token); + const res = await api.post('/api/accounts', { code: '1210', nameAr: 'بنك الراجحي', parentId: c.byCode.get('1200') }); + expect(res.statusCode).toBe(201); + expect(res.json().level).toBe(3); + expect((await api.get(`/api/accounts/${c.byCode.get('1200')}`)).json().isPostable).toBe(false); + }); + + it('rejects invalid structures', async () => { + const api = client(t.app, session.token); + const c = await chart(t.app, session.token); + expect((await api.post('/api/accounts', { code: '6100', nameAr: 'مكرر', parentId: c.byCode.get('6000') })).statusCode).toBe(409); + expect((await api.post('/api/accounts', { code: '6600', nameAr: 'نوع خاطئ', type: 'ASSET', parentId: c.byCode.get('6000') })).statusCode).toBe(400); + expect((await api.post('/api/accounts', { code: '9000', nameAr: 'بلا نوع' })).statusCode).toBe(400); + expect((await api.post('/api/accounts', { code: 'bad code!', nameAr: 'رمز', type: 'ASSET' })).statusCode).toBe(400); + + const h1 = (await api.post('/api/accounts', { code: '7000', nameAr: 'رئيسي', type: 'EXPENSE', isPostable: false })).json(); + const h2 = (await api.post('/api/accounts', { code: '7100', nameAr: 'فرعي', parentId: h1.id, isPostable: false })).json(); + const cycle = await api.patch(`/api/accounts/${h1.id}`, { parentId: h2.id }); + expect(cycle.statusCode).toBe(400); + expect(cycle.json().error.message).toMatch(/descendant/); + }); + + it('protects system accounts and accounts with postings', async () => { + const api = client(t.app, session.token); + const c = await chart(t.app, session.token); + expect((await api.patch(`/api/accounts/${c.byKey.get('CASH')}`, { isActive: false })).statusCode).toBe(409); + expect((await api.del(`/api/accounts/${c.byKey.get('CASH')}`)).statusCode).toBe(409); + // Renaming a system account is allowed. + expect((await api.patch(`/api/accounts/${c.byKey.get('CASH')}`, { nameAr: 'الصندوق' })).statusCode).toBe(200); + + const rent = c.byCode.get('6100')!; + const date = await dateInYear(t.app, session.token); + const posted = await api.post('/api/journal-entries', { entryDate: date, description: 'إيجار', post: true, lines: [dr(rent, '500.00'), cr(c.byKey.get('CASH')!, '500.00')] }); + expect(posted.statusCode).toBe(201); + expect((await api.get(`/api/accounts/${rent}`)).json().balance).toBe('500.00'); + expect((await api.patch(`/api/accounts/${rent}`, { isActive: false })).statusCode).toBe(409); + expect((await api.del(`/api/accounts/${rent}`)).statusCode).toBe(409); + const toHeader = await api.patch(`/api/accounts/${rent}`, { isPostable: false }); + expect(toHeader.statusCode).toBe(400); + }); + + it('deactivates and soft-deletes unused accounts', async () => { + const api = client(t.app, session.token); + const c = await chart(t.app, session.token); + const acc = (await api.post('/api/accounts', { code: '6900', nameAr: 'مؤقت', parentId: c.byCode.get('6000') })).json(); + expect((await api.patch(`/api/accounts/${acc.id}`, { isActive: false })).json().isActive).toBe(false); + const listed = (await api.get('/api/accounts')).json().data.map((a: { id: string }) => a.id); + expect(listed).not.toContain(acc.id); + expect((await api.del(`/api/accounts/${acc.id}`)).statusCode).toBe(204); + expect((await api.get(`/api/accounts/${acc.id}`)).statusCode).toBe(404); + // The code can be reused after deletion. + expect((await api.post('/api/accounts', { code: '6900', nameAr: 'جديد', parentId: c.byCode.get('6000') })).statusCode).toBe(201); + }); + + it('manages cost centers', async () => { + const api = client(t.app, session.token); + const cc = await api.post('/api/cost-centers', { code: 'RUH', name: 'مركز الرياض' }); + expect(cc.statusCode).toBe(201); + expect((await api.post('/api/cost-centers', { code: 'RUH', name: 'مكرر' })).statusCode).toBe(409); + expect((await api.patch(`/api/cost-centers/${cc.json().id}`, { isActive: false })).json().isActive).toBe(false); + }); + + it('isolates charts between tenants', async () => { + const other = await register(t.app); + const c = await chart(t.app, session.token); + const api = client(t.app, other.token); + expect((await api.get(`/api/accounts/${c.byKey.get('CASH')}`)).statusCode).toBe(404); + expect((await api.patch(`/api/accounts/${c.byKey.get('CASH')}`, { nameAr: 'اختراق' })).statusCode).toBe(404); + expect((await api.post('/api/accounts', { code: '6700', nameAr: 'حقن', parentId: c.byCode.get('6000') })).statusCode).toBe(400); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/fiscal-years.test.ts b/alshuyukh-accounting/apps/api/test/fiscal-years.test.ts new file mode 100644 index 000000000000..d20afccb71ed --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/fiscal-years.test.ts @@ -0,0 +1,121 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { chart, client, cr, dr, fiscalYears, register, setupApp, type TestContext } from './helpers.js'; + +let t: TestContext; +beforeAll(async () => { t = await setupApp(); }); +afterAll(async () => { await t.close(); }); + +describe('fiscal years', () => { + it('creates the next year and rejects overlaps and invalid starts', async () => { + const s = await register(t.app); + const api = client(t.app, s.token); + const [current] = await fiscalYears(t.app, s.token); + const nextStart = `${Number(current!.startDate.slice(0, 4)) + 1}-01-01`; + + const next = await api.post('/api/fiscal-years', { startDate: nextStart }); + expect(next.statusCode).toBe(201); + const years = await fiscalYears(t.app, s.token); + expect(years).toHaveLength(2); + expect(years[0]).toMatchObject({ startDate: nextStart, endDate: `${nextStart.slice(0, 4)}-12-31` }); + expect(years[0]!.periods).toHaveLength(12); + + expect((await api.post('/api/fiscal-years', { startDate: nextStart })).statusCode).toBe(409); + expect((await api.post('/api/fiscal-years', { startDate: `${nextStart.slice(0, 4)}-06-01` })).statusCode).toBe(409); + expect((await api.post('/api/fiscal-years', { startDate: '2040-01-15' })).statusCode).toBe(400); + expect((await api.post('/api/fiscal-years', { startDate: '2040-02-30' })).statusCode).toBe(400); + }); + + it('supports a short first year with an explicit end date', async () => { + const s = await register(t.app); + const res = await client(t.app, s.token).post('/api/fiscal-years', { startDate: '2040-07-01', endDate: '2040-12-31' }); + expect(res.statusCode).toBe(201); + const year = (await fiscalYears(t.app, s.token)).find((y) => y.startDate === '2040-07-01'); + expect(year!.periods).toHaveLength(6); + }); + + it('locks the fiscal start month once a fiscal year exists', async () => { + const s = await register(t.app); + const res = await client(t.app, s.token).patch('/api/settings/tenant', { fiscalYearStartMonth: 7 }); + expect(res.statusCode).toBe(409); + expect(res.json().error.code).toBe('FISCAL_YEARS_EXIST'); + }); +}); + +describe('closing a fiscal year', () => { + it('moves the net profit to retained earnings and closes every period', async () => { + const s = await register(t.app); + const api = client(t.app, s.token); + const c = await chart(t.app, s.token); + const [year] = await fiscalYears(t.app, s.token); + const y = year!.startDate.slice(0, 4); + const post = (entryDate: string, lines: unknown[]) => + api.post('/api/journal-entries', { entryDate, description: 'حركة', lines, post: true }).then((r) => { expect(r.statusCode).toBe(201); return r.json(); }); + + await post(`${y}-01-10`, [dr(c.byKey.get('CASH')!, '50000.00'), cr(c.byKey.get('CAPITAL')!, '50000.00')]); + await post(`${y}-02-10`, [dr(c.byKey.get('CASH')!, '11500.00'), cr(c.byKey.get('SALES')!, '10000.00'), cr(c.byKey.get('VAT_OUTPUT')!, '1500.00')]); + await post(`${y}-03-10`, [dr(c.byKey.get('COGS')!, '4000.00'), cr(c.byKey.get('INVENTORY')!, '4000.00')]); + await post(`${y}-04-10`, [dr(c.byCode.get('6100')!, '2500.00'), cr(c.byKey.get('BANK')!, '2500.00')]); + // Net profit = 10000 - 4000 - 2500 = 3500 + + const draft = (await api.post('/api/journal-entries', { entryDate: `${y}-05-01`, description: 'مسودة', lines: [dr(c.byCode.get('6200')!, '1.00'), cr(c.byKey.get('CASH')!, '1.00')] })).json(); + const blocked = await api.post(`/api/fiscal-years/${year!.id}/close`); + expect(blocked.json().error.code).toBe('DRAFTS_EXIST'); + await api.del(`/api/journal-entries/${draft.id}`); + + const res = await api.post(`/api/fiscal-years/${year!.id}/close`); + expect(res.statusCode).toBe(200); + const closing = (await api.get(`/api/journal-entries/${res.json().closingEntryId}`)).json(); + expect(closing).toMatchObject({ status: 'POSTED', referenceType: 'YEAR_CLOSING', source: 'SYSTEM', entryDate: year!.endDate }); + const re = closing.lines.find((l: { accountCode: string }) => l.accountCode === '3200'); + expect(re).toMatchObject({ debit: '0.00', credit: '3500.00' }); + + for (const k of ['SALES', 'COGS']) { + expect((await api.get(`/api/accounts/${c.byKey.get(k)}`)).json().balance).toBe('0.00'); + } + expect((await api.get(`/api/accounts/${c.byCode.get('6100')}`)).json().balance).toBe('0.00'); + expect((await api.get(`/api/accounts/${c.byKey.get('RETAINED_EARNINGS')}`)).json().balance).toBe('-3500.00'); + // Balance-sheet accounts carry forward untouched. + expect((await api.get(`/api/accounts/${c.byKey.get('CASH')}`)).json().balance).toBe('61500.00'); + + const [closed] = await fiscalYears(t.app, s.token); + expect(closed!.status).toBe('CLOSED'); + expect(closed!.periods.every((p) => p.status === 'CLOSED')).toBe(true); + + const late = await api.post('/api/journal-entries', { entryDate: `${y}-06-01`, description: 'متأخر', post: true, lines: [dr(c.byCode.get('6200')!, '1.00'), cr(c.byKey.get('CASH')!, '1.00')] }); + expect(late.json().error.code).toBe('PERIOD_CLOSED'); + expect((await api.post(`/api/fiscal-periods/${closed!.periods[0]!.id}/reopen`)).statusCode).toBe(409); + expect((await api.post(`/api/fiscal-years/${year!.id}/close`)).statusCode).toBe(409); + const reverseClosing = await api.post(`/api/journal-entries/${closing.id}/reverse`, { reason: 'test' }); + expect(reverseClosing.json().error.code).toBe('SYSTEM_ENTRY'); + + const tb = (await api.get(`/api/reports/trial-balance?dateFrom=${year!.startDate}&dateTo=${year!.endDate}`)).json(); + expect(tb.balanced).toBe(true); + }); + + it('debits retained earnings for a loss', async () => { + const s = await register(t.app); + const api = client(t.app, s.token); + const c = await chart(t.app, s.token); + const [year] = await fiscalYears(t.app, s.token); + await api.post('/api/journal-entries', { entryDate: year!.periods[0]!.startDate, description: 'إيجار', post: true, lines: [dr(c.byCode.get('6100')!, '1200.00'), cr(c.byKey.get('CASH')!, '1200.00')] }); + const res = await api.post(`/api/fiscal-years/${year!.id}/close`); + const closing = (await api.get(`/api/journal-entries/${res.json().closingEntryId}`)).json(); + expect(closing.lines.find((l: { accountCode: string }) => l.accountCode === '3200')).toMatchObject({ debit: '1200.00', credit: '0.00' }); + }); + + it('closes a year with no activity without a closing entry', async () => { + const s = await register(t.app); + const [year] = await fiscalYears(t.app, s.token); + const res = await client(t.app, s.token).post(`/api/fiscal-years/${year!.id}/close`); + expect(res.json()).toEqual({ closingEntryId: null }); + }); + + it('requires earlier years to be closed first', async () => { + const s = await register(t.app); + const api = client(t.app, s.token); + const [current] = await fiscalYears(t.app, s.token); + await api.post('/api/fiscal-years', { startDate: `${Number(current!.startDate.slice(0, 4)) - 1}-01-01` }); + const res = await api.post(`/api/fiscal-years/${current!.id}/close`); + expect(res.json().error.code).toBe('EARLIER_YEAR_OPEN'); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/helpers.ts b/alshuyukh-accounting/apps/api/test/helpers.ts index a19989fe2643..85ad456bad71 100644 --- a/alshuyukh-accounting/apps/api/test/helpers.ts +++ b/alshuyukh-accounting/apps/api/test/helpers.ts @@ -78,3 +78,35 @@ export async function addMember(app: FastifyInstance, owner: Session, roleCode: if (res.statusCode !== 201) throw new Error(`addMember failed: ${res.statusCode} ${res.body}`); return login(app, email, PASSWORD, owner.tenantId); } + +// Accounting helpers ------------------------------------------------------------ + +export interface Chart { byCode: Map; byKey: Map } + +export async function chart(app: FastifyInstance, token: string): Promise { + const res = await client(app, token).get('/api/accounts?includeInactive=true'); + if (res.statusCode !== 200) throw new Error(`accounts failed: ${res.body}`); + const rows = res.json().data as { id: string; code: string; systemKey: string | null }[]; + return { + byCode: new Map(rows.map((r) => [r.code, r.id])), + byKey: new Map(rows.filter((r) => r.systemKey).map((r) => [r.systemKey!, r.id])), + }; +} + +export interface FiscalYear { + id: string; name: string; startDate: string; endDate: string; status: string; + periods: { id: string; periodNumber: number; startDate: string; endDate: string; status: string }[]; +} + +export async function fiscalYears(app: FastifyInstance, token: string): Promise { + return (await client(app, token).get('/api/fiscal-years')).json().data; +} + +/** A date inside the first fiscal year, `month` 1-12 relative to its start. */ +export async function dateInYear(app: FastifyInstance, token: string, month = 3, day = 15): Promise { + const [year] = await fiscalYears(app, token); + return year!.periods[month - 1]!.startDate.slice(0, 8) + String(day).padStart(2, '0'); +} + +export const dr = (accountId: string, amount: string) => ({ accountId, debit: amount }); +export const cr = (accountId: string, amount: string) => ({ accountId, credit: amount }); diff --git a/alshuyukh-accounting/apps/api/test/journal-entries.test.ts b/alshuyukh-accounting/apps/api/test/journal-entries.test.ts new file mode 100644 index 000000000000..e447b0e1ff7d --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/journal-entries.test.ts @@ -0,0 +1,317 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { withTx } from '../src/db/tx.js'; +import { postEntry } from '../src/modules/accounting/engine.js'; +import { + addMember, chart, client, cr, dateInYear, dr, fiscalYears, register, setupApp, + type Chart, type Session, type TestContext, +} from './helpers.js'; + +let t: TestContext; +let owner: Session; +let c: Chart; +let date: string; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); + c = await chart(t.app, owner.token); + date = await dateInYear(t.app, owner.token, 3, 15); +}); +afterAll(async () => { await t.close(); }); + +const api = () => client(t.app, owner.token); +const key = (k: string) => c.byKey.get(k)!; +const code = (k: string) => c.byCode.get(k)!; +const create = (lines: unknown[], extra: Record = {}) => + api().post('/api/journal-entries', { entryDate: date, description: 'قيد اختبار', lines, ...extra }); + +describe('the required example: invoice 1000 SAR + VAT 150 SAR', () => { + it('posts AR 1150 debit, Sales 1000 credit, VAT 150 credit through the engine', async () => { + const entry = await withTx(t.pool, { tenantId: owner.tenantId, userId: owner.userId }, async (db) => { + const { rows: [company] } = await db.query<{ id: string }>('SELECT id FROM companies WHERE tenant_id = $1', [owner.tenantId]); + return postEntry(db, { tenantId: owner.tenantId, userId: owner.userId }, { + companyId: company!.id, entryDate: date, description: 'فاتورة مبيعات INV-0001', + referenceType: 'SALES_INVOICE', source: 'SYSTEM', + lines: [ + dr(key('ACCOUNTS_RECEIVABLE'), '1150.00'), + cr(key('SALES'), '1000.00'), + cr(key('VAT_OUTPUT'), '150.00'), + ], + }); + }); + + expect(entry.status).toBe('POSTED'); + expect(entry.totalDebit).toBe('1150.00'); + expect(entry.totalCredit).toBe('1150.00'); + expect(entry.lines.map((l) => [l.accountCode, l.debit, l.credit])).toEqual([ + ['1300', '1150.00', '0.00'], + ['4100', '0.00', '1000.00'], + ['2210', '0.00', '150.00'], + ]); + + // Account balances come only from posted journal lines. + const ar = (await api().get(`/api/accounts/${key('ACCOUNTS_RECEIVABLE')}`)).json(); + const sales = (await api().get(`/api/accounts/${key('SALES')}`)).json(); + const vat = (await api().get(`/api/accounts/${key('VAT_OUTPUT')}`)).json(); + expect(ar.balance).toBe('1150.00'); + expect(sales.balance).toBe('-1000.00'); + expect(vat.balance).toBe('-150.00'); + }); + + it('refuses to reverse a document-generated entry manually', async () => { + const list = (await api().get('/api/journal-entries?referenceType=SALES_INVOICE')).json().data; + const res = await api().post(`/api/journal-entries/${list[0].id}/reverse`, { reason: 'خطأ' }); + expect(res.statusCode).toBe(409); + expect(res.json().error.code).toBe('SYSTEM_ENTRY'); + }); +}); + +describe('posting rules', () => { + it('posts a balanced entry and numbers it sequentially', async () => { + const [year] = await fiscalYears(t.app, owner.token); + const a = (await create([dr(code('6100'), '2500.00'), cr(key('BANK'), '2500.00')], { post: true })).json(); + const b = (await create([dr(code('6200'), '8000.00'), cr(key('BANK'), '8000.00')], { post: true })).json(); + const prefix = `JV-${year!.startDate.slice(0, 4)}-`; + expect(a.entryNumber).toMatch(new RegExp(`^${prefix}\\d{6}$`)); + expect(Number(b.entryNumber.slice(-6))).toBe(Number(a.entryNumber.slice(-6)) + 1); + expect(a).toMatchObject({ status: 'POSTED', totalDebit: '2500.00', totalCredit: '2500.00' }); + }); + + it('rejects an unbalanced entry at posting and keeps it as a draft', async () => { + const draft = (await create([dr(code('6300'), '100.00'), cr(key('CASH'), '90.00')])).json(); + expect(draft).toMatchObject({ status: 'DRAFT', entryNumber: null, totalDebit: '100.00', totalCredit: '90.00' }); + const res = await api().post(`/api/journal-entries/${draft.id}/post`); + expect(res.statusCode).toBe(400); + expect(res.json().error).toMatchObject({ code: 'UNBALANCED_ENTRY', details: { totalDebit: '100.00', totalCredit: '90.00', difference: '10.00' } }); + expect((await api().get(`/api/journal-entries/${draft.id}`)).json().status).toBe('DRAFT'); + }); + + it('rolls back completely when create-and-post fails', async () => { + const before = (await api().get('/api/journal-entries?limit=200')).json().total; + const res = await create([dr(code('6300'), '100.00'), cr(key('CASH'), '99.99')], { post: true, description: 'should not exist' }); + expect(res.statusCode).toBe(400); + expect((await api().get('/api/journal-entries?limit=200')).json().total).toBe(before); + }); + + it('uses exact decimal arithmetic (0.10 + 0.20 = 0.30)', async () => { + const res = await create([dr(code('6300'), '0.10'), dr(code('6400'), '0.20'), cr(key('CASH'), '0.30')], { post: true }); + expect(res.statusCode).toBe(201); + expect(res.json().totalDebit).toBe('0.30'); + }); + + it('validates every line', async () => { + const cases = [ + [{ accountId: code('6300'), debit: '10.00', credit: '10.00' }, cr(key('CASH'), '10.00')], // both sides + [{ accountId: code('6300'), debit: '0' }, cr(key('CASH'), '0')], // zero + [dr(code('6300'), '-5.00'), cr(key('CASH'), '-5.00')], // negative + [dr(code('6300'), '1.005'), cr(key('CASH'), '1.005')], // 3 decimals + [{ accountId: code('6300'), debit: 100 }, { accountId: key('CASH'), credit: 100 }], // number, not string + [dr(code('6300'), '10.00')], // single line + ]; + for (const lines of cases) { + const res = await create(lines); + expect(res.statusCode, JSON.stringify(lines)).toBe(400); + } + }); + + it('rejects header, inactive and foreign accounts', async () => { + const header = await create([dr(code('6000'), '10.00'), cr(key('CASH'), '10.00')]); + expect(header.json().error.code).toBe('ACCOUNT_NOT_POSTABLE'); + + const temp = (await api().post('/api/accounts', { code: '6950', nameAr: 'غير نشط', parentId: code('6000') })).json(); + await api().patch(`/api/accounts/${temp.id}`, { isActive: false }); + expect((await create([dr(temp.id, '10.00'), cr(key('CASH'), '10.00')])).json().error.code).toBe('ACCOUNT_INACTIVE'); + + const other = await register(t.app); + const otherChart = await chart(t.app, other.token); + const foreign = await create([dr(otherChart.byKey.get('CASH')!, '10.00'), cr(key('CASH'), '10.00')]); + expect(foreign.json().error.code).toBe('INVALID_ACCOUNT'); + }); + + it('requires an open fiscal period that covers the date', async () => { + const res = await create([dr(code('6300'), '10.00'), cr(key('CASH'), '10.00')], { entryDate: '2010-01-01', post: true }); + expect(res.statusCode).toBe(400); + expect(res.json().error.code).toBe('NO_FISCAL_PERIOD'); + }); + + it('assigns unique gap-free numbers under concurrent posting', async () => { + const drafts = await Promise.all(Array.from({ length: 8 }, () => + create([dr(code('6400'), '1.00'), cr(key('CASH'), '1.00')]).then((r) => r.json().id as string))); + const posted = await Promise.all(drafts.map((id) => api().post(`/api/journal-entries/${id}/post`).then((r) => r.json()))); + const numbers = posted.map((e) => Number(e.entryNumber.slice(-6))).sort((x, y) => x - y); + expect(new Set(numbers).size).toBe(8); + expect(numbers[7]! - numbers[0]!).toBe(7); + }); +}); + +describe('drafts', () => { + it('edits and soft-deletes a draft', async () => { + const draft = (await create([dr(code('6300'), '10.00'), cr(key('CASH'), '10.00')])).json(); + const edited = await api().patch(`/api/journal-entries/${draft.id}`, { + description: 'معدل', lines: [dr(code('6300'), '25.00'), cr(key('BANK'), '25.00')], + }); + expect(edited.json()).toMatchObject({ description: 'معدل', totalDebit: '25.00' }); + expect(edited.json().lines[1].accountCode).toBe('1200'); + expect((await api().del(`/api/journal-entries/${draft.id}`)).statusCode).toBe(204); + expect((await api().get(`/api/journal-entries/${draft.id}`)).statusCode).toBe(404); + }); +}); + +describe('immutability of posted entries', () => { + let entry: { id: string; lines: { id: string }[] }; + + beforeAll(async () => { + entry = (await create([dr(code('6100'), '300.00'), cr(key('CASH'), '300.00')], { post: true })).json(); + }); + + it('refuses edits and deletion through the API', async () => { + expect((await api().patch(`/api/journal-entries/${entry.id}`, { description: 'تعديل' })).statusCode).toBe(409); + expect((await api().del(`/api/journal-entries/${entry.id}`)).statusCode).toBe(409); + expect((await api().post(`/api/journal-entries/${entry.id}/post`)).statusCode).toBe(409); + }); + + it('refuses direct SQL changes from the application role', async () => { + const ctx = { tenantId: owner.tenantId, userId: owner.userId }; + const attempts = [ + `UPDATE journal_entries SET description = 'tampered' WHERE id = '${entry.id}'`, + `UPDATE journal_entries SET status = 'DRAFT' WHERE id = '${entry.id}'`, + `UPDATE journal_entry_lines SET debit = 1 WHERE id = '${entry.lines[0]!.id}'`, + `DELETE FROM journal_entry_lines WHERE id = '${entry.lines[0]!.id}'`, + `INSERT INTO journal_entry_lines (tenant_id, company_id, journal_entry_id, line_no, account_id, debit) + SELECT tenant_id, company_id, id, 99, '${code('6100')}', 5 FROM journal_entries WHERE id = '${entry.id}'`, + `DELETE FROM journal_entries WHERE id = '${entry.id}'`, + ]; + for (const sql of attempts) { + await expect(withTx(t.pool, ctx, (db) => db.query(sql)), sql).rejects.toThrow(); + } + const after = (await api().get(`/api/journal-entries/${entry.id}`)).json(); + expect(after).toMatchObject({ status: 'POSTED', totalDebit: '300.00' }); + }); + + it('enforces the balance rule in the database even if the API is bypassed', async () => { + const ctx = { tenantId: owner.tenantId, userId: owner.userId }; + const draft = (await create([dr(code('6100'), '50.00'), cr(key('CASH'), '40.00')])).json(); + const [year] = await fiscalYears(t.app, owner.token); + const period = year!.periods[2]!; + await expect(withTx(t.pool, ctx, (db) => db.query( + `UPDATE journal_entries SET status = 'POSTED', entry_number = 'FAKE-1', fiscal_year_id = $2, fiscal_period_id = $3, posted_at = now() WHERE id = $1`, + [draft.id, year!.id, period.id]))).rejects.toThrow(/not balanced/); + }); +}); + +describe('reversal and correction', () => { + it('reverses a posted entry with a mirror entry and links both', async () => { + const original = (await create([dr(code('6300'), '700.00'), cr(key('BANK'), '700.00')], { post: true, description: 'حملة إعلانية' })).json(); + const res = await api().post(`/api/journal-entries/${original.id}/reverse`, { reason: 'تسجيل في حساب خاطئ' }); + expect(res.statusCode).toBe(200); + const { original: o, reversal } = res.json(); + expect(o).toMatchObject({ status: 'REVERSED', reversedByEntryId: reversal.id }); + expect(reversal).toMatchObject({ status: 'POSTED', referenceType: 'REVERSAL', referenceId: original.id, reversalOfId: original.id, totalDebit: '700.00' }); + expect(reversal.lines.map((l: { accountCode: string; debit: string; credit: string }) => [l.accountCode, l.debit, l.credit])) + .toEqual([['6300', '0.00', '700.00'], ['1200', '700.00', '0.00']]); + + const again = await api().post(`/api/journal-entries/${original.id}/reverse`, { reason: 'مرة ثانية' }); + expect(again.json().error.code).toBe('ALREADY_REVERSED'); + const ofReversal = await api().post(`/api/journal-entries/${reversal.id}/reverse`, { reason: 'عكس العكس' }); + expect(ofReversal.json().error.code).toBe('CANNOT_REVERSE_REVERSAL'); + }); + + it('creates the correcting entry as a linked draft in the same step', async () => { + const original = (await create([dr(code('6300'), '400.00'), cr(key('CASH'), '400.00')], { post: true })).json(); + const res = await api().post(`/api/journal-entries/${original.id}/reverse`, { + reason: 'الحساب الصحيح هو الكهرباء', + correction: { entryDate: date, description: 'قيد تصحيح', lines: [dr(code('6400'), '400.00'), cr(key('CASH'), '400.00')] }, + }); + expect(res.statusCode).toBe(200); + const correction = res.json().correction; + expect(correction).toMatchObject({ status: 'DRAFT', correctionOfId: original.id }); + expect((await api().post(`/api/journal-entries/${correction.id}/post`)).json().status).toBe('POSTED'); + }); + + it('cannot reverse a draft', async () => { + const draft = (await create([dr(code('6300'), '10.00'), cr(key('CASH'), '10.00')])).json(); + expect((await api().post(`/api/journal-entries/${draft.id}/reverse`, { reason: 'test' })).json().error.code).toBe('ENTRY_NOT_POSTED'); + }); +}); + +describe('fiscal periods', () => { + it('blocks posting into a closed period and allows it after reopening', async () => { + const session = await register(t.app); + const sc = await chart(t.app, session.token); + const sApi = client(t.app, session.token); + const [year] = await fiscalYears(t.app, session.token); + const period = year!.periods[4]!; + const d = period.startDate; + const draft = (await sApi.post('/api/journal-entries', { entryDate: d, description: 'x', lines: [dr(sc.byCode.get('6100')!, '10.00'), cr(sc.byKey.get('CASH')!, '10.00')] })).json(); + + expect((await sApi.post(`/api/fiscal-periods/${period.id}/close`)).statusCode).toBe(200); + const blocked = await sApi.post(`/api/journal-entries/${draft.id}/post`); + expect(blocked.statusCode).toBe(409); + expect(blocked.json().error.code).toBe('PERIOD_CLOSED'); + + expect((await sApi.post(`/api/fiscal-periods/${period.id}/reopen`)).statusCode).toBe(200); + expect((await sApi.post(`/api/journal-entries/${draft.id}/post`)).json().status).toBe('POSTED'); + }); +}); + +describe('permissions and tenant isolation', () => { + it('applies journal permissions per role', async () => { + const lines = [dr(code('6300'), '10.00'), cr(key('CASH'), '10.00')]; + const sales = await addMember(t.app, owner, 'SALES_EMPLOYEE'); + expect((await client(t.app, sales.token).post('/api/journal-entries', { entryDate: date, description: 'x', lines })).statusCode).toBe(403); + expect((await client(t.app, sales.token).get('/api/journal-entries')).statusCode).toBe(403); + + const viewer = await addMember(t.app, owner, 'VIEWER'); + expect((await client(t.app, viewer.token).get('/api/journal-entries')).statusCode).toBe(200); + expect((await client(t.app, viewer.token).post('/api/journal-entries', { entryDate: date, description: 'x', lines })).statusCode).toBe(403); + + const accountant = await addMember(t.app, owner, 'ACCOUNTANT'); + const res = await client(t.app, accountant.token).post('/api/journal-entries', { entryDate: date, description: 'x', lines, post: true }); + expect(res.statusCode).toBe(201); + + const role = await api().post('/api/roles', { code: 'JOURNAL_CLERK', nameAr: 'مدخل قيود', nameEn: 'Clerk', permissions: ['journal.view', 'journal.create', 'account.view'] }); + const clerk = await addMember(t.app, owner, 'VIEWER'); + await api().put(`/api/users/${clerk.userId}/roles`, { roleIds: [role.json().id] }); + const cApi = client(t.app, clerk.token); + expect((await cApi.post('/api/journal-entries', { entryDate: date, description: 'x', lines, post: true })).statusCode).toBe(403); + const draft = (await cApi.post('/api/journal-entries', { entryDate: date, description: 'x', lines })).json(); + expect((await cApi.post(`/api/journal-entries/${draft.id}/post`)).statusCode).toBe(403); + }); + + it('hides entries from other tenants', async () => { + const entry = (await create([dr(code('6300'), '10.00'), cr(key('CASH'), '10.00')], { post: true })).json(); + const other = await register(t.app); + const oApi = client(t.app, other.token); + expect((await oApi.get(`/api/journal-entries/${entry.id}`)).statusCode).toBe(404); + expect((await oApi.post(`/api/journal-entries/${entry.id}/reverse`, { reason: 'hack' })).statusCode).toBe(404); + expect((await oApi.get('/api/journal-entries')).json().total).toBe(0); + }); + + it('records posting and reversal in the audit log', async () => { + const actions = (await api().get('/api/audit-logs?entityType=journal_entry&limit=200')).json().data.map((l: { action: string }) => l.action); + expect(actions).toEqual(expect.arrayContaining(['CREATE', 'POST', 'REVERSE', 'UPDATE', 'DELETE'])); + }); +}); + +describe('trial balance', () => { + it('balances and nets reversed entries to zero', async () => { + const [year] = await fiscalYears(t.app, owner.token); + const res = await api().get(`/api/reports/trial-balance?dateFrom=${year!.startDate}&dateTo=${year!.endDate}`); + expect(res.statusCode).toBe(200); + const tb = res.json(); + expect(tb.balanced).toBe(true); + expect(tb.totals.periodDebit).toBe(tb.totals.periodCredit); + expect(tb.totals.closingDebit).toBe(tb.totals.closingCredit); + const marketing = tb.data.find((r: { code: string }) => r.code === '6300'); + // 700 and 400 were reversed, 100 was never posted; remaining: 0.10 + 10 (accountant) + 10 (isolation test). + expect(marketing.closingDebit).toBe('20.10'); + }); + + it('splits opening and period movements by date', async () => { + const [year] = await fiscalYears(t.app, owner.token); + const tb = (await api().get(`/api/reports/trial-balance?dateFrom=${date.slice(0, 8)}16&dateTo=${year!.endDate}`)).json(); + const ar = tb.data.find((r: { code: string }) => r.code === '1300'); + expect(ar).toMatchObject({ openingDebit: '1150.00', periodDebit: '0.00', closingDebit: '1150.00' }); + expect(tb.balanced).toBe(true); + }); +}); diff --git a/alshuyukh-accounting/apps/web/src/App.tsx b/alshuyukh-accounting/apps/web/src/App.tsx index 0150cc08cc6e..9a1d72baac6d 100644 --- a/alshuyukh-accounting/apps/web/src/App.tsx +++ b/alshuyukh-accounting/apps/web/src/App.tsx @@ -1,6 +1,13 @@ import { Navigate, Route, Routes } from 'react-router-dom'; import { useAuth } from './auth'; import Shell from './Shell'; +import Accounting from './pages/accounting/Accounting'; +import ChartOfAccounts from './pages/accounting/ChartOfAccounts'; +import FiscalYears from './pages/accounting/FiscalYears'; +import JournalDetail from './pages/accounting/JournalDetail'; +import JournalForm from './pages/accounting/JournalForm'; +import JournalList from './pages/accounting/JournalList'; +import TrialBalance from './pages/accounting/TrialBalance'; import AuditLog from './pages/AuditLog'; import Companies from './pages/Companies'; import ComingSoon from './pages/ComingSoon'; @@ -34,7 +41,15 @@ export default function App() { } /> } /> } /> - } /> + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> } /> } /> diff --git a/alshuyukh-accounting/apps/web/src/Shell.tsx b/alshuyukh-accounting/apps/web/src/Shell.tsx index 1064ca222c46..88cade53e24f 100644 --- a/alshuyukh-accounting/apps/web/src/Shell.tsx +++ b/alshuyukh-accounting/apps/web/src/Shell.tsx @@ -10,7 +10,7 @@ const NAV: { to: string; label: string; icon: string; phase?: number }[] = [ { to: '/customers', label: 'العملاء', icon: '☺', phase: 3 }, { to: '/suppliers', label: 'الموردون', icon: '⚑', phase: 3 }, { to: '/expenses', label: 'المصروفات', icon: '−', phase: 6 }, - { to: '/accounting', label: 'المحاسبة', icon: '⚖', phase: 2 }, + { to: '/accounting', label: 'المحاسبة', icon: '⚖' }, { to: '/reports', label: 'التقارير', icon: '▤', phase: 7 }, { to: '/e-invoicing', label: 'الفوترة الإلكترونية', icon: '⎙', phase: 8 }, { to: '/settings', label: 'الإعدادات', icon: '⚙' }, diff --git a/alshuyukh-accounting/apps/web/src/api.ts b/alshuyukh-accounting/apps/web/src/api.ts index eb02d98ae569..c77372b414c0 100644 --- a/alshuyukh-accounting/apps/web/src/api.ts +++ b/alshuyukh-accounting/apps/web/src/api.ts @@ -11,7 +11,7 @@ export const setAccessToken = (t: string | null) => { accessToken = t; }; export const setSessionExpiredHandler = (fn: () => void) => { onSessionExpired = fn; }; export class ApiError extends Error { - constructor(public status: number, public code: string, message: string, public details?: { path: string; message: string }[]) { + constructor(public status: number, public code: string, message: string, public details?: unknown) { super(message); } } @@ -65,5 +65,26 @@ const MESSAGES: Record = { LAST_COMPANY: 'يجب أن تبقى شركة واحدة على الأقل', ROLE_IN_USE: 'الدور مُسند لمستخدمين؛ أزله منهم أولًا', INVALID_CURRENT_PASSWORD: 'كلمة المرور الحالية غير صحيحة', + UNBALANCED_ENTRY: 'القيد غير متوازن: مجموع المدين لا يساوي مجموع الدائن', + TOO_FEW_LINES: 'القيد يحتاج سطرين على الأقل', + INVALID_LINE: 'كل سطر يجب أن يحتوي على مبلغ مدين أو دائن فقط', + INVALID_AMOUNT: 'مبلغ غير صحيح: يجب أن يكون موجبًا وبخانتين عشريتين كحد أقصى', + INVALID_ACCOUNT: 'الحساب غير موجود في هذه الشركة', + ACCOUNT_NOT_POSTABLE: 'لا يمكن الترحيل على حساب تجميعي', + ACCOUNT_INACTIVE: 'الحساب غير نشط', + NO_FISCAL_PERIOD: 'لا توجد فترة مالية تغطي هذا التاريخ. أنشئ السنة المالية أولًا.', + PERIOD_CLOSED: 'الفترة المالية لهذا التاريخ مقفلة', + ENTRY_NOT_DRAFT: 'لا يمكن تعديل قيد مرحّل؛ استخدم العكس', + ALREADY_REVERSED: 'تم عكس هذا القيد مسبقًا', + CANNOT_REVERSE_REVERSAL: 'لا يمكن عكس قيد عكسي؛ أنشئ قيدًا جديدًا', + SYSTEM_ENTRY: 'هذا القيد صادر عن مستند؛ صحّحه من المستند نفسه', + ACCOUNT_HAS_BALANCE: 'لا يمكن إيقاف حساب له رصيد', + SYSTEM_ACCOUNT: 'حساب نظامي يستخدمه المحرك المحاسبي ولا يمكن إيقافه أو حذفه', + ACCOUNT_IN_USE: 'الحساب عليه قيود؛ يمكن إيقافه بدل حذفه', + DRAFTS_EXIST: 'توجد مسودات قيود في هذه السنة؛ رحّلها أو احذفها أولًا', + EARLIER_YEAR_OPEN: 'أقفل السنوات المالية السابقة أولًا', + YEAR_CLOSED: 'السنة المالية مقفلة', + FISCAL_YEAR_OVERLAP: 'السنة المالية تتداخل مع سنة موجودة', + FISCAL_YEARS_EXIST: 'لا يمكن تغيير بداية السنة المالية بعد إنشاء سنوات مالية', }; const translateError = (code?: string, fallback?: string) => (code && MESSAGES[code]) || fallback || 'حدث خطأ غير متوقع'; diff --git a/alshuyukh-accounting/apps/web/src/money.ts b/alshuyukh-accounting/apps/web/src/money.ts new file mode 100644 index 000000000000..c57505bb8444 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/money.ts @@ -0,0 +1,30 @@ +/** + * Display-only helpers. Amounts arrive from the API as strings ("1150.00"). + * Totals shown while typing are computed in integer halalas, never floats; + * the server recomputes and validates everything. + */ +export function formatAmount(value: string | null | undefined): string { + if (value === null || value === undefined || value === '') return '—'; + const negative = value.startsWith('-'); + const [int, frac = ''] = value.replace('-', '').split('.'); + const grouped = int!.replace(/\B(?=(\d{3})+(?!\d))/g, ','); + return `${negative ? '-' : ''}${grouped}.${frac.padEnd(2, '0').slice(0, 2)}`; +} + +/** "12.5" → 1250 halalas. Returns null for invalid input. */ +export function toHalalas(value: string): number | null { + const v = value.trim(); + if (v === '') return 0; + if (!/^\d{1,13}(\.\d{1,2})?$/.test(v)) return null; + const [int, frac = ''] = v.split('.'); + return Number(int) * 100 + Number(frac.padEnd(2, '0')); +} + +export const fromHalalas = (h: number) => + `${h < 0 ? '-' : ''}${Math.floor(Math.abs(h) / 100)}.${String(Math.abs(h) % 100).padStart(2, '0')}`; + +export const ACCOUNT_TYPE_AR: Record = { + ASSET: 'أصول', LIABILITY: 'التزامات', EQUITY: 'حقوق ملكية', REVENUE: 'إيرادات', EXPENSE: 'مصروفات', COST_OF_GOODS_SOLD: 'تكلفة المبيعات', +}; +export const ENTRY_STATUS_AR: Record = { DRAFT: 'مسودة', POSTED: 'مرحّل', REVERSED: 'معكوس' }; +export const REFERENCE_AR: Record = { MANUAL: 'يدوي', REVERSAL: 'قيد عكسي', YEAR_CLOSING: 'إقفال سنة', SALES_INVOICE: 'فاتورة مبيعات' }; diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/Accounting.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/Accounting.tsx new file mode 100644 index 000000000000..72cd67e5a8b8 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/Accounting.tsx @@ -0,0 +1,22 @@ +import { NavLink, Outlet } from 'react-router-dom'; +import { useAuth } from '../../auth'; +import { PageHeader } from '../../ui'; + +export default function Accounting() { + const { can } = useAuth(); + const tabs = [ + { to: 'journal', label: 'القيود اليومية', show: can('journal.view') }, + { to: 'accounts', label: 'دليل الحسابات', show: can('account.view') }, + { to: 'fiscal', label: 'السنوات المالية', show: can('account.view') }, + { to: 'trial-balance', label: 'ميزان المراجعة', show: can('report.view') }, + ].filter((t) => t.show); + return ( + <> + +

+ + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/ChartOfAccounts.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/ChartOfAccounts.tsx new file mode 100644 index 000000000000..39ab6fbad8a8 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/ChartOfAccounts.tsx @@ -0,0 +1,137 @@ +import { useMemo, useState, type FormEvent } from 'react'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { ACCOUNT_TYPE_AR, formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; + +export interface Account { + id: string; code: string; nameAr: string; nameEn: string | null; type: string; parentId: string | null; + level: number; isPostable: boolean; isActive: boolean; isSystem: boolean; systemKey: string | null; balance: string; +} + +export default function ChartOfAccounts() { + const { can } = useAuth(); + const [showInactive, setShowInactive] = useState(false); + const accounts = useLoad(() => api<{ data: Account[] }>('GET', `/api/accounts?includeInactive=${showInactive}`), [showInactive]); + const [error, setError] = useState(null); + const [editing, setEditing] = useState(null); + const manage = can('account.manage'); + + // Depth-first order so children follow their parent. + const ordered = useMemo(() => { + const list = accounts.data?.data ?? []; + const children = new Map(); + for (const a of list) children.set(a.parentId, [...(children.get(a.parentId) ?? []), a]); + const out: Account[] = []; + const walk = (parent: string | null) => (children.get(parent) ?? []).sort((x, y) => x.code.localeCompare(y.code)).forEach((a) => { out.push(a); walk(a.id); }); + walk(null); + // Accounts whose parent is filtered out (inactive) still appear. + for (const a of list) if (!out.includes(a)) out.push(a); + return out; + }, [accounts.data]); + + async function run(fn: () => Promise) { + setError(null); + try { await fn(); accounts.reload(); return true; } catch (e) { setError(e); return false; } + } + + async function add(e: FormEvent) { + e.preventDefault(); + const form = e.currentTarget; + const f = Object.fromEntries(new FormData(form)) as Record; + const ok = await run(() => api('POST', '/api/accounts', { + code: f.code, nameAr: f.nameAr, nameEn: f.nameEn || null, parentId: f.parentId || null, + type: f.parentId ? undefined : f.type, isPostable: f.kind === 'postable', + })); + if (ok) form.reset(); + } + + async function saveEdit(e: FormEvent, a: Account) { + e.preventDefault(); + const f = Object.fromEntries(new FormData(e.currentTarget)) as Record; + if (await run(() => api('PATCH', `/api/accounts/${a.id}`, { code: f.code, nameAr: f.nameAr }))) setEditing(null); + } + + const headers = ordered.filter((a) => !a.isPostable && a.isActive); + + return ( + <> + +
+
+ +
+
+ + + + {ordered.map((a) => ( + + {editing === a.id ? ( + + ) : ( + <> + + + + + + + )} + + ))} + +
الرمزاسم الحسابالنوعالرصيد
+
saveEdit(e, a)}> + + + + +
+
{a.code} + {a.nameAr} + {a.isSystem && نظامي} + {!a.isActive && غير نشط} + {ACCOUNT_TYPE_AR[a.type]}{a.isPostable ? formatAmount(a.balance) : ''} + {manage && } + {manage && !a.isSystem && a.isPostable && ( + + )} +
+
+

الرصيد = المدين − الدائن من القيود المرحّلة. الرصيد السالب يعني رصيدًا دائنًا.

+
+ + {manage && ( +
+

إضافة حساب

+
+ + + + + + +
+ +
+ )} + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/FiscalYears.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/FiscalYears.tsx new file mode 100644 index 000000000000..e57bd18a61d3 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/FiscalYears.tsx @@ -0,0 +1,76 @@ +import { useState } from 'react'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { ErrorBox, useLoad } from '../../ui'; + +interface Year { + id: string; name: string; startDate: string; endDate: string; status: string; closingEntryId: string | null; + periods: { id: string; periodNumber: number; name: string; startDate: string; endDate: string; status: string }[]; +} + +export default function FiscalYears() { + const { can } = useAuth(); + const years = useLoad(() => api<{ data: Year[] }>('GET', '/api/fiscal-years')); + const [error, setError] = useState(null); + const [open, setOpen] = useState(null); + const manage = can('fiscal.manage'); + + async function run(fn: () => Promise) { + setError(null); + try { await fn(); years.reload(); } catch (e) { setError(e); } + } + + const latest = years.data?.data[0]; + const nextStart = latest ? new Date(`${latest.endDate}T00:00:00Z`) : null; + nextStart?.setUTCDate(nextStart.getUTCDate() + 1); + + return ( + <> + + {manage && nextStart && ( +
+ +
+ )} + {years.data?.data.map((y) => ( +
+
+ + {manage && y.status === 'OPEN' && ( + + )} +
+ {open === y.id && ( + + + + {y.periods.map((p) => ( + + + + + + + ))} + +
#الفترةمنإلىالحالة
{p.periodNumber}{p.name}{p.startDate}{p.endDate}{p.status === 'OPEN' ? 'مفتوحة' : 'مقفلة'} + {manage && y.status === 'OPEN' && ( + + )} +
+ )} +
+ ))} + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx new file mode 100644 index 000000000000..f7fbd4d98a2d --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx @@ -0,0 +1,114 @@ +import { useState } from 'react'; +import { Link, useNavigate, useParams } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { ENTRY_STATUS_AR, REFERENCE_AR, formatAmount } from '../../money'; +import { ErrorBox, formatDateTime, useLoad } from '../../ui'; +import JournalForm from './JournalForm'; + +export interface Entry { + id: string; entryNumber: string | null; entryDate: string; description: string; referenceType: string; referenceId: string | null; + source: string; status: string; currency: string; totalDebit: string; totalCredit: string; + reversalOfId: string | null; reversedByEntryId: string | null; correctionOfId: string | null; postedAt: string | null; createdAt: string; + lines: { id: string; lineNo: number; accountId: string; accountCode: string; accountName: string; debit: string; credit: string; description: string | null }[]; +} + +export default function JournalDetail() { + const { id } = useParams(); + const { can } = useAuth(); + const navigate = useNavigate(); + const entry = useLoad(() => api('GET', `/api/journal-entries/${id}`), [id]); + const [error, setError] = useState(null); + const [editing, setEditing] = useState(false); + const [reversing, setReversing] = useState(false); + + async function run(fn: () => Promise) { + setError(null); + try { await fn(); entry.reload(); } catch (e) { setError(e); } + } + + const e = entry.data; + if (!e) return ; + if (editing) return { setEditing(false); entry.reload(); }} />; + + const manual = e.source === 'MANUAL'; + return ( +
+ +
+
+

{e.entryNumber ?? 'مسودة'}

+

{e.description}

+
+ {ENTRY_STATUS_AR[e.status]} +
+
+
التاريخ
{e.entryDate}
+
المصدر
{REFERENCE_AR[e.referenceType] ?? e.referenceType}
+
العملة
{e.currency}
+
تاريخ الترحيل
{formatDateTime(e.postedAt)}
+ {e.reversalOfId &&
يعكس القيد
عرض الأصل
} + {e.reversedByEntryId &&
عُكس بالقيد
عرض القيد العكسي
} + {e.correctionOfId &&
تصحيح للقيد
عرض الأصل
} +
+ +
+ + + + {e.lines.map((l) => ( + + + + + + + + ))} + + + + + + +
#الحسابالبيانمديندائن
{l.lineNo}{l.accountCode} {l.accountName}{l.description ?? ''}{l.debit === '0.00' ? '' : formatAmount(l.debit)}{l.credit === '0.00' ? '' : formatAmount(l.credit)}
الإجمالي{formatAmount(e.totalDebit)}{formatAmount(e.totalCredit)}
+
+ +
+ {e.status === 'DRAFT' && manual && can('journal.create') && } + {e.status === 'DRAFT' && can('journal.post') && } + {e.status === 'DRAFT' && manual && can('journal.create') && ( + + )} + {e.status === 'POSTED' && manual && e.referenceType !== 'REVERSAL' && can('journal.reverse') && !reversing && ( + + )} +
+ {e.status === 'POSTED' && !manual &&

هذا القيد صادر عن مستند. يُصحَّح بإلغاء المستند أو إرجاعه.

} + + {reversing && ( +
{ + ev.preventDefault(); + const f = new FormData(ev.currentTarget); + void run(async () => { + const r = await api<{ reversal: { id: string } }>('POST', `/api/journal-entries/${e.id}/reverse`, { + reason: String(f.get('reason')), ...(f.get('date') ? { date: String(f.get('date')) } : {}), + }); + setReversing(false); + navigate(`/accounting/journal/${r.reversal.id}`); + }); + }}> +

لا يُعدَّل القيد المرحّل. سيُنشأ قيد عكسي مرحّل بنفس المبالغ معكوسة، ثم يمكنك إنشاء قيد تصحيح جديد.

+
+ + +
+
+ + +
+
+ )} +
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx new file mode 100644 index 000000000000..3a9127943343 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx @@ -0,0 +1,114 @@ +import { useState, type FormEvent } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount, fromHalalas, toHalalas } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import type { Account } from './ChartOfAccounts'; +import type { Entry } from './JournalDetail'; + +interface Line { accountId: string; debit: string; credit: string; description: string } + +const emptyLine = (): Line => ({ accountId: '', debit: '', credit: '', description: '' }); + +export default function JournalForm({ entry, onSaved }: { entry?: Entry; onSaved?: () => void }) { + const { can } = useAuth(); + const navigate = useNavigate(); + const accounts = useLoad(() => api<{ data: Account[] }>('GET', '/api/accounts?postableOnly=true')); + const [lines, setLines] = useState(() => + entry ? entry.lines.map((l) => ({ + accountId: l.accountId, debit: l.debit === '0.00' ? '' : l.debit, credit: l.credit === '0.00' ? '' : l.credit, description: l.description ?? '', + })) : [emptyLine(), emptyLine()]); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + const update = (i: number, patch: Partial) => setLines((ls) => ls.map((l, j) => (j === i ? { ...l, ...patch } : l))); + const debit = lines.reduce((s, l) => s + (toHalalas(l.debit) ?? 0), 0); + const credit = lines.reduce((s, l) => s + (toHalalas(l.credit) ?? 0), 0); + const diff = debit - credit; + + async function submit(e: FormEvent, postNow: boolean) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + const payload = { + entryDate: String(f.get('entryDate')), + description: String(f.get('description')), + lines: lines.filter((l) => l.accountId).map((l) => ({ + accountId: l.accountId, + ...(l.debit.trim() ? { debit: l.debit.trim() } : {}), + ...(l.credit.trim() ? { credit: l.credit.trim() } : {}), + description: l.description || null, + })), + }; + setBusy(true); + setError(null); + try { + if (entry) { + await api('PATCH', `/api/journal-entries/${entry.id}`, payload); + if (postNow) await api('POST', `/api/journal-entries/${entry.id}/post`); + onSaved?.(); + } else { + const created = await api<{ id: string }>('POST', '/api/journal-entries', { ...payload, post: postNow }); + navigate(`/accounting/journal/${created.id}`); + } + } catch (err) { + setError(err); + } finally { + setBusy(false); + } + } + + const today = new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh' }).format(new Date()); + + return ( +
submit(e, (e.nativeEvent as SubmitEvent).submitter?.getAttribute('value') === 'post')}> +

{entry ? 'تعديل مسودة القيد' : 'قيد يومية جديد'}

+ +
+ + +
+ +
+ + + + {lines.map((l, i) => ( + + + + + + + + ))} + + + + + + + + + +
الحسابمديندائنالبيان
+ + update(i, { debit: e.target.value, credit: e.target.value ? '' : l.credit })} /> update(i, { credit: e.target.value, debit: e.target.value ? '' : l.debit })} /> update(i, { description: e.target.value })} aria-label={`بيان السطر ${i + 1}`} />{lines.length > 2 && }
{formatAmount(fromHalalas(debit))}{formatAmount(fromHalalas(credit))} + {diff === 0 && debit > 0 + ? متوازن + : الفرق: {formatAmount(fromHalalas(Math.abs(diff)))}} +
+
+

يتحقق الخادم من توازن القيد وصحة الحسابات والفترة المالية عند الترحيل.

+
+ + {can('journal.post') && } +
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalList.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalList.tsx new file mode 100644 index 000000000000..5a234d01d566 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalList.tsx @@ -0,0 +1,64 @@ +import { useState } from 'react'; +import { Link } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { ENTRY_STATUS_AR, REFERENCE_AR, formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; + +interface Row { id: string; entryNumber: string | null; entryDate: string; description: string; referenceType: string; status: string; totalDebit: string } + +const PAGE = 50; + +export default function JournalList() { + const { can } = useAuth(); + const [status, setStatus] = useState(''); + const [search, setSearch] = useState(''); + const [offset, setOffset] = useState(0); + const list = useLoad(() => { + const q = new URLSearchParams({ limit: String(PAGE), offset: String(offset) }); + if (status) q.set('status', status); + if (search) q.set('search', search); + return api<{ data: Row[]; total: number }>('GET', `/api/journal-entries?${q}`); + }, [status, search, offset]); + + return ( +
+
+ + { if (e.key === 'Enter') { setSearch(e.currentTarget.value); setOffset(0); } }} /> + + {can('journal.create') && قيد جديد} +
+ +
+ + + + {list.data?.data.map((e) => ( + + + + + + + + + ))} + {list.data?.data.length === 0 && } + +
الرقمالتاريخالوصفالمصدرالمبلغالحالة
{e.entryNumber ?? 'مسودة'}{e.entryDate}{e.description}{REFERENCE_AR[e.referenceType] ?? e.referenceType}{formatAmount(e.totalDebit)}{ENTRY_STATUS_AR[e.status]}
لا توجد قيود
+
+ {list.data && list.data.total > PAGE && ( +
+ {offset + 1}–{Math.min(offset + PAGE, list.data.total)} من {list.data.total} + + +
+ )} +
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/TrialBalance.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/TrialBalance.tsx new file mode 100644 index 000000000000..b28520fe117d --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/TrialBalance.tsx @@ -0,0 +1,60 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../../api'; +import { ACCOUNT_TYPE_AR, formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; + +interface Row { accountId: string; code: string; nameAr: string; type: string; openingDebit: string; openingCredit: string; periodDebit: string; periodCredit: string; closingDebit: string; closingCredit: string } +interface Result { data: Row[]; totals: Omit; balanced: boolean } + +const year = new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh', year: 'numeric' }).format(new Date()); + +export default function TrialBalance() { + const [range, setRange] = useState({ from: `${year}-01-01`, to: `${year}-12-31` }); + const tb = useLoad(() => api('GET', `/api/reports/trial-balance?dateFrom=${range.from}&dateTo=${range.to}`), [range.from, range.to]); + + function submit(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + setRange({ from: String(f.get('from')), to: String(f.get('to')) }); + } + + const cell = (v: string) => {v === '0.00' ? '' : formatAmount(v)}; + return ( +
+
+ + + + + {tb.data && {tb.data.balanced ? 'الميزان متوازن' : 'الميزان غير متوازن'}} + + +
+ + + + + + + {tb.data?.data.map((r) => ( + + + + {cell(r.openingDebit)}{cell(r.openingCredit)}{cell(r.periodDebit)}{cell(r.periodCredit)}{cell(r.closingDebit)}{cell(r.closingCredit)} + + ))} + {tb.data?.data.length === 0 && } + + {tb.data && ( + + + {(['openingDebit', 'openingCredit', 'periodDebit', 'periodCredit', 'closingDebit', 'closingCredit'] as const).map((k) => + )} + + + )} +
الرمزالحسابالرصيد الافتتاحيحركة الفترةالرصيد الختامي
مديندائنمديندائنمديندائن
{r.code}{r.nameAr} {ACCOUNT_TYPE_AR[r.type]}
لا توجد حركات في هذه الفترة
الإجمالي{formatAmount(tb.data!.totals[k])}
+
+
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/styles.css b/alshuyukh-accounting/apps/web/src/styles.css index c87b0171a6d4..d08f35c4ff03 100644 --- a/alshuyukh-accounting/apps/web/src/styles.css +++ b/alshuyukh-accounting/apps/web/src/styles.css @@ -98,7 +98,7 @@ input, select { background: var(--surface); color: var(--text); min-width: 0; } input:focus, select:focus, .btn:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; } -input:invalid:not(:placeholder-shown):not(:focus) { border-color: var(--danger); } +input:user-invalid { border-color: var(--danger); } fieldset { border: none; padding: 0; margin: 0; min-width: 0; } .hint { font-weight: 400; font-size: 0.8rem; color: var(--muted); } .check { flex-direction: row; align-items: center; gap: 8px; font-weight: 400; margin-bottom: 6px; } @@ -167,3 +167,43 @@ fieldset { border: none; padding: 0; margin: 0; min-width: 0; } .user { display: none; } .grid-cards { grid-template-columns: 1fr; } } + +/* Accounting ---------------------------------------------------------------- */ +.tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border); margin-bottom: 18px; overflow-x: auto; } +.tab { padding: 8px 14px; text-decoration: none; color: var(--muted); border-bottom: 2px solid transparent; white-space: nowrap; font-weight: 500; } +.tab.active { color: var(--primary); border-bottom-color: var(--primary); } +.toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; } +.toolbar .check, .toolbar label { margin-bottom: 0; } +label.inline { flex-direction: row; align-items: center; gap: 6px; } +.spacer { flex: 1; } +.num { text-align: left !important; font-variant-numeric: tabular-nums; white-space: nowrap; } +.code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.88em; } +.row-header td { font-weight: 600; background: #f8fafb; } +.row-muted td { color: var(--muted); } +.tag-soft { margin-inline-start: 6px; background: var(--primary-soft); border-color: transparent; color: var(--primary); } +.tag.tag-off, .tag.tag-soft { margin-inline-start: 6px; } +.status-draft { background: var(--warn-bg); color: var(--warn-ink); border-color: transparent; } +.status-posted { background: var(--ok-bg); color: var(--ok-ink); border-color: transparent; } +.status-reversed { background: var(--err-bg); color: var(--danger); border-color: transparent; } +.plain-link { color: inherit; text-decoration: none; } +.plain-link:hover { color: var(--primary); } +.empty-row { text-align: center !important; padding: 24px !important; } +.entry-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; } +.entry-head h2 { margin: 0; } +.entry-head p { margin: 4px 0 0; } +.meta { display: flex; flex-wrap: wrap; gap: 8px 28px; margin: 16px 0; } +.meta div { display: flex; flex-direction: column; } +.meta dt { font-size: 0.78rem; color: var(--muted); } +.meta dd { margin: 0; } +.form-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 14px; } +.lines-table { min-width: 680px; } +.lines-table select, .lines-table input { width: 100%; } +.lines-table td { padding: 6px 4px; vertical-align: middle; } +.lines-table td:nth-child(1) { min-width: 220px; } +.lines-table td:nth-child(2), .lines-table td:nth-child(3) { width: 130px; } +.lines-table tfoot td { border-bottom: none; } +input[aria-invalid="true"] { border-color: var(--danger); } +.reverse-box { margin-top: 16px; padding: 14px; border: 1px solid var(--danger); border-radius: 8px; background: #fffafa; } +.reverse-box p { margin-top: 0; } +.tb-table th { text-align: center; } +.tb-table th:nth-child(1), .tb-table th:nth-child(2) { text-align: start; } diff --git a/alshuyukh-accounting/apps/web/src/ui.tsx b/alshuyukh-accounting/apps/web/src/ui.tsx index 83b663e90a1d..6ef378ab1034 100644 --- a/alshuyukh-accounting/apps/web/src/ui.tsx +++ b/alshuyukh-accounting/apps/web/src/ui.tsx @@ -18,7 +18,8 @@ export function useLoad(load: () => Promise, deps: unknown[] = []) { export function ErrorBox({ error }: { error: unknown }) { if (!error) return null; const msg = error instanceof Error ? error.message : String(error); - const details = error instanceof ApiError ? error.details : undefined; + // Only field-validation errors carry a list; other details are structured data. + const details = error instanceof ApiError && Array.isArray(error.details) ? error.details : undefined; return (
{msg} diff --git a/alshuyukh-accounting/docs/screenshots/p2-01-chart.png b/alshuyukh-accounting/docs/screenshots/p2-01-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..3713a8a9b9a9cc5c27f33d57c65a7c24ee84d59a GIT binary patch literal 188186 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 Z$OFs_@`qPmLN_U{?$_YXbxxt_{{f#xmTUk3 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p2-03-posted.png b/alshuyukh-accounting/docs/screenshots/p2-03-posted.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceccf5376205f72a27ae37a9fa0f77cb8a6f3e GIT binary patch literal 68102 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 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p2-04-reversal.png b/alshuyukh-accounting/docs/screenshots/p2-04-reversal.png new file mode 100644 index 0000000000000000000000000000000000000000..789462f8904a76951af969d3b15904b2f71e4de9 GIT binary patch literal 72060 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 Q{k9lo1r7O%mv27&H)Rmcn*aa+ literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p2-06-trial-balance.png b/alshuyukh-accounting/docs/screenshots/p2-06-trial-balance.png new file mode 100644 index 0000000000000000000000000000000000000000..feade9ac58ffa0d6f82ef50627fda5b4f0d52ef3 GIT binary patch literal 66887 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 z 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
Usuu1^|(raaAiCQ;yk6o`uiEy!v)#fS$dU4z4 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 PC`6JHlNZes(ewFV9ps@U literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/package-lock.json b/alshuyukh-accounting/package-lock.json index 69340e73c1db..6d32add51a31 100644 --- a/alshuyukh-accounting/package-lock.json +++ b/alshuyukh-accounting/package-lock.json @@ -24,6 +24,7 @@ "@fastify/helmet": "^13.1.1", "@fastify/rate-limit": "^11.2.0", "argon2": "^0.45.1", + "decimal.js": "^10.6.0", "fastify": "^5.12.5", "fastify-plugin": "^5.1.0", "jose": "^6.2.12", @@ -1375,6 +1376,12 @@ "dev": true, "license": "MIT" }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", From 644ead6106af6850aac3153a9fd7521b8193cb07 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 19:39:05 +0000 Subject: [PATCH 03/10] Add Phase 3: customers, suppliers, and products - Customers and suppliers share one implementation with separate tables, permissions, numbering, and control accounts - Saudi national address fields (ZATCA format) enforced in the database - Party balances come only from journal lines tagged with customer_id or supplier_id; the journal form offers a party picker on receivable and payable lines, which also covers opening balances - Products and services with units (UN/ECE codes), nested categories, 4-decimal unit prices, ZATCA VAT category, and optional account overrides checked by type; services can never track stock - Gap-free per-company document numbering, reused by invoices later - Accountant role can now manage customers and suppliers - Arabic screens for customers, suppliers, products, units, categories - 29 new tests (123 total) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RiHbDZ5HpzN6NRCMJmydEq --- alshuyukh-accounting/README.md | 54 +++- alshuyukh-accounting/apps/api/src/app.ts | 5 + .../db/migrations/0008_parties_products.sql | 269 +++++++++++++++ .../apps/api/src/lib/sequences.ts | 41 +++ .../apps/api/src/modules/accounting/engine.ts | 37 ++- .../src/modules/accounting/journal.routes.ts | 2 + .../apps/api/src/modules/accounting/setup.ts | 17 + .../api/src/modules/parties/parties.routes.ts | 267 +++++++++++++++ .../src/modules/products/products.routes.ts | 305 ++++++++++++++++++ .../apps/api/src/modules/rbac/catalog.ts | 3 +- .../apps/api/test/parties.test.ts | 171 ++++++++++ .../apps/api/test/products.test.ts | 110 +++++++ alshuyukh-accounting/apps/web/src/App.tsx | 8 +- alshuyukh-accounting/apps/web/src/Shell.tsx | 6 +- .../src/pages/accounting/JournalDetail.tsx | 2 +- .../web/src/pages/accounting/JournalForm.tsx | 26 +- .../apps/web/src/pages/parties/Parties.tsx | 180 +++++++++++ .../apps/web/src/pages/products/Products.tsx | 186 +++++++++++ alshuyukh-accounting/apps/web/src/styles.css | 11 + .../docs/screenshots/p3-01-customer-form.png | Bin 0 -> 94942 bytes .../docs/screenshots/p3-02-products.png | Bin 0 -> 57502 bytes .../docs/screenshots/p3-03-tagged-entry.png | Bin 0 -> 73374 bytes .../screenshots/p3-04-customer-balance.png | Bin 0 -> 56296 bytes 23 files changed, 1680 insertions(+), 20 deletions(-) create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0008_parties_products.sql create mode 100644 alshuyukh-accounting/apps/api/src/lib/sequences.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts create mode 100644 alshuyukh-accounting/apps/api/test/parties.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/products.test.ts create mode 100644 alshuyukh-accounting/apps/web/src/pages/parties/Parties.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/products/Products.tsx create mode 100644 alshuyukh-accounting/docs/screenshots/p3-01-customer-form.png create mode 100644 alshuyukh-accounting/docs/screenshots/p3-02-products.png create mode 100644 alshuyukh-accounting/docs/screenshots/p3-03-tagged-entry.png create mode 100644 alshuyukh-accounting/docs/screenshots/p3-04-customer-balance.png diff --git a/alshuyukh-accounting/README.md b/alshuyukh-accounting/README.md index 274c46bcadb4..68fd5b1b5404 100644 --- a/alshuyukh-accounting/README.md +++ b/alshuyukh-accounting/README.md @@ -6,6 +6,7 @@ - المرحلة 1 مكتملة: تأسيس المشروع، قاعدة البيانات، المصادقة، تعدد المنشآت، الصلاحيات. - المرحلة 2 مكتملة: دليل الحسابات، المحرك المحاسبي، القيود اليومية، السنوات والفترات المالية. +- المرحلة 3 مكتملة: العملاء، الموردون، المنتجات والخدمات، الوحدات والتصنيفات. بقية الوحدات تظهر في الواجهة بعلامة «قريبًا» دون أي بيانات تجريبية. @@ -48,6 +49,8 @@ alshuyukh-accounting/ │ │ │ │ ├── chart-template.ts # دليل الحسابات الافتراضي │ │ │ │ ├── setup.ts # تجهيز الشركة: الدليل + السنة المالية │ │ │ │ └── *.routes.ts # الحسابات، القيود، السنوات، ميزان المراجعة +│ │ │ ├── parties/ # العملاء والموردون (تنفيذ مشترك) +│ │ │ ├── products/ # المنتجات، الوحدات، التصنيفات │ │ │ ├── companies/ # الشركات، الفروع، المستودعات │ │ │ ├── settings/ # إعدادات المنشأة │ │ │ └── audit/ # سجل التدقيق @@ -302,6 +305,48 @@ erDiagram | POST | `/api/journal-entries/:id/reverse` (`reason`، `date`، `correction`) | `journal.reverse` | | GET | `/api/reports/trial-balance?dateFrom&dateTo` (رصيد افتتاحي، حركة، ختامي) | `report.view` | +## المرحلة 3: العملاء والموردون والمنتجات + +### قرارات التصميم + +- **الرصيد من الدفتر وحده.** لا يوجد حقل «رصيد» مخزّن للعميل أو المورد. سطر القيد يحمل `customer_id` أو `supplier_id`، والرصيد = مجموع (مدين − دائن) للسطور المرحّلة الموسومة بالطرف. يمكن إدخال الأرصدة الافتتاحية للعملاء والموردين بقيد يومية عادي يُختار فيه العميل أو المورد على سطر حساب العملاء أو الموردين، وكشف الحساب في المرحلة 7 يُبنى على الأساس نفسه. +- **العملاء والموردون بتنفيذ واحد** (`parties.routes.ts`) مع جداول وصلاحيات وترقيم وحساب رقابة منفصلة لكل منهما. +- **العنوان الوطني** بحقول ZATCA: رقم المبنى (4 أرقام)، الشارع، الحي، المدينة، الرمز البريدي (5 أرقام)، الرقم الإضافي (4 أرقام). الصيغة مفروضة في قاعدة البيانات. عنوان افتراضي واحد لكل نوع (فوترة / شحن). استبدال العناوين يحذفها حذفًا ناعمًا، لأن الفواتير ستحفظ نسختها الخاصة من العنوان. +- **الترقيم التلقائي** (`document_sequences`): عداد لكل شركة ونوع مستند بقفل صف داخل المعاملة، فلا فجوات ولا تكرار. مثل `CUS-00001` و `SUP-00001` و `PRD-00001`. إذا أدخل المستخدم رمزًا يدويًا يطابق رمزًا قادمًا، يتخطاه المولّد. المرحلة 4 ستستخدم الجدول نفسه لأرقام الفواتير. +- **المنتج لا يحمل نسبة الضريبة**، بل فئة ZATCA فقط: `S` أساسية، `Z` صفرية، `E` معفى، `O` خارج النطاق. النسبة تأتي من إعدادات الضريبة في المرحلة 6. +- **أسعار الوحدة بأربع خانات عشرية** `NUMERIC(18,4)`، وإجماليات الفواتير ستُقرَّب لخانتين. +- **الخدمة لا تتتبع مخزونًا**، والقاعدة مفروضة بقيد `CHECK`. +- **الوحدات** بأكواد UN/ECE (PCE، KGM، LTR، HUR…) لأنها مطلوبة في XML الفوترة الإلكترونية، وتُنشأ تلقائيًا لكل شركة. +- **حسابات بديلة اختيارية:** حساب رقابة للعميل (أصل) أو المورد (التزام)، وحساب مبيعات (إيراد) أو مشتريات (أصل / مصروف / تكلفة) للمنتج. النوع يُتحقق منه. + +### الجداول الجديدة + +| الجدول | الغرض | +|---|---| +| `customers`، `suppliers` | الأطراف: الرمز، الاسم، الرقم الضريبي، السجل التجاري، الهوية، حد الائتمان، مدة السداد، حساب الرقابة | +| `customer_addresses`، `supplier_addresses` | العناوين الوطنية | +| `units` | وحدات القياس | +| `product_categories` | تصنيفات المنتجات (شجرية) | +| `products` | المنتجات والخدمات | +| `document_sequences` | عدادات الترقيم | +| `journal_entry_lines` (تعديل) | عمودا `customer_id` و `supplier_id` مع مفتاح أجنبي مركّب، وطرف واحد كحد أقصى لكل سطر | + +**الفهارس:** رمز فريد لكل شركة؛ رقم ضريبي فريد لكل شركة؛ SKU وباركود فريدان لكل شركة (للسجلات غير المحذوفة)؛ فهارس `pg_trgm` على الأسماء العربية لسرعة البحث؛ فهارس على `customer_id` و `supplier_id` في سطور القيود لحساب الأرصدة. + +### واجهات API (المرحلة 3) + +| الطريقة | المسار | الصلاحية | +|---|---|---| +| GET | `/api/customers` (search، status، limit، offset)، `/api/customers/:id` | `customer.view` | +| POST / PATCH / DELETE | `/api/customers`، `/api/customers/:id` | `customer.manage` | +| PUT | `/api/customers/:id/addresses` | `customer.manage` | +| — | نفس المسارات تحت `/api/suppliers` | `supplier.view` / `supplier.manage` | +| GET / POST / PATCH | `/api/units`، `/api/product-categories` | `product.view` / `product.manage` | +| GET | `/api/products` (search بالاسم أو الرمز أو الباركود، categoryId، productType، status) | `product.view` | +| POST / PATCH / DELETE | `/api/products`، `/api/products/:id` | `product.manage` | + +`POST /api/journal-entries` يقبل `customerId` أو `supplierId` على كل سطر. + ## تدفق المصادقة 1. **التسجيل** ينشئ في معاملة واحدة: المستخدم، المنشأة، إعداداتها (SAR، Asia/Riyadh)، الشركة الافتراضية، الفرع الرئيسي، المستودع الرئيسي، العضوية بدور `TENANT_OWNER`، وسجل تدقيق. @@ -341,7 +386,7 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق ## الاختبارات -94 اختبار تكامل على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: +123 اختبار تكامل على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: | الملف | ما يغطيه | |---|---| @@ -352,6 +397,8 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق | `journal-entries.test.ts` | مثال الفاتورة 1000 + ضريبة 150؛ الترحيل والترقيم المتسلسل؛ رفض القيد غير المتوازن مع التفاصيل؛ التراجع الكامل عند الفشل؛ دقة الكسور (0.10 + 0.20)؛ التحقق من كل سطر؛ الحسابات التجميعية وغير النشطة والأجنبية؛ غياب الفترة؛ ترقيم بلا فجوات تحت التزامن؛ تعديل وحذف المسودات؛ رفض تعديل القيد المرحّل عبر API وعبر SQL مباشر؛ فرض التوازن في قاعدة البيانات؛ العكس والتصحيح؛ الفترات المقفلة؛ الصلاحيات؛ العزل؛ سجل التدقيق؛ ميزان المراجعة | | `chart-of-accounts.test.ts` | الدليل الافتراضي ومفاتيح النظام؛ السنة المالية التلقائية؛ تجهيز الشركات اللاحقة؛ الحسابات الفرعية وتحويل الحساب إلى تجميعي؛ منع الدوائر والتكرار وعدم تطابق النوع؛ حماية الحسابات النظامية وذات الرصيد؛ الإيقاف والحذف الناعم؛ مراكز التكلفة؛ العزل | | `fiscal-years.test.ts` | إنشاء السنوات ومنع التداخل؛ السنة القصيرة؛ قفل شهر البداية؛ إقفال السنة بربح وبخسارة وبلا حركة؛ منع الترحيل وإعادة الفتح بعد الإقفال؛ اشتراط إقفال السنوات السابقة | +| `parties.test.ts` | لكل من العملاء والموردين: الترقيم التلقائي وتخطي الرموز المأخوذة؛ التحقق من الرقم الضريبي والسجل والهوية وصيغة العنوان الوطني والعنوان الافتراضي؛ البحث؛ التعديل واستبدال العناوين والإيقاف؛ حساب الرقابة؛ الرصيد من القيود الموسومة ومنع الحذف بعدها؛ العزل بما فيه وسم قيد بطرف من منشأة أخرى؛ الصلاحيات لكل دور؛ سجل التدقيق | +| `products.test.ts` | الوحدات الافتراضية؛ الوحدات والتصنيفات المتداخلة؛ السلع والخدمات؛ الأسعار بأربع خانات؛ التحقق والتكرار؛ الحسابات البديلة؛ البحث بالباركود؛ الحذف الناعم؛ رفض وحدات منشأة أخرى؛ الصلاحيات | | `companies.test.ts` | القيم السعودية الافتراضية، التحقق، التكرار، الحذف الناعم، ربط المستودع بفرع شركة أخرى، تجاهل `tenant_id` في جسم الطلب، العضوية في منشأتين والتبديل | ## ملاحظات وقرارات تصميم @@ -371,6 +418,11 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق - نقل ملكية المنشأة. - Rate limiting يعتمد على ذاكرة العملية؛ في الإنتاج بأكثر من نسخة يلزم Redis. - لم تُطبَّق المصادقة الثنائية (2FA). +- **المرحلة 3:** + - استيراد العملاء والموردين والمنتجات من ملف Excel/CSV. + - منع حذف طرف أو منتج مستخدم في فواتير أو حركات مخزون (يُضاف مع المرحلتين 4 و 5؛ حاليًا يُمنع حذف الطرف إذا كان عليه قيود). + - متغيرات المنتج (مقاس، لون) وقوائم الأسعار — مع المرحلة 5. + - التحقق من حد الائتمان عند إصدار الفاتورة — المرحلة 4. - **المرحلة 2:** - تعدد العملات وأسعار الصرف: القيود حاليًا بعملة الشركة فقط. - إعادة فتح سنة مالية مقفلة (عكس قيد الإقفال) غير مدعومة. diff --git a/alshuyukh-accounting/apps/api/src/app.ts b/alshuyukh-accounting/apps/api/src/app.ts index 0a67585aadb1..d4b17e0d0dae 100644 --- a/alshuyukh-accounting/apps/api/src/app.ts +++ b/alshuyukh-accounting/apps/api/src/app.ts @@ -12,6 +12,8 @@ import fiscalRoutes from './modules/accounting/fiscal.routes.js'; import journalRoutes from './modules/accounting/journal.routes.js'; import trialBalanceRoutes from './modules/accounting/trial-balance.routes.js'; import auditRoutes from './modules/audit/audit.routes.js'; +import { CUSTOMER, SUPPLIER, partyRoutes } from './modules/parties/parties.routes.js'; +import productsRoutes from './modules/products/products.routes.js'; import authRoutes from './modules/auth/auth.routes.js'; import companiesRoutes from './modules/companies/companies.routes.js'; import rbacRoutes from './modules/rbac/rbac.routes.js'; @@ -91,6 +93,9 @@ export async function buildApp({ env, pool, logger = true }: BuildOptions): Prom await api.register(fiscalRoutes); await api.register(journalRoutes); await api.register(trialBalanceRoutes); + await api.register(partyRoutes(CUSTOMER)); + await api.register(partyRoutes(SUPPLIER)); + await api.register(productsRoutes); }, { prefix: '/api' }); return app; diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0008_parties_products.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0008_parties_products.sql new file mode 100644 index 000000000000..237db0e859df --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0008_parties_products.sql @@ -0,0 +1,269 @@ +-- 0008 — Customers, suppliers, products, units, and document numbering. +-- +-- Party balances are not stored: they come from journal lines tagged with +-- customer_id / supplier_id, so the ledger stays the single source of truth. + +CREATE EXTENSION IF NOT EXISTS pg_trgm; + +-- Document numbering --------------------------------------------------------------- +-- One counter per company and document type (CUSTOMER, SUPPLIER, PRODUCT, +-- and later SALES_INVOICE, ...). Incremented under a row lock inside the +-- caller's transaction, so numbers are gap-free. +CREATE TABLE document_sequences ( + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + doc_type text NOT NULL CHECK (doc_type ~ '^[A-Z][A-Z0-9_]{1,62}$'), + prefix text NOT NULL CHECK (prefix ~ '^[A-Z0-9-]{0,12}$'), + padding smallint NOT NULL DEFAULT 5 CHECK (padding BETWEEN 1 AND 12), + last_number integer NOT NULL DEFAULT 0 CHECK (last_number >= 0), + updated_at timestamptz NOT NULL DEFAULT now(), + PRIMARY KEY (company_id, doc_type), + CONSTRAINT document_sequences_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id) +); +CREATE TRIGGER document_sequences_updated_at BEFORE UPDATE ON document_sequences + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Saudi national address parts (ZATCA buyer/seller address fields). +CREATE OR REPLACE FUNCTION valid_saudi_address(building text, postal text, additional text) RETURNS boolean +LANGUAGE sql IMMUTABLE AS $$ + SELECT (building IS NULL OR building ~ '^[0-9]{4}$') + AND (postal IS NULL OR postal ~ '^[0-9]{5}$') + AND (additional IS NULL OR additional ~ '^[0-9]{4}$') +$$; + +-- Customers --------------------------------------------------------------------------- +CREATE TABLE customers ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[0-9A-Za-z_-]{1,30}$'), + party_type text NOT NULL DEFAULT 'BUSINESS' CHECK (party_type IN ('BUSINESS', 'INDIVIDUAL')), + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 2 AND 200), + name_en text, + vat_number text CHECK (vat_number ~ '^3[0-9]{13}3$'), + commercial_registration text CHECK (commercial_registration ~ '^[0-9]{10}$'), + national_id text CHECK (national_id ~ '^[12][0-9]{9}$'), + email citext, + phone text CHECK (phone ~ '^\+?[0-9 ()-]{6,20}$'), + credit_limit numeric(18,2) CHECK (credit_limit >= 0), + payment_terms_days smallint NOT NULL DEFAULT 0 CHECK (payment_terms_days BETWEEN 0 AND 365), + -- Overrides the company's ACCOUNTS_RECEIVABLE account when set. + receivable_account_id uuid, + notes text, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT customers_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT customers_account_fk FOREIGN KEY (receivable_account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT customers_id_company_uq UNIQUE (id, company_id) +); +CREATE UNIQUE INDEX customers_code_uq ON customers (company_id, code) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX customers_vat_uq ON customers (company_id, vat_number) WHERE vat_number IS NOT NULL AND deleted_at IS NULL; +CREATE INDEX customers_company_idx ON customers (tenant_id, company_id) WHERE deleted_at IS NULL; +CREATE INDEX customers_name_trgm ON customers USING gin (name_ar gin_trgm_ops); +CREATE INDEX customers_phone_idx ON customers (company_id, phone) WHERE phone IS NOT NULL; +CREATE TRIGGER customers_updated_at BEFORE UPDATE ON customers + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE customer_addresses ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + customer_id uuid NOT NULL, + address_type text NOT NULL DEFAULT 'BILLING' CHECK (address_type IN ('BILLING', 'SHIPPING')), + is_default boolean NOT NULL DEFAULT false, + building_number text, + street text, + district text, + city text, + postal_code text, + additional_number text, + country char(2) NOT NULL DEFAULT 'SA' CHECK (country ~ '^[A-Z]{2}$'), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT customer_addresses_customer_fk FOREIGN KEY (customer_id, company_id) REFERENCES customers (id, company_id), + CONSTRAINT customer_addresses_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT customer_addresses_format_ck CHECK (valid_saudi_address(building_number, postal_code, additional_number)) +); +CREATE INDEX customer_addresses_customer_idx ON customer_addresses (customer_id) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX customer_addresses_default_uq ON customer_addresses (customer_id, address_type) + WHERE is_default AND deleted_at IS NULL; +CREATE TRIGGER customer_addresses_updated_at BEFORE UPDATE ON customer_addresses + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Suppliers --------------------------------------------------------------------------- +CREATE TABLE suppliers ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[0-9A-Za-z_-]{1,30}$'), + party_type text NOT NULL DEFAULT 'BUSINESS' CHECK (party_type IN ('BUSINESS', 'INDIVIDUAL')), + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 2 AND 200), + name_en text, + vat_number text CHECK (vat_number ~ '^3[0-9]{13}3$'), + commercial_registration text CHECK (commercial_registration ~ '^[0-9]{10}$'), + national_id text CHECK (national_id ~ '^[12][0-9]{9}$'), + email citext, + phone text CHECK (phone ~ '^\+?[0-9 ()-]{6,20}$'), + credit_limit numeric(18,2) CHECK (credit_limit >= 0), + payment_terms_days smallint NOT NULL DEFAULT 0 CHECK (payment_terms_days BETWEEN 0 AND 365), + -- Overrides the company's ACCOUNTS_PAYABLE account when set. + payable_account_id uuid, + notes text, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT suppliers_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT suppliers_account_fk FOREIGN KEY (payable_account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT suppliers_id_company_uq UNIQUE (id, company_id) +); +CREATE UNIQUE INDEX suppliers_code_uq ON suppliers (company_id, code) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX suppliers_vat_uq ON suppliers (company_id, vat_number) WHERE vat_number IS NOT NULL AND deleted_at IS NULL; +CREATE INDEX suppliers_company_idx ON suppliers (tenant_id, company_id) WHERE deleted_at IS NULL; +CREATE INDEX suppliers_name_trgm ON suppliers USING gin (name_ar gin_trgm_ops); +CREATE TRIGGER suppliers_updated_at BEFORE UPDATE ON suppliers + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE supplier_addresses ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + supplier_id uuid NOT NULL, + address_type text NOT NULL DEFAULT 'BILLING' CHECK (address_type IN ('BILLING', 'SHIPPING')), + is_default boolean NOT NULL DEFAULT false, + building_number text, + street text, + district text, + city text, + postal_code text, + additional_number text, + country char(2) NOT NULL DEFAULT 'SA' CHECK (country ~ '^[A-Z]{2}$'), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT supplier_addresses_supplier_fk FOREIGN KEY (supplier_id, company_id) REFERENCES suppliers (id, company_id), + CONSTRAINT supplier_addresses_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT supplier_addresses_format_ck CHECK (valid_saudi_address(building_number, postal_code, additional_number)) +); +CREATE INDEX supplier_addresses_supplier_idx ON supplier_addresses (supplier_id) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX supplier_addresses_default_uq ON supplier_addresses (supplier_id, address_type) + WHERE is_default AND deleted_at IS NULL; +CREATE TRIGGER supplier_addresses_updated_at BEFORE UPDATE ON supplier_addresses + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Party tagging on journal lines (customer / supplier sub-ledgers) ---------------------- +ALTER TABLE journal_entry_lines + ADD COLUMN customer_id uuid, + ADD COLUMN supplier_id uuid, + ADD CONSTRAINT journal_lines_customer_fk FOREIGN KEY (customer_id, company_id) REFERENCES customers (id, company_id), + ADD CONSTRAINT journal_lines_supplier_fk FOREIGN KEY (supplier_id, company_id) REFERENCES suppliers (id, company_id), + ADD CONSTRAINT journal_lines_one_party_ck CHECK (customer_id IS NULL OR supplier_id IS NULL); +CREATE INDEX journal_lines_customer_idx ON journal_entry_lines (customer_id) WHERE customer_id IS NOT NULL; +CREATE INDEX journal_lines_supplier_idx ON journal_entry_lines (supplier_id) WHERE supplier_id IS NOT NULL; + +-- Products -------------------------------------------------------------------------- +CREATE TABLE units ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + -- UN/ECE Recommendation 20 code where one exists (PCE, KGM, LTR, ...). + code text NOT NULL CHECK (code ~ '^[A-Z0-9]{1,10}$'), + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 1 AND 50), + name_en text, + is_active boolean NOT NULL DEFAULT true, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT units_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT units_code_uq UNIQUE (company_id, code), + CONSTRAINT units_id_company_uq UNIQUE (id, company_id) +); +CREATE TRIGGER units_updated_at BEFORE UPDATE ON units + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE product_categories ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + parent_id uuid, + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 2 AND 100), + name_en text, + is_active boolean NOT NULL DEFAULT true, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT product_categories_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT product_categories_parent_fk FOREIGN KEY (parent_id, company_id) REFERENCES product_categories (id, company_id), + CONSTRAINT product_categories_id_company_uq UNIQUE (id, company_id), + CONSTRAINT product_categories_not_own_parent CHECK (parent_id IS NULL OR parent_id <> id) +); +CREATE UNIQUE INDEX product_categories_name_uq ON product_categories (company_id, COALESCE(parent_id, '00000000-0000-0000-0000-000000000000'::uuid), name_ar) + WHERE deleted_at IS NULL; +CREATE TRIGGER product_categories_updated_at BEFORE UPDATE ON product_categories + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE products ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + sku text NOT NULL CHECK (sku ~ '^[0-9A-Za-z._/-]{1,40}$'), + barcode text CHECK (barcode ~ '^[0-9A-Za-z-]{4,40}$'), + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 2 AND 200), + name_en text, + description text, + product_type text NOT NULL DEFAULT 'GOODS' CHECK (product_type IN ('GOODS', 'SERVICE')), + category_id uuid, + unit_id uuid NOT NULL, + -- Unit prices allow 4 decimals; invoice line totals are rounded to 2. + sale_price numeric(18,4) NOT NULL DEFAULT 0 CHECK (sale_price >= 0), + sale_price_includes_vat boolean NOT NULL DEFAULT false, + purchase_price numeric(18,4) NOT NULL DEFAULT 0 CHECK (purchase_price >= 0), + -- ZATCA VAT category: S standard, Z zero-rated, E exempt, O out of scope. + -- The rate itself comes from tax settings (Phase 6), never from the product. + vat_category char(1) NOT NULL DEFAULT 'S' CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + track_inventory boolean NOT NULL DEFAULT true, + -- Optional overrides of the company's default SALES / purchase accounts. + sales_account_id uuid, + purchase_account_id uuid, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + updated_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT products_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT products_category_fk FOREIGN KEY (category_id, company_id) REFERENCES product_categories (id, company_id), + CONSTRAINT products_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT products_sales_account_fk FOREIGN KEY (sales_account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT products_purchase_account_fk FOREIGN KEY (purchase_account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT products_id_company_uq UNIQUE (id, company_id), + -- Services never hold stock. + CONSTRAINT products_service_stock_ck CHECK (product_type = 'GOODS' OR NOT track_inventory) +); +CREATE UNIQUE INDEX products_sku_uq ON products (company_id, sku) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX products_barcode_uq ON products (company_id, barcode) WHERE barcode IS NOT NULL AND deleted_at IS NULL; +CREATE INDEX products_company_idx ON products (tenant_id, company_id) WHERE deleted_at IS NULL; +CREATE INDEX products_category_idx ON products (category_id); +CREATE INDEX products_name_trgm ON products USING gin (name_ar gin_trgm_ops); +CREATE TRIGGER products_updated_at BEFORE UPDATE ON products + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Row-Level Security -------------------------------------------------------------------- +DO $$ +DECLARE t text; +BEGIN + FOREACH t IN ARRAY ARRAY['document_sequences', 'customers', 'customer_addresses', 'suppliers', + 'supplier_addresses', 'units', 'product_categories', 'products'] LOOP + EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t); + EXECUTE format('CREATE POLICY %I ON %I USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id())', + t || '_isolation', t); + EXECUTE format('GRANT SELECT, INSERT, UPDATE ON %I TO alshuyukh_app', t); + END LOOP; +END +$$; diff --git a/alshuyukh-accounting/apps/api/src/lib/sequences.ts b/alshuyukh-accounting/apps/api/src/lib/sequences.ts new file mode 100644 index 000000000000..221ea33d209d --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/lib/sequences.ts @@ -0,0 +1,41 @@ +import type { Db } from '../db/tx.js'; + +export interface SequenceDefaults { prefix: string; padding?: number } + +/** + * Returns the next number of a per-company document sequence, e.g. + * "CUS-00001". The counter row is locked until the caller's transaction ends, + * so numbers are gap-free and never reused (a rollback also rolls back the + * increment). + */ +export async function nextDocumentNumber( + db: Db, tenantId: string, companyId: string, docType: string, defaults: SequenceDefaults, +): Promise { + await db.query( + `INSERT INTO document_sequences (tenant_id, company_id, doc_type, prefix, padding) + VALUES ($1, $2, $3, $4, $5) ON CONFLICT (company_id, doc_type) DO NOTHING`, + [tenantId, companyId, docType, defaults.prefix, defaults.padding ?? 5]); + const { rows: [row] } = await db.query<{ prefix: string; padding: number; last_number: number }>( + `UPDATE document_sequences SET last_number = last_number + 1 + WHERE company_id = $1 AND doc_type = $2 RETURNING prefix, padding, last_number`, + [companyId, docType]); + const n = String(row!.last_number).padStart(row!.padding, '0'); + return row!.prefix ? `${row!.prefix}-${n}` : n; +} + +/** + * Generates a code that is not already taken in `table` (a user may have + * typed a code that matches a future generated one). Master-data codes only; + * legal document numbers must not skip, so they use nextDocumentNumber alone. + */ +export async function nextFreeCode( + db: Db, tenantId: string, companyId: string, docType: string, defaults: SequenceDefaults, + table: 'customers' | 'suppliers' | 'products', column: 'code' | 'sku', +): Promise { + for (let i = 0; i < 1000; i++) { + const code = await nextDocumentNumber(db, tenantId, companyId, docType, defaults); + const taken = await db.query(`SELECT 1 FROM ${table} WHERE company_id = $1 AND ${column} = $2 AND deleted_at IS NULL`, [companyId, code]); + if (!taken.rowCount) return code; + } + throw new Error(`Could not generate a free ${docType} code`); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts index b24fc73735ba..1f619bd03a22 100644 --- a/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts @@ -29,6 +29,9 @@ export interface LineInput { description?: string | null; costCenterId?: string | null; branchId?: string | null; + /** Sub-ledger tag: the customer or supplier this line belongs to. */ + customerId?: string | null; + supplierId?: string | null; } export interface EntryInput { @@ -58,12 +61,14 @@ async function normalizeLines(db: Db, companyId: string, lines: LineInput[]): Pr const credit = new Decimal(l.credit || '0'); if (debit.isNegative() || credit.isNegative()) throw badRequest('INVALID_AMOUNT', `Line ${i + 1}: amounts cannot be negative`); if (debit.decimalPlaces() > 2 || credit.decimalPlaces() > 2) throw badRequest('INVALID_AMOUNT', `Line ${i + 1}: at most 2 decimal places`); + if (l.customerId && l.supplierId) throw badRequest('INVALID_LINE', `Line ${i + 1}: a line can belong to a customer or a supplier, not both`); if (debit.isZero() === credit.isZero()) { throw badRequest('INVALID_LINE', `Line ${i + 1}: enter either a debit or a credit amount, not both or neither`); } return { accountId: l.accountId, debit: toMoney(debit), credit: toMoney(credit), description: l.description ?? null, costCenterId: l.costCenterId ?? null, branchId: l.branchId ?? null, + customerId: l.customerId ?? null, supplierId: l.supplierId ?? null, }; }); @@ -94,6 +99,16 @@ async function normalizeLines(db: Db, companyId: string, lines: LineInput[]): Pr [companyId, branches]); if (rowCount !== branches.length) throw badRequest('INVALID_BRANCH', 'A branch does not exist in this company'); } + for (const [table, key, code, label] of [ + ['customers', 'customerId', 'INVALID_CUSTOMER', 'customer'], + ['suppliers', 'supplierId', 'INVALID_SUPPLIER', 'supplier'], + ] as const) { + const ids = [...new Set(normalized.map((l) => l[key]).filter(Boolean))] as string[]; + if (!ids.length) continue; + const { rowCount } = await db.query( + `SELECT 1 FROM ${table} WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL`, [companyId, ids]); + if (rowCount !== ids.length) throw badRequest(code, `A ${label} does not exist in this company`); + } return normalized; } @@ -101,13 +116,16 @@ async function insertLines(db: Db, tenantId: string, companyId: string, entryId: // One statement for all lines keeps large entries fast. await db.query( `INSERT INTO journal_entry_lines - (tenant_id, company_id, journal_entry_id, line_no, account_id, debit, credit, description, cost_center_id, branch_id) - SELECT $1, $2, $3, l.ord::smallint, l.account_id, l.debit, l.credit, l.description, l.cost_center_id, l.branch_id - FROM unnest($4::uuid[], $5::numeric[], $6::numeric[], $7::text[], $8::uuid[], $9::uuid[]) - WITH ORDINALITY AS l(account_id, debit, credit, description, cost_center_id, branch_id, ord)`, + (tenant_id, company_id, journal_entry_id, line_no, account_id, debit, credit, description, + cost_center_id, branch_id, customer_id, supplier_id) + SELECT $1, $2, $3, l.ord::smallint, l.account_id, l.debit, l.credit, l.description, + l.cost_center_id, l.branch_id, l.customer_id, l.supplier_id + FROM unnest($4::uuid[], $5::numeric[], $6::numeric[], $7::text[], $8::uuid[], $9::uuid[], $10::uuid[], $11::uuid[]) + WITH ORDINALITY AS l(account_id, debit, credit, description, cost_center_id, branch_id, customer_id, supplier_id, ord)`, [tenantId, companyId, entryId, lines.map((l) => l.accountId), lines.map((l) => l.debit), lines.map((l) => l.credit), - lines.map((l) => l.description), lines.map((l) => l.costCenterId), lines.map((l) => l.branchId)]); + lines.map((l) => l.description), lines.map((l) => l.costCenterId), lines.map((l) => l.branchId), + lines.map((l) => l.customerId), lines.map((l) => l.supplierId)]); } async function assertCompany(db: Db, tenantId: string, companyId: string): Promise<{ currency: string }> { @@ -252,8 +270,8 @@ export async function reverse(db: Db, ctx: EngineContext, id: string, opts: Reve throw conflict('SYSTEM_ENTRY', 'This entry was generated by a document. Cancel or return the document instead.'); } - const { rows: lines } = await db.query<{ account_id: string; debit: string; credit: string; description: string | null; cost_center_id: string | null; branch_id: string | null }>( - `SELECT account_id, debit, credit, description, cost_center_id, branch_id + const { rows: lines } = await db.query<{ account_id: string; debit: string; credit: string; description: string | null; cost_center_id: string | null; branch_id: string | null; customer_id: string | null; supplier_id: string | null }>( + `SELECT account_id, debit, credit, description, cost_center_id, branch_id, customer_id, supplier_id FROM journal_entry_lines WHERE journal_entry_id = $1 ORDER BY line_no`, [id]); const reversalId = await createDraft(db, ctx, { @@ -266,6 +284,7 @@ export async function reverse(db: Db, ctx: EngineContext, id: string, opts: Reve lines: lines.map((l) => ({ accountId: l.account_id, debit: l.credit, credit: l.debit, description: l.description, costCenterId: l.cost_center_id, branchId: l.branch_id, + customerId: l.customer_id, supplierId: l.supplier_id, })), }); await db.query(`UPDATE journal_entries SET reversal_of_id = $2 WHERE id = $1`, [reversalId, id]); @@ -375,6 +394,7 @@ export interface EntryView { lines: { id: string; lineNo: number; accountId: string; accountCode: string; accountName: string; debit: string; credit: string; description: string | null; costCenterId: string | null; branchId: string | null; + customerId: string | null; supplierId: string | null; }[]; } @@ -395,7 +415,8 @@ export async function getEntry(db: Db, tenantId: string, id: string): Promise( `SELECT l.id, l.line_no AS "lineNo", l.account_id AS "accountId", a.code AS "accountCode", a.name_ar AS "accountName", l.debit::text AS debit, l.credit::text AS credit, l.description, - l.cost_center_id AS "costCenterId", l.branch_id AS "branchId" + l.cost_center_id AS "costCenterId", l.branch_id AS "branchId", + l.customer_id AS "customerId", l.supplier_id AS "supplierId" FROM journal_entry_lines l JOIN accounts a ON a.id = l.account_id WHERE l.journal_entry_id = $1 ORDER BY l.line_no`, [id]); return { ...e, lines }; diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts index e76b45117ab0..2cd18f7ebdf4 100644 --- a/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/journal.routes.ts @@ -15,6 +15,8 @@ const line = z.object({ description: z.string().trim().max(500).nullish(), costCenterId: z.uuid().nullish(), branchId: z.uuid().nullish(), + customerId: z.uuid().nullish(), + supplierId: z.uuid().nullish(), }); const lines = z.array(line).min(2).max(1000); diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts index 855e86a2d79f..ce26ec3f6c3e 100644 --- a/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts @@ -85,12 +85,29 @@ export function currentFiscalYearStart(today: string, startMonth: number): strin return `${startYear}-${String(startMonth).padStart(2, '0')}-01`; } +// UN/ECE Recommendation 20 codes, used later in ZATCA XML. +const DEFAULT_UNITS: readonly [string, string, string][] = [ + ['PCE', 'حبة', 'Piece'], ['BX', 'كرتون', 'Box'], ['KGM', 'كيلوجرام', 'Kilogram'], ['LTR', 'لتر', 'Litre'], + ['MTR', 'متر', 'Metre'], ['SET', 'طقم', 'Set'], ['HUR', 'ساعة', 'Hour'], ['DAY', 'يوم', 'Day'], +]; + +/** Creates the default units of measure. Existing units are kept. */ +export async function seedDefaultUnits(db: Db, ref: CompanyRef): Promise { + for (const [code, ar, en] of DEFAULT_UNITS) { + await db.query( + `INSERT INTO units (tenant_id, company_id, code, name_ar, name_en) VALUES ($1, $2, $3, $4, $5) + ON CONFLICT (company_id, code) DO NOTHING`, + [ref.tenantId, ref.companyId, code, ar, en]); + } +} + /** * Prepares a new company for accounting: default chart and the current * fiscal year. Safe to call again; existing setup is left as is. */ export async function setupCompanyAccounting(db: Db, ref: CompanyRef, timezone = 'Asia/Riyadh') { const chartCreated = await seedDefaultChart(db, ref); + await seedDefaultUnits(db, ref); let fiscalYearId: string | null = null; const hasYear = await db.query(`SELECT 1 FROM fiscal_years WHERE company_id = $1 LIMIT 1`, [ref.companyId]); if (!hasYear.rowCount) { diff --git a/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts b/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts new file mode 100644 index 000000000000..59242eb36e6f --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts @@ -0,0 +1,267 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict, notFound } from '../../lib/errors.js'; +import { amountString } from '../../lib/money.js'; +import { nextFreeCode } from '../../lib/sequences.js'; +import { optionalText, parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { resolveCompanyId } from '../accounting/company-context.js'; +import { writeAudit } from '../audit/audit.service.js'; + +/** + * Customers and suppliers share one implementation. Each kind has its own + * tables, permissions, numbering, and control account (AR / AP). Balances + * come from journal lines tagged with the party, never from a stored field. + */ +interface PartyKind { + path: string; // URL segment + table: 'customers' | 'suppliers'; + addressTable: 'customer_addresses' | 'supplier_addresses'; + fk: 'customer_id' | 'supplier_id'; + accountColumn: 'receivable_account_id' | 'payable_account_id'; + // Control account must be of this type (AR is an asset, AP a liability). + accountType: 'ASSET' | 'LIABILITY'; + defaultAccountKey: 'ACCOUNTS_RECEIVABLE' | 'ACCOUNTS_PAYABLE'; + docType: 'CUSTOMER' | 'SUPPLIER'; + prefix: string; + viewPermission: string; + managePermission: string; + entity: 'customer' | 'supplier'; + label: string; +} + +export const CUSTOMER: PartyKind = { + path: 'customers', table: 'customers', addressTable: 'customer_addresses', fk: 'customer_id', + accountColumn: 'receivable_account_id', accountType: 'ASSET', + defaultAccountKey: 'ACCOUNTS_RECEIVABLE', docType: 'CUSTOMER', prefix: 'CUS', + viewPermission: 'customer.view', managePermission: 'customer.manage', entity: 'customer', label: 'Customer', +}; + +export const SUPPLIER: PartyKind = { + path: 'suppliers', table: 'suppliers', addressTable: 'supplier_addresses', fk: 'supplier_id', + accountColumn: 'payable_account_id', accountType: 'LIABILITY', + defaultAccountKey: 'ACCOUNTS_PAYABLE', docType: 'SUPPLIER', prefix: 'SUP', + viewPermission: 'supplier.view', managePermission: 'supplier.manage', entity: 'supplier', label: 'Supplier', +}; + +const address = z.object({ + addressType: z.enum(['BILLING', 'SHIPPING']).default('BILLING'), + isDefault: z.boolean().default(false), + buildingNumber: z.string().regex(/^\d{4}$/, 'Building number must be 4 digits').nullish(), + street: optionalText(200), + district: optionalText(100), + city: optionalText(100), + postalCode: z.string().regex(/^\d{5}$/, 'Postal code must be 5 digits').nullish(), + additionalNumber: z.string().regex(/^\d{4}$/, 'Additional number must be 4 digits').nullish(), + country: z.string().regex(/^[A-Z]{2}$/).default('SA'), +}); +type AddressInput = z.infer; + +const fields = { + code: z.string().trim().regex(/^[0-9A-Za-z_-]{1,30}$/, 'Code: letters, digits, _ or -').optional(), + partyType: z.enum(['BUSINESS', 'INDIVIDUAL']), + nameAr: z.string().trim().min(2).max(200), + nameEn: optionalText(200), + vatNumber: z.string().regex(/^3\d{13}3$/, 'Saudi VAT number must be 15 digits starting and ending with 3').nullish(), + commercialRegistration: z.string().regex(/^\d{10}$/, 'Commercial registration must be 10 digits').nullish(), + nationalId: z.string().regex(/^[12]\d{9}$/, 'National ID / Iqama must be 10 digits starting with 1 or 2').nullish(), + email: z.string().trim().toLowerCase().pipe(z.email().max(254)).nullish(), + phone: z.string().regex(/^\+?[0-9 ()-]{6,20}$/).nullish(), + creditLimit: amountString.nullish(), + paymentTermsDays: z.number().int().min(0).max(365), + controlAccountId: z.uuid().nullish(), + notes: optionalText(2000), +}; + +const createBody = z.object({ + companyId: z.uuid().optional(), + ...fields, + partyType: fields.partyType.default('BUSINESS'), + paymentTermsDays: fields.paymentTermsDays.default(0), + addresses: z.array(address).max(10).default([]), +}); +const updateBody = z.object({ ...fields, isActive: z.boolean() }).partial(); + +function checkAddresses(addresses: AddressInput[]) { + for (const type of ['BILLING', 'SHIPPING'] as const) { + const ofType = addresses.filter((a) => a.addressType === type); + const defaults = ofType.filter((a) => a.isDefault).length; + if (defaults > 1) throw badRequest('MULTIPLE_DEFAULT_ADDRESSES', `Only one default ${type.toLowerCase()} address is allowed`); + // The first address of each type becomes the default when none is marked. + if (ofType.length && defaults === 0) ofType[0]!.isDefault = true; + } +} + +export function partyRoutes(kind: PartyKind) { + const SELECT = ` + SELECT p.id, p.company_id AS "companyId", p.code, p.party_type AS "partyType", p.name_ar AS "nameAr", p.name_en AS "nameEn", + p.vat_number AS "vatNumber", p.commercial_registration AS "commercialRegistration", p.national_id AS "nationalId", + p.email, p.phone, p.credit_limit::text AS "creditLimit", p.payment_terms_days AS "paymentTermsDays", + p.${kind.accountColumn} AS "controlAccountId", p.notes, p.is_active AS "isActive", + p.created_at AS "createdAt", p.updated_at AS "updatedAt", + COALESCE(b.balance, 0)::numeric(18,2)::text AS balance + FROM ${kind.table} p + LEFT JOIN LATERAL ( + SELECT sum(l.debit - l.credit) AS balance + FROM journal_entry_lines l JOIN journal_entries e ON e.id = l.journal_entry_id + WHERE l.${kind.fk} = p.id AND e.status IN ('POSTED', 'REVERSED') + ) b ON true`; + + const ADDRESS_SELECT = ` + SELECT id, address_type AS "addressType", is_default AS "isDefault", building_number AS "buildingNumber", + street, district, city, postal_code AS "postalCode", additional_number AS "additionalNumber", country + FROM ${kind.addressTable}`; + + async function load(db: Db, tenantId: string, id: string) { + const { rows: [party] } = await db.query<{ companyId: string; [key: string]: unknown }>( + `${SELECT} WHERE p.tenant_id = $1 AND p.id = $2 AND p.deleted_at IS NULL`, [tenantId, id]); + if (!party) return undefined; + const { rows: addresses } = await db.query( + `${ADDRESS_SELECT} WHERE ${kind.fk} = $1 AND deleted_at IS NULL ORDER BY address_type, is_default DESC, created_at`, [id]); + return { ...party, addresses }; + } + + async function checkControlAccount(db: Db, companyId: string, accountId: string | null | undefined) { + if (!accountId) return; + const { rows: [a] } = await db.query<{ account_type: string; is_postable: boolean; is_active: boolean }>( + `SELECT account_type, is_postable, is_active FROM accounts WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, accountId]); + if (!a) throw badRequest('INVALID_ACCOUNT', 'Account does not exist in this company'); + if (a.account_type !== kind.accountType || !a.is_postable || !a.is_active) { + throw badRequest('INVALID_CONTROL_ACCOUNT', `The ${kind.entity} account must be an active postable ${kind.accountType.toLowerCase()} account`); + } + } + + async function insertAddresses(db: Db, tenantId: string, companyId: string, partyId: string, addresses: AddressInput[]) { + for (const a of addresses) { + await db.query( + `INSERT INTO ${kind.addressTable} (tenant_id, company_id, ${kind.fk}, address_type, is_default, building_number, + street, district, city, postal_code, additional_number, country) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, + [tenantId, companyId, partyId, a.addressType, a.isDefault, a.buildingNumber ?? null, a.street ?? null, + a.district ?? null, a.city ?? null, a.postalCode ?? null, a.additionalNumber ?? null, a.country]); + } + } + + return async function routes(app: FastifyInstance) { + const canView = requirePermission(app, kind.viewPermission); + const canManage = requirePermission(app, kind.managePermission); + + app.get(`/${kind.path}`, { preHandler: canView }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), + search: z.string().trim().max(100).optional(), + status: z.enum(['active', 'inactive', 'all']).default('active'), + limit: z.coerce.number().int().min(1).max(200).default(50), + offset: z.coerce.number().int().min(0).default(0), + }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const search = q.search ? `%${q.search.replace(/[%_\\]/g, (m) => `\\${m}`)}%` : null; + const { rows } = await db.query<{ total: string }>( + `${SELECT.replace('SELECT p.id', 'SELECT count(*) OVER () AS total, p.id')} + WHERE p.tenant_id = $1 AND p.company_id = $2 AND p.deleted_at IS NULL + AND ($3 = 'all' OR p.is_active = ($3 = 'active')) + AND ($4::text IS NULL OR p.name_ar ILIKE $4 OR p.name_en ILIKE $4 OR p.code ILIKE $4 + OR p.vat_number ILIKE $4 OR p.phone ILIKE $4 OR p.email::text ILIKE $4) + ORDER BY p.name_ar LIMIT $5 OFFSET $6`, + [req.auth!.tenantId, companyId, q.status, search, q.limit, q.offset]); + return { data: rows.map(({ total: _t, ...r }) => r), total: Number(rows[0]?.total ?? 0) }; + }); + }); + + app.get(`/${kind.path}/:id`, { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + const party = await req.tenantTx((db) => load(db, req.auth!.tenantId, id)); + if (!party) throw notFound(kind.label); + return party; + }); + + app.post(`/${kind.path}`, { preHandler: canManage }, async (req, reply) => { + const body = parse(createBody, req.body); + checkAddresses(body.addresses); + const a = req.auth!; + const party = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + await checkControlAccount(db, companyId, body.controlAccountId); + const code = body.code ?? await nextFreeCode(db, a.tenantId, companyId, kind.docType, { prefix: kind.prefix }, kind.table, 'code'); + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO ${kind.table} (tenant_id, company_id, code, party_type, name_ar, name_en, vat_number, + commercial_registration, national_id, email, phone, credit_limit, payment_terms_days, ${kind.accountColumn}, + notes, created_by, updated_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $16) RETURNING id`, + [a.tenantId, companyId, code, body.partyType, body.nameAr, body.nameEn ?? null, body.vatNumber ?? null, + body.commercialRegistration ?? null, body.nationalId ?? null, body.email ?? null, body.phone ?? null, + body.creditLimit ?? null, body.paymentTermsDays, body.controlAccountId ?? null, body.notes ?? null, a.userId]); + await insertAddresses(db, a.tenantId, companyId, row!.id, body.addresses); + const created = await load(db, a.tenantId, row!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: kind.entity, entityId: row!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return party; + }); + + app.patch(`/${kind.path}/:id`, { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(updateBody, req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await load(db, a.tenantId, id); + if (!before) throw notFound(kind.label); + if (body.controlAccountId) await checkControlAccount(db, before.companyId, body.controlAccountId); + // Whitelisted column names only; values are parameters. + const map: [keyof typeof body, string][] = [ + ['code', 'code'], ['partyType', 'party_type'], ['nameAr', 'name_ar'], ['nameEn', 'name_en'], + ['vatNumber', 'vat_number'], ['commercialRegistration', 'commercial_registration'], ['nationalId', 'national_id'], + ['email', 'email'], ['phone', 'phone'], ['creditLimit', 'credit_limit'], ['paymentTermsDays', 'payment_terms_days'], + ['controlAccountId', kind.accountColumn], ['notes', 'notes'], ['isActive', 'is_active'], + ]; + const sets: string[] = []; + const values: unknown[] = []; + for (const [key, col] of map) { + if (body[key] !== undefined) { values.push(body[key]); sets.push(`${col} = $${values.length + 3}`); } + } + if (sets.length) { + await db.query(`UPDATE ${kind.table} SET ${sets.join(', ')}, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, + [a.tenantId, id, a.userId, ...values]); + } + const after = await load(db, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: kind.entity, entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + /** Replaces the address list. Old addresses are soft-deleted (documents keep their own copy). */ + app.put(`/${kind.path}/:id/addresses`, { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ addresses: z.array(address).max(10) }), req.body); + checkAddresses(body.addresses); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await load(db, a.tenantId, id); + if (!before) throw notFound(kind.label); + await db.query(`UPDATE ${kind.addressTable} SET deleted_at = now() WHERE ${kind.fk} = $1 AND deleted_at IS NULL`, [id]); + await insertAddresses(db, a.tenantId, before.companyId, id, body.addresses); + const after = await load(db, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: kind.entity, entityId: id, oldValues: { addresses: before.addresses }, newValues: { addresses: after!.addresses } }, req.auditMeta()); + return after; + }); + }); + + app.delete(`/${kind.path}/:id`, { preHandler: canManage }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + await req.tenantTx(async (db) => { + const before = await load(db, a.tenantId, id); + if (!before) throw notFound(kind.label); + const used = await db.query(`SELECT 1 FROM journal_entry_lines WHERE ${kind.fk} = $1 LIMIT 1`, [id]); + // TODO(Phase 4): also refuse when invoices or payments reference the party. + if (used.rowCount) throw conflict('PARTY_IN_USE', `This ${kind.entity} has accounting transactions. Deactivate it instead.`); + await db.query(`UPDATE ${kind.table} SET deleted_at = now(), is_active = false, updated_by = $2 WHERE id = $1`, [id, a.userId]); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: kind.entity, entityId: id, oldValues: before }, req.auditMeta()); + }); + return reply.code(204).send(); + }); + }; +} diff --git a/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts b/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts new file mode 100644 index 000000000000..beca3f6281d8 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts @@ -0,0 +1,305 @@ +import type { FastifyInstance } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict, notFound } from '../../lib/errors.js'; +import { nextFreeCode } from '../../lib/sequences.js'; +import { optionalText, parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { resolveCompanyId } from '../accounting/company-context.js'; +import { writeAudit } from '../audit/audit.service.js'; + +/** Unit price: up to 4 decimals, as a string. */ +const price = z.string().trim().regex(/^\d{1,14}(\.\d{1,4})?$/, 'Price must be a non-negative number with at most 4 decimals, sent as a string'); + +const PRODUCT_SELECT = ` + SELECT p.id, p.company_id AS "companyId", p.sku, p.barcode, p.name_ar AS "nameAr", p.name_en AS "nameEn", + p.description, p.product_type AS "productType", p.category_id AS "categoryId", c.name_ar AS "categoryName", + p.unit_id AS "unitId", u.code AS "unitCode", u.name_ar AS "unitName", + p.sale_price::text AS "salePrice", p.sale_price_includes_vat AS "salePriceIncludesVat", + p.purchase_price::text AS "purchasePrice", p.vat_category AS "vatCategory", p.track_inventory AS "trackInventory", + p.sales_account_id AS "salesAccountId", p.purchase_account_id AS "purchaseAccountId", + p.is_active AS "isActive", p.created_at AS "createdAt", p.updated_at AS "updatedAt" + FROM products p + JOIN units u ON u.id = p.unit_id + LEFT JOIN product_categories c ON c.id = p.category_id`; + +const productFields = { + sku: z.string().trim().regex(/^[0-9A-Za-z._/-]{1,40}$/, 'SKU: letters, digits, . _ / -'), + barcode: z.string().trim().regex(/^[0-9A-Za-z-]{4,40}$/).nullish(), + nameAr: z.string().trim().min(2).max(200), + nameEn: optionalText(200), + description: optionalText(2000), + productType: z.enum(['GOODS', 'SERVICE']), + categoryId: z.uuid().nullish(), + unitId: z.uuid(), + salePrice: price, + salePriceIncludesVat: z.boolean(), + purchasePrice: price, + vatCategory: z.enum(['S', 'Z', 'E', 'O']), + trackInventory: z.boolean(), + salesAccountId: z.uuid().nullish(), + purchaseAccountId: z.uuid().nullish(), +}; + +const createBody = z.object({ + companyId: z.uuid().optional(), + ...productFields, + sku: productFields.sku.optional(), + unitId: productFields.unitId.optional(), + productType: productFields.productType.default('GOODS'), + salePrice: price.default('0'), + salePriceIncludesVat: z.boolean().default(false), + purchasePrice: price.default('0'), + vatCategory: productFields.vatCategory.default('S'), + trackInventory: z.boolean().optional(), +}); +const updateBody = z.object({ ...productFields, isActive: z.boolean() }).partial(); + +const COLUMNS: [keyof z.infer, string][] = [ + ['sku', 'sku'], ['barcode', 'barcode'], ['nameAr', 'name_ar'], ['nameEn', 'name_en'], ['description', 'description'], + ['productType', 'product_type'], ['categoryId', 'category_id'], ['unitId', 'unit_id'], ['salePrice', 'sale_price'], + ['salePriceIncludesVat', 'sale_price_includes_vat'], ['purchasePrice', 'purchase_price'], ['vatCategory', 'vat_category'], + ['trackInventory', 'track_inventory'], ['salesAccountId', 'sales_account_id'], ['purchaseAccountId', 'purchase_account_id'], + ['isActive', 'is_active'], +]; + +async function loadProduct(db: Db, tenantId: string, id: string) { + const { rows: [p] } = await db.query<{ companyId: string; productType: string; trackInventory: boolean; [k: string]: unknown }>( + `${PRODUCT_SELECT} WHERE p.tenant_id = $1 AND p.id = $2 AND p.deleted_at IS NULL`, [tenantId, id]); + return p; +} + +/** Checks that referenced rows belong to the same company and fit their role. */ +async function checkReferences(db: Db, companyId: string, body: Partial>) { + if (body.unitId) { + const u = await db.query(`SELECT 1 FROM units WHERE company_id = $1 AND id = $2 AND is_active`, [companyId, body.unitId]); + if (!u.rowCount) throw badRequest('INVALID_UNIT', 'Unit does not exist in this company'); + } + if (body.categoryId) { + const c = await db.query(`SELECT 1 FROM product_categories WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, body.categoryId]); + if (!c.rowCount) throw badRequest('INVALID_CATEGORY', 'Category does not exist in this company'); + } + const checkAccount = async (id: string | null | undefined, allowed: string[], label: string) => { + if (!id) return; + const { rows: [a] } = await db.query<{ account_type: string; is_postable: boolean; is_active: boolean }>( + `SELECT account_type, is_postable, is_active FROM accounts WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, id]); + if (!a || !a.is_postable || !a.is_active || !allowed.includes(a.account_type)) { + throw badRequest('INVALID_PRODUCT_ACCOUNT', `${label} must be an active postable account of type ${allowed.join(' or ')}`); + } + }; + await checkAccount(body.salesAccountId, ['REVENUE'], 'Sales account'); + await checkAccount(body.purchaseAccountId, ['ASSET', 'EXPENSE', 'COST_OF_GOODS_SOLD'], 'Purchase account'); +} + +export default async function productsRoutes(app: FastifyInstance) { + const canView = requirePermission(app, 'product.view'); + const canManage = requirePermission(app, 'product.manage'); + + // Units ------------------------------------------------------------------------ + app.get('/units', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query( + `SELECT id, code, name_ar AS "nameAr", name_en AS "nameEn", is_active AS "isActive" + FROM units WHERE tenant_id = $1 AND company_id = $2 ORDER BY code`, [req.auth!.tenantId, companyId]); + return { data: rows }; + }); + }); + + app.post('/units', { preHandler: canManage }, async (req, reply) => { + const body = parse(z.object({ + companyId: z.uuid().optional(), + code: z.string().trim().toUpperCase().regex(/^[A-Z0-9]{1,10}$/), + nameAr: z.string().trim().min(1).max(50), + nameEn: optionalText(50), + }), req.body); + const a = req.auth!; + const unit = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + const { rows: [u] } = await db.query<{ id: string }>( + `INSERT INTO units (tenant_id, company_id, code, name_ar, name_en) VALUES ($1, $2, $3, $4, $5) + RETURNING id, code, name_ar AS "nameAr", name_en AS "nameEn", is_active AS "isActive"`, + [a.tenantId, companyId, body.code, body.nameAr, body.nameEn ?? null]); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'unit', entityId: u!.id, newValues: u }, req.auditMeta()); + return u; + }); + reply.code(201); + return unit; + }); + + app.patch('/units/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ nameAr: z.string().trim().min(1).max(50), nameEn: optionalText(50), isActive: z.boolean() }).partial(), req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const { rows: [before] } = await db.query(`SELECT id, code, name_ar AS "nameAr", name_en AS "nameEn", is_active AS "isActive" FROM units WHERE tenant_id = $1 AND id = $2`, [a.tenantId, id]); + if (!before) throw notFound('Unit'); + if (body.isActive === false) { + const used = await db.query(`SELECT 1 FROM products WHERE unit_id = $1 AND deleted_at IS NULL AND is_active LIMIT 1`, [id]); + if (used.rowCount) throw conflict('UNIT_IN_USE', 'Active products use this unit'); + } + const { rows: [after] } = await db.query( + `UPDATE units SET name_ar = COALESCE($2, name_ar), name_en = CASE WHEN $3::boolean THEN $4 ELSE name_en END, + is_active = COALESCE($5, is_active) + WHERE id = $1 RETURNING id, code, name_ar AS "nameAr", name_en AS "nameEn", is_active AS "isActive"`, + [id, body.nameAr ?? null, body.nameEn !== undefined, body.nameEn ?? null, body.isActive ?? null]); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'unit', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + // Categories ------------------------------------------------------------------- + const CATEGORY_SELECT = `SELECT id, parent_id AS "parentId", name_ar AS "nameAr", name_en AS "nameEn", is_active AS "isActive" FROM product_categories`; + + app.get('/product-categories', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query(`${CATEGORY_SELECT} WHERE tenant_id = $1 AND company_id = $2 AND deleted_at IS NULL ORDER BY name_ar`, [req.auth!.tenantId, companyId]); + return { data: rows }; + }); + }); + + app.post('/product-categories', { preHandler: canManage }, async (req, reply) => { + const body = parse(z.object({ companyId: z.uuid().optional(), nameAr: z.string().trim().min(2).max(100), nameEn: optionalText(100), parentId: z.uuid().nullish() }), req.body); + const a = req.auth!; + const cat = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + if (body.parentId) { + const p = await db.query(`SELECT 1 FROM product_categories WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, body.parentId]); + if (!p.rowCount) throw badRequest('INVALID_CATEGORY', 'Parent category does not exist in this company'); + } + const { rows: [c] } = await db.query<{ id: string }>( + `INSERT INTO product_categories (tenant_id, company_id, parent_id, name_ar, name_en) VALUES ($1, $2, $3, $4, $5) RETURNING id`, + [a.tenantId, companyId, body.parentId ?? null, body.nameAr, body.nameEn ?? null]); + const created = (await db.query(`${CATEGORY_SELECT} WHERE id = $1`, [c!.id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'product_category', entityId: c!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return cat; + }); + + app.patch('/product-categories/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ nameAr: z.string().trim().min(2).max(100), nameEn: optionalText(100), isActive: z.boolean() }).partial(), req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = (await db.query(`${CATEGORY_SELECT} WHERE tenant_id = $1 AND id = $2 AND deleted_at IS NULL`, [a.tenantId, id])).rows[0]; + if (!before) throw notFound('Category'); + await db.query( + `UPDATE product_categories SET name_ar = COALESCE($2, name_ar), name_en = CASE WHEN $3::boolean THEN $4 ELSE name_en END, + is_active = COALESCE($5, is_active) WHERE id = $1`, + [id, body.nameAr ?? null, body.nameEn !== undefined, body.nameEn ?? null, body.isActive ?? null]); + const after = (await db.query(`${CATEGORY_SELECT} WHERE id = $1`, [id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'product_category', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + // Products --------------------------------------------------------------------- + app.get('/products', { preHandler: canView }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), + search: z.string().trim().max(100).optional(), + categoryId: z.uuid().optional(), + productType: z.enum(['GOODS', 'SERVICE']).optional(), + status: z.enum(['active', 'inactive', 'all']).default('active'), + limit: z.coerce.number().int().min(1).max(200).default(50), + offset: z.coerce.number().int().min(0).default(0), + }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const search = q.search ? `%${q.search.replace(/[%_\\]/g, (m) => `\\${m}`)}%` : null; + const { rows } = await db.query<{ total: string }>( + `${PRODUCT_SELECT.replace('SELECT p.id', 'SELECT count(*) OVER () AS total, p.id')} + WHERE p.tenant_id = $1 AND p.company_id = $2 AND p.deleted_at IS NULL + AND ($3 = 'all' OR p.is_active = ($3 = 'active')) + AND ($4::text IS NULL OR p.name_ar ILIKE $4 OR p.name_en ILIKE $4 OR p.sku ILIKE $4 OR p.barcode = $5) + AND ($6::uuid IS NULL OR p.category_id = $6) + AND ($7::text IS NULL OR p.product_type = $7) + ORDER BY p.name_ar LIMIT $8 OFFSET $9`, + [req.auth!.tenantId, companyId, q.status, search, q.search ?? null, q.categoryId ?? null, q.productType ?? null, q.limit, q.offset]); + return { data: rows.map(({ total: _t, ...r }) => r), total: Number(rows[0]?.total ?? 0) }; + }); + }); + + app.get('/products/:id', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + const product = await req.tenantTx((db) => loadProduct(db, req.auth!.tenantId, id)); + if (!product) throw notFound('Product'); + return product; + }); + + app.post('/products', { preHandler: canManage }, async (req, reply) => { + const body = parse(createBody, req.body); + const trackInventory = body.trackInventory ?? body.productType === 'GOODS'; + if (body.productType === 'SERVICE' && trackInventory) throw badRequest('SERVICE_NO_STOCK', 'Services cannot track inventory'); + const a = req.auth!; + const product = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + let unitId = body.unitId; + if (!unitId) { + const { rows: [u] } = await db.query<{ id: string }>(`SELECT id FROM units WHERE company_id = $1 AND code = $2`, [companyId, body.productType === 'SERVICE' ? 'HUR' : 'PCE']); + if (!u) throw badRequest('UNIT_REQUIRED', 'unitId is required'); + unitId = u.id; + } + await checkReferences(db, companyId, { ...body, unitId }); + const sku = body.sku ?? await nextFreeCode(db, a.tenantId, companyId, 'PRODUCT', { prefix: 'PRD' }, 'products', 'sku'); + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO products (tenant_id, company_id, sku, barcode, name_ar, name_en, description, product_type, category_id, + unit_id, sale_price, sale_price_includes_vat, purchase_price, vat_category, track_inventory, + sales_account_id, purchase_account_id, created_by, updated_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $18) RETURNING id`, + [a.tenantId, companyId, sku, body.barcode ?? null, body.nameAr, body.nameEn ?? null, body.description ?? null, + body.productType, body.categoryId ?? null, unitId, body.salePrice, body.salePriceIncludesVat, body.purchasePrice, + body.vatCategory, trackInventory, body.salesAccountId ?? null, body.purchaseAccountId ?? null, a.userId]); + const created = await loadProduct(db, a.tenantId, row!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'product', entityId: row!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return product; + }); + + app.patch('/products/:id', { preHandler: canManage }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(updateBody, req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const before = await loadProduct(db, a.tenantId, id); + if (!before) throw notFound('Product'); + const type = body.productType ?? before.productType; + const track = body.trackInventory ?? (body.productType === 'SERVICE' ? false : before.trackInventory); + if (type === 'SERVICE' && track) throw badRequest('SERVICE_NO_STOCK', 'Services cannot track inventory'); + // TODO(Phase 5): refuse changing type or tracking once stock movements exist. + if (body.productType === 'SERVICE' && body.trackInventory === undefined) body.trackInventory = false; + await checkReferences(db, before.companyId, body); + const sets: string[] = []; + const values: unknown[] = []; + for (const [key, col] of COLUMNS) { + if (body[key] !== undefined) { values.push(body[key]); sets.push(`${col} = $${values.length + 3}`); } + } + if (sets.length) { + await db.query(`UPDATE products SET ${sets.join(', ')}, updated_by = $3 WHERE tenant_id = $1 AND id = $2`, [a.tenantId, id, a.userId, ...values]); + } + const after = await loadProduct(db, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'UPDATE', entityType: 'product', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + app.delete('/products/:id', { preHandler: canManage }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + const a = req.auth!; + await req.tenantTx(async (db) => { + const before = await loadProduct(db, a.tenantId, id); + if (!before) throw notFound('Product'); + // TODO(Phase 4/5): refuse when invoices or stock movements reference the product. + await db.query(`UPDATE products SET deleted_at = now(), is_active = false, updated_by = $2 WHERE id = $1`, [id, a.userId]); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'product', entityId: id, oldValues: before }, req.auditMeta()); + }); + return reply.code(204).send(); + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts b/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts index 36a7e6760a49..89559d53cb21 100644 --- a/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts +++ b/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts @@ -102,7 +102,8 @@ export const SYSTEM_ROLES: readonly SystemRoleDef[] = [ en: 'Accountant', permissions: [ 'company.view', 'account.view', 'account.manage', 'journal.view', 'journal.create', - 'journal.post', 'journal.reverse', 'fiscal.manage', 'customer.view', 'supplier.view', + 'journal.post', 'journal.reverse', 'fiscal.manage', 'customer.view', 'customer.manage', + 'supplier.view', 'supplier.manage', 'product.view', 'invoice.view', 'invoice.create', 'invoice.edit', 'invoice.post', 'invoice.cancel', 'purchase.view', 'purchase.create', 'purchase.post', 'payment.view', 'payment.create', 'inventory.view', 'expense.view', 'expense.create', 'expense.post', diff --git a/alshuyukh-accounting/apps/api/test/parties.test.ts b/alshuyukh-accounting/apps/api/test/parties.test.ts new file mode 100644 index 000000000000..47b6480678e0 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/parties.test.ts @@ -0,0 +1,171 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { addMember, chart, client, cr, dateInYear, dr, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); +}); +afterAll(async () => { await t.close(); }); + +const api = () => client(t.app, owner.token); + +const address = { + addressType: 'BILLING', buildingNumber: '1234', street: 'طريق الملك فهد', district: 'العليا', + city: 'الرياض', postalCode: '12345', additionalNumber: '6789', +}; + +describe.each([ + ['customers', 'CUS', 'ACCOUNTS_RECEIVABLE', 'customer'], + ['suppliers', 'SUP', 'ACCOUNTS_PAYABLE', 'supplier'], +] as const)('%s', (path, prefix, controlKey, entity) => { + it('creates a party with an automatic code and a national address', async () => { + const res = await api().post(`/api/${path}`, { + nameAr: 'شركة النخبة للتجارة', vatNumber: '300000000000003', commercialRegistration: '1010101010', + phone: '+966 50 123 4567', email: 'Info@Nukhba.SA', paymentTermsDays: 30, creditLimit: '50000.00', + addresses: [address], + }); + expect(res.statusCode).toBe(201); + const p = res.json(); + expect(p.code).toMatch(new RegExp(`^${prefix}-\\d{5}$`)); + expect(p).toMatchObject({ partyType: 'BUSINESS', email: 'info@nukhba.sa', creditLimit: '50000.00', balance: '0.00', isActive: true }); + expect(p.addresses).toEqual([expect.objectContaining({ ...address, isDefault: true, country: 'SA' })]); + + const next = (await api().post(`/api/${path}`, { nameAr: 'عميل ثان' })).json(); + expect(Number(next.code.slice(-5))).toBe(Number(p.code.slice(-5)) + 1); + }); + + it('skips generated codes that were already taken manually', async () => { + const taken = (await api().post(`/api/${path}`, { nameAr: 'يدوي', code: `${prefix}-99999` })).json(); + expect(taken.code).toBe(`${prefix}-99999`); + expect((await api().post(`/api/${path}`, { nameAr: 'مكرر', code: `${prefix}-99999` })).statusCode).toBe(409); + }); + + it('validates Saudi identifiers and address formats', async () => { + const bad = [ + { nameAr: 'خطأ', vatNumber: '123456789012345' }, + { nameAr: 'خطأ', commercialRegistration: '123' }, + { nameAr: 'خطأ', nationalId: '3123456789' }, + { nameAr: 'خطأ', creditLimit: 100 }, + { nameAr: 'خطأ', addresses: [{ ...address, postalCode: '123' }] }, + { nameAr: 'خطأ', addresses: [{ ...address, buildingNumber: '12' }] }, + { nameAr: 'خطأ', addresses: [{ ...address, isDefault: true }, { ...address, isDefault: true }] }, + { nameAr: 'خ' }, + ]; + for (const body of bad) expect((await api().post(`/api/${path}`, body)).statusCode, JSON.stringify(body)).toBe(400); + expect((await api().post(`/api/${path}`, { nameAr: 'تكرار ضريبي', vatNumber: '300000000000003' })).statusCode).toBe(409); + }); + + it('searches by name, code, VAT number and phone', async () => { + await api().post(`/api/${path}`, { nameAr: 'مؤسسة البحث الفريدة', phone: '0555000111', vatNumber: '311111111111113' }); + for (const term of ['البحث الفريدة', '0555000111', '311111111111113']) { + const res = (await api().get(`/api/${path}?search=${encodeURIComponent(term)}`)).json(); + expect(res.data.map((p: { nameAr: string }) => p.nameAr), term).toEqual(['مؤسسة البحث الفريدة']); + } + }); + + it('updates, replaces addresses, and deactivates', async () => { + const p = (await api().post(`/api/${path}`, { nameAr: 'للتعديل', addresses: [address] })).json(); + const updated = (await api().patch(`/api/${path}/${p.id}`, { nameAr: 'بعد التعديل', paymentTermsDays: 60, phone: null })).json(); + expect(updated).toMatchObject({ nameAr: 'بعد التعديل', paymentTermsDays: 60, phone: null }); + + const addrs = (await api().put(`/api/${path}/${p.id}/addresses`, { + addresses: [{ ...address, city: 'جدة' }, { ...address, addressType: 'SHIPPING', city: 'الدمام' }], + })).json().addresses; + expect(addrs.map((a: { city: string; isDefault: boolean }) => [a.city, a.isDefault])).toEqual([['جدة', true], ['الدمام', true]]); + + expect((await api().patch(`/api/${path}/${p.id}`, { isActive: false })).json().isActive).toBe(false); + const active = (await api().get(`/api/${path}?search=${encodeURIComponent('بعد التعديل')}`)).json().data; + expect(active).toEqual([]); + const all = (await api().get(`/api/${path}?status=all&search=${encodeURIComponent('بعد التعديل')}`)).json().data; + expect(all).toHaveLength(1); + }); + + it('accepts only a matching control account', async () => { + const c = await chart(t.app, owner.token); + expect((await api().post(`/api/${path}`, { nameAr: 'حساب خاطئ', controlAccountId: c.byKey.get('SALES') })).statusCode).toBe(400); + const ok = await api().post(`/api/${path}`, { nameAr: 'حساب صحيح', controlAccountId: c.byKey.get(controlKey) }); + expect(ok.statusCode).toBe(201); + expect(ok.json().controlAccountId).toBe(c.byKey.get(controlKey)); + }); + + it('takes its balance from tagged journal lines and cannot be deleted afterwards', async () => { + const c = await chart(t.app, owner.token); + const p = (await api().post(`/api/${path}`, { nameAr: 'رصيد افتتاحي' })).json(); + const tag = entity === 'customer' ? { customerId: p.id } : { supplierId: p.id }; + const control = c.byKey.get(controlKey)!; + const capital = c.byKey.get('CAPITAL')!; + const lines = entity === 'customer' + ? [{ ...dr(control, '2500.00'), ...tag }, cr(capital, '2500.00')] + : [dr(capital, '2500.00'), { ...cr(control, '2500.00'), ...tag }]; + const entry = await api().post('/api/journal-entries', { entryDate: await dateInYear(t.app, owner.token), description: 'رصيد افتتاحي', post: true, lines }); + expect(entry.statusCode).toBe(201); + const tagged = entry.json().lines.filter((l: { customerId: string | null; supplierId: string | null }) => (l.customerId ?? l.supplierId) === p.id); + expect(tagged).toHaveLength(1); + + const after = (await api().get(`/api/${path}/${p.id}`)).json(); + expect(after.balance).toBe(entity === 'customer' ? '2500.00' : '-2500.00'); + expect((await api().del(`/api/${path}/${p.id}`)).json().error.code).toBe('PARTY_IN_USE'); + + const unused = (await api().post(`/api/${path}`, { nameAr: 'للحذف' })).json(); + expect((await api().del(`/api/${path}/${unused.id}`)).statusCode).toBe(204); + expect((await api().get(`/api/${path}/${unused.id}`)).statusCode).toBe(404); + }); + + it('isolates parties between tenants, including journal tagging', async () => { + const p = (await api().post(`/api/${path}`, { nameAr: 'خاص بالمنشأة' })).json(); + const other = await register(t.app); + const oApi = client(t.app, other.token); + expect((await oApi.get(`/api/${path}/${p.id}`)).statusCode).toBe(404); + expect((await oApi.patch(`/api/${path}/${p.id}`, { nameAr: 'اختراق' })).statusCode).toBe(404); + expect((await oApi.get(`/api/${path}`)).json().total).toBe(0); + const oc = await chart(t.app, other.token); + const tag = entity === 'customer' ? { customerId: p.id } : { supplierId: p.id }; + const res = await oApi.post('/api/journal-entries', { + entryDate: await dateInYear(t.app, other.token), description: 'حقن', + lines: [{ ...dr(oc.byKey.get(controlKey)!, '1.00'), ...tag }, cr(oc.byKey.get('CAPITAL')!, '1.00')], + }); + expect(res.statusCode).toBe(400); + }); +}); + +describe('party permissions', () => { + it('lets each role manage only its own parties', async () => { + const sales = await addMember(t.app, owner, 'SALES_MANAGER'); + const sApi = client(t.app, sales.token); + expect((await sApi.post('/api/customers', { nameAr: 'من المبيعات' })).statusCode).toBe(201); + expect((await sApi.post('/api/suppliers', { nameAr: 'من المبيعات' })).statusCode).toBe(403); + expect((await sApi.get('/api/suppliers')).statusCode).toBe(403); + + const purchase = await addMember(t.app, owner, 'PURCHASE_MANAGER'); + const pApi = client(t.app, purchase.token); + expect((await pApi.post('/api/suppliers', { nameAr: 'من المشتريات' })).statusCode).toBe(201); + expect((await pApi.post('/api/customers', { nameAr: 'من المشتريات' })).statusCode).toBe(403); + + const employee = await addMember(t.app, owner, 'SALES_EMPLOYEE'); + const eApi = client(t.app, employee.token); + expect((await eApi.get('/api/customers')).statusCode).toBe(200); + expect((await eApi.post('/api/customers', { nameAr: 'موظف' })).statusCode).toBe(403); + + const accountant = await addMember(t.app, owner, 'ACCOUNTANT'); + expect((await client(t.app, accountant.token).post('/api/suppliers', { nameAr: 'من المحاسب' })).statusCode).toBe(201); + }); + + it('a party cannot be tagged on both sides of one line', async () => { + const c = await chart(t.app, owner.token); + const cust = (await api().post('/api/customers', { nameAr: 'عميل الوسم' })).json(); + const supp = (await api().post('/api/suppliers', { nameAr: 'مورد الوسم' })).json(); + const res = await api().post('/api/journal-entries', { + entryDate: await dateInYear(t.app, owner.token), description: 'خطأ', + lines: [{ ...dr(c.byKey.get('CASH')!, '1.00'), customerId: cust.id, supplierId: supp.id }, cr(c.byKey.get('CAPITAL')!, '1.00')], + }); + expect(res.statusCode).toBe(400); + }); + + it('records audit entries for party changes', async () => { + const actions = (await api().get('/api/audit-logs?entityType=customer&limit=200')).json().data.map((l: { action: string }) => l.action); + expect(actions).toEqual(expect.arrayContaining(['CREATE', 'UPDATE', 'DELETE'])); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/products.test.ts b/alshuyukh-accounting/apps/api/test/products.test.ts new file mode 100644 index 000000000000..fcf3f9947b4a --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/products.test.ts @@ -0,0 +1,110 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { addMember, chart, client, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); +}); +afterAll(async () => { await t.close(); }); + +const api = () => client(t.app, owner.token); +const unitId = async (code: string) => (await api().get('/api/units')).json().data.find((u: { code: string }) => u.code === code).id as string; + +describe('units and categories', () => { + it('seeds UN/ECE units for every company', async () => { + const codes = (await api().get('/api/units')).json().data.map((u: { code: string }) => u.code); + expect(codes).toEqual(expect.arrayContaining(['PCE', 'BX', 'KGM', 'LTR', 'HUR'])); + }); + + it('adds units and nested categories', async () => { + expect((await api().post('/api/units', { code: 'pk', nameAr: 'باكيت' })).json().code).toBe('PK'); + expect((await api().post('/api/units', { code: 'PK', nameAr: 'مكرر' })).statusCode).toBe(409); + const parent = (await api().post('/api/product-categories', { nameAr: 'مواد غذائية' })).json(); + const child = await api().post('/api/product-categories', { nameAr: 'ألبان', parentId: parent.id }); + expect(child.json().parentId).toBe(parent.id); + expect((await api().post('/api/product-categories', { nameAr: 'ألبان', parentId: parent.id })).statusCode).toBe(409); + }); +}); + +describe('products', () => { + it('creates goods with an automatic SKU and exact prices', async () => { + const res = await api().post('/api/products', { + nameAr: 'حليب طازج 1 لتر', barcode: '6281007000017', unitId: await unitId('LTR'), + salePrice: '6.5000', purchasePrice: '4.1250', salePriceIncludesVat: true, + }); + expect(res.statusCode).toBe(201); + expect(res.json()).toMatchObject({ + productType: 'GOODS', trackInventory: true, vatCategory: 'S', unitCode: 'LTR', + salePrice: '6.5000', purchasePrice: '4.1250', salePriceIncludesVat: true, + }); + expect(res.json().sku).toMatch(/^PRD-\d{5}$/); + }); + + it('creates services without stock and defaults to hours', async () => { + const res = await api().post('/api/products', { nameAr: 'خدمة صيانة', productType: 'SERVICE', salePrice: '250' }); + expect(res.json()).toMatchObject({ productType: 'SERVICE', trackInventory: false, unitCode: 'HUR' }); + expect((await api().post('/api/products', { nameAr: 'خدمة خاطئة', productType: 'SERVICE', trackInventory: true })).statusCode).toBe(400); + const goods = (await api().post('/api/products', { nameAr: 'سلعة تتحول' })).json(); + const changed = (await api().patch(`/api/products/${goods.id}`, { productType: 'SERVICE' })).json(); + expect(changed).toMatchObject({ productType: 'SERVICE', trackInventory: false }); + }); + + it('validates prices, codes and uniqueness', async () => { + const bad = [ + { nameAr: 'سعر رقمي', salePrice: 10 }, + { nameAr: 'خمس خانات', salePrice: '1.12345' }, + { nameAr: 'سالب', salePrice: '-1' }, + { nameAr: 'رمز خاطئ', sku: 'a b' }, + { nameAr: 'فئة ضريبية', vatCategory: 'X' }, + ]; + for (const body of bad) expect((await api().post('/api/products', body)).statusCode, JSON.stringify(body)).toBe(400); + await api().post('/api/products', { nameAr: 'منتج أ', sku: 'SKU-1', barcode: '1111222233334' }); + expect((await api().post('/api/products', { nameAr: 'منتج ب', sku: 'SKU-1' })).statusCode).toBe(409); + expect((await api().post('/api/products', { nameAr: 'منتج ج', barcode: '1111222233334' })).statusCode).toBe(409); + }); + + it('accepts account overrides of the right type only', async () => { + const c = await chart(t.app, owner.token); + expect((await api().post('/api/products', { nameAr: 'حساب خاطئ', salesAccountId: c.byKey.get('CASH') })).statusCode).toBe(400); + expect((await api().post('/api/products', { nameAr: 'حساب تجميعي', salesAccountId: c.byCode.get('4000') })).statusCode).toBe(400); + const ok = await api().post('/api/products', { nameAr: 'حساب صحيح', salesAccountId: c.byKey.get('SALES'), purchaseAccountId: c.byKey.get('INVENTORY') }); + expect(ok.statusCode).toBe(201); + }); + + it('searches by name, SKU and exact barcode, and filters by category', async () => { + const cat = (await api().post('/api/product-categories', { nameAr: 'منظفات' })).json(); + await api().post('/api/products', { nameAr: 'منظف أرضيات', sku: 'CLN-1', barcode: '9990001112223', categoryId: cat.id }); + for (const term of ['أرضيات', 'CLN-1', '9990001112223']) { + expect((await api().get(`/api/products?search=${encodeURIComponent(term)}`)).json().data.map((p: { sku: string }) => p.sku), term).toEqual(['CLN-1']); + } + expect((await api().get(`/api/products?categoryId=${cat.id}`)).json().total).toBe(1); + }); + + it('soft-deletes and frees the SKU', async () => { + const p = (await api().post('/api/products', { nameAr: 'مؤقت', sku: 'TMP-1' })).json(); + expect((await api().del(`/api/products/${p.id}`)).statusCode).toBe(204); + expect((await api().get(`/api/products/${p.id}`)).statusCode).toBe(404); + expect((await api().post('/api/products', { nameAr: 'بديل', sku: 'TMP-1' })).statusCode).toBe(201); + }); + + it('refuses units and categories from another company or tenant', async () => { + const other = await register(t.app); + const foreignUnit = (await client(t.app, other.token).get('/api/units')).json().data[0].id; + expect((await api().post('/api/products', { nameAr: 'وحدة أجنبية', unitId: foreignUnit })).json().error.code).toBe('INVALID_UNIT'); + const p = (await api().post('/api/products', { nameAr: 'سري' })).json(); + expect((await client(t.app, other.token).get(`/api/products/${p.id}`)).statusCode).toBe(404); + expect((await client(t.app, other.token).get('/api/products')).json().total).toBe(0); + }); + + it('applies product permissions per role', async () => { + const wh = await addMember(t.app, owner, 'WAREHOUSE_MANAGER'); + expect((await client(t.app, wh.token).post('/api/products', { nameAr: 'من المستودع' })).statusCode).toBe(201); + const sales = await addMember(t.app, owner, 'SALES_EMPLOYEE'); + expect((await client(t.app, sales.token).get('/api/products')).statusCode).toBe(200); + expect((await client(t.app, sales.token).post('/api/products', { nameAr: 'من المبيعات' })).statusCode).toBe(403); + expect((await client(t.app, sales.token).post('/api/units', { code: 'X', nameAr: 'س' })).statusCode).toBe(403); + }); +}); diff --git a/alshuyukh-accounting/apps/web/src/App.tsx b/alshuyukh-accounting/apps/web/src/App.tsx index 9a1d72baac6d..9e269328a6fd 100644 --- a/alshuyukh-accounting/apps/web/src/App.tsx +++ b/alshuyukh-accounting/apps/web/src/App.tsx @@ -9,6 +9,8 @@ import JournalForm from './pages/accounting/JournalForm'; import JournalList from './pages/accounting/JournalList'; import TrialBalance from './pages/accounting/TrialBalance'; import AuditLog from './pages/AuditLog'; +import Parties, { CUSTOMERS, SUPPLIERS } from './pages/parties/Parties'; +import Products from './pages/products/Products'; import Companies from './pages/Companies'; import ComingSoon from './pages/ComingSoon'; import Home from './pages/Home'; @@ -37,9 +39,9 @@ export default function App() { } /> } /> } /> - } /> - } /> - } /> + } /> + } /> + } /> } /> }> } /> diff --git a/alshuyukh-accounting/apps/web/src/Shell.tsx b/alshuyukh-accounting/apps/web/src/Shell.tsx index 88cade53e24f..01d29aa3a279 100644 --- a/alshuyukh-accounting/apps/web/src/Shell.tsx +++ b/alshuyukh-accounting/apps/web/src/Shell.tsx @@ -6,9 +6,9 @@ const NAV: { to: string; label: string; icon: string; phase?: number }[] = [ { to: '/', label: 'الرئيسية', icon: '⌂' }, { to: '/sales', label: 'المبيعات', icon: '↗', phase: 4 }, { to: '/purchases', label: 'المشتريات', icon: '↙', phase: 4 }, - { to: '/inventory', label: 'المخزون', icon: '▦', phase: 5 }, - { to: '/customers', label: 'العملاء', icon: '☺', phase: 3 }, - { to: '/suppliers', label: 'الموردون', icon: '⚑', phase: 3 }, + { to: '/inventory', label: 'المخزون', icon: '▦' }, + { to: '/customers', label: 'العملاء', icon: '☺' }, + { to: '/suppliers', label: 'الموردون', icon: '⚑' }, { to: '/expenses', label: 'المصروفات', icon: '−', phase: 6 }, { to: '/accounting', label: 'المحاسبة', icon: '⚖' }, { to: '/reports', label: 'التقارير', icon: '▤', phase: 7 }, diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx index f7fbd4d98a2d..df2e37841470 100644 --- a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalDetail.tsx @@ -10,7 +10,7 @@ export interface Entry { id: string; entryNumber: string | null; entryDate: string; description: string; referenceType: string; referenceId: string | null; source: string; status: string; currency: string; totalDebit: string; totalCredit: string; reversalOfId: string | null; reversedByEntryId: string | null; correctionOfId: string | null; postedAt: string | null; createdAt: string; - lines: { id: string; lineNo: number; accountId: string; accountCode: string; accountName: string; debit: string; credit: string; description: string | null }[]; + lines: { id: string; lineNo: number; accountId: string; accountCode: string; accountName: string; debit: string; credit: string; description: string | null; customerId: string | null; supplierId: string | null }[]; } export default function JournalDetail() { diff --git a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx index 3a9127943343..059a0b7280fe 100644 --- a/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx +++ b/alshuyukh-accounting/apps/web/src/pages/accounting/JournalForm.tsx @@ -7,17 +7,27 @@ import { ErrorBox, useLoad } from '../../ui'; import type { Account } from './ChartOfAccounts'; import type { Entry } from './JournalDetail'; -interface Line { accountId: string; debit: string; credit: string; description: string } +interface Line { accountId: string; debit: string; credit: string; description: string; partyId: string } -const emptyLine = (): Line => ({ accountId: '', debit: '', credit: '', description: '' }); +const emptyLine = (): Line => ({ accountId: '', debit: '', credit: '', description: '', partyId: '' }); + +interface PartyOption { id: string; code: string; nameAr: string } export default function JournalForm({ entry, onSaved }: { entry?: Entry; onSaved?: () => void }) { const { can } = useAuth(); const navigate = useNavigate(); const accounts = useLoad(() => api<{ data: Account[] }>('GET', '/api/accounts?postableOnly=true')); + // Receivable / payable lines can be tagged with a customer or supplier (sub-ledger). + const customers = useLoad(() => (can('customer.view') ? api<{ data: PartyOption[] }>('GET', '/api/customers?limit=200') : Promise.resolve({ data: [] }))); + const suppliers = useLoad(() => (can('supplier.view') ? api<{ data: PartyOption[] }>('GET', '/api/suppliers?limit=200') : Promise.resolve({ data: [] }))); + const partyKind = (accountId: string) => { + const key = accounts.data?.data.find((a) => a.id === accountId)?.systemKey; + return key === 'ACCOUNTS_RECEIVABLE' ? 'customer' : key === 'ACCOUNTS_PAYABLE' ? 'supplier' : null; + }; const [lines, setLines] = useState(() => entry ? entry.lines.map((l) => ({ accountId: l.accountId, debit: l.debit === '0.00' ? '' : l.debit, credit: l.credit === '0.00' ? '' : l.credit, description: l.description ?? '', + partyId: l.customerId ?? l.supplierId ?? '', })) : [emptyLine(), emptyLine()]); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); @@ -38,6 +48,8 @@ export default function JournalForm({ entry, onSaved }: { entry?: Entry; onSaved ...(l.debit.trim() ? { debit: l.debit.trim() } : {}), ...(l.credit.trim() ? { credit: l.credit.trim() } : {}), description: l.description || null, + ...(l.partyId && partyKind(l.accountId) === 'customer' ? { customerId: l.partyId } : {}), + ...(l.partyId && partyKind(l.accountId) === 'supplier' ? { supplierId: l.partyId } : {}), })), }; setBusy(true); @@ -76,10 +88,18 @@ export default function JournalForm({ entry, onSaved }: { entry?: Entry; onSaved {lines.map((l, i) => ( - update(i, { accountId: e.target.value, partyId: '' })} aria-label={`حساب السطر ${i + 1}`}> {accounts.data?.data.map((a) => )} + {partyKind(l.accountId) && ( + + )} update(i, { debit: e.target.value, credit: e.target.value ? '' : l.credit })} /> diff --git a/alshuyukh-accounting/apps/web/src/pages/parties/Parties.tsx b/alshuyukh-accounting/apps/web/src/pages/parties/Parties.tsx new file mode 100644 index 000000000000..fe3dc8e5bd55 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/parties/Parties.tsx @@ -0,0 +1,180 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount } from '../../money'; +import { ErrorBox, PageHeader, useLoad } from '../../ui'; + +interface Address { + addressType: 'BILLING' | 'SHIPPING'; isDefault?: boolean; buildingNumber: string | null; street: string | null; + district: string | null; city: string | null; postalCode: string | null; additionalNumber: string | null; country?: string; +} +export interface Party { + id: string; code: string; partyType: string; nameAr: string; nameEn: string | null; vatNumber: string | null; + commercialRegistration: string | null; nationalId: string | null; email: string | null; phone: string | null; + creditLimit: string | null; paymentTermsDays: number; notes: string | null; isActive: boolean; balance: string; + addresses?: Address[]; +} + +export interface PartyConfig { + path: 'customers' | 'suppliers'; + title: string; + singular: string; + view: string; + manage: string; + /** Customers owe us (debit balance); suppliers are owed (credit balance). */ + balanceLabel: (balance: string) => string; +} + +export const CUSTOMERS: PartyConfig = { + path: 'customers', title: 'العملاء', singular: 'عميل', view: 'customer.view', manage: 'customer.manage', + balanceLabel: (b) => (b.startsWith('-') ? `دائن ${formatAmount(b.slice(1))}` : formatAmount(b)), +}; +export const SUPPLIERS: PartyConfig = { + path: 'suppliers', title: 'الموردون', singular: 'مورد', view: 'supplier.view', manage: 'supplier.manage', + balanceLabel: (b) => (b.startsWith('-') ? formatAmount(b.slice(1)) : b === '0.00' ? '0.00' : `مدين ${formatAmount(b)}`), +}; + +const PAGE = 50; +const blank = (v: FormDataEntryValue | null) => (v === null || String(v).trim() === '' ? null : String(v).trim()); + +export default function Parties({ config }: { config: PartyConfig }) { + const { can } = useAuth(); + const [search, setSearch] = useState(''); + const [status, setStatus] = useState('active'); + const [offset, setOffset] = useState(0); + const [editing, setEditing] = useState(null); + const [error, setError] = useState(null); + const list = useLoad(() => { + const q = new URLSearchParams({ limit: String(PAGE), offset: String(offset), status }); + if (search) q.set('search', search); + return api<{ data: Party[]; total: number }>('GET', `/api/${config.path}?${q}`); + }, [config.path, search, status, offset]); + const manage = can(config.manage); + + async function open(p: Party) { + setError(null); + try { setEditing(await api('GET', `/api/${config.path}/${p.id}`)); } catch (e) { setError(e); } + } + + async function save(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + const body = { + nameAr: String(f.get('nameAr')), nameEn: blank(f.get('nameEn')), partyType: String(f.get('partyType')), + vatNumber: blank(f.get('vatNumber')), commercialRegistration: blank(f.get('commercialRegistration')), + nationalId: blank(f.get('nationalId')), email: blank(f.get('email')), phone: blank(f.get('phone')), + creditLimit: blank(f.get('creditLimit')), paymentTermsDays: Number(f.get('paymentTermsDays') || 0), notes: blank(f.get('notes')), + }; + const addr: Address = { + addressType: 'BILLING', buildingNumber: blank(f.get('buildingNumber')), street: blank(f.get('street')), + district: blank(f.get('district')), city: blank(f.get('city')), postalCode: blank(f.get('postalCode')), + additionalNumber: blank(f.get('additionalNumber')), + }; + const hasAddress = Object.entries(addr).some(([k, v]) => k !== 'addressType' && v); + setError(null); + try { + if (editing === 'new') { + await api('POST', `/api/${config.path}`, { ...body, code: blank(f.get('code')) ?? undefined, addresses: hasAddress ? [addr] : [] }); + } else if (editing) { + await api('PATCH', `/api/${config.path}/${editing.id}`, body); + const others = (editing.addresses ?? []).filter((a) => a.addressType !== 'BILLING' || !a.isDefault); + await api('PUT', `/api/${config.path}/${editing.id}/addresses`, { addresses: [...(hasAddress ? [addr] : []), ...others] }); + } + setEditing(null); + list.reload(); + } catch (err) { setError(err); } + } + + async function toggle(p: Party) { + setError(null); + try { await api('PATCH', `/api/${config.path}/${p.id}`, { isActive: !p.isActive }); list.reload(); } catch (e) { setError(e); } + } + + const current = editing && editing !== 'new' ? editing : null; + const billing = current?.addresses?.find((a) => a.addressType === 'BILLING' && a.isDefault); + + return ( + <> + + {manage && } + + + + {editing && ( +

+

{current ? `تعديل: ${current.nameAr}` : `${config.singular} جديد`}

+
+
+ + + + {!current && } + + + + + + + +
+

العنوان الوطني

+
+ + + + + + +
+ +
+ {manage && } + +
+
+
+ )} + +
+
+ { if (e.key === 'Enter') { setSearch(e.currentTarget.value); setOffset(0); } }} /> + +
+
+ + + + {list.data?.data.map((p) => ( + + + + + + + + + ))} + {!list.data && !list.error && } + {list.data?.data.length === 0 && } + +
الرمزالاسمالرقم الضريبيالجوالالرصيد
{p.code}{!p.isActive && غير نشط}{p.vatNumber ?? '—'}{p.phone ?? '—'}{config.balanceLabel(p.balance)}{manage && }
جارٍ التحميل…
لا توجد نتائج
+
+ {list.data && list.data.total > PAGE && ( +
+ {offset + 1}–{Math.min(offset + PAGE, list.data.total)} من {list.data.total} + + +
+ )} +

الرصيد محسوب من القيود المرحّلة المرتبطة بال{config.singular}.

+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx b/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx new file mode 100644 index 000000000000..158b81be7995 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx @@ -0,0 +1,186 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { ErrorBox, PageHeader, useLoad } from '../../ui'; + +interface Product { + id: string; sku: string; barcode: string | null; nameAr: string; nameEn: string | null; productType: string; + categoryId: string | null; categoryName: string | null; unitId: string; unitName: string; salePrice: string; + salePriceIncludesVat: boolean; purchasePrice: string; vatCategory: string; trackInventory: boolean; isActive: boolean; +} +interface Unit { id: string; code: string; nameAr: string; isActive: boolean } +interface Category { id: string; parentId: string | null; nameAr: string; isActive: boolean } + +const VAT_AR: Record = { S: 'خاضع للنسبة الأساسية', Z: 'نسبة صفرية', E: 'معفى', O: 'خارج النطاق' }; +const blank = (v: FormDataEntryValue | null) => (v === null || String(v).trim() === '' ? null : String(v).trim()); +/** Shows a 4-decimal unit price without trailing zeros beyond 2 places. */ +const price = (v: string) => v.replace(/(\.\d\d)00$/, '$1').replace(/(\.\d\d\d)0$/, '$1'); + +export default function Products() { + const { can } = useAuth(); + const [tab, setTab] = useState<'products' | 'setup'>('products'); + return ( + <> + + + {tab === 'products' ? : } +

حركات المخزون والأرصدة والتكلفة تُضاف في المرحلة 5.

+ + ); +} + +function ProductList() { + const { can } = useAuth(); + const [search, setSearch] = useState(''); + const [editing, setEditing] = useState(null); + const [error, setError] = useState(null); + const products = useLoad(() => api<{ data: Product[]; total: number }>('GET', `/api/products?limit=200${search ? `&search=${encodeURIComponent(search)}` : ''}`), [search]); + const units = useLoad(() => api<{ data: Unit[] }>('GET', '/api/units')); + const categories = useLoad(() => api<{ data: Category[] }>('GET', '/api/product-categories')); + const manage = can('product.manage'); + + async function save(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + const type = String(f.get('productType')); + const body = { + nameAr: String(f.get('nameAr')), nameEn: blank(f.get('nameEn')), barcode: blank(f.get('barcode')), + productType: type, unitId: String(f.get('unitId')), categoryId: blank(f.get('categoryId')), + salePrice: String(f.get('salePrice') || '0'), purchasePrice: String(f.get('purchasePrice') || '0'), + salePriceIncludesVat: f.get('salePriceIncludesVat') === 'on', vatCategory: String(f.get('vatCategory')), + trackInventory: type === 'GOODS' && f.get('trackInventory') === 'on', + }; + setError(null); + try { + if (editing === 'new') await api('POST', '/api/products', { ...body, sku: blank(f.get('sku')) ?? undefined }); + else if (editing) await api('PATCH', `/api/products/${editing.id}`, body); + setEditing(null); + products.reload(); + } catch (err) { setError(err); } + } + + const current = editing && editing !== 'new' ? editing : null; + return ( + <> + + {editing && ( +
+

{current ? `تعديل: ${current.nameAr}` : 'منتج أو خدمة جديدة'}

+
+ + + + {!current && } + + + + + + +
+ + +
+ + +
+
+ )} +
+
+ { if (e.key === 'Enter') setSearch(e.currentTarget.value); }} /> + {manage && } +
+
+ + + + {products.data?.data.map((p) => ( + + + + + + + + + + ))} + {!products.data && !products.error && } + {products.data?.data.length === 0 && } + +
الرمزالاسمالنوعالتصنيفالوحدةسعر البيعسعر الشراء
{p.sku}{manage ? : p.nameAr}{p.productType === 'GOODS' ? 'سلعة' : 'خدمة'}{p.categoryName ?? '—'}{p.unitName}{price(p.salePrice)}{p.salePriceIncludesVat && شامل}{price(p.purchasePrice)}
جارٍ التحميل…
لا توجد منتجات
+
+
+ + ); +} + +function Setup() { + const units = useLoad(() => api<{ data: Unit[] }>('GET', '/api/units')); + const categories = useLoad(() => api<{ data: Category[] }>('GET', '/api/product-categories')); + const [error, setError] = useState(null); + + async function submit(e: FormEvent, fn: (f: FormData) => Promise, reload: () => void) { + e.preventDefault(); + const form = e.currentTarget; + setError(null); + try { await fn(new FormData(form)); form.reset(); reload(); } catch (err) { setError(err); } + } + + return ( + <> + +
+
+

وحدات القياس

+ + {units.data?.data.map((u) => )} +
{u.code}{u.nameAr}
+
submit(e, (f) => api('POST', '/api/units', { code: f.get('code'), nameAr: f.get('nameAr') }), units.reload)}> + + + +
+
+
+

التصنيفات

+ + {categories.data?.data.map((c) => ( + + ))} +
{c.parentId ? `${categories.data!.data.find((p) => p.id === c.parentId)?.nameAr ?? ''} ← ` : ''}{c.nameAr}
+
submit(e, (f) => api('POST', '/api/product-categories', { nameAr: f.get('nameAr'), parentId: f.get('parentId') || null }), categories.reload)}> + + + +
+
+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/styles.css b/alshuyukh-accounting/apps/web/src/styles.css index d08f35c4ff03..5cb5d72e17cd 100644 --- a/alshuyukh-accounting/apps/web/src/styles.css +++ b/alshuyukh-accounting/apps/web/src/styles.css @@ -207,3 +207,14 @@ input[aria-invalid="true"] { border-color: var(--danger); } .reverse-box p { margin-top: 0; } .tb-table th { text-align: center; } .tb-table th:nth-child(1), .tb-table th:nth-child(2) { text-align: start; } + +/* Parties & products ------------------------------------------------------------ */ +.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 16px; } +h3 { font-size: 0.95rem; margin: 6px 0 10px; color: var(--muted); } +.grow { flex: 1 1 240px; } +.link-btn { all: unset; cursor: pointer; color: var(--primary); } +.link-btn:hover { text-decoration: underline; } +button.tab { font: inherit; background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer; } +@media (max-width: 900px) { .grid-3 { grid-template-columns: 1fr 1fr; } } +@media (max-width: 600px) { .grid-3 { grid-template-columns: 1fr; } } +.party-select { margin-top: 4px; } diff --git a/alshuyukh-accounting/docs/screenshots/p3-01-customer-form.png b/alshuyukh-accounting/docs/screenshots/p3-01-customer-form.png new file mode 100644 index 0000000000000000000000000000000000000000..5e232d09d7a6e37b3699e735f8c4c7cd2cffe4ea GIT binary patch literal 94942 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
gGxr}c)=tP;PoIul1QoG;baI{v! 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 B8595j literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p3-02-products.png b/alshuyukh-accounting/docs/screenshots/p3-02-products.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d293cd9952d7386edb49dc1de739e78c817831 GIT binary patch literal 57502 zcmce7WmuG3*e;5Kf`E#EN^QD9xBt?~wke)v_k$=2+`uMPSMpr>X zdW|F{Dx~6)v=2koR^D1fJw_eUr!XKl$h3O){M|bh0yEfIgP9^=M%AKP4XSmk*4%7i zOITbuU7%WC66DjMSo8%4=bg&uH%2sWKO&y>aw#rFA;~WY33)DIRrmF2e)w_5i`a6- zTzj~`efIcLBqRuDN+aGAmnG&Gf4(ApX8nfr>Th%C>C;btTWshr+Wxji>Hk4O{?q(i z`9IW=;YAxX8egEjvbf#@>Xhn_H{mQp)QbLR5~KQGo}m0`eKUE2qd&?hHa{KsfGzC! z?(gc-6ors%x}`HrJw7?~slFVetQq?G93S@_x9sKLMPz=b936^pTPv&4yHdADi+OhDK*}X2%2>p9i7NW+4MzZa^KpMMGRVn@3eTgW^To zP#D+EvI71uTXNHEKbTMP&6!l z$QRk7h7f{@ffbOt&f8}FUt6t9Dh?j4FQHs52LsQX`Zk{XP(Gwc2y%ygZmTV?v4l2T zdI@?RU8?c@7MVve+G`053v2$88xtrWJYxkc!W?YiBV=8?cl&iamrb52y7l03+Wq=l zB4Hp;bV}UoU&e1T1fnvcC3lF;G1bW_JH=VU`8ZcZMO`N6CcpkFx8LS+UyWy+u0E;e zqGUT)iH$$v(Vw)lZJ$uC3tIO{v&{h^(dMn$Sq@D`ZWHGWEv4kvGYqws-R|jg2wHhl5;^iR3OIY%5B&-n94+-RB^;U= zq@-1&eqkWkd>x|<_>SY0%h_U%LGXK7X_}VlB79b$b4}4gU>*1hI`=bpXMJe5?ftXD zxiOsCGZqfik$G1kX#xpG?yIZro6I{X&t#4sC@u8mOqSko*+!!is#_k_mY83+S!4#e z;Dd#n(O|>Rq+EgfjNZl+l7eIhb_MN7kjO*{WL*a{yq>_7R*bb%&3wL^uiV7JzIy|h zZ^GG2cQ0KAtcT=`jQ7elGFhroG`y~$RcU5oTq5LZN)M;;*y}D)g%aaW$S5Yc!{bKw z#!JEMNewoA7xavMbxAp}H|@Wdg9O2sNS~gt#kjCISOP|qB;U@PNy4rJ4P(RNow)S@ zy?2+|uBTyX;T+H+uCg2^gmEl`!0Aoe&3NfAj%PegcwIt$8}&Yv1$3#GYhk`aXPyNz z*7lw1KHnAAM{6~5!nDmBB$c~1W^bxC3db4su=$fF#)ku`ej%utg2~v@AwBY5QkVXD(dNrbRF*K$G*R0;#>}dIbM+J7U zcS>Xm^OZ9XMtd}iY^Xtlf&w2ehS({}KVmys8N|)tV=G70?_{Q9+lNq z9N3f-u(xRV&CSE>;0J$>7yGP|hm0mfH|}j98yzFvmLJbO#OVV!%B4aVp>XiMkVKyt^pgoPKxry)$c)4hYZAbpc@{ z)%~+S86miZiIvoNyktFjpTg>R`c_PVakyp|4*Sk5+4@H|N)K8>%{#L7Am9zP?sbeb zEW5Lg%`>(RJ)A9*7;3(~ozwmrEN%QZb+JDq2har|*KU;jeWzH5 z1ryg#7#nt~oW6aATto57WiwNIr1W7y@E?(af9SodlcP3+L~QNauMSIruOw z0{!b~%vl1EkO!qMUoeg$cNzgC&(5)ARFoY5ipiL8dGno>G~;!)4nH9rn(>lYZX!$X z*X74E`&-C)qO+aWl6SBO-m8x+bi$$^Q%c&VprwX*f(lf{x~1&mS=mm+dr!YPL9m@fdRSr23i2{A8gGhQCmS5+iZe86ws@DQV#)_3l=> zag-_R>D=RP)xq~IVVncAk2BX;W_Ikt%6jRWz2Ji_z_U(hh1UW&nW}+A#Nxk)UaV0p zbt-7M3r7?4IIC=bm2vharK(gpqspULQyEzzPECfIEcjJpm9$vmd~z-((-9%sp{e!E zCz^cR!qL}1_*-U|+i)HH8|mnmln|;7gU4emZzt*a$tjLULcML365hGESE~)6TAhZB z22PM7Q=W>nZqh$E>f#j_C0cU2_XRyX6*$@Jb#pUpFRNEeO2Vn+BW);o3AjxO5kemF z!>nvarfd%6{LrhqEVz{X z#>iTvBlL`*JXQEw3zcDY-AB;+MQcP-j2iD3ir@i*vpNEy+Z}xMrk$7n$W%ku-L+eG1kt^5tqk!As_$%th6#Xfo&adV|hHu=dT1C0-ZnS;_n+a;AF| zHSp<1>UU>P5m|qRrDl`psbEw9_<7{s?Nzs<+w;rn8IKiloP?FeVY)j%j9i}*VW0t` zoo(-lH-8b3f+pQ^y7GDRf*?rR1lS+Jv@(Ovgr6+xuJ)1v>e4c&+o?r# zs` z-Z?|ctwYidBz)cHZ4ivyF;Ux8qv3%)W?%+04;+QNgy(K}5Wf^EN1K7?l;~R5Ycc5! zJ8QJJJTjq^in^3X{si^B&aDg{p-=u~Z5jrR$AGqcLG3~%r-5!Up~YN#U9fL0Ll_)6 zuZaPpCu0HB0+nW?TQtOo4;eS&IdoAeIs}swZWlv*bzICzEnTbV&#j7c^x%nK-g)T{ z@OZ-zSJLtZ1r1C-MN_6o_0V##< zAx{zBI1>`mXY91zJ43Bw&hl^~W*J9^oknfY)tEA`*9%3xfPfjpZ?(%~BIskjI;do< z*}zxm1XJZHY7+}#!6Q0)+O>iI24F=1m7*_srTBThyj))UWO)3frP8BoiDjA6V%_b; zn@3HbiAByDhvRuYUEI|1Ej_LCE6Ks_67B3FKl8d$1cCqX9DIYb#D?>;x6bG0^ak8{ zbfgpfLMz)9BeuyV)IoH3D-FGBULbbeJzs3?eqwNvU`+h{NY2YBD2u#MLuhhEFH({? zIpxdS#JAxq9tSw;R}WR*n3oV(nWtTvx^t5RG5?`%bC@S=KW0(n?l}c;#T5Pi{5eHQ zha1rSYvyWUq9EMtA_n!zn$`McKs3w%)Vwa8;T6x})wt($L45Dt1(F%?8=8)@yWCOp0lUj0q0@5{`)ed3hc13e8toemhm-kT#mB zQqkT)cF`0}cDDv)Weg>C1Z7Cof9=+RmxB2yxabWAc>4ojd z#%~n%k@IA#xz%#qHtyz@$vC?u=?Bv@(YW~bB6TiIpPIL(}TeHJ=R8*U0DSE%d<{>F$ozu5u z+tjBS!k7gUOs$B+O8>YU3*0_Fuj2yA%HaV{HdG((K47+1q$8`IQYC&aqaHW5r%+{L z&_X9ZMNp4!?ZP{FcB~Qkx>+nkJs2)5d*1$jNWhUB!YLbpja?$unq)BGe1LiRMd3TS z%Of2Bn+q5SeifSUx|)GbQYbvdsnf!1=ORLU!A?W*A#UQ+C0!Gb?#vORL=jqr)%BZ1 zJ(P~GUypYk5f*1o^BpZ~LS;dvL?MxNgGszO2NP6p>KPX?*GK)t(EE@|L_MTtAyMI2 zd9By)#<9-?Qz;TYbq@ce9SRl1CjzsT|5#%tGwP!XVjzBA`mmi@bd-atL1TM#8}op+ zXGZ4IKEtXLh6!%~iqE1@9r|!nbR}fGHQ!axW6JDqs14yg9$+_qsmbo_+Vx(+k#L8V zgD1V1h2g;cTK9tUDE~+R@_Kk6phUP9YEY}2W4t_vCE$U-&QHB;6x)$(T2081k8 z&_qo-Yy4~Aca2Klr(y7t)6-w=_m`kcwxY*yE}Of$+0i`bNqgn(RtbF5Z1qfIfdu$5notwx$VS5 zJeM1n-^&kePoE!<1o9=14^CFh4@oe*-)$|dyoc?XPFM^qQ%JNPx~Mn?cYURc!Bcyt z=TbH_YfOBOc2*t%lg`6{Yd=9`7tF9{044)?Wxa>Gbt!q%WF7#f?}`ev#smvH3>G&18uItc{Ar?gm!EF8jR=;n_}gyryJaF^RS)6K zC*L0igq?~%47S>HoPPhcwqz;H@yxZiG`TfxyTPmjBIYrBg6j0p0@{n<8!pp~;%ypW zVxsKhxjguFFQvuzXc-=?SAv$_PA&=5T&l=tfB#?t0Wh>pOkG3A;8ZCUC*^_(&GI>dZ=r~yrmH^du-iFh>9(``9f!>e}$T?lWJ~oBD*Z)N{(fZLU-}Q;~ z1o01Sb2V+XVT=f+(Hyd7F{QYnIW?VDz^5E*R$BzUoK7on$R&}|k;4v}eb zELSVE5eB=p@;3Iq^!ABqI=Bm;gNb5vv6FGR1t^n==a!XsZU*`tK99 zWF0y!Eh_&8p>1>-*jo!fv+7H$UPVy(BRs{Gg&dCUCX@DNs)@?DtlCz$7_I1ppJ z2O^BEgTZ9)%NPvW9ErB-G4#%^j@d`_`o2pX(Z9m4_}Ns&ey(^pp}d1Osx_2u_?S~9 zmYW3n*W7U#Ax?>gnuc!)#;XPbYY6>^6Zsp+{NL#;e)2G%EDRs-H0QKhC0D>C%yqV2 zBEACVPqFFWrxtb>NSrFFNXi7CRYbmBeFzJI^R77AcT9fqCG7DO%+}-Ol>yMTM3@9= zlizVPGA#gOOQJhJ%TfwUIH4ILCL$@ zt(@{y6k;L36qT$wo{8z|t6U;nE9rM0526~(VpY2^6#bgfftXr$p1XoPnebe{Ty;qY zhsqL({cH1~z@*Ei9~k8`6p^b7cjtv;=_I_ur7;!I5OhtJ&yC3sJC!!Ul$%ViH2GFP z52^DHl;5tyWQbmsQq`BatbUJV?w|lL0+(L1^tD_z{>}{iP~Cq{5`4c{c|@t%pE86h zC+;yflVJdmP#%xI?tGflTw445F<<#@CeGPzzEf^Gs@c#<+QheLr;xivDPT3c2w`xt zh`#G%G7xSWdbQbNN6`-TnA!KV%gdx_z$8Ro(7-F9k&!P(>;&v(C_-fPsmaaN$wWj* zafHzEuJkv^b9Gxk5`x(H*wiMLArlu-5hV>HV2dMSUup*K73sm7V`NkXvj&mM=5F@| zqMa+v?Pd5)0e2?vv|BS_W{>BZc=x-YI+ebRA0Euxf^p|eB^~KMN-=k!^)3B9UDAE{U$Xv32uCdMeuyjC%C!a{IS$14VLTFuwW^dE)>#>LD zpEOcbl+aZ*(8&(nysR+@{v}AveL{WjYBc9^0k^riZX-z%E}rR~Q$xo6@k%3&dRVeA zqRe_hn|SHjjK?aL8o^~o8N2U@^yQ(;+&7T-7>!B`b`{!Te=%d_f6SbVx8wu&Gw9Ir^@ ze096`h{f5LcSd?3Zal4AM^N`v?(RnymFP{nql7PG4G@pofknnr%LG4l_vRM+%#p{l z_Qbzo4`0yT!eQ^~)BWat>a^S84Hb`@Jv0Pb=Hw1oUxJrgp}N=ZdEEo}S)}4@X(rFD zO&$5g!-$Jpeuk^=mK>9pE5Qv*P3Ej**RzUJutX!8|P!|bsVs^Yo#&%&Qwk%`R+vLaN4(5CR&r@XdI5gJjkz~^dVHiV79 zqmRp`2&e8Y>qreJpKjE=iBjs_iF|-BV(v~)funqvry|N2Sl2t<(W7~0&RKD0-XoY4 zTe_|ZzBUu4TWJJVZ7oz(74FzttbbfyieQ~po$v;v=eeQ>WNdofIhDjV4djC;B*UzG zzA5B-2{bFi{J)UISiXG)oiv4;{!Wf^Z5N)Ad1YkMcpaNYp-?cs98h{IzvooK?qPj1 z%ueUdmF*dHH%W?6?Rl7(3Sk^f(PiFgZA{6NIn!>0KVrtQ6W>&EXU%MZH~O4rbtB<% z3b>Bi4O1lx6`2y2iyP$3169fX**P@q(7x8>gA*uWu|>-FY%iwNMJr;!5FslsF<{vD zD~*oVW!^zZVX?!fj<1~oQk8_El9~&(jl!8zA6j^5?!#u)+YD=VVg0M0b?LSsRR*hU zzs5xNH74k*wCE=sZcWFj;YjFwf|?a4Q53tB#M~c9x#MgNbr4sX=s{27b-Y~ zSjyoIm#RX1Kt)0_iv_}R2u6~GKN9PBZ+(+G$MTkV={9&-*)5Y&7H&#dbuMU@v9dO~3(sB+S?z19yfrItwFsTaL z+$C@Ya%DTJx8UOVLZq^2+?>VukA&**=o|?=b3uZpy*(tsprKlOM-W&X{+uDb!jLpm z#u^1uQ0N&rQqOg>K5mO(T?r<}vke^* zuQY$u^lzKu2@P&j^O+FE8qkeJ7krPmKYPdO3olD5g|mTJ~y zPn>aH8hZ(mnP;Kzxy;5&mSRh0vvp$`*s5#3(jAhMFM_LHHj*RMi0-L#t9@gVdE9~+ zi3QzNSmoLE^uH=5dRB&&Xk{|K5%e{k%1+K{bEATbHhVj;pDM*BL?&et zr=3n^cCx5ei$>YfxH=8ayB@Km%~;R}OmOt|@(?Jj2X`t&6YF}+(%FZf{%7Ocw`M{0>!9=`3v|5;eD)4cj7 zRvEw6NgZv~sA-X(@_tsx(Y$P-4p9RAprbCz+swEL7%zLg*T?s3AZMZEUPl+A9kXp-i_PWHTLGsCgDy0 z-8M8PqXK;_kcA{aC|I&^v&NB~*(i2bNxfvB*Jf@hFq^(1iFEDNsz7Pd2zkth6TFP% zbN6I=7g?obH#!dZe!JNlk{HD?^|@kVz{|5hetOax8(eprdI2Am!at;vw#*;Mu@C$@ zHwQm_d!(hJ$c7tUC$sc*#Js;j^&)n0bILRMY#wXQi+G57iad*oH!M(Gc5%MFy>cdW z@S+e_RAvuryY0^gio$8>Pde+ShddcG9PwInU3m^qxX4h{x#@+(cXx774z? ze7JvF7ubkJ5wpt@6Eo=(!&l+o&~KrmPW41JHcFA4it<1pnSFfb-E;llHiYw+;}z-A zo0@zX2{#8il4@_pDd^}ALMj^_-a^38NhLWVEZW#abwXW5QEV1PVUR&e8v$!NBD1Vu z9GLFtP>W#N)QTMJ%o?wS-+=_|N}YM2oof>$WCGS(Mrw|;y2-@J?`kjZ0u7xzOCv^( z5FS2FjL&|*841Z{>FKfCH|s6d3iVbjp86`sYRApO+mn8=e7sdwU=gh7oQ*_Y6HG^O zahiSBld(1~jW02Jv{}?)Gdn)%@my>eMp}ygqd5c;88wM9E8ImS*(p3>Gl z;c3Ii3F^^5zaotq?M#L(PPuS;|3^KV|MJBXvB*EJKS?*jL}iQg?>Iv+A7x(^47Yccb zF%Q&}@aK8~w2}j9HJJ~o!j7)w=k5o;5?YI@qx@l^JSH58KpJvPEqY(Sd?g|@|AX9AACmoJ1o*crVm|y!9n#ccnV;>v55Nm+uxDWH2>@JNL2c7 zHIV23?lqDb?*F5sxQWfnf9Leb)f$wo|I2SeTK4d#{BIZk=c!r$)2uLI^uM$xq~n4g zI&u38<(|TpxE|115Bc5{{z@2zRHol=ZpQBq8+zWqM71^%`t;kp53HNA7UQw1+F5~RNP4`1+ zD}lUq8a15S&pKRcqTwg@UR<{wswW{ANc*CccdZ})YlqoWj6Va7vc+ssP;Jl@BY&q1 z+a@P3?Vhbi{P4PP&d=?#H@28v_|Q%~qIu&q&eZC-YkWN?DB}N$z8QE>FuvYh{+pD^_IM1{(Q6;nC$ppTUX#b3$%DI_tTlUrc6MI2auD{a zU3R%A3Dh z^buc7e0!4Pa1j%dDu4)$nv{+0WH?mj9ZSETL{30^I)tmdJPk{ZsRQkF=gDwu8cUN& zsP8p=mO)ja44&LDsGQ#PqX)S0VpAqNKpPXv>Gz?$A1841>99qRvGLcyv0s@ncJTYD zl+BC}i-k#njyThdzrN!Lx>?Qj zo~infd2}XP46cBIo7$3YxHp;ZQL1*HDKMeNbjE~TqrO!0p~5agC*2-^exbBP&s-m= zC|`Z*W|Yt2;m`APzp^VvL0q5bruo^0+8? zTvnIPgOY{<<3B5s)|W58SmOdVX?-9P&KPWr6$Z-@%(zX4$g}(!D{P2TG(KDw6w_DF zFwIURY-C-YwgUwXQ5~nm?8Q+bedY=Hjm~=w!8q%3%%R$TBX+JZ5SFL+|6 z9RBKPXaFf0aC2Ggg#Dz$bFdp3akBDO4tqOdqGrP~r=ls2_}Vy&KhZ2OJDll>3uVp$ z>O}0|wsB;g0em%JzxERsu;cUdzuse+zrEt9(Ou{>{3KGI_@^AYnmAtToRX}EBfcdd zPF@7{a&J>Vt(UvrOj%_@uJzep^ST^L!&0L_*i-~G>P?m5v47Flm^oNqWwTM-PfE+; zYZUi;2qDCCy4DLt=TD470kErqv3pb7cO3a7r73=Y9muiYtW`^}UXKzd;}e&jyr6S( zQ0~I7xWan@Tbcq=F!XyLlorjAmNwC0>PoTh)!W|^!X^i?d|G{D<}5Cv`-=MNI!^bH zUqFx%{9rYWj9@Z?jtG@dBYxffC>U%?PPuu=()<3`3bAPtpeoo3hUHKDc^6}Rb@~dO=+r}eDIIC-%og6{tYxDEo;pDGI-;?~Yb)P3XK`-Iv z%A-DwL3f#Y9&B_KN{&5tqd|f*m{sJqvde;wK8Q1uFSIhOmD{O+aJdbQYo~o~m+Rj4 z=7SU~+~VHwmx6ZZK#Lrez74>vGXaZzU3i+12p`g<&>t=TcJ&lG?)(|g)96P|xx>a> zGs5T`)4}CEJx=`?sxYQ*U91BgccDrjOI3x#$>|Y3n`c1k)LxcC1Ixa?saB*aZSj?X zxscU*YPse<2cc<=7uyp$CFhZ(hGqAS4w@ASXX2!?mAC{?_oql07=Mp(5&P*#N=s6J zAw-f^E^y?hz>Bu=^@AmOZKo3h30-4jT{XUY$NlTB4d}yFQQ?j>Zo|eyc#_!gsGVSM6D3 zT}kbE6}HFDYRBX0x<2^8-fS_$7_{hhc@jgHHExP(j^rZu*T0Uwqt0^G%mz8r9~@j? z#K>sw`zyy#1kJz5f4#BAuQ5qscB3F@J9~Ndta1LOg8zubwCT=qnsEh-X9ql>MpUaz^=Tb6On0{}E0#J?jZZ478@@NL7gJ`MvHYfT<{nNv zH5wF(IS<_VM^9v^Br0R0wUz8x5e92pg^38;bzLzVwRRtx1UFMBL2CokucMJFxVbn2 z4s#T-)y*_dKYdgC%Srzn^$&wC$u`n1-RsYE<6#R%h;Q zVgkp2aN|agy8-WNVoJzeDIidyF z@cGV#BYku3{kfM%(HA6?QOx9i3+_JwquG8IGa~s@O-Yc9MzO@;t>@vf6MLqt6w8{t z^@Hn4Isn9w#vm|XXB~*BETPYmT;v0-7tEjJy~y2yAPZvEfGrpm7f$n8Idi6mr%dj; zVQ21j>&?bHYcfcS&i}?Oa!+&bufrSs5iT{9YqYlh43O6~lNq6e5+n^VH!l2jL-B~j zi@|d`If3g|O{{UIX5H`H-;$}V z@aLupg^o->IJd{j_6;EXRqh7gK`zs61|iGmiGSne(JaYRLsEs51|UBxogn9tlZm;G zh{?pXO)?lI6k%3os>81iT-kfW+993VOe+sH7rf`2NoA6{rlH;*NxT?Y<3GqfGQ9z` zT%F*_rKNNK>#QK}O0t)Z13f$X@R>nGCnuB3%ug^!ET;!8SoJsWT*>aQ^X{KEQT<)w zGJn@<9q4ozyZo_KAlSNh!>*1%=CS6$ZN}+9hZw!uDoiFZYhcwD_L(-(lE+N*nfEqJ>)9Re74ZvW!$nwn#YofBrcd7Rvx|z`!6* z?7X_!?cqiy*hRCI<$t1gbRpew4%xZDc2Vsv?I z{Wl0E8K#7UL~e`3``8u{zZ(cXvs7OUc4KCRuAx31cnC;XSCsJ`>3<{O(WfXrC;OhQ z1+@0^Ewhuo)7tv!r73#}FXIj7u9lPuI^QXPwriXFR(psH&BdeD@>QNKioEh?K6|+J zc0Fj`T@Mws;Ze`pxcc}n;H&!9|frBetbnjnW_!(Ve1piV~HS(RhuMH&&Eb|tUdvJSCyo&u!zr+2am`zX?Iu?9cl*F~0SPgC6F*?nt*Svgk<~jG) zo^OA!ogoqL9K`ldC`w1oRcF0-ifUYK3D3`k&pOTjM(Ur@Q<(2!AmC{IU!Ux@7kXy8 zze(k4U!^?ge)r#r9kV!3GEN1b#{YP0syi^f$87+&lSmOLO@W*`){GaG74e2bKGj84 zH}Ha15{iR4h(Z@?ZFXArjM=g9-GFYp16kei6Rx;gSVJVLsUf)IUFP z15YaSf9@`{aw6_v@G?t^)w>X-U5eWA{ZE9bDDvB55Hnp-Z zik~dy-p)o|(0Z^sdVqJa2Y?A5S;>i?M@-p*y=ITSOwY^BaESDg&(xBM;#5&A*8tZw z%n5Z+6+eQNGeum7CF4%Y?|C@xob#I7q$yAN5(42k`7czX9ZpNnXpBYoMm_(WH&WHN z3>7Qf+rIqOB(IVH#Mu$T8Xgz#+R7%k|8P;ULC>GO*Lb<;%JmVqBcNvrZ&pFC3H+2W znmrg6u+Yd|lY%5`>-+6vR2Lfuvq|JBl^%I)^=)2$R6~LafpmV}fkdH-b4p3Qrjyg2 z64n+w^1Ymt{dGntmBUnUr3O&Tq+)lIWOrZNdF1o<=2z_xtp>1?Gii0?(k`E7?NCjr zDe0lF^x$sVQxhN|Tmi!WUA`5dzAyWh{TLejZ|+7bt--CfrLW@LgRbYuZSlJ-G%OQY zHma84j;3JScLvq7TMdFwd;3)d-gdIYs5QBBMBNZn$i`Ly0y(`yv$oz(8hrJFMgXtE zLAfcX0iYS7EAIzNVPm?Uoud!hn|4&evK*5Bfow8JQew)4hwpT)FX<+N`+?sY^M!Ud;_L{9^;Q7~AzVJcT)T<7696q%q zj@DzV1>3(V`&?!szo`4Q#h-&1N`6E*uB<#fJUQaxBOkJYwgio1JGxSxf*agsZR(1madAxX zHgIrNRn#`b5FV#Wlo!28$vMOEY?C5+k=Q=Cs?Ki}Z02!eZ5C|1f3znPgd7Fpfcc!v z<#Ef)St+KJGDZ|}b7SyFg|sMDx9wG&-A=ZKv*0Nv21i2 z_Ow1U(->ZH)8PT7wfT&vLZwe>-#6f1=1e8HuGT8eOZ*G|8J_895M|U;EX~Hte_&!Q zH5~m;3{QwENIL6zfU~ZO_n`;3uD9eB5jEUq&%l z<^$~z)Luu$@ZX`&FlgW@%wYn`ntG<{m+oTjS1aGjz52H#(To9U;v5L#_CsL+RylPg zxLqAdWyLu7et+~?kjB{$YBAV`YyE=&U)3KJRtIL`#~d?_Y8U@;Jm{E zYH2YEJ@^(Q&;9qye+wc%`=kxju+%3#kRXL3|9>i+9R2=Vgqj>H7VZbUG=R%a?5@Fi zLGeqmLs0i(6^~pNgRPNDH8DITQK(9GoU=#ua(FyThOw4FTKKl9p zDy;lJ`AW9m>CK)6>*@>bDmdZedz$mKEnL?emh-$#OaKoI{df$Quob+mcyjJRQwhro#iilP7Br|;l+7KZ0JRiIb`yeF??2}pJIgd9Q z{4^B>&3`2qh^yLtu<$m0W{UgP-Mo!zqA5i8Q)5bf@;?uwB|7yXeZ;lwMVcbNhC>tI z7QFBoT6v!Ut+_PYJKXtdT_Ew1|0EDL;5oH7!F}r@KXTLRdfIC_?p(HoXff|NKTY8E zubVCsOCe^qxlakE{WZm2jXMj5))Mc|mH1E`;VhoUouVnMxHfiHy}vA7M&cK+cQQtw zB)0Rum1v#Y1#q4&V2%#{k+aVt>HXt|C93f^F5HeEat`k)=XN11u!HyF)jM&FD-UlW zP}fsD*tLSuvx4jS6GvC=k(Q40x0gN1Vdv)jO*n+i>zZ+E73bQG)l-8C`P4B%4{_W4 z9(-g>O+?Oov>YUjLEEQAI!*o<7tT2{ePDOX=3meo|@=6h|qga#WA2?%S*xzXmkT&E!w-SZ%fm&3}G;TEbRE4VY&SN^)S zoXI??8>1ug$qpFFaFpTGh=Fw+G3OvO85`my9Jg;}{N1vNlVg&V=Bhi%(d$Q@`;iSd zL~ju9WOsOW@UvwxXVYUlOeuOD2(I4`^~CPx=FuJBACUu?Rg(dc3A&^Wk#!#D zA8?=#F*7s)QPfl^N$@Wi4B{rXmm@DskOI3Q zHg()=RHhlof_U)=9VO(Ae79<>weNZowE26447+7NZc8eS><1Rqw?)!kEqG6*Z#fz> zJ;uPHhR_b%J=Y7gvZ4Tfcb1&%{Nya!x1{nCCVBC@c^#v8T7bm&5G~C_N6R%v3Y@|? zMSe^4hG~HkN@E)4n`*hb9d@op9x(XkoN#;3q)0Q6aVffElsvzGT?Bwz%nPJnb?I$j z;4M-8=^Xs_{_H9>k+pCRlDziP8W!rx5sMiHQdA>hP!%kMr?}Z~J|H@AXI;FmiyI$8 zJMRU%O$FzF=$I{42kW-C{P;c}D4WvQY>5|#X?Q0gcT)AnEaxTHW&=~f@;fR7_pK<} zh~xS@nUgRwC>EZwmK)m0Qg(k9!dmAh6@L|CZ6s>@zV_%kbRG);az9U{V@W6-{#i00E$RDgr3qSr6$J95{u8=izuvQFXXVB`eG(5%6WEo&#@ zIfGRERBy{;rFxnnDEPQ(Eo%DLFzsz)8$)=)feG5J#)rCDFAM z+0Pzq9@I@c!~$k_-oX#aMJu3{YLV==--q@r$w}K32g}jLI%5kcvQ2jaG_!w@DzJ~J zNgZknx^T4w>Fqjq#1p8tws$%Ymq19F0O3l< z$L2J7^UgF|YT|+AN8=A3jjy2#gE5K}tNzc&wJOdBqqX~|PgWp>ww+dp^X2SU7uGhW zM^29w<*>Awg4^@TT)_CW$ zjH?G}!7R({eg%c-1%`Seya+G#STFD`iI{?0a`bi{+l|g!kXdV(Gd?zK6@ANgLW+!W z^)<5@Yukhhgvgce=rS4Fmyiv79!56U7?Y+HlO^66s9Lah+Yth;VXt@I8V|JcZD}1- z?h$!aQq0b|3r{bL%B}%As3{iY3e!*Y_T{o0+IH@OTpv6Shr3@%)Asi>($eDL!20Mi zkYDFcm6hM~rGETX*uceETa-b~O7@^7{Ki8NKB{JdM~sgwZajA|iO$`EaZ}L;I9;86P4OJ@Z5QgYaF6xn`kA++r z{efTFGJR6Dwd~0Bq5%&4v?NY?+$0;ff-nh>#dbeO_1I*Od!w)Wf*Z7`wI^>xteExz zH}|PBO1l0i zZ110{N=54$kcc}{8iPG--$=uanI6DV_l|PDYPeOZ^~T}EkWh>r^P$O0<<#E74^7kE zr%(#C91@=bEAx%H+qDRR>0OI5@cV*dik79}WA&@6Y}&VB#Bf%4m`d~86tCl|aDtRD zDq!~2eEC}W2_!_$c0ja^6Z>O=!>fxQ#dq%7LzcJs1=39Z4=x()7ME0>lreqj_+Fuz zS3j*c4_PhJOhJ?0{PtqbbD~nIum3?Q=5I#9*k3U@HOeY(!LFn_mvs+ZZGT7UFC_)w zb41|lKB{{uRoKxG{iJrT^oWrD3iUG7&gH4MjMoun7}o9fc-Oe#Rx+2Dm~mci0b8{h z)LS_@B{f;QZ-1G2-%XBqIq5pa<4PxYhOBIx?SIksmQisv(Yh{yBqV5ph7cgQLvV)> zEVwos2-!ty*Kk#F%UTam?npO4A zcRpp>`{8I!B%Qb=ret{fM^KE@15SO|F0VyIx^H6uJ!I*2I_{Bjd*@AgXcr@|YnUdi z3;}pi+o{;}$kviG{A1U5BG*s~$JqeVd{)>1CHj!cdeQb+Gdf5Nt(%3v96O<5Nq;uXBd< zv0hc^g&y+@_{RO*koS%cxoT-oyVSL?y#pIu* zBWG?=RtJxvVVU$zOH`bQ?P$Aa=V%Hi@Ef864ORN}&=EhdBmc8bgJWI>5n+FYk^fE+ zgoP}|NJ%P6g^(d=e*1UrK2>QfO^y*b)VfhKV%|VmM46o1I>7dSCka-29u(s7GFnX0 zMjIlKyORHt*!OX%wwjHyyuOa@xE9pA=Qi~b(OC^Iq+Z!;(KS!dWoz+5Ij zo4;SwDF}b1KTXL8EKVOun*4mZO__oCmvb|x-?_T8vomq^qGJr$`$5lEH|~D%xjSHSN{h`4`eomTd&6B@eJGT zaQk(En>W&IS?o`&4IAz(LA_a-m*HC$>u83^K>GXVu0Ml5de z=f&>#9#HP&tdR@8>NKyH|E{>ZPzkBewE2Lm+bO|Axz|GiygQT<)EhzobdyuQh(pV? z+M_F!#|q&m@zGZTvs(4D>|aghB6Q1}9j6|$E=Br=nB#Ql$ZZRFZ$=u$a+<^3$SdjO zZ+6JV)VN9pl<@!rdEeU|+#%w+NXSjG5(h%J*H*S)dGF;&OdUP8VMISP&>fPH{w_s> zCYvRnCgnBfYDumihpm=POk_XB4)`jvEm%sy#90?|v^1Wsg_ZnW@0L4za%VXIO#ac< z@tb;z8>7du-^=mc!melVRnx_omK!EqY(&5Rm~em9C*7d(TW!QDLMc4!qp0J&f9o-* zb(4FL_$+eL))KG!h#lOdczRM`*)?p{t(}+%*jlra+oasK*wTkKfj+c{h6vtW9h~RT z%^&*Shua>=_mMN`=YRFRHC^JhXDKT-G5&N_=x7pg`l?dW&8oK&?kfRcmFUl1r0{k! z2%dio>nvVw%SYB+SZbi6V6Ds4Y%qMq0FOv;7t%La)0R>cO1q`;uk7`>+>$~cTj~+h zHyY|^K{-%;C1n6kZ`iv=SB(#!oe!6jy&r5qGc{QDUgESDQCe>D|EWg4{jX}IzeC*D zucXm^U|UHM%SXkITW3}ePq6S_Ml4@Do)br*dCCyZWfF_+syeV^t`^#D1A;vRtrWLH z*t0s03%;ff>}fQ$PA8aWYsZdy0QaRSS`G7`)r?cmbxd$o)l{sVX-(%X>k)pq$6{3V z36-M!<5)_{qt`2=La+_^ABmGQ4~hDn>rmAFd}dvNuNb09T{fbJi|@4L5%TIjEt$&T zjn8x@NcN|DLK!Tt6qTu+*$TO1loYid0N^H3A@%Pxv9a9nVpb9&Y z({30Px=({MH#ftRNbpL@lgVf^&vh{NJ3ajvq_2D^dg~cUle)#MVMdubz{nkRkUneD zvIT;dT>!O~vyT*z@dCq=uM*$4j!g^==GQeEELbiX=vR&nse$H=q0M3su~P@KFIWib zj4D8%x>G#`+TJ50;T5%bo3@|Y*g^~{B!&~lPhFk-Gu4I_TLb#X#c*wB00~_iFJ%gw z_oRA=k@_}+9P8fNeP=uW2ff9pKod(B3+3@uIl0RpaHzi?w^59j?`Z@mi=QgD={0XJ zWZwQnV9wqzf9z_NfdOc7P);AfGO)c+0*&9oCK2(1mQDdcDm0`j^t2K?JG$sJ>rv2+ zw(3wU>r}2-%bd?}Y$S7hPEDC%cQSm>1q^A9WUV~|awx@Ys?J^Awkv+xbv%kSUeuqh zIl9fv4zn{VTqX1lW+!H~mGRJ1^14_FxZiwG?t#^EWgA`wm{oaU3-0htNJ^d;@C8@+ zGi<+fbWa>>%2B}*iGM;;2UW?n>>mhUY;s=gLOFd-b8?WJ=pqGrzB=DFBvM|(No;+Wxygp zF(xFU^?X>z3HI#Z*FOf&k@q{5B{EF;-Y-6`|NjY%`-Jp-<@V}G=o(IOfq$0#A|i%- zy`QXHuzyBqEhCMlFKhxHEw*@H!TD%Gzy2Ikmg^rO2Z7HnG@&0fYe%My_sm`)xH@ZM z{NxygKYmjboj-B1c}5Y$fJI&A`F)erpR-mb3lEo+mFRMna#afZDJQj&Tp)3buYI5B z`f?)K$-+wFXu+E?Jn8xQ5VAif9GmPIU}aNE>p42M# z3i|#UQEAe|@~PWAY-x&-DyeKt%2Fw-E|xQ{Nih?Vg#l=GiRw*BKm7f=kq;SMgdcq8EqC(B!U9-&< z-X29!MFThgvgg7Ck4vMJ&xNnGhJM1_-3Q|82guYc!V;?p(tUiQEFbQQN76DM3bF1HjCPh#<6h0&uAGv7tX~$>uUCMm*+LoVujFM-3F&s1FwfNP}`l(Ur zGvkjsl$w)oknC!dD%kHnI=M?}Dz>U*wpakOd-V5slC@xb)i-Uz*)w6&JfrqUOZO<| zHJ>DDX(tyw>M3~PkNJ^&tkNGNwC_t*Lbo=Eh=>UB*g@S|JkWER=TvCfs?T*XtiPJL z&Z*C5BNw|ahla#k)ctH_4Yzop68OW*JZfSQnRy2ND5~Zv>>>d(k(*L>`xC0&PX`P&J5|dbxgNG$Pa{N~9;`G8ag6uV;Ni*HG}u zqMc*K{(SdHRb0B-78!nfW}-WY&vbG#XaK5dpUv7?CZ;J7n1vHTCbJ>Dc7`QX91&#tLKULKf~E4UFYTw!!B_)t6AzkiNKISTH^_3`F)v$Nh9-AeQ# zaXxxzX}GP!m8KUw;<%>7|DnT(wKj`v3|z zT+yd{T3qn@frr&(KBxUTQxsA+MIm|Z2cVa1rHSTMI;*w25T=I+S)bf&)6Mn;en?G< z#04WS@^K;}=(ZK=ExC+2A)DcbRKg*f5xCnnEt>)CO4Gr1Q=zjJw@ynJA&W2JwjYVI z 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 XvoL@AE#pcZGqWInh#%nx=#75?4La0H literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p3-03-tagged-entry.png b/alshuyukh-accounting/docs/screenshots/p3-03-tagged-entry.png new file mode 100644 index 0000000000000000000000000000000000000000..3adad4e2e4ec29476be7f3fa2f3c16537e79faf0 GIT binary patch literal 73374 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�glnee0R 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

GeU8 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

GWckED3-&3f0${EG<>vy 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

SEfyui!UO$Y55F_0I& zcS0Jgx0&5}Gw-hW9<4f;Ag8DESekbx$hb6#`ys`5n?pe2Y#=!fGD3gqvE##IMBE7I zk=nmCG;qa+pVrL_grl><|1jHy(Y*Y?i2eq>f(EPZW@$<8QKU|Y?xq*}mquC*R(prY zW_mz&+o|DWlq}0FKQgJY<&ocmCVQsV$eM!e;7$VlEWeJ5S4z(>C?lD zaOb+;N+nHd*K)gQ+s}%D=3{h!#?`uMqIb@b%B20uiEOgh#Feb z3;-3Yjx7t^TS1`Ns?Q%dbJfd(DkF?sk2oC;(~}!XETKBeAr|px_(B09f?vISQd_b& zgUX#Z1N%%}_`p0PHJni{*QZqIXz?8NOIhsGt7?yHebaqjX0m#3S||<8FqIjkXJdN| zE^pHTrCJ!Zw0>6L)2&Mdt16vox7yQKOJ&FR^rGC3rA8m8r|a5tGv6}oU6Bo?nvvmN zPVOz8m;8cM#2FF;<27Gs2sdt8CPznM$qc*?2ctGiO5n5x$dqhj0(D_>qyCjo!e%{T zLoZPomZ3g2yPNHzNRp4CB<PL~aZ zC}tcfu2t45)iK&h!^{&xKg4?#$3ao_xBX6YWtTDKgGsl1M5)%8$tfoReU9BjxOjzc zm4PNjw?o=~ZrOE?^NBagPt)2%QFYZvd-XXe#h+--y7|c~eQsjL+mHn-Dk;+XOzLLUN!uGZsQpRilHh)~kKy&J z@|g*)^AStRn_vB{og%UnH4g3;!bUc;`wB;Xf`SqZ#0P>;#H*%{J6~HRr6rnL+Xx^y zae@7lGgARG-7vhgxQO|5TvJ70E)2^R)0TgA1;<@ObbFhtDn%^A3N`ILjrtnq$$Wrv zLK0^6FOH?SdSta(#`RuHD1g~(cblV3+(FWX%O5sa$am$W z$as6jdYd_o*e{S#&2@YG=*~S(FW8}hO)Y#JLOj^(hENe`$V+jFFU7L|Hy7(x?#`rEo&pZWDwwq$3dY=q5R zkbmrxzIfWFwW))rhyRPY_l#<4i}yuiWeXxIQUn1TAYFO~MUhQMdIv$I_udi(0RaIO z=_Mf2JE6Bo@4Z7H^qzzsNJ#P)d!O^}J@?!@#{Kr*`p5{$nsd!H%dh?IHf{_IFk<8F z4-a;7E(egUGG~^)>EAr+3Nj)~2LOQEAjQ`&wQFRf`|6HqFA#iH{<4hOmsm+M21cF#ZR zxyRum>>@gTO|6-V`HDGBwQyS&SNrB#TmeO0_4EPNvTGw#H%zUo;%5oEn^$s=OM$bo4Z&}F#3x)KRCWC(nypdoZ@ zgTi24hFYHZd+uqjb}0llN-TNt(XB2s;cQ~Byk)`k-a{L!(y8z|Pqvn-c6D`rWg0bb zJs%56*%l#?S3llMLW1u(%LTsEy8&VdAFXi11zi6as(xPLgwV4QrA_#mK;cxv3mk(_ z3bp?wTgO#bHn#6&JD&M$mHY~LwDkJjwpsYw1wZZf-m+V9guo=;b_m1%R_N!;@?9GV zd=J3TQ|))_OVakTL^Qru%iE>g*nPw|vn_>Ufw4^1uO*l40KJ&}szlh}d0p4XFWDF= zw{k16*Yac%S94=E$|LI^VBkgID7%9`bKvX0m<4@3ZYPvGq(&$!^?!gFW^0aj3On@E zDt|IH)751|T#G-0*8yWQ**%7P%i_XXpoh^0hhcA2=XSA-R3p2SfKb-8M^` z+@?{fulInQd>4g^BR9f!yVa?zyHJd@8QN9p7Xd_=b2cUFw;BJ=daCpf_j#Cn@>uTY zS<9XVPEX_~2A)J#zT@^!+LVIscQAp#*ilj#*Jea*Kqx6n!=W4 zRS?5<00RPnw!e?^h&goTUP_xK^N9st8W*fr1`g&n<0=LtL(;RJN)GbDs*bxqiA-Gz z)`%j$NApDSOsXh@@9!B)pW3cvgoVD|oua6c+d|n#Bnc4-fmK4Xpgi%*&!4{Z7W2cM z-pQo$wAn&tuKb=ZRGWEj)xn!Aa2{@oJ&Sy$5a4mzD;-pns2EdSDGk}8rKb&)S3j!% zow(J8mo@h%jx?_zk#PnXX=j(5eNMdp{F(5Hz<*ITl7HuL!?kDI}XFH61ck&xwn{xt1~9d@0( zS!tI0G*z~N9jL-D3(N_j?>h(6g}8K&`?s59*`1P^iVPTKY<(}2!A73HE-{YHsNFuE)9?L3y16Xus9kwV3OYz{24i1kD*;@nG9xe z?5+nJW-FMxl$JD4$v8?hdpZ_1@AQ9hl@9nB^xWk`drRPorS9&1?AC4XOSOf%kh9|k zQjO1XeW|DdWTbV>tAAZC`orcX-5@b(X?OSh9QNcI=-Xd0!wI=zrhd0)8(=QW`B0({&Q6LB3zX#LpX44*dWA6UqGvanDEnYDgP7B)bkLjhut;QaIAxIeiG zRg8A?-@Y1uy^dl+G)an6cJ*! zubTwMz=vueNcauVLsd3Zcv^#|HWlS28Vnn(DL9K0{Z}1;ziJ|}P<$7|CHUiqJK(s( zUIu&x2+amh z!b)YW8w!2)SXjWPZo>od8TDqqu`+$;71E6!cPz6tvo-%p+7M#PXPG7KZ|SiR+a!4;IC+D=MqV%dm%ui}`$Ue^2oQ+a!o1$~VUP=r)?|r% ztQ^bssOxEeqF~iUX_|(|lr*7&jw4yM>=vv@to|JjBP!4ZZ=uwMIluNFP zE&q3}EUpR<#q}1NNZmK=_c_zy2D{_zyh%bF7CW8<*Y}-Lbkj=(kpkL*JHnpo6Z?iJ zYJFF3f8utjOu$Rey_LLRQE{_;p!>3W=TvQXULKCl@h2Vm!7>~=m_aV;88?J9EOG8P ztZ(*$;1So~qEWBTe|`_Yk(6`mQni`Xe3BXUkrRsLB}w?{g`N4hYLT_{!3|2nwY!U7VCdh zDyG-^o}#EXC8RzzO)zXo0vl5bXt`>|3bKY?wG<3_J4+rLZj|KouikVok&!VF{avV* zCCou6P!8t==uGjKmbVj71@0b!p@DHyDtW@|cbk?z7&ImWt-C$mGgaxU_ruHMh5W_{ zZq-DQ4N3geeARr>^aUtXXcHFAo;J3lrM@%3HZT(CkC4_Gm?JwYbcE~VqypHkaA<0* zVeE{H6o(U3G5cU^yhXv_$9-(aBsa2mO9tmTrx`a&N77yZWG({r1O4 zH|hoLbED4=Uatig@wK%z-$O7*B8XehS@z4lkchp#rqJF`DNk~oXg{C4+o@KNTFtxX zwk!*UpQfV3%76Ld2Qw-3;QJO>i@zpvX2xi5Va`6Cc8jiNcXz}F?=)BfSboX- z;rGc80ug+u3CHk6gLi!cIL~xqyTHj6B zsURc=$}NE6Z(^E$ zL~+8KraCZ}Xp-H|T($X(gbe67$4!S+wO-2dGy|;zE0`e%wI_dQMU*Y=^ta`}3ESNz z&A8Qpw=CS@63>oOYKU#`s*noh9KIdy@64_S)&?$^9jg=e)my{(1e>aD3HC2*_WbJG zxZ1iP-)`^Wa!T2}zP*Sq0>~g&T_-g+1%>P;LYfzPZ2SA|OE$azWZ()h6fEW+ZoF4Z zlID~0Gwq-zhi8ucT36fLHlWMb+*)9J@klq(5+}?u*=Oe1J6mP9G#5!Nt-#G_l67Q1 zYFi=jX6z6PHWHkT7FS#f@ zkiH!3O!%y;5GTrN20GqV8;TPvvm6&s*5*i}j&H`eV##e%QwCqgwvH@kO;BxX2YxWZ9&oC0 zjmK<9UjJWtyDa{z=KHskd-`R}EZLZ!>6m(FjJFMV%?_6r$>#e_#PqgJCgKUb&{6L0?n?F4^sE)E+2uv< z(}NhE?$c)%#>$^xbP0s<^B%sBdzJBvE;y zutbNsB%L&0v*kO>Hptu7-~nKNz}IGk%3q0#j7@0=+z#qVqo;n(v zKaW86mkcV2(y;?<=GfnZaBt5F&z>jffEo`y3Y*vMD-6r(A(62MxR(~VKp1k^y9V5} zn_HX}hAk_hqE(%oO-VIJb;;qiKGGpb zHXEipckC&0FlqK7&F4bXX06Ngj|B{hKEOf>rqWJ#Ts*1c4)L;1NiY=Sz9KYd0IQOM zM06Ab{8L{aKqD;o7QYw)0@GRdYhfv|h>^Fp&X8QPG$ZM|k3mr;Pj3GCmRuCncn8Y; zw+xhZf$HD@MR%l;fWPc_N~UYdexrt6P!@}YMiTRBI*RWwt!1UCxFIY^@_CK)z>3{fBTD$Nu!ce2I z=f`ubD*m%Ma(!Vi20IcaCG+s_2HPGo|3iD}E7Sm)nwOSJ7v-~GC8O^6Uuofa+nwti z?m7~FqP9fyK3(a{vy{Ghg+4!D0uS#M2ke8j{>~)`L4VCM-+~ zqKB*DpB>mSkJ^mt^#!O0>9j6gFIbryC&ZavX$Ml@0b=&nGpRW$dP$!bi&u(G2EkI6 zEzyyvY#v2fC&^*^)^7BIf(7ieB%AY{>87?TEzK1$yl&v_z`uBp5ZDoFc|6ue$Mhoa zd@v$a^MzFZDge-TE+pIExsded>k8i^uTN%BFP|6v)=tPZi%OL4Hga9LbG=b&WgtCa zBWG_*&ZnYja>(-9L$bo9v+G9Z4qH_!3DuYFFVW9<9AMKr zYLX-u_axwfl=aE<5)}*n=z08LMxwml?mRuC!8{B~q{erB4PN#t!1h;(}1y3}a; z=nAukOa+oQbKuN&OAaFwEa9w3JZ{_}WWEZMoj=+ejq!%UeIC2Cd`fiOx&wi@7e(%b zV5r_Rgv>p4cRG8)$Q}tJSq7fRfDgOMJz1Cwed=xZsOOCUfCR!=rPVn6?8*f?0a|?H zpku(lVmc>S(P+@MP^z}QqC*c^ZH)@f<9VP*{hjNLhR=2BgO5AJCn41g7&Og}9IYzO z+GFo(@UQ&Gq|-|66&4*Z4*rV{~EmtJLUnSjIe%UO| zcOpwYDPksxR0|uNfBAMzHIcSF2U604L!;4S+OZqB7d7ZiY|_dUyO|Nu^VpeXb?mpN z`QJ7}!}#{D;8yE7=Q;Pz&Bc*wqq1TnZmp3SCNA0%>eT|nlV*-HYBR2?_oV;)M1PqgwJ4Y#f>i%M^TWuXtA?P+})~$p??SATCkp!O~d+1o{>mdiTuAhB5o<#`mLrbWsE9luv zH*Xp)tS-HE9>h#&KUf+<)(oaL%y~|yINwSf?s+Q4F)$PE%A)WZ^Y^fEobwv*O9ETd zp^es9h*pX$&O?58Ms6vZ20DMTmKz@ba}|MaTSyw`INs@a%dvferSSX)miG$jyt_2` zGcGRfXX4Ec+QF5JnPFSYE~j%q5xtpLSpy&IYpC>l`WjTQhBL?P2hUREH%vjiAD5o2 z(B`!hwdObNeSoe!cAmd8R!2X=^N;ud28a(}Ss+9qw=Y~??fh-5-cv-w zKiFPv!e(SdRL2KdjDHsPK7VT8gL^?)a{b#gh9I3Eg7jsn1UWI%m?K`-X_#u-(K=67j8+^7>}P6_?Ov7im-J6+ z3eF0aYYe9Xdhuf+(5dzmH?c~n8YK%4^?yhnaTfYouD|}&W(s6B4qFHr?yNk_PApXJ zQ+0K{4OCSDIYC9dlt{xIvTJ{Vo<@Pb7Tz;pw1A(BnsAzE9v$sl z0W77@-mN<{W8Ic>T68Tsr}7Bx1*x6VJ8!Z;LHBUOz?*%DxRf! zZfqhJ=if>`Ri7cI9J}3N7STJU^Z}9X_GQz6?#H%w`Z>o@T@}Z<69{|x@^fA;>R$V7 zB!|{|d=I9%VNI^s^BpU%j)AX%@RQA0uZ~?+DMvRga$&c^6*KAmk(kbyqy?~Nuj?ucb1K(ij^1>;Wgx}EQbd8bX9iBhW`pxf%IC5bVVH#NigfEN^cLgTJ} z`sgjB(A|FVqH{qu)4;gw*VOfk<#)q26BZ843Zt*CYsofB`YLa$3RKFx+xN%t&Yhy$ zqq=Uk^6(fD%y`w8cF=4@g;LeICRg;{J_bXLtnK-kRjTijJ=d|9Lso-p%eEYt#L9PbKt$mi(yb+6Qgg8#)W=1v?+IFB~NF%Fygm`li>V6FQaax@Wb8 zIyGXVitjEO{!IoQ+3n1mCSz&Yi;(gk#oxG8>O9L_wHf#Bihsy;{4-TtuQR0Oy}+g_ z?&h3&h+=HPM5HWjb;AeOGR^#2uXQDCby~y8Chvk=FpHO-|5dLo)3Y*rGU(ja!krg{ zhoBV!vIfRL=KkF3M&aF9=%7jSgVIQUK{_qd=%omXBhI4S>UJk_FP+$t^FSkAr}ED# zzWt=#7^q`UrPZy&5HpeU2M|}?POZXUqV)BR0)oG{@}clq*Ollj6v~MN<7D1R6AEb0 zSc+XojZB(*5cbpf%N1uMqY{J^yd9N`eAJzqWzf+<{x0x{rytZ7$_0zty?CI|lkC~+ zb81{PWSdlAAr6OA_gJ8wR{=Ft=i05!1%!y$@znHFR}tKpzgJpbqEQSuP0CrK=FR6~ z5Gc=DDX#Y?L&JN6{%8|C7SLQ9T6T+7C>If$r8@a6H+sKt#NuRR+`JkyUqchiyfF)A z7P5x4{WrY`PWxc1go1^svYAO0e4!jhXhxR8-q@_a_O-fokJj84Su1^ROD*f+;Q4$J&5)*l0GU%s8}Co+#Xkw>*u zhw4y8x*s;5AI|6xw|~qvOwR?KBuYTGOP3+ijVw3Oq*0rg zO1{UkRC8ED;AFq-JWGnW=<|0ot$U6G4PU=}@e|vJSz*-Yw`7Et+eUx_Ng3ZShFeI} z`J1Urx)CE&ZXFMm2Qk(ZhMos-fxCQjt7DWj&mh(yKMRF~Cp8r4+5 zyp?_zvMix3WhIcrNghsqoGlYp$b^&@+l@-K?WwdGJO4lHr-5(&q!xdnhuvagP z8D3g?y1KfW76SK-0I~H|L|@Tb_Uw-!PBPorc+yb)IJ2d-8l@el{sDyKJJWc|HfHKe zC|^(L>{iu3@A-k8BigTRMmtTZr`MiCehGG|`C_+d$(O2q#6&!62Xu!4NaoEgGsvL# z-m+>W8SaM-`qsrw(*FKnSAbj^x7Acz5n5jPP>QHaqZMCxjE zw30twQo5#m;>n}S!_&azXeA&?R{oa*FU(lBTY57ji4Z^VC4j$RIWqypC5M0lg6SBW){jpqVdjP5m0kLg9r^-OJZX($${MxOdmiu&HV+D?wE$mZ$K~Y_E=Uhe44a><%t82_ ztRTYt=egCb=_56X7GSd$)dt8L)xpZ{0O;$pLf?Jymv_$J%*vHBB*vTS70d%8# z@?PG2Y8sO>Ox57ZJ8qG!2&G1ZeXfiu=(^Jl)eKi2e#iJ;C5qw>VS2r#h1QMGD``fj z;uPN9I_s}-zz!$wCwbkBMbp%kvI`FajQSRWNr+3H#&~T|mBz^{D9r`?rIeR9xc2D< zloFD|xgllp-6e(^8Fc#QD#-iFC3+n#iDyy|QnVranGyk>{&lDcCNyfL0bswq09pBe z_!Y244#jE#6w8cvfK6&;^B>BYxfxNNf_^Jq_oNO@yYl#ixVVIP3eVP(<+b--x7_@b zT3=?CZNvi6Tm_5UyMPs(x3hazBCJ{_d}Mw?@lo@&OMgt{`v0hYF&L*+uu{9Yxhom} z&EgOiI#)1aX!tK|2i&+mo|SOf``@5K5P{rL=Fjs^WG{*U~(r=I|q1aN)3`VWT>dU5w(YXL~{|JNVb1)lit*A0+kBhn1G z^Vv9qG8jR^4@oj=I>P#;j}|0Z0#kIk5tN-jQJ6-U1g~DBQNV{bymPVG@8S=;IFnr? zqiQ3!;E*XM0+E6JeD$np-l z--J+!Ol56&;|%-mU0 z2tn8tD9cX6%O$B+IJ=$Vd(IWX7_>Q#&lA^$tCNTcRdtD8?i7g z1%rZW{Hb2h{O5+gUo&;*JAzn$TP;MV3RvL94KdmI3HN+Cx0>k%lc?!C01#7>=Xz8X0b_-9rAK57!m3`RCEnLGi{ld5P{Ph zd)_dEdkbwssU`9|2pfm{Tzb0|S3Q00@|-_HS18w)?mZWflFL(9ePs&fSzXUEX_9jg zH(01Awc||28&n9x-QrX?j@NN9V>+wMgxqE}M9#9MS?SD-Mf=YMW*s2#`a|0WvLKWQ zgXbWX`eVtxbc*4YToLwlJLB_HD15{*EX#{CL46aP8cJ!mZr80 zQ7}1sKcH93?@2f?ku&OArEtvs98x>g=Xc44^){fC-lvXbnl%iJCu?64GU;(5+r>7F5VX(@MM@Q7c~f8?8T@0%x`@Tc}AKY)wXZkhXZu z^6t-e6r(pAQr0iJ`1!Nz9aQT?eG^F}_`u6vSG+R{x|L_#bb+(sCB z-4{CO=(4Y@FCmGUNRJ(%pv7k**{>IV&2hz&dD?=Nxq9+fU`tF~*0BeKWHV!^-$^;w z!Ea+Ja>1v}NuD7Y9xM^h3*QW?AkLHvN(9h`LSbGczh_w8`jI$M%KK;93Cry$cD_N~1TUKn z;!y-TZ!O4J>ZyqvzcQn+wWiRNx0Yl7xn~Q4Y5}j7+HN+S zEPcf%tO6@~L~FFHsoD7g`ez8hz6he8#M?X(DU%?e?jZAZ9{*J~ug6f=W{Li`l$yBXtiZiLdte_i|dd68AUvp48bnEI<+Il!=*? zTu46xGL{58D}_gL$t>xVF@Xwfh!5{sJICM-=6)(ed6m5o1z2{tg!=(v0?9m3>bDe? z&;NEVHU%57Z)=94VuVZk*&5dAZDyz){FDY7MZB3e8=Z7MD$5?jESRTk|44crrk)FI zw5p(=lFL?EB9#Sj$Ejix-9O5>(8~`B43|W~9TCM){c=;gQ!GV>$OSg`!=jupWY<*L zW=q4X>#}CYLi&?IR`21LQDr{dGyf``S)yQUf}Nb!dYAal%xw+qSBh5T_4_Lgc{_3NcvLUl-^gY!>xzQ8 z$X9_?lJL1e$A=u^v3m-B>cNlrGZ8t+2xn^^8W#WOg{-qPV<0PxK2_ z6fPj`5lO`mo*ORsJzDh z3e6V(PV)M-kgLAk$Jds*n}Ym5SJpPZT@x<8p0IhO>nm9LC#>G{?Hao^t*LRwj^1gM z*~pKC3ipl7Blum3;*3u?d1@Pggtt_YtdxHH*Va^a6^s?1AdKlaYj%?td~0Ibj1Kx> zeO|6f)sT86ei%CLbak#a+`Apj4 zSy^FGWo7$(Za6DH>RY2DsZ5a|X@Zo|LZsAeYn~Jvl!(V`n*T)2FHE9ecD1e~SX&H8 z?S&1BcQ^e?DxS^FzYQ_B{-x!gecbvf(E4i30#;PV$T%%htJ-;CYL%Z#UU7DS*615h z9;`=1a%eH&MB{wsuJ51>!R&#xLopj2oS?#5N^$$?}Lg={`>5>E>qn>Tih_KjYdV zO(WuYPi0EmPu-7{bl|4N#y?Nis;T}^k^RsyF%4)w9*hd-m-RV0axGhDR^s*YS6X|f z-KNOBllJvYfK{49)qdd1S*8vW#IE4)uUx*afmo*z2B@hujStqfUAs2t`+|6SwhyxH7Z!zA}8Esv5hsH zHu$y+WGU&V)=9@TII9g%MMdo z;pxk2I$#o|7#l$*#r4p@GbaJ`#pg7c9-3CjVVS05_qB-|Qz10P&}3rMhvurp@LxVxEysT0zMXRR%^4H(pXMC=qg_yc%UNJbIgU{^v=W4D7)V}e_NNm%2V7E zzWioiBlgoLzt@1vSxA6(C8T}cRc=RvA7tcda6Pjw0dHpg+_17o@!GNzAv4M>S16A0 zfT_{2`v>IIxj^oD%C(jO(cjq3FT)v}L#^X$wjOSJ8$VGbzMeXSxr^hH6W~^rQe872 zp3_4IAzi}BsT|J(R3mDiU>I&6ct9q4oJ9j@_^7{Ts~Q$oO2W_Az3JRdzuWJ4y|iS* z{zZ9^hr6fYJ2vcU8A4$9R7>-V*&9X?4`TV?vl!z7Q8RJsuIQ`=ozxNzV2T@A3lo;i zYL-|uHe6hs+Xv5-5A1j`aJIJhr1hywO6q?VHE`gUCp%_}-&;$*M!_A_U#JD8BRi9r zatQeu5o}dbJvtd;X)hzWo_9}41;R5I=iFO}g#`}2Mj78{(c{TQ}{1FYovd_q48;SnI zZX}Yb*)xE1E9I4TqztXu)viH_TNPl+qZqwAjf}jv@0cq_%vGEfIigI?E|p#Fwz3x? ziMo|)*l~Jd1nQL|w{P96L`&mna@#FCqB9Ah1?3F=$Nz~12*OFv{n`$YtLt*ERl+xJ zqQ%#Ijr4Thu$B7&sw zg);ri5#^|L8aC4Hv_|FmBJBkBL#E>*pzL(bBf2XaacdSWK95*uMk}#|lGcg2`Da)c z@4HtpYwQy*)uV4jo5J`d22VE6lZSq2FNeVp-s4}Yr<#9tWWdC(8`Fq&EH@@r4q=QN z#1}HVM=Kl^bi7o?-xcf74m;cY5e|%D6b}0#gl=MgbJNbEFWU_$bMR?L*cCWXq_KCW zoE@`>R>D!=K1r2%iXn=V9`$f}TWgG06O4nFHOC|-h6htBqOdDJ0CyIEA>_U)xG^MAru6vA!MSN**t{nIL zcL@ui2KlI8iJuynxB2S^qbytZ+Y~PWFjjqT$nR^Cl*AEj>7)1J&|0^%500Dd_m9V+ zj<56zx!Qj;0WN~hbD~xo^xz$en7yDEDPz0#Bgz_$5iEdcWb`JdophlwCpq}2(+wEa zIgJHZjlbXU^cQPF;TK2TxU*i7=ujD?nHDD(`!(3Xn#}8IZSietN@|TPP_+RaL z%+bWxeES8X1ZK?`NO;{ohDUN(f;-?RGMlcFKHAar>|NtnUOwNkGYC38t`hbCYGgJ< zs{K~gBzu7L6V5+?utEjREahRb-l-nXH*K)59|)-l2aXr{DsbUi=J1Y0Xj)uas*Aa| zT*P25>FaQ49C(MMBv{oX7vZ@9i|Ih&PBw0OZf<^~^*+D#bqfhTN!vS8PJs1FZ%yhc z7aJQZ&R_wSPO!SuP(EBo}rIl;aN-k#C$Ak~C+E=F2_*CWSwdGo0EBoP=D{zwMzohcqhZ zBb36v&(B6DKVQzT_JlB1Bxhc}iMV@lj1@KKw{b6aiz}Q>npFugGf2Zw}g5EfY(MZ0+GW zl-uT%m*{IRqM88#geg$*&*{cRJPC09e+K+4GMfvf(6&2$l}t-@TS{%w=3bnv<49w+ znc)=5n1`n`P z{;h%U%n@aw`^{@wxSP#e-MC*CmgO@;DG~}iw_}*P|6%7*>#4;PaR~_xbz(O_+jq$J z0BoUTDD;PZ4xET#`%k+5Qq@48iHWvD^I>Nq$mzy~3`t1i z4a|0Xii`3$vi{w38hGOgHEhB!>kc4BsJa#!KcEQrl$Wab7HfTb=g;MjI5}YT22o!4 z?7z>zN;ShCtQ};_Iy8?AUv4VT@0EXHVwdC9GsSofbR5D05SYU+2yVFd;S-ND2EPcO zG;t`3GT2q<-*dx7<{SM7A3siaF*a>7)KZn{G`ga#2)I0N4KrP5Eayg8nzDD$;m>G|spqxb~Du zb%X-+@In^*@qHeY;jrZlBF(b>6k(E{h7_w>B@qLmu#ffG>N9n2+ggwvp@6|?!5q%6 zVN}x0aV9_450%RxTY!NAewKkQR^;7IFKb`(Od4w?=B&SBYv|@?(LK;b=>cH2lc%QR z2lrYhfwS5+NMaT0WK_TSKKA`nG<^8EI5zNu>$38^5mNaYg;sAt*)RZ$soWQ^L66*B z;_aS3RPDcy(bH4l@wYNZWt(ZW{<;&GOZfQ&R9o|p=EEr%m(On@!E^xClRbU+cgkF( zfl|%l8VR>}IJnJtQ-pa;&t9kO|`mL0DpSOw7mAF?&`Q?SWCDX}8 z)Z6h2SQ%+;+mSvCEvKz^Q$ov^+)$v>Xx3oGPgGaG8STP^7RbdJ5Lf_6u2d3!kB;Q6 zlgk#Ay%}VhkRDe_&~H^|S7#Q~can=!>N>tRcn7sz4=VL*1X8> z`*>hjWBInT<3!L|%&B@87$)1nnTKI)LRIBT_J-WGeCf9U?NVcRl0Cw!L+o}WG#ALn zw$l3AHqgBqxMODg2_iqU8N$SNJ>#dl(K4Zm}sTYqS9FZvbP_56bS zeIwS>2w$?WFuv6KZc^cwl5K`TYK2^-Qg%ZXg=MCpB|IneUSy?IP zN>H1w^wc`o^2p5)?QACWHIiyF^>!E&ym-V7AUS=8Rb}at@s`SEy&uv{A-4O_zR5JG zG~rlen_=Q}aVG^Wmfw1-4rfjS*||sg4I)J*ut(^EzI#dShWoRLzaw%1Kgy17$xN)3y=t*~ zv}v^z?(0(N9Z$uP*mR%DY)DuoZiXWhaxwKDRnpiX5{bK^O)s!7|{F4}s&38mCwF~)c7U7&`YmU>3Wjoe%?t!CbJqQz3 z2Dy`^@bcwxGxoIz&lT&1(|{Mbv;sz{V2eMWz2|PY%97~WAvT@JFps9Kj`-E>W(d@G zZ(xsqK#0-u33~wSI8kd49(L2`w}o8xcJpM=dY75^YXZ(FBEzY;;P3H{8P}d0b5x{* zp2i2c$`K|)}eJ^8OH5Y`}i-YtYG^C>NC}WyZItZv1P+xExq@CR8jhk;QjVnxalu- zDO`+iQ-pHeR2G`LZZa{6lm%=0ON}}B>uxP%x=%4T;iA)@@2|B`>7?2h?NRP&jjYiQ zmyG~PT_7PjrJBjig@~WB>bZ1geoAb55_|skQkOfO12g2I>|&Fk78n^kM_wQ7 zH@~)LU1*}NPds{3>>ksM?Y5Bfhs>&@wlMTm6v8#{mqVK*gA}alN)3}!L_3ux3aVT zSz)((4-Io!X{3|XBPoH3VZ37lIwSA?a^f?%h+W%lH}o4!;fJ*79~3%c(NfK$hzENz2XM*a|lz zY3~Yu=w4xJ!caJl={|V6D&qT_u(FV&NftNzUPtQo-DaiK;l$-lCaKARm%8ZT@tS#R zrr=j8T%+n>X`lJ%+U-HjW{PncleuS>zn;MNQMR)+U=&?GnokAmbx&(KbjW+hD8DjX zvf4=|lVMNyTZ7}O*8=A&go1m*#^=8{AMLbL!O>jLnZ-SpU+jvqx3|dl2RH>3;rdHn zEfZp)VNvQQ6X$mR;QgOv<1+KJXXN|#UN)4dl@$w}-p^6tez2u1TX*eP=#iFq&nnw| zQY~LRleSm%UnhBPipLyb>b5FuCZpnM;*MP+nS?K27J9W(^c-ctPhFAe!R$AKMrC(S ziPG|JNy6AvOMq8kVeFM76CrQDQlU=)m0yXy^lm{+s-ui5|Xlkx! z(>Qi(8%Uy3Qc?-Ehy)T?fVE#kIa!5?3&EVEH{DJO)T`bK?`GnlOCjqs@=h&tv>2L< zi}CPf^Mtt(pj#DqW*1s=6*+37rLsl+WoHa#x{{+$|JY$(f+r9a#jiH|z@TvQB!pIB zYLr5@`QF*uNd((i?}rvl^nJR?$u?a%A?CEkQ^K*YUbdDMtV>Uo0@7Qz?YkoYG4lL- z?3dQi61L%9Tz85jIV;Y+t70(QD3xWexzy5~uEnA9S!%~u;~y!NwnI7I5a}c>WgaL+ zd~xBy*|^F;F=jqVpnCAWtmEMgm=QkxmDw%e^xMD#V&^7jWcKZS`YeD2eYkyepU=y? zlwOp}YozGo%Nqy4CNS(GFJR^^nINzFLQ#lRX%XRLO-{5sLdrLGiD`)W-M*oUc+<(lndQ`b#eOjX zTgCZpL4}QXf2`-`tE)y$>Jpd(SeS7!cRt;pn*`s1jx~lK8-L0;06!OdHmsK~9Vq5% z7Ed3Y(yek$_abZ|>K62TvOCOfc0yOj$zIw_xbDB4M*+z$gXF)vPA6Fq#dh=1Ii|Dg zGYe#))_jO~FLOYvDYV~b_mMh(DHzOOy1;1#QxoiL#B~ztb+|T~d{>mup3O@%N$yW9 zb&Le-5r4YH7&qtXUfFXTMkh;h1O(#|sw~mBzAfLc1Y|Zc|4zO#^|dTh;AL^%UFRiP zB2VLTQc&=IA=^1N7s;1CSqQf4FCvMd=F#KW@3OMYjmJlnYFTlG^N2Y=B;9N_<}>fh z;F1f=do$NDQ^bkl>@r)PEx8E;N)ayD;^WI=o!7q3*040SNg9-vDl zt4a9{Uhk9eiQ%N0#x&)%EDDZtOL+J~`dFFTfTOv}{he0)n+HX^=>}^^>p|QMpPop> z^^X!4g{(nQdgUk6Tb$}gl_uC{U0w=C1LO5YOnf}^Mn7^@Md_WV$0~HNE0Zx@L{2*H z&ZDBSE(ZNlZOR{`S&(+UOLc57GY@X;F1}i#dqDs)FM(*vkBLxH4){OOw zREJj;oq_hkN(_O?kM>)-S6c$Qg*J;;+iZvwXe z*E!3wYd%U$4)$%l3BKo+G}F5FbtittLFbvxj~nAG|Bex6XX>XJ(Z_xngsAHrG;Wt& zOazUTMk*MMB;88SZk`7gTo0|IT&H^y~>*S`W0HvdXMKGr`idFLuk0otbc_o$_m zbWVy&Tg_QjS(I4%8a!W zeD#~O8guQVxFhzkC~|NSZUi_?rlsARdA}&}klDb+Q}c_xK1d@*Yz>%}glwFTStjd~ z6iySMKjRW8@+d7@Tsvxeo&@`kzkd%9e~Iy0g2DsZgXDE8kBG=m-oo_ipcKO#>c^~o(4p%M_fZlh$`g%iC>7Rp-dLH880^V%WZ6w zGIJKXa8_kketmMMM$s5W9s(fS_P^XpisOft%WwRfSwf8F%N_q8-ph~vALZEa*l*U? z5Udu4_Bmd6fNTUH9TjNN|IOj{Z_4K*6lcwqGQMn zHWhe&i^{vY)2Z87bQo65jQWwiat*`jr@*!HuPfL3fm8$>Kll9A(YyJD>T|dZ0*bem z@on%?D-O|kb87ALqEDdp)(oX?cbU$Oi~%B}^v z1%+i(PRr!f&n%jGrqNg!sJY>GqOPv-Y+bePt693bz)_J@G54iGKKqp}=@)os88dYM z*AnSE72I@I%o})}b49p7ev|BVHPA3np1<6NGje+8a~?RL zyK*aoPRywTj~X?A$AWHr79ACpX6+HGw&}0(l*vuNZhAv>NafkU>T34tLiy;I4-)j< z?w{%d-k^S9?W(g3Iw2_!ydK?OB2kqa>)d^O<&iJiVvU>!fHoe`UFEU!>D12cMx4U6 zjkm*2Gw!$)ZwNg0bTa6?(+2Bs$*RtM2j;Gr%n;LQ9|+U{95e}Rhoqf`Hqg1UKrqBs zD-DSyRilmsC$^!n{%tg}Mk8yq7#y%U3}E6Tetqo2|G=8||NkuJ7llB5Y@jX~GlP7d VmrHxui*8Ud_H^}gS?83{1OPxi5r6;y literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p3-04-customer-balance.png b/alshuyukh-accounting/docs/screenshots/p3-04-customer-balance.png new file mode 100644 index 0000000000000000000000000000000000000000..7bcd8dc41457178148ba0b541af5ba92494faa5e GIT binary patch literal 56296 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 literal 0 HcmV?d00001 From f6725119565450db288954d6f5f1fa6e2f6a57e7 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 20:13:04 +0000 Subject: [PATCH 04/10] Add Phase 4: sales, purchases, and payments - Six commercial documents share one implementation: sales quotes, invoices, returns (credit notes); purchase orders, invoices, returns (debit notes). Legal documents are numbered gap-free at issue - Each invoice and return posts its journal entry in the same transaction (AR/AP tagged with the party, revenue or inventory and expense per line, VAT output or input) - Server-side calculation module: line rounding, document VAT rounded once per category (ZATCA-consistent), VAT-inclusive prices, line discounts; the form previews totals through a calculate endpoint - Tax rates are data with effective dates; the current standard rate is seeded and can be changed without code - Returns are prorated from the original lines; the last return takes exactly what is left, so a full return nets the invoice to zero - Payments with configurable methods, allocation across invoices, advances, refunds, and voiding; settlement drives invoice status - Credit limit check, party snapshot, invoice kind (standard/simplified), cancellation by reversal, quote and PO conversion - Issued documents, their lines, and payments are protected by triggers - Fixes found while testing: decimal.js isPositive() is true for zero, pg DATE values shifted by the server time zone, section tabs resolving against the full URL, product form picking the wrong default unit - 46 new tests (169 total) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RiHbDZ5HpzN6NRCMJmydEq --- alshuyukh-accounting/README.md | 117 ++- alshuyukh-accounting/apps/api/src/app.ts | 2 + .../0009_sales_purchases_payments.sql | 808 ++++++++++++++++++ alshuyukh-accounting/apps/api/src/db/pool.ts | 3 + .../apps/api/src/modules/accounting/engine.ts | 4 +- .../apps/api/src/modules/accounting/setup.ts | 25 + .../api/src/modules/audit/audit.service.ts | 2 +- .../apps/api/src/modules/documents/calc.ts | 142 +++ .../apps/api/src/modules/documents/drafts.ts | 474 ++++++++++ .../apps/api/src/modules/documents/kinds.ts | 59 ++ .../api/src/modules/documents/payments.ts | 206 +++++ .../apps/api/src/modules/documents/posting.ts | 274 ++++++ .../apps/api/src/modules/documents/routes.ts | 357 ++++++++ .../api/src/modules/parties/parties.routes.ts | 7 +- .../src/modules/products/products.routes.ts | 5 +- .../apps/api/src/modules/rbac/catalog.ts | 8 +- .../apps/api/test/calc.test.ts | 66 ++ .../apps/api/test/commerce-helpers.ts | 52 ++ .../apps/api/test/payments.test.ts | 193 +++++ .../apps/api/test/purchases.test.ts | 108 +++ .../apps/api/test/sales.test.ts | 250 ++++++ alshuyukh-accounting/apps/web/src/App.tsx | 5 +- alshuyukh-accounting/apps/web/src/Shell.tsx | 4 +- .../src/pages/documents/DocumentDetail.tsx | 204 +++++ .../web/src/pages/documents/DocumentForm.tsx | 178 ++++ .../web/src/pages/documents/DocumentList.tsx | 71 ++ .../apps/web/src/pages/documents/Payments.tsx | 142 +++ .../apps/web/src/pages/documents/Section.tsx | 40 + .../apps/web/src/pages/documents/Totals.tsx | 18 + .../apps/web/src/pages/documents/config.ts | 53 ++ .../apps/web/src/pages/products/Products.tsx | 2 +- alshuyukh-accounting/apps/web/src/styles.css | 20 + .../docs/screenshots/p4-01-invoice-form.png | Bin 0 -> 92329 bytes .../docs/screenshots/p4-02-invoice-issued.png | Bin 0 -> 91121 bytes .../screenshots/p4-03-invoice-journal.png | Bin 0 -> 72465 bytes .../docs/screenshots/p4-04-invoice-paid.png | Bin 0 -> 94328 bytes .../docs/screenshots/p4-05-credit-note.png | Bin 0 -> 91014 bytes .../screenshots/p4-06-supplier-payment.png | Bin 0 -> 77735 bytes 38 files changed, 3882 insertions(+), 17 deletions(-) create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0009_sales_purchases_payments.sql create mode 100644 alshuyukh-accounting/apps/api/src/modules/documents/calc.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/documents/kinds.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/documents/payments.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/documents/posting.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/documents/routes.ts create mode 100644 alshuyukh-accounting/apps/api/test/calc.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/commerce-helpers.ts create mode 100644 alshuyukh-accounting/apps/api/test/payments.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/purchases.test.ts create mode 100644 alshuyukh-accounting/apps/api/test/sales.test.ts create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/DocumentDetail.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/DocumentList.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/Payments.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/Section.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/Totals.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/documents/config.ts create mode 100644 alshuyukh-accounting/docs/screenshots/p4-01-invoice-form.png create mode 100644 alshuyukh-accounting/docs/screenshots/p4-02-invoice-issued.png create mode 100644 alshuyukh-accounting/docs/screenshots/p4-03-invoice-journal.png create mode 100644 alshuyukh-accounting/docs/screenshots/p4-04-invoice-paid.png create mode 100644 alshuyukh-accounting/docs/screenshots/p4-05-credit-note.png create mode 100644 alshuyukh-accounting/docs/screenshots/p4-06-supplier-payment.png diff --git a/alshuyukh-accounting/README.md b/alshuyukh-accounting/README.md index 68fd5b1b5404..b8268f3fa343 100644 --- a/alshuyukh-accounting/README.md +++ b/alshuyukh-accounting/README.md @@ -7,6 +7,7 @@ - المرحلة 1 مكتملة: تأسيس المشروع، قاعدة البيانات، المصادقة، تعدد المنشآت، الصلاحيات. - المرحلة 2 مكتملة: دليل الحسابات، المحرك المحاسبي، القيود اليومية، السنوات والفترات المالية. - المرحلة 3 مكتملة: العملاء، الموردون، المنتجات والخدمات، الوحدات والتصنيفات. +- المرحلة 4 مكتملة: عروض الأسعار، فواتير المبيعات والمشتريات، المرتجعات، أوامر الشراء، المدفوعات، نسب الضريبة. بقية الوحدات تظهر في الواجهة بعلامة «قريبًا» دون أي بيانات تجريبية. @@ -49,6 +50,12 @@ alshuyukh-accounting/ │ │ │ │ ├── chart-template.ts # دليل الحسابات الافتراضي │ │ │ │ ├── setup.ts # تجهيز الشركة: الدليل + السنة المالية │ │ │ │ └── *.routes.ts # الحسابات، القيود، السنوات، ميزان المراجعة +│ │ │ ├── documents/ # المستندات التجارية والمدفوعات (المرحلة 4) +│ │ │ │ ├── calc.ts # حساب السطور والضريبة (دوال نقية) +│ │ │ │ ├── kinds.ts # إعدادات المستندات الستة +│ │ │ │ ├── drafts.ts # المسودات والمرتجعات +│ │ │ │ ├── posting.ts # الإصدار والقيود والإلغاء والتحويل +│ │ │ │ └── payments.ts # المقبوضات والمدفوعات والتخصيص │ │ │ ├── parties/ # العملاء والموردون (تنفيذ مشترك) │ │ │ ├── products/ # المنتجات، الوحدات، التصنيفات │ │ │ ├── companies/ # الشركات، الفروع، المستودعات @@ -347,6 +354,99 @@ erDiagram `POST /api/journal-entries` يقبل `customerId` أو `supplierId` على كل سطر. +## المرحلة 4: المبيعات والمشتريات والمدفوعات + +### المستندات + +ستة مستندات بتنفيذ واحد (`documents/kinds.ts`)، لكل منها جداوله وصلاحياته وترقيمه: + +| المستند | الجدول | الترقيم | دورة الحياة | قيد محاسبي | +|---|---|---|---|---| +| عرض سعر | `sales_quotes` | `QT-` عند الإنشاء | مسودة ← مرسل ← مقبول/مرفوض ← محوّل لفاتورة | لا | +| فاتورة مبيعات | `sales_invoices` | `INV-` عند الإصدار | مسودة ← صادرة ← مدفوعة جزئيًا ← مدفوعة / مرتجعة / ملغاة | نعم | +| مرتجع مبيعات (إشعار دائن) | `sales_returns` | `CN-` عند الإصدار | مسودة ← صادر ← ملغى | نعم | +| أمر شراء | `purchase_orders` | `PO-` عند الإنشاء | مسودة ← معتمد ← محوّل لفاتورة | لا | +| فاتورة مشتريات | `purchase_invoices` | `PINV-` عند الترحيل | مسودة ← مرحّلة ← مدفوعة جزئيًا ← مدفوعة / مرتجعة / ملغاة | نعم | +| مرتجع مشتريات (إشعار مدين) | `purchase_returns` | `DN-` عند الإصدار | مسودة ← صادر ← ملغى | نعم | + +أرقام الفواتير والمرتجعات تُسند عند الإصدار فقط، فتبقى متسلسلة بلا فجوات (المسودات بلا رقم). + +**أسماء الحقول:** المواصفة تسمي حقلي الفاتورة `invoice_number` و `invoice_date`. استخدمت `doc_number` و `doc_date` في الجداول الستة لأن التنفيذ مشترك، وتظهر في الـ API باسم `number` و `date`. بقية الحقول بنفس أسماء المواصفة: `subtotal`، `discount_total`، `taxable_amount`، `tax_amount`، `total`، `paid_amount`، `remaining_amount`، `status`، `branch_id`، `warehouse_id`، `currency`. + +### القيود التلقائية + +| المستند | مدين | دائن | +|---|---|---| +| فاتورة مبيعات | العملاء (موسوم بالعميل) = الإجمالي | المبيعات (أو حساب المنتج) = الصافي، ضريبة المخرجات = الضريبة | +| مرتجع مبيعات | المبيعات، ضريبة المخرجات | العملاء (موسوم) | +| فاتورة مشتريات | المخزون للسلع المتتبعة، أو حساب الشراء للمنتج، أو حساب السطر؛ ضريبة المدخلات | الموردون (موسوم بالمورد) | +| مرتجع مشتريات | الموردون (موسوم) | الحسابات نفسها، ضريبة المدخلات | +| سند قبض من عميل | حساب طريقة الدفع (صندوق / بنك) | العملاء (موسوم) | +| استرداد لعميل | العملاء (موسوم) | حساب طريقة الدفع | +| سند صرف لمورد | الموردون (موسوم) | حساب طريقة الدفع | +| استرداد من مورد | حساب طريقة الدفع | الموردون (موسوم) | + +- المستند وقيده يُحفظان في المعاملة نفسها؛ فشل أي منهما يلغي الاثنين. +- القيد مصدره `SYSTEM` ومرتبط بالمستند (`reference_type`، `reference_id`)، فلا يُعكس يدويًا. +- يُخزَّن حساب الترحيل على كل سطر عند الإصدار للمراجعة. +- **تكلفة البضاعة المباعة وحركة المخزون غير مطبقتين بعد** — المرحلة 5. + +### الحساب والضريبة (`documents/calc.ts`) + +- كل المبالغ تُحسب في الخادم. الواجهة تطلب `POST /api//calculate` لعرض الإجماليات أثناء الكتابة، ولا تحسب الضريبة بنفسها. +- كمية وسعر الوحدة حتى 4 خانات؛ مبالغ السطر تُقرَّب لخانتين. +- **ضريبة المستند = تقريب (مجموع الصافي لكل فئة ونسبة × النسبة)** مرة واحدة، متوافقًا مع ZATCA. ضريبة السطر للعرض فقط وقد تختلف عن المجموع بهللة. +- الأسعار الشاملة للضريبة: الصافي = تقريب((الكمية × السعر − الخصم) ÷ (1 + النسبة)). كل المبالغ المخزنة غير شاملة. +- **النسبة ليست في الكود:** جدول `tax_rates` بتواريخ سريان. النسبة الأساسية الحالية (15%) تُنشأ افتراضيًا، وإضافة نسبة جديدة بتاريخ تُغلق السابقة تلقائيًا، وكل مستند يأخذ النسبة السارية في تاريخه. الفئات `Z` و `E` و `O` نسبتها صفر. +- الخصم على مستوى السطر (مبلغ أو نسبة). الخصم المُدخل يُحفظ كما هو (`discount_basis`) لإعادة الحساب بدقة. + +### المرتجعات + +- تُنشأ من الفاتورة الأصلية بتحديد السطور والكميات، ولا يمكن إرجاع أكثر من الكمية المتبقية. +- المبالغ تُوزَّع بنسبة الكمية. إرجاع آخر كمية من السطر يأخذ الباقي بالضبط، وآخر مرتجع للفاتورة يأخذ الضريبة المتبقية بالضبط، فيصفّر الإرجاع الكامل الفاتورة دون فروق تقريب. +- يُطبَّق المرتجع على الفاتورة حتى مبلغها المفتوح، والزيادة (إن كانت الفاتورة مدفوعة) تبقى مستحقة للعميل وتُسترد بسند صرف مخصص على المرتجع. + +### المدفوعات + +- طرق الدفع قابلة للتخصيص، وكل طريقة مربوطة بحساب أصل. المنشأة تبدأ بـ: نقدًا، تحويل بنكي، بطاقة، STC Pay، تمارا. يمكن ربط تمارا بحساب تسوية مستقل. +- السند يُخصَّص على فاتورة أو أكثر. **التخصيص لا ينشئ قيدًا**، لأن رصيد العميل في الدفتر صحيح أصلًا؛ هو ربط للمطابقة فقط. المبلغ غير المخصص يبقى دفعة مقدمة على حساب الطرف ويمكن تخصيصه لاحقًا. +- لا يمكن تعديل السند. يُلغى السند فيُعكس قيده وتُفك تخصيصاته وتُعاد حالة الفواتير. +- حالة الفاتورة (صادرة / مدفوعة جزئيًا / مدفوعة / مرتجعة) تُشتق دائمًا من المدفوع والمرتجع. + +### قواعد أخرى + +- **حد الائتمان:** لا تصدر فاتورة ترفع رصيد العميل في الدفتر فوق حده. +- **نوع الفاتورة الضريبية:** فاتورة ضريبية (`STANDARD`) إذا كان للعميل رقم ضريبي، وإلا مبسطة (`SIMPLIFIED`). +- **لقطة الطرف:** اسم العميل أو المورد ورقمه الضريبي وعنوانه الوطني تُنسخ في المستند عند الإصدار. +- **الإلغاء:** يعكس القيد بتاريخ المستند. لا يُلغى مستند عليه دفعات أو مرتجعات، ولا إذا كانت فترته مقفلة. +- **الحماية في قاعدة البيانات:** بعد الإصدار لا يتغير إلا الحالة وحقول التسوية، والسطور للقراءة فقط، ولا حذف للمستندات أو السندات. +- لا يُحذف عميل أو مورد أو منتج مستخدم في مستند أو سند. + +### واجهات API (المرحلة 4) + +لكل مستند `` من: `sales-quotes`، `invoices`، `sales-returns`، `purchase-orders`، `purchase-invoices`، `purchase-returns`: + +| الطريقة | المسار | الوصف | +|---|---|---| +| GET | `/api/` (status، partyId، dateFrom، dateTo، open، search) | قائمة | +| GET | `/api//:id` | المستند مع السطور والدفعات والمرتجعات | +| POST | `/api//calculate` | حساب بدون حفظ | +| POST / PATCH / DELETE | `/api/`، `/api//:id` | المسودات | +| POST | `/api//:id/post` | إصدار / ترحيل (الفواتير والمرتجعات) | +| POST | `/api//:id/status` | حالة عرض السعر أو أمر الشراء | +| POST | `/api//:id/convert` | تحويل عرض أو أمر إلى مسودة فاتورة | +| POST | `/api//:id/cancel` | إلغاء مع السبب | + +| الطريقة | المسار | الصلاحية | +|---|---|---| +| GET / POST | `/api/payments`، `/api/payments/:id` | `payment.view` / `payment.create` | +| POST | `/api/payments/:id/allocations` | `payment.create` | +| POST | `/api/payments/:id/void` | `payment.void` | +| GET / POST / PATCH | `/api/payment-methods` | `payment.view` / `settings.manage` | +| GET / POST | `/api/tax-rates` | `invoice.view` / `tax.manage` | + +صلاحيات المستندات: المبيعات `invoice.view/create/edit/delete/post/cancel`، والمشتريات `purchase.view/create/post/cancel`. + ## تدفق المصادقة 1. **التسجيل** ينشئ في معاملة واحدة: المستخدم، المنشأة، إعداداتها (SAR، Asia/Riyadh)، الشركة الافتراضية، الفرع الرئيسي، المستودع الرئيسي، العضوية بدور `TENANT_OWNER`، وسجل تدقيق. @@ -386,7 +486,7 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق ## الاختبارات -123 اختبار تكامل على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: +169 اختبارًا (وحدة وتكامل) على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: | الملف | ما يغطيه | |---|---| @@ -399,6 +499,10 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق | `fiscal-years.test.ts` | إنشاء السنوات ومنع التداخل؛ السنة القصيرة؛ قفل شهر البداية؛ إقفال السنة بربح وبخسارة وبلا حركة؛ منع الترحيل وإعادة الفتح بعد الإقفال؛ اشتراط إقفال السنوات السابقة | | `parties.test.ts` | لكل من العملاء والموردين: الترقيم التلقائي وتخطي الرموز المأخوذة؛ التحقق من الرقم الضريبي والسجل والهوية وصيغة العنوان الوطني والعنوان الافتراضي؛ البحث؛ التعديل واستبدال العناوين والإيقاف؛ حساب الرقابة؛ الرصيد من القيود الموسومة ومنع الحذف بعدها؛ العزل بما فيه وسم قيد بطرف من منشأة أخرى؛ الصلاحيات لكل دور؛ سجل التدقيق | | `products.test.ts` | الوحدات الافتراضية؛ الوحدات والتصنيفات المتداخلة؛ السلع والخدمات؛ الأسعار بأربع خانات؛ التحقق والتكرار؛ الحسابات البديلة؛ البحث بالباركود؛ الحذف الناعم؛ رفض وحدات منشأة أخرى؛ الصلاحيات | +| `calc.test.ts` | مثال 1000 + 150؛ الخصم قبل الضريبة؛ التقريب مرة واحدة لكل فئة؛ الأسعار الشاملة؛ أربع خانات؛ الفئات الصفرية والمعفاة؛ رفض السطور غير الصحيحة | +| `sales.test.ts` | قيد الفاتورة المطلوب (AR 1150 / Sales 1000 / VAT 150)؛ الفاتورة المبسطة؛ الترقيم؛ الحساب دون حفظ؛ الأسعار الشاملة؛ منع التعديل بعد الإصدار عبر API و SQL؛ حد الائتمان؛ تغيير نسبة الضريبة بتاريخ؛ الإلغاء ومنعه مع الدفعات؛ المرتجع الجزئي ثم الكامل بلا فروق تقريب؛ إلغاء المرتجع؛ عروض الأسعار والتحويل؛ الصلاحيات؛ العزل؛ منع حذف المستخدَم؛ توازن الميزان | +| `payments.test.ts` | التحصيل الكامل والجزئي؛ سند واحد لعدة فواتير؛ الدفعة المقدمة ثم التخصيص؛ رفض التخصيص الزائد أو لطرف آخر أو لنوع خاطئ دون أثر؛ إلغاء السند؛ الاسترداد بعد المرتجع؛ منع تعديل السند في قاعدة البيانات؛ دفع المورد؛ طرق الدفع وحساب التسوية؛ الصلاحيات؛ العزل | +| `purchases.test.ts` | قيد فاتورة الشراء (مخزون + ضريبة مدخلات / موردون)؛ رقم فاتورة المورد مرة واحدة؛ سطور المصروفات والمعفاة؛ اشتراط حساب للخدمات؛ مرتجع المشتريات؛ الإلغاء؛ أوامر الشراء والتحويل؛ الصلاحيات | | `companies.test.ts` | القيم السعودية الافتراضية، التحقق، التكرار، الحذف الناعم، ربط المستودع بفرع شركة أخرى، تجاهل `tenant_id` في جسم الطلب، العضوية في منشأتين والتبديل | ## ملاحظات وقرارات تصميم @@ -418,11 +522,18 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق - نقل ملكية المنشأة. - Rate limiting يعتمد على ذاكرة العملية؛ في الإنتاج بأكثر من نسخة يلزم Redis. - لم تُطبَّق المصادقة الثنائية (2FA). +- **المرحلة 4:** + - تكلفة البضاعة المباعة وحركات المخزون عند البيع والشراء والإرجاع — المرحلة 5. + - الخصم على مستوى المستند (لا السطر) غير مطبق. + - تعدد العملات: المستندات بعملة الشركة فقط. + - بعد ربط ZATCA (المرحلة 8) يجب منع إلغاء الفاتورة المُبلَّغة والاكتفاء بإشعار دائن، وإضافة رمز سبب الإعفاء للسطور `Z` و `E` و `O`. + - طباعة الفاتورة وإرسالها بالبريد، ورمز QR — المرحلة 8. + - تقادم الذمم وكشف الحساب — المرحلة 7. + - تجاوز حد الائتمان بصلاحية خاصة غير متاح. - **المرحلة 3:** - استيراد العملاء والموردين والمنتجات من ملف Excel/CSV. - - منع حذف طرف أو منتج مستخدم في فواتير أو حركات مخزون (يُضاف مع المرحلتين 4 و 5؛ حاليًا يُمنع حذف الطرف إذا كان عليه قيود). + - منع حذف منتج له حركات مخزون — مع المرحلة 5 (المستندات والسندات مطبقة). - متغيرات المنتج (مقاس، لون) وقوائم الأسعار — مع المرحلة 5. - - التحقق من حد الائتمان عند إصدار الفاتورة — المرحلة 4. - **المرحلة 2:** - تعدد العملات وأسعار الصرف: القيود حاليًا بعملة الشركة فقط. - إعادة فتح سنة مالية مقفلة (عكس قيد الإقفال) غير مدعومة. diff --git a/alshuyukh-accounting/apps/api/src/app.ts b/alshuyukh-accounting/apps/api/src/app.ts index d4b17e0d0dae..a992a154e8bf 100644 --- a/alshuyukh-accounting/apps/api/src/app.ts +++ b/alshuyukh-accounting/apps/api/src/app.ts @@ -14,6 +14,7 @@ import trialBalanceRoutes from './modules/accounting/trial-balance.routes.js'; import auditRoutes from './modules/audit/audit.routes.js'; import { CUSTOMER, SUPPLIER, partyRoutes } from './modules/parties/parties.routes.js'; import productsRoutes from './modules/products/products.routes.js'; +import documentsModule from './modules/documents/routes.js'; import authRoutes from './modules/auth/auth.routes.js'; import companiesRoutes from './modules/companies/companies.routes.js'; import rbacRoutes from './modules/rbac/rbac.routes.js'; @@ -96,6 +97,7 @@ export async function buildApp({ env, pool, logger = true }: BuildOptions): Prom await api.register(partyRoutes(CUSTOMER)); await api.register(partyRoutes(SUPPLIER)); await api.register(productsRoutes); + await api.register(documentsModule); }, { prefix: '/api' }); return app; diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0009_sales_purchases_payments.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0009_sales_purchases_payments.sql new file mode 100644 index 000000000000..d6f5b6adca75 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0009_sales_purchases_payments.sql @@ -0,0 +1,808 @@ +-- 0009 — Sales, purchases, payments, tax rates. +-- +-- GENERATED from one template for the six commercial documents (sales quotes, +-- invoices, returns; purchase orders, invoices, returns), which share the +-- same header/line layout. Edit with care and keep the six in sync. +-- +-- Money: NUMERIC(18,2). Quantities and unit prices: NUMERIC(18,4). +-- All line amounts are stored VAT-exclusive (see documents/calc.ts). +-- After a document leaves DRAFT, a trigger allows only its status and +-- settlement columns to change; its lines become read-only. + +-- Documents reference warehouses within the same company. +ALTER TABLE warehouses ADD CONSTRAINT warehouses_id_company_uq UNIQUE (id, company_id); + +-- Tax rates ------------------------------------------------------------------------ +-- Only the standard category (S) needs a rate row. Z, E and O are 0 by definition. +CREATE TABLE tax_rates ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + vat_category char(1) NOT NULL DEFAULT 'S' CHECK (vat_category = 'S'), + name_ar text NOT NULL, + rate numeric(7,4) NOT NULL CHECK (rate > 0 AND rate < 1), + effective_from date NOT NULL, + effective_to date, + is_active boolean NOT NULL DEFAULT true, + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT tax_rates_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT tax_rates_dates_ck CHECK (effective_to IS NULL OR effective_to >= effective_from), + CONSTRAINT tax_rates_no_overlap EXCLUDE USING gist ( + company_id WITH =, vat_category WITH =, + daterange(effective_from, effective_to, '[]') WITH && + ) WHERE (is_active) +); +CREATE TRIGGER tax_rates_updated_at BEFORE UPDATE ON tax_rates FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Payment methods ------------------------------------------------------------------ +CREATE TABLE payment_methods ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + code text NOT NULL CHECK (code ~ '^[A-Z][A-Z0-9_]{1,30}$'), + name_ar text NOT NULL CHECK (length(btrim(name_ar)) BETWEEN 2 AND 100), + method_type text NOT NULL CHECK (method_type IN ('CASH', 'BANK', 'CARD', 'STC_PAY', 'TAMARA', 'OTHER')), + -- Cash, bank, or clearing account the money goes through. + account_id uuid NOT NULL, + is_active boolean NOT NULL DEFAULT true, + sort_order integer NOT NULL DEFAULT 0, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT payment_methods_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT payment_methods_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT payment_methods_code_uq UNIQUE (company_id, code), + CONSTRAINT payment_methods_id_company_uq UNIQUE (id, company_id) +); +CREATE TRIGGER payment_methods_updated_at BEFORE UPDATE ON payment_methods FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +-- Document guards -------------------------------------------------------------------- +-- TG_ARGV: the columns that may still change after the document leaves DRAFT. +CREATE OR REPLACE FUNCTION commercial_doc_guard() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + mutable text[] := TG_ARGV || ARRAY['updated_at']; +BEGIN + IF TG_OP = 'DELETE' THEN + RAISE EXCEPTION 'documents cannot be deleted' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF TG_OP = 'INSERT' THEN + RETURN NEW; + END IF; + IF OLD.deleted_at IS NOT NULL THEN + RAISE EXCEPTION 'a deleted document cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF OLD.status = 'CANCELLED' THEN + RAISE EXCEPTION 'a cancelled document cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF OLD.status <> 'DRAFT' THEN + IF NEW.status = 'DRAFT' THEN + RAISE EXCEPTION 'an issued document cannot return to draft' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF (to_jsonb(NEW) - mutable) IS DISTINCT FROM (to_jsonb(OLD) - mutable) THEN + RAISE EXCEPTION 'an issued document cannot be modified; cancel it or issue a return' USING ERRCODE = 'insufficient_privilege'; + END IF; + ELSIF NEW.deleted_at IS NOT NULL AND NEW.status <> 'DRAFT' THEN + RAISE EXCEPTION 'only drafts can be deleted' USING ERRCODE = 'insufficient_privilege'; + END IF; + RETURN NEW; +END; +$$; + +-- TG_ARGV[0]: the header table. Lines change only while the header is a draft. +CREATE OR REPLACE FUNCTION commercial_item_guard() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + doc_status text; + doc_id uuid := CASE WHEN TG_OP = 'DELETE' THEN OLD.document_id ELSE NEW.document_id END; +BEGIN + EXECUTE format('SELECT status FROM %I WHERE id = $1', TG_ARGV[0]) INTO doc_status USING doc_id; + IF doc_status IS DISTINCT FROM 'DRAFT' THEN + RAISE EXCEPTION 'lines of an issued document cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF TG_OP = 'UPDATE' AND NEW.document_id <> OLD.document_id THEN + RAISE EXCEPTION 'a line cannot move to another document' USING ERRCODE = 'insufficient_privilege'; + END IF; + RETURN CASE WHEN TG_OP = 'DELETE' THEN OLD ELSE NEW END; +END; +$$; + + +-- sales_quotes ----------------------------------------------------------------------- +CREATE TABLE sales_quotes ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + warehouse_id uuid, + -- Assigned at creation. + doc_number text, + doc_date date NOT NULL, + customer_id uuid NOT NULL, + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + prices_include_vat boolean NOT NULL DEFAULT false, + subtotal numeric(18,2) NOT NULL DEFAULT 0 CHECK (subtotal >= 0), + discount_total numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_total >= 0), + taxable_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (taxable_amount >= 0), + tax_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (tax_amount >= 0), + total numeric(18,2) NOT NULL DEFAULT 0 CHECK (total >= 0), + valid_until date, + converted_invoice_id uuid, + notes text, + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'SENT', 'ACCEPTED', 'REJECTED', 'CONVERTED', 'CANCELLED')), + -- Copy of the customer's name, VAT number and address at issue time. + party_snapshot jsonb, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + issued_by uuid REFERENCES users (id), + issued_at timestamptz, + cancelled_by uuid REFERENCES users (id), + cancelled_at timestamptz, + cancel_reason text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT sales_quotes_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT sales_quotes_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT sales_quotes_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT sales_quotes_customer_fk FOREIGN KEY (customer_id, company_id) REFERENCES customers (id, company_id), + CONSTRAINT sales_quotes_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT sales_quotes_id_company_uq UNIQUE (id, company_id), + CONSTRAINT sales_quotes_totals_ck CHECK (taxable_amount = subtotal - discount_total AND total = taxable_amount + tax_amount), + CONSTRAINT sales_quotes_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT'), + CONSTRAINT sales_quotes_number_ck CHECK (doc_number IS NOT NULL) +); +CREATE UNIQUE INDEX sales_quotes_number_uq ON sales_quotes (company_id, doc_number) WHERE doc_number IS NOT NULL; +CREATE INDEX sales_quotes_company_date_idx ON sales_quotes (tenant_id, company_id, doc_date DESC) WHERE deleted_at IS NULL; +CREATE INDEX sales_quotes_party_idx ON sales_quotes (customer_id, status); +CREATE INDEX sales_quotes_status_idx ON sales_quotes (company_id, status); +CREATE TRIGGER sales_quotes_updated_at BEFORE UPDATE ON sales_quotes FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +CREATE TRIGGER sales_quotes_guard BEFORE INSERT OR UPDATE OR DELETE ON sales_quotes + FOR EACH ROW EXECUTE FUNCTION commercial_doc_guard('status', 'converted_invoice_id', 'cancelled_by', 'cancelled_at', 'cancel_reason'); + +CREATE TABLE sales_quote_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + document_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + product_id uuid NOT NULL, + account_id uuid, + description text, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_id uuid, + unit_price numeric(18,4) NOT NULL CHECK (unit_price >= 0), + gross_amount numeric(18,2) NOT NULL CHECK (gross_amount >= 0), + -- Discount as entered (in the document's price basis); used to recalculate. + discount_basis numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_basis >= 0), + discount_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_amount >= 0), + net_amount numeric(18,2) NOT NULL CHECK (net_amount >= 0), + vat_category char(1) NOT NULL CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + vat_rate numeric(7,4) NOT NULL CHECK (vat_rate >= 0 AND vat_rate < 1), + vat_amount numeric(18,2) NOT NULL CHECK (vat_amount >= 0), + total_amount numeric(18,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT sales_quote_items_document_fk FOREIGN KEY (document_id, company_id) REFERENCES sales_quotes (id, company_id), + CONSTRAINT sales_quote_items_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT sales_quote_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT sales_quote_items_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT sales_quote_items_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT sales_quote_items_line_uq UNIQUE (document_id, line_no), + CONSTRAINT sales_quote_items_id_company_uq UNIQUE (id, company_id), + CONSTRAINT sales_quote_items_amounts_ck CHECK (net_amount = gross_amount - discount_amount AND total_amount = net_amount + vat_amount) +); +CREATE INDEX sales_quote_items_document_idx ON sales_quote_items (document_id); +CREATE INDEX sales_quote_items_product_idx ON sales_quote_items (product_id) WHERE product_id IS NOT NULL; +CREATE TRIGGER sales_quote_items_guard BEFORE INSERT OR UPDATE OR DELETE ON sales_quote_items + FOR EACH ROW EXECUTE FUNCTION commercial_item_guard('sales_quotes'); + +-- sales_invoices ----------------------------------------------------------------------- +CREATE TABLE sales_invoices ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + warehouse_id uuid, + -- Assigned at issue; gap-free per company. + doc_number text, + doc_date date NOT NULL, + customer_id uuid NOT NULL, + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + prices_include_vat boolean NOT NULL DEFAULT false, + subtotal numeric(18,2) NOT NULL DEFAULT 0 CHECK (subtotal >= 0), + discount_total numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_total >= 0), + taxable_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (taxable_amount >= 0), + tax_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (tax_amount >= 0), + total numeric(18,2) NOT NULL DEFAULT 0 CHECK (total >= 0), + due_date date, + -- ZATCA: STANDARD (B2B, buyer VAT number) or SIMPLIFIED (B2C). + invoice_kind text NOT NULL DEFAULT 'STANDARD' CHECK (invoice_kind IN ('STANDARD', 'SIMPLIFIED')), + paid_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (paid_amount >= 0), + returned_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (returned_amount >= 0), + remaining_amount numeric(18,2) GENERATED ALWAYS AS (total - paid_amount - returned_amount) STORED CHECK (remaining_amount >= 0), + source_quote_id uuid, + notes text, + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'ISSUED', 'PARTIALLY_PAID', 'PAID', 'CANCELLED', 'RETURNED')), + -- Copy of the customer's name, VAT number and address at issue time. + party_snapshot jsonb, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + issued_by uuid REFERENCES users (id), + issued_at timestamptz, + cancelled_by uuid REFERENCES users (id), + cancelled_at timestamptz, + cancel_reason text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT sales_invoices_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT sales_invoices_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT sales_invoices_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT sales_invoices_customer_fk FOREIGN KEY (customer_id, company_id) REFERENCES customers (id, company_id), + CONSTRAINT sales_invoices_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT sales_invoices_id_company_uq UNIQUE (id, company_id), + CONSTRAINT sales_invoices_totals_ck CHECK (taxable_amount = subtotal - discount_total AND total = taxable_amount + tax_amount), + CONSTRAINT sales_invoices_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT'), + CONSTRAINT sales_invoices_issued_ck CHECK (status IN ('DRAFT') OR (doc_number IS NOT NULL AND journal_entry_id IS NOT NULL AND issued_at IS NOT NULL AND total > 0)) +); +CREATE UNIQUE INDEX sales_invoices_number_uq ON sales_invoices (company_id, doc_number) WHERE doc_number IS NOT NULL; +CREATE INDEX sales_invoices_company_date_idx ON sales_invoices (tenant_id, company_id, doc_date DESC) WHERE deleted_at IS NULL; +CREATE INDEX sales_invoices_party_idx ON sales_invoices (customer_id, status); +CREATE INDEX sales_invoices_status_idx ON sales_invoices (company_id, status); +CREATE TRIGGER sales_invoices_updated_at BEFORE UPDATE ON sales_invoices FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +CREATE TRIGGER sales_invoices_guard BEFORE INSERT OR UPDATE OR DELETE ON sales_invoices + FOR EACH ROW EXECUTE FUNCTION commercial_doc_guard('status', 'paid_amount', 'returned_amount', 'remaining_amount', 'cancelled_by', 'cancelled_at', 'cancel_reason'); + +CREATE TABLE sales_invoice_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + document_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + product_id uuid NOT NULL, + account_id uuid, + description text, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_id uuid, + unit_price numeric(18,4) NOT NULL CHECK (unit_price >= 0), + gross_amount numeric(18,2) NOT NULL CHECK (gross_amount >= 0), + -- Discount as entered (in the document's price basis); used to recalculate. + discount_basis numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_basis >= 0), + discount_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_amount >= 0), + net_amount numeric(18,2) NOT NULL CHECK (net_amount >= 0), + vat_category char(1) NOT NULL CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + vat_rate numeric(7,4) NOT NULL CHECK (vat_rate >= 0 AND vat_rate < 1), + vat_amount numeric(18,2) NOT NULL CHECK (vat_amount >= 0), + total_amount numeric(18,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT sales_invoice_items_document_fk FOREIGN KEY (document_id, company_id) REFERENCES sales_invoices (id, company_id), + CONSTRAINT sales_invoice_items_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT sales_invoice_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT sales_invoice_items_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT sales_invoice_items_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT sales_invoice_items_line_uq UNIQUE (document_id, line_no), + CONSTRAINT sales_invoice_items_id_company_uq UNIQUE (id, company_id), + CONSTRAINT sales_invoice_items_amounts_ck CHECK (net_amount = gross_amount - discount_amount AND total_amount = net_amount + vat_amount) +); +CREATE INDEX sales_invoice_items_document_idx ON sales_invoice_items (document_id); +CREATE INDEX sales_invoice_items_product_idx ON sales_invoice_items (product_id) WHERE product_id IS NOT NULL; +CREATE TRIGGER sales_invoice_items_guard BEFORE INSERT OR UPDATE OR DELETE ON sales_invoice_items + FOR EACH ROW EXECUTE FUNCTION commercial_item_guard('sales_invoices'); + +-- sales_returns ----------------------------------------------------------------------- +CREATE TABLE sales_returns ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + warehouse_id uuid, + -- Assigned at issue; gap-free per company. + doc_number text, + doc_date date NOT NULL, + customer_id uuid NOT NULL, + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + prices_include_vat boolean NOT NULL DEFAULT false, + subtotal numeric(18,2) NOT NULL DEFAULT 0 CHECK (subtotal >= 0), + discount_total numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_total >= 0), + taxable_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (taxable_amount >= 0), + tax_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (tax_amount >= 0), + total numeric(18,2) NOT NULL DEFAULT 0 CHECK (total >= 0), + original_invoice_id uuid NOT NULL, + reason text NOT NULL CHECK (length(btrim(reason)) BETWEEN 3 AND 500), + -- Part of the credit applied against the original invoice; the rest is owed to the customer. + applied_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (applied_amount >= 0), + refunded_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (refunded_amount >= 0), + remaining_amount numeric(18,2) GENERATED ALWAYS AS (total - applied_amount - refunded_amount) STORED CHECK (remaining_amount >= 0), + notes text, + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'ISSUED', 'CANCELLED')), + -- Copy of the customer's name, VAT number and address at issue time. + party_snapshot jsonb, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + issued_by uuid REFERENCES users (id), + issued_at timestamptz, + cancelled_by uuid REFERENCES users (id), + cancelled_at timestamptz, + cancel_reason text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT sales_returns_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT sales_returns_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT sales_returns_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT sales_returns_customer_fk FOREIGN KEY (customer_id, company_id) REFERENCES customers (id, company_id), + CONSTRAINT sales_returns_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT sales_returns_id_company_uq UNIQUE (id, company_id), + CONSTRAINT sales_returns_totals_ck CHECK (taxable_amount = subtotal - discount_total AND total = taxable_amount + tax_amount), + CONSTRAINT sales_returns_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT'), + CONSTRAINT sales_returns_issued_ck CHECK (status IN ('DRAFT') OR (doc_number IS NOT NULL AND journal_entry_id IS NOT NULL AND issued_at IS NOT NULL AND total > 0)) +); +ALTER TABLE sales_returns ADD CONSTRAINT sales_returns_original_fk FOREIGN KEY (original_invoice_id, company_id) REFERENCES sales_invoices (id, company_id); +CREATE INDEX sales_returns_original_idx ON sales_returns (original_invoice_id); +CREATE UNIQUE INDEX sales_returns_number_uq ON sales_returns (company_id, doc_number) WHERE doc_number IS NOT NULL; +CREATE INDEX sales_returns_company_date_idx ON sales_returns (tenant_id, company_id, doc_date DESC) WHERE deleted_at IS NULL; +CREATE INDEX sales_returns_party_idx ON sales_returns (customer_id, status); +CREATE INDEX sales_returns_status_idx ON sales_returns (company_id, status); +CREATE TRIGGER sales_returns_updated_at BEFORE UPDATE ON sales_returns FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +CREATE TRIGGER sales_returns_guard BEFORE INSERT OR UPDATE OR DELETE ON sales_returns + FOR EACH ROW EXECUTE FUNCTION commercial_doc_guard('status', 'refunded_amount', 'remaining_amount', 'cancelled_by', 'cancelled_at', 'cancel_reason'); + +CREATE TABLE sales_return_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + document_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + -- The original invoice line being returned. + source_item_id uuid NOT NULL, + product_id uuid NOT NULL, + account_id uuid, + description text, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_id uuid, + unit_price numeric(18,4) NOT NULL CHECK (unit_price >= 0), + gross_amount numeric(18,2) NOT NULL CHECK (gross_amount >= 0), + -- Discount as entered (in the document's price basis); used to recalculate. + discount_basis numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_basis >= 0), + discount_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_amount >= 0), + net_amount numeric(18,2) NOT NULL CHECK (net_amount >= 0), + vat_category char(1) NOT NULL CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + vat_rate numeric(7,4) NOT NULL CHECK (vat_rate >= 0 AND vat_rate < 1), + vat_amount numeric(18,2) NOT NULL CHECK (vat_amount >= 0), + total_amount numeric(18,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT sales_return_items_document_fk FOREIGN KEY (document_id, company_id) REFERENCES sales_returns (id, company_id), + CONSTRAINT sales_return_items_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT sales_return_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT sales_return_items_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT sales_return_items_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT sales_return_items_line_uq UNIQUE (document_id, line_no), + CONSTRAINT sales_return_items_id_company_uq UNIQUE (id, company_id), + CONSTRAINT sales_return_items_amounts_ck CHECK (net_amount = gross_amount - discount_amount AND total_amount = net_amount + vat_amount) +); +CREATE INDEX sales_return_items_document_idx ON sales_return_items (document_id); +CREATE INDEX sales_return_items_product_idx ON sales_return_items (product_id) WHERE product_id IS NOT NULL; +CREATE TRIGGER sales_return_items_guard BEFORE INSERT OR UPDATE OR DELETE ON sales_return_items + FOR EACH ROW EXECUTE FUNCTION commercial_item_guard('sales_returns'); + +-- purchase_orders ----------------------------------------------------------------------- +CREATE TABLE purchase_orders ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + warehouse_id uuid, + -- Assigned at creation. + doc_number text, + doc_date date NOT NULL, + supplier_id uuid NOT NULL, + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + prices_include_vat boolean NOT NULL DEFAULT false, + subtotal numeric(18,2) NOT NULL DEFAULT 0 CHECK (subtotal >= 0), + discount_total numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_total >= 0), + taxable_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (taxable_amount >= 0), + tax_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (tax_amount >= 0), + total numeric(18,2) NOT NULL DEFAULT 0 CHECK (total >= 0), + expected_date date, + converted_invoice_id uuid, + notes text, + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'APPROVED', 'CONVERTED', 'CANCELLED')), + -- Copy of the supplier's name, VAT number and address at issue time. + party_snapshot jsonb, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + issued_by uuid REFERENCES users (id), + issued_at timestamptz, + cancelled_by uuid REFERENCES users (id), + cancelled_at timestamptz, + cancel_reason text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT purchase_orders_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT purchase_orders_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT purchase_orders_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT purchase_orders_supplier_fk FOREIGN KEY (supplier_id, company_id) REFERENCES suppliers (id, company_id), + CONSTRAINT purchase_orders_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT purchase_orders_id_company_uq UNIQUE (id, company_id), + CONSTRAINT purchase_orders_totals_ck CHECK (taxable_amount = subtotal - discount_total AND total = taxable_amount + tax_amount), + CONSTRAINT purchase_orders_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT'), + CONSTRAINT purchase_orders_number_ck CHECK (doc_number IS NOT NULL) +); +CREATE UNIQUE INDEX purchase_orders_number_uq ON purchase_orders (company_id, doc_number) WHERE doc_number IS NOT NULL; +CREATE INDEX purchase_orders_company_date_idx ON purchase_orders (tenant_id, company_id, doc_date DESC) WHERE deleted_at IS NULL; +CREATE INDEX purchase_orders_party_idx ON purchase_orders (supplier_id, status); +CREATE INDEX purchase_orders_status_idx ON purchase_orders (company_id, status); +CREATE TRIGGER purchase_orders_updated_at BEFORE UPDATE ON purchase_orders FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +CREATE TRIGGER purchase_orders_guard BEFORE INSERT OR UPDATE OR DELETE ON purchase_orders + FOR EACH ROW EXECUTE FUNCTION commercial_doc_guard('status', 'converted_invoice_id', 'cancelled_by', 'cancelled_at', 'cancel_reason'); + +CREATE TABLE purchase_order_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + document_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + -- Purchase lines name a product, an account (expense/asset), or both. + product_id uuid, + account_id uuid, + description text, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_id uuid, + unit_price numeric(18,4) NOT NULL CHECK (unit_price >= 0), + gross_amount numeric(18,2) NOT NULL CHECK (gross_amount >= 0), + -- Discount as entered (in the document's price basis); used to recalculate. + discount_basis numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_basis >= 0), + discount_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_amount >= 0), + net_amount numeric(18,2) NOT NULL CHECK (net_amount >= 0), + vat_category char(1) NOT NULL CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + vat_rate numeric(7,4) NOT NULL CHECK (vat_rate >= 0 AND vat_rate < 1), + vat_amount numeric(18,2) NOT NULL CHECK (vat_amount >= 0), + total_amount numeric(18,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT purchase_order_items_document_fk FOREIGN KEY (document_id, company_id) REFERENCES purchase_orders (id, company_id), + CONSTRAINT purchase_order_items_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT purchase_order_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT purchase_order_items_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT purchase_order_items_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT purchase_order_items_line_uq UNIQUE (document_id, line_no), + CONSTRAINT purchase_order_items_id_company_uq UNIQUE (id, company_id), + CONSTRAINT purchase_order_items_amounts_ck CHECK (net_amount = gross_amount - discount_amount AND total_amount = net_amount + vat_amount), + CONSTRAINT purchase_order_items_target_ck CHECK (product_id IS NOT NULL OR account_id IS NOT NULL) +); +CREATE INDEX purchase_order_items_document_idx ON purchase_order_items (document_id); +CREATE INDEX purchase_order_items_product_idx ON purchase_order_items (product_id) WHERE product_id IS NOT NULL; +CREATE TRIGGER purchase_order_items_guard BEFORE INSERT OR UPDATE OR DELETE ON purchase_order_items + FOR EACH ROW EXECUTE FUNCTION commercial_item_guard('purchase_orders'); + +-- purchase_invoices ----------------------------------------------------------------------- +CREATE TABLE purchase_invoices ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + warehouse_id uuid, + -- Assigned at issue; gap-free per company. + doc_number text, + doc_date date NOT NULL, + supplier_id uuid NOT NULL, + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + prices_include_vat boolean NOT NULL DEFAULT false, + subtotal numeric(18,2) NOT NULL DEFAULT 0 CHECK (subtotal >= 0), + discount_total numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_total >= 0), + taxable_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (taxable_amount >= 0), + tax_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (tax_amount >= 0), + total numeric(18,2) NOT NULL DEFAULT 0 CHECK (total >= 0), + due_date date, + supplier_invoice_number text CHECK (length(btrim(supplier_invoice_number)) BETWEEN 1 AND 60), + paid_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (paid_amount >= 0), + returned_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (returned_amount >= 0), + remaining_amount numeric(18,2) GENERATED ALWAYS AS (total - paid_amount - returned_amount) STORED CHECK (remaining_amount >= 0), + source_order_id uuid, + notes text, + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'POSTED', 'PARTIALLY_PAID', 'PAID', 'CANCELLED', 'RETURNED')), + -- Copy of the supplier's name, VAT number and address at issue time. + party_snapshot jsonb, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + issued_by uuid REFERENCES users (id), + issued_at timestamptz, + cancelled_by uuid REFERENCES users (id), + cancelled_at timestamptz, + cancel_reason text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT purchase_invoices_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT purchase_invoices_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT purchase_invoices_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT purchase_invoices_supplier_fk FOREIGN KEY (supplier_id, company_id) REFERENCES suppliers (id, company_id), + CONSTRAINT purchase_invoices_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT purchase_invoices_id_company_uq UNIQUE (id, company_id), + CONSTRAINT purchase_invoices_totals_ck CHECK (taxable_amount = subtotal - discount_total AND total = taxable_amount + tax_amount), + CONSTRAINT purchase_invoices_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT'), + CONSTRAINT purchase_invoices_issued_ck CHECK (status IN ('DRAFT') OR (doc_number IS NOT NULL AND journal_entry_id IS NOT NULL AND issued_at IS NOT NULL AND total > 0)) +); +CREATE UNIQUE INDEX purchase_invoices_number_uq ON purchase_invoices (company_id, doc_number) WHERE doc_number IS NOT NULL; +CREATE INDEX purchase_invoices_company_date_idx ON purchase_invoices (tenant_id, company_id, doc_date DESC) WHERE deleted_at IS NULL; +CREATE INDEX purchase_invoices_party_idx ON purchase_invoices (supplier_id, status); +CREATE INDEX purchase_invoices_status_idx ON purchase_invoices (company_id, status); +CREATE TRIGGER purchase_invoices_updated_at BEFORE UPDATE ON purchase_invoices FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +CREATE TRIGGER purchase_invoices_guard BEFORE INSERT OR UPDATE OR DELETE ON purchase_invoices + FOR EACH ROW EXECUTE FUNCTION commercial_doc_guard('status', 'paid_amount', 'returned_amount', 'remaining_amount', 'cancelled_by', 'cancelled_at', 'cancel_reason'); + +CREATE TABLE purchase_invoice_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + document_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + -- Purchase lines name a product, an account (expense/asset), or both. + product_id uuid, + account_id uuid, + description text, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_id uuid, + unit_price numeric(18,4) NOT NULL CHECK (unit_price >= 0), + gross_amount numeric(18,2) NOT NULL CHECK (gross_amount >= 0), + -- Discount as entered (in the document's price basis); used to recalculate. + discount_basis numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_basis >= 0), + discount_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_amount >= 0), + net_amount numeric(18,2) NOT NULL CHECK (net_amount >= 0), + vat_category char(1) NOT NULL CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + vat_rate numeric(7,4) NOT NULL CHECK (vat_rate >= 0 AND vat_rate < 1), + vat_amount numeric(18,2) NOT NULL CHECK (vat_amount >= 0), + total_amount numeric(18,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT purchase_invoice_items_document_fk FOREIGN KEY (document_id, company_id) REFERENCES purchase_invoices (id, company_id), + CONSTRAINT purchase_invoice_items_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT purchase_invoice_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT purchase_invoice_items_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT purchase_invoice_items_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT purchase_invoice_items_line_uq UNIQUE (document_id, line_no), + CONSTRAINT purchase_invoice_items_id_company_uq UNIQUE (id, company_id), + CONSTRAINT purchase_invoice_items_amounts_ck CHECK (net_amount = gross_amount - discount_amount AND total_amount = net_amount + vat_amount), + CONSTRAINT purchase_invoice_items_target_ck CHECK (product_id IS NOT NULL OR account_id IS NOT NULL) +); +CREATE INDEX purchase_invoice_items_document_idx ON purchase_invoice_items (document_id); +CREATE INDEX purchase_invoice_items_product_idx ON purchase_invoice_items (product_id) WHERE product_id IS NOT NULL; +CREATE TRIGGER purchase_invoice_items_guard BEFORE INSERT OR UPDATE OR DELETE ON purchase_invoice_items + FOR EACH ROW EXECUTE FUNCTION commercial_item_guard('purchase_invoices'); + +-- purchase_returns ----------------------------------------------------------------------- +CREATE TABLE purchase_returns ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + warehouse_id uuid, + -- Assigned at issue; gap-free per company. + doc_number text, + doc_date date NOT NULL, + supplier_id uuid NOT NULL, + currency char(3) NOT NULL DEFAULT 'SAR' CHECK (currency ~ '^[A-Z]{3}$'), + prices_include_vat boolean NOT NULL DEFAULT false, + subtotal numeric(18,2) NOT NULL DEFAULT 0 CHECK (subtotal >= 0), + discount_total numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_total >= 0), + taxable_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (taxable_amount >= 0), + tax_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (tax_amount >= 0), + total numeric(18,2) NOT NULL DEFAULT 0 CHECK (total >= 0), + original_invoice_id uuid NOT NULL, + reason text NOT NULL CHECK (length(btrim(reason)) BETWEEN 3 AND 500), + applied_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (applied_amount >= 0), + refunded_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (refunded_amount >= 0), + remaining_amount numeric(18,2) GENERATED ALWAYS AS (total - applied_amount - refunded_amount) STORED CHECK (remaining_amount >= 0), + notes text, + status text NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT', 'ISSUED', 'CANCELLED')), + -- Copy of the supplier's name, VAT number and address at issue time. + party_snapshot jsonb, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + issued_by uuid REFERENCES users (id), + issued_at timestamptz, + cancelled_by uuid REFERENCES users (id), + cancelled_at timestamptz, + cancel_reason text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + deleted_at timestamptz, + CONSTRAINT purchase_returns_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT purchase_returns_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT purchase_returns_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT purchase_returns_supplier_fk FOREIGN KEY (supplier_id, company_id) REFERENCES suppliers (id, company_id), + CONSTRAINT purchase_returns_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT purchase_returns_id_company_uq UNIQUE (id, company_id), + CONSTRAINT purchase_returns_totals_ck CHECK (taxable_amount = subtotal - discount_total AND total = taxable_amount + tax_amount), + CONSTRAINT purchase_returns_soft_delete_ck CHECK (deleted_at IS NULL OR status = 'DRAFT'), + CONSTRAINT purchase_returns_issued_ck CHECK (status IN ('DRAFT') OR (doc_number IS NOT NULL AND journal_entry_id IS NOT NULL AND issued_at IS NOT NULL AND total > 0)) +); +ALTER TABLE purchase_returns ADD CONSTRAINT purchase_returns_original_fk FOREIGN KEY (original_invoice_id, company_id) REFERENCES purchase_invoices (id, company_id); +CREATE INDEX purchase_returns_original_idx ON purchase_returns (original_invoice_id); +CREATE UNIQUE INDEX purchase_returns_number_uq ON purchase_returns (company_id, doc_number) WHERE doc_number IS NOT NULL; +CREATE INDEX purchase_returns_company_date_idx ON purchase_returns (tenant_id, company_id, doc_date DESC) WHERE deleted_at IS NULL; +CREATE INDEX purchase_returns_party_idx ON purchase_returns (supplier_id, status); +CREATE INDEX purchase_returns_status_idx ON purchase_returns (company_id, status); +CREATE TRIGGER purchase_returns_updated_at BEFORE UPDATE ON purchase_returns FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +CREATE TRIGGER purchase_returns_guard BEFORE INSERT OR UPDATE OR DELETE ON purchase_returns + FOR EACH ROW EXECUTE FUNCTION commercial_doc_guard('status', 'refunded_amount', 'remaining_amount', 'cancelled_by', 'cancelled_at', 'cancel_reason'); + +CREATE TABLE purchase_return_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + document_id uuid NOT NULL, + line_no smallint NOT NULL CHECK (line_no BETWEEN 1 AND 1000), + -- The original invoice line being returned. + source_item_id uuid NOT NULL, + -- Purchase lines name a product, an account (expense/asset), or both. + product_id uuid, + account_id uuid, + description text, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_id uuid, + unit_price numeric(18,4) NOT NULL CHECK (unit_price >= 0), + gross_amount numeric(18,2) NOT NULL CHECK (gross_amount >= 0), + -- Discount as entered (in the document's price basis); used to recalculate. + discount_basis numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_basis >= 0), + discount_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (discount_amount >= 0), + net_amount numeric(18,2) NOT NULL CHECK (net_amount >= 0), + vat_category char(1) NOT NULL CHECK (vat_category IN ('S', 'Z', 'E', 'O')), + vat_rate numeric(7,4) NOT NULL CHECK (vat_rate >= 0 AND vat_rate < 1), + vat_amount numeric(18,2) NOT NULL CHECK (vat_amount >= 0), + total_amount numeric(18,2) NOT NULL CHECK (total_amount >= 0), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT purchase_return_items_document_fk FOREIGN KEY (document_id, company_id) REFERENCES purchase_returns (id, company_id), + CONSTRAINT purchase_return_items_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT purchase_return_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT purchase_return_items_account_fk FOREIGN KEY (account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT purchase_return_items_unit_fk FOREIGN KEY (unit_id, company_id) REFERENCES units (id, company_id), + CONSTRAINT purchase_return_items_line_uq UNIQUE (document_id, line_no), + CONSTRAINT purchase_return_items_id_company_uq UNIQUE (id, company_id), + CONSTRAINT purchase_return_items_amounts_ck CHECK (net_amount = gross_amount - discount_amount AND total_amount = net_amount + vat_amount), + CONSTRAINT purchase_return_items_target_ck CHECK (product_id IS NOT NULL OR account_id IS NOT NULL) +); +CREATE INDEX purchase_return_items_document_idx ON purchase_return_items (document_id); +CREATE INDEX purchase_return_items_product_idx ON purchase_return_items (product_id) WHERE product_id IS NOT NULL; +CREATE TRIGGER purchase_return_items_guard BEFORE INSERT OR UPDATE OR DELETE ON purchase_return_items + FOR EACH ROW EXECUTE FUNCTION commercial_item_guard('purchase_returns'); + +ALTER TABLE sales_return_items ADD CONSTRAINT sales_return_items_source_fk + FOREIGN KEY (source_item_id, company_id) REFERENCES sales_invoice_items (id, company_id); +CREATE INDEX sales_return_items_source_idx ON sales_return_items (source_item_id); +ALTER TABLE purchase_return_items ADD CONSTRAINT purchase_return_items_source_fk + FOREIGN KEY (source_item_id, company_id) REFERENCES purchase_invoice_items (id, company_id); +CREATE INDEX purchase_return_items_source_idx ON purchase_return_items (source_item_id); + +-- Conversion links +ALTER TABLE sales_quotes ADD CONSTRAINT sales_quotes_converted_fk + FOREIGN KEY (converted_invoice_id, company_id) REFERENCES sales_invoices (id, company_id); +ALTER TABLE sales_invoices ADD CONSTRAINT sales_invoices_quote_fk + FOREIGN KEY (source_quote_id, company_id) REFERENCES sales_quotes (id, company_id); +ALTER TABLE purchase_orders ADD CONSTRAINT purchase_orders_converted_fk + FOREIGN KEY (converted_invoice_id, company_id) REFERENCES purchase_invoices (id, company_id); +ALTER TABLE purchase_invoices ADD CONSTRAINT purchase_invoices_order_fk + FOREIGN KEY (source_order_id, company_id) REFERENCES purchase_orders (id, company_id); + +-- A supplier's invoice number is recorded once per supplier. +CREATE UNIQUE INDEX purchase_invoices_supplier_number_uq ON purchase_invoices (supplier_id, supplier_invoice_number) + WHERE supplier_invoice_number IS NOT NULL AND status <> 'CANCELLED' AND deleted_at IS NULL; + +-- Payments --------------------------------------------------------------------------- +CREATE TABLE payments ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + branch_id uuid, + payment_number text NOT NULL, + -- RECEIPT: money in. DISBURSEMENT: money out. + direction text NOT NULL CHECK (direction IN ('RECEIPT', 'DISBURSEMENT')), + customer_id uuid, + supplier_id uuid, + payment_date date NOT NULL, + method_id uuid NOT NULL, + amount numeric(18,2) NOT NULL CHECK (amount > 0), + allocated_amount numeric(18,2) NOT NULL DEFAULT 0 CHECK (allocated_amount >= 0), + unallocated_amount numeric(18,2) GENERATED ALWAYS AS (amount - allocated_amount) STORED CHECK (unallocated_amount >= 0), + reference text, + notes text, + status text NOT NULL DEFAULT 'POSTED' CHECK (status IN ('POSTED', 'VOIDED')), + journal_entry_id uuid NOT NULL, + voided_by uuid REFERENCES users (id), + voided_at timestamptz, + void_reason text, + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT payments_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT payments_branch_fk FOREIGN KEY (branch_id, company_id) REFERENCES branches (id, company_id), + CONSTRAINT payments_customer_fk FOREIGN KEY (customer_id, company_id) REFERENCES customers (id, company_id), + CONSTRAINT payments_supplier_fk FOREIGN KEY (supplier_id, company_id) REFERENCES suppliers (id, company_id), + CONSTRAINT payments_method_fk FOREIGN KEY (method_id, company_id) REFERENCES payment_methods (id, company_id), + CONSTRAINT payments_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT payments_one_party_ck CHECK ((customer_id IS NULL) <> (supplier_id IS NULL)), + CONSTRAINT payments_id_company_uq UNIQUE (id, company_id) +); +CREATE UNIQUE INDEX payments_number_uq ON payments (company_id, payment_number); +CREATE INDEX payments_company_date_idx ON payments (tenant_id, company_id, payment_date DESC); +CREATE INDEX payments_customer_idx ON payments (customer_id) WHERE customer_id IS NOT NULL; +CREATE INDEX payments_supplier_idx ON payments (supplier_id) WHERE supplier_id IS NOT NULL; +CREATE TRIGGER payments_updated_at BEFORE UPDATE ON payments FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE OR REPLACE FUNCTION payments_guard() RETURNS trigger +LANGUAGE plpgsql AS $$ +DECLARE + mutable text[] := ARRAY['status', 'allocated_amount', 'unallocated_amount', 'voided_by', 'voided_at', 'void_reason', 'updated_at']; +BEGIN + IF TG_OP = 'DELETE' THEN + RAISE EXCEPTION 'payments cannot be deleted; void them instead' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF OLD.status = 'VOIDED' THEN + RAISE EXCEPTION 'a voided payment cannot be changed' USING ERRCODE = 'insufficient_privilege'; + END IF; + IF (to_jsonb(NEW) - mutable) IS DISTINCT FROM (to_jsonb(OLD) - mutable) THEN + RAISE EXCEPTION 'a payment cannot be modified; void it and record a new one' USING ERRCODE = 'insufficient_privilege'; + END IF; + RETURN NEW; +END; +$$; +CREATE TRIGGER payments_guard BEFORE UPDATE OR DELETE ON payments FOR EACH ROW EXECUTE FUNCTION payments_guard(); + +CREATE TABLE payment_allocations ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + payment_id uuid NOT NULL, + sales_invoice_id uuid, + sales_return_id uuid, + purchase_invoice_id uuid, + purchase_return_id uuid, + amount numeric(18,2) NOT NULL CHECK (amount > 0), + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + -- Set when the payment is voided; reversed allocations no longer count. + reversed_at timestamptz, + CONSTRAINT payment_allocations_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT payment_allocations_payment_fk FOREIGN KEY (payment_id, company_id) REFERENCES payments (id, company_id), + CONSTRAINT payment_allocations_si_fk FOREIGN KEY (sales_invoice_id, company_id) REFERENCES sales_invoices (id, company_id), + CONSTRAINT payment_allocations_sr_fk FOREIGN KEY (sales_return_id, company_id) REFERENCES sales_returns (id, company_id), + CONSTRAINT payment_allocations_pi_fk FOREIGN KEY (purchase_invoice_id, company_id) REFERENCES purchase_invoices (id, company_id), + CONSTRAINT payment_allocations_pr_fk FOREIGN KEY (purchase_return_id, company_id) REFERENCES purchase_returns (id, company_id), + CONSTRAINT payment_allocations_one_target_ck CHECK (num_nonnulls(sales_invoice_id, sales_return_id, purchase_invoice_id, purchase_return_id) = 1) +); +CREATE INDEX payment_allocations_payment_idx ON payment_allocations (payment_id); +CREATE INDEX payment_allocations_si_idx ON payment_allocations (sales_invoice_id) WHERE sales_invoice_id IS NOT NULL; +CREATE INDEX payment_allocations_sr_idx ON payment_allocations (sales_return_id) WHERE sales_return_id IS NOT NULL; +CREATE INDEX payment_allocations_pi_idx ON payment_allocations (purchase_invoice_id) WHERE purchase_invoice_id IS NOT NULL; +CREATE INDEX payment_allocations_pr_idx ON payment_allocations (purchase_return_id) WHERE purchase_return_id IS NOT NULL; + +-- Seed existing companies: the standard VAT rate and default payment methods. +-- New companies get the same seed from setupCompanyAccounting(). +INSERT INTO tax_rates (tenant_id, company_id, name_ar, rate, effective_from) +SELECT tenant_id, id, 'ضريبة القيمة المضافة - النسبة الأساسية', 0.15, DATE '2020-07-01' + FROM companies WHERE deleted_at IS NULL; + +INSERT INTO payment_methods (tenant_id, company_id, code, name_ar, method_type, account_id, sort_order) +SELECT c.tenant_id, c.id, m.code, m.name_ar, m.method_type, a.id, m.sort_order + FROM companies c + CROSS JOIN (VALUES ('CASH', 'نقدًا', 'CASH', 'CASH', 1), ('BANK', 'تحويل بنكي', 'BANK', 'BANK', 2), + ('CARD', 'بطاقة مدى / ائتمان', 'CARD', 'BANK', 3), ('STC_PAY', 'STC Pay', 'STC_PAY', 'BANK', 4), + ('TAMARA', 'تمارا', 'TAMARA', 'BANK', 5)) AS m(code, name_ar, method_type, account_key, sort_order) + JOIN accounts a ON a.company_id = c.id AND a.system_key = m.account_key AND a.deleted_at IS NULL + WHERE c.deleted_at IS NULL; + +-- Row-Level Security and privileges --------------------------------------------------- +DO $$ +DECLARE t text; +BEGIN + FOREACH t IN ARRAY ARRAY['tax_rates', 'payment_methods', 'payments', 'payment_allocations', + 'sales_quotes', 'sales_quote_items', 'sales_invoices', 'sales_invoice_items', 'sales_returns', 'sales_return_items', 'purchase_orders', 'purchase_order_items', 'purchase_invoices', 'purchase_invoice_items', 'purchase_returns', 'purchase_return_items'] LOOP + EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t); + EXECUTE format('CREATE POLICY %I ON %I USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id())', + t || '_isolation', t); + EXECUTE format('GRANT SELECT, INSERT, UPDATE ON %I TO alshuyukh_app', t); + END LOOP; +END +$$; +-- Draft lines are replaced with DELETE + INSERT; the item guard refuses that after issue. +GRANT DELETE ON sales_quote_items, sales_invoice_items, sales_return_items, purchase_order_items, purchase_invoice_items, purchase_return_items TO alshuyukh_app; diff --git a/alshuyukh-accounting/apps/api/src/db/pool.ts b/alshuyukh-accounting/apps/api/src/db/pool.ts index 9416a155d9b0..6cdb1af8f13c 100644 --- a/alshuyukh-accounting/apps/api/src/db/pool.ts +++ b/alshuyukh-accounting/apps/api/src/db/pool.ts @@ -14,3 +14,6 @@ export function createPool(connectionString: string): pg.Pool { pg.types.setTypeParser(pg.types.builtins.NUMERIC, (v) => v); // Return bigint (e.g. COUNT(*)) as string; callers convert explicitly. pg.types.setTypeParser(pg.types.builtins.INT8, (v) => v); +// Return DATE as 'YYYY-MM-DD' text. The default converts it to a JS Date in +// the server's local time zone, which can shift a calendar date by a day. +pg.types.setTypeParser(pg.types.builtins.DATE, (v) => v); diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts index 1f619bd03a22..25bc30d95e9a 100644 --- a/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/engine.ts @@ -342,12 +342,12 @@ export async function closeFiscalYear(db: Db, ctx: EngineContext, yearId: string if (balances.length) { const lines: LineInput[] = balances.map((b) => { const net = new Decimal(b.net); - return net.isPositive() ? { accountId: b.account_id, credit: toMoney(net) } : { accountId: b.account_id, debit: toMoney(net.abs()) }; + return net.greaterThan(0) ? { accountId: b.account_id, credit: toMoney(net) } : { accountId: b.account_id, debit: toMoney(net.abs()) }; }); // Positive total = expenses exceed revenue (a loss) → debit retained earnings. const result = sum(balances.map((b) => b.net)); if (!result.isZero()) { - lines.push(result.isPositive() ? { accountId: re.id, debit: toMoney(result) } : { accountId: re.id, credit: toMoney(result.abs()) }); + lines.push(result.greaterThan(0) ? { accountId: re.id, debit: toMoney(result) } : { accountId: re.id, credit: toMoney(result.abs()) }); } const closing = await postEntry(db, ctx, { companyId: year.company_id, entryDate: year.end_date, description: 'قيد إقفال السنة المالية', diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts index ce26ec3f6c3e..8bfa86b92a27 100644 --- a/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/setup.ts @@ -101,6 +101,30 @@ export async function seedDefaultUnits(db: Db, ref: CompanyRef): Promise { } } +/** Standard VAT rate (configurable later in tax settings) and default payment methods. */ +export async function seedTaxAndPayments(db: Db, ref: CompanyRef): Promise { + const hasRate = await db.query(`SELECT 1 FROM tax_rates WHERE company_id = $1 LIMIT 1`, [ref.companyId]); + if (!hasRate.rowCount) { + await db.query( + `INSERT INTO tax_rates (tenant_id, company_id, name_ar, rate, effective_from, created_by) + VALUES ($1, $2, 'ضريبة القيمة المضافة - النسبة الأساسية', 0.15, DATE '2020-07-01', $3)`, + [ref.tenantId, ref.companyId, ref.userId]); + } + const methods: [string, string, string, string, number][] = [ + ['CASH', 'نقدًا', 'CASH', 'CASH', 1], ['BANK', 'تحويل بنكي', 'BANK', 'BANK', 2], + ['CARD', 'بطاقة مدى / ائتمان', 'CARD', 'BANK', 3], ['STC_PAY', 'STC Pay', 'STC_PAY', 'BANK', 4], + ['TAMARA', 'تمارا', 'TAMARA', 'BANK', 5], + ]; + for (const [code, name, type, accountKey, sort] of methods) { + await db.query( + `INSERT INTO payment_methods (tenant_id, company_id, code, name_ar, method_type, account_id, sort_order) + SELECT $1, $2, $3, $4, $5, a.id, $7 FROM accounts a + WHERE a.company_id = $2 AND a.system_key = $6 AND a.deleted_at IS NULL + ON CONFLICT (company_id, code) DO NOTHING`, + [ref.tenantId, ref.companyId, code, name, type, accountKey, sort]); + } +} + /** * Prepares a new company for accounting: default chart and the current * fiscal year. Safe to call again; existing setup is left as is. @@ -108,6 +132,7 @@ export async function seedDefaultUnits(db: Db, ref: CompanyRef): Promise { export async function setupCompanyAccounting(db: Db, ref: CompanyRef, timezone = 'Asia/Riyadh') { const chartCreated = await seedDefaultChart(db, ref); await seedDefaultUnits(db, ref); + await seedTaxAndPayments(db, ref); let fiscalYearId: string | null = null; const hasYear = await db.query(`SELECT 1 FROM fiscal_years WHERE company_id = $1 LIMIT 1`, [ref.companyId]); if (!hasYear.rowCount) { diff --git a/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts b/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts index 4de16a43e589..721d32c11dc6 100644 --- a/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts +++ b/alshuyukh-accounting/apps/api/src/modules/audit/audit.service.ts @@ -5,7 +5,7 @@ export type AuditAction = | 'TENANT_SWITCH' | 'PASSWORD_CHANGE' | 'CREATE' | 'UPDATE' | 'DELETE' | 'SETTINGS_CHANGE' | 'PERMISSION_CHANGE' - | 'POST' | 'REVERSE' | 'CLOSE' | 'REOPEN'; + | 'POST' | 'REVERSE' | 'CLOSE' | 'REOPEN' | 'CANCEL' | 'PAYMENT' | 'VOID'; export interface AuditMeta { ip?: string | null; diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/calc.ts b/alshuyukh-accounting/apps/api/src/modules/documents/calc.ts new file mode 100644 index 000000000000..fba28e7b5905 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/documents/calc.ts @@ -0,0 +1,142 @@ +import { Decimal, toMoney } from '../../lib/money.js'; + +/** + * Line and document totals for every commercial document (quotes, invoices, + * returns, purchase orders and bills). Pure functions: no database access. + * + * Rounding (ZATCA-consistent): + * - Each line is rounded to 2 decimals: gross, discount, taxable (net). + * - Document VAT is computed once per (category, rate) group: + * round(sum of line taxable amounts × rate, 2) + * Line VAT amounts are informative and may differ from the document VAT + * by a halala; the document VAT is what is posted and reported. + * - When prices include VAT, the line taxable amount is + * round((qty × price − discount) / (1 + rate), 2) + * so all stored line amounts are VAT-exclusive. + */ + +export type VatCategory = 'S' | 'Z' | 'E' | 'O'; + +export interface CalcLineInput { + quantity: string; // up to 4 decimals + unitPrice: string; // up to 4 decimals, in the price basis of the document + discountAmount?: string; // in the price basis, up to 2 decimals + discountPercent?: string; // 0–100, up to 2 decimals + vatCategory: VatCategory; + vatRate: string; // fraction, e.g. "0.15" +} + +export interface CalcLine { + quantity: string; + unitPrice: string; + grossAmount: string; // VAT-exclusive, before discount + discountAmount: string; // VAT-exclusive + netAmount: string; // taxable amount + vatCategory: VatCategory; + vatRate: string; + vatAmount: string; // informative line VAT + totalAmount: string; // net + line VAT +} + +export interface CalcTotals { + subtotal: string; + discountTotal: string; + taxableAmount: string; + taxAmount: string; + total: string; + taxBreakdown: { vatCategory: VatCategory; vatRate: string; taxableAmount: string; taxAmount: string }[]; +} + +export class CalcError extends Error { + constructor(public readonly line: number, message: string) { + super(`Line ${line}: ${message}`); + } +} + +const round2 = (d: Decimal) => d.toDecimalPlaces(2, Decimal.ROUND_HALF_UP); + +export function calculateLine(input: CalcLineInput, pricesIncludeVat: boolean, lineNo: number): CalcLine { + const qty = new Decimal(input.quantity); + const price = new Decimal(input.unitPrice); + const rate = new Decimal(input.vatRate); + if (!qty.greaterThan(0)) throw new CalcError(lineNo, 'quantity must be greater than zero'); + if (price.isNegative()) throw new CalcError(lineNo, 'unit price cannot be negative'); + if (rate.isNegative() || rate.greaterThan(1)) throw new CalcError(lineNo, 'invalid VAT rate'); + if (input.vatCategory !== 'S' && !rate.isZero()) throw new CalcError(lineNo, `VAT category ${input.vatCategory} must have a zero rate`); + if (input.vatCategory === 'S' && rate.isZero()) throw new CalcError(lineNo, 'standard-rated lines need a positive VAT rate'); + + const grossBasis = round2(qty.times(price)); + let discountBasis = new Decimal(0); + if (input.discountAmount && input.discountPercent) throw new CalcError(lineNo, 'use either a discount amount or a discount percent'); + if (input.discountAmount) discountBasis = new Decimal(input.discountAmount); + if (input.discountPercent) { + const pct = new Decimal(input.discountPercent); + if (pct.isNegative() || pct.greaterThan(100)) throw new CalcError(lineNo, 'discount percent must be between 0 and 100'); + discountBasis = round2(grossBasis.times(pct).dividedBy(100)); + } + if (discountBasis.isNegative()) throw new CalcError(lineNo, 'discount cannot be negative'); + if (discountBasis.greaterThan(grossBasis)) throw new CalcError(lineNo, 'discount cannot exceed the line amount'); + + let gross: Decimal; + let discount: Decimal; + let net: Decimal; + if (pricesIncludeVat) { + const divisor = rate.plus(1); + net = round2(grossBasis.minus(discountBasis).dividedBy(divisor)); + discount = round2(discountBasis.dividedBy(divisor)); + gross = net.plus(discount); + } else { + gross = grossBasis; + discount = discountBasis; + net = gross.minus(discount); + } + const vat = round2(net.times(rate)); + return { + quantity: qty.toString(), + unitPrice: price.toString(), + grossAmount: toMoney(gross), + discountAmount: toMoney(discount), + netAmount: toMoney(net), + vatCategory: input.vatCategory, + vatRate: rate.toString(), + vatAmount: toMoney(vat), + totalAmount: toMoney(net.plus(vat)), + }; +} + +/** Document totals from already-calculated lines (also used for returns). */ +export function totalsOf(lines: Pick[]): CalcTotals { + const groups = new Map(); + let subtotal = new Decimal(0); + let discount = new Decimal(0); + for (const l of lines) { + subtotal = subtotal.plus(l.grossAmount); + discount = discount.plus(l.discountAmount); + const rate = new Decimal(l.vatRate); + const key = `${l.vatCategory}|${rate.toString()}`; + const g = groups.get(key) ?? { vatCategory: l.vatCategory, vatRate: rate, taxable: new Decimal(0) }; + g.taxable = g.taxable.plus(l.netAmount); + groups.set(key, g); + } + const taxBreakdown = [...groups.values()].map((g) => ({ + vatCategory: g.vatCategory, + vatRate: g.vatRate.toString(), + taxableAmount: toMoney(g.taxable), + taxAmount: toMoney(round2(g.taxable.times(g.vatRate))), + })); + const taxable = subtotal.minus(discount); + const tax = taxBreakdown.reduce((s, g) => s.plus(g.taxAmount), new Decimal(0)); + return { + subtotal: toMoney(subtotal), + discountTotal: toMoney(discount), + taxableAmount: toMoney(taxable), + taxAmount: toMoney(tax), + total: toMoney(taxable.plus(tax)), + taxBreakdown, + }; +} + +export function calculateDocument(lines: CalcLineInput[], pricesIncludeVat: boolean) { + const calculated = lines.map((l, i) => calculateLine(l, pricesIncludeVat, i + 1)); + return { lines: calculated, totals: totalsOf(calculated) }; +} diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts b/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts new file mode 100644 index 000000000000..4d3b92facbcf --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts @@ -0,0 +1,474 @@ +import type { Db } from '../../db/tx.js'; +import { AppError, badRequest, conflict, notFound } from '../../lib/errors.js'; +import { Decimal, toMoney } from '../../lib/money.js'; +import { nextDocumentNumber } from '../../lib/sequences.js'; +import { addDays } from '../../lib/dates.js'; +import { writeAudit, type AuditMeta } from '../audit/audit.service.js'; +import { CalcError, calculateLine, totalsOf, type CalcLine, type CalcTotals, type VatCategory } from './calc.js'; +import { KINDS, partyColumn, partyTable, type DocKind } from './kinds.js'; + +export interface Ctx { tenantId: string; userId: string; meta?: AuditMeta } + +export interface LineInput { + productId?: string | null; + accountId?: string | null; + description?: string | null; + quantity: string; + unitPrice?: string; + discountAmount?: string; + discountPercent?: string; + unitId?: string | null; + vatCategory?: VatCategory; +} + +export interface DraftInput { + companyId: string; + partyId: string; + docDate: string; + dueDate?: string | null; + validUntil?: string | null; + expectedDate?: string | null; + supplierInvoiceNumber?: string | null; + branchId?: string | null; + warehouseId?: string | null; + pricesIncludeVat?: boolean; + notes?: string | null; + sourceId?: string | null; + lines: LineInput[]; +} + +export interface ReturnInput { + originalInvoiceId: string; + docDate: string; + reason: string; + notes?: string | null; + lines: { sourceItemId: string; quantity: string }[]; +} + +export interface BuiltLine extends CalcLine { + productId: string | null; + accountId: string | null; + sourceItemId: string | null; + description: string | null; + unitId: string | null; + discountBasis: string; +} + +/** The standard VAT rate effective on `date`. Z, E and O are always 0. */ +export async function vatRateFor(db: Db, companyId: string, category: VatCategory, date: string): Promise { + if (category !== 'S') return '0'; + const { rows: [r] } = await db.query<{ rate: string }>( + `SELECT rate::text FROM tax_rates + WHERE company_id = $1 AND vat_category = 'S' AND is_active + AND effective_from <= $2 AND (effective_to IS NULL OR effective_to >= $2)`, + [companyId, date]); + if (!r) throw conflict('TAX_RATE_MISSING', `No standard VAT rate is configured for ${date}`); + return r.rate; +} + +const calcError = (e: unknown) => { + if (e instanceof CalcError) return badRequest('INVALID_LINE', e.message); + return e; +}; + +/** Turns line input into calculated lines, filling defaults from the product. */ +export async function buildLines(db: Db, kind: DocKind, companyId: string, input: Pick): Promise { + if (!input.lines.length) throw badRequest('NO_LINES', 'A document needs at least one line'); + const includeVat = input.pricesIncludeVat ?? false; + const productIds = [...new Set(input.lines.map((l) => l.productId).filter(Boolean))] as string[]; + const { rows: products } = await db.query<{ + id: string; name_ar: string; unit_id: string; sale_price: string; sale_price_includes_vat: boolean; + purchase_price: string; vat_category: VatCategory; is_active: boolean; + }>( + `SELECT id, name_ar, unit_id, sale_price::text, sale_price_includes_vat, purchase_price::text, vat_category, is_active + FROM products WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL`, + [companyId, productIds]); + const byId = new Map(products.map((p) => [p.id, p])); + + const accountIds = [...new Set(input.lines.map((l) => l.accountId).filter(Boolean))] as string[]; + if (accountIds.length) { + if (kind.party === 'customer') throw badRequest('INVALID_LINE', 'Sales lines must reference a product'); + const { rows } = await db.query<{ id: string }>( + `SELECT id FROM accounts WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL AND is_active AND is_postable + AND account_type IN ('ASSET', 'EXPENSE', 'COST_OF_GOODS_SOLD')`, [companyId, accountIds]); + if (rows.length !== accountIds.length) throw badRequest('INVALID_ACCOUNT', 'Purchase lines need an active postable asset, expense or cost account'); + } + const unitIds = [...new Set(input.lines.map((l) => l.unitId).filter(Boolean))] as string[]; + if (unitIds.length) { + const { rowCount } = await db.query(`SELECT 1 FROM units WHERE company_id = $1 AND id = ANY($2::uuid[])`, [companyId, unitIds]); + if (rowCount !== unitIds.length) throw badRequest('INVALID_UNIT', 'Unit does not exist in this company'); + } + + const built: BuiltLine[] = []; + for (const [i, l] of input.lines.entries()) { + const n = i + 1; + const product = l.productId ? byId.get(l.productId) : undefined; + if (l.productId && !product) throw badRequest('INVALID_PRODUCT', `Line ${n}: product does not exist in this company`); + if (product && !product.is_active) throw badRequest('PRODUCT_INACTIVE', `Line ${n}: product is inactive`); + if (!product && !l.accountId) throw badRequest('INVALID_LINE', `Line ${n}: choose a product${kind.party === 'supplier' ? ' or an account' : ''}`); + + const category: VatCategory = product?.vat_category ?? l.vatCategory ?? 'S'; + const rate = await vatRateFor(db, companyId, category, input.docDate); + let unitPrice = l.unitPrice; + if (unitPrice === undefined) { + if (!product) throw badRequest('INVALID_LINE', `Line ${n}: unitPrice is required`); + if (kind.party === 'customer') { + // Convert the product's list price to the document's price basis. + let p = new Decimal(product.sale_price); + if (product.sale_price_includes_vat && !includeVat) p = p.dividedBy(new Decimal(rate).plus(1)); + if (!product.sale_price_includes_vat && includeVat) p = p.times(new Decimal(rate).plus(1)); + unitPrice = p.toDecimalPlaces(4).toString(); + } else { + unitPrice = new Decimal(product.purchase_price).toString(); + } + } + try { + const calc = calculateLine({ + quantity: l.quantity, unitPrice, discountAmount: l.discountAmount, discountPercent: l.discountPercent, + vatCategory: category, vatRate: rate, + }, includeVat, n); + const discountBasis = l.discountPercent + ? toMoney(new Decimal(l.quantity).times(unitPrice).toDecimalPlaces(2).times(l.discountPercent).dividedBy(100)) + : toMoney(l.discountAmount ?? '0'); + built.push({ + ...calc, + productId: product?.id ?? null, + accountId: l.accountId ?? null, + sourceItemId: null, + description: l.description ?? product?.name_ar ?? null, + unitId: l.unitId ?? product?.unit_id ?? null, + discountBasis, + }); + } catch (e) { + throw calcError(e); + } + } + return built; +} + +interface OriginalItem { + id: string; line_no: number; product_id: string | null; account_id: string | null; description: string | null; + quantity: string; unit_id: string | null; unit_price: string; discount_basis: string; gross_amount: string; + discount_amount: string; net_amount: string; vat_category: VatCategory; vat_rate: string; + returned_qty: string; returned_net: string; returned_discount: string; returned_basis: string; +} + +/** + * Computes a return from the original invoice lines. Amounts are prorated by + * quantity; returning the last remaining quantity of a line takes exactly + * what is left, and the last return of an invoice takes exactly the VAT that + * is left, so a full return always nets the invoice to zero. + */ +export async function buildReturn(db: Db, kind: DocKind, tenantId: string, input: ReturnInput, excludeReturnId: string | null) { + const orig = KINDS[kind.originalKind!]; + const { rows: [invoice] } = await db.query<{ + id: string; company_id: string; status: string; party_id: string; tax_amount: string; prices_include_vat: boolean; + branch_id: string | null; warehouse_id: string | null; doc_date: string; + }>( + `SELECT id, company_id, status, ${partyColumn(kind)} AS party_id, tax_amount::text, prices_include_vat, branch_id, warehouse_id, + to_char(doc_date, 'YYYY-MM-DD') AS doc_date + FROM ${orig.table} WHERE tenant_id = $1 AND id = $2 AND deleted_at IS NULL`, + [tenantId, input.originalInvoiceId]); + if (!invoice) throw notFound(orig.label); + if (invoice.status === 'DRAFT' || invoice.status === 'CANCELLED') throw conflict('INVOICE_NOT_ISSUED', 'Only issued invoices can be returned'); + if (input.docDate < invoice.doc_date) throw badRequest('INVALID_DATE', 'A return cannot be dated before its invoice'); + + const { rows: items } = await db.query( + `SELECT i.id, i.line_no, i.product_id, i.account_id, i.description, i.quantity::text, i.unit_id, i.unit_price::text, + i.discount_basis::text, i.gross_amount::text, i.discount_amount::text, i.net_amount::text, i.vat_category, i.vat_rate::text, + COALESCE(r.qty, 0)::text AS returned_qty, COALESCE(r.net, 0)::text AS returned_net, + COALESCE(r.discount, 0)::text AS returned_discount, COALESCE(r.basis, 0)::text AS returned_basis + FROM ${orig.itemsTable} i + LEFT JOIN LATERAL ( + SELECT sum(ri.quantity) AS qty, sum(ri.net_amount) AS net, sum(ri.discount_amount) AS discount, sum(ri.discount_basis) AS basis + FROM ${kind.itemsTable} ri JOIN ${kind.table} rd ON rd.id = ri.document_id + WHERE ri.source_item_id = i.id AND rd.status = 'ISSUED' AND rd.id IS DISTINCT FROM $2 + ) r ON true + WHERE i.document_id = $1 ORDER BY i.line_no`, + [invoice.id, excludeReturnId]); + const byId = new Map(items.map((i) => [i.id, i])); + const { rows: [prior] } = await db.query<{ tax: string }>( + `SELECT COALESCE(sum(tax_amount), 0)::text AS tax FROM ${kind.table} + WHERE original_invoice_id = $1 AND status = 'ISSUED' AND id IS DISTINCT FROM $2`, [invoice.id, excludeReturnId]); + + if (!input.lines.length) throw badRequest('NO_LINES', 'Choose at least one line to return'); + const seen = new Set(); + const lines: BuiltLine[] = input.lines.map((l, idx) => { + const n = idx + 1; + const o = byId.get(l.sourceItemId); + if (!o) throw badRequest('INVALID_LINE', `Line ${n}: the line does not belong to the original invoice`); + if (seen.has(o.id)) throw badRequest('INVALID_LINE', `Line ${n}: the same invoice line appears twice`); + seen.add(o.id); + const q = new Decimal(l.quantity); + const remaining = new Decimal(o.quantity).minus(o.returned_qty); + if (!q.greaterThan(0)) throw badRequest('INVALID_LINE', `Line ${n}: quantity must be greater than zero`); + if (q.greaterThan(remaining)) { + throw badRequest('RETURN_EXCEEDS_INVOICE', `Line ${n}: only ${remaining.toString()} can still be returned`); + } + let net: Decimal; let discount: Decimal; let basis: Decimal; + if (q.equals(remaining)) { + net = new Decimal(o.net_amount).minus(o.returned_net); + discount = new Decimal(o.discount_amount).minus(o.returned_discount); + basis = new Decimal(o.discount_basis).minus(o.returned_basis); + } else { + const share = q.dividedBy(o.quantity); + net = new Decimal(o.net_amount).times(share).toDecimalPlaces(2); + discount = new Decimal(o.discount_amount).times(share).toDecimalPlaces(2); + basis = new Decimal(o.discount_basis).times(share).toDecimalPlaces(2); + } + const vat = net.times(o.vat_rate).toDecimalPlaces(2); + return { + quantity: q.toString(), unitPrice: o.unit_price, grossAmount: toMoney(net.plus(discount)), discountAmount: toMoney(discount), + netAmount: toMoney(net), vatCategory: o.vat_category, vatRate: o.vat_rate, vatAmount: toMoney(vat), totalAmount: toMoney(net.plus(vat)), + productId: o.product_id, accountId: o.account_id, sourceItemId: o.id, description: o.description, unitId: o.unit_id, + discountBasis: toMoney(basis), + }; + }); + + const totals: CalcTotals = totalsOf(lines); + const taxLeft = new Decimal(invoice.tax_amount).minus(prior!.tax); + const fullyReturned = items.every((o) => { + const line = lines.find((l) => l.sourceItemId === o.id); + return new Decimal(o.returned_qty).plus(line?.quantity ?? 0).equals(o.quantity); + }); + let tax = new Decimal(totals.taxAmount); + if (fullyReturned || tax.greaterThan(taxLeft)) tax = taxLeft; + totals.taxAmount = toMoney(tax); + totals.total = toMoney(new Decimal(totals.taxableAmount).plus(tax)); + return { invoice, lines, totals, fullyReturned }; +} + +async function checkParty(db: Db, kind: DocKind, companyId: string, partyId: string) { + const { rows: [p] } = await db.query<{ is_active: boolean }>( + `SELECT is_active FROM ${partyTable(kind)} WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, partyId]); + if (!p) throw badRequest('INVALID_PARTY', `${kind.party === 'customer' ? 'Customer' : 'Supplier'} does not exist in this company`); + if (!p.is_active) throw badRequest('PARTY_INACTIVE', `${kind.party === 'customer' ? 'Customer' : 'Supplier'} is inactive`); +} + +async function checkBranchWarehouse(db: Db, companyId: string, branchId?: string | null, warehouseId?: string | null) { + if (branchId) { + const b = await db.query(`SELECT 1 FROM branches WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, branchId]); + if (!b.rowCount) throw badRequest('INVALID_BRANCH', 'Branch does not exist in this company'); + } + if (warehouseId) { + const w = await db.query(`SELECT 1 FROM warehouses WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, warehouseId]); + if (!w.rowCount) throw badRequest('INVALID_WAREHOUSE', 'Warehouse does not exist in this company'); + } +} + +export async function insertItems(db: Db, kind: DocKind, tenantId: string, companyId: string, documentId: string, lines: BuiltLine[]) { + const sourceCol = kind.isReturn ? ', source_item_id' : ''; + for (const [i, l] of lines.entries()) { + await db.query( + `INSERT INTO ${kind.itemsTable} (tenant_id, company_id, document_id, line_no, product_id, account_id, description, + quantity, unit_id, unit_price, gross_amount, discount_basis, discount_amount, net_amount, vat_category, vat_rate, + vat_amount, total_amount${sourceCol}) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18${kind.isReturn ? ', $19' : ''})`, + [tenantId, companyId, documentId, i + 1, l.productId, l.accountId, l.description, l.quantity, l.unitId, l.unitPrice, + l.grossAmount, l.discountBasis, l.discountAmount, l.netAmount, l.vatCategory, l.vatRate, l.vatAmount, l.totalAmount, + ...(kind.isReturn ? [l.sourceItemId] : [])]); + } +} + +const totalsParams = (t: CalcTotals) => [t.subtotal, t.discountTotal, t.taxableAmount, t.taxAmount, t.total]; + +/** Creates a draft (or, for quotes and orders, a numbered open document). */ +export async function createDraft(db: Db, kind: DocKind, ctx: Ctx, input: DraftInput): Promise { + if (kind.isReturn) throw new AppError(500, 'INTERNAL', 'use createReturnDraft'); + await checkParty(db, kind, input.companyId, input.partyId); + await checkBranchWarehouse(db, input.companyId, input.branchId, input.warehouseId); + const lines = await buildLines(db, kind, input.companyId, input); + const totals = totalsOf(lines); + const { rows: [company] } = await db.query<{ currency: string }>(`SELECT currency FROM companies WHERE id = $1`, [input.companyId]); + const number = kind.legal ? null : await nextDocumentNumber(db, ctx.tenantId, input.companyId, kind.key, { prefix: kind.prefix, padding: 6 }); + + const extra: Record = {}; + if (kind.key === 'SALES_QUOTE') extra.valid_until = input.validUntil ?? null; + if (kind.key === 'PURCHASE_ORDER') extra.expected_date = input.expectedDate ?? null; + if (kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE') extra.due_date = input.dueDate ?? null; + if (kind.key === 'PURCHASE_INVOICE') extra.supplier_invoice_number = input.supplierInvoiceNumber ?? null; + if (kind.key === 'SALES_INVOICE') extra.source_quote_id = input.sourceId ?? null; + if (kind.key === 'PURCHASE_INVOICE') extra.source_order_id = input.sourceId ?? null; + const extraCols = Object.keys(extra); + + const { rows: [doc] } = await db.query<{ id: string }>( + `INSERT INTO ${kind.table} (tenant_id, company_id, ${partyColumn(kind)}, doc_number, doc_date, branch_id, warehouse_id, + currency, prices_include_vat, notes, subtotal, discount_total, taxable_amount, tax_amount, total, created_by + ${extraCols.map((c) => `, ${c}`).join('')}) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16 + ${extraCols.map((_, i) => `, $${17 + i}`).join('')}) + RETURNING id`, + [ctx.tenantId, input.companyId, input.partyId, number, input.docDate, input.branchId ?? null, input.warehouseId ?? null, + company!.currency, input.pricesIncludeVat ?? false, input.notes ?? null, ...totalsParams(totals), ctx.userId, + ...Object.values(extra)]); + await insertItems(db, kind, ctx.tenantId, input.companyId, doc!.id, lines); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'CREATE', entityType: kind.entity, entityId: doc!.id, newValues: { ...input, totals } }, ctx.meta); + return doc!.id; +} + +export async function createReturnDraft(db: Db, kind: DocKind, ctx: Ctx, input: ReturnInput): Promise { + const { invoice, lines, totals } = await buildReturn(db, kind, ctx.tenantId, input, null); + const { rows: [company] } = await db.query<{ currency: string }>(`SELECT currency FROM companies WHERE id = $1`, [invoice.company_id]); + const { rows: [doc] } = await db.query<{ id: string }>( + `INSERT INTO ${kind.table} (tenant_id, company_id, ${partyColumn(kind)}, original_invoice_id, reason, doc_date, branch_id, + warehouse_id, currency, prices_include_vat, notes, subtotal, discount_total, taxable_amount, tax_amount, total, created_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING id`, + [ctx.tenantId, invoice.company_id, invoice.party_id, invoice.id, input.reason, input.docDate, invoice.branch_id, + invoice.warehouse_id, company!.currency, invoice.prices_include_vat, input.notes ?? null, ...totalsParams(totals), ctx.userId]); + await insertItems(db, kind, ctx.tenantId, invoice.company_id, doc!.id, lines); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'CREATE', entityType: kind.entity, entityId: doc!.id, newValues: { ...input, totals } }, ctx.meta); + return doc!.id; +} + +export async function lockDocument(db: Db, kind: DocKind, tenantId: string, id: string) { + const { rows: [d] } = await db.query<{ + id: string; company_id: string; status: string; doc_number: string | null; doc_date: string; party_id: string; + total: string; tax_amount: string; taxable_amount: string; branch_id: string | null; journal_entry_id: string | null; + deleted_at: Date | null; [k: string]: unknown; + }>( + `SELECT *, to_char(doc_date, 'YYYY-MM-DD') AS doc_date, ${partyColumn(kind)} AS party_id, + total::text, tax_amount::text, taxable_amount::text + FROM ${kind.table} WHERE tenant_id = $1 AND id = $2 FOR UPDATE`, [tenantId, id]); + if (!d || d.deleted_at) throw notFound(kind.label); + return d; +} + +/** Replaces a draft's header fields and lines. Quotes and orders stay editable until sent/approved. */ +export type UpdateInput = Partial> & Partial> & { lines?: LineInput[] | ReturnInput['lines'] }; + +export async function updateDraft(db: Db, kind: DocKind, ctx: Ctx, id: string, input: UpdateInput) { + const d = await lockDocument(db, kind, ctx.tenantId, id); + if (d.status !== 'DRAFT') throw conflict('DOCUMENT_NOT_DRAFT', 'Only drafts can be edited'); + const before = await loadDocument(db, kind, ctx.tenantId, id); + + let lines: BuiltLine[]; + let totals: CalcTotals; + if (kind.isReturn) { + const r = await buildReturn(db, kind, ctx.tenantId, { + originalInvoiceId: d.original_invoice_id as string, + docDate: input.docDate ?? d.doc_date, + reason: input.reason ?? (d.reason as string), + lines: input.lines as ReturnInput['lines'] ?? before.lines.map((l) => ({ sourceItemId: l.sourceItemId!, quantity: l.quantity })), + }, id); + ({ lines, totals } = r); + await db.query(`UPDATE ${kind.table} SET doc_date = $2, reason = COALESCE($3, reason), notes = COALESCE($4, notes) WHERE id = $1`, + [id, input.docDate ?? d.doc_date, input.reason ?? null, input.notes ?? null]); + } else { + if (input.partyId) await checkParty(db, kind, d.company_id, input.partyId); + await checkBranchWarehouse(db, d.company_id, input.branchId, input.warehouseId); + const pricesIncludeVat = input.pricesIncludeVat ?? (d.prices_include_vat as boolean); + const docDate = input.docDate ?? d.doc_date; + const lineInput: LineInput[] = (input.lines as LineInput[] | undefined) ?? before.lines.map((l) => ({ + productId: l.productId, accountId: l.accountId, description: l.description, quantity: l.quantity, + unitPrice: l.unitPrice, discountAmount: l.discountBasis, unitId: l.unitId, vatCategory: l.vatCategory, + })); + lines = await buildLines(db, kind, d.company_id, { lines: lineInput, docDate, pricesIncludeVat }); + totals = totalsOf(lines); + const sets: [string, unknown][] = [ + [partyColumn(kind), input.partyId ?? d.party_id], ['doc_date', docDate], ['prices_include_vat', pricesIncludeVat], + ['branch_id', input.branchId !== undefined ? input.branchId : d.branch_id], + ['warehouse_id', input.warehouseId !== undefined ? input.warehouseId : d.warehouse_id], + ['notes', input.notes !== undefined ? input.notes : d.notes], + ]; + if (kind.key === 'SALES_QUOTE' && input.validUntil !== undefined) sets.push(['valid_until', input.validUntil]); + if (kind.key === 'PURCHASE_ORDER' && input.expectedDate !== undefined) sets.push(['expected_date', input.expectedDate]); + if ((kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE') && input.dueDate !== undefined) sets.push(['due_date', input.dueDate]); + if (kind.key === 'PURCHASE_INVOICE' && input.supplierInvoiceNumber !== undefined) sets.push(['supplier_invoice_number', input.supplierInvoiceNumber]); + await db.query(`UPDATE ${kind.table} SET ${sets.map(([c], i) => `${c} = $${i + 2}`).join(', ')} WHERE id = $1`, + [id, ...sets.map(([, v]) => v)]); + } + await db.query(`DELETE FROM ${kind.itemsTable} WHERE document_id = $1`, [id]); + await insertItems(db, kind, ctx.tenantId, d.company_id, id, lines); + await db.query( + `UPDATE ${kind.table} SET subtotal = $2, discount_total = $3, taxable_amount = $4, tax_amount = $5, total = $6 WHERE id = $1`, + [id, ...totalsParams(totals)]); + const after = await loadDocument(db, kind, ctx.tenantId, id); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'UPDATE', entityType: kind.entity, entityId: id, oldValues: before, newValues: after }, ctx.meta); + return after; +} + +export async function deleteDraft(db: Db, kind: DocKind, ctx: Ctx, id: string) { + const d = await lockDocument(db, kind, ctx.tenantId, id); + if (d.status !== 'DRAFT') throw conflict('DOCUMENT_NOT_DRAFT', kind.legal ? 'Issued documents cannot be deleted. Cancel them or issue a return.' : 'Only drafts can be deleted. Cancel it instead.'); + await db.query(`UPDATE ${kind.table} SET deleted_at = now() WHERE id = $1`, [id]); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'DELETE', entityType: kind.entity, entityId: id }, ctx.meta); +} + +export interface DocumentView { + id: string; companyId: string; number: string | null; date: string; partyId: string; partyName: string; status: string; + total: string; [k: string]: unknown; + lines: { + id: string; lineNo: number; productId: string | null; productName: string | null; sku: string | null; accountId: string | null; + sourceItemId: string | null; description: string | null; quantity: string; unitId: string | null; unitCode: string | null; + unitPrice: string; grossAmount: string; discountBasis: string; discountAmount: string; netAmount: string; + vatCategory: VatCategory; vatRate: string; vatAmount: string; totalAmount: string; + }[]; +} + +export function headerSelect(kind: DocKind) { + const extra: string[] = []; + if (kind.key === 'SALES_QUOTE') extra.push(`to_char(d.valid_until, 'YYYY-MM-DD') AS "validUntil"`, `d.converted_invoice_id AS "convertedInvoiceId"`); + if (kind.key === 'PURCHASE_ORDER') extra.push(`to_char(d.expected_date, 'YYYY-MM-DD') AS "expectedDate"`, `d.converted_invoice_id AS "convertedInvoiceId"`); + if (kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE') { + extra.push(`to_char(d.due_date, 'YYYY-MM-DD') AS "dueDate"`, `d.paid_amount::text AS "paidAmount"`, + `d.returned_amount::text AS "returnedAmount"`, `d.remaining_amount::text AS "remainingAmount"`); + } + if (kind.key === 'SALES_INVOICE') extra.push(`d.invoice_kind AS "invoiceKind"`, `d.source_quote_id AS "sourceQuoteId"`); + if (kind.key === 'PURCHASE_INVOICE') extra.push(`d.supplier_invoice_number AS "supplierInvoiceNumber"`, `d.source_order_id AS "sourceOrderId"`); + if (kind.isReturn) { + extra.push(`d.original_invoice_id AS "originalInvoiceId"`, `d.reason`, `d.applied_amount::text AS "appliedAmount"`, + `d.refunded_amount::text AS "refundedAmount"`, `d.remaining_amount::text AS "remainingAmount"`, + `(SELECT doc_number FROM ${KINDS[kind.originalKind!].table} WHERE id = d.original_invoice_id) AS "originalInvoiceNumber"`); + } + return ` + SELECT d.id, d.company_id AS "companyId", d.doc_number AS number, to_char(d.doc_date, 'YYYY-MM-DD') AS date, + d.${partyColumn(kind)} AS "partyId", p.name_ar AS "partyName", p.code AS "partyCode", d.status, + d.branch_id AS "branchId", d.warehouse_id AS "warehouseId", d.currency, d.prices_include_vat AS "pricesIncludeVat", + d.subtotal::text, d.discount_total::text AS "discountTotal", d.taxable_amount::text AS "taxableAmount", + d.tax_amount::text AS "taxAmount", d.total::text, d.notes, d.party_snapshot AS "partySnapshot", + d.journal_entry_id AS "journalEntryId", d.issued_at AS "issuedAt", d.cancelled_at AS "cancelledAt", + d.cancel_reason AS "cancelReason", d.created_at AS "createdAt" + ${extra.map((e) => `, ${e}`).join('')} + FROM ${kind.table} d JOIN ${partyTable(kind)} p ON p.id = d.${partyColumn(kind)}`; +} + +export async function loadDocument(db: Db, kind: DocKind, tenantId: string, id: string): Promise { + const { rows: [doc] } = await db.query>( + `${headerSelect(kind)} WHERE d.tenant_id = $1 AND d.id = $2 AND d.deleted_at IS NULL`, [tenantId, id]); + if (!doc) throw notFound(kind.label); + const { rows: lines } = await db.query( + `SELECT i.id, i.line_no AS "lineNo", i.product_id AS "productId", pr.name_ar AS "productName", pr.sku, + i.account_id AS "accountId", ${kind.isReturn ? 'i.source_item_id' : 'NULL::uuid'} AS "sourceItemId", + i.description, i.quantity::text, i.unit_id AS "unitId", u.code AS "unitCode", i.unit_price::text AS "unitPrice", + i.gross_amount::text AS "grossAmount", i.discount_basis::text AS "discountBasis", i.discount_amount::text AS "discountAmount", + i.net_amount::text AS "netAmount", i.vat_category AS "vatCategory", i.vat_rate::text AS "vatRate", + i.vat_amount::text AS "vatAmount", i.total_amount::text AS "totalAmount" + FROM ${kind.itemsTable} i + LEFT JOIN products pr ON pr.id = i.product_id + LEFT JOIN units u ON u.id = i.unit_id + WHERE i.document_id = $1 ORDER BY i.line_no`, [id]); + const view = { ...doc, lines } as DocumentView; + if (kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE' || kind.isReturn) { + const col = { SALES_INVOICE: 'sales_invoice_id', PURCHASE_INVOICE: 'purchase_invoice_id', SALES_RETURN: 'sales_return_id', PURCHASE_RETURN: 'purchase_return_id' }[kind.key as string]!; + const { rows: allocations } = await db.query( + `SELECT a.id, a.amount::text, a.created_at AS "createdAt", p.id AS "paymentId", p.payment_number AS "paymentNumber", + to_char(p.payment_date, 'YYYY-MM-DD') AS "paymentDate" + FROM payment_allocations a JOIN payments p ON p.id = a.payment_id + WHERE a.${col} = $1 AND a.reversed_at IS NULL ORDER BY p.payment_date`, [id]); + view.allocations = allocations; + } + if (kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE') { + const ret = kind.key === 'SALES_INVOICE' ? KINDS.SALES_RETURN : KINDS.PURCHASE_RETURN; + const { rows: returns } = await db.query( + `SELECT id, doc_number AS number, to_char(doc_date, 'YYYY-MM-DD') AS date, status, total::text + FROM ${ret.table} WHERE original_invoice_id = $1 AND deleted_at IS NULL ORDER BY created_at`, [id]); + view.returns = returns; + } + return view; +} + +/** Default due date: document date + the party's payment terms. */ +export async function defaultDueDate(db: Db, kind: DocKind, partyId: string, docDate: string): Promise { + const { rows: [p] } = await db.query<{ payment_terms_days: number }>(`SELECT payment_terms_days FROM ${partyTable(kind)} WHERE id = $1`, [partyId]); + return addDays(docDate, p?.payment_terms_days ?? 0); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/kinds.ts b/alshuyukh-accounting/apps/api/src/modules/documents/kinds.ts new file mode 100644 index 000000000000..e4ae777b66df --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/documents/kinds.ts @@ -0,0 +1,59 @@ +/** + * The six commercial documents share one implementation. Each kind declares + * its tables, party, numbering, permissions, and lifecycle here. + */ + +export type DocKey = 'SALES_QUOTE' | 'SALES_INVOICE' | 'SALES_RETURN' | 'PURCHASE_ORDER' | 'PURCHASE_INVOICE' | 'PURCHASE_RETURN'; + +export interface DocKind { + key: DocKey; + path: string; + table: string; + itemsTable: string; + party: 'customer' | 'supplier'; + /** Invoices and returns: number at issue, journal entry, settlement tracking. */ + legal: boolean; + isReturn: boolean; + /** For returns: the invoice kind being returned. */ + originalKind?: DocKey; + prefix: string; + /** Status set when the document is issued / posted. */ + issuedStatus: string; + entity: string; + label: string; + labelAr: string; + perm: { view: string; create: string; edit: string; delete: string; issue: string; cancel: string }; +} + +const SALES_PERM = { view: 'invoice.view', create: 'invoice.create', edit: 'invoice.edit', delete: 'invoice.delete', issue: 'invoice.post', cancel: 'invoice.cancel' }; +const PURCHASE_PERM = { view: 'purchase.view', create: 'purchase.create', edit: 'purchase.create', delete: 'purchase.create', issue: 'purchase.post', cancel: 'purchase.cancel' }; + +export const KINDS: Record = { + SALES_QUOTE: { + key: 'SALES_QUOTE', path: 'sales-quotes', table: 'sales_quotes', itemsTable: 'sales_quote_items', party: 'customer', + legal: false, isReturn: false, prefix: 'QT', issuedStatus: 'SENT', entity: 'sales_quote', label: 'Quote', labelAr: 'عرض سعر', perm: SALES_PERM, + }, + SALES_INVOICE: { + key: 'SALES_INVOICE', path: 'invoices', table: 'sales_invoices', itemsTable: 'sales_invoice_items', party: 'customer', + legal: true, isReturn: false, prefix: 'INV', issuedStatus: 'ISSUED', entity: 'sales_invoice', label: 'Invoice', labelAr: 'فاتورة مبيعات', perm: SALES_PERM, + }, + SALES_RETURN: { + key: 'SALES_RETURN', path: 'sales-returns', table: 'sales_returns', itemsTable: 'sales_return_items', party: 'customer', + legal: true, isReturn: true, originalKind: 'SALES_INVOICE', prefix: 'CN', issuedStatus: 'ISSUED', entity: 'sales_return', label: 'Sales return', labelAr: 'مرتجع مبيعات (إشعار دائن)', perm: SALES_PERM, + }, + PURCHASE_ORDER: { + key: 'PURCHASE_ORDER', path: 'purchase-orders', table: 'purchase_orders', itemsTable: 'purchase_order_items', party: 'supplier', + legal: false, isReturn: false, prefix: 'PO', issuedStatus: 'APPROVED', entity: 'purchase_order', label: 'Purchase order', labelAr: 'أمر شراء', perm: PURCHASE_PERM, + }, + PURCHASE_INVOICE: { + key: 'PURCHASE_INVOICE', path: 'purchase-invoices', table: 'purchase_invoices', itemsTable: 'purchase_invoice_items', party: 'supplier', + legal: true, isReturn: false, prefix: 'PINV', issuedStatus: 'POSTED', entity: 'purchase_invoice', label: 'Purchase invoice', labelAr: 'فاتورة مشتريات', perm: PURCHASE_PERM, + }, + PURCHASE_RETURN: { + key: 'PURCHASE_RETURN', path: 'purchase-returns', table: 'purchase_returns', itemsTable: 'purchase_return_items', party: 'supplier', + legal: true, isReturn: true, originalKind: 'PURCHASE_INVOICE', prefix: 'DN', issuedStatus: 'ISSUED', entity: 'purchase_return', label: 'Purchase return', labelAr: 'مرتجع مشتريات (إشعار مدين)', perm: PURCHASE_PERM, + }, +}; + +export const partyColumn = (k: DocKind) => `${k.party}_id`; +export const partyTable = (k: DocKind) => (k.party === 'customer' ? 'customers' : 'suppliers'); diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/payments.ts b/alshuyukh-accounting/apps/api/src/modules/documents/payments.ts new file mode 100644 index 000000000000..ae3112578f0d --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/documents/payments.ts @@ -0,0 +1,206 @@ +import { randomUUID } from 'node:crypto'; +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict, notFound } from '../../lib/errors.js'; +import { Decimal, toMoney } from '../../lib/money.js'; +import { nextDocumentNumber } from '../../lib/sequences.js'; +import { postEntry, reverse } from '../accounting/engine.js'; +import { writeAudit } from '../audit/audit.service.js'; +import type { Ctx } from './drafts.js'; +import { KINDS, type DocKind } from './kinds.js'; +import { controlAccount, refreshInvoiceStatus } from './posting.js'; + +/** + * Payments move money between a cash/bank account (from the payment method) + * and the party's control account: + * + * Receipt from customer Dr Cash/Bank / Cr Receivable (customer) + * Refund to customer Dr Receivable (customer) / Cr Cash/Bank + * Payment to supplier Dr Payable (supplier) / Cr Cash/Bank + * Refund from supplier Dr Cash/Bank / Cr Payable (supplier) + * + * Allocation links a payment to the documents it settles. It does not post + * anything: the ledger is already right per party. An unallocated remainder + * stays on the party's account as an advance. + */ + +export type Direction = 'RECEIPT' | 'DISBURSEMENT'; +export type TargetType = 'SALES_INVOICE' | 'SALES_RETURN' | 'PURCHASE_INVOICE' | 'PURCHASE_RETURN'; + +export interface AllocationInput { documentType: TargetType; documentId: string; amount: string } + +export interface PaymentInput { + companyId: string; + direction: Direction; + customerId?: string | null; + supplierId?: string | null; + paymentDate: string; + methodId: string; + amount: string; + reference?: string | null; + notes?: string | null; + branchId?: string | null; + allocations?: AllocationInput[]; +} + +const TARGET_COLUMN: Record = { + SALES_INVOICE: 'sales_invoice_id', SALES_RETURN: 'sales_return_id', + PURCHASE_INVOICE: 'purchase_invoice_id', PURCHASE_RETURN: 'purchase_return_id', +}; + +/** Which documents a payment may settle, by party and direction. */ +function allowedTarget(party: 'customer' | 'supplier', direction: Direction): TargetType { + if (party === 'customer') return direction === 'RECEIPT' ? 'SALES_INVOICE' : 'SALES_RETURN'; + return direction === 'DISBURSEMENT' ? 'PURCHASE_INVOICE' : 'PURCHASE_RETURN'; +} + +export async function createPayment(db: Db, ctx: Ctx, input: PaymentInput) { + const party = input.customerId ? 'customer' : 'supplier'; + const partyId = (input.customerId ?? input.supplierId)!; + if (!!input.customerId === !!input.supplierId) throw badRequest('INVALID_PARTY', 'Choose either a customer or a supplier'); + const { rows: [p] } = await db.query<{ is_active: boolean }>( + `SELECT is_active FROM ${party}s WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [input.companyId, partyId]); + if (!p) throw badRequest('INVALID_PARTY', `The ${party} does not exist in this company`); + + const { rows: [method] } = await db.query<{ account_id: string; is_active: boolean; name_ar: string }>( + `SELECT account_id, is_active, name_ar FROM payment_methods WHERE company_id = $1 AND id = $2`, [input.companyId, input.methodId]); + if (!method) throw badRequest('INVALID_METHOD', 'Payment method does not exist in this company'); + if (!method.is_active) throw badRequest('METHOD_INACTIVE', 'Payment method is inactive'); + if (input.branchId) { + const b = await db.query(`SELECT 1 FROM branches WHERE company_id = $1 AND id = $2`, [input.companyId, input.branchId]); + if (!b.rowCount) throw badRequest('INVALID_BRANCH', 'Branch does not exist in this company'); + } + + const number = await nextDocumentNumber(db, ctx.tenantId, input.companyId, input.direction === 'RECEIPT' ? 'RECEIPT' : 'DISBURSEMENT', + { prefix: input.direction === 'RECEIPT' ? 'RCPT' : 'PAY', padding: 6 }); + const control = await controlAccount(db, party, input.companyId, partyId); + const tag = party === 'customer' ? { customerId: partyId } : { supplierId: partyId }; + const moneyIn = input.direction === 'RECEIPT'; + const paymentId = randomUUID(); + const entry = await postEntry(db, ctx, { + companyId: input.companyId, entryDate: input.paymentDate, + description: `${moneyIn ? 'سند قبض' : 'سند صرف'} ${number}${input.reference ? ` — ${input.reference}` : ''}`, + referenceType: moneyIn ? 'PAYMENT_RECEIPT' : 'PAYMENT_DISBURSEMENT', referenceId: paymentId, source: 'SYSTEM', + lines: [ + { accountId: method.account_id, ...(moneyIn ? { debit: input.amount } : { credit: input.amount }), branchId: input.branchId ?? null }, + { accountId: control, ...(moneyIn ? { credit: input.amount } : { debit: input.amount }), ...tag, branchId: input.branchId ?? null }, + ], + }); + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO payments (id, tenant_id, company_id, branch_id, payment_number, direction, customer_id, supplier_id, payment_date, + method_id, amount, reference, notes, journal_entry_id, created_by) + VALUES ($15, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) RETURNING id`, + [ctx.tenantId, input.companyId, input.branchId ?? null, number, input.direction, input.customerId ?? null, input.supplierId ?? null, + input.paymentDate, input.methodId, input.amount, input.reference ?? null, input.notes ?? null, entry.id, ctx.userId, paymentId]); + await writeAudit(db, { + tenantId: ctx.tenantId, userId: ctx.userId, action: 'PAYMENT', entityType: 'payment', entityId: row!.id, + newValues: { number, direction: input.direction, party, partyId, amount: input.amount, journalEntryId: entry.id }, + }, ctx.meta); + if (input.allocations?.length) await allocate(db, ctx, row!.id, input.allocations); + return loadPayment(db, ctx.tenantId, row!.id); +} + +/** Settles documents with an existing payment's unallocated amount. */ +export async function allocate(db: Db, ctx: Ctx, paymentId: string, allocations: AllocationInput[]) { + const { rows: [pay] } = await db.query<{ + id: string; company_id: string; status: string; direction: Direction; customer_id: string | null; supplier_id: string | null; + unallocated_amount: string; payment_date: string; + }>( + `SELECT id, company_id, status, direction, customer_id, supplier_id, unallocated_amount::text, payment_date + FROM payments WHERE tenant_id = $1 AND id = $2 FOR UPDATE`, [ctx.tenantId, paymentId]); + if (!pay) throw notFound('Payment'); + if (pay.status !== 'POSTED') throw conflict('PAYMENT_VOIDED', 'This payment is voided'); + const party = pay.customer_id ? 'customer' : 'supplier'; + const partyId = (pay.customer_id ?? pay.supplier_id)!; + const expected = allowedTarget(party, pay.direction); + + const total = allocations.reduce((s, a) => s.plus(a.amount), new Decimal(0)); + if (total.greaterThan(pay.unallocated_amount)) { + throw badRequest('OVER_ALLOCATED', `Allocations (${toMoney(total)}) exceed the unallocated amount (${pay.unallocated_amount})`); + } + const seen = new Set(); + for (const a of allocations) { + if (a.documentType !== expected) throw badRequest('INVALID_ALLOCATION', `This payment can only settle ${expected.toLowerCase().replace('_', ' ')}s`); + if (seen.has(a.documentId)) throw badRequest('INVALID_ALLOCATION', 'The same document appears twice'); + seen.add(a.documentId); + const amount = new Decimal(a.amount); + if (!amount.greaterThan(0)) throw badRequest('INVALID_ALLOCATION', 'Allocation amounts must be positive'); + const kind: DocKind = KINDS[a.documentType]; + const { rows: [doc] } = await db.query<{ status: string; party_id: string; remaining_amount: string; doc_date: string; doc_number: string }>( + `SELECT status, ${kind.party}_id AS party_id, remaining_amount::text, doc_date, doc_number + FROM ${kind.table} WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL FOR UPDATE`, [pay.company_id, a.documentId]); + if (!doc || doc.party_id !== partyId) throw badRequest('INVALID_ALLOCATION', `Document does not belong to this ${party}`); + if (doc.status === 'DRAFT' || doc.status === 'CANCELLED') throw conflict('DOCUMENT_NOT_OPEN', `${doc.doc_number ?? 'The draft'} is not open for settlement`); + if (amount.greaterThan(doc.remaining_amount)) { + throw badRequest('OVER_ALLOCATED', `${doc.doc_number}: only ${doc.remaining_amount} is still open`); + } + const settleColumn = kind.isReturn ? 'refunded_amount' : 'paid_amount'; + await db.query(`UPDATE ${kind.table} SET ${settleColumn} = ${settleColumn} + $2 WHERE id = $1`, [a.documentId, toMoney(amount)]); + if (!kind.isReturn) await refreshInvoiceStatus(db, kind, a.documentId); + await db.query( + `INSERT INTO payment_allocations (tenant_id, company_id, payment_id, ${TARGET_COLUMN[a.documentType]}, amount, created_by) + VALUES ($1, $2, $3, $4, $5, $6)`, [ctx.tenantId, pay.company_id, paymentId, a.documentId, toMoney(amount), ctx.userId]); + } + await db.query(`UPDATE payments SET allocated_amount = allocated_amount + $2 WHERE id = $1`, [paymentId, toMoney(total)]); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'UPDATE', entityType: 'payment', entityId: paymentId, newValues: { allocations } }, ctx.meta); + return loadPayment(db, ctx.tenantId, paymentId); +} + +/** Voids a payment: reverses its entry and releases every allocation. */ +export async function voidPayment(db: Db, ctx: Ctx, paymentId: string, reason: string) { + const { rows: [pay] } = await db.query<{ status: string; journal_entry_id: string; payment_date: string; payment_number: string }>( + `SELECT status, journal_entry_id, payment_date, payment_number FROM payments WHERE tenant_id = $1 AND id = $2 FOR UPDATE`, + [ctx.tenantId, paymentId]); + if (!pay) throw notFound('Payment'); + if (pay.status === 'VOIDED') throw conflict('ALREADY_VOIDED', 'This payment is already voided'); + + const { rows: allocations } = await db.query<{ id: string; amount: string; target: TargetType; document_id: string }>( + `SELECT id, amount::text, + CASE WHEN sales_invoice_id IS NOT NULL THEN 'SALES_INVOICE' WHEN sales_return_id IS NOT NULL THEN 'SALES_RETURN' + WHEN purchase_invoice_id IS NOT NULL THEN 'PURCHASE_INVOICE' ELSE 'PURCHASE_RETURN' END AS target, + COALESCE(sales_invoice_id, sales_return_id, purchase_invoice_id, purchase_return_id) AS document_id + FROM payment_allocations WHERE payment_id = $1 AND reversed_at IS NULL`, [paymentId]); + for (const a of allocations) { + const kind = KINDS[a.target]; + const settleColumn = kind.isReturn ? 'refunded_amount' : 'paid_amount'; + await db.query(`SELECT 1 FROM ${kind.table} WHERE id = $1 FOR UPDATE`, [a.document_id]); + await db.query(`UPDATE ${kind.table} SET ${settleColumn} = ${settleColumn} - $2 WHERE id = $1`, [a.document_id, a.amount]); + if (!kind.isReturn) await refreshInvoiceStatus(db, kind, a.document_id); + await db.query(`UPDATE payment_allocations SET reversed_at = now() WHERE id = $1`, [a.id]); + } + await reverse(db, ctx, pay.journal_entry_id, { reason: `إلغاء ${pay.payment_number}: ${reason}`, date: pay.payment_date, allowSystem: true }); + await db.query( + `UPDATE payments SET status = 'VOIDED', allocated_amount = 0, voided_by = $2, voided_at = now(), void_reason = $3 WHERE id = $1`, + [paymentId, ctx.userId, reason]); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'VOID', entityType: 'payment', entityId: paymentId, newValues: { reason } }, ctx.meta); + return loadPayment(db, ctx.tenantId, paymentId); +} + +export const PAYMENT_SELECT = ` + SELECT p.id, p.company_id AS "companyId", p.payment_number AS number, p.direction, p.payment_date AS date, + p.customer_id AS "customerId", p.supplier_id AS "supplierId", + COALESCE(c.name_ar, s.name_ar) AS "partyName", p.method_id AS "methodId", m.name_ar AS "methodName", + p.amount::text, p.allocated_amount::text AS "allocatedAmount", p.unallocated_amount::text AS "unallocatedAmount", + p.reference, p.notes, p.status, p.journal_entry_id AS "journalEntryId", p.void_reason AS "voidReason", + p.created_at AS "createdAt" + FROM payments p + JOIN payment_methods m ON m.id = p.method_id + LEFT JOIN customers c ON c.id = p.customer_id + LEFT JOIN suppliers s ON s.id = p.supplier_id`; + +export async function loadPayment(db: Db, tenantId: string, id: string) { + const { rows: [p] } = await db.query(`${PAYMENT_SELECT} WHERE p.tenant_id = $1 AND p.id = $2`, [tenantId, id]); + if (!p) throw notFound('Payment'); + const { rows: allocations } = await db.query( + `SELECT a.id, a.amount::text, a.reversed_at AS "reversedAt", + COALESCE(si.doc_number, sr.doc_number, pi.doc_number, pr.doc_number) AS "documentNumber", + CASE WHEN a.sales_invoice_id IS NOT NULL THEN 'SALES_INVOICE' WHEN a.sales_return_id IS NOT NULL THEN 'SALES_RETURN' + WHEN a.purchase_invoice_id IS NOT NULL THEN 'PURCHASE_INVOICE' ELSE 'PURCHASE_RETURN' END AS "documentType", + COALESCE(a.sales_invoice_id, a.sales_return_id, a.purchase_invoice_id, a.purchase_return_id) AS "documentId" + FROM payment_allocations a + LEFT JOIN sales_invoices si ON si.id = a.sales_invoice_id + LEFT JOIN sales_returns sr ON sr.id = a.sales_return_id + LEFT JOIN purchase_invoices pi ON pi.id = a.purchase_invoice_id + LEFT JOIN purchase_returns pr ON pr.id = a.purchase_return_id + WHERE a.payment_id = $1 ORDER BY a.created_at`, [id]); + return { ...p, allocations }; +} diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts b/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts new file mode 100644 index 000000000000..ce1ab8f10b85 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts @@ -0,0 +1,274 @@ +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict } from '../../lib/errors.js'; +import { Decimal, toMoney } from '../../lib/money.js'; +import { nextDocumentNumber } from '../../lib/sequences.js'; +import { postEntry, reverse, type LineInput as JournalLine } from '../accounting/engine.js'; +import { writeAudit } from '../audit/audit.service.js'; +import { totalsOf } from './calc.js'; +import { + buildLines, buildReturn, createDraft, defaultDueDate, insertItems, loadDocument, lockDocument, + type BuiltLine, type Ctx, type LineInput, +} from './drafts.js'; +import { KINDS, partyColumn, partyTable, type DocKind } from './kinds.js'; + +/** + * Issuing documents and the journal entries they create. + * + * Sales invoice Dr Receivable (customer) / Cr Revenue per account, Cr VAT output + * Sales return Dr Revenue, Dr VAT output / Cr Receivable (customer) + * Purchase invoice Dr Inventory/Expense per account, Dr VAT input / Cr Payable (supplier) + * Purchase return Dr Payable (supplier) / Cr Inventory/Expense, Cr VAT input + * + * The document and its entry are written in the same transaction. + * TODO(Phase 5): stock movements and the cost-of-goods-sold entry for tracked goods. + */ + +export async function systemAccount(db: Db, companyId: string, key: string): Promise { + const { rows: [a] } = await db.query<{ id: string }>( + `SELECT id FROM accounts WHERE company_id = $1 AND system_key = $2 AND deleted_at IS NULL AND is_active AND is_postable`, + [companyId, key]); + if (!a) throw conflict('SYSTEM_ACCOUNT_MISSING', `The ${key} account is missing or inactive`); + return a.id; +} + +/** The party's own control account, or the company default (receivable / payable). */ +export async function controlAccount(db: Db, party: 'customer' | 'supplier', companyId: string, partyId: string): Promise { + const column = party === 'customer' ? 'receivable_account_id' : 'payable_account_id'; + const { rows: [p] } = await db.query<{ account_id: string | null }>( + `SELECT ${column} AS account_id FROM ${party}s WHERE id = $1`, [partyId]); + return p?.account_id ?? systemAccount(db, companyId, party === 'customer' ? 'ACCOUNTS_RECEIVABLE' : 'ACCOUNTS_PAYABLE'); +} + +/** Posting account of every line: revenue for sales, inventory/expense for purchases. */ +async function lineAccounts(db: Db, kind: DocKind, companyId: string, lines: BuiltLine[]): Promise { + const productIds = [...new Set(lines.map((l) => l.productId).filter(Boolean))] as string[]; + const { rows } = await db.query<{ id: string; sales_account_id: string | null; purchase_account_id: string | null; track_inventory: boolean; name_ar: string }>( + `SELECT id, sales_account_id, purchase_account_id, track_inventory, name_ar FROM products WHERE id = ANY($1::uuid[])`, [productIds]); + const products = new Map(rows.map((p) => [p.id, p])); + const result: string[] = []; + for (const [i, l] of lines.entries()) { + if (l.accountId) { result.push(l.accountId); continue; } + const p = products.get(l.productId!)!; + if (kind.party === 'customer') { + result.push(p.sales_account_id ?? await systemAccount(db, companyId, 'SALES')); + } else if (p.purchase_account_id) { + result.push(p.purchase_account_id); + } else if (p.track_inventory) { + result.push(await systemAccount(db, companyId, 'INVENTORY')); + } else { + throw badRequest('ACCOUNT_REQUIRED', `Line ${i + 1}: choose an expense account for "${p.name_ar}" or set a purchase account on the product`); + } + } + return result; +} + +async function partySnapshot(db: Db, kind: DocKind, partyId: string) { + const { rows: [p] } = await db.query( + `SELECT p.code, p.name_ar AS "nameAr", p.name_en AS "nameEn", p.vat_number AS "vatNumber", + p.commercial_registration AS "commercialRegistration", p.party_type AS "partyType", + (SELECT jsonb_build_object('buildingNumber', a.building_number, 'street', a.street, 'district', a.district, + 'city', a.city, 'postalCode', a.postal_code, 'additionalNumber', a.additional_number, 'country', a.country) + FROM ${kind.party}_addresses a + WHERE a.${kind.party}_id = p.id AND a.address_type = 'BILLING' AND a.is_default AND a.deleted_at IS NULL) AS address + FROM ${partyTable(kind)} p WHERE p.id = $1`, [partyId]); + return p; +} + +/** Re-derives an invoice's status from its payments and issued returns. */ +export async function refreshInvoiceStatus(db: Db, kind: DocKind, invoiceId: string) { + const ret = kind.key === 'SALES_INVOICE' ? KINDS.SALES_RETURN : KINDS.PURCHASE_RETURN; + const { rows: [inv] } = await db.query<{ status: string; paid_amount: string; remaining_amount: string; fully_returned: boolean }>( + `SELECT d.status, d.paid_amount::text, d.remaining_amount::text, + NOT EXISTS ( + SELECT 1 FROM ${kind.itemsTable} i + WHERE i.document_id = d.id AND i.quantity > COALESCE(( + SELECT sum(ri.quantity) FROM ${ret.itemsTable} ri JOIN ${ret.table} r ON r.id = ri.document_id + WHERE ri.source_item_id = i.id AND r.status = 'ISSUED'), 0) + ) AS fully_returned + FROM ${kind.table} d WHERE d.id = $1`, [invoiceId]); + if (!inv || inv.status === 'CANCELLED' || inv.status === 'DRAFT') return; + const status = inv.fully_returned ? 'RETURNED' + : new Decimal(inv.remaining_amount).isZero() ? 'PAID' + : new Decimal(inv.paid_amount).greaterThan(0) ? 'PARTIALLY_PAID' + : kind.issuedStatus; + if (status !== inv.status) await db.query(`UPDATE ${kind.table} SET status = $2 WHERE id = $1`, [invoiceId, status]); +} + +/** Recalculates a draft with current tax rates right before issue. */ +async function recalculate(db: Db, kind: DocKind, ctx: Ctx, d: Awaited>) { + const current = await loadDocument(db, kind, ctx.tenantId, d.id); + let lines: BuiltLine[]; + let totals; + let fullyReturned = false; + if (kind.isReturn) { + const r = await buildReturn(db, kind, ctx.tenantId, { + originalInvoiceId: d.original_invoice_id as string, docDate: d.doc_date, reason: d.reason as string, + lines: current.lines.map((l) => ({ sourceItemId: l.sourceItemId!, quantity: l.quantity })), + }, d.id); + ({ lines, totals, fullyReturned } = r); + } else { + const input: LineInput[] = current.lines.map((l) => ({ + productId: l.productId, accountId: l.accountId, description: l.description, quantity: l.quantity, + unitPrice: l.unitPrice, discountAmount: l.discountBasis, unitId: l.unitId, vatCategory: l.vatCategory, + })); + lines = await buildLines(db, kind, d.company_id, { lines: input, docDate: d.doc_date, pricesIncludeVat: d.prices_include_vat as boolean }); + totals = totalsOf(lines); + } + return { lines, totals, fullyReturned }; +} + +export async function issueDocument(db: Db, kind: DocKind, ctx: Ctx, id: string) { + if (!kind.legal) throw badRequest('NOT_POSTABLE', `${kind.label}s do not post to the ledger`); + const d = await lockDocument(db, kind, ctx.tenantId, id); + if (d.status !== 'DRAFT') throw conflict('DOCUMENT_NOT_DRAFT', 'This document has already been issued'); + + const { lines, totals } = await recalculate(db, kind, ctx, d); + if (!new Decimal(totals.total).greaterThan(0)) throw badRequest('ZERO_TOTAL', 'A document with a zero total cannot be issued'); + + const { rows: [party] } = await db.query<{ is_active: boolean; credit_limit: string | null; vat_number: string | null }>( + `SELECT is_active, credit_limit::text, vat_number FROM ${partyTable(kind)} WHERE id = $1`, [d.party_id]); + if (!party!.is_active && !kind.isReturn) throw conflict('PARTY_INACTIVE', `The ${kind.party} is inactive`); + + if (kind.key === 'SALES_INVOICE' && party!.credit_limit !== null) { + const { rows: [bal] } = await db.query<{ balance: string }>( + `SELECT COALESCE(sum(l.debit - l.credit), 0)::text AS balance + FROM journal_entry_lines l JOIN journal_entries e ON e.id = l.journal_entry_id + WHERE l.customer_id = $1 AND e.status IN ('POSTED', 'REVERSED')`, [d.party_id]); + const exposure = new Decimal(bal!.balance).plus(totals.total); + if (exposure.greaterThan(party!.credit_limit)) { + throw conflict('CREDIT_LIMIT_EXCEEDED', `This invoice takes the customer's balance to ${toMoney(exposure)}, above the credit limit of ${toMoney(party!.credit_limit)}`); + } + } + + // Lines are final: store them with their posting accounts. + const accounts = await lineAccounts(db, kind, d.company_id, lines); + lines.forEach((l, i) => { l.accountId = accounts[i]!; }); + await db.query(`DELETE FROM ${kind.itemsTable} WHERE document_id = $1`, [id]); + await insertItems(db, kind, ctx.tenantId, d.company_id, id, lines); + + const number = await nextDocumentNumber(db, ctx.tenantId, d.company_id, kind.key, { prefix: kind.prefix, padding: 6 }); + const control = await controlAccount(db, kind.party, d.company_id, d.party_id); + const vatAccount = await systemAccount(db, d.company_id, kind.party === 'customer' ? 'VAT_OUTPUT' : 'VAT_INPUT'); + const tag = kind.party === 'customer' ? { customerId: d.party_id } : { supplierId: d.party_id }; + const branchId = d.branch_id; + + // Revenue / cost side, grouped per account. + const perAccount = new Map(); + lines.forEach((l) => perAccount.set(l.accountId!, (perAccount.get(l.accountId!) ?? new Decimal(0)).plus(l.netAmount))); + // Sales invoice & purchase return credit the line accounts; the other two debit them. + const linesSideCredit = kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_RETURN'; + const side = (credit: boolean, amount: Decimal.Value) => (credit ? { credit: toMoney(amount) } : { debit: toMoney(amount) }); + const journal: JournalLine[] = [ + { accountId: control, ...side(!linesSideCredit, totals.total), ...tag, branchId }, + ...[...perAccount.entries()].filter(([, v]) => !v.isZero()).map(([accountId, v]) => ({ accountId, ...side(linesSideCredit, v), branchId })), + ]; + if (new Decimal(totals.taxAmount).greaterThan(0)) journal.push({ accountId: vatAccount, ...side(linesSideCredit, totals.taxAmount), branchId }); + + const entry = await postEntry(db, ctx, { + companyId: d.company_id, entryDate: d.doc_date, description: `${kind.labelAr} ${number}`, + referenceType: kind.key, referenceId: id, source: 'SYSTEM', lines: journal, + }); + + const sets: [string, unknown][] = [ + ['status', kind.issuedStatus], ['doc_number', number], ['journal_entry_id', entry.id], ['issued_by', ctx.userId], + ['issued_at', new Date()], ['party_snapshot', JSON.stringify(await partySnapshot(db, kind, d.party_id))], + ['subtotal', totals.subtotal], ['discount_total', totals.discountTotal], ['taxable_amount', totals.taxableAmount], + ['tax_amount', totals.taxAmount], ['total', totals.total], + ]; + if (kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE') { + sets.push(['due_date', d.due_date ?? await defaultDueDate(db, kind, d.party_id, d.doc_date)]); + } + if (kind.key === 'SALES_INVOICE') sets.push(['invoice_kind', party!.vat_number ? 'STANDARD' : 'SIMPLIFIED']); + + let originalKind: DocKind | null = null; + if (kind.isReturn) { + // Apply the credit to the original invoice up to what is still open on it. + originalKind = KINDS[kind.originalKind!]; + const { rows: [orig] } = await db.query<{ remaining_amount: string; status: string }>( + `SELECT remaining_amount::text, status FROM ${originalKind.table} WHERE id = $1 FOR UPDATE`, [d.original_invoice_id]); + if (orig!.status === 'CANCELLED') throw conflict('INVOICE_CANCELLED', 'The original invoice was cancelled'); + const applied = Decimal.min(totals.total, orig!.remaining_amount); + sets.push(['applied_amount', toMoney(applied)]); + await db.query(`UPDATE ${originalKind.table} SET returned_amount = returned_amount + $2 WHERE id = $1`, [d.original_invoice_id, toMoney(applied)]); + } + await db.query(`UPDATE ${kind.table} SET ${sets.map(([c], i) => `${c} = $${i + 2}`).join(', ')} WHERE id = $1`, [id, ...sets.map(([, v]) => v)]); + if (originalKind) await refreshInvoiceStatus(db, originalKind, d.original_invoice_id as string); + + await writeAudit(db, { + tenantId: ctx.tenantId, userId: ctx.userId, action: 'POST', entityType: kind.entity, entityId: id, + newValues: { number, total: totals.total, taxAmount: totals.taxAmount, journalEntryId: entry.id }, + }, ctx.meta); + return loadDocument(db, kind, ctx.tenantId, id); +} + +/** + * Cancels an issued invoice or return that nothing has been settled + * against: its journal entry is reversed on the original date. + * TODO(Phase 8): once an invoice is reported to ZATCA it can only be corrected by a return (credit note). + */ +export async function cancelDocument(db: Db, kind: DocKind, ctx: Ctx, id: string, reason: string) { + const d = await lockDocument(db, kind, ctx.tenantId, id); + if (!kind.legal) { + const cancellable = kind.key === 'SALES_QUOTE' ? ['DRAFT', 'SENT', 'ACCEPTED'] : ['DRAFT', 'APPROVED']; + if (!cancellable.includes(d.status)) throw conflict('CANNOT_CANCEL', `A ${d.status.toLowerCase()} ${kind.label.toLowerCase()} cannot be cancelled`); + } else { + if (d.status === 'DRAFT') throw conflict('DOCUMENT_NOT_ISSUED', 'Delete the draft instead'); + if (d.status === 'CANCELLED') throw conflict('ALREADY_CANCELLED', 'This document is already cancelled'); + if (kind.isReturn) { + if (new Decimal(d.refunded_amount as string).greaterThan(0)) throw conflict('HAS_PAYMENTS', 'Void the refund payments first'); + } else { + if (new Decimal(d.paid_amount as string).greaterThan(0)) throw conflict('HAS_PAYMENTS', 'Void the payments allocated to this invoice first'); + const ret = kind.key === 'SALES_INVOICE' ? KINDS.SALES_RETURN : KINDS.PURCHASE_RETURN; + const returns = await db.query(`SELECT 1 FROM ${ret.table} WHERE original_invoice_id = $1 AND status = 'ISSUED' LIMIT 1`, [id]); + if (returns.rowCount) throw conflict('HAS_RETURNS', 'Cancel the returns issued against this invoice first'); + } + await reverse(db, ctx, d.journal_entry_id!, { reason: `إلغاء ${kind.labelAr} ${d.doc_number}: ${reason}`, date: d.doc_date, allowSystem: true }); + } + await db.query(`UPDATE ${kind.table} SET status = 'CANCELLED', cancelled_by = $2, cancelled_at = now(), cancel_reason = $3 WHERE id = $1`, + [id, ctx.userId, reason]); + if (kind.isReturn) { + const orig = KINDS[kind.originalKind!]; + await db.query(`SELECT 1 FROM ${orig.table} WHERE id = $1 FOR UPDATE`, [d.original_invoice_id]); + await db.query(`UPDATE ${orig.table} SET returned_amount = returned_amount - $2 WHERE id = $1`, [d.original_invoice_id, d.applied_amount]); + await refreshInvoiceStatus(db, orig, d.original_invoice_id as string); + } + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'CANCEL', entityType: kind.entity, entityId: id, newValues: { reason } }, ctx.meta); + return loadDocument(db, kind, ctx.tenantId, id); +} + +const TRANSITIONS: Record> = { + SALES_QUOTE: { DRAFT: ['SENT'], SENT: ['ACCEPTED', 'REJECTED'] }, + PURCHASE_ORDER: { DRAFT: ['APPROVED'] }, +}; + +/** Moves a quote or purchase order along its workflow. */ +export async function setStatus(db: Db, kind: DocKind, ctx: Ctx, id: string, status: string) { + const d = await lockDocument(db, kind, ctx.tenantId, id); + const allowed = TRANSITIONS[kind.key]?.[d.status] ?? []; + if (!allowed.includes(status)) throw conflict('INVALID_TRANSITION', `Cannot move from ${d.status} to ${status}`); + await db.query(`UPDATE ${kind.table} SET status = $2 WHERE id = $1`, [id, status]); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'UPDATE', entityType: kind.entity, entityId: id, oldValues: { status: d.status }, newValues: { status } }, ctx.meta); + return loadDocument(db, kind, ctx.tenantId, id); +} + +/** Copies a quote into a draft invoice, or an approved order into a draft purchase invoice. */ +export async function convertDocument(db: Db, kind: DocKind, ctx: Ctx, id: string, docDate: string) { + const target = kind.key === 'SALES_QUOTE' ? KINDS.SALES_INVOICE : kind.key === 'PURCHASE_ORDER' ? KINDS.PURCHASE_INVOICE : null; + if (!target) throw badRequest('NOT_CONVERTIBLE', 'Only quotes and purchase orders can be converted'); + const d = await lockDocument(db, kind, ctx.tenantId, id); + const ok = kind.key === 'SALES_QUOTE' ? ['DRAFT', 'SENT', 'ACCEPTED'] : ['APPROVED']; + if (!ok.includes(d.status)) throw conflict('INVALID_TRANSITION', `A ${d.status.toLowerCase()} ${kind.label.toLowerCase()} cannot be converted`); + const source = await loadDocument(db, kind, ctx.tenantId, id); + const invoiceId = await createDraft(db, target, ctx, { + companyId: d.company_id, partyId: d.party_id, docDate, branchId: d.branch_id, warehouseId: d.warehouse_id as string | null, + pricesIncludeVat: d.prices_include_vat as boolean, notes: d.notes as string | null, sourceId: id, + lines: source.lines.map((l) => ({ + productId: l.productId, accountId: l.accountId, description: l.description, quantity: l.quantity, + unitPrice: l.unitPrice, discountAmount: l.discountBasis, unitId: l.unitId, vatCategory: l.vatCategory, + })), + }); + await db.query(`UPDATE ${kind.table} SET status = 'CONVERTED', converted_invoice_id = $2 WHERE id = $1`, [id, invoiceId]); + await writeAudit(db, { tenantId: ctx.tenantId, userId: ctx.userId, action: 'UPDATE', entityType: kind.entity, entityId: id, newValues: { status: 'CONVERTED', invoiceId } }, ctx.meta); + return loadDocument(db, target, ctx.tenantId, invoiceId); +} + diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/routes.ts b/alshuyukh-accounting/apps/api/src/modules/documents/routes.ts new file mode 100644 index 000000000000..93cdaca81fb6 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/documents/routes.ts @@ -0,0 +1,357 @@ +import type { FastifyInstance, FastifyRequest } from 'fastify'; +import { z } from 'zod'; +import { isoDate, todayIn } from '../../lib/dates.js'; +import { badRequest, notFound } from '../../lib/errors.js'; +import { amountString } from '../../lib/money.js'; +import { parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { resolveCompanyId } from '../accounting/company-context.js'; +import { writeAudit } from '../audit/audit.service.js'; +import { CalcError, totalsOf } from './calc.js'; +import { buildLines, buildReturn, createDraft, createReturnDraft, deleteDraft, headerSelect, loadDocument, updateDraft, type Ctx } from './drafts.js'; +import { KINDS, partyColumn, type DocKind } from './kinds.js'; +import { PAYMENT_SELECT, allocate, createPayment, loadPayment, voidPayment } from './payments.js'; +import { cancelDocument, convertDocument, issueDocument, setStatus } from './posting.js'; + +const quantity = z.string().trim().regex(/^\d{1,14}(\.\d{1,4})?$/, 'Quantity: up to 4 decimals, sent as a string'); +const price = z.string().trim().regex(/^\d{1,14}(\.\d{1,4})?$/, 'Price: up to 4 decimals, sent as a string'); +const percent = z.string().trim().regex(/^\d{1,3}(\.\d{1,2})?$/); + +const line = z.object({ + productId: z.uuid().nullish(), + accountId: z.uuid().nullish(), + description: z.string().trim().max(500).nullish(), + quantity, + unitPrice: price.optional(), + discountAmount: amountString.optional(), + discountPercent: percent.optional(), + unitId: z.uuid().nullish(), + vatCategory: z.enum(['S', 'Z', 'E', 'O']).optional(), +}); + +const draftFields = { + companyId: z.uuid().optional(), + partyId: z.uuid(), + docDate: isoDate, + dueDate: isoDate.nullish(), + validUntil: isoDate.nullish(), + expectedDate: isoDate.nullish(), + supplierInvoiceNumber: z.string().trim().min(1).max(60).nullish(), + branchId: z.uuid().nullish(), + warehouseId: z.uuid().nullish(), + pricesIncludeVat: z.boolean().optional(), + notes: z.string().trim().max(2000).nullish(), + lines: z.array(line).min(1).max(500), +}; +const draftBody = z.object(draftFields); +const draftUpdate = z.object(draftFields).omit({ companyId: true }).partial(); + +const returnBody = z.object({ + originalInvoiceId: z.uuid(), + docDate: isoDate, + reason: z.string().trim().min(3).max(500), + notes: z.string().trim().max(2000).nullish(), + lines: z.array(z.object({ sourceItemId: z.uuid(), quantity })).min(1).max(500), +}); +const returnUpdate = returnBody.omit({ originalInvoiceId: true }).partial(); + +const listQuery = z.object({ + companyId: z.uuid().optional(), + status: z.string().regex(/^[A-Z_]+(,[A-Z_]+)*$/).optional(), + partyId: z.uuid().optional(), + dateFrom: isoDate.optional(), + dateTo: isoDate.optional(), + open: z.enum(['true', 'false']).optional(), + search: z.string().trim().max(60).optional(), + limit: z.coerce.number().int().min(1).max(200).default(50), + offset: z.coerce.number().int().min(0).default(0), +}); + +const ctxOf = (req: FastifyRequest): Ctx => ({ tenantId: req.auth!.tenantId, userId: req.auth!.userId, meta: req.auditMeta() }); + +const asCalcError = (e: unknown) => (e instanceof CalcError ? badRequest('INVALID_LINE', e.message) : e); + +function documentRoutes(kind: DocKind) { + return async (app: FastifyInstance) => { + const base = `/${kind.path}`; + const can = (p: keyof DocKind['perm']) => requirePermission(app, kind.perm[p]); + + app.get(base, { preHandler: can('view') }, async (req) => { + const q = parse(listQuery, req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const statuses = q.status?.split(',') ?? null; + const search = q.search ? `%${q.search.replace(/[%_\\]/g, (m) => `\\${m}`)}%` : null; + const hasRemaining = kind.legal; + const { rows } = await db.query<{ total_count: string }>( + `${headerSelect(kind).replace('SELECT d.id', 'SELECT count(*) OVER () AS total_count, d.id')} + WHERE d.tenant_id = $1 AND d.company_id = $2 AND d.deleted_at IS NULL + AND ($3::text[] IS NULL OR d.status = ANY($3)) + AND ($4::uuid IS NULL OR d.${partyColumn(kind)} = $4) + AND ($5::date IS NULL OR d.doc_date >= $5) AND ($6::date IS NULL OR d.doc_date <= $6) + AND (NOT $7::boolean ${hasRemaining ? `OR (d.status NOT IN ('DRAFT', 'CANCELLED') AND d.remaining_amount > 0)` : ''}) + AND ($8::text IS NULL OR d.doc_number ILIKE $8 OR p.name_ar ILIKE $8) + ORDER BY d.doc_date DESC, d.doc_number DESC NULLS FIRST, d.created_at DESC + LIMIT $9 OFFSET $10`, + [req.auth!.tenantId, companyId, statuses, q.partyId ?? null, q.dateFrom ?? null, q.dateTo ?? null, + q.open === 'true', search, q.limit, q.offset]); + return { data: rows.map(({ total_count: _t, ...r }) => r), total: Number(rows[0]?.total_count ?? 0) }; + }); + }); + + app.get(`${base}/:id`, { preHandler: can('view') }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx((db) => loadDocument(db, kind, req.auth!.tenantId, id)); + }); + + /** Server-side totals for the form, without saving anything. */ + app.post(`${base}/calculate`, { preHandler: can('view') }, async (req) => { + return req.tenantTx(async (db) => { + try { + if (kind.isReturn) { + const body = parse(returnBody.extend({ reason: z.string().optional() }), req.body); + const r = await buildReturn(db, kind, req.auth!.tenantId, { ...body, reason: body.reason ?? '' }, null); + return { lines: r.lines, totals: r.totals }; + } + const body = parse(draftBody.extend({ partyId: z.uuid().optional() }), req.body); + const companyId = await resolveCompanyId(db, req.auth!.tenantId, body.companyId); + const lines = await buildLines(db, kind, companyId, body); + return { lines, totals: totalsOf(lines) }; + } catch (e) { throw asCalcError(e); } + }); + }); + + app.post(base, { preHandler: can('create') }, async (req, reply) => { + const ctx = ctxOf(req); + const doc = await req.tenantTx(async (db) => { + let id: string; + if (kind.isReturn) { + id = await createReturnDraft(db, kind, ctx, parse(returnBody, req.body)); + } else { + const body = parse(draftBody, req.body); + const companyId = await resolveCompanyId(db, ctx.tenantId, body.companyId); + id = await createDraft(db, kind, ctx, { ...body, companyId }); + } + return loadDocument(db, kind, ctx.tenantId, id); + }); + reply.code(201); + return doc; + }); + + app.patch(`${base}/:id`, { preHandler: can('edit') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = kind.isReturn ? parse(returnUpdate, req.body) : parse(draftUpdate, req.body); + return req.tenantTx((db) => updateDraft(db, kind, ctxOf(req), id, body)); + }); + + app.delete(`${base}/:id`, { preHandler: can('delete') }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + await req.tenantTx((db) => deleteDraft(db, kind, ctxOf(req), id)); + return reply.code(204).send(); + }); + + app.post(`${base}/:id/cancel`, { preHandler: can('cancel') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const { reason } = parse(z.object({ reason: z.string().trim().min(3).max(500) }), req.body); + return req.tenantTx((db) => cancelDocument(db, kind, ctxOf(req), id, reason)); + }); + + if (kind.legal) { + app.post(`${base}/:id/post`, { preHandler: can('issue') }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx(async (db) => { + try { return await issueDocument(db, kind, ctxOf(req), id); } catch (e) { throw asCalcError(e); } + }); + }); + } else { + app.post(`${base}/:id/status`, { preHandler: can(kind.key === 'PURCHASE_ORDER' ? 'issue' : 'edit') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const { status } = parse(z.object({ status: z.enum(['SENT', 'ACCEPTED', 'REJECTED', 'APPROVED']) }), req.body); + return req.tenantTx((db) => setStatus(db, kind, ctxOf(req), id, status)); + }); + app.post(`${base}/:id/convert`, { preHandler: can('create') }, async (req, reply) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ docDate: isoDate.optional() }), req.body ?? {}); + const invoice = await req.tenantTx((db) => convertDocument(db, kind, ctxOf(req), id, body.docDate ?? todayIn('Asia/Riyadh'))); + reply.code(201); + return invoice; + }); + } + }; +} + +const paymentBody = z.object({ + companyId: z.uuid().optional(), + direction: z.enum(['RECEIPT', 'DISBURSEMENT']), + customerId: z.uuid().nullish(), + supplierId: z.uuid().nullish(), + paymentDate: isoDate, + methodId: z.uuid(), + amount: amountString.refine((v) => Number(v) > 0, 'Amount must be greater than zero'), + reference: z.string().trim().max(100).nullish(), + notes: z.string().trim().max(1000).nullish(), + branchId: z.uuid().nullish(), + allocations: z.array(z.object({ + documentType: z.enum(['SALES_INVOICE', 'SALES_RETURN', 'PURCHASE_INVOICE', 'PURCHASE_RETURN']), + documentId: z.uuid(), + amount: amountString, + })).max(200).default([]), +}); + +async function paymentRoutes(app: FastifyInstance) { + app.get('/payments', { preHandler: requirePermission(app, 'payment.view') }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), + direction: z.enum(['RECEIPT', 'DISBURSEMENT']).optional(), + customerId: z.uuid().optional(), + supplierId: z.uuid().optional(), + status: z.enum(['POSTED', 'VOIDED']).optional(), + limit: z.coerce.number().int().min(1).max(200).default(50), + offset: z.coerce.number().int().min(0).default(0), + }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query<{ total_count: string }>( + `${PAYMENT_SELECT.replace('SELECT p.id', 'SELECT count(*) OVER () AS total_count, p.id')} + WHERE p.tenant_id = $1 AND p.company_id = $2 AND ($3::text IS NULL OR p.direction = $3) + AND ($4::uuid IS NULL OR p.customer_id = $4) AND ($5::uuid IS NULL OR p.supplier_id = $5) + AND ($6::text IS NULL OR p.status = $6) + ORDER BY p.payment_date DESC, p.payment_number DESC LIMIT $7 OFFSET $8`, + [req.auth!.tenantId, companyId, q.direction ?? null, q.customerId ?? null, q.supplierId ?? null, q.status ?? null, q.limit, q.offset]); + return { data: rows.map(({ total_count: _t, ...r }) => r), total: Number(rows[0]?.total_count ?? 0) }; + }); + }); + + app.get('/payments/:id', { preHandler: requirePermission(app, 'payment.view') }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx((db) => loadPayment(db, req.auth!.tenantId, id)); + }); + + app.post('/payments', { preHandler: requirePermission(app, 'payment.create') }, async (req, reply) => { + const body = parse(paymentBody, req.body); + const payment = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, body.companyId); + return createPayment(db, ctxOf(req), { ...body, companyId }); + }); + reply.code(201); + return payment; + }); + + app.post('/payments/:id/allocations', { preHandler: requirePermission(app, 'payment.create') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const { allocations } = parse(paymentBody.pick({ allocations: true }), req.body); + if (!allocations.length) throw badRequest('NO_ALLOCATIONS', 'Provide at least one allocation'); + return req.tenantTx((db) => allocate(db, ctxOf(req), id, allocations)); + }); + + app.post('/payments/:id/void', { preHandler: requirePermission(app, 'payment.void') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const { reason } = parse(z.object({ reason: z.string().trim().min(3).max(500) }), req.body); + return req.tenantTx((db) => voidPayment(db, ctxOf(req), id, reason)); + }); + + // Payment methods --------------------------------------------------------------- + const METHOD_SELECT = `SELECT m.id, m.code, m.name_ar AS "nameAr", m.method_type AS "methodType", m.account_id AS "accountId", + a.code AS "accountCode", a.name_ar AS "accountName", m.is_active AS "isActive", m.sort_order AS "sortOrder" + FROM payment_methods m JOIN accounts a ON a.id = m.account_id`; + + app.get('/payment-methods', { preHandler: requirePermission(app, 'payment.view') }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + return { data: (await db.query(`${METHOD_SELECT} WHERE m.tenant_id = $1 AND m.company_id = $2 ORDER BY m.sort_order, m.code`, [req.auth!.tenantId, companyId])).rows }; + }); + }); + + const methodAccountCheck = async (db: Parameters[0]>[0], companyId: string, accountId: string) => { + const { rows: [a] } = await db.query<{ account_type: string; is_postable: boolean; is_active: boolean }>( + `SELECT account_type, is_postable, is_active FROM accounts WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, accountId]); + if (!a || a.account_type !== 'ASSET' || !a.is_postable || !a.is_active) { + throw badRequest('INVALID_ACCOUNT', 'A payment method needs an active postable asset account (cash, bank or clearing)'); + } + }; + + app.post('/payment-methods', { preHandler: requirePermission(app, 'settings.manage') }, async (req, reply) => { + const body = parse(z.object({ + companyId: z.uuid().optional(), + code: z.string().trim().toUpperCase().regex(/^[A-Z][A-Z0-9_]{1,30}$/), + nameAr: z.string().trim().min(2).max(100), + methodType: z.enum(['CASH', 'BANK', 'CARD', 'STC_PAY', 'TAMARA', 'OTHER']), + accountId: z.uuid(), + }), req.body); + const a = req.auth!; + const method = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + await methodAccountCheck(db, companyId, body.accountId); + const { rows: [m] } = await db.query<{ id: string }>( + `INSERT INTO payment_methods (tenant_id, company_id, code, name_ar, method_type, account_id, sort_order) + VALUES ($1, $2, $3, $4, $5, $6, 100) RETURNING id`, [a.tenantId, companyId, body.code, body.nameAr, body.methodType, body.accountId]); + const created = (await db.query(`${METHOD_SELECT} WHERE m.id = $1`, [m!.id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'SETTINGS_CHANGE', entityType: 'payment_method', entityId: m!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return method; + }); + + app.patch('/payment-methods/:id', { preHandler: requirePermission(app, 'settings.manage') }, async (req) => { + const { id } = parse(uuidParam, req.params); + const body = parse(z.object({ nameAr: z.string().trim().min(2).max(100), accountId: z.uuid(), isActive: z.boolean() }).partial(), req.body); + const a = req.auth!; + return req.tenantTx(async (db) => { + const { rows: [before] } = await db.query<{ companyId: string }>(`${METHOD_SELECT.replace('SELECT m.id', 'SELECT m.company_id AS "companyId", m.id')} WHERE m.tenant_id = $1 AND m.id = $2`, [a.tenantId, id]); + if (!before) throw notFound('Payment method'); + if (body.accountId) await methodAccountCheck(db, before.companyId, body.accountId); + await db.query(`UPDATE payment_methods SET name_ar = COALESCE($2, name_ar), account_id = COALESCE($3, account_id), is_active = COALESCE($4, is_active) WHERE id = $1`, + [id, body.nameAr ?? null, body.accountId ?? null, body.isActive ?? null]); + const after = (await db.query(`${METHOD_SELECT} WHERE m.id = $1`, [id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'SETTINGS_CHANGE', entityType: 'payment_method', entityId: id, oldValues: before, newValues: after }, req.auditMeta()); + return after; + }); + }); + + // Tax rates --------------------------------------------------------------------- + // The VAT rate is data, not code: a new rate is added with an effective date + // and the previous one is closed the day before. Phase 6 adds the VAT report. + const RATE_SELECT = `SELECT id, vat_category AS "vatCategory", name_ar AS "nameAr", rate::text, effective_from AS "effectiveFrom", + effective_to AS "effectiveTo", is_active AS "isActive" FROM tax_rates`; + + app.get('/tax-rates', { preHandler: requirePermission(app, 'invoice.view') }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + return { data: (await db.query(`${RATE_SELECT} WHERE tenant_id = $1 AND company_id = $2 ORDER BY effective_from DESC`, [req.auth!.tenantId, companyId])).rows }; + }); + }); + + app.post('/tax-rates', { preHandler: requirePermission(app, 'tax.manage') }, async (req, reply) => { + const body = parse(z.object({ + companyId: z.uuid().optional(), + nameAr: z.string().trim().min(2).max(100), + rate: z.string().regex(/^0\.\d{1,4}$/, 'Rate is a fraction, e.g. "0.15"'), + effectiveFrom: isoDate, + }), req.body); + const a = req.auth!; + const rate = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + // Close the rate that is open on the new start date. + await db.query( + `UPDATE tax_rates SET effective_to = $2::date - 1 + WHERE company_id = $1 AND vat_category = 'S' AND is_active AND effective_from < $2 + AND (effective_to IS NULL OR effective_to >= $2)`, [companyId, body.effectiveFrom]); + const { rows: [r] } = await db.query<{ id: string }>( + `INSERT INTO tax_rates (tenant_id, company_id, name_ar, rate, effective_from, created_by) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`, + [a.tenantId, companyId, body.nameAr, body.rate, body.effectiveFrom, a.userId]); + const created = (await db.query(`${RATE_SELECT} WHERE id = $1`, [r!.id])).rows[0]; + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'SETTINGS_CHANGE', entityType: 'tax_rate', entityId: r!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return rate; + }); +} + +export default async function documentsModule(app: FastifyInstance) { + for (const kind of Object.values(KINDS)) await app.register(documentRoutes(kind)); + await app.register(paymentRoutes); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts b/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts index 59242eb36e6f..48e319fd202b 100644 --- a/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts +++ b/alshuyukh-accounting/apps/api/src/modules/parties/parties.routes.ts @@ -255,8 +255,11 @@ export function partyRoutes(kind: PartyKind) { await req.tenantTx(async (db) => { const before = await load(db, a.tenantId, id); if (!before) throw notFound(kind.label); - const used = await db.query(`SELECT 1 FROM journal_entry_lines WHERE ${kind.fk} = $1 LIMIT 1`, [id]); - // TODO(Phase 4): also refuse when invoices or payments reference the party. + const docTables = kind.table === 'customers' ? ['sales_quotes', 'sales_invoices', 'sales_returns'] : ['purchase_orders', 'purchase_invoices', 'purchase_returns']; + const used = await db.query( + `SELECT 1 FROM journal_entry_lines WHERE ${kind.fk} = $1 + UNION ALL SELECT 1 FROM payments WHERE ${kind.fk} = $1 + ${docTables.map((t) => `UNION ALL SELECT 1 FROM ${t} WHERE ${kind.fk} = $1`).join(' ')} LIMIT 1`, [id]); if (used.rowCount) throw conflict('PARTY_IN_USE', `This ${kind.entity} has accounting transactions. Deactivate it instead.`); await db.query(`UPDATE ${kind.table} SET deleted_at = now(), is_active = false, updated_by = $2 WHERE id = $1`, [id, a.userId]); await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: kind.entity, entityId: id, oldValues: before }, req.auditMeta()); diff --git a/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts b/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts index beca3f6281d8..2d4da81ac37d 100644 --- a/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts +++ b/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts @@ -296,7 +296,10 @@ export default async function productsRoutes(app: FastifyInstance) { await req.tenantTx(async (db) => { const before = await loadProduct(db, a.tenantId, id); if (!before) throw notFound('Product'); - // TODO(Phase 4/5): refuse when invoices or stock movements reference the product. + const itemTables = ['sales_quote_items', 'sales_invoice_items', 'sales_return_items', 'purchase_order_items', 'purchase_invoice_items', 'purchase_return_items']; + // TODO(Phase 5): also refuse when stock movements reference the product. + const used = await db.query(`${itemTables.map((t) => `SELECT 1 FROM ${t} WHERE product_id = $1`).join(' UNION ALL ')} LIMIT 1`, [id]); + if (used.rowCount) throw conflict('PRODUCT_IN_USE', 'This product is used in documents. Deactivate it instead.'); await db.query(`UPDATE products SET deleted_at = now(), is_active = false, updated_by = $2 WHERE id = $1`, [id, a.userId]); await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'product', entityId: id, oldValues: before }, req.auditMeta()); }); diff --git a/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts b/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts index 89559d53cb21..f44fbff3b77e 100644 --- a/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts +++ b/alshuyukh-accounting/apps/api/src/modules/rbac/catalog.ts @@ -55,8 +55,10 @@ export const PERMISSIONS: readonly PermissionDef[] = [ { code: 'purchase.view', module: 'purchases', ar: 'عرض المشتريات', en: 'View purchases' }, { code: 'purchase.create', module: 'purchases', ar: 'إنشاء المشتريات', en: 'Create purchases' }, { code: 'purchase.post', module: 'purchases', ar: 'اعتماد المشتريات', en: 'Post purchases' }, + { code: 'purchase.cancel', module: 'purchases', ar: 'إلغاء المشتريات', en: 'Cancel purchases' }, { code: 'payment.view', module: 'payments', ar: 'عرض المدفوعات', en: 'View payments' }, { code: 'payment.create', module: 'payments', ar: 'تسجيل المدفوعات', en: 'Record payments' }, + { code: 'payment.void', module: 'payments', ar: 'إلغاء المدفوعات', en: 'Void payments' }, // Phase 5–6 — inventory, expenses, tax { code: 'inventory.view', module: 'inventory', ar: 'عرض المخزون', en: 'View inventory' }, @@ -105,8 +107,8 @@ export const SYSTEM_ROLES: readonly SystemRoleDef[] = [ 'journal.post', 'journal.reverse', 'fiscal.manage', 'customer.view', 'customer.manage', 'supplier.view', 'supplier.manage', 'product.view', 'invoice.view', 'invoice.create', 'invoice.edit', 'invoice.post', - 'invoice.cancel', 'purchase.view', 'purchase.create', 'purchase.post', 'payment.view', - 'payment.create', 'inventory.view', 'expense.view', 'expense.create', 'expense.post', + 'invoice.cancel', 'purchase.view', 'purchase.create', 'purchase.post', 'purchase.cancel', 'payment.view', + 'payment.create', 'payment.void', 'inventory.view', 'expense.view', 'expense.create', 'expense.post', 'tax.manage', 'report.view', 'zatca.view', ], }, @@ -132,7 +134,7 @@ export const SYSTEM_ROLES: readonly SystemRoleDef[] = [ en: 'Purchase manager', permissions: [ 'company.view', 'supplier.view', 'supplier.manage', 'product.view', 'purchase.view', - 'purchase.create', 'purchase.post', 'payment.view', 'inventory.view', 'report.view', + 'purchase.create', 'purchase.post', 'purchase.cancel', 'payment.view', 'inventory.view', 'report.view', ], }, { diff --git a/alshuyukh-accounting/apps/api/test/calc.test.ts b/alshuyukh-accounting/apps/api/test/calc.test.ts new file mode 100644 index 000000000000..137be9179632 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/calc.test.ts @@ -0,0 +1,66 @@ +import { describe, expect, it } from 'vitest'; +import { CalcError, calculateDocument, calculateLine, totalsOf } from '../src/modules/documents/calc.js'; + +const S = (quantity: string, unitPrice: string, extra = {}) => ({ quantity, unitPrice, vatCategory: 'S' as const, vatRate: '0.15', ...extra }); + +describe('VAT calculation', () => { + it('computes the reference example: 1000 SAR + 15% VAT = 1150', () => { + const { totals } = calculateDocument([S('1', '1000')], false); + expect(totals).toMatchObject({ subtotal: '1000.00', discountTotal: '0.00', taxableAmount: '1000.00', taxAmount: '150.00', total: '1150.00' }); + }); + + it('applies line discounts before VAT', () => { + const { lines, totals } = calculateDocument([S('4', '250', { discountPercent: '10' }), S('2', '50', { discountAmount: '5' })], false); + expect(lines[0]).toMatchObject({ grossAmount: '1000.00', discountAmount: '100.00', netAmount: '900.00', vatAmount: '135.00' }); + expect(totals).toMatchObject({ subtotal: '1100.00', discountTotal: '105.00', taxableAmount: '995.00', taxAmount: '149.25', total: '1144.25' }); + }); + + it('rounds VAT once per category, not per line', () => { + // Three lines of 0.10: per-line VAT rounds 0.015 → 0.02 each (0.06), document VAT is round(0.30 × 0.15) = 0.05. + const { lines, totals } = calculateDocument([S('1', '0.10'), S('1', '0.10'), S('1', '0.10')], false); + expect(lines.map((l) => l.vatAmount)).toEqual(['0.02', '0.02', '0.02']); + expect(totals.taxAmount).toBe('0.05'); + expect(totals.total).toBe('0.35'); + }); + + it('extracts VAT from VAT-inclusive prices', () => { + const { lines, totals } = calculateDocument([S('1', '115'), S('3', '10')], true); + expect(lines[0]).toMatchObject({ netAmount: '100.00', vatAmount: '15.00' }); + expect(lines[1]).toMatchObject({ netAmount: '26.09' }); + expect(totals).toMatchObject({ taxableAmount: '126.09', taxAmount: '18.91', total: '145.00' }); + }); + + it('handles quantities and prices with 4 decimals exactly', () => { + const line = calculateLine(S('2.5', '4.1250'), false, 1); + expect(line).toMatchObject({ grossAmount: '10.31', netAmount: '10.31', vatAmount: '1.55' }); + }); + + it('separates zero-rated, exempt and standard lines', () => { + const { totals } = calculateDocument([ + S('1', '100'), + { quantity: '1', unitPrice: '200', vatCategory: 'Z', vatRate: '0' }, + { quantity: '1', unitPrice: '50', vatCategory: 'E', vatRate: '0' }, + ], false); + expect(totals.taxBreakdown).toEqual([ + { vatCategory: 'S', vatRate: '0.15', taxableAmount: '100.00', taxAmount: '15.00' }, + { vatCategory: 'Z', vatRate: '0', taxableAmount: '200.00', taxAmount: '0.00' }, + { vatCategory: 'E', vatRate: '0', taxableAmount: '50.00', taxAmount: '0.00' }, + ]); + expect(totals.total).toBe('365.00'); + }); + + it('rejects invalid lines', () => { + const bad = [ + S('0', '10'), S('-1', '10'), S('1', '-5'), S('1', '10', { discountAmount: '11' }), + S('1', '10', { discountPercent: '101' }), S('1', '10', { discountAmount: '1', discountPercent: '5' }), + { quantity: '1', unitPrice: '10', vatCategory: 'Z' as const, vatRate: '0.15' }, + { quantity: '1', unitPrice: '10', vatCategory: 'S' as const, vatRate: '0' }, + ]; + for (const l of bad) expect(() => calculateLine(l, false, 1), JSON.stringify(l)).toThrow(CalcError); + }); + + it('totals arbitrary stored lines (used for returns)', () => { + const t = totalsOf([{ grossAmount: '500.00', discountAmount: '0.00', netAmount: '500.00', vatCategory: 'S', vatRate: '0.15' }]); + expect(t.total).toBe('575.00'); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/commerce-helpers.ts b/alshuyukh-accounting/apps/api/test/commerce-helpers.ts new file mode 100644 index 000000000000..b0bc2b6259d5 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/commerce-helpers.ts @@ -0,0 +1,52 @@ +import type { FastifyInstance } from 'fastify'; +import { client, dateInYear, type Session } from './helpers.js'; + +export interface Commerce { + api: ReturnType; + date: string; + customer(extra?: Record): Promise<{ id: string }>; + supplier(extra?: Record): Promise<{ id: string }>; + product(extra?: Record): Promise<{ id: string }>; + invoice(customerId: string, lines: unknown[], extra?: Record): Promise>; + postInvoice(customerId: string, lines: unknown[], extra?: Record): Promise>; + purchase(supplierId: string, lines: unknown[], extra?: Record): Promise>; + method(code: string): Promise; + journal(id: string): Promise<{ accountCode: string; debit: string; credit: string; customerId: string | null; supplierId: string | null }[]>; +} + +let seq = 0; +export async function commerce(app: FastifyInstance, s: Session): Promise { + const api = client(app, s.token); + const date = await dateInYear(app, s.token, 3, 10); + const ok = async (p: Promise<{ statusCode: number; json(): any; body: string }>, status = 201) => { + const r = await p; + if (r.statusCode !== status) throw new Error(`expected ${status}, got ${r.statusCode}: ${r.body}`); + return r.json(); + }; + return { + api, + date, + customer: (extra = {}) => ok(api.post('/api/customers', { nameAr: `عميل ${++seq}`, ...extra })), + supplier: (extra = {}) => ok(api.post('/api/suppliers', { nameAr: `مورد ${++seq}`, ...extra })), + product: (extra = {}) => ok(api.post('/api/products', { nameAr: `منتج ${++seq}`, salePrice: '100', purchasePrice: '60', ...extra })), + invoice: (customerId, lines, extra = {}) => ok(api.post('/api/invoices', { partyId: customerId, docDate: date, lines, ...extra })), + async postInvoice(customerId, lines, extra = {}) { + const inv = await ok(api.post('/api/invoices', { partyId: customerId, docDate: date, lines, ...extra })); + return ok(api.post(`/api/invoices/${inv.id}/post`), 200); + }, + async purchase(supplierId, lines, extra = {}) { + const inv = await ok(api.post('/api/purchase-invoices', { partyId: supplierId, docDate: date, lines, ...extra })); + return ok(api.post(`/api/purchase-invoices/${inv.id}/post`), 200); + }, + async method(code) { + const m = (await api.get('/api/payment-methods')).json().data.find((x: { code: string }) => x.code === code); + return m.id; + }, + async journal(id) { + return (await api.get(`/api/journal-entries/${id}`)).json().lines; + }, + }; +} + +export const balanceOf = async (api: Commerce['api'], path: 'customers' | 'suppliers', id: string) => + (await api.get(`/api/${path}/${id}`)).json().balance as string; diff --git a/alshuyukh-accounting/apps/api/test/payments.test.ts b/alshuyukh-accounting/apps/api/test/payments.test.ts new file mode 100644 index 000000000000..7ffc70911613 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/payments.test.ts @@ -0,0 +1,193 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { withTx } from '../src/db/tx.js'; +import { balanceOf, commerce, type Commerce } from './commerce-helpers.js'; +import { addMember, chart, client, fiscalYears, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; +let c: Commerce; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); + c = await commerce(t.app, owner); +}); +afterAll(async () => { await t.close(); }); + +const receipt = async (customerId: string, amount: string, allocations: { documentId: string; amount: string }[] = [], method = 'CASH') => + c.api.post('/api/payments', { + direction: 'RECEIPT', customerId, paymentDate: c.date, methodId: await c.method(method), amount, + allocations: allocations.map((a) => ({ documentType: 'SALES_INVOICE', ...a })), + }); + +const newInvoice = async (price = '1000') => { + const cust = await c.customer(); + const inv = await c.postInvoice(cust.id, [{ productId: (await c.product({ salePrice: price })).id, quantity: '1' }]); + return { cust, inv }; +}; + +describe('customer receipts', () => { + it('collects an invoice in full: Dr Cash / Cr AR, invoice PAID', async () => { + const { cust, inv } = await newInvoice(); + const res = await receipt(cust.id, '1150.00', [{ documentId: inv.id, amount: '1150.00' }]); + expect(res.statusCode).toBe(201); + const pay = res.json(); + expect(pay).toMatchObject({ status: 'POSTED', amount: '1150.00', allocatedAmount: '1150.00', unallocatedAmount: '0.00' }); + expect(pay.number).toMatch(/^RCPT-\d{6}$/); + const lines = await c.journal(pay.journalEntryId); + expect(lines.map((l) => [l.accountCode, l.debit, l.credit])).toEqual([['1100', '1150.00', '0.00'], ['1300', '0.00', '1150.00']]); + expect(lines[1]!.customerId).toBe(cust.id); + expect((await c.api.get(`/api/invoices/${inv.id}`)).json()).toMatchObject({ status: 'PAID', paidAmount: '1150.00', remainingAmount: '0.00' }); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('0.00'); + }); + + it('records partial payments and settles several invoices with one receipt', async () => { + const cust = await c.customer(); + const prod = await c.product({ salePrice: '100' }); + const a = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '1' }]); // 115 + const b = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '2' }]); // 230 + await receipt(cust.id, '50.00', [{ documentId: a.id, amount: '50.00' }]); + expect((await c.api.get(`/api/invoices/${a.id}`)).json()).toMatchObject({ status: 'PARTIALLY_PAID', remainingAmount: '65.00' }); + const res = await receipt(cust.id, '295.00', [{ documentId: a.id, amount: '65.00' }, { documentId: b.id, amount: '230.00' }], 'BANK'); + expect(res.statusCode).toBe(201); + expect((await c.api.get(`/api/invoices/${a.id}`)).json().status).toBe('PAID'); + expect((await c.api.get(`/api/invoices/${b.id}`)).json().status).toBe('PAID'); + const open = (await c.api.get(`/api/invoices?partyId=${cust.id}&open=true`)).json(); + expect(open.total).toBe(0); + }); + + it('keeps an advance on account and allocates it later', async () => { + const cust = await c.customer(); + const adv = (await receipt(cust.id, '500.00')).json(); + expect(adv.unallocatedAmount).toBe('500.00'); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('-500.00'); + const inv = await c.postInvoice(cust.id, [{ productId: (await c.product({ salePrice: '200' })).id, quantity: '1' }]); // 230 + const res = await c.api.post(`/api/payments/${adv.id}/allocations`, { allocations: [{ documentType: 'SALES_INVOICE', documentId: inv.id, amount: '230.00' }] }); + expect(res.json()).toMatchObject({ allocatedAmount: '230.00', unallocatedAmount: '270.00' }); + expect((await c.api.get(`/api/invoices/${inv.id}`)).json().status).toBe('PAID'); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('-270.00'); + }); + + it('rejects invalid allocations', async () => { + const { cust, inv } = await newInvoice('100'); // 115 + const other = await newInvoice('100'); + const cases: [unknown[], string, string][] = [ + [[{ documentId: inv.id, amount: '200.00' }], '300.00', 'OVER_ALLOCATED'], // more than the invoice + [[{ documentId: inv.id, amount: '100.00' }], '50.00', 'OVER_ALLOCATED'], // more than the payment + [[{ documentId: other.inv.id, amount: '10.00' }], '50.00', 'INVALID_ALLOCATION'], // another customer's invoice + [[{ documentId: inv.id, amount: '0.00' }], '50.00', 'INVALID_ALLOCATION'], // zero + ]; + for (const [allocations, amount, code] of cases) { + const res = await receipt(cust.id, amount, allocations as never); + expect(res.json().error?.code, JSON.stringify(allocations)).toBe(code); + } + const wrongType = await c.api.post('/api/payments', { + direction: 'RECEIPT', customerId: cust.id, paymentDate: c.date, methodId: await c.method('CASH'), amount: '10.00', + allocations: [{ documentType: 'SALES_RETURN', documentId: inv.id, amount: '10.00' }], + }); + expect(wrongType.json().error.code).toBe('INVALID_ALLOCATION'); + // Nothing was recorded by the failed attempts. + expect((await c.api.get(`/api/payments?customerId=${cust.id}`)).json().total).toBe(0); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('115.00'); + }); + + it('voids a payment: reverses the entry and reopens the invoices', async () => { + const { cust, inv } = await newInvoice('100'); + const pay = (await receipt(cust.id, '115.00', [{ documentId: inv.id, amount: '115.00' }])).json(); + const res = await c.api.post(`/api/payments/${pay.id}/void`, { reason: 'شيك مرتجع' }); + expect(res.json()).toMatchObject({ status: 'VOIDED', allocatedAmount: '0.00', voidReason: 'شيك مرتجع' }); + expect(res.json().allocations[0].reversedAt).not.toBeNull(); + expect((await c.api.get(`/api/invoices/${inv.id}`)).json()).toMatchObject({ status: 'ISSUED', paidAmount: '0.00' }); + expect((await c.api.get(`/api/journal-entries/${pay.journalEntryId}`)).json().status).toBe('REVERSED'); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('115.00'); + expect((await c.api.post(`/api/payments/${pay.id}/void`, { reason: 'مرة ثانية' })).statusCode).toBe(409); + }); + + it('refunds a customer after a return of a paid invoice', async () => { + const { cust, inv } = await newInvoice('100'); + await receipt(cust.id, '115.00', [{ documentId: inv.id, amount: '115.00' }]); + const r = (await c.api.post('/api/sales-returns', { originalInvoiceId: inv.id, docDate: c.date, reason: 'إرجاع', lines: [{ sourceItemId: inv.lines[0].id, quantity: '1' }] })).json(); + const ret = (await c.api.post(`/api/sales-returns/${r.id}/post`)).json(); + // Paid in full, so nothing is applied to the invoice: the full credit is owed to the customer. + expect(ret).toMatchObject({ appliedAmount: '0.00', remainingAmount: '115.00' }); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('-115.00'); + const refund = await c.api.post('/api/payments', { + direction: 'DISBURSEMENT', customerId: cust.id, paymentDate: c.date, methodId: await c.method('CASH'), amount: '115.00', + allocations: [{ documentType: 'SALES_RETURN', documentId: ret.id, amount: '115.00' }], + }); + expect(refund.statusCode).toBe(201); + expect((await c.journal(refund.json().journalEntryId)).map((l) => [l.accountCode, l.debit, l.credit])).toEqual([['1100', '0.00', '115.00'], ['1300', '115.00', '0.00']]); + expect((await c.api.get(`/api/sales-returns/${ret.id}`)).json()).toMatchObject({ refundedAmount: '115.00', remainingAmount: '0.00' }); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('0.00'); + }); + + it('cannot change a payment directly in the database', async () => { + const { cust } = await newInvoice('100'); + const pay = (await receipt(cust.id, '10.00')).json(); + await expect(withTx(t.pool, { tenantId: owner.tenantId, userId: owner.userId }, (db) => + db.query(`UPDATE payments SET amount = 1 WHERE id = $1`, [pay.id]))).rejects.toThrow(/cannot be modified/); + }); +}); + +describe('supplier payments', () => { + it('pays a purchase invoice: Dr AP / Cr Bank', async () => { + const sup = await c.supplier(); + const bill = await c.purchase(sup.id, [{ productId: (await c.product({ purchasePrice: '400' })).id, quantity: '1' }]); // 460 + const res = await c.api.post('/api/payments', { + direction: 'DISBURSEMENT', supplierId: sup.id, paymentDate: c.date, methodId: await c.method('BANK'), amount: '460.00', + allocations: [{ documentType: 'PURCHASE_INVOICE', documentId: bill.id, amount: '460.00' }], + }); + expect(res.statusCode).toBe(201); + expect(res.json().number).toMatch(/^PAY-\d{6}$/); + expect((await c.journal(res.json().journalEntryId)).map((l) => [l.accountCode, l.debit, l.credit])).toEqual([['1200', '0.00', '460.00'], ['2100', '460.00', '0.00']]); + expect((await c.api.get(`/api/purchase-invoices/${bill.id}`)).json().status).toBe('PAID'); + expect(await balanceOf(c.api, 'suppliers', sup.id)).toBe('0.00'); + }); +}); + +describe('payment methods', () => { + it('seeds the Saudi methods and accepts custom ones on asset accounts only', async () => { + const methods = (await c.api.get('/api/payment-methods')).json().data.map((m: { code: string }) => m.code); + expect(methods).toEqual(['CASH', 'BANK', 'CARD', 'STC_PAY', 'TAMARA']); + const ch = await chart(t.app, owner.token); + const clearing = (await c.api.post('/api/accounts', { code: '1250', nameAr: 'مستحقات تمارا', parentId: ch.byCode.get('1000') })).json(); + const ok = await c.api.post('/api/payment-methods', { code: 'TAMARA_CLR', nameAr: 'تمارا (تسوية)', methodType: 'TAMARA', accountId: clearing.id }); + expect(ok.statusCode).toBe(201); + expect((await c.api.post('/api/payment-methods', { code: 'BAD', nameAr: 'خطأ', methodType: 'OTHER', accountId: ch.byKey.get('SALES') })).statusCode).toBe(400); + const { cust, inv } = await newInvoice('100'); + const res = await c.api.post('/api/payments', { + direction: 'RECEIPT', customerId: cust.id, paymentDate: c.date, methodId: ok.json().id, amount: '115.00', + allocations: [{ documentType: 'SALES_INVOICE', documentId: inv.id, amount: '115.00' }], + }); + expect((await c.journal(res.json().journalEntryId))[0]!.accountCode).toBe('1250'); + }); +}); + +describe('payment permissions and isolation', () => { + it('applies payment permissions', async () => { + const { cust } = await newInvoice('100'); + const sales = await addMember(t.app, owner, 'SALES_MANAGER'); + const sApi = client(t.app, sales.token); + const pay = await sApi.post('/api/payments', { direction: 'RECEIPT', customerId: cust.id, paymentDate: c.date, methodId: await c.method('CASH'), amount: '10.00' }); + expect(pay.statusCode).toBe(201); + expect((await sApi.post(`/api/payments/${pay.json().id}/void`, { reason: 'test' })).statusCode).toBe(403); + const viewer = await addMember(t.app, owner, 'VIEWER'); + expect((await client(t.app, viewer.token).post('/api/payments', { direction: 'RECEIPT', customerId: cust.id, paymentDate: c.date, methodId: await c.method('CASH'), amount: '10.00' })).statusCode).toBe(403); + }); + + it('cannot pay another tenant\'s invoice', async () => { + const { inv } = await newInvoice('100'); + const other = await register(t.app); + const oc = await commerce(t.app, other); + const res = await oc.api.post('/api/payments', { + direction: 'RECEIPT', customerId: (await oc.customer()).id, paymentDate: oc.date, methodId: await oc.method('CASH'), amount: '10.00', + allocations: [{ documentType: 'SALES_INVOICE', documentId: inv.id, amount: '10.00' }], + }); + expect(res.json().error.code).toBe('INVALID_ALLOCATION'); + }); + + it('keeps the ledger balanced', async () => { + const [year] = await fiscalYears(t.app, owner.token); + expect((await c.api.get(`/api/reports/trial-balance?dateFrom=${year!.startDate}&dateTo=${year!.endDate}`)).json().balanced).toBe(true); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/purchases.test.ts b/alshuyukh-accounting/apps/api/test/purchases.test.ts new file mode 100644 index 000000000000..f7602afcdeff --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/purchases.test.ts @@ -0,0 +1,108 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { balanceOf, commerce, type Commerce } from './commerce-helpers.js'; +import { addMember, chart, client, fiscalYears, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; +let c: Commerce; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); + c = await commerce(t.app, owner); +}); +afterAll(async () => { await t.close(); }); + +describe('purchase invoices', () => { + it('posts goods to inventory: Dr Inventory + Dr VAT input / Cr AP', async () => { + const sup = await c.supplier({ vatNumber: '310000000000003' }); + const prod = await c.product({ purchasePrice: '60' }); + const bill = await c.purchase(sup.id, [{ productId: prod.id, quantity: '10' }], { supplierInvoiceNumber: 'S-9001' }); + expect(bill).toMatchObject({ status: 'POSTED', taxableAmount: '600.00', taxAmount: '90.00', total: '690.00', supplierInvoiceNumber: 'S-9001' }); + expect(bill.number).toMatch(/^PINV-\d{6}$/); + const lines = await c.journal(bill.journalEntryId); + expect(lines.map((l) => [l.accountCode, l.debit, l.credit])).toEqual([ + ['2100', '0.00', '690.00'], ['1400', '600.00', '0.00'], ['2220', '90.00', '0.00'], + ]); + expect(lines[0]!.supplierId).toBe(sup.id); + expect(await balanceOf(c.api, 'suppliers', sup.id)).toBe('-690.00'); + }); + + it('records the supplier invoice number once per supplier', async () => { + const sup = await c.supplier(); + const prod = await c.product(); + await c.purchase(sup.id, [{ productId: prod.id, quantity: '1' }], { supplierInvoiceNumber: 'DUP-1' }); + const dup = await c.api.post('/api/purchase-invoices', { partyId: sup.id, docDate: c.date, supplierInvoiceNumber: 'DUP-1', lines: [{ productId: prod.id, quantity: '1' }] }); + expect(dup.statusCode).toBe(409); + }); + + it('posts expense lines to their account and requires one for untracked services', async () => { + const sup = await c.supplier(); + const ch = await chart(t.app, owner.token); + const service = await c.product({ productType: 'SERVICE', purchasePrice: '1000' }); + const draft = (await c.api.post('/api/purchase-invoices', { partyId: sup.id, docDate: c.date, lines: [{ productId: service.id, quantity: '1' }] })).json(); + expect((await c.api.post(`/api/purchase-invoices/${draft.id}/post`)).json().error.code).toBe('ACCOUNT_REQUIRED'); + + const rent = await c.purchase(sup.id, [{ accountId: ch.byCode.get('6100'), description: 'إيجار مارس', quantity: '1', unitPrice: '5000' }]); + expect((await c.journal(rent.journalEntryId)).map((l) => [l.accountCode, l.debit, l.credit])).toEqual([ + ['2100', '0.00', '5750.00'], ['6100', '5000.00', '0.00'], ['2220', '750.00', '0.00'], + ]); + // Exempt line: no VAT. + const exempt = await c.purchase(sup.id, [{ accountId: ch.byCode.get('6400'), quantity: '1', unitPrice: '300', vatCategory: 'E' }]); + expect(exempt).toMatchObject({ taxAmount: '0.00', total: '300.00' }); + // Sales lines cannot use bare accounts. + const cust = await c.customer(); + expect((await c.api.post('/api/invoices', { partyId: cust.id, docDate: c.date, lines: [{ accountId: ch.byCode.get('6100'), quantity: '1', unitPrice: '1' }] })).statusCode).toBe(400); + }); + + it('returns goods to the supplier: Dr AP / Cr Inventory + Cr VAT input', async () => { + const sup = await c.supplier(); + const bill = await c.purchase(sup.id, [{ productId: (await c.product()).id, quantity: '4', unitPrice: '50' }]); // 230 + const r = (await c.api.post('/api/purchase-returns', { originalInvoiceId: bill.id, docDate: c.date, reason: 'معيب', lines: [{ sourceItemId: bill.lines[0].id, quantity: '1' }] })).json(); + const ret = (await c.api.post(`/api/purchase-returns/${r.id}/post`)).json(); + expect(ret.number).toMatch(/^DN-\d{6}$/); + expect((await c.journal(ret.journalEntryId)).map((l) => [l.accountCode, l.debit, l.credit])).toEqual([ + ['2100', '57.50', '0.00'], ['1400', '0.00', '50.00'], ['2220', '0.00', '7.50'], + ]); + expect((await c.api.get(`/api/purchase-invoices/${bill.id}`)).json()).toMatchObject({ returnedAmount: '57.50', remainingAmount: '172.50' }); + expect(await balanceOf(c.api, 'suppliers', sup.id)).toBe('-172.50'); + }); + + it('cancels an unpaid purchase invoice', async () => { + const sup = await c.supplier(); + const bill = await c.purchase(sup.id, [{ productId: (await c.product()).id, quantity: '1' }]); + expect((await c.api.post(`/api/purchase-invoices/${bill.id}/cancel`, { reason: 'مكرر' })).json().status).toBe('CANCELLED'); + expect(await balanceOf(c.api, 'suppliers', sup.id)).toBe('0.00'); + }); +}); + +describe('purchase orders', () => { + it('approves an order and converts it to a draft bill', async () => { + const sup = await c.supplier(); + const po = (await c.api.post('/api/purchase-orders', { partyId: sup.id, docDate: c.date, lines: [{ productId: (await c.product()).id, quantity: '12' }] })).json(); + expect(po.number).toMatch(/^PO-\d{6}$/); + expect((await c.api.post(`/api/purchase-orders/${po.id}/convert`, {})).statusCode).toBe(409); + expect((await c.api.post(`/api/purchase-orders/${po.id}/status`, { status: 'APPROVED' })).json().status).toBe('APPROVED'); + const bill = (await c.api.post(`/api/purchase-orders/${po.id}/convert`, { docDate: c.date })).json(); + expect(bill).toMatchObject({ status: 'DRAFT', sourceOrderId: po.id, total: po.total }); + expect((await c.api.post(`/api/purchase-invoices/${bill.id}/post`)).json().status).toBe('POSTED'); + }); +}); + +describe('purchase permissions', () => { + it('lets purchase managers post bills and sales staff see nothing', async () => { + const sup = await c.supplier(); + const prod = await c.product(); + const pm = await addMember(t.app, owner, 'PURCHASE_MANAGER'); + const pApi = client(t.app, pm.token); + const draft = await pApi.post('/api/purchase-invoices', { partyId: sup.id, docDate: c.date, lines: [{ productId: prod.id, quantity: '1' }] }); + expect((await pApi.post(`/api/purchase-invoices/${draft.json().id}/post`)).statusCode).toBe(200); + const sales = await addMember(t.app, owner, 'SALES_EMPLOYEE'); + expect((await client(t.app, sales.token).get('/api/purchase-invoices')).statusCode).toBe(403); + }); + + it('keeps the ledger balanced', async () => { + const [year] = await fiscalYears(t.app, owner.token); + expect((await c.api.get(`/api/reports/trial-balance?dateFrom=${year!.startDate}&dateTo=${year!.endDate}`)).json().balanced).toBe(true); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/sales.test.ts b/alshuyukh-accounting/apps/api/test/sales.test.ts new file mode 100644 index 000000000000..7dc546335e3b --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/sales.test.ts @@ -0,0 +1,250 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { withTx } from '../src/db/tx.js'; +import { balanceOf, commerce, type Commerce } from './commerce-helpers.js'; +import { addMember, client, fiscalYears, register, setupApp, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; +let c: Commerce; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); + c = await commerce(t.app, owner); +}); +afterAll(async () => { await t.close(); }); + +const address = { buildingNumber: '1234', street: 'طريق الملك فهد', district: 'العليا', city: 'الرياض', postalCode: '12345', additionalNumber: '6789' }; + +describe('sales invoice posting', () => { + it('posts the reference example: 1000 + 150 VAT → Dr AR 1150 / Cr Sales 1000 / Cr VAT 150', async () => { + const customer = await c.customer({ vatNumber: '300000000000003', paymentTermsDays: 30, addresses: [address] }); + const product = await c.product({ salePrice: '1000' }); + const draft = await c.invoice(customer.id, [{ productId: product.id, quantity: '1' }]); + expect(draft).toMatchObject({ status: 'DRAFT', number: null, subtotal: '1000.00', taxableAmount: '1000.00', taxAmount: '150.00', total: '1150.00' }); + + const inv = (await c.api.post(`/api/invoices/${draft.id}/post`)).json(); + expect(inv).toMatchObject({ status: 'ISSUED', total: '1150.00', paidAmount: '0.00', remainingAmount: '1150.00', invoiceKind: 'STANDARD' }); + expect(inv.number).toMatch(/^INV-\d{6}$/); + expect(inv.partySnapshot).toMatchObject({ vatNumber: '300000000000003', address: expect.objectContaining({ postalCode: '12345' }) }); + const due = new Date(`${c.date}T00:00:00Z`); due.setUTCDate(due.getUTCDate() + 30); + expect(inv.dueDate).toBe(due.toISOString().slice(0, 10)); + + const lines = await c.journal(inv.journalEntryId); + expect(lines.map((l) => [l.accountCode, l.debit, l.credit])).toEqual([ + ['1300', '1150.00', '0.00'], ['4100', '0.00', '1000.00'], ['2210', '0.00', '150.00'], + ]); + expect(lines[0]!.customerId).toBe(customer.id); + const entry = (await c.api.get(`/api/journal-entries/${inv.journalEntryId}`)).json(); + expect(entry).toMatchObject({ status: 'POSTED', source: 'SYSTEM', referenceType: 'SALES_INVOICE', referenceId: inv.id, totalDebit: '1150.00', totalCredit: '1150.00' }); + expect(await balanceOf(c.api, 'customers', customer.id)).toBe('1150.00'); + }); + + it('marks invoices to customers without a VAT number as simplified (B2C)', async () => { + const inv = await c.postInvoice((await c.customer()).id, [{ productId: (await c.product()).id, quantity: '1' }]); + expect(inv.invoiceKind).toBe('SIMPLIFIED'); + }); + + it('numbers issued invoices sequentially; drafts have no number', async () => { + const cust = await c.customer(); + const prod = await c.product(); + const a = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + const draft = await c.invoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + const b = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + expect(draft.number).toBeNull(); + expect(Number(b.number.slice(-6))).toBe(Number(a.number.slice(-6)) + 1); + }); + + it('calculates on the server without saving', async () => { + const cust = await c.customer(); + const prod = await c.product({ salePrice: '200' }); + const before = (await c.api.get('/api/invoices')).json().total; + const res = await c.api.post('/api/invoices/calculate', { partyId: cust.id, docDate: c.date, lines: [{ productId: prod.id, quantity: '3', discountPercent: '10' }] }); + expect(res.json().totals).toMatchObject({ subtotal: '600.00', discountTotal: '60.00', taxableAmount: '540.00', taxAmount: '81.00', total: '621.00' }); + expect((await c.api.get('/api/invoices')).json().total).toBe(before); + }); + + it('converts VAT-inclusive list prices to the document basis', async () => { + const prod = await c.product({ salePrice: '115', salePriceIncludesVat: true }); + const inv = await c.invoice((await c.customer()).id, [{ productId: prod.id, quantity: '2' }]); + expect(inv.lines[0]).toMatchObject({ unitPrice: '100.0000', netAmount: '200.00' }); + expect(inv.total).toBe('230.00'); + const incl = await c.invoice((await c.customer()).id, [{ productId: prod.id, quantity: '2' }], { pricesIncludeVat: true }); + expect(incl).toMatchObject({ taxableAmount: '200.00', taxAmount: '30.00', total: '230.00' }); + }); + + it('edits and deletes drafts, then refuses changes once issued', async () => { + const cust = await c.customer(); + const prod = await c.product(); + const draft = await c.invoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + const edited = (await c.api.patch(`/api/invoices/${draft.id}`, { lines: [{ productId: prod.id, quantity: '5', unitPrice: '10' }] })).json(); + expect(edited.total).toBe('57.50'); + const other = await c.invoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + expect((await c.api.del(`/api/invoices/${other.id}`)).statusCode).toBe(204); + + const issued = (await c.api.post(`/api/invoices/${draft.id}/post`)).json(); + expect((await c.api.patch(`/api/invoices/${issued.id}`, { notes: 'x' })).statusCode).toBe(409); + expect((await c.api.del(`/api/invoices/${issued.id}`)).statusCode).toBe(409); + expect((await c.api.post(`/api/invoices/${issued.id}/post`)).statusCode).toBe(409); + const ctx = { tenantId: owner.tenantId, userId: owner.userId }; + await expect(withTx(t.pool, ctx, (db) => db.query(`UPDATE sales_invoices SET total = 1 WHERE id = $1`, [issued.id]))).rejects.toThrow(/cannot be modified/); + await expect(withTx(t.pool, ctx, (db) => db.query(`UPDATE sales_invoice_items SET quantity = 1 WHERE document_id = $1`, [issued.id]))).rejects.toThrow(/cannot be changed/); + await expect(withTx(t.pool, ctx, (db) => db.query(`UPDATE sales_invoices SET status = 'DRAFT' WHERE id = $1`, [issued.id]))).rejects.toThrow(/draft/); + }); + + it('enforces the credit limit from the ledger balance', async () => { + const cust = await c.customer({ creditLimit: '1000.00' }); + const prod = await c.product({ salePrice: '500' }); + await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '1' }]); // 575 + const second = await c.invoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + const res = await c.api.post(`/api/invoices/${second.id}/post`); + expect(res.json().error.code).toBe('CREDIT_LIMIT_EXCEEDED'); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('575.00'); + }); + + it('uses the VAT rate effective on the invoice date', async () => { + const s = await register(t.app); + const sc = await commerce(t.app, s); + const [year] = await fiscalYears(t.app, s.token); + const july = year!.periods[6]!.startDate; + expect((await sc.api.post('/api/tax-rates', { nameAr: 'نسبة جديدة', rate: '0.2', effectiveFrom: july })).statusCode).toBe(201); + const cust = await sc.customer(); + const prod = await sc.product({ salePrice: '100' }); + const before = await sc.invoice(cust.id, [{ productId: prod.id, quantity: '1' }], { docDate: year!.periods[5]!.startDate }); + const after = await sc.invoice(cust.id, [{ productId: prod.id, quantity: '1' }], { docDate: july }); + expect(before.taxAmount).toBe('15.00'); + expect(after.taxAmount).toBe('20.00'); + const rates = (await sc.api.get('/api/tax-rates')).json().data; + expect(rates.find((r: { rate: string }) => r.rate === '0.1500').effectiveTo).toBe(year!.periods[5]!.endDate); + }); +}); + +describe('cancellation', () => { + it('cancels an unpaid invoice by reversing its entry', async () => { + const cust = await c.customer(); + const inv = await c.postInvoice(cust.id, [{ productId: (await c.product()).id, quantity: '2' }]); + const res = await c.api.post(`/api/invoices/${inv.id}/cancel`, { reason: 'خطأ في العميل' }); + expect(res.json()).toMatchObject({ status: 'CANCELLED', cancelReason: 'خطأ في العميل', number: inv.number }); + expect((await c.api.get(`/api/journal-entries/${inv.journalEntryId}`)).json().status).toBe('REVERSED'); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('0.00'); + expect((await c.api.post(`/api/invoices/${inv.id}/cancel`, { reason: 'مرة ثانية' })).statusCode).toBe(409); + }); + + it('refuses to cancel a paid invoice', async () => { + const cust = await c.customer(); + const inv = await c.postInvoice(cust.id, [{ productId: (await c.product()).id, quantity: '1' }]); + await c.api.post('/api/payments', { + direction: 'RECEIPT', customerId: cust.id, paymentDate: c.date, methodId: await c.method('CASH'), amount: '50.00', + allocations: [{ documentType: 'SALES_INVOICE', documentId: inv.id, amount: '50.00' }], + }); + expect((await c.api.post(`/api/invoices/${inv.id}/cancel`, { reason: 'إلغاء' })).json().error.code).toBe('HAS_PAYMENTS'); + }); +}); + +describe('sales returns (credit notes)', () => { + it('returns part of an invoice, then the rest, and nets exactly to zero', async () => { + const cust = await c.customer(); + const prod = await c.product({ salePrice: '33.33' }); + const inv = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '3' }]); + expect(inv).toMatchObject({ taxableAmount: '99.99', taxAmount: '15.00', total: '114.99' }); + const itemId = inv.lines[0].id; + + const r1 = (await c.api.post('/api/sales-returns', { originalInvoiceId: inv.id, docDate: c.date, reason: 'تالف', lines: [{ sourceItemId: itemId, quantity: '1' }] })).json(); + expect(r1).toMatchObject({ status: 'DRAFT', taxableAmount: '33.33', taxAmount: '5.00', total: '38.33' }); + const p1 = (await c.api.post(`/api/sales-returns/${r1.id}/post`)).json(); + expect(p1.number).toMatch(/^CN-\d{6}$/); + expect(p1.appliedAmount).toBe('38.33'); + const lines = await c.journal(p1.journalEntryId); + expect(lines.map((l) => [l.accountCode, l.debit, l.credit])).toEqual([ + ['1300', '0.00', '38.33'], ['4100', '33.33', '0.00'], ['2210', '5.00', '0.00'], + ]); + const mid = (await c.api.get(`/api/invoices/${inv.id}`)).json(); + expect(mid).toMatchObject({ status: 'ISSUED', returnedAmount: '38.33', remainingAmount: '76.66' }); + + const over = await c.api.post('/api/sales-returns', { originalInvoiceId: inv.id, docDate: c.date, reason: 'زيادة', lines: [{ sourceItemId: itemId, quantity: '3' }] }); + expect(over.json().error.code).toBe('RETURN_EXCEEDS_INVOICE'); + + const r2 = (await c.api.post('/api/sales-returns', { originalInvoiceId: inv.id, docDate: c.date, reason: 'الباقي', lines: [{ sourceItemId: itemId, quantity: '2' }] })).json(); + const p2 = (await c.api.post(`/api/sales-returns/${r2.id}/post`)).json(); + expect(p2).toMatchObject({ taxableAmount: '66.66', taxAmount: '10.00', total: '76.66' }); + const final = (await c.api.get(`/api/invoices/${inv.id}`)).json(); + expect(final).toMatchObject({ status: 'RETURNED', returnedAmount: '114.99', remainingAmount: '0.00' }); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe('0.00'); + }); + + it('cancelling a return restores the invoice', async () => { + const cust = await c.customer(); + const inv = await c.postInvoice(cust.id, [{ productId: (await c.product()).id, quantity: '2' }]); + const r = (await c.api.post('/api/sales-returns', { originalInvoiceId: inv.id, docDate: c.date, reason: 'خطأ', lines: [{ sourceItemId: inv.lines[0].id, quantity: '2' }] })).json(); + await c.api.post(`/api/sales-returns/${r.id}/post`); + expect((await c.api.get(`/api/invoices/${inv.id}`)).json().status).toBe('RETURNED'); + expect((await c.api.post(`/api/invoices/${inv.id}/cancel`, { reason: 'إلغاء' })).json().error.code).toBe('HAS_RETURNS'); + await c.api.post(`/api/sales-returns/${r.id}/cancel`, { reason: 'أُدخل خطأ' }); + expect((await c.api.get(`/api/invoices/${inv.id}`)).json()).toMatchObject({ status: 'ISSUED', returnedAmount: '0.00', remainingAmount: inv.total }); + expect(await balanceOf(c.api, 'customers', cust.id)).toBe(inv.total); + }); + + it('refuses returns of drafts and of lines from another invoice', async () => { + const cust = await c.customer(); + const prod = await c.product(); + const draft = await c.invoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + expect((await c.api.post('/api/sales-returns', { originalInvoiceId: draft.id, docDate: c.date, reason: 'مسودة', lines: [{ sourceItemId: draft.lines[0].id, quantity: '1' }] })).json().error.code).toBe('INVOICE_NOT_ISSUED'); + const a = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + const b = await c.postInvoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + expect((await c.api.post('/api/sales-returns', { originalInvoiceId: a.id, docDate: c.date, reason: 'خلط', lines: [{ sourceItemId: b.lines[0].id, quantity: '1' }] })).statusCode).toBe(400); + }); +}); + +describe('quotes', () => { + it('sends, accepts and converts a quote into a draft invoice', async () => { + const cust = await c.customer(); + const prod = await c.product({ salePrice: '80' }); + const q = (await c.api.post('/api/sales-quotes', { partyId: cust.id, docDate: c.date, lines: [{ productId: prod.id, quantity: '5', discountAmount: '20' }] })).json(); + expect(q.number).toMatch(/^QT-\d{6}$/); + expect((await c.api.post(`/api/sales-quotes/${q.id}/status`, { status: 'SENT' })).json().status).toBe('SENT'); + expect((await c.api.post(`/api/sales-quotes/${q.id}/status`, { status: 'ACCEPTED' })).json().status).toBe('ACCEPTED'); + const inv = (await c.api.post(`/api/sales-quotes/${q.id}/convert`, { docDate: c.date })).json(); + expect(inv).toMatchObject({ status: 'DRAFT', sourceQuoteId: q.id, total: q.total }); + expect((await c.api.get(`/api/sales-quotes/${q.id}`)).json()).toMatchObject({ status: 'CONVERTED', convertedInvoiceId: inv.id }); + expect((await c.api.post(`/api/sales-quotes/${q.id}/convert`, {})).statusCode).toBe(409); + expect((await c.api.post(`/api/sales-quotes/${q.id}/post`)).statusCode).toBe(404); + }); +}); + +describe('permissions and isolation', () => { + it('lets sales employees draft but not issue invoices', async () => { + const cust = await c.customer(); + const prod = await c.product(); + const emp = await addMember(t.app, owner, 'SALES_EMPLOYEE'); + const eApi = client(t.app, emp.token); + const draft = await eApi.post('/api/invoices', { partyId: cust.id, docDate: c.date, lines: [{ productId: prod.id, quantity: '1' }] }); + expect(draft.statusCode).toBe(201); + expect((await eApi.post(`/api/invoices/${draft.json().id}/post`)).statusCode).toBe(403); + const purchase = await addMember(t.app, owner, 'PURCHASE_MANAGER'); + expect((await client(t.app, purchase.token).get('/api/invoices')).statusCode).toBe(403); + }); + + it('hides invoices and products of other tenants', async () => { + const inv = await c.postInvoice((await c.customer()).id, [{ productId: (await c.product()).id, quantity: '1' }]); + const other = await register(t.app); + const oc = await commerce(t.app, other); + expect((await oc.api.get(`/api/invoices/${inv.id}`)).statusCode).toBe(404); + expect((await oc.api.post(`/api/invoices/${inv.id}/cancel`, { reason: 'اختراق' })).statusCode).toBe(404); + const foreign = await oc.api.post('/api/invoices', { partyId: (await oc.customer()).id, docDate: oc.date, lines: [{ productId: inv.lines[0].productId, quantity: '1' }] }); + expect(foreign.json().error.code).toBe('INVALID_PRODUCT'); + }); + + it('refuses to delete customers and products used in documents', async () => { + const cust = await c.customer(); + const prod = await c.product(); + await c.invoice(cust.id, [{ productId: prod.id, quantity: '1' }]); + expect((await c.api.del(`/api/customers/${cust.id}`)).json().error.code).toBe('PARTY_IN_USE'); + expect((await c.api.del(`/api/products/${prod.id}`)).json().error.code).toBe('PRODUCT_IN_USE'); + }); + + it('keeps the ledger balanced', async () => { + const [year] = await fiscalYears(t.app, owner.token); + const tb = (await c.api.get(`/api/reports/trial-balance?dateFrom=${year!.startDate}&dateTo=${year!.endDate}`)).json(); + expect(tb.balanced).toBe(true); + }); +}); diff --git a/alshuyukh-accounting/apps/web/src/App.tsx b/alshuyukh-accounting/apps/web/src/App.tsx index 9e269328a6fd..a4ee74518cd6 100644 --- a/alshuyukh-accounting/apps/web/src/App.tsx +++ b/alshuyukh-accounting/apps/web/src/App.tsx @@ -11,6 +11,7 @@ import TrialBalance from './pages/accounting/TrialBalance'; import AuditLog from './pages/AuditLog'; import Parties, { CUSTOMERS, SUPPLIERS } from './pages/parties/Parties'; import Products from './pages/products/Products'; +import Section from './pages/documents/Section'; import Companies from './pages/Companies'; import ComingSoon from './pages/ComingSoon'; import Home from './pages/Home'; @@ -37,8 +38,8 @@ export default function App() { }> } /> - } /> - } /> + } /> + } /> } /> } /> } /> diff --git a/alshuyukh-accounting/apps/web/src/Shell.tsx b/alshuyukh-accounting/apps/web/src/Shell.tsx index 01d29aa3a279..78a916069aef 100644 --- a/alshuyukh-accounting/apps/web/src/Shell.tsx +++ b/alshuyukh-accounting/apps/web/src/Shell.tsx @@ -4,8 +4,8 @@ import { useAuth } from './auth'; const NAV: { to: string; label: string; icon: string; phase?: number }[] = [ { to: '/', label: 'الرئيسية', icon: '⌂' }, - { to: '/sales', label: 'المبيعات', icon: '↗', phase: 4 }, - { to: '/purchases', label: 'المشتريات', icon: '↙', phase: 4 }, + { to: '/sales', label: 'المبيعات', icon: '↗' }, + { to: '/purchases', label: 'المشتريات', icon: '↙' }, { to: '/inventory', label: 'المخزون', icon: '▦' }, { to: '/customers', label: 'العملاء', icon: '☺' }, { to: '/suppliers', label: 'الموردون', icon: '⚑' }, diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/DocumentDetail.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentDetail.tsx new file mode 100644 index 000000000000..5cba61f94c24 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentDetail.tsx @@ -0,0 +1,204 @@ +import { useState, type FormEvent } from 'react'; +import { Link, useNavigate, useParams } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { DOCS, STATUS_AR, statusClass, type DocConfig, type Doc } from './config'; +import DocumentForm from './DocumentForm'; +import Totals from './Totals'; + +const today = () => new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh' }).format(new Date()); + +interface Method { id: string; code: string; nameAr: string; isActive: boolean } + +export default function DocumentDetail({ config }: { config: DocConfig }) { + const { id } = useParams(); + const { can } = useAuth(); + const navigate = useNavigate(); + const doc = useLoad(() => api('GET', `/api/${config.api}/${id}`), [id, config.api]); + const [mode, setMode] = useState<'view' | 'edit' | 'return' | 'pay' | 'cancel'>('view'); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + async function run(fn: () => Promise) { + setError(null); + setBusy(true); + try { await fn(); setMode('view'); doc.reload(); } catch (e) { setError(e); } finally { setBusy(false); } + } + + const d = doc.data; + if (!d) return ; + if (mode === 'edit') return { setMode('view'); doc.reload(); }} />; + + const isInvoice = config.key === 'SALES_INVOICE' || config.key === 'PURCHASE_INVOICE'; + const open = !['DRAFT', 'CANCELLED'].includes(d.status) && Number(d.remainingAmount ?? 0) > 0; + const returnConfig = config.key === 'SALES_INVOICE' ? DOCS.SALES_RETURN : DOCS.PURCHASE_RETURN; + const invoiceConfig = config.party === 'customer' ? DOCS.SALES_INVOICE : DOCS.PURCHASE_INVOICE; + const canPay = can('payment.create') && open && (isInvoice || config.isReturn); + + return ( +
+ +
+
+

{d.number ?? 'مسودة'}

+

{config.singular} — {d.partyName}

+
+ {STATUS_AR[d.status] ?? d.status} +
+
+
التاريخ
{d.date}
+ {d.dueDate &&
الاستحقاق
{d.dueDate}
} + {d.invoiceKind && d.status !== 'DRAFT' &&
نوع الفاتورة الضريبية
{d.invoiceKind === 'STANDARD' ? 'فاتورة ضريبية' : 'فاتورة ضريبية مبسطة'}
} + {d.supplierInvoiceNumber &&
رقم فاتورة المورد
{d.supplierInvoiceNumber}
} + {d.originalInvoiceId &&
الفاتورة الأصلية
{d.originalInvoiceNumber}
} + {d.reason &&
سبب الإرجاع
{d.reason}
} + {d.journalEntryId &&
القيد
عرض القيد المحاسبي
} + {d.convertedInvoiceId &&
الفاتورة
عرض الفاتورة
} + {d.cancelReason &&
سبب الإلغاء
{d.cancelReason}
} +
الأسعار
{d.pricesIncludeVat ? 'شاملة الضريبة' : 'غير شاملة الضريبة'}
+
+ +
+ + + + {d.lines.map((l) => ( + + + + + + + + + + + ))} + +
#الصنفالكميةالسعرالخصمالصافيالضريبةالإجمالي
{l.lineNo}{l.sku && <>{l.sku}{' — '}}{l.description ?? l.productName}{l.quantity.replace(/\.?0+$/, '')} {l.unitCode}{l.unitPrice.replace(/(\.\d\d)00$/, '$1')}{l.discountAmount === '0.00' ? '' : formatAmount(l.discountAmount)}{formatAmount(l.netAmount)}{formatAmount(l.vatAmount)} {l.vatCategory === 'S' ? `${(Number(l.vatRate) * 100).toFixed(0)}%` : l.vatCategory}{formatAmount(l.totalAmount)}
+
+
+
{d.notes &&

ملاحظات: {d.notes}

}
+ +
+ + {mode === 'view' && ( +
+ {d.status === 'DRAFT' && can(config.perm.create) && !config.isReturn && } + {d.status === 'DRAFT' && config.legal && can(config.perm.issue) && ( + + )} + {config.key === 'SALES_QUOTE' && d.status === 'DRAFT' && } + {config.key === 'SALES_QUOTE' && d.status === 'SENT' && ( + <> + + + + )} + {config.key === 'PURCHASE_ORDER' && d.status === 'DRAFT' && can(config.perm.issue) && } + {((config.key === 'SALES_QUOTE' && ['DRAFT', 'SENT', 'ACCEPTED'].includes(d.status)) || (config.key === 'PURCHASE_ORDER' && d.status === 'APPROVED')) && can(config.perm.create) && ( + + )} + {canPay && } + {isInvoice && ['ISSUED', 'POSTED', 'PARTIALLY_PAID', 'PAID'].includes(d.status) && can(config.perm.create) && } + {d.status === 'DRAFT' && can(config.perm.create) && ( + + )} + {!['DRAFT', 'CANCELLED', 'CONVERTED', 'REJECTED'].includes(d.status) && can(config.perm.cancel) && } +
+ )} + + {mode === 'cancel' && ( +
{ e.preventDefault(); const reason = String(new FormData(e.currentTarget).get('reason')); void run(() => api('POST', `/api/${config.api}/${d.id}/cancel`, { reason })); }}> +

{config.legal ? 'يُعكس القيد المحاسبي بتاريخ المستند ويبقى الرقم محفوظًا. لا يمكن إلغاء مستند عليه دفعات أو مرتجعات.' : 'سيُلغى المستند.'}

+ +
+
+ )} + + {mode === 'pay' && setMode('view')} />} + + {mode === 'return' && ( +
) => { + e.preventDefault(); + const f = new FormData(e.currentTarget); + const lines = d.lines.map((l) => ({ sourceItemId: l.id, quantity: String(f.get(`q-${l.id}`) ?? '').trim() })).filter((l) => l.quantity && Number(l.quantity) > 0); + void run(async () => { + const r = await api<{ id: string }>('POST', `/api/${returnConfig.api}`, { originalInvoiceId: d.id, docDate: String(f.get('date')), reason: String(f.get('reason')), lines }); + navigate(`../../returns/${r.id}`, { relative: 'path' }); + }); + }}> +

{returnConfig.singular} على {d.number}

+ + + {d.lines.map((l) => ( + + + ))} +
الصنفالكمية في الفاتورةالكمية المرتجعة
{l.description ?? l.productName}{l.quantity.replace(/\.?0+$/, '')}
+
+ + +
+
+
+ )} + + {(d.allocations?.length || d.returns?.length) ? ( +
+ {d.allocations && d.allocations.length > 0 && ( +

الدفعات

{d.allocations.map((a) => ( + + ))}
{a.paymentNumber}{a.paymentDate}{formatAmount(a.amount)}
+ )} + {d.returns && d.returns.length > 0 && ( +

المرتجعات

{d.returns.map((r) => ( + + + ))}
{r.number ?? 'مسودة'}{r.date}{formatAmount(r.total)}{STATUS_AR[r.status]}
+ )} +
+ ) : null} +
+ ); +} + +function PaymentBox({ config, doc, busy, run, onCancel }: { + config: DocConfig; doc: Doc; invoiceConfig: DocConfig; busy: boolean; run: (fn: () => Promise) => Promise; onCancel: () => void; +}) { + const methods = useLoad(() => api<{ data: Method[] }>('GET', '/api/payment-methods')); + const direction = (config.party === 'customer') !== config.isReturn ? 'RECEIPT' : 'DISBURSEMENT'; + return ( +
{ + e.preventDefault(); + const f = new FormData(e.currentTarget); + const amount = String(f.get('amount')); + void run(() => api('POST', '/api/payments', { + direction, [config.party === 'customer' ? 'customerId' : 'supplierId']: doc.partyId, + paymentDate: String(f.get('date')), methodId: String(f.get('methodId')), amount, reference: f.get('reference') || null, + allocations: [{ documentType: config.key, documentId: doc.id, amount }], + })); + }}> +

{direction === 'RECEIPT' ? 'سند قبض' : 'سند صرف'} لـ {doc.number}

+
+ + + + +
+
+
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx new file mode 100644 index 000000000000..5b71111e73bf --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx @@ -0,0 +1,178 @@ +import { useEffect, useRef, useState, type FormEvent } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { api } from '../../api'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import type { Account } from '../accounting/ChartOfAccounts'; +import type { DocConfig, Doc } from './config'; +import Totals, { type TotalsData } from './Totals'; + +interface Product { id: string; sku: string; nameAr: string; salePrice: string; purchasePrice: string; productType: string; vatCategory: string } +interface Party { id: string; code: string; nameAr: string } +interface Line { productId: string; accountId: string; description: string; quantity: string; unitPrice: string; discountPercent: string; vatCategory: string } + +const empty = (): Line => ({ productId: '', accountId: '', description: '', quantity: '1', unitPrice: '', discountPercent: '', vatCategory: 'S' }); +const today = () => new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh' }).format(new Date()); + +/** Builds the API payload from the form lines; blank optional fields are left out so the server fills defaults. */ +function payloadLines(lines: Line[]) { + return lines.filter((l) => l.productId || l.accountId).map((l) => ({ + ...(l.productId ? { productId: l.productId } : { accountId: l.accountId, vatCategory: l.vatCategory }), + quantity: l.quantity.trim(), + ...(l.unitPrice.trim() ? { unitPrice: l.unitPrice.trim() } : {}), + ...(l.discountPercent.trim() ? { discountPercent: l.discountPercent.trim() } : {}), + ...(l.description.trim() ? { description: l.description.trim() } : {}), + })); +} + +export default function DocumentForm({ config, doc, onSaved }: { config: DocConfig; doc?: Doc; onSaved?: () => void }) { + const navigate = useNavigate(); + const isPurchase = config.party === 'supplier'; + const parties = useLoad(() => api<{ data: Party[] }>('GET', `/api/${config.party}s?limit=200`)); + const products = useLoad(() => api<{ data: Product[] }>('GET', '/api/products?limit=200')); + const accounts = useLoad(() => (isPurchase ? api<{ data: Account[] }>('GET', '/api/accounts?postableOnly=true') : Promise.resolve({ data: [] as Account[] }))); + const [partyId, setPartyId] = useState(doc?.partyId ?? ''); + const [docDate, setDocDate] = useState(doc?.date ?? today()); + const [includeVat, setIncludeVat] = useState(doc?.pricesIncludeVat ?? false); + const [lines, setLines] = useState(() => doc?.lines.length + ? doc.lines.map((l) => ({ + productId: l.productId ?? '', accountId: l.productId ? '' : l.accountId ?? '', description: l.description ?? '', + quantity: l.quantity, unitPrice: l.unitPrice, discountPercent: '', vatCategory: l.vatCategory, + })) + : [empty()]); + // Existing discounts are kept as amounts when editing. + const [discountAmounts] = useState(() => doc?.lines.map((l) => l.discountBasis) ?? []); + const [preview, setPreview] = useState<{ totals: TotalsData; lines: { netAmount: string; vatAmount: string; totalAmount: string }[] } | null>(null); + const [previewError, setPreviewError] = useState(null); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + const timer = useRef>(undefined); + + const update = (i: number, patch: Partial) => setLines((ls) => ls.map((l, j) => (j === i ? { ...l, ...patch } : l))); + const withDiscounts = (ls: ReturnType) => + ls.map((l, i) => (!('discountPercent' in l) && discountAmounts[i] && discountAmounts[i] !== '0.00' ? { ...l, discountAmount: discountAmounts[i] } : l)); + + // Totals always come from the server (POST …/calculate), debounced while typing. + useEffect(() => { + clearTimeout(timer.current); + const body = withDiscounts(payloadLines(lines)); + if (!body.length) { setPreview(null); return; } + timer.current = setTimeout(() => { + api<{ totals: TotalsData; lines: { netAmount: string; vatAmount: string; totalAmount: string }[] }>( + 'POST', `/api/${config.api}/calculate`, { docDate, pricesIncludeVat: includeVat, lines: body }) + .then((r) => { setPreview(r); setPreviewError(null); }) + .catch((e) => { setPreview(null); setPreviewError(e); }); + }, 350); + return () => clearTimeout(timer.current); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [lines, docDate, includeVat, config.api]); + + async function submit(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + const opt = (k: string) => (f.get(k) ? String(f.get(k)) : null); + const body: Record = { + partyId, docDate, pricesIncludeVat: includeVat, notes: opt('notes'), lines: withDiscounts(payloadLines(lines)), + }; + if (config.key === 'SALES_INVOICE' || config.key === 'PURCHASE_INVOICE') body.dueDate = opt('dueDate'); + if (config.key === 'SALES_QUOTE') body.validUntil = opt('validUntil'); + if (config.key === 'PURCHASE_ORDER') body.expectedDate = opt('expectedDate'); + if (config.key === 'PURCHASE_INVOICE') body.supplierInvoiceNumber = opt('supplierInvoiceNumber'); + setBusy(true); + setError(null); + try { + if (doc) { + await api('PATCH', `/api/${config.api}/${doc.id}`, body); + onSaved?.(); + } else { + const created = await api<{ id: string }>('POST', `/api/${config.api}`, body); + navigate(`../${created.id}`, { relative: 'path' }); + } + } catch (err) { setError(err); } finally { setBusy(false); } + } + + const productById = new Map(products.data?.data.map((p) => [p.id, p])); + return ( +
+

{doc ? `تعديل ${config.singular}` : config.newLabel}

+ +
+ + + {(config.key === 'SALES_INVOICE' || config.key === 'PURCHASE_INVOICE') && ( + + )} + {config.key === 'SALES_QUOTE' && } + {config.key === 'PURCHASE_ORDER' && } + {config.key === 'PURCHASE_INVOICE' && } +
+ + +
+ + + + + + {lines.map((l, i) => { + const p = productById.get(l.productId); + const pl = preview?.lines[payloadLines(lines.slice(0, i + 1)).length - 1]; + const hasTarget = !!(l.productId || l.accountId); + return ( + + + + + + + + + + ); + })} + +
{isPurchase ? 'الصنف أو الحساب' : 'الصنف'}الكميةسعر الوحدةخصم %الصافيالضريبة
+ + {isPurchase && !l.productId && ( +
+ + {l.accountId && ( + + )} +
+ )} + {(l.accountId || p) && update(i, { description: e.target.value })} />} +
update(i, { quantity: e.target.value })} /> update(i, { unitPrice: e.target.value })} /> update(i, { discountPercent: e.target.value })} />{hasTarget && pl ? formatAmount(pl.netAmount) : ''}{hasTarget && pl ? formatAmount(pl.vatAmount) : ''}{lines.length > 1 && }
+
+ + +
+ +
+ {preview && } + {previewError ? : null} +

تُحسب المبالغ والضريبة في الخادم.

+
+
+
+ + {doc && } +
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/DocumentList.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentList.tsx new file mode 100644 index 000000000000..566e7182e310 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentList.tsx @@ -0,0 +1,71 @@ +import { useState } from 'react'; +import { Link } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { STATUS_AR, statusClass, type DocConfig, type Doc } from './config'; + +const PAGE = 50; + +export default function DocumentList({ config }: { config: DocConfig }) { + const { can } = useAuth(); + const [status, setStatus] = useState(''); + const [search, setSearch] = useState(''); + const [offset, setOffset] = useState(0); + const list = useLoad(() => { + const q = new URLSearchParams({ limit: String(PAGE), offset: String(offset) }); + if (status === 'OPEN') q.set('open', 'true'); + else if (status) q.set('status', status); + if (search) q.set('search', search); + return api<{ data: Doc[]; total: number }>('GET', `/api/${config.api}?${q}`); + }, [config.api, status, search, offset]); + const statuses = Object.keys(STATUS_AR).filter((s) => s !== 'VOIDED'); + + return ( +
+
+ { if (e.key === 'Enter') { setSearch(e.currentTarget.value); setOffset(0); } }} /> + + {can(config.perm.create) && !config.isReturn && {config.newLabel}} +
+ +
+ + + + + {config.legal && } + + + + {!list.data && !list.error && } + {list.data?.data.map((d) => ( + + + + + + {config.legal && } + + + ))} + {list.data?.data.length === 0 && } + +
الرقمالتاريخ{config.party === 'customer' ? 'العميل' : 'المورد'}الإجماليالمتبقيالحالة
جارٍ التحميل…
{d.number ?? 'مسودة'}{d.date}{d.partyName}{formatAmount(d.total)}{d.status === 'DRAFT' || d.status === 'CANCELLED' ? '' : formatAmount(d.remainingAmount)}{STATUS_AR[d.status] ?? d.status}
لا توجد مستندات
+
+ {list.data && list.data.total > PAGE && ( +
+ {offset + 1}–{Math.min(offset + PAGE, list.data.total)} من {list.data.total} + + +
+ )} +
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/Payments.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/Payments.tsx new file mode 100644 index 000000000000..3f3768434b0b --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/Payments.tsx @@ -0,0 +1,142 @@ +import { useState, type FormEvent } from 'react'; +import { Link } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { STATUS_AR, statusClass, type Doc } from './config'; + +interface Payment { + id: string; number: string; direction: string; date: string; partyName: string; methodName: string; amount: string; + allocatedAmount: string; unallocatedAmount: string; status: string; reference: string | null; journalEntryId: string; + allocations?: { id: string; amount: string; documentNumber: string; reversedAt: string | null }[]; +} +interface Party { id: string; code: string; nameAr: string } +interface Method { id: string; nameAr: string; isActive: boolean } + +const today = () => new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh' }).format(new Date()); + +/** Receipts from customers (sales) or payments to suppliers (purchases). */ +export default function Payments({ party }: { party: 'customer' | 'supplier' }) { + const { can } = useAuth(); + const direction = party === 'customer' ? 'RECEIPT' : 'DISBURSEMENT'; + const list = useLoad(() => api<{ data: Payment[]; total: number }>('GET', `/api/payments?direction=${direction}&limit=100`), [direction]); + const [creating, setCreating] = useState(false); + const [voiding, setVoiding] = useState(null); + const [error, setError] = useState(null); + + async function voidPayment(e: FormEvent, id: string) { + e.preventDefault(); + setError(null); + try { + await api('POST', `/api/payments/${id}/void`, { reason: String(new FormData(e.currentTarget).get('reason')) }); + setVoiding(null); + list.reload(); + } catch (err) { setError(err); } + } + + return ( + <> + + {creating && { setCreating(false); list.reload(); }} />} +
+
+ + {can('payment.create') && !creating && } +
+
+ + + + {!list.data && !list.error && } + {list.data?.data.map((p) => ( + + + + + + + + + ))} + {list.data?.data.length === 0 && } + +
الرقمالتاريخ{party === 'customer' ? 'العميل' : 'المورد'}الطريقةالمبلغغير مخصصالحالة
جارٍ التحميل…
{p.number}{p.date}{p.partyName}{p.methodName}{formatAmount(p.amount)}{p.status === 'VOIDED' ? '' : formatAmount(p.unallocatedAmount)}{p.status === 'POSTED' ? 'مرحّل' : STATUS_AR[p.status]} + {p.status === 'POSTED' && can('payment.void') && (voiding === p.id + ?
voidPayment(e, p.id)}>
+ : )} +
لا توجد سندات
+
+
+ + ); +} + +function NewPayment({ party, onDone }: { party: 'customer' | 'supplier'; onDone: () => void }) { + const parties = useLoad(() => api<{ data: Party[] }>('GET', `/api/${party}s?limit=200`)); + const methods = useLoad(() => api<{ data: Method[] }>('GET', '/api/payment-methods')); + const [partyId, setPartyId] = useState(''); + const docPath = party === 'customer' ? 'invoices' : 'purchase-invoices'; + const openDocs = useLoad(() => (partyId ? api<{ data: Doc[] }>('GET', `/api/${docPath}?partyId=${partyId}&open=true&limit=200`) : Promise.resolve({ data: [] as Doc[] })), [partyId]); + const [alloc, setAlloc] = useState>({}); + const [error, setError] = useState(null); + + async function submit(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + setError(null); + try { + await api('POST', '/api/payments', { + direction: party === 'customer' ? 'RECEIPT' : 'DISBURSEMENT', + [party === 'customer' ? 'customerId' : 'supplierId']: partyId, + paymentDate: String(f.get('date')), methodId: String(f.get('methodId')), amount: String(f.get('amount')), + reference: f.get('reference') || null, + allocations: Object.entries(alloc).filter(([, v]) => v.trim() && Number(v) > 0).map(([documentId, amount]) => ({ + documentType: party === 'customer' ? 'SALES_INVOICE' : 'PURCHASE_INVOICE', documentId, amount: amount.trim(), + })), + }); + onDone(); + } catch (err) { setError(err); } + } + + return ( +
+

{party === 'customer' ? 'سند قبض جديد' : 'سند صرف جديد'}

+ +
+ + + + + +
+ {partyId && ( + <> +

تخصيص على الفواتير المفتوحة (اختياري — الباقي يبقى رصيدًا مقدمًا)

+ + + + {openDocs.data?.data.map((d) => ( + + + + + + ))} + {openDocs.data?.data.length === 0 && } + +
الفاتورةالتاريخالمتبقيالمبلغ المخصص
{d.number}{d.date}{formatAmount(d.remainingAmount)} setAlloc((a) => ({ ...a, [d.id]: e.target.value }))} />
لا توجد فواتير مفتوحة
+ + )} +
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/Section.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/Section.tsx new file mode 100644 index 000000000000..038c2209ad6f --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/Section.tsx @@ -0,0 +1,40 @@ +import { NavLink, Navigate, Route, Routes } from 'react-router-dom'; +import { useAuth } from '../../auth'; +import { PageHeader } from '../../ui'; +import { DOCS, type DocConfig } from './config'; +import DocumentDetail from './DocumentDetail'; +import DocumentForm from './DocumentForm'; +import DocumentList from './DocumentList'; +import Payments from './Payments'; + +/** Sales or purchases section: tabs for each document type and payments. */ +export default function Section({ party }: { party: 'customer' | 'supplier' }) { + const { can } = useAuth(); + const docs: DocConfig[] = party === 'customer' + ? [DOCS.SALES_INVOICE, DOCS.SALES_QUOTE, DOCS.SALES_RETURN] + : [DOCS.PURCHASE_INVOICE, DOCS.PURCHASE_ORDER, DOCS.PURCHASE_RETURN]; + const paymentsRoute = party === 'customer' ? 'receipts' : 'payments'; + const visible = docs.filter((d) => can(d.perm.view)); + // Absolute paths: inside a splat route, relative links resolve against the full URL. + const base = party === 'customer' ? '/sales' : '/purchases'; + return ( + <> + + + + } /> + {visible.map((d) => ( + + } /> + {!d.isReturn && } />} + } /> + + ))} + } /> + + + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/Totals.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/Totals.tsx new file mode 100644 index 000000000000..602860b3f43b --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/Totals.tsx @@ -0,0 +1,18 @@ +import { formatAmount } from '../../money'; + +export interface TotalsData { subtotal: string; discountTotal: string; taxableAmount: string; taxAmount: string; total: string } + +export default function Totals({ t, extra }: { t: TotalsData; extra?: [string, string | undefined][] }) { + const rows: [string, string | undefined, boolean?][] = [ + ['الإجمالي قبل الخصم', t.subtotal], ['الخصم', t.discountTotal], ['المبلغ الخاضع للضريبة', t.taxableAmount], + ['ضريبة القيمة المضافة', t.taxAmount], ['الإجمالي شامل الضريبة', t.total, true], + ...(extra ?? []).map(([a, b]) => [a, b] as [string, string | undefined]), + ]; + return ( +
+ {rows.filter(([, v]) => v !== undefined).map(([label, value, strong]) => ( +
{label}
{formatAmount(value)}
+ ))} +
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/config.ts b/alshuyukh-accounting/apps/web/src/pages/documents/config.ts new file mode 100644 index 000000000000..6a921cfe3393 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/documents/config.ts @@ -0,0 +1,53 @@ +export interface DocConfig { + key: 'SALES_QUOTE' | 'SALES_INVOICE' | 'SALES_RETURN' | 'PURCHASE_ORDER' | 'PURCHASE_INVOICE' | 'PURCHASE_RETURN'; + api: string; // API path segment + route: string; // UI route, relative to the section + title: string; + singular: string; + newLabel: string; + party: 'customer' | 'supplier'; + legal: boolean; + isReturn: boolean; + perm: { view: string; create: string; issue: string; cancel: string }; +} + +const SALES = { view: 'invoice.view', create: 'invoice.create', issue: 'invoice.post', cancel: 'invoice.cancel' }; +const PURCHASE = { view: 'purchase.view', create: 'purchase.create', issue: 'purchase.post', cancel: 'purchase.cancel' }; + +export const DOCS: Record = { + SALES_INVOICE: { key: 'SALES_INVOICE', api: 'invoices', route: 'invoices', title: 'فواتير المبيعات', singular: 'فاتورة', newLabel: 'فاتورة جديدة', party: 'customer', legal: true, isReturn: false, perm: SALES }, + SALES_QUOTE: { key: 'SALES_QUOTE', api: 'sales-quotes', route: 'quotes', title: 'عروض الأسعار', singular: 'عرض سعر', newLabel: 'عرض سعر جديد', party: 'customer', legal: false, isReturn: false, perm: SALES }, + SALES_RETURN: { key: 'SALES_RETURN', api: 'sales-returns', route: 'returns', title: 'مرتجعات المبيعات', singular: 'إشعار دائن', newLabel: '', party: 'customer', legal: true, isReturn: true, perm: SALES }, + PURCHASE_INVOICE: { key: 'PURCHASE_INVOICE', api: 'purchase-invoices', route: 'invoices', title: 'فواتير المشتريات', singular: 'فاتورة مشتريات', newLabel: 'فاتورة مشتريات جديدة', party: 'supplier', legal: true, isReturn: false, perm: PURCHASE }, + PURCHASE_ORDER: { key: 'PURCHASE_ORDER', api: 'purchase-orders', route: 'orders', title: 'أوامر الشراء', singular: 'أمر شراء', newLabel: 'أمر شراء جديد', party: 'supplier', legal: false, isReturn: false, perm: PURCHASE }, + PURCHASE_RETURN: { key: 'PURCHASE_RETURN', api: 'purchase-returns', route: 'returns', title: 'مرتجعات المشتريات', singular: 'إشعار مدين', newLabel: '', party: 'supplier', legal: true, isReturn: true, perm: PURCHASE }, +}; + +export const STATUS_AR: Record = { + DRAFT: 'مسودة', ISSUED: 'صادرة', POSTED: 'مرحّلة', PARTIALLY_PAID: 'مدفوعة جزئيًا', PAID: 'مدفوعة', CANCELLED: 'ملغاة', + RETURNED: 'مرتجعة', SENT: 'مرسل', ACCEPTED: 'مقبول', REJECTED: 'مرفوض', CONVERTED: 'محوّل لفاتورة', APPROVED: 'معتمد', + VOIDED: 'ملغى', +}; + +export const statusClass = (s: string) => + ({ DRAFT: 'status-draft', PAID: 'status-posted', ISSUED: 'status-open', POSTED: 'status-open', PARTIALLY_PAID: 'status-partial', + CANCELLED: 'status-reversed', VOIDED: 'status-reversed', RETURNED: 'status-reversed' } as Record)[s] ?? 'status-open'; + +export interface DocLine { + id: string; lineNo: number; productId: string | null; productName: string | null; sku: string | null; accountId: string | null; + sourceItemId: string | null; description: string | null; quantity: string; unitCode: string | null; unitPrice: string; + grossAmount: string; discountBasis: string; discountAmount: string; netAmount: string; vatCategory: string; vatRate: string; + vatAmount: string; totalAmount: string; +} + +export interface Doc { + id: string; number: string | null; date: string; partyId: string; partyName: string; partyCode: string; status: string; + pricesIncludeVat: boolean; subtotal: string; discountTotal: string; taxableAmount: string; taxAmount: string; total: string; + notes: string | null; journalEntryId: string | null; cancelReason: string | null; + dueDate?: string | null; paidAmount?: string; returnedAmount?: string; remainingAmount?: string; invoiceKind?: string; + supplierInvoiceNumber?: string | null; originalInvoiceId?: string; originalInvoiceNumber?: string; reason?: string; + appliedAmount?: string; refundedAmount?: string; convertedInvoiceId?: string | null; validUntil?: string | null; + lines: DocLine[]; + allocations?: { id: string; amount: string; paymentId: string; paymentNumber: string; paymentDate: string }[]; + returns?: { id: string; number: string | null; date: string; status: string; total: string }[]; +} diff --git a/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx b/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx index 158b81be7995..4337fcbc05ea 100644 --- a/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx +++ b/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx @@ -66,7 +66,7 @@ function ProductList() { return ( <> - {editing && ( + {editing && units.data && categories.data && (

{current ? `تعديل: ${current.nameAr}` : 'منتج أو خدمة جديدة'}

diff --git a/alshuyukh-accounting/apps/web/src/styles.css b/alshuyukh-accounting/apps/web/src/styles.css index 5cb5d72e17cd..c396afa1653a 100644 --- a/alshuyukh-accounting/apps/web/src/styles.css +++ b/alshuyukh-accounting/apps/web/src/styles.css @@ -218,3 +218,23 @@ button.tab { font: inherit; background: none; border: none; border-bottom: 2px s @media (max-width: 900px) { .grid-3 { grid-template-columns: 1fr 1fr; } } @media (max-width: 600px) { .grid-3 { grid-template-columns: 1fr; } } .party-select { margin-top: 4px; } + +/* Commercial documents ----------------------------------------------------------- */ +.doc-lines td:nth-child(1) { min-width: 240px; } +.doc-lines td:nth-child(2), .doc-lines td:nth-child(4) { width: 90px; } +.doc-lines td:nth-child(3) { width: 120px; } +.sub-row { margin-top: 4px; display: flex; gap: 4px; width: 100%; } +.sub-row select { flex: 1; } +.doc-footer { display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; margin-top: 16px; } +.totals { margin: 0; min-width: 300px; border: 1px solid var(--border); border-radius: 8px; padding: 6px 14px; } +.totals div { display: flex; justify-content: space-between; gap: 24px; padding: 4px 0; } +.totals dt { color: var(--muted); } +.totals dd { margin: 0; font-variant-numeric: tabular-nums; } +.totals .strong { border-top: 1px solid var(--border); font-weight: 700; font-size: 1.05rem; } +.totals .strong dt { color: var(--text); } +.reverse-box.neutral { border-color: var(--primary); background: #f6fbfa; } +.related { margin-top: 18px; } +.related h3 { margin-bottom: 4px; } +.status-open { background: #e8f0fe; color: #1d4ed8; border-color: transparent; } +.status-partial { background: var(--warn-bg); color: var(--warn-ink); border-color: transparent; } +.doc-lines { min-width: 760px; } diff --git a/alshuyukh-accounting/docs/screenshots/p4-01-invoice-form.png b/alshuyukh-accounting/docs/screenshots/p4-01-invoice-form.png new file mode 100644 index 0000000000000000000000000000000000000000..fc53c77bbadfc54ed408493914026b2f423cdc9a GIT binary patch literal 92329 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%0AI)k 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 I>zopr0Qf%PAOHXW literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p4-03-invoice-journal.png b/alshuyukh-accounting/docs/screenshots/p4-03-invoice-journal.png new file mode 100644 index 0000000000000000000000000000000000000000..d369cc2829234255e9bb89acc0080c4b337a510a GIT binary patch literal 72465 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 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p4-05-credit-note.png b/alshuyukh-accounting/docs/screenshots/p4-05-credit-note.png new file mode 100644 index 0000000000000000000000000000000000000000..0e534b417b493661edfb1c8fcceec2c215e8c46a GIT binary patch literal 91014 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 F2>_lf5!wI% literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p4-06-supplier-payment.png b/alshuyukh-accounting/docs/screenshots/p4-06-supplier-payment.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8f0fea8a43f3830440c92bdade5a5a6e621afe GIT binary patch literal 77735 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%0A;z3mNKE`J`YG;?BGm*Fcy8pz% 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 z75 Date: Sun, 4 Oct 2026 16:20:05 +0000 Subject: [PATCH 05/10] Add Phase 5: inventory with weighted-average costing - Stock changes only through append-only stock movements; balances per product and warehouse are updated under a row lock in the same transaction, and can never go negative or hold value without quantity - Weighted-average cost per warehouse behind a costing interface (FIFO can be added as another implementation); the last unit out takes the exact remaining value, so values stay to the halala - Invoices, returns and purchases move stock as they are issued: sales add Dr COGS / Cr Inventory to the invoice entry, sales returns come back at the cost they left at, purchase returns leave at average cost with the price difference to COGS, stocked purchases always post to Inventory - Cancelling a document reverses its movements at the same costs; value left in an emptied warehouse is expensed with its own entry - Transfers between warehouses (no entry), adjustments and stock counts against an offset account (capital for opening stock), stock card, balances, and a valuation report reconciled with the Inventory account - Products show on-hand quantity; type, tracking and deletion lock once a product has stock history - Fixes found while testing: forms rendering before their option lists loaded picked wrong defaults (transfer destination); warehouse lists now put the main warehouse first - 19 new tests (188 total) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RiHbDZ5HpzN6NRCMJmydEq --- alshuyukh-accounting/README.md | 72 +++- alshuyukh-accounting/apps/api/src/app.ts | 2 + .../api/src/db/migrations/0010_inventory.sql | 187 ++++++++++ .../src/modules/accounting/chart-template.ts | 1 + .../apps/api/src/modules/documents/drafts.ts | 10 +- .../apps/api/src/modules/documents/posting.ts | 120 ++++++- .../apps/api/src/modules/inventory/costing.ts | 39 +++ .../apps/api/src/modules/inventory/engine.ts | 150 ++++++++ .../apps/api/src/modules/inventory/routes.ts | 321 ++++++++++++++++++ .../src/modules/products/products.routes.ts | 12 +- .../apps/api/test/commerce-helpers.ts | 5 +- .../apps/api/test/inventory.test.ts | 268 +++++++++++++++ .../apps/api/test/payments.test.ts | 2 +- .../apps/api/test/purchases.test.ts | 14 +- .../web/src/pages/documents/DocumentForm.tsx | 11 + .../web/src/pages/inventory/Adjustments.tsx | 123 +++++++ .../apps/web/src/pages/inventory/Balances.tsx | 41 +++ .../web/src/pages/inventory/StockCard.tsx | 57 ++++ .../web/src/pages/inventory/Transfers.tsx | 80 +++++ .../web/src/pages/inventory/Valuation.tsx | 32 ++ .../apps/web/src/pages/inventory/shared.ts | 28 ++ .../apps/web/src/pages/products/Products.tsx | 39 ++- .../docs/screenshots/p5-01-sale-journal.png | Bin 0 -> 77795 bytes .../docs/screenshots/p5-02-adjustments.png | Bin 0 -> 62536 bytes .../docs/screenshots/p5-03-balances.png | Bin 0 -> 59162 bytes .../docs/screenshots/p5-04-stock-card.png | Bin 0 -> 83917 bytes .../docs/screenshots/p5-05-valuation.png | Bin 0 -> 57926 bytes 27 files changed, 1578 insertions(+), 36 deletions(-) create mode 100644 alshuyukh-accounting/apps/api/src/db/migrations/0010_inventory.sql create mode 100644 alshuyukh-accounting/apps/api/src/modules/inventory/costing.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/inventory/engine.ts create mode 100644 alshuyukh-accounting/apps/api/src/modules/inventory/routes.ts create mode 100644 alshuyukh-accounting/apps/api/test/inventory.test.ts create mode 100644 alshuyukh-accounting/apps/web/src/pages/inventory/Adjustments.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/inventory/Balances.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/inventory/StockCard.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/inventory/Transfers.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/inventory/Valuation.tsx create mode 100644 alshuyukh-accounting/apps/web/src/pages/inventory/shared.ts create mode 100644 alshuyukh-accounting/docs/screenshots/p5-01-sale-journal.png create mode 100644 alshuyukh-accounting/docs/screenshots/p5-02-adjustments.png create mode 100644 alshuyukh-accounting/docs/screenshots/p5-03-balances.png create mode 100644 alshuyukh-accounting/docs/screenshots/p5-04-stock-card.png create mode 100644 alshuyukh-accounting/docs/screenshots/p5-05-valuation.png diff --git a/alshuyukh-accounting/README.md b/alshuyukh-accounting/README.md index b8268f3fa343..c63e847ccebe 100644 --- a/alshuyukh-accounting/README.md +++ b/alshuyukh-accounting/README.md @@ -8,6 +8,7 @@ - المرحلة 2 مكتملة: دليل الحسابات، المحرك المحاسبي، القيود اليومية، السنوات والفترات المالية. - المرحلة 3 مكتملة: العملاء، الموردون، المنتجات والخدمات، الوحدات والتصنيفات. - المرحلة 4 مكتملة: عروض الأسعار، فواتير المبيعات والمشتريات، المرتجعات، أوامر الشراء، المدفوعات، نسب الضريبة. +- المرحلة 5 مكتملة: حركات المخزون، المتوسط المرجح، تكلفة المبيعات، التحويلات، التسويات والجرد، تقييم المخزون. بقية الوحدات تظهر في الواجهة بعلامة «قريبًا» دون أي بيانات تجريبية. @@ -56,6 +57,10 @@ alshuyukh-accounting/ │ │ │ │ ├── drafts.ts # المسودات والمرتجعات │ │ │ │ ├── posting.ts # الإصدار والقيود والإلغاء والتحويل │ │ │ │ └── payments.ts # المقبوضات والمدفوعات والتخصيص +│ │ │ ├── inventory/ # المخزون (المرحلة 5) +│ │ │ │ ├── costing.ts # طريقة التكلفة (المتوسط المرجح؛ واجهة لـ FIFO) +│ │ │ │ ├── engine.ts # الوارد والصادر والإلغاء مع قفل الرصيد +│ │ │ │ └── routes.ts # الأرصدة، حركة الصنف، التقييم، التحويلات، التسويات │ │ │ ├── parties/ # العملاء والموردون (تنفيذ مشترك) │ │ │ ├── products/ # المنتجات، الوحدات، التصنيفات │ │ │ ├── companies/ # الشركات، الفروع، المستودعات @@ -447,6 +452,58 @@ erDiagram صلاحيات المستندات: المبيعات `invoice.view/create/edit/delete/post/cancel`، والمشتريات `purchase.view/create/post/cancel`. +## المرحلة 5: المخزون + +### المبادئ + +- **لا تُعدَّل الكمية مباشرة.** كل تغيير حركة في `stock_movements` (إضافة فقط، لا تعديل ولا حذف)، ويُحدَّث `inventory_balances` (الكمية والقيمة لكل صنف ومستودع) في المعاملة نفسها بقفل صف. +- **المتوسط المرجح لكل مستودع.** الوارد يضيف قيمته، والصادر يخرج بقيمة تقريب(المتوسط × الكمية، خانتان)، و**آخر وحدة تأخذ القيمة المتبقية بالضبط**، فلا تبقى قيمة بلا كمية (قيد في قاعدة البيانات يمنع ذلك). +- **دفتر المخزون = حساب المخزون في الدفتر العام دائمًا.** القيم بالهللة، وكل حركة لها أثرها في القيد نفسه. تقرير التقييم يعرض الرقمين والفرق، والاختبارات تتحقق من الفرق صفر بعد كل عملية. +- **لا رصيد سالب.** البيع أو التحويل أو التسوية بأكثر من المتاح يُرفض (`INSUFFICIENT_STOCK`) ولا يتغير شيء. +- **طريقة التكلفة قابلة للتوسعة:** `costing.ts` يعرّف واجهة `CostingMethod`، والمتوسط المرجح تنفيذها الحالي. عمود `companies.costing_method` يقبل حاليًا `WEIGHTED_AVERAGE` فقط. FIFO يحتاج جدول طبقات تكلفة ويُضاف كتنفيذ آخر للواجهة نفسها. + +### الحركات والقيود + +| العملية | الحركة | التكلفة | القيد | +|---|---|---|---| +| فاتورة مشتريات | `PURCHASE` وارد | الصافي قبل الضريبة | المخزون مدين (السلع المتتبعة تُرحَّل دائمًا لحساب المخزون) | +| فاتورة مبيعات | `SALE` صادر | المتوسط | ضمن قيد الفاتورة: تكلفة المبيعات مدين / المخزون دائن | +| مرتجع مبيعات | `SALE_RETURN` وارد | التكلفة التي خرجت بها البضاعة، بالتناسب، وآخر مرتجع يأخذ الباقي بالضبط | المخزون مدين / تكلفة المبيعات دائن | +| مرتجع مشتريات | `PURCHASE_RETURN` صادر | المتوسط | المخزون دائن بالتكلفة، والفرق عن سعر الشراء لتكلفة المبيعات | +| تحويل | `TRANSFER_OUT` ثم `TRANSFER_IN` | المتوسط في المستودع المصدر | لا قيد (القيمة باقية في حساب المخزون) | +| تسوية / جرد | `ADJUSTMENT_IN` أو `ADJUSTMENT_OUT` | الزيادة بالتكلفة المُدخلة أو المتوسط الحالي؛ النقص بالمتوسط | المخزون مقابل حساب الفروقات (5200) أو حساب يختاره المستخدم (رأس المال للرصيد الافتتاحي) | +| إلغاء مستند | `CANCELLATION_IN` / `CANCELLATION_OUT` | نفس تكلفة الحركة الأصلية | يُعكس قيد المستند؛ وإن فرغ المستودع وبقيت قيمة تُحمَّل على تكلفة المبيعات بقيد `INVENTORY_RESIDUAL` | + +- المرتجعات تعود إلى (أو تخرج من) مستودع الحركة الأصلية. +- لا يُلغى شراء استُخدمت بضاعته؛ يُستخدم مرتجع المشتريات بدلًا من ذلك. +- مستودع الفاتورة يُختار في النموذج، وإلا فالمستودع الرئيسي. +- الجرد يُدخل الكمية المعدودة ويحسب الخادم الفرق لرصيد المستودع المختار. +- لا يتغير نوع منتج أو تتبع مخزونه ولا يُحذف بعد وجود حركات له. + +### الجداول الجديدة + +| الجدول | الغرض | +|---|---| +| `inventory_balances` | الكمية والقيمة لكل صنف ومستودع (المفتاح: الصنف + المستودع)؛ لا سالب، ولا قيمة بلا كمية | +| `stock_movements` | كل حركة: النوع، الاتجاه، الكمية، تكلفة الوحدة، الإجمالي، الرصيد بعد الحركة، المرجع (المستند والسطر)، والحركة المعكوسة عند الإلغاء | +| `stock_transfers`، `stock_transfer_items` | التحويلات (`TRF-`) | +| `stock_adjustments`، `stock_adjustment_items` | التسويات والجرد (`ADJ-`) مع الكمية المعدودة والكمية في النظام | +| حساب `5200` | فروقات وتسويات المخزون (مفتاح النظام `INVENTORY_ADJUSTMENT`) | + +**الفهارس:** حركة الصنف `(product_id, warehouse_id, created_at)`؛ المرجع `(reference_type, reference_id)`؛ السطر `reference_line_id`؛ التاريخ لكل شركة؛ إلغاء واحد فقط لكل حركة. + +### واجهات API (المرحلة 5) + +| الطريقة | المسار | الصلاحية | +|---|---|---| +| GET | `/api/inventory/balances` (warehouseId، productId) | `inventory.view` | +| GET | `/api/inventory/movements` (productId، warehouseId، dateFrom، dateTo) — حركة الصنف | `inventory.view` | +| GET | `/api/inventory/valuation` — التقييم مع مطابقة الدفتر | `inventory.view` | +| GET / POST | `/api/stock-transfers`، `/api/stock-transfers/:id` | `inventory.view` / `inventory.transfer` | +| GET / POST | `/api/stock-adjustments`، `/api/stock-adjustments/:id` | `inventory.view` / `inventory.adjust` | + +`GET /api/products` يعرض `onHand` (الكمية في كل المستودعات)، والمستندات تقبل `warehouseId`. + ## تدفق المصادقة 1. **التسجيل** ينشئ في معاملة واحدة: المستخدم، المنشأة، إعداداتها (SAR، Asia/Riyadh)، الشركة الافتراضية، الفرع الرئيسي، المستودع الرئيسي، العضوية بدور `TENANT_OWNER`، وسجل تدقيق. @@ -486,7 +543,7 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق ## الاختبارات -169 اختبارًا (وحدة وتكامل) على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: +188 اختبارًا (وحدة وتكامل) على PostgreSQL حقيقي باستخدام دور التطبيق المقيد، فتُختبر سياسات RLS فعليًا: | الملف | ما يغطيه | |---|---| @@ -503,6 +560,7 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق | `sales.test.ts` | قيد الفاتورة المطلوب (AR 1150 / Sales 1000 / VAT 150)؛ الفاتورة المبسطة؛ الترقيم؛ الحساب دون حفظ؛ الأسعار الشاملة؛ منع التعديل بعد الإصدار عبر API و SQL؛ حد الائتمان؛ تغيير نسبة الضريبة بتاريخ؛ الإلغاء ومنعه مع الدفعات؛ المرتجع الجزئي ثم الكامل بلا فروق تقريب؛ إلغاء المرتجع؛ عروض الأسعار والتحويل؛ الصلاحيات؛ العزل؛ منع حذف المستخدَم؛ توازن الميزان | | `payments.test.ts` | التحصيل الكامل والجزئي؛ سند واحد لعدة فواتير؛ الدفعة المقدمة ثم التخصيص؛ رفض التخصيص الزائد أو لطرف آخر أو لنوع خاطئ دون أثر؛ إلغاء السند؛ الاسترداد بعد المرتجع؛ منع تعديل السند في قاعدة البيانات؛ دفع المورد؛ طرق الدفع وحساب التسوية؛ الصلاحيات؛ العزل | | `purchases.test.ts` | قيد فاتورة الشراء (مخزون + ضريبة مدخلات / موردون)؛ رقم فاتورة المورد مرة واحدة؛ سطور المصروفات والمعفاة؛ اشتراط حساب للخدمات؛ مرتجع المشتريات؛ الإلغاء؛ أوامر الشراء والتحويل؛ الصلاحيات | +| `inventory.test.ts` | الرصيد الافتتاحي مقابل رأس المال؛ الشراء والمتوسط؛ تكلفة المبيعات ضمن قيد الفاتورة؛ رفض البيع بلا رصيد دون أثر؛ المرتجع بتكلفة الخروج بالضبط؛ استعادة المخزون عند الإلغاء؛ تقريب 100 على 3 دون بقايا؛ مرتجع المشتريات بالمتوسط وفرق السعر؛ منع إلغاء شراء استُخدم؛ تحميل القيمة المتبقية؛ التحويلات بلا قيد؛ البيع من مستودع محدد؛ الجرد والتحقق؛ قفل نوع المنتج؛ منع تعديل الحركات وسالب الرصيد؛ الصلاحيات؛ العزل؛ مطابقة التقييم مع الدفتر بعد كل خطوة | | `companies.test.ts` | القيم السعودية الافتراضية، التحقق، التكرار، الحذف الناعم، ربط المستودع بفرع شركة أخرى، تجاهل `tenant_id` في جسم الطلب، العضوية في منشأتين والتبديل | ## ملاحظات وقرارات تصميم @@ -522,8 +580,16 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق - نقل ملكية المنشأة. - Rate limiting يعتمد على ذاكرة العملية؛ في الإنتاج بأكثر من نسخة يلزم Redis. - لم تُطبَّق المصادقة الثنائية (2FA). +- **المرحلة 5:** + - **متغيرات المنتج** (`product_variants`: مقاس، لون) غير مطبقة: تحتاج بُعدًا إضافيًا في سطور المستندات والحركات والأرصدة. البديل الحالي: صنف مستقل لكل متغير. + - **مواقع المستودع** (`warehouse_locations`: رفوف) غير مطبقة؛ الرصيد على مستوى المستودع. + - **FIFO** غير مطبق (الواجهة جاهزة). + - المتوسط المرجح دائم حسب ترتيب الترحيل: إدخال حركة بتاريخ سابق لا يعيد حساب تكلفة الحركات اللاحقة. + - لا يُلغى تحويل أو تسوية؛ التصحيح بمستند معاكس. + - السماح بالرصيد السالب كإعداد اختياري غير متاح. + - تنبيهات حد إعادة الطلب ونقص المخزون — مع نظام الإشعارات. + - قوائم الأسعار وتسعير العملاء. - **المرحلة 4:** - - تكلفة البضاعة المباعة وحركات المخزون عند البيع والشراء والإرجاع — المرحلة 5. - الخصم على مستوى المستند (لا السطر) غير مطبق. - تعدد العملات: المستندات بعملة الشركة فقط. - بعد ربط ZATCA (المرحلة 8) يجب منع إلغاء الفاتورة المُبلَّغة والاكتفاء بإشعار دائن، وإضافة رمز سبب الإعفاء للسطور `Z` و `E` و `O`. @@ -532,8 +598,6 @@ argon2id لكلمات المرور · JWT قصير العمر مع جلسات ق - تجاوز حد الائتمان بصلاحية خاصة غير متاح. - **المرحلة 3:** - استيراد العملاء والموردين والمنتجات من ملف Excel/CSV. - - منع حذف منتج له حركات مخزون — مع المرحلة 5 (المستندات والسندات مطبقة). - - متغيرات المنتج (مقاس، لون) وقوائم الأسعار — مع المرحلة 5. - **المرحلة 2:** - تعدد العملات وأسعار الصرف: القيود حاليًا بعملة الشركة فقط. - إعادة فتح سنة مالية مقفلة (عكس قيد الإقفال) غير مدعومة. diff --git a/alshuyukh-accounting/apps/api/src/app.ts b/alshuyukh-accounting/apps/api/src/app.ts index a992a154e8bf..7dcbef8d9f7d 100644 --- a/alshuyukh-accounting/apps/api/src/app.ts +++ b/alshuyukh-accounting/apps/api/src/app.ts @@ -15,6 +15,7 @@ import auditRoutes from './modules/audit/audit.routes.js'; import { CUSTOMER, SUPPLIER, partyRoutes } from './modules/parties/parties.routes.js'; import productsRoutes from './modules/products/products.routes.js'; import documentsModule from './modules/documents/routes.js'; +import inventoryRoutes from './modules/inventory/routes.js'; import authRoutes from './modules/auth/auth.routes.js'; import companiesRoutes from './modules/companies/companies.routes.js'; import rbacRoutes from './modules/rbac/rbac.routes.js'; @@ -98,6 +99,7 @@ export async function buildApp({ env, pool, logger = true }: BuildOptions): Prom await api.register(partyRoutes(SUPPLIER)); await api.register(productsRoutes); await api.register(documentsModule); + await api.register(inventoryRoutes); }, { prefix: '/api' }); return app; diff --git a/alshuyukh-accounting/apps/api/src/db/migrations/0010_inventory.sql b/alshuyukh-accounting/apps/api/src/db/migrations/0010_inventory.sql new file mode 100644 index 000000000000..f90f86ec88f6 --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/db/migrations/0010_inventory.sql @@ -0,0 +1,187 @@ +-- 0010 — Inventory: balances, movements, transfers, adjustments. +-- +-- Stock is never edited directly. Every change is a row in stock_movements +-- (append-only); inventory_balances holds the running quantity and value per +-- product and warehouse and is updated in the same transaction. +-- +-- Costing: weighted average per product and warehouse. Values are kept to +-- the halala (2 decimals) so the stock ledger always equals the Inventory +-- account in the general ledger. An issue takes round(average × qty, 2); the +-- last unit out of a warehouse takes exactly the remaining value. + +ALTER TABLE companies + ADD COLUMN costing_method text NOT NULL DEFAULT 'WEIGHTED_AVERAGE' + CHECK (costing_method IN ('WEIGHTED_AVERAGE')); -- FIFO: see inventory/costing.ts + +CREATE TABLE inventory_balances ( + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + product_id uuid NOT NULL, + warehouse_id uuid NOT NULL, + quantity numeric(18,4) NOT NULL DEFAULT 0 CHECK (quantity >= 0), + value numeric(18,2) NOT NULL DEFAULT 0 CHECK (value >= 0), + updated_at timestamptz NOT NULL DEFAULT now(), + PRIMARY KEY (product_id, warehouse_id), + CONSTRAINT inventory_balances_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT inventory_balances_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT inventory_balances_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + -- Nothing left means nothing left: no value without quantity. + CONSTRAINT inventory_balances_empty_ck CHECK (quantity > 0 OR value = 0) +); +CREATE INDEX inventory_balances_warehouse_idx ON inventory_balances (tenant_id, company_id, warehouse_id); +CREATE TRIGGER inventory_balances_updated_at BEFORE UPDATE ON inventory_balances FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE TABLE stock_movements ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + product_id uuid NOT NULL, + warehouse_id uuid NOT NULL, + movement_type text NOT NULL CHECK (movement_type IN ( + 'PURCHASE', 'SALE', 'SALE_RETURN', 'PURCHASE_RETURN', 'TRANSFER_IN', 'TRANSFER_OUT', + 'ADJUSTMENT_IN', 'ADJUSTMENT_OUT', 'CANCELLATION_IN', 'CANCELLATION_OUT')), + direction text NOT NULL CHECK (direction IN ('IN', 'OUT')), + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + unit_cost numeric(18,6) NOT NULL CHECK (unit_cost >= 0), + total_cost numeric(18,2) NOT NULL CHECK (total_cost >= 0), + -- Balance right after this movement (stock card). + balance_quantity numeric(18,4) NOT NULL, + balance_value numeric(18,2) NOT NULL, + reference_type text NOT NULL CHECK (reference_type ~ '^[A-Z][A-Z0-9_]{1,62}$'), + reference_id uuid NOT NULL, + reference_line_id uuid, + -- For cancellations: the movement being undone. + reverses_id uuid REFERENCES stock_movements (id), + movement_date date NOT NULL, + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT stock_movements_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT stock_movements_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT stock_movements_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT stock_movements_direction_ck CHECK ( + (direction = 'IN') = (movement_type IN ('PURCHASE', 'SALE_RETURN', 'TRANSFER_IN', 'ADJUSTMENT_IN', 'CANCELLATION_IN')) + ) +); +CREATE INDEX stock_movements_card_idx ON stock_movements (product_id, warehouse_id, created_at); +CREATE INDEX stock_movements_reference_idx ON stock_movements (reference_type, reference_id); +CREATE INDEX stock_movements_line_idx ON stock_movements (reference_line_id) WHERE reference_line_id IS NOT NULL; +CREATE INDEX stock_movements_company_date_idx ON stock_movements (tenant_id, company_id, movement_date); +CREATE UNIQUE INDEX stock_movements_one_reversal_uq ON stock_movements (reverses_id) WHERE reverses_id IS NOT NULL; +CREATE TRIGGER stock_movements_append_only BEFORE UPDATE OR DELETE ON stock_movements + FOR EACH ROW EXECUTE FUNCTION prevent_modification(); + +-- Transfers between warehouses of the same company. Posted on creation; +-- corrected with a transfer in the opposite direction. +CREATE TABLE stock_transfers ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + transfer_number text NOT NULL, + transfer_date date NOT NULL, + from_warehouse_id uuid NOT NULL, + to_warehouse_id uuid NOT NULL, + notes text, + total_cost numeric(18,2) NOT NULL DEFAULT 0, + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT stock_transfers_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT stock_transfers_from_fk FOREIGN KEY (from_warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT stock_transfers_to_fk FOREIGN KEY (to_warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT stock_transfers_distinct_ck CHECK (from_warehouse_id <> to_warehouse_id), + CONSTRAINT stock_transfers_id_company_uq UNIQUE (id, company_id) +); +CREATE UNIQUE INDEX stock_transfers_number_uq ON stock_transfers (company_id, transfer_number); +CREATE INDEX stock_transfers_date_idx ON stock_transfers (tenant_id, company_id, transfer_date DESC); +CREATE TRIGGER stock_transfers_append_only BEFORE UPDATE OR DELETE ON stock_transfers + FOR EACH ROW EXECUTE FUNCTION prevent_modification(); + +CREATE TABLE stock_transfer_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + transfer_id uuid NOT NULL, + line_no smallint NOT NULL, + product_id uuid NOT NULL, + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + total_cost numeric(18,2) NOT NULL CHECK (total_cost >= 0), + CONSTRAINT stock_transfer_items_transfer_fk FOREIGN KEY (transfer_id, company_id) REFERENCES stock_transfers (id, company_id), + CONSTRAINT stock_transfer_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT stock_transfer_items_line_uq UNIQUE (transfer_id, line_no) +); +CREATE TRIGGER stock_transfer_items_append_only BEFORE UPDATE OR DELETE ON stock_transfer_items + FOR EACH ROW EXECUTE FUNCTION prevent_modification(); + +-- Adjustments (stock counts, damage, opening stock). Posted on creation with +-- a journal entry against the offset account. +CREATE TABLE stock_adjustments ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + adjustment_number text NOT NULL, + adjustment_date date NOT NULL, + warehouse_id uuid NOT NULL, + reason text NOT NULL CHECK (length(btrim(reason)) BETWEEN 3 AND 500), + offset_account_id uuid NOT NULL, + total_increase numeric(18,2) NOT NULL DEFAULT 0, + total_decrease numeric(18,2) NOT NULL DEFAULT 0, + journal_entry_id uuid, + created_by uuid REFERENCES users (id), + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT stock_adjustments_company_fk FOREIGN KEY (company_id, tenant_id) REFERENCES companies (id, tenant_id), + CONSTRAINT stock_adjustments_warehouse_fk FOREIGN KEY (warehouse_id, company_id) REFERENCES warehouses (id, company_id), + CONSTRAINT stock_adjustments_account_fk FOREIGN KEY (offset_account_id, company_id) REFERENCES accounts (id, company_id), + CONSTRAINT stock_adjustments_journal_fk FOREIGN KEY (journal_entry_id, company_id) REFERENCES journal_entries (id, company_id), + CONSTRAINT stock_adjustments_id_company_uq UNIQUE (id, company_id) +); +CREATE UNIQUE INDEX stock_adjustments_number_uq ON stock_adjustments (company_id, adjustment_number); +CREATE INDEX stock_adjustments_date_idx ON stock_adjustments (tenant_id, company_id, adjustment_date DESC); +CREATE TRIGGER stock_adjustments_append_only BEFORE UPDATE OR DELETE ON stock_adjustments + FOR EACH ROW EXECUTE FUNCTION prevent_modification(); + +CREATE TABLE stock_adjustment_items ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id uuid NOT NULL, + company_id uuid NOT NULL, + adjustment_id uuid NOT NULL, + line_no smallint NOT NULL, + product_id uuid NOT NULL, + direction text NOT NULL CHECK (direction IN ('IN', 'OUT')), + quantity numeric(18,4) NOT NULL CHECK (quantity > 0), + -- For stock counts: what was counted and what the system held before. + counted_quantity numeric(18,4), + system_quantity numeric(18,4), + unit_cost numeric(18,6) NOT NULL CHECK (unit_cost >= 0), + total_cost numeric(18,2) NOT NULL CHECK (total_cost >= 0), + CONSTRAINT stock_adjustment_items_adjustment_fk FOREIGN KEY (adjustment_id, company_id) REFERENCES stock_adjustments (id, company_id), + CONSTRAINT stock_adjustment_items_product_fk FOREIGN KEY (product_id, company_id) REFERENCES products (id, company_id), + CONSTRAINT stock_adjustment_items_line_uq UNIQUE (adjustment_id, line_no) +); +CREATE TRIGGER stock_adjustment_items_append_only BEFORE UPDATE OR DELETE ON stock_adjustment_items + FOR EACH ROW EXECUTE FUNCTION prevent_modification(); + +-- Inventory differences account for existing companies (new companies get +-- it from the chart template). +INSERT INTO accounts (tenant_id, company_id, code, name_ar, name_en, account_type, parent_id, group_id, is_postable, is_system, system_key) +SELECT c.tenant_id, c.id, '5200', 'فروقات وتسويات المخزون', 'Inventory adjustments', 'COST_OF_GOODS_SOLD', + h.id, g.id, true, true, 'INVENTORY_ADJUSTMENT' + FROM companies c + JOIN accounts h ON h.company_id = c.id AND h.code = '5000' AND h.deleted_at IS NULL AND NOT h.is_postable + LEFT JOIN account_groups g ON g.company_id = c.id AND g.code = 'COST_OF_SALES' + WHERE NOT EXISTS (SELECT 1 FROM accounts a WHERE a.company_id = c.id AND a.system_key = 'INVENTORY_ADJUSTMENT') + AND NOT EXISTS (SELECT 1 FROM accounts a WHERE a.company_id = c.id AND a.code = '5200' AND a.deleted_at IS NULL); + +-- Row-Level Security and privileges -------------------------------------------------- +DO $$ +DECLARE t text; +BEGIN + FOREACH t IN ARRAY ARRAY['inventory_balances', 'stock_movements', 'stock_transfers', 'stock_transfer_items', + 'stock_adjustments', 'stock_adjustment_items'] LOOP + EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t); + EXECUTE format('CREATE POLICY %I ON %I USING (tenant_id = app_current_tenant_id()) WITH CHECK (tenant_id = app_current_tenant_id())', + t || '_isolation', t); + EXECUTE format('GRANT SELECT, INSERT ON %I TO alshuyukh_app', t); + END LOOP; +END +$$; +-- Balances are the only inventory rows that change after insert. +GRANT UPDATE ON inventory_balances TO alshuyukh_app; diff --git a/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts b/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts index 7be6c9754459..40d2b643235c 100644 --- a/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts +++ b/alshuyukh-accounting/apps/api/src/modules/accounting/chart-template.ts @@ -62,6 +62,7 @@ export const DEFAULT_ACCOUNTS: readonly AccountTemplate[] = [ { code: '5000', ar: 'تكلفة المبيعات', en: 'Cost of goods sold', type: 'COST_OF_GOODS_SOLD', postable: false }, { code: '5100', ar: 'تكلفة البضاعة المباعة', en: 'Cost of goods sold', type: 'COST_OF_GOODS_SOLD', parent: '5000', group: 'COST_OF_SALES', postable: true, systemKey: 'COGS' }, + { code: '5200', ar: 'فروقات وتسويات المخزون', en: 'Inventory adjustments', type: 'COST_OF_GOODS_SOLD', parent: '5000', group: 'COST_OF_SALES', postable: true, systemKey: 'INVENTORY_ADJUSTMENT' }, { code: '6000', ar: 'المصروفات', en: 'Expenses', type: 'EXPENSE', postable: false }, { code: '6100', ar: 'الإيجار', en: 'Rent', type: 'EXPENSE', parent: '6000', group: 'OPERATING_EXPENSES', postable: true }, diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts b/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts index 4d3b92facbcf..8099d3f25db6 100644 --- a/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts +++ b/alshuyukh-accounting/apps/api/src/modules/documents/drafts.ts @@ -256,18 +256,22 @@ async function checkBranchWarehouse(db: Db, companyId: string, branchId?: string } } -export async function insertItems(db: Db, kind: DocKind, tenantId: string, companyId: string, documentId: string, lines: BuiltLine[]) { +export async function insertItems(db: Db, kind: DocKind, tenantId: string, companyId: string, documentId: string, lines: BuiltLine[]): Promise { const sourceCol = kind.isReturn ? ', source_item_id' : ''; + const ids: string[] = []; for (const [i, l] of lines.entries()) { - await db.query( + const { rows: [row] } = await db.query<{ id: string }>( `INSERT INTO ${kind.itemsTable} (tenant_id, company_id, document_id, line_no, product_id, account_id, description, quantity, unit_id, unit_price, gross_amount, discount_basis, discount_amount, net_amount, vat_category, vat_rate, vat_amount, total_amount${sourceCol}) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18${kind.isReturn ? ', $19' : ''})`, + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18${kind.isReturn ? ', $19' : ''}) + RETURNING id`, [tenantId, companyId, documentId, i + 1, l.productId, l.accountId, l.description, l.quantity, l.unitId, l.unitPrice, l.grossAmount, l.discountBasis, l.discountAmount, l.netAmount, l.vatCategory, l.vatRate, l.vatAmount, l.totalAmount, ...(kind.isReturn ? [l.sourceItemId] : [])]); + ids.push(row!.id); } + return ids; } const totalsParams = (t: CalcTotals) => [t.subtotal, t.discountTotal, t.taxableAmount, t.taxAmount, t.total]; diff --git a/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts b/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts index ce1ab8f10b85..eb25afe0bbdc 100644 --- a/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts +++ b/alshuyukh-accounting/apps/api/src/modules/documents/posting.ts @@ -4,6 +4,7 @@ import { Decimal, toMoney } from '../../lib/money.js'; import { nextDocumentNumber } from '../../lib/sequences.js'; import { postEntry, reverse, type LineInput as JournalLine } from '../accounting/engine.js'; import { writeAudit } from '../audit/audit.service.js'; +import { issue, receive, resolveWarehouse, reverseDocumentMovements, trackedProducts, type Ref } from '../inventory/engine.js'; import { totalsOf } from './calc.js'; import { buildLines, buildReturn, createDraft, defaultDueDate, insertItems, loadDocument, lockDocument, @@ -19,8 +20,14 @@ import { KINDS, partyColumn, partyTable, type DocKind } from './kinds.js'; * Purchase invoice Dr Inventory/Expense per account, Dr VAT input / Cr Payable (supplier) * Purchase return Dr Payable (supplier) / Cr Inventory/Expense, Cr VAT input * - * The document and its entry are written in the same transaction. - * TODO(Phase 5): stock movements and the cost-of-goods-sold entry for tracked goods. + * Stocked goods also move inventory, in the same entry: + * Sales invoice Dr Cost of goods sold / Cr Inventory (average cost) + * Sales return Dr Inventory / Cr Cost of goods sold (the cost the goods left at) + * Purchase invoice Inventory is the line account (purchase price) + * Purchase return Cr Inventory at average cost; the difference from the + * purchase price goes to cost of goods sold + * + * The document, its stock movements and its entry are written in the same transaction. */ export async function systemAccount(db: Db, companyId: string, key: string): Promise { @@ -51,10 +58,12 @@ async function lineAccounts(db: Db, kind: DocKind, companyId: string, lines: Bui const p = products.get(l.productId!)!; if (kind.party === 'customer') { result.push(p.sales_account_id ?? await systemAccount(db, companyId, 'SALES')); - } else if (p.purchase_account_id) { - result.push(p.purchase_account_id); } else if (p.track_inventory) { + // Stocked goods always go through the Inventory account so the stock + // ledger and the general ledger stay equal. result.push(await systemAccount(db, companyId, 'INVENTORY')); + } else if (p.purchase_account_id) { + result.push(p.purchase_account_id); } else { throw badRequest('ACCOUNT_REQUIRED', `Line ${i + 1}: choose an expense account for "${p.name_ar}" or set a purchase account on the product`); } @@ -144,7 +153,7 @@ export async function issueDocument(db: Db, kind: DocKind, ctx: Ctx, id: string) const accounts = await lineAccounts(db, kind, d.company_id, lines); lines.forEach((l, i) => { l.accountId = accounts[i]!; }); await db.query(`DELETE FROM ${kind.itemsTable} WHERE document_id = $1`, [id]); - await insertItems(db, kind, ctx.tenantId, d.company_id, id, lines); + const lineIds = await insertItems(db, kind, ctx.tenantId, d.company_id, id, lines); const number = await nextDocumentNumber(db, ctx.tenantId, d.company_id, kind.key, { prefix: kind.prefix, padding: 6 }); const control = await controlAccount(db, kind.party, d.company_id, d.party_id); @@ -154,15 +163,43 @@ export async function issueDocument(db: Db, kind: DocKind, ctx: Ctx, id: string) // Revenue / cost side, grouped per account. const perAccount = new Map(); - lines.forEach((l) => perAccount.set(l.accountId!, (perAccount.get(l.accountId!) ?? new Decimal(0)).plus(l.netAmount))); + const addTo = (accountId: string, amount: Decimal.Value) => perAccount.set(accountId, (perAccount.get(accountId) ?? new Decimal(0)).plus(amount)); + lines.forEach((l) => addTo(l.accountId!, l.netAmount)); + + // Stock movements. `cogs` > 0 means Dr Cost of goods sold / Cr Inventory. + const stock = await moveStock(db, kind, ctx, d, lines, lineIds); + const cogs = stock.cogs; + if (stock.warehouseId) d.warehouse_id = stock.warehouseId; + if (kind.key === 'PURCHASE_RETURN' && stock.costs.size) { + // Inventory leaves at average cost; the gap to the purchase price is a cost difference. + // The line accounts are credited: Inventory at cost, the difference to cost of goods sold + // (a credit when the purchase price was above average, a debit when below). + const inventory = await systemAccount(db, d.company_id, 'INVENTORY'); + const cogsAccount = await systemAccount(db, d.company_id, 'COGS'); + for (const [i, l] of lines.entries()) { + const cost = stock.costs.get(i); + if (cost === undefined) continue; + addTo(inventory, new Decimal(cost).minus(l.netAmount)); + addTo(cogsAccount, new Decimal(l.netAmount).minus(cost)); + } + } + // Sales invoice & purchase return credit the line accounts; the other two debit them. const linesSideCredit = kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_RETURN'; - const side = (credit: boolean, amount: Decimal.Value) => (credit ? { credit: toMoney(amount) } : { debit: toMoney(amount) }); + /** A signed amount on the given side; negative amounts flip to the other side. */ + const side = (credit: boolean, amount: Decimal.Value) => { + const a = new Decimal(amount); + return (credit !== a.isNegative()) ? { credit: toMoney(a.abs()) } : { debit: toMoney(a.abs()) }; + }; const journal: JournalLine[] = [ { accountId: control, ...side(!linesSideCredit, totals.total), ...tag, branchId }, ...[...perAccount.entries()].filter(([, v]) => !v.isZero()).map(([accountId, v]) => ({ accountId, ...side(linesSideCredit, v), branchId })), ]; if (new Decimal(totals.taxAmount).greaterThan(0)) journal.push({ accountId: vatAccount, ...side(linesSideCredit, totals.taxAmount), branchId }); + if (!cogs.isZero()) { + journal.push({ accountId: await systemAccount(db, d.company_id, 'COGS'), ...side(false, cogs), branchId }); + journal.push({ accountId: await systemAccount(db, d.company_id, 'INVENTORY'), ...side(true, cogs), branchId }); + } const entry = await postEntry(db, ctx, { companyId: d.company_id, entryDate: d.doc_date, description: `${kind.labelAr} ${number}`, @@ -173,7 +210,7 @@ export async function issueDocument(db: Db, kind: DocKind, ctx: Ctx, id: string) ['status', kind.issuedStatus], ['doc_number', number], ['journal_entry_id', entry.id], ['issued_by', ctx.userId], ['issued_at', new Date()], ['party_snapshot', JSON.stringify(await partySnapshot(db, kind, d.party_id))], ['subtotal', totals.subtotal], ['discount_total', totals.discountTotal], ['taxable_amount', totals.taxableAmount], - ['tax_amount', totals.taxAmount], ['total', totals.total], + ['tax_amount', totals.taxAmount], ['total', totals.total], ['warehouse_id', d.warehouse_id], ]; if (kind.key === 'SALES_INVOICE' || kind.key === 'PURCHASE_INVOICE') { sets.push(['due_date', d.due_date ?? await defaultDueDate(db, kind, d.party_id, d.doc_date)]); @@ -223,6 +260,18 @@ export async function cancelDocument(db: Db, kind: DocKind, ctx: Ctx, id: string if (returns.rowCount) throw conflict('HAS_RETURNS', 'Cancel the returns issued against this invoice first'); } await reverse(db, ctx, d.journal_entry_id!, { reason: `إلغاء ${kind.labelAr} ${d.doc_number}: ${reason}`, date: d.doc_date, allowSystem: true }); + const residual = await reverseDocumentMovements(db, stockRef(ctx, d.company_id, d.doc_date, kind.key, id), kind.key, id); + if (new Decimal(residual).greaterThan(0)) { + // The warehouse emptied with value left over: expense it so the ledgers stay equal. + await postEntry(db, ctx, { + companyId: d.company_id, entryDate: d.doc_date, description: `تسوية قيمة مخزون بعد إلغاء ${kind.labelAr} ${d.doc_number}`, + referenceType: 'INVENTORY_RESIDUAL', referenceId: id, source: 'SYSTEM', + lines: [ + { accountId: await systemAccount(db, d.company_id, 'COGS'), debit: residual }, + { accountId: await systemAccount(db, d.company_id, 'INVENTORY'), credit: residual }, + ], + }); + } } await db.query(`UPDATE ${kind.table} SET status = 'CANCELLED', cancelled_by = $2, cancelled_at = now(), cancel_reason = $3 WHERE id = $1`, [id, ctx.userId, reason]); @@ -236,6 +285,61 @@ export async function cancelDocument(db: Db, kind: DocKind, ctx: Ctx, id: string return loadDocument(db, kind, ctx.tenantId, id); } +const stockRef = (ctx: Ctx, companyId: string, date: string, referenceType: string, referenceId: string): Ref => + ({ tenantId: ctx.tenantId, companyId, userId: ctx.userId, date, referenceType, referenceId }); + +/** + * Records the stock movements of an invoice or return being issued. + * Returns the net cost moved to cost of goods sold and, for purchase + * returns, the cost of each line. + */ +async function moveStock(db: Db, kind: DocKind, ctx: Ctx, d: Awaited>, lines: BuiltLine[], lineIds: string[]) { + const tracked = await trackedProducts(db, lines.map((l) => l.productId)); + const result = { cogs: new Decimal(0), costs: new Map(), warehouseId: null as string | null }; + if (!tracked.size) return result; + const ref = stockRef(ctx, d.company_id, d.doc_date, kind.key, d.id); + const docWarehouse = await resolveWarehouse(db, d.company_id, d.warehouse_id as string | null); + result.warehouseId = docWarehouse; + + for (const [i, l] of lines.entries()) { + if (!l.productId || !tracked.has(l.productId)) continue; + const move = { productId: l.productId, quantity: l.quantity, lineId: lineIds[i]! }; + if (kind.key === 'SALES_INVOICE') { + const { cost } = await issue(db, ref, { ...move, warehouseId: docWarehouse, type: 'SALE' }); + result.cogs = result.cogs.plus(cost); + } else if (kind.key === 'PURCHASE_INVOICE') { + await receive(db, ref, { ...move, warehouseId: docWarehouse, type: 'PURCHASE' }, l.netAmount); + } else { + // Returns go back to (or leave from) the warehouse of the original movement. + const origType = kind.key === 'SALES_RETURN' ? 'SALE' : 'PURCHASE'; + const { rows: [orig] } = await db.query<{ warehouse_id: string; quantity: string; total_cost: string }>( + `SELECT warehouse_id, quantity::text, total_cost::text FROM stock_movements + WHERE reference_line_id = $1 AND movement_type = $2 LIMIT 1`, [l.sourceItemId, origType]); + const warehouseId = orig?.warehouse_id ?? docWarehouse; + if (kind.key === 'PURCHASE_RETURN') { + const { cost } = await issue(db, ref, { ...move, warehouseId, type: 'PURCHASE_RETURN' }); + result.costs.set(i, cost); + continue; + } + if (!orig) continue; // sold before stock tracking: nothing to bring back at cost + // Sales return: the cost the goods left at, prorated; the last return takes the rest. + const { rows: [prior] } = await db.query<{ qty: string; cost: string }>( + `SELECT COALESCE(sum(m.quantity), 0)::text AS qty, COALESCE(sum(m.total_cost), 0)::text AS cost + FROM stock_movements m + JOIN ${kind.itemsTable} ri ON ri.id = m.reference_line_id + JOIN ${kind.table} r ON r.id = ri.document_id + WHERE ri.source_item_id = $1 AND m.movement_type = 'SALE_RETURN' AND r.status = 'ISSUED'`, [l.sourceItemId]); + const remainingQty = new Decimal(orig.quantity).minus(prior!.qty); + const cost = new Decimal(l.quantity).equals(remainingQty) + ? new Decimal(orig.total_cost).minus(prior!.cost) + : new Decimal(orig.total_cost).times(l.quantity).dividedBy(orig.quantity).toDecimalPlaces(2, Decimal.ROUND_HALF_UP); + await receive(db, ref, { ...move, warehouseId, type: 'SALE_RETURN' }, toMoney(cost)); + result.cogs = result.cogs.minus(cost); + } + } + return result; +} + const TRANSITIONS: Record> = { SALES_QUOTE: { DRAFT: ['SENT'], SENT: ['ACCEPTED', 'REJECTED'] }, PURCHASE_ORDER: { DRAFT: ['APPROVED'] }, diff --git a/alshuyukh-accounting/apps/api/src/modules/inventory/costing.ts b/alshuyukh-accounting/apps/api/src/modules/inventory/costing.ts new file mode 100644 index 000000000000..006c7d81e57d --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/inventory/costing.ts @@ -0,0 +1,39 @@ +import { Decimal, toMoney } from '../../lib/money.js'; + +/** + * Costing strategy. The engine asks it how much an issue costs and what the + * balance becomes; it never touches the database. + * + * WEIGHTED_AVERAGE is implemented. FIFO needs cost layers (one row per + * receipt with remaining quantity) and would implement the same interface, + * consuming the oldest layers on issue. + */ +export interface Balance { quantity: string; value: string } + +export interface CostingMethod { + receive(balance: Balance, quantity: string, totalCost: string): Balance; + issue(balance: Balance, quantity: string): { cost: string; balance: Balance }; +} + +export const weightedAverage: CostingMethod = { + receive(b, quantity, totalCost) { + return { + quantity: new Decimal(b.quantity).plus(quantity).toString(), + value: toMoney(new Decimal(b.value).plus(totalCost)), + }; + }, + issue(b, quantity) { + const qty = new Decimal(b.quantity); + const out = new Decimal(quantity); + // The last units out take exactly what is left, so no value is stranded. + const cost = out.equals(qty) + ? new Decimal(b.value) + : new Decimal(b.value).times(out).dividedBy(qty).toDecimalPlaces(2, Decimal.ROUND_HALF_UP); + return { + cost: toMoney(cost), + balance: { quantity: qty.minus(out).toString(), value: toMoney(new Decimal(b.value).minus(cost)) }, + }; + }, +}; + +export const COSTING: Record = { WEIGHTED_AVERAGE: weightedAverage }; diff --git a/alshuyukh-accounting/apps/api/src/modules/inventory/engine.ts b/alshuyukh-accounting/apps/api/src/modules/inventory/engine.ts new file mode 100644 index 000000000000..5faa7b65ca9d --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/inventory/engine.ts @@ -0,0 +1,150 @@ +import type { Db } from '../../db/tx.js'; +import { badRequest, conflict } from '../../lib/errors.js'; +import { Decimal, toMoney } from '../../lib/money.js'; +import { COSTING, type Balance, type CostingMethod } from './costing.js'; + +/** + * Inventory engine. Every quantity change goes through receive() or issue(), + * which lock the balance row, write an append-only stock movement, and + * update the balance in the caller's transaction. + * + * Accounting stays with the caller: it posts the movement's cost to the + * Inventory account in the same journal entry, so the stock ledger and the + * general ledger always hold the same value. + */ + +export type MovementType = + | 'PURCHASE' | 'SALE' | 'SALE_RETURN' | 'PURCHASE_RETURN' | 'TRANSFER_IN' | 'TRANSFER_OUT' + | 'ADJUSTMENT_IN' | 'ADJUSTMENT_OUT' | 'CANCELLATION_IN' | 'CANCELLATION_OUT'; + +export interface Ref { + tenantId: string; + companyId: string; + userId: string; + date: string; + referenceType: string; + referenceId: string; +} + +export interface MovementInput { + productId: string; + warehouseId: string; + quantity: string; + type: MovementType; + lineId?: string | null; +} + +async function costingFor(db: Db, companyId: string): Promise { + const { rows: [c] } = await db.query<{ costing_method: string }>(`SELECT costing_method FROM companies WHERE id = $1`, [companyId]); + return COSTING[c!.costing_method]!; +} + +async function lockBalance(db: Db, ref: Ref, productId: string, warehouseId: string): Promise { + await db.query( + `INSERT INTO inventory_balances (tenant_id, company_id, product_id, warehouse_id) VALUES ($1, $2, $3, $4) + ON CONFLICT (product_id, warehouse_id) DO NOTHING`, + [ref.tenantId, ref.companyId, productId, warehouseId]); + const { rows: [b] } = await db.query( + `SELECT quantity::text, value::text FROM inventory_balances WHERE product_id = $1 AND warehouse_id = $2 FOR UPDATE`, + [productId, warehouseId]); + return b!; +} + +async function write(db: Db, ref: Ref, m: MovementInput, direction: 'IN' | 'OUT', cost: string, after: Balance, reversesId?: string) { + await db.query(`UPDATE inventory_balances SET quantity = $3, value = $4 WHERE product_id = $1 AND warehouse_id = $2`, + [m.productId, m.warehouseId, after.quantity, after.value]); + const unitCost = new Decimal(cost).dividedBy(m.quantity).toDecimalPlaces(6).toString(); + const { rows: [row] } = await db.query<{ id: string }>( + `INSERT INTO stock_movements (tenant_id, company_id, product_id, warehouse_id, movement_type, direction, quantity, + unit_cost, total_cost, balance_quantity, balance_value, reference_type, reference_id, reference_line_id, + reverses_id, movement_date, created_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING id`, + [ref.tenantId, ref.companyId, m.productId, m.warehouseId, m.type, direction, m.quantity, unitCost, cost, + after.quantity, after.value, ref.referenceType, ref.referenceId, m.lineId ?? null, reversesId ?? null, ref.date, ref.userId]); + return row!.id; +} + +/** Adds stock at a known total cost (purchase price, or the cost a return or transfer carries). */ +export async function receive(db: Db, ref: Ref, m: MovementInput, totalCost: string, reversesId?: string) { + const method = await costingFor(db, ref.companyId); + const before = await lockBalance(db, ref, m.productId, m.warehouseId); + const after = method.receive(before, m.quantity, toMoney(totalCost)); + const id = await write(db, ref, m, 'IN', toMoney(totalCost), after, reversesId); + return { id, cost: toMoney(totalCost) }; +} + +async function productName(db: Db, productId: string) { + return (await db.query<{ name_ar: string }>(`SELECT name_ar FROM products WHERE id = $1`, [productId])).rows[0]?.name_ar ?? productId; +} + +/** Removes stock at its current cost. Negative stock is not allowed. */ +export async function issue(db: Db, ref: Ref, m: MovementInput) { + const method = await costingFor(db, ref.companyId); + const before = await lockBalance(db, ref, m.productId, m.warehouseId); + if (new Decimal(m.quantity).greaterThan(before.quantity)) { + throw conflict('INSUFFICIENT_STOCK', `Not enough stock of "${await productName(db, m.productId)}": ${new Decimal(before.quantity).toString()} available, ${new Decimal(m.quantity).toString()} needed`); + } + const { cost, balance } = method.issue(before, m.quantity); + const id = await write(db, ref, m, 'OUT', cost, balance); + return { id, cost }; +} + +/** + * Removes stock at a fixed cost, to undo an earlier receipt (cancelling a + * purchase or a sales return). If that empties the warehouse while value is + * left over, the leftover is returned so the caller can expense it. + */ +export async function issueAtCost(db: Db, ref: Ref, m: MovementInput, totalCost: string, reversesId: string) { + const before = await lockBalance(db, ref, m.productId, m.warehouseId); + const name = await productName(db, m.productId); + if (new Decimal(m.quantity).greaterThan(before.quantity) || new Decimal(totalCost).greaterThan(before.value)) { + throw conflict('INSUFFICIENT_STOCK', `The stock of "${name}" received by this document has already been used. Issue a return instead.`); + } + const qty = new Decimal(before.quantity).minus(m.quantity); + let value = new Decimal(before.value).minus(totalCost); + let residual = new Decimal(0); + if (qty.isZero() && !value.isZero()) { residual = value; value = new Decimal(0); } + const id = await write(db, ref, m, 'OUT', toMoney(totalCost), { quantity: qty.toString(), value: toMoney(value) }, reversesId); + return { id, residual: toMoney(residual) }; +} + +/** + * Undoes every movement of a document with opposite movements at the same + * cost. Returns any residual value to expense (see issueAtCost). + */ +export async function reverseDocumentMovements(db: Db, ref: Ref, originalType: string, originalId: string) { + const { rows } = await db.query<{ id: string; product_id: string; warehouse_id: string; direction: 'IN' | 'OUT'; quantity: string; total_cost: string; reference_line_id: string | null }>( + `SELECT m.id, m.product_id, m.warehouse_id, m.direction, m.quantity::text, m.total_cost::text, m.reference_line_id + FROM stock_movements m + WHERE m.reference_type = $1 AND m.reference_id = $2 AND m.reverses_id IS NULL + AND NOT EXISTS (SELECT 1 FROM stock_movements r WHERE r.reverses_id = m.id) + ORDER BY m.created_at`, [originalType, originalId]); + let residual = new Decimal(0); + for (const m of rows) { + const input: MovementInput = { + productId: m.product_id, warehouseId: m.warehouse_id, quantity: m.quantity, lineId: m.reference_line_id, + type: m.direction === 'IN' ? 'CANCELLATION_OUT' : 'CANCELLATION_IN', + }; + if (m.direction === 'OUT') await receive(db, ref, input, m.total_cost, m.id); + else residual = residual.plus((await issueAtCost(db, ref, input, m.total_cost, m.id)).residual); + } + return toMoney(residual); +} + +/** The document's warehouse, or the company's main warehouse. */ +export async function resolveWarehouse(db: Db, companyId: string, warehouseId?: string | null): Promise { + if (warehouseId) return warehouseId; + const { rows: [w] } = await db.query<{ id: string }>( + `SELECT id FROM warehouses WHERE company_id = $1 AND deleted_at IS NULL AND is_active + ORDER BY (code = 'MAIN') DESC, created_at LIMIT 1`, [companyId]); + if (!w) throw badRequest('WAREHOUSE_REQUIRED', 'Choose a warehouse for stocked items'); + return w.id; +} + +/** Products on these lines that hold stock. */ +export async function trackedProducts(db: Db, productIds: (string | null)[]): Promise> { + const ids = [...new Set(productIds.filter(Boolean))] as string[]; + if (!ids.length) return new Set(); + const { rows } = await db.query<{ id: string }>(`SELECT id FROM products WHERE id = ANY($1::uuid[]) AND track_inventory`, [ids]); + return new Set(rows.map((r) => r.id)); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/inventory/routes.ts b/alshuyukh-accounting/apps/api/src/modules/inventory/routes.ts new file mode 100644 index 000000000000..c9a50898058b --- /dev/null +++ b/alshuyukh-accounting/apps/api/src/modules/inventory/routes.ts @@ -0,0 +1,321 @@ +import type { FastifyInstance, FastifyRequest } from 'fastify'; +import { z } from 'zod'; +import type { Db } from '../../db/tx.js'; +import { isoDate } from '../../lib/dates.js'; +import { badRequest, notFound } from '../../lib/errors.js'; +import { Decimal, toMoney } from '../../lib/money.js'; +import { nextDocumentNumber } from '../../lib/sequences.js'; +import { parse, uuidParam } from '../../lib/validation.js'; +import { requirePermission } from '../../plugins/auth.js'; +import { resolveCompanyId } from '../accounting/company-context.js'; +import { postEntry } from '../accounting/engine.js'; +import { writeAudit } from '../audit/audit.service.js'; +import { systemAccount } from '../documents/posting.js'; +import { issue, receive, type Ref } from './engine.js'; + +const quantity = z.string().trim().regex(/^\d{1,14}(\.\d{1,4})?$/, 'Quantity: up to 4 decimals, sent as a string'); +const cost = z.string().trim().regex(/^\d{1,14}(\.\d{1,6})?$/, 'Unit cost: up to 6 decimals, sent as a string'); + +async function checkWarehouse(db: Db, companyId: string, warehouseId: string) { + const { rowCount } = await db.query(`SELECT 1 FROM warehouses WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL AND is_active`, [companyId, warehouseId]); + if (!rowCount) throw badRequest('INVALID_WAREHOUSE', 'Warehouse does not exist in this company or is inactive'); +} + +async function checkStocked(db: Db, companyId: string, productIds: string[]) { + const ids = [...new Set(productIds)]; + const { rows } = await db.query<{ id: string; track_inventory: boolean; name_ar: string }>( + `SELECT id, track_inventory, name_ar FROM products WHERE company_id = $1 AND id = ANY($2::uuid[]) AND deleted_at IS NULL`, [companyId, ids]); + if (rows.length !== ids.length) throw badRequest('INVALID_PRODUCT', 'A product does not exist in this company'); + const untracked = rows.find((p) => !p.track_inventory); + if (untracked) throw badRequest('NOT_STOCKED', `"${untracked.name_ar}" does not track stock`); + if (ids.length !== productIds.length) throw badRequest('INVALID_LINE', 'The same product appears twice'); +} + +const ctxRef = (req: FastifyRequest, companyId: string, date: string, referenceType: string, referenceId: string): Ref => + ({ tenantId: req.auth!.tenantId, companyId, userId: req.auth!.userId, date, referenceType, referenceId }); + +export default async function inventoryRoutes(app: FastifyInstance) { + const canView = requirePermission(app, 'inventory.view'); + + /** Quantity, value and average cost per product and warehouse. */ + app.get('/inventory/balances', { preHandler: canView }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), warehouseId: z.uuid().optional(), productId: z.uuid().optional(), + includeZero: z.enum(['true', 'false']).optional(), + }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query( + `SELECT b.product_id AS "productId", p.sku, p.name_ar AS "productName", u.code AS "unitCode", + b.warehouse_id AS "warehouseId", w.name AS "warehouseName", b.quantity::text, b.value::text, + CASE WHEN b.quantity > 0 THEN round(b.value / b.quantity, 4) ELSE 0 END::text AS "averageCost" + FROM inventory_balances b + JOIN products p ON p.id = b.product_id JOIN units u ON u.id = p.unit_id JOIN warehouses w ON w.id = b.warehouse_id + WHERE b.tenant_id = $1 AND b.company_id = $2 AND ($3::uuid IS NULL OR b.warehouse_id = $3) + AND ($4::uuid IS NULL OR b.product_id = $4) AND ($5::boolean OR b.quantity > 0) + ORDER BY p.name_ar, w.name`, + [req.auth!.tenantId, companyId, q.warehouseId ?? null, q.productId ?? null, q.includeZero === 'true']); + return { data: rows }; + }); + }); + + /** Stock card: movements of one product with running balances. */ + app.get('/inventory/movements', { preHandler: canView }, async (req) => { + const q = parse(z.object({ + companyId: z.uuid().optional(), productId: z.uuid().optional(), warehouseId: z.uuid().optional(), + dateFrom: isoDate.optional(), dateTo: isoDate.optional(), + limit: z.coerce.number().int().min(1).max(500).default(100), offset: z.coerce.number().int().min(0).default(0), + }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query<{ total_count: string }>( + `SELECT count(*) OVER () AS total_count, m.id, m.movement_date AS date, m.movement_type AS type, m.direction, + m.product_id AS "productId", p.name_ar AS "productName", p.sku, m.warehouse_id AS "warehouseId", w.name AS "warehouseName", + m.quantity::text, m.unit_cost::text AS "unitCost", m.total_cost::text AS "totalCost", + m.balance_quantity::text AS "balanceQuantity", m.balance_value::text AS "balanceValue", + m.reference_type AS "referenceType", m.reference_id AS "referenceId", m.created_at AS "createdAt" + FROM stock_movements m JOIN products p ON p.id = m.product_id JOIN warehouses w ON w.id = m.warehouse_id + WHERE m.tenant_id = $1 AND m.company_id = $2 AND ($3::uuid IS NULL OR m.product_id = $3) + AND ($4::uuid IS NULL OR m.warehouse_id = $4) AND ($5::date IS NULL OR m.movement_date >= $5) + AND ($6::date IS NULL OR m.movement_date <= $6) + ORDER BY m.created_at DESC, m.id DESC LIMIT $7 OFFSET $8`, + [req.auth!.tenantId, companyId, q.productId ?? null, q.warehouseId ?? null, q.dateFrom ?? null, q.dateTo ?? null, q.limit, q.offset]); + return { data: rows.map(({ total_count: _t, ...r }) => r), total: Number(rows[0]?.total_count ?? 0) }; + }); + }); + + /** + * Inventory valuation, reconciled with the general ledger: the stock value + * must equal the balance of the Inventory account. + */ + app.get('/inventory/valuation', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + const { rows } = await db.query<{ value: string }>( + `SELECT p.id AS "productId", p.sku, p.name_ar AS "productName", sum(b.quantity)::text AS quantity, sum(b.value)::text AS value + FROM inventory_balances b JOIN products p ON p.id = b.product_id + WHERE b.tenant_id = $1 AND b.company_id = $2 + GROUP BY p.id HAVING sum(b.quantity) > 0 ORDER BY p.name_ar`, [req.auth!.tenantId, companyId]); + const stockValue = rows.reduce((s, r) => s.plus(r.value), new Decimal(0)); + const { rows: [gl] } = await db.query<{ balance: string }>( + `SELECT COALESCE(sum(l.debit - l.credit), 0)::text AS balance + FROM journal_entry_lines l JOIN journal_entries e ON e.id = l.journal_entry_id + JOIN accounts a ON a.id = l.account_id + WHERE e.company_id = $1 AND e.status IN ('POSTED', 'REVERSED') AND a.system_key = 'INVENTORY'`, [companyId]); + const difference = new Decimal(gl!.balance).minus(stockValue); + return { + data: rows, stockValue: toMoney(stockValue), ledgerBalance: toMoney(gl!.balance), + difference: toMoney(difference), reconciled: difference.isZero(), + }; + }); + }); + + // Transfers -------------------------------------------------------------------- + const TRANSFER_SELECT = ` + SELECT t.id, t.transfer_number AS number, t.transfer_date AS date, t.from_warehouse_id AS "fromWarehouseId", + fw.name AS "fromWarehouseName", t.to_warehouse_id AS "toWarehouseId", tw.name AS "toWarehouseName", + t.notes, t.total_cost::text AS "totalCost", t.created_at AS "createdAt" + FROM stock_transfers t JOIN warehouses fw ON fw.id = t.from_warehouse_id JOIN warehouses tw ON tw.id = t.to_warehouse_id`; + + async function loadTransfer(db: Db, tenantId: string, id: string) { + const { rows: [t] } = await db.query(`${TRANSFER_SELECT} WHERE t.tenant_id = $1 AND t.id = $2`, [tenantId, id]); + if (!t) throw notFound('Transfer'); + const { rows: lines } = await db.query( + `SELECT i.line_no AS "lineNo", i.product_id AS "productId", p.sku, p.name_ar AS "productName", i.quantity::text, i.total_cost::text AS "totalCost" + FROM stock_transfer_items i JOIN products p ON p.id = i.product_id WHERE i.transfer_id = $1 ORDER BY i.line_no`, [id]); + return { ...t, lines }; + } + + app.get('/stock-transfers', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + return { data: (await db.query(`${TRANSFER_SELECT} WHERE t.tenant_id = $1 AND t.company_id = $2 ORDER BY t.transfer_date DESC, t.transfer_number DESC LIMIT 200`, [req.auth!.tenantId, companyId])).rows }; + }); + }); + + app.get('/stock-transfers/:id', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx((db) => loadTransfer(db, req.auth!.tenantId, id)); + }); + + /** Moves stock between warehouses at average cost. No journal entry: the value stays in Inventory. */ + app.post('/stock-transfers', { preHandler: requirePermission(app, 'inventory.transfer') }, async (req, reply) => { + const body = parse(z.object({ + companyId: z.uuid().optional(), fromWarehouseId: z.uuid(), toWarehouseId: z.uuid(), date: isoDate, + notes: z.string().trim().max(1000).nullish(), + lines: z.array(z.object({ productId: z.uuid(), quantity })).min(1).max(500), + }), req.body); + if (body.fromWarehouseId === body.toWarehouseId) throw badRequest('SAME_WAREHOUSE', 'Choose two different warehouses'); + const a = req.auth!; + const transfer = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + await checkWarehouse(db, companyId, body.fromWarehouseId); + await checkWarehouse(db, companyId, body.toWarehouseId); + await checkStocked(db, companyId, body.lines.map((l) => l.productId)); + const number = await nextDocumentNumber(db, a.tenantId, companyId, 'STOCK_TRANSFER', { prefix: 'TRF', padding: 6 }); + const id = crypto.randomUUID(); + const ref = ctxRef(req, companyId, body.date, 'STOCK_TRANSFER', id); + const costs: string[] = []; + for (const [i, l] of body.lines.entries()) { + if (!new Decimal(l.quantity).greaterThan(0)) throw badRequest('INVALID_LINE', `Line ${i + 1}: quantity must be greater than zero`); + const out = await issue(db, ref, { productId: l.productId, warehouseId: body.fromWarehouseId, quantity: l.quantity, type: 'TRANSFER_OUT' }); + await receive(db, ref, { productId: l.productId, warehouseId: body.toWarehouseId, quantity: l.quantity, type: 'TRANSFER_IN' }, out.cost); + costs.push(out.cost); + } + const total = toMoney(costs.reduce((s2, c) => s2.plus(c), new Decimal(0))); + await db.query( + `INSERT INTO stock_transfers (id, tenant_id, company_id, transfer_number, transfer_date, from_warehouse_id, to_warehouse_id, notes, total_cost, created_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, + [id, a.tenantId, companyId, number, body.date, body.fromWarehouseId, body.toWarehouseId, body.notes ?? null, total, a.userId]); + for (const [i, l] of body.lines.entries()) { + await db.query( + `INSERT INTO stock_transfer_items (tenant_id, company_id, transfer_id, line_no, product_id, quantity, total_cost) VALUES ($1, $2, $3, $4, $5, $6, $7)`, + [a.tenantId, companyId, id, i + 1, l.productId, l.quantity, costs[i]]); + } + const t = { id }; + const created = await loadTransfer(db, a.tenantId, t!.id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'stock_transfer', entityId: t!.id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return transfer; + }); + + // Adjustments ------------------------------------------------------------------ + const ADJ_SELECT = ` + SELECT s.id, s.adjustment_number AS number, s.adjustment_date AS date, s.warehouse_id AS "warehouseId", w.name AS "warehouseName", + s.reason, s.offset_account_id AS "offsetAccountId", a.code AS "offsetAccountCode", a.name_ar AS "offsetAccountName", + s.total_increase::text AS "totalIncrease", s.total_decrease::text AS "totalDecrease", + s.journal_entry_id AS "journalEntryId", s.created_at AS "createdAt" + FROM stock_adjustments s JOIN warehouses w ON w.id = s.warehouse_id JOIN accounts a ON a.id = s.offset_account_id`; + + async function loadAdjustment(db: Db, tenantId: string, id: string) { + const { rows: [s] } = await db.query(`${ADJ_SELECT} WHERE s.tenant_id = $1 AND s.id = $2`, [tenantId, id]); + if (!s) throw notFound('Adjustment'); + const { rows: lines } = await db.query( + `SELECT i.line_no AS "lineNo", i.product_id AS "productId", p.sku, p.name_ar AS "productName", i.direction, + i.quantity::text, i.counted_quantity::text AS "countedQuantity", i.system_quantity::text AS "systemQuantity", + i.unit_cost::text AS "unitCost", i.total_cost::text AS "totalCost" + FROM stock_adjustment_items i JOIN products p ON p.id = i.product_id WHERE i.adjustment_id = $1 ORDER BY i.line_no`, [id]); + return { ...s, lines }; + } + + app.get('/stock-adjustments', { preHandler: canView }, async (req) => { + const q = parse(z.object({ companyId: z.uuid().optional() }), req.query); + return req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, req.auth!.tenantId, q.companyId); + return { data: (await db.query(`${ADJ_SELECT} WHERE s.tenant_id = $1 AND s.company_id = $2 ORDER BY s.adjustment_date DESC, s.adjustment_number DESC LIMIT 200`, [req.auth!.tenantId, companyId])).rows }; + }); + }); + + app.get('/stock-adjustments/:id', { preHandler: canView }, async (req) => { + const { id } = parse(uuidParam, req.params); + return req.tenantTx((db) => loadAdjustment(db, req.auth!.tenantId, id)); + }); + + /** + * Adjusts stock in one warehouse. Each line is either a direction and + * quantity, or a counted quantity (stock count) from which the difference + * is derived. Increases are valued at the given unit cost or the current + * average; decreases at average cost. The journal entry posts the + * difference against the offset account (default: inventory adjustments; + * use an equity account for opening stock). + */ + app.post('/stock-adjustments', { preHandler: requirePermission(app, 'inventory.adjust') }, async (req, reply) => { + const line = z.union([ + z.object({ productId: z.uuid(), countedQuantity: z.string().trim().regex(/^\d{1,14}(\.\d{1,4})?$/), unitCost: cost.optional() }), + z.object({ productId: z.uuid(), direction: z.enum(['IN', 'OUT']), quantity, unitCost: cost.optional() }), + ]); + const body = parse(z.object({ + companyId: z.uuid().optional(), warehouseId: z.uuid(), date: isoDate, reason: z.string().trim().min(3).max(500), + offsetAccountId: z.uuid().optional(), lines: z.array(line).min(1).max(500), + }), req.body); + const a = req.auth!; + const adjustment = await req.tenantTx(async (db) => { + const companyId = await resolveCompanyId(db, a.tenantId, body.companyId); + await checkWarehouse(db, companyId, body.warehouseId); + await checkStocked(db, companyId, body.lines.map((l) => l.productId)); + const offset = body.offsetAccountId ?? await systemAccount(db, companyId, 'INVENTORY_ADJUSTMENT'); + const { rows: [acc] } = await db.query<{ account_type: string; is_postable: boolean; is_active: boolean; system_key: string | null }>( + `SELECT account_type, is_postable, is_active, system_key FROM accounts WHERE company_id = $1 AND id = $2 AND deleted_at IS NULL`, [companyId, offset]); + if (!acc || !acc.is_postable || !acc.is_active || acc.system_key === 'INVENTORY' + || !['EXPENSE', 'COST_OF_GOODS_SOLD', 'EQUITY', 'REVENUE'].includes(acc.account_type)) { + throw badRequest('INVALID_OFFSET_ACCOUNT', 'The offset account must be an active postable expense, cost, equity or revenue account'); + } + + const number = await nextDocumentNumber(db, a.tenantId, companyId, 'STOCK_ADJUSTMENT', { prefix: 'ADJ', padding: 6 }); + const id = crypto.randomUUID(); + const ref = ctxRef(req, companyId, body.date, 'STOCK_ADJUSTMENT', id); + let increase = new Decimal(0); + let decrease = new Decimal(0); + const items: unknown[][] = []; + for (const [i, l] of body.lines.entries()) { + const n = i + 1; + const { rows: [bal] } = await db.query<{ quantity: string; value: string }>( + `SELECT quantity::text, value::text FROM inventory_balances WHERE product_id = $1 AND warehouse_id = $2`, [l.productId, body.warehouseId]); + const systemQty = new Decimal(bal?.quantity ?? 0); + let direction: 'IN' | 'OUT'; + let qty: Decimal; + let counted: string | null = null; + if ('countedQuantity' in l) { + const diff = new Decimal(l.countedQuantity).minus(systemQty); + if (diff.isZero()) continue; // counted matches the books + direction = diff.greaterThan(0) ? 'IN' : 'OUT'; + qty = diff.abs(); + counted = l.countedQuantity; + } else { + direction = l.direction; + qty = new Decimal(l.quantity); + if (!qty.greaterThan(0)) throw badRequest('INVALID_LINE', `Line ${n}: quantity must be greater than zero`); + } + let lineCost: string; + if (direction === 'IN') { + let unit: Decimal; + if (l.unitCost !== undefined) unit = new Decimal(l.unitCost); + else if (systemQty.greaterThan(0)) unit = new Decimal(bal!.value).dividedBy(systemQty); + else throw badRequest('UNIT_COST_REQUIRED', `Line ${n}: enter a unit cost; there is no current cost to use`); + lineCost = toMoney(unit.times(qty).toDecimalPlaces(2, Decimal.ROUND_HALF_UP)); + await receive(db, ref, { productId: l.productId, warehouseId: body.warehouseId, quantity: qty.toString(), type: 'ADJUSTMENT_IN' }, lineCost); + increase = increase.plus(lineCost); + } else { + lineCost = (await issue(db, ref, { productId: l.productId, warehouseId: body.warehouseId, quantity: qty.toString(), type: 'ADJUSTMENT_OUT' })).cost; + decrease = decrease.plus(lineCost); + } + items.push([l.productId, direction, qty.toString(), counted, counted === null ? null : systemQty.toString(), + new Decimal(lineCost).dividedBy(qty).toDecimalPlaces(6).toString(), lineCost]); + } + if (!items.length) throw badRequest('NOTHING_TO_ADJUST', 'Every counted quantity matches the system quantity'); + + let journalEntryId: string | null = null; + const journal = []; + const inventory = await systemAccount(db, companyId, 'INVENTORY'); + if (increase.greaterThan(0)) journal.push({ accountId: inventory, debit: toMoney(increase) }, { accountId: offset, credit: toMoney(increase) }); + if (decrease.greaterThan(0)) journal.push({ accountId: offset, debit: toMoney(decrease) }, { accountId: inventory, credit: toMoney(decrease) }); + if (journal.length) { + const entry = await postEntry(db, { tenantId: a.tenantId, userId: a.userId, meta: req.auditMeta() }, { + companyId, entryDate: body.date, description: `تسوية مخزون ${number}: ${body.reason}`, + referenceType: 'STOCK_ADJUSTMENT', referenceId: id, source: 'SYSTEM', lines: journal, + }); + journalEntryId = entry.id; + } + await db.query( + `INSERT INTO stock_adjustments (id, tenant_id, company_id, adjustment_number, adjustment_date, warehouse_id, reason, + offset_account_id, total_increase, total_decrease, journal_entry_id, created_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, + [id, a.tenantId, companyId, number, body.date, body.warehouseId, body.reason, offset, toMoney(increase), toMoney(decrease), journalEntryId, a.userId]); + for (const [i, item] of items.entries()) { + await db.query( + `INSERT INTO stock_adjustment_items (tenant_id, company_id, adjustment_id, line_no, product_id, direction, quantity, + counted_quantity, system_quantity, unit_cost, total_cost) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, [a.tenantId, companyId, id, i + 1, ...item]); + } + const created = await loadAdjustment(db, a.tenantId, id); + await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'CREATE', entityType: 'stock_adjustment', entityId: id, newValues: created }, req.auditMeta()); + return created; + }); + reply.code(201); + return adjustment; + }); +} diff --git a/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts b/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts index 2d4da81ac37d..375f52d65936 100644 --- a/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts +++ b/alshuyukh-accounting/apps/api/src/modules/products/products.routes.ts @@ -18,7 +18,8 @@ const PRODUCT_SELECT = ` p.sale_price::text AS "salePrice", p.sale_price_includes_vat AS "salePriceIncludesVat", p.purchase_price::text AS "purchasePrice", p.vat_category AS "vatCategory", p.track_inventory AS "trackInventory", p.sales_account_id AS "salesAccountId", p.purchase_account_id AS "purchaseAccountId", - p.is_active AS "isActive", p.created_at AS "createdAt", p.updated_at AS "updatedAt" + p.is_active AS "isActive", p.created_at AS "createdAt", p.updated_at AS "updatedAt", + COALESCE((SELECT sum(b.quantity) FROM inventory_balances b WHERE b.product_id = p.id), 0)::text AS "onHand" FROM products p JOIN units u ON u.id = p.unit_id LEFT JOIN product_categories c ON c.id = p.category_id`; @@ -273,7 +274,11 @@ export default async function productsRoutes(app: FastifyInstance) { const type = body.productType ?? before.productType; const track = body.trackInventory ?? (body.productType === 'SERVICE' ? false : before.trackInventory); if (type === 'SERVICE' && track) throw badRequest('SERVICE_NO_STOCK', 'Services cannot track inventory'); - // TODO(Phase 5): refuse changing type or tracking once stock movements exist. + if ((body.productType !== undefined && body.productType !== before.productType) || + (body.trackInventory !== undefined && body.trackInventory !== before.trackInventory)) { + const moved = await db.query(`SELECT 1 FROM stock_movements WHERE product_id = $1 LIMIT 1`, [id]); + if (moved.rowCount) throw conflict('PRODUCT_HAS_STOCK_HISTORY', 'The type and stock tracking of a product with stock movements cannot change'); + } if (body.productType === 'SERVICE' && body.trackInventory === undefined) body.trackInventory = false; await checkReferences(db, before.companyId, body); const sets: string[] = []; @@ -297,8 +302,7 @@ export default async function productsRoutes(app: FastifyInstance) { const before = await loadProduct(db, a.tenantId, id); if (!before) throw notFound('Product'); const itemTables = ['sales_quote_items', 'sales_invoice_items', 'sales_return_items', 'purchase_order_items', 'purchase_invoice_items', 'purchase_return_items']; - // TODO(Phase 5): also refuse when stock movements reference the product. - const used = await db.query(`${itemTables.map((t) => `SELECT 1 FROM ${t} WHERE product_id = $1`).join(' UNION ALL ')} LIMIT 1`, [id]); + const used = await db.query(`${[...itemTables, 'stock_movements'].map((t) => `SELECT 1 FROM ${t} WHERE product_id = $1`).join(' UNION ALL ')} LIMIT 1`, [id]); if (used.rowCount) throw conflict('PRODUCT_IN_USE', 'This product is used in documents. Deactivate it instead.'); await db.query(`UPDATE products SET deleted_at = now(), is_active = false, updated_by = $2 WHERE id = $1`, [id, a.userId]); await writeAudit(db, { tenantId: a.tenantId, userId: a.userId, action: 'DELETE', entityType: 'product', entityId: id, oldValues: before }, req.auditMeta()); diff --git a/alshuyukh-accounting/apps/api/test/commerce-helpers.ts b/alshuyukh-accounting/apps/api/test/commerce-helpers.ts index b0bc2b6259d5..52e9496d7392 100644 --- a/alshuyukh-accounting/apps/api/test/commerce-helpers.ts +++ b/alshuyukh-accounting/apps/api/test/commerce-helpers.ts @@ -6,7 +6,9 @@ export interface Commerce { date: string; customer(extra?: Record): Promise<{ id: string }>; supplier(extra?: Record): Promise<{ id: string }>; + /** A service by default (no stock); use goods() for stocked items. */ product(extra?: Record): Promise<{ id: string }>; + goods(extra?: Record): Promise<{ id: string }>; invoice(customerId: string, lines: unknown[], extra?: Record): Promise>; postInvoice(customerId: string, lines: unknown[], extra?: Record): Promise>; purchase(supplierId: string, lines: unknown[], extra?: Record): Promise>; @@ -28,7 +30,8 @@ export async function commerce(app: FastifyInstance, s: Session): Promise ok(api.post('/api/customers', { nameAr: `عميل ${++seq}`, ...extra })), supplier: (extra = {}) => ok(api.post('/api/suppliers', { nameAr: `مورد ${++seq}`, ...extra })), - product: (extra = {}) => ok(api.post('/api/products', { nameAr: `منتج ${++seq}`, salePrice: '100', purchasePrice: '60', ...extra })), + product: (extra = {}) => ok(api.post('/api/products', { nameAr: `خدمة ${++seq}`, productType: 'SERVICE', salePrice: '100', purchasePrice: '60', ...extra })), + goods: (extra = {}) => ok(api.post('/api/products', { nameAr: `صنف ${++seq}`, productType: 'GOODS', salePrice: '100', purchasePrice: '60', ...extra })), invoice: (customerId, lines, extra = {}) => ok(api.post('/api/invoices', { partyId: customerId, docDate: date, lines, ...extra })), async postInvoice(customerId, lines, extra = {}) { const inv = await ok(api.post('/api/invoices', { partyId: customerId, docDate: date, lines, ...extra })); diff --git a/alshuyukh-accounting/apps/api/test/inventory.test.ts b/alshuyukh-accounting/apps/api/test/inventory.test.ts new file mode 100644 index 000000000000..0b9e54db23a1 --- /dev/null +++ b/alshuyukh-accounting/apps/api/test/inventory.test.ts @@ -0,0 +1,268 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { withTx } from '../src/db/tx.js'; +import { commerce, type Commerce } from './commerce-helpers.js'; +import { addMember, chart, client, fiscalYears, register, setupApp, type Chart, type Session, type TestContext } from './helpers.js'; + +let t: TestContext; +let owner: Session; +let c: Commerce; +let ch: Chart; +let main: string; +let second: string; + +beforeAll(async () => { + t = await setupApp(); + owner = await register(t.app); + c = await commerce(t.app, owner); + ch = await chart(t.app, owner.token); + const company = (await c.api.get('/api/companies')).json().data[0]; + main = (await c.api.get(`/api/companies/${company.id}/warehouses`)).json().data[0].id; + second = (await c.api.post(`/api/companies/${company.id}/warehouses`, { code: 'JED', name: 'مستودع جدة' })).json().id; +}); +afterAll(async () => { await t.close(); }); + +const balance = async (productId: string, warehouseId = main) => { + const rows = (await c.api.get(`/api/inventory/balances?productId=${productId}&warehouseId=${warehouseId}&includeZero=true`)).json().data; + return rows[0] ? { quantity: rows[0].quantity, value: rows[0].value } : { quantity: '0', value: '0' }; +}; +const reconciled = async () => { + const v = (await c.api.get('/api/inventory/valuation')).json(); + expect(v.difference, `stock ${v.stockValue} vs ledger ${v.ledgerBalance}`).toBe('0.00'); + return v; +}; +const adjustIn = (productId: string, quantity: string, unitCost: string, warehouseId = main, offsetAccountId?: string) => + c.api.post('/api/stock-adjustments', { warehouseId, date: c.date, reason: 'رصيد افتتاحي', offsetAccountId, lines: [{ productId, direction: 'IN', quantity, unitCost }] }); +const sell = (customerId: string, productId: string, quantity: string, extra = {}) => + c.postInvoice(customerId, [{ productId, quantity, unitPrice: '100' }], extra); +const entryLines = async (journalEntryId: string) => (await c.journal(journalEntryId)).map((l) => [l.accountCode, l.debit, l.credit]); + +describe('receipts, sales and weighted average cost', () => { + let product: string; + let customer: string; + + beforeAll(async () => { + product = (await c.goods()).id; + customer = (await c.customer()).id; + }); + + it('records opening stock with an adjustment against capital', async () => { + const res = await adjustIn(product, '10', '50', main, ch.byKey.get('CAPITAL')); + expect(res.statusCode).toBe(201); + expect(res.json()).toMatchObject({ totalIncrease: '500.00', offsetAccountCode: '3100' }); + expect(await entryLines(res.json().journalEntryId)).toEqual([['1400', '500.00', '0.00'], ['3100', '0.00', '500.00']]); + expect(await balance(product)).toEqual({ quantity: '10.0000', value: '500.00' }); + await reconciled(); + }); + + it('adds purchases at the net purchase price and moves the average', async () => { + const sup = await c.supplier(); + await c.purchase(sup.id, [{ productId: product, quantity: '10', unitPrice: '60' }]); + expect(await balance(product)).toEqual({ quantity: '20.0000', value: '1100.00' }); + await reconciled(); + }); + + it('posts cost of goods sold with the sale: Dr COGS / Cr Inventory at average cost', async () => { + const inv = await sell(customer, product, '4'); + expect(await entryLines(inv.journalEntryId)).toEqual([ + ['1300', '460.00', '0.00'], ['4100', '0.00', '400.00'], ['2210', '0.00', '60.00'], + ['5100', '220.00', '0.00'], ['1400', '0.00', '220.00'], + ]); + expect(await balance(product)).toEqual({ quantity: '16.0000', value: '880.00' }); + const card = (await c.api.get(`/api/inventory/movements?productId=${product}`)).json().data; + expect(card[0]).toMatchObject({ type: 'SALE', direction: 'OUT', quantity: '4.0000', totalCost: '220.00', unitCost: '55.000000', balanceQuantity: '16.0000', balanceValue: '880.00' }); + await reconciled(); + }); + + it('refuses to sell more than is in stock and changes nothing', async () => { + const draft = await c.invoice(customer, [{ productId: product, quantity: '100', unitPrice: '100' }]); + const res = await c.api.post(`/api/invoices/${draft.id}/post`); + expect(res.statusCode).toBe(409); + expect(res.json().error.code).toBe('INSUFFICIENT_STOCK'); + expect((await c.api.get(`/api/invoices/${draft.id}`)).json().status).toBe('DRAFT'); + expect(await balance(product)).toEqual({ quantity: '16.0000', value: '880.00' }); + }); + + it('brings returned goods back at the cost they left at, exactly', async () => { + const inv = await sell(customer, product, '3'); // 3 × 55 = 165 + const ret = async (q: string) => { + const r = (await c.api.post('/api/sales-returns', { originalInvoiceId: inv.id, docDate: c.date, reason: 'إرجاع', lines: [{ sourceItemId: inv.lines[0].id, quantity: q }] })).json(); + return (await c.api.post(`/api/sales-returns/${r.id}/post`)).json(); + }; + const r1 = await ret('1'); + expect((await entryLines(r1.journalEntryId)).slice(-2)).toEqual([['5100', '0.00', '55.00'], ['1400', '55.00', '0.00']]); + const r2 = await ret('2'); + expect((await entryLines(r2.journalEntryId)).slice(-2)).toEqual([['5100', '0.00', '110.00'], ['1400', '110.00', '0.00']]); + expect(await balance(product)).toEqual({ quantity: '16.0000', value: '880.00' }); + await reconciled(); + }); + + it('restores stock when a sale is cancelled', async () => { + const inv = await sell(customer, product, '2'); + expect(await balance(product)).toEqual({ quantity: '14.0000', value: '770.00' }); + await c.api.post(`/api/invoices/${inv.id}/cancel`, { reason: 'خطأ' }); + expect(await balance(product)).toEqual({ quantity: '16.0000', value: '880.00' }); + const card = (await c.api.get(`/api/inventory/movements?productId=${product}`)).json().data; + expect(card[0]).toMatchObject({ type: 'CANCELLATION_IN', totalCost: '110.00' }); + await reconciled(); + }); +}); + +describe('rounding', () => { + it('issues 100.00 over 3 units at the running average and leaves nothing behind', async () => { + const product = (await c.goods()).id; + const cust = (await c.customer()).id; + await adjustIn(product, '3', '33.333333'); + expect(await balance(product)).toEqual({ quantity: '3.0000', value: '100.00' }); + const costs = []; + for (let i = 0; i < 3; i++) { + const inv = await sell(cust, product, '1'); + costs.push((await c.journal(inv.journalEntryId)).find((l) => l.accountCode === '5100')!.debit); + } + // 100.00 / 3 = 33.33; then 66.67 / 2 = 33.335 → 33.34; the last unit takes the remaining 33.33. + expect(costs).toEqual(['33.33', '33.34', '33.33']); + expect(await balance(product)).toEqual({ quantity: '0.0000', value: '0.00' }); + await reconciled(); + }); +}); + +describe('purchase returns and cancellations', () => { + it('returns goods at average cost and books the price difference to COGS', async () => { + const product = (await c.goods()).id; + const sup = (await c.supplier()).id; + await c.purchase(sup, [{ productId: product, quantity: '10', unitPrice: '10' }]); + const expensive = await c.purchase(sup, [{ productId: product, quantity: '10', unitPrice: '20' }]); // average 15 + const r = (await c.api.post('/api/purchase-returns', { originalInvoiceId: expensive.id, docDate: c.date, reason: 'معيب', lines: [{ sourceItemId: expensive.lines[0].id, quantity: '5' }] })).json(); + const ret = (await c.api.post(`/api/purchase-returns/${r.id}/post`)).json(); + expect(await entryLines(ret.journalEntryId)).toEqual([ + ['2100', '115.00', '0.00'], ['1400', '0.00', '75.00'], ['5100', '0.00', '25.00'], ['2220', '0.00', '15.00'], + ]); + expect(await balance(product)).toEqual({ quantity: '15.0000', value: '225.00' }); + await reconciled(); + }); + + it('refuses to cancel a purchase whose goods were already used', async () => { + const product = (await c.goods()).id; + const bill = await c.purchase((await c.supplier()).id, [{ productId: product, quantity: '5', unitPrice: '10' }]); + await sell((await c.customer()).id, product, '3'); + const res = await c.api.post(`/api/purchase-invoices/${bill.id}/cancel`, { reason: 'إلغاء' }); + expect(res.json().error.code).toBe('INSUFFICIENT_STOCK'); + }); + + it('expenses leftover value when cancelling a purchase empties the warehouse', async () => { + const product = (await c.goods()).id; + const sup = (await c.supplier()).id; + await c.purchase(sup, [{ productId: product, quantity: '10', unitPrice: '20' }]); + const cheap = await c.purchase(sup, [{ productId: product, quantity: '10', unitPrice: '10' }]); // 20 units, 300.00 + await sell((await c.customer()).id, product, '10'); // 150.00 out; 10 left worth 150.00 + const res = await c.api.post(`/api/purchase-invoices/${cheap.id}/cancel`, { reason: 'فاتورة مكررة' }); + expect(res.json().status).toBe('CANCELLED'); + expect(await balance(product)).toEqual({ quantity: '0.0000', value: '0.00' }); + const residual = (await c.api.get('/api/journal-entries?referenceType=INVENTORY_RESIDUAL')).json().data; + expect(residual[0].totalDebit).toBe('50.00'); + await reconciled(); + }); +}); + +describe('transfers', () => { + it('moves stock between warehouses at average cost without a journal entry', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '10', '12'); + const entriesBefore = (await c.api.get('/api/journal-entries')).json().total; + const res = await c.api.post('/api/stock-transfers', { fromWarehouseId: main, toWarehouseId: second, date: c.date, lines: [{ productId: product, quantity: '4' }] }); + expect(res.statusCode).toBe(201); + expect(res.json()).toMatchObject({ totalCost: '48.00', fromWarehouseId: main, toWarehouseId: second }); + expect(res.json().number).toMatch(/^TRF-\d{6}$/); + expect(await balance(product, main)).toEqual({ quantity: '6.0000', value: '72.00' }); + expect(await balance(product, second)).toEqual({ quantity: '4.0000', value: '48.00' }); + expect((await c.api.get('/api/journal-entries')).json().total).toBe(entriesBefore); + await reconciled(); + + expect((await c.api.post('/api/stock-transfers', { fromWarehouseId: second, toWarehouseId: main, date: c.date, lines: [{ productId: product, quantity: '5' }] })).json().error.code).toBe('INSUFFICIENT_STOCK'); + expect((await c.api.post('/api/stock-transfers', { fromWarehouseId: main, toWarehouseId: main, date: c.date, lines: [{ productId: product, quantity: '1' }] })).statusCode).toBe(400); + }); + + it('sells from the warehouse chosen on the invoice', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '5', '10', second); + const res = await c.api.post('/api/invoices', { partyId: (await c.customer()).id, docDate: c.date, warehouseId: second, lines: [{ productId: product, quantity: '2', unitPrice: '50' }] }); + const inv = (await c.api.post(`/api/invoices/${res.json().id}/post`)).json(); + expect(inv.status).toBe('ISSUED'); + expect(await balance(product, second)).toEqual({ quantity: '3.0000', value: '30.00' }); + }); +}); + +describe('stock counts and adjustments', () => { + it('adjusts to the counted quantity at average cost', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '10', '8'); + const res = await c.api.post('/api/stock-adjustments', { warehouseId: main, date: c.date, reason: 'جرد نهاية الشهر', lines: [{ productId: product, countedQuantity: '7' }] }); + expect(res.statusCode).toBe(201); + expect(res.json().lines[0]).toMatchObject({ direction: 'OUT', quantity: '3.0000', countedQuantity: '7.0000', systemQuantity: '10.0000', totalCost: '24.00' }); + expect(await entryLines(res.json().journalEntryId)).toEqual([['5200', '24.00', '0.00'], ['1400', '0.00', '24.00']]); + const same = await c.api.post('/api/stock-adjustments', { warehouseId: main, date: c.date, reason: 'جرد ثان', lines: [{ productId: product, countedQuantity: '7' }] }); + expect(same.json().error.code).toBe('NOTHING_TO_ADJUST'); + await reconciled(); + }); + + it('validates adjustments', async () => { + const product = (await c.goods()).id; + expect((await c.api.post('/api/stock-adjustments', { warehouseId: main, date: c.date, reason: 'بلا تكلفة', lines: [{ productId: product, direction: 'IN', quantity: '1' }] })).json().error.code).toBe('UNIT_COST_REQUIRED'); + expect((await c.api.post('/api/stock-adjustments', { warehouseId: main, date: c.date, reason: 'نقص', lines: [{ productId: product, direction: 'OUT', quantity: '1' }] })).json().error.code).toBe('INSUFFICIENT_STOCK'); + expect((await adjustIn(product, '1', '5', main, ch.byKey.get('INVENTORY'))).json().error.code).toBe('INVALID_OFFSET_ACCOUNT'); + const service = (await c.product()).id; + expect((await adjustIn(service, '1', '5')).json().error.code).toBe('NOT_STOCKED'); + }); +}); + +describe('product rules', () => { + it('locks type and tracking, and deletion, once a product has stock history', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '1', '5'); + expect((await c.api.patch(`/api/products/${product}`, { productType: 'SERVICE' })).json().error.code).toBe('PRODUCT_HAS_STOCK_HISTORY'); + expect((await c.api.patch(`/api/products/${product}`, { trackInventory: false })).json().error.code).toBe('PRODUCT_HAS_STOCK_HISTORY'); + expect((await c.api.del(`/api/products/${product}`)).json().error.code).toBe('PRODUCT_IN_USE'); + const listed = (await c.api.get(`/api/products?search=${encodeURIComponent((await c.api.get(`/api/products/${product}`)).json().sku)}`)).json().data[0]; + expect(listed.onHand).toBe('1.0000'); + }); +}); + +describe('integrity, permissions and isolation', () => { + it('keeps movements append-only and balances non-negative in the database', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '2', '5'); + const ctx = { tenantId: owner.tenantId, userId: owner.userId }; + await expect(withTx(t.pool, ctx, (db) => db.query(`UPDATE stock_movements SET quantity = 99 WHERE product_id = $1`, [product]))).rejects.toThrow(/permission denied|append-only/); + await expect(withTx(t.pool, ctx, (db) => db.query(`DELETE FROM stock_movements WHERE product_id = $1`, [product]))).rejects.toThrow(/permission denied|append-only/); + await expect(withTx(t.pool, ctx, (db) => db.query(`UPDATE inventory_balances SET quantity = -1 WHERE product_id = $1`, [product]))).rejects.toThrow(/check constraint/); + await expect(withTx(t.pool, ctx, (db) => db.query(`UPDATE inventory_balances SET quantity = 0 WHERE product_id = $1`, [product]))).rejects.toThrow(/empty_ck/); + }); + + it('applies inventory permissions', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '5', '5'); + const emp = await addMember(t.app, owner, 'WAREHOUSE_EMPLOYEE'); + const eApi = client(t.app, emp.token); + expect((await eApi.post('/api/stock-transfers', { fromWarehouseId: main, toWarehouseId: second, date: c.date, lines: [{ productId: product, quantity: '1' }] })).statusCode).toBe(201); + expect((await eApi.post('/api/stock-adjustments', { warehouseId: main, date: c.date, reason: 'تجربة', lines: [{ productId: product, countedQuantity: '1' }] })).statusCode).toBe(403); + const sales = await addMember(t.app, owner, 'SALES_EMPLOYEE'); + expect((await client(t.app, sales.token).get('/api/inventory/balances')).statusCode).toBe(403); + }); + + it('isolates stock between tenants', async () => { + const product = (await c.goods()).id; + await adjustIn(product, '5', '5'); + const other = await register(t.app); + const oc = await commerce(t.app, other); + expect((await oc.api.get('/api/inventory/balances')).json().data).toEqual([]); + expect((await oc.api.get(`/api/inventory/movements?productId=${product}`)).json().total).toBe(0); + const res = await oc.api.post('/api/stock-transfers', { fromWarehouseId: main, toWarehouseId: second, date: oc.date, lines: [{ productId: product, quantity: '1' }] }); + expect(res.statusCode).toBe(400); + }); + + it('ends with stock value equal to the ledger and a balanced trial balance', async () => { + const v = await reconciled(); + expect(v.reconciled).toBe(true); + const [year] = await fiscalYears(t.app, owner.token); + expect((await c.api.get(`/api/reports/trial-balance?dateFrom=${year!.startDate}&dateTo=${year!.endDate}`)).json().balanced).toBe(true); + }); +}); diff --git a/alshuyukh-accounting/apps/api/test/payments.test.ts b/alshuyukh-accounting/apps/api/test/payments.test.ts index 7ffc70911613..534b4f74d79f 100644 --- a/alshuyukh-accounting/apps/api/test/payments.test.ts +++ b/alshuyukh-accounting/apps/api/test/payments.test.ts @@ -132,7 +132,7 @@ describe('customer receipts', () => { describe('supplier payments', () => { it('pays a purchase invoice: Dr AP / Cr Bank', async () => { const sup = await c.supplier(); - const bill = await c.purchase(sup.id, [{ productId: (await c.product({ purchasePrice: '400' })).id, quantity: '1' }]); // 460 + const bill = await c.purchase(sup.id, [{ productId: (await c.goods({ purchasePrice: '400' })).id, quantity: '1' }]); // 460 const res = await c.api.post('/api/payments', { direction: 'DISBURSEMENT', supplierId: sup.id, paymentDate: c.date, methodId: await c.method('BANK'), amount: '460.00', allocations: [{ documentType: 'PURCHASE_INVOICE', documentId: bill.id, amount: '460.00' }], diff --git a/alshuyukh-accounting/apps/api/test/purchases.test.ts b/alshuyukh-accounting/apps/api/test/purchases.test.ts index f7602afcdeff..074e1eb2d680 100644 --- a/alshuyukh-accounting/apps/api/test/purchases.test.ts +++ b/alshuyukh-accounting/apps/api/test/purchases.test.ts @@ -16,7 +16,7 @@ afterAll(async () => { await t.close(); }); describe('purchase invoices', () => { it('posts goods to inventory: Dr Inventory + Dr VAT input / Cr AP', async () => { const sup = await c.supplier({ vatNumber: '310000000000003' }); - const prod = await c.product({ purchasePrice: '60' }); + const prod = await c.goods({ purchasePrice: '60' }); const bill = await c.purchase(sup.id, [{ productId: prod.id, quantity: '10' }], { supplierInvoiceNumber: 'S-9001' }); expect(bill).toMatchObject({ status: 'POSTED', taxableAmount: '600.00', taxAmount: '90.00', total: '690.00', supplierInvoiceNumber: 'S-9001' }); expect(bill.number).toMatch(/^PINV-\d{6}$/); @@ -30,7 +30,7 @@ describe('purchase invoices', () => { it('records the supplier invoice number once per supplier', async () => { const sup = await c.supplier(); - const prod = await c.product(); + const prod = await c.goods(); await c.purchase(sup.id, [{ productId: prod.id, quantity: '1' }], { supplierInvoiceNumber: 'DUP-1' }); const dup = await c.api.post('/api/purchase-invoices', { partyId: sup.id, docDate: c.date, supplierInvoiceNumber: 'DUP-1', lines: [{ productId: prod.id, quantity: '1' }] }); expect(dup.statusCode).toBe(409); @@ -39,7 +39,7 @@ describe('purchase invoices', () => { it('posts expense lines to their account and requires one for untracked services', async () => { const sup = await c.supplier(); const ch = await chart(t.app, owner.token); - const service = await c.product({ productType: 'SERVICE', purchasePrice: '1000' }); + const service = await c.product({ purchasePrice: '1000' }); const draft = (await c.api.post('/api/purchase-invoices', { partyId: sup.id, docDate: c.date, lines: [{ productId: service.id, quantity: '1' }] })).json(); expect((await c.api.post(`/api/purchase-invoices/${draft.id}/post`)).json().error.code).toBe('ACCOUNT_REQUIRED'); @@ -57,7 +57,7 @@ describe('purchase invoices', () => { it('returns goods to the supplier: Dr AP / Cr Inventory + Cr VAT input', async () => { const sup = await c.supplier(); - const bill = await c.purchase(sup.id, [{ productId: (await c.product()).id, quantity: '4', unitPrice: '50' }]); // 230 + const bill = await c.purchase(sup.id, [{ productId: (await c.goods()).id, quantity: '4', unitPrice: '50' }]); // 230 const r = (await c.api.post('/api/purchase-returns', { originalInvoiceId: bill.id, docDate: c.date, reason: 'معيب', lines: [{ sourceItemId: bill.lines[0].id, quantity: '1' }] })).json(); const ret = (await c.api.post(`/api/purchase-returns/${r.id}/post`)).json(); expect(ret.number).toMatch(/^DN-\d{6}$/); @@ -70,7 +70,7 @@ describe('purchase invoices', () => { it('cancels an unpaid purchase invoice', async () => { const sup = await c.supplier(); - const bill = await c.purchase(sup.id, [{ productId: (await c.product()).id, quantity: '1' }]); + const bill = await c.purchase(sup.id, [{ productId: (await c.goods()).id, quantity: '1' }]); expect((await c.api.post(`/api/purchase-invoices/${bill.id}/cancel`, { reason: 'مكرر' })).json().status).toBe('CANCELLED'); expect(await balanceOf(c.api, 'suppliers', sup.id)).toBe('0.00'); }); @@ -79,7 +79,7 @@ describe('purchase invoices', () => { describe('purchase orders', () => { it('approves an order and converts it to a draft bill', async () => { const sup = await c.supplier(); - const po = (await c.api.post('/api/purchase-orders', { partyId: sup.id, docDate: c.date, lines: [{ productId: (await c.product()).id, quantity: '12' }] })).json(); + const po = (await c.api.post('/api/purchase-orders', { partyId: sup.id, docDate: c.date, lines: [{ productId: (await c.goods()).id, quantity: '12' }] })).json(); expect(po.number).toMatch(/^PO-\d{6}$/); expect((await c.api.post(`/api/purchase-orders/${po.id}/convert`, {})).statusCode).toBe(409); expect((await c.api.post(`/api/purchase-orders/${po.id}/status`, { status: 'APPROVED' })).json().status).toBe('APPROVED'); @@ -92,7 +92,7 @@ describe('purchase orders', () => { describe('purchase permissions', () => { it('lets purchase managers post bills and sales staff see nothing', async () => { const sup = await c.supplier(); - const prod = await c.product(); + const prod = await c.goods(); const pm = await addMember(t.app, owner, 'PURCHASE_MANAGER'); const pApi = client(t.app, pm.token); const draft = await pApi.post('/api/purchase-invoices', { partyId: sup.id, docDate: c.date, lines: [{ productId: prod.id, quantity: '1' }] }); diff --git a/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx index 5b71111e73bf..787dee6a47b3 100644 --- a/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx +++ b/alshuyukh-accounting/apps/web/src/pages/documents/DocumentForm.tsx @@ -6,6 +6,7 @@ import { ErrorBox, useLoad } from '../../ui'; import type { Account } from '../accounting/ChartOfAccounts'; import type { DocConfig, Doc } from './config'; import Totals, { type TotalsData } from './Totals'; +import { loadWarehouses } from '../inventory/shared'; interface Product { id: string; sku: string; nameAr: string; salePrice: string; purchasePrice: string; productType: string; vatCategory: string } interface Party { id: string; code: string; nameAr: string } @@ -31,6 +32,7 @@ export default function DocumentForm({ config, doc, onSaved }: { config: DocConf const parties = useLoad(() => api<{ data: Party[] }>('GET', `/api/${config.party}s?limit=200`)); const products = useLoad(() => api<{ data: Product[] }>('GET', '/api/products?limit=200')); const accounts = useLoad(() => (isPurchase ? api<{ data: Account[] }>('GET', '/api/accounts?postableOnly=true') : Promise.resolve({ data: [] as Account[] }))); + const warehouses = useLoad(loadWarehouses); const [partyId, setPartyId] = useState(doc?.partyId ?? ''); const [docDate, setDocDate] = useState(doc?.date ?? today()); const [includeVat, setIncludeVat] = useState(doc?.pricesIncludeVat ?? false); @@ -78,6 +80,7 @@ export default function DocumentForm({ config, doc, onSaved }: { config: DocConf if (config.key === 'SALES_QUOTE') body.validUntil = opt('validUntil'); if (config.key === 'PURCHASE_ORDER') body.expectedDate = opt('expectedDate'); if (config.key === 'PURCHASE_INVOICE') body.supplierInvoiceNumber = opt('supplierInvoiceNumber'); + if (opt('warehouseId')) body.warehouseId = opt('warehouseId'); setBusy(true); setError(null); try { @@ -109,6 +112,14 @@ export default function DocumentForm({ config, doc, onSaved }: { config: DocConf )} {config.key === 'SALES_QUOTE' && } {config.key === 'PURCHASE_ORDER' && } + {(warehouses.data?.length ?? 0) > 1 && ( + + )} {config.key === 'PURCHASE_INVOICE' && }

diff --git a/alshuyukh-accounting/apps/web/src/pages/inventory/Adjustments.tsx b/alshuyukh-accounting/apps/web/src/pages/inventory/Adjustments.tsx new file mode 100644 index 000000000000..fb53e3ba444d --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/inventory/Adjustments.tsx @@ -0,0 +1,123 @@ +import { useState, type FormEvent } from 'react'; +import { Link } from 'react-router-dom'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import type { Account } from '../accounting/ChartOfAccounts'; +import { loadStockedProducts, loadWarehouses, qty } from './shared'; + +interface Adjustment { id: string; number: string; date: string; warehouseName: string; reason: string; offsetAccountName: string; totalIncrease: string; totalDecrease: string; journalEntryId: string | null } +interface Line { productId: string; counted: string; direction: 'IN' | 'OUT'; quantity: string; unitCost: string } + +const today = () => new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh' }).format(new Date()); +const empty = (): Line => ({ productId: '', counted: '', direction: 'IN', quantity: '', unitCost: '' }); + +export default function Adjustments() { + const { can } = useAuth(); + const list = useLoad(() => api<{ data: Adjustment[] }>('GET', '/api/stock-adjustments')); + const warehouses = useLoad(loadWarehouses); + const products = useLoad(loadStockedProducts); + const accounts = useLoad(() => api<{ data: Account[] }>('GET', '/api/accounts?postableOnly=true')); + const [mode, setMode] = useState<'count' | 'manual' | null>(null); + const [lines, setLines] = useState([empty()]); + const [error, setError] = useState(null); + const update = (i: number, patch: Partial) => setLines((ls) => ls.map((l, j) => (j === i ? { ...l, ...patch } : l))); + + async function submit(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + setError(null); + try { + await api('POST', '/api/stock-adjustments', { + warehouseId: f.get('warehouseId'), date: f.get('date'), reason: f.get('reason'), + ...(f.get('offsetAccountId') ? { offsetAccountId: f.get('offsetAccountId') } : {}), + lines: lines.filter((l) => l.productId).map((l) => mode === 'count' + ? { productId: l.productId, countedQuantity: l.counted.trim() } + : { productId: l.productId, direction: l.direction, quantity: l.quantity.trim(), ...(l.unitCost.trim() ? { unitCost: l.unitCost.trim() } : {}) }), + }); + setMode(null); + setLines([empty()]); + list.reload(); + } catch (err) { setError(err); } + } + + const offsetAccounts = accounts.data?.data.filter((a) => ['EXPENSE', 'COST_OF_GOODS_SOLD', 'EQUITY', 'REVENUE'].includes(a.type)) ?? []; + return ( + <> + {mode && warehouses.data && products.data && accounts.data && ( + +

{mode === 'count' ? 'جرد المخزون' : 'تسوية مخزون'}

+ +
+ + + + +
+ + {mode === 'count' ? <> : <>} + {lines.map((l, i) => ( + + + {mode === 'count' ? ( + <> + + + + ) : ( + <> + + + + + )} + + + ))} +
الصنفالرصيد الحاليالكمية المعدودةالنوعالكميةتكلفة الوحدة (للزيادة)
{qty(products.data?.find((p) => p.id === l.productId)?.onHand)} update(i, { counted: e.target.value })} /> update(i, { quantity: e.target.value })} /> update(i, { unitCost: e.target.value })} />{lines.length > 1 && }
+ +

+ {mode === 'count' ? 'الرصيد الحالي هو مجموع كل المستودعات للعرض فقط؛ الفرق يُحسب في الخادم لرصيد المستودع المختار. ' : ''} + النقص يُقيَّم بمتوسط التكلفة. للرصيد الافتتاحي اختر حساب رأس المال كحساب مقابل. +

+
+ + )} +
+
+ + {can('inventory.adjust') && !mode && ( + <> + + + + )} +
+ + + + + {list.data?.data.map((a) => ( + + + + + + + ))} + {list.data?.data.length === 0 && } + +
الرقمالتاريخالمستودعالسببزيادةنقص
{a.number}{a.date}{a.warehouseName}{a.reason}{a.totalIncrease === '0.00' ? '' : formatAmount(a.totalIncrease)}{a.totalDecrease === '0.00' ? '' : formatAmount(a.totalDecrease)}{a.journalEntryId && القيد}
لا توجد تسويات
+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/inventory/Balances.tsx b/alshuyukh-accounting/apps/web/src/pages/inventory/Balances.tsx new file mode 100644 index 000000000000..bc4f5992abb4 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/inventory/Balances.tsx @@ -0,0 +1,41 @@ +import { useState } from 'react'; +import { api } from '../../api'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { loadWarehouses, qty } from './shared'; + +interface Row { productId: string; sku: string; productName: string; unitCode: string; warehouseName: string; quantity: string; value: string; averageCost: string } + +export default function Balances() { + const [warehouseId, setWarehouseId] = useState(''); + const warehouses = useLoad(loadWarehouses); + const rows = useLoad(() => api<{ data: Row[] }>('GET', `/api/inventory/balances${warehouseId ? `?warehouseId=${warehouseId}` : ''}`), [warehouseId]); + return ( +
+
+ +
+ +
+ + + + {!rows.data && !rows.error && } + {rows.data?.data.map((r) => ( + + + + + + + ))} + {rows.data?.data.length === 0 && } + +
الرمزالصنفالمستودعالكميةمتوسط التكلفةالقيمة
جارٍ التحميل…
{r.sku}{r.productName}{r.warehouseName}{qty(r.quantity)} {r.unitCode}{formatAmount(Number(r.averageCost).toFixed(2))}{formatAmount(r.value)}
لا يوجد مخزون
+
+
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/inventory/StockCard.tsx b/alshuyukh-accounting/apps/web/src/pages/inventory/StockCard.tsx new file mode 100644 index 000000000000..89a92f12322a --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/inventory/StockCard.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react'; +import { api } from '../../api'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { MOVEMENT_AR, loadStockedProducts, loadWarehouses, qty } from './shared'; + +interface Movement { + id: string; date: string; type: string; direction: string; warehouseName: string; quantity: string; unitCost: string; + totalCost: string; balanceQuantity: string; balanceValue: string; referenceType: string; +} + +export default function StockCard() { + const products = useLoad(loadStockedProducts); + const warehouses = useLoad(loadWarehouses); + const [productId, setProductId] = useState(''); + const [warehouseId, setWarehouseId] = useState(''); + const moves = useLoad(() => (productId + ? api<{ data: Movement[] }>('GET', `/api/inventory/movements?productId=${productId}${warehouseId ? `&warehouseId=${warehouseId}` : ''}&limit=500`) + : Promise.resolve({ data: [] as Movement[] })), [productId, warehouseId]); + return ( +
+
+ + +
+ + {productId && ( +
+ + + + {moves.data?.data.map((m) => ( + + + + + + + + + + ))} + {moves.data?.data.length === 0 && } + +
التاريخالحركةالمستودعواردصادرتكلفة الوحدةالقيمةالرصيدقيمة الرصيد
{m.date}{MOVEMENT_AR[m.type] ?? m.type}{m.warehouseName}{m.direction === 'IN' ? qty(m.quantity) : ''}{m.direction === 'OUT' ? qty(m.quantity) : ''}{Number(m.unitCost).toFixed(4)}{formatAmount(m.totalCost)}{qty(m.balanceQuantity)}{formatAmount(m.balanceValue)}
لا توجد حركات
+
+ )} +

الأحدث أولًا. الرصيد بعد كل حركة في مستودعها.

+
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/inventory/Transfers.tsx b/alshuyukh-accounting/apps/web/src/pages/inventory/Transfers.tsx new file mode 100644 index 000000000000..d1128d645937 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/inventory/Transfers.tsx @@ -0,0 +1,80 @@ +import { useState, type FormEvent } from 'react'; +import { api } from '../../api'; +import { useAuth } from '../../auth'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { loadStockedProducts, loadWarehouses } from './shared'; + +interface Transfer { id: string; number: string; date: string; fromWarehouseName: string; toWarehouseName: string; totalCost: string; notes: string | null } +interface Line { productId: string; quantity: string } + +const today = () => new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Riyadh' }).format(new Date()); + +export default function Transfers() { + const { can } = useAuth(); + const list = useLoad(() => api<{ data: Transfer[] }>('GET', '/api/stock-transfers')); + const warehouses = useLoad(loadWarehouses); + const products = useLoad(loadStockedProducts); + const [creating, setCreating] = useState(false); + const [lines, setLines] = useState([{ productId: '', quantity: '' }]); + const [error, setError] = useState(null); + + async function submit(e: FormEvent) { + e.preventDefault(); + const f = new FormData(e.currentTarget); + setError(null); + try { + await api('POST', '/api/stock-transfers', { + fromWarehouseId: f.get('from'), toWarehouseId: f.get('to'), date: f.get('date'), notes: f.get('notes') || null, + lines: lines.filter((l) => l.productId && l.quantity.trim()).map((l) => ({ productId: l.productId, quantity: l.quantity.trim() })), + }); + setCreating(false); + setLines([{ productId: '', quantity: '' }]); + list.reload(); + } catch (err) { setError(err); } + } + + return ( + <> + {creating && warehouses.data && products.data && ( +
+

تحويل مخزون بين المستودعات

+ +
+ + + +
+ + + {lines.map((l, i) => ( + + + + + + ))} +
الصنفالكمية
setLines((ls) => ls.map((x, j) => (j === i ? { ...x, quantity: e.target.value } : x)))} />{lines.length > 1 && }
+ + +

ينتقل المخزون بمتوسط تكلفته في المستودع المصدر. لا يُنشأ قيد لأن القيمة تبقى في حساب المخزون.

+
+ + )} +
+
{can('inventory.transfer') && !creating && }
+ + + + + {list.data?.data.map((t) => )} + {list.data?.data.length === 0 && } + +
الرقمالتاريخمنإلىالتكلفة
{t.number}{t.date}{t.fromWarehouseName}{t.toWarehouseName}{formatAmount(t.totalCost)}
لا توجد تحويلات
+
+ + ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/inventory/Valuation.tsx b/alshuyukh-accounting/apps/web/src/pages/inventory/Valuation.tsx new file mode 100644 index 000000000000..815b713b3e30 --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/inventory/Valuation.tsx @@ -0,0 +1,32 @@ +import { api } from '../../api'; +import { formatAmount } from '../../money'; +import { ErrorBox, useLoad } from '../../ui'; +import { qty } from './shared'; + +interface Result { data: { productId: string; sku: string; productName: string; quantity: string; value: string }[]; stockValue: string; ledgerBalance: string; difference: string; reconciled: boolean } + +export default function Valuation() { + const v = useLoad(() => api('GET', '/api/inventory/valuation')); + const d = v.data; + return ( +
+ + {d && ( + <> +
+
قيمة المخزون
{formatAmount(d.stockValue)}
+
رصيد حساب المخزون في الدفتر
{formatAmount(d.ledgerBalance)}
+
المطابقة
{d.reconciled ? مطابق : فرق {formatAmount(d.difference)}}
+
+ + + {d.data.map((r) => ( + + ))} +
الرمزالصنفالكميةالقيمة
{r.sku}{r.productName}{qty(r.quantity)}{formatAmount(r.value)}
+ + )} +

التقييم بطريقة المتوسط المرجح لكل مستودع.

+
+ ); +} diff --git a/alshuyukh-accounting/apps/web/src/pages/inventory/shared.ts b/alshuyukh-accounting/apps/web/src/pages/inventory/shared.ts new file mode 100644 index 000000000000..1f0d1e5d149b --- /dev/null +++ b/alshuyukh-accounting/apps/web/src/pages/inventory/shared.ts @@ -0,0 +1,28 @@ +import { api } from '../../api'; + +export interface Warehouse { id: string; code: string; name: string; isActive: boolean } +export interface StockProduct { id: string; sku: string; nameAr: string; trackInventory: boolean; onHand: string } + +/** + * Active warehouses of the (first) company, main warehouse first so it is + * the default choice everywhere (the server also defaults to it). + */ +export async function loadWarehouses(): Promise { + const companies = await api<{ data: { id: string }[] }>('GET', '/api/companies'); + const company = companies.data[0]; + if (!company) return []; + const list = (await api<{ data: Warehouse[] }>('GET', `/api/companies/${company.id}/warehouses`)).data.filter((w) => w.isActive); + return [...list.filter((w) => w.code === 'MAIN'), ...list.filter((w) => w.code !== 'MAIN')]; +} + +export async function loadStockedProducts(): Promise { + return (await api<{ data: StockProduct[] }>('GET', '/api/products?limit=200&productType=GOODS')).data.filter((p) => p.trackInventory); +} + +export const qty = (v: string | null | undefined) => (v ? v.replace(/\.?0+$/, '') || '0' : ''); + +export const MOVEMENT_AR: Record = { + PURCHASE: 'شراء', SALE: 'بيع', SALE_RETURN: 'مرتجع مبيعات', PURCHASE_RETURN: 'مرتجع مشتريات', + TRANSFER_IN: 'تحويل وارد', TRANSFER_OUT: 'تحويل صادر', ADJUSTMENT_IN: 'تسوية بالزيادة', ADJUSTMENT_OUT: 'تسوية بالنقص', + CANCELLATION_IN: 'إلغاء (وارد)', CANCELLATION_OUT: 'إلغاء (صادر)', +}; diff --git a/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx b/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx index 4337fcbc05ea..a578620f534a 100644 --- a/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx +++ b/alshuyukh-accounting/apps/web/src/pages/products/Products.tsx @@ -2,11 +2,16 @@ import { useState, type FormEvent } from 'react'; import { api } from '../../api'; import { useAuth } from '../../auth'; import { ErrorBox, PageHeader, useLoad } from '../../ui'; +import Adjustments from '../inventory/Adjustments'; +import Balances from '../inventory/Balances'; +import StockCard from '../inventory/StockCard'; +import Transfers from '../inventory/Transfers'; +import Valuation from '../inventory/Valuation'; interface Product { id: string; sku: string; barcode: string | null; nameAr: string; nameEn: string | null; productType: string; categoryId: string | null; categoryName: string | null; unitId: string; unitName: string; salePrice: string; - salePriceIncludesVat: boolean; purchasePrice: string; vatCategory: string; trackInventory: boolean; isActive: boolean; + salePriceIncludesVat: boolean; purchasePrice: string; vatCategory: string; trackInventory: boolean; isActive: boolean; onHand: string; } interface Unit { id: string; code: string; nameAr: string; isActive: boolean } interface Category { id: string; parentId: string | null; nameAr: string; isActive: boolean } @@ -16,18 +21,35 @@ const blank = (v: FormDataEntryValue | null) => (v === null || String(v).trim() /** Shows a 4-decimal unit price without trailing zeros beyond 2 places. */ const price = (v: string) => v.replace(/(\.\d\d)00$/, '$1').replace(/(\.\d\d\d)0$/, '$1'); +type Tab = 'products' | 'balances' | 'card' | 'transfers' | 'adjustments' | 'valuation' | 'setup'; + export default function Products() { const { can } = useAuth(); - const [tab, setTab] = useState<'products' | 'setup'>('products'); + const [tab, setTab] = useState('products'); + const tabs: [Tab, string, boolean][] = [ + ['products', 'المنتجات والخدمات', can('product.view')], + ['balances', 'الأرصدة', can('inventory.view')], + ['card', 'حركة الصنف', can('inventory.view')], + ['transfers', 'التحويلات', can('inventory.view')], + ['adjustments', 'التسويات والجرد', can('inventory.view')], + ['valuation', 'تقييم المخزون', can('inventory.view')], + ['setup', 'الوحدات والتصنيفات', can('product.manage')], + ]; return ( <> - {tab === 'products' ? : } -

حركات المخزون والأرصدة والتكلفة تُضاف في المرحلة 5.

+ {tab === 'products' && } + {tab === 'balances' && } + {tab === 'card' && } + {tab === 'transfers' && } + {tab === 'adjustments' && } + {tab === 'valuation' && } + {tab === 'setup' && } ); } @@ -114,7 +136,7 @@ function ProductList() {
- + {products.data?.data.map((p) => ( @@ -125,10 +147,11 @@ function ProductList() { + ))} {!products.data && !products.error && } - {products.data?.data.length === 0 && } + {products.data?.data.length === 0 && }
الرمزالاسمالنوعالتصنيفالوحدةسعر البيعسعر الشراء
الرمزالاسمالنوعالتصنيفالوحدةسعر البيعسعر الشراءالكمية المتاحة
{p.unitName} {price(p.salePrice)}{p.salePriceIncludesVat && شامل} {price(p.purchasePrice)}{p.trackInventory ? p.onHand.replace(/\.?0+$/, '') || '0' : '—'}
جارٍ التحميل…
لا توجد منتجات
لا توجد منتجات
diff --git a/alshuyukh-accounting/docs/screenshots/p5-01-sale-journal.png b/alshuyukh-accounting/docs/screenshots/p5-01-sale-journal.png new file mode 100644 index 0000000000000000000000000000000000000000..59f1d80dfdc062b69e9adaf2637171e03b083509 GIT binary patch literal 77795 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 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p5-02-adjustments.png b/alshuyukh-accounting/docs/screenshots/p5-02-adjustments.png new file mode 100644 index 0000000000000000000000000000000000000000..24459c7e1f320cd649530f39a4e3d5f63bd1aeca GIT binary patch literal 62536 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≺gWwe$AH7?GqB-btUI&ALa{gwJF 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 Cor>)M literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p5-03-balances.png b/alshuyukh-accounting/docs/screenshots/p5-03-balances.png new file mode 100644 index 0000000000000000000000000000000000000000..eeacbea558e401a3a3e38c577e0c2fee544e1706 GIT binary patch literal 59162 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p5-04-stock-card.png b/alshuyukh-accounting/docs/screenshots/p5-04-stock-card.png new file mode 100644 index 0000000000000000000000000000000000000000..79f4cbf40f20af6017a1f360074910acd92b6baf GIT binary patch literal 83917 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 literal 0 HcmV?d00001 diff --git a/alshuyukh-accounting/docs/screenshots/p5-05-valuation.png b/alshuyukh-accounting/docs/screenshots/p5-05-valuation.png new file mode 100644 index 0000000000000000000000000000000000000000..0b42714e8d8549635483998c0f8577e67b6daf87 GIT binary patch literal 57926 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