# نظام المحاسبة والمخازن

نظام محاسبة ومخازن متكامل باللغة العربية والجنيه المصري لإدارة الموردين والمصانع والمعاملات المالية.

## Run & Operate

- `pnpm --filter @workspace/api-server run dev` — run the API server (port 8080)
- `pnpm --filter @workspace/accounting-system run dev` — run the frontend (port 20889)
- `pnpm run typecheck` — full typecheck across all packages
- `pnpm run build` — typecheck + build all packages
- `pnpm --filter @workspace/api-spec run codegen` — regenerate API hooks and Zod schemas from the OpenAPI spec
- `pnpm --filter @workspace/db run push` — push DB schema changes (dev only)
- Required env: `DATABASE_URL` — Postgres connection string

## Stack

- pnpm workspaces, Node.js 24, TypeScript 5.9
- Frontend: React + Vite, RTL Arabic, Cairo font, Tailwind CSS
- API: Express 5
- DB: PostgreSQL + Drizzle ORM
- Validation: Zod (`zod/v4`), `drizzle-zod`
- API codegen: Orval (from OpenAPI spec)
- Build: esbuild (CJS bundle)
- Currency: Egyptian Pound (EGP) via `Intl.NumberFormat('ar-EG', { currency: 'EGP' })`

## Where things live

- `lib/api-spec/openapi.yaml` — API contract (source of truth)
- `lib/db/src/schema/` — Drizzle schema files (one per entity)
- `artifacts/api-server/src/routes/` — Express route handlers
- `artifacts/accounting-system/src/` — React frontend (Arabic RTL)
- `artifacts/accounting-system/src/lib/utils.ts` — `formatEGP` and `formatArabicDate` helpers

## Architecture decisions

- All frontend text in Arabic, `dir="rtl"` set on `<html>` in `index.html`
- Cairo font loaded from Google Fonts for Arabic typography
- Statement endpoints use query params (not path params) to avoid Orval TS2308 naming collision
- Account balance updated automatically on transaction create/delete
- Supply order total computed from items at create time

## Product

- **لوحة التحكم** — ملخص الأرصدة، الموردين، المصانع، أوامر التوريد، أحدث المعاملات
- **الموردين** — إضافة/تعديل/حذف موردين، كشف حساب كل مورد
- **المصانع** — إدارة المصانع وتفاصيل التوريد لكل مصنع
- **الأصناف** — قاموس المنتجات ووحدات القياس
- **أوامر التوريد** — إنشاء أوامر بعدة بنود مع فلتر بالمورد/المصنع/التاريخ
- **الحسابات** — دليل الحسابات (نقدية، بنك، مورد، عميل، مصروف، إيراد)
- **المعاملات المالية** — أذون قبض وصرف مع تحديث تلقائي للأرصدة
- **الدفعات** — دفعات للموردين والمصانع
- **التقارير** — ملخص الموردين وملخص المصانع

## User preferences

- اللغة: العربية (RTL)
- العملة: الجنيه المصري (ج.م)
- المستخدم طلب PHP/SQL/HTML لكن النظام يعمل بـ React/Node.js (نفس الوظائف)

## Gotchas

- بعد تغيير OpenAPI spec، أعد تشغيل `pnpm --filter @workspace/api-spec run codegen`
- Statement endpoints يستخدمون query params وليس path params لتجنب تضارب أسماء Orval
- بعد تعديل routes، أعد بناء API server عبر إعادة تشغيل workflow

## Pointers

- See the `pnpm-workspace` skill for workspace structure, TypeScript setup, and package details
