Let cheques be received or paid without an invoice, and remind staff three days before due date.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-11 11:34:49 +03:30
co-authored by Cursor
parent 9a991fc1f1
commit 9beaed96e8
18 changed files with 982 additions and 61 deletions
@@ -0,0 +1,38 @@
# چک خروجی و یادآوری سررسید — برنامه پیاده‌سازی
> اجرا در همین نشست؛ کامیت فقط اگر کاربر بخواهد.
**Goal:** دفتر چک دریافتی/پرداختی + یادآوری یک‌بار سه روز قبل از سررسید.
**Architecture:** فیلد `direction` و `reminderNotifiedAt` روی `Cheque`. زمان‌بند `@nestjs/schedule` ساعت ۸ تهران. متن و تشخیص روز در `cheque-reminder.util.ts`.
**Tech Stack:** Prisma, NestJS, Vue 3, `@nestjs/schedule`, SMS موجود، اعلان موجود.
## Global Constraints
- npm workspaces؛ Prisma فقط از `apps/api`
- متن پیامک با `یادآوری منتکت:` و حداکثر ۱۶۰ نویسه
- پرداختی به فاکتور وصل نمی‌شود؛ چک فاکتور همیشه `in`
- بدون سند حسابداری
## Files
- `apps/api/prisma/schema.prisma` + migration `20260911120000_cheque_direction_reminder`
- `packages/shared/src/index.ts`
- `apps/api/src/finance/cheque-reminder.util.ts`
- `apps/api/src/finance/__tests__/cheque-reminder.check.ts`
- `apps/api/src/finance/cheque-reminders.service.ts`
- `apps/api/src/finance/{cheques.service,dto,finance.controller,finance.module}.ts`
- `apps/api/src/invoices/invoices.service.ts`
- `apps/api/src/app.module.ts`
- `apps/api/package.json` (`@nestjs/schedule`)
- `apps/web/src/views/ChequesView.vue`
## Tasks
1. util + unit check (روز تهران، متن پیامک)
2. schema/migration + shared types
3. API create/list direction؛ فاکتور `direction: in`
4. ChequeRemindersService + cron
5. UI تب و مودال پرداخت
6. `npm run build -w @mento/shared`، migrate، generate، unit check
@@ -0,0 +1,54 @@
# چک خروجی و یادآوری سررسید
تاریخ: ۱۴۰۵/۶/۲۰
وضعیت: تأییدشده برای پیاده‌سازی
## هدف
دفتر چک هم دریافتی و هم پرداختی باشد. سه روز قبل از سررسید، یک‌بار به افراد توافق‌شده اطلاع داده شود.
## صفحه
مسیر همان `/cheques` است؛ لینک سایدبار عوض نمی‌شود.
دو تب: **دریافتی** و **پرداختی**. دو دکمه: **دریافت چک** و **پرداخت چک**. هر کدام مودال جدا با فیلدهای شخص، مبلغ، ارز (اگر بیش از یکی فعال باشد)، شماره، بانک، سررسید، وضعیت، یادداشت. در پرداختی شخص یعنی گیرنده.
ستون‌های جدول مثل الان. وضعیت:
- دریافتی: در جریان / وصول شد / برگشت
- پرداختی: در جریان / پرداخت شد / برگشت
چک وصل به فاکتور فقط در تب دریافتی دیده می‌شود. پرداختی به فاکتور وصل نمی‌شود.
## داده
همان مدل `Cheque` با:
- `direction`: `in` | `out` (چک فاکتور همیشه `in`)
- `reminderNotifiedAt`: تا هر چک فقط یک‌بار یادآوری شود
`POST /cheques` جهت را می‌گیرد. `GET /cheques?direction=in|out` فیلتر می‌کند. `PATCH` وضعیت مثل قبل.
## یادآوری
زمان‌بند روزانه حدود ساعت ۸ به وقت تهران. فقط چک‌های `pending` که روز سررسیدشان دقیقاً ۳ روز بعد است (تقویم تهران).
گیرندگان داخلی: همهٔ کاربران `owner`/`admin` سازمان + ثبت‌کنندهٔ چک (`ownerId`). اگر یک نفر دو نقش دارد، یک‌بار.
کانال:
- همهٔ گیرندگان داخلی: اعلان داخل برنامه (عنوان «سررسید چک»، لینک `/cheques`) + پیامک اگر موبایل داشته باشند
- دریافتی: پیامک به موبایل شخص طرف‌حساب
- پرداختی: به شخص پیامک نمی‌رود
بعد از تلاش برای آن چک، `reminderNotifiedAt` ست می‌شود. خطای یک چک بقیه را متوقف نمی‌کند. اگر پیامک پیکربندی نباشد یا موبایل خالی باشد، همان کانال رد می‌شود؛ اعلان داخل برنامه برای کاربران CRM می‌ماند.
متن‌ها با پیشوند `یادآوری منتکت:` و حداکثر حدود ۱۶۰ نویسه:
- شخص (فقط دریافتی): `یادآوری منتکت: چک شماره {شماره} به مبلغ {مبلغ} سه روز دیگر ({سررسید شمسی}) سررسید می‌شود.`
- داخلی دریافتی: `یادآوری منتکت: چک دریافتی {شماره} از {نام شخص}، مبلغ {مبلغ}، سررسید {تاریخ} (۳ روز دیگر).`
- داخلی پرداختی: `یادآوری منتکت: چک پرداختی {شماره} به {نام شخص}، مبلغ {مبلغ}، سررسید {تاریخ} (۳ روز دیگر).`
## خارج از این نسخه
سند حسابداری برای چک خروجی، وصل پرداختی به فاکتور، یادآوری روز سررسید یا برگشت، تنظیم فاصلهٔ روز از داخل تنظیمات.