Commit Graph
100 Commits
Author SHA1 Message Date
MahdiandCursor 6f42440b3b fix(activities): return to the same group after opening a card
The back link dropped the board from the address, so the desk reopened on the default group.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-29 09:22:23 +03:30
MahdiandCursor 63a1803adc feat(activities): let a group show and limit its members
Empty membership stays open to the whole workspace; picking people restricts who can see that activity group.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-28 20:24:40 +03:30
MahdiandCursor 2cc2d358e4 fix(web): make kanban column titles readable
Widen board columns and keep counts inside the add button so stage and card titles have room.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-28 17:24:58 +03:30
MahdiandCursor 463a1652a6 feat(platform): text admins when an account opens or a subscription ends
Signup and admin-created accounts notify platform managers, and an ended plan sends one SMS instead of repeating for old expirations.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-27 22:27:05 +03:30
MahdiandCursor f15c5b9141 feat(activities): add photos when registering a follow-up comment
A later comment can attach photos with the same compressor, and they stay on the activity note.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-27 21:52:37 +03:30
MahdiandCursor 1d3588a69d feat(activities): attach compressed photos to activity notes
Photos on an activity are shrunk with the form-builder compressor and stored only when they fit under 200KB.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-27 21:30:45 +03:30
MahdiandCursor 9812e4e5ba fix(crm): honor open data scopes and role assignees
Unset sections on a saved role policy were still filtered as own-only, so full lead access showed nothing. Activities can now be assigned by org role, and the Tahesab sales report reads as a result instead of a tag wall.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-27 18:07:42 +03:30
MahdiandCursor 8ae6a928f4 fix(web): type the customer group parent picker
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-26 11:14:30 +03:30
MahdiandCursor 2ff35e55fc feat(tahesab): net sales by factor, group, and commission
Report weight after returns for the selected period, with parent customer groups and separate silver and investment commission.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-26 11:05:34 +03:30
Mahdi 15f89aec04 Readjusting the dashboard header height 2026-10-25 20:53:06 +03:30
Mahdi bebd1be29b Adjusting the lead note and dashboard header height 2026-10-25 20:21:33 +03:30
MahdiandCursor 0daaef0b39 fix(web): calm hero flash, lead detail, and scope sources
Keep the dashboard backdrop out of flow on first paint, clamp long lead notes, scroll the quick-actions rail, return to the lead board, and only list import sources that exist in this environment.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-25 19:22:30 +03:30
MahdiandCursor 91637cb3a6 fix(web): search and multi-select data scope filters
Long group and source lists overflowed the team settings panel.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-25 10:48:15 +03:30
Mahdi 546a7a7e46 fix(web): keep jalali day cells inside calendar panel 2026-10-25 10:05:16 +03:30
Mahdi 48815852fc fix(crm): mesghal by metal, jalali fit, scoped group filters 2026-10-24 22:25:27 +03:30
Mahdi f8128ebe3a fix(tahesab): rename invoice timestamp label to زمان چاپ 2026-10-24 21:54:55 +03:30
MahdiandCursor 6ec7a1a942 fix(tahesab): label invoice timestamp as print date
Rename تاریخ ایجاد to تاریخ چاپ on the asnad invoice preview and PDF.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-24 21:51:32 +03:30
MahdiandCursor 2d690b4c04 feat(tahesab): polish asnad invoice PDF and prior balance
Compute حساب قبل from asnad before this doc date/number, add in-app preview layout, and leave a blank mesghal line for handwriting after print.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-24 21:47:46 +03:30
Mahdi 1ba352f127 fix(tahesab): open invoice PDF window synchronously on click
Awaiting settings before window.open left a blank tab; open about:blank on click then fill via blob URL.
2026-10-24 14:09:46 +03:30
Mahdi f50246dc46 feat(tahesab): PDF invoice export for asnad cards
Add per-document PDF print from account details, plus org invoice settings for logo and texts separate from CRM invoices.
2026-10-24 12:34:02 +03:30
Mahdi 7d9fc8447f fix(reports): show Tahesab sales link only when connection exists
Require both the tahesab org module and at least one enabled accounting connection.
2026-10-24 09:39:45 +03:30
Mahdi 5be0bc6f5e fix(tahesab): register Ant components on sales report page
Without explicit imports the a-button tags rendered as raw custom elements with no styles or click behavior.
2026-10-22 20:35:21 +03:30
Mahdi 2ca2650b69 fix(tahesab): make sales report apply and sync actions fire
Bypass Ant form required validation that blocked the apply button, and surface API errors with toasts.
2026-10-22 20:04:59 +03:30
Mahdi 42b3fc72cc fix(tahesab): type sales report statistic value for vue-tsc 2026-10-22 19:52:11 +03:30
Mahdi 6d8ede8e2a fix(tahesab): polish sales report page chrome
Match leads/invoices header layout, keep title clean, and add a clear apply-filters action for the date range.
2026-10-22 19:47:58 +03:30
Mahdi ade43fea0f feat(tahesab): sales report snapshot with org-module gate
Sync linked asnad into CRM, filter by group/kind/metal, and require the tahesab superadmin module plus reports role access.
2026-10-22 18:20:46 +03:30
Mahdi 65cf4e9a66 feat(auth): allow owner to force OTP-only login per user
Team menu «ورود با کد» blocks password login with a clear message and switches the login screen to OTP.
2026-10-22 15:43:24 +03:30
Mahdi 80fb5bf1bb feat(lead-forms): real file upload under 200KB and Jalali date
Public form file fields compress images or reject oversized files; dates use the full Jalali picker.
2026-10-22 14:28:42 +03:30
Mahdi 31f45a6a31 fix(acl): simplify data access UI to a single filter
Drop multi-rule OR/AND editing; one all-or-filter form per section with clear hints.
2026-10-22 13:13:59 +03:30
Mahdi 73c87b8be4 fix(acl): keep empty draft rules and clarify OR/AND hint
Empty rules were stripped on re-parse so Add rule looked broken; editor now keeps drafts until filled.
2026-10-22 12:18:05 +03:30
Mahdi 09a60b3b5a feat(acl): deep data access by section for roles and users
Role default + user override with OR rules; covers customers, leads, sales, activities, notes, routines, projects, and tickets.
2026-10-22 11:53:26 +03:30
MahdiandCursor cb5944e767 fix(finance): shared treasury layout so tab switches stop jumping
Keep title and nav mounted in TreasuryLayout with stable header height, and finish Ant form chrome (MoneyInput, Jalali) on finance pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-21 21:47:00 +03:30
Mahdi 23ae273232 feat(contacts): compact layout, mobile filter sheet and redesigned cards 2026-10-21 20:01:16 +03:30
Mahdi 1c2da34983 fix: persist and re-apply contact saved filters correctly 2026-10-21 18:46:12 +03:30
Mahdi 50d7cad66e feat: multi-select contacts filter panel for groups sources and mood 2026-10-21 18:07:21 +03:30
Mahdi 29d99cbded feat: customer groups for people and companies with tahesab group sync and bulk register
Multiple groups per contact, legacy group text migrated, excel import/export, contacts filter and column, richer create-in-tahesab, match-first bulk export
2026-10-21 17:16:31 +03:30
Mahdi ce27df20ca feat: compact logout-time cell and optional login block after logout time
Owners set the daily logout time in a modal and can block re-login until the next Tehran day.
2026-10-21 14:20:15 +03:30
Mahdi 7ae6a5837a feat: enforce role section permissions and add a leads permission
Unticking a section hides it from the menu, closes its routes and blocks its writes on the server; existing roles keep their current access via migration.
2026-10-21 13:45:16 +03:30
Mahdi 631a3267d1 fix: accept createIfMissing when converting a lead to a customer 2026-10-20 21:07:39 +03:30
Mahdi b731fe43aa fix: fold the activity board picker and its actions into one dropdown 2026-10-20 17:59:34 +03:30
Mahdi 15cbd62997 test: update promote-from-prior stage service mock for activity boards 2026-10-20 17:36:30 +03:30
Mahdi e6aa4c64f0 feat: group activities into boards with their own stages, like sales pipelines
Existing stages and activities move into a default board per environment; new activities pick a board in the form.
2026-10-20 17:23:27 +03:30
Mahdi 9127fa334b fix: stop birth dates from saving one day early in Tehran time 2026-10-20 15:20:47 +03:30
Mahdi 9a86f63f48 feat: let the Jalali date picker jump to any month or year from its title 2026-10-20 14:47:25 +03:30
Mahdi 29398a445b fix: validate activity, deal and lead assignees by active membership in the current environment 2026-10-20 14:47:08 +03:30
Mahdi bb8fd489de fix: let owners and admins change a user's role from the edit-user modal 2026-10-20 12:50:32 +03:30
Mahdi 86e9ee6c2c fix: treat Tahesab no-records as an empty customer list instead of a 502
Listing all customers no longer fails on the final empty code range, and importing a missing code no longer creates a placeholder person.
2026-10-20 12:26:20 +03:30
Mahdi adb63447ca fix: stop Tahesab imports from stealing links between shared-mobile customers
List all Tahesab customers in one paginated table with a page-size picker instead of 2000-code pages.
2026-10-20 12:00:11 +03:30
Mahdi c1b38e1737 feat: filter Tahesab sync results to customers not yet imported 2026-10-20 11:07:58 +03:30
Mahdi be7ae0a1d8 fix: keep the SMS credit chip pastel green when the balance is healthy 2026-10-20 10:25:38 +03:30
Mahdi bbbedc6059 fix: polish SMS header chip and add deposit info in adm panel
Tighten the wallet chip layout and let super-admins set charge deposit details shown in the header charge modal.
2026-10-19 21:47:17 +03:30
Mahdi f5d68d83fc feat: add per-org SMS wallet with adm panel and header credit
Bill all platform SMS (including OTP), allow negative balance with manual/auto cutoffs, and support own-panel bypass without wallet debit.
2026-10-19 15:55:48 +03:30
Mahdi f15ebb72ea fix: let only the owner set logout time and move the attendance tab 2026-10-19 13:54:09 +03:30
Mahdi 8590579605 feat: log staff sign-in and sign-out and force logout at a set time 2026-10-19 13:34:55 +03:30
Mahdi 3863c5e7d1 fix: hide role permissions for modules disabled in super admin 2026-10-19 12:20:52 +03:30
Mahdi e6f9876177 fix: keep the customers menu visible when the owner views as another user 2026-10-19 11:56:05 +03:30
MahdiandCursor fddf22d7fe fix: open the card menu from the three-dot button
Anchor the activity and deal menus to the button so they show beside the card.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 11:40:25 +03:30
MahdiandCursor ada9a1f21f fix: show activity board columns again
Give the kanban the remaining page height so the columns are no longer collapsed.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 11:18:19 +03:30
MahdiandCursor 2f11105628 fix: keep customer profile tabs from overlapping on mobile
Let the tab row scroll sideways so long labels stay readable.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 09:40:59 +03:30
MahdiandCursor 36eda8653e merge: bring Ant Design UI from dev into main
Keep the design refresh together with DISC, the sales copilot, and treasury behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 21:33:56 +03:30
MahdiandCursor 8fdd5147a5 feat(web): migrate finance treasury pages to Ant Design Vue
Replace legacy Ui* chrome on treasury routes with Ant layout, and polish mobile incomes stats colors plus nav visibility.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 21:06:18 +03:30
MahdiandCursor 002f697dfe feat: add DISC profiles and a sales copilot as an org module
Help reps capture a customer's likely behavior style and get negotiation guidance, with the feature gated from super admin.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 21:04:26 +03:30
MahdiandCursor 96befd3867 feat: add treasury audit, attachment download, and installment SMS
Let cheque clearance pick a cash account and export income, expense, and installment lists to Excel.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 19:59:24 +03:30
MahdiandCursor b25b5b125a fix(web): resolve vue-tsc errors blocking push of Ant migration
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 19:48:16 +03:30
MahdiandCursor 4abab55a6b feat(web): migrate CRM screens to Ant Design Vue with central theme
Adopt ant-design-vue and a shared antdTheme for leads, pipeline, invoices, and shared form controls under strict single-page governance.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 19:39:59 +03:30
MahdiandCursor 8981a552fc feat: gate treasury as an org module and group money inputs
Link optional invoice and cheque settlements to cash accounts, and let superadmin enable the finance module per organization.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 19:33:09 +03:30
MahdiandCursor ab538b8304 feat: add internal finance ledger for accounts, claims, and payroll
Keep booked income and expense separate from cash balances, with installments, recurring items, and reports.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 18:49:49 +03:30
MahdiandCursor 61d17c5cea fix: persist the prior-archive cutoff date when the owner changes it
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 16:31:19 +03:30
MahdiandCursor 23f8da2c65 feat: log outbound SMS and show history in compose modal
Persist manual, campaign, and automation SMS; expose history APIs for people and leads.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 21:23:07 +03:30
MahdiandCursor 9325d879a5 docs: spec unified outbound SMS log in compose modal
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 21:16:08 +03:30
MahdiandCursor d62e004e90 feat: SMS campaigns for people or leads with filters and batching
Add audience tabs, province/city filters, select-all ids, dynamic SMS tokens, and 50-sized create/send chunks.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 20:54:32 +03:30
MahdiandCursor 32c722f42a docs: spec SMS campaign people/leads tabs and batch send
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 20:47:48 +03:30
MahdiandCursor f7b07f6b7a feat: owner read-only view-as from team users table
Allow org owners to inspect any member's data scope via dual JWT; server blocks mutations and team page stays reachable for return.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 19:57:26 +03:30
MahdiandCursor 52c7306e78 fix(web): shorten prior-switch label to اطلاعات قبل
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 19:19:31 +03:30
MahdiandCursor 960e01938d fix(web): apply prior lens on user ProfileView timeline
Filter my-desk activities and deals by archive cutoff so current work stays clean.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 19:12:48 +03:30
MahdiandCursor 3fb5f32ac3 fix: align activity badge and person profile with prior lens
Count nav badge for desk=mine, always apply activity prior filter on person records, and stop loading prior=all deals on profiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 18:56:44 +03:30
MahdiandCursor 0ce2533066 fix(api): load multer types for avatar upload typecheck
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 18:08:31 +03:30
MahdiandCursor bc68582fe2 Fix prior archive filter collisions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 17:49:51 +03:30
MahdiandCursor e86841fc60 feat(web): add prior archive promote actions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 17:28:57 +03:30
MahdiandCursor 5069647f79 Add prior archive team settings UI
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 17:20:28 +03:30
MahdiandCursor 008733d338 Add prior promotion endpoints
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 17:13:01 +03:30
Mahdi c5708ed59b chore: stop tracking local SDD scratch files 2026-10-17 17:03:23 +03:30
MahdiandCursor 65d66bb331 Implement prior archive cutoff API
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 17:01:52 +03:30
MahdiandCursor 79ba146118 Wire prior archive cutoff through API
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 16:52:20 +03:30
MahdiandCursor 02841a5b8c refactor(api): cutoff-based prior-archive where helpers
Replace didar/live-deal filters with createdAt cutoff and promotedFromPriorAt; add unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 16:33:32 +03:30
Mahdi a04743c6df feat: add prior-archive promote fields and shared cutoff DTOs 2026-10-17 16:27:29 +03:30
MahdiandCursor 27635c0752 docs: add prior-archive cutoff plan and ignore worktrees
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 16:07:59 +03:30
MahdiandCursor 03e1c01023 docs: specify date-cutoff prior archive and one-way promote
Replace Didar-source classification with org cutoff date, deals/activities-only filter, and a promote tag that does not mutate record fields.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 15:29:37 +03:30
MahdiandCursor 177e5cc31b fix: keep list menus on screen and clip long activity subtitles
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 13:26:11 +03:30
MahdiandCursor 2c7c943802 feat: allow bulk select and delete on activities and deal list
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 12:47:07 +03:30
MahdiandCursor 9611803567 feat: serve the same CRM on crm.montact.ir as an alias
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 23:24:50 +03:30
MahdiandCursor a494b5308e fix: make the user activity log readable and show Montact
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 14:18:56 +03:30
MahdiandCursor 582733e2ea fix: hide unlinked old activities from current work
Imported follow-ups with no person, company, or deal stayed on the board because only linked prior records were archived.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 13:02:01 +03:30
MahdiandCursor 6bff9d2888 fix: keep imported follow-ups out of current work
They stayed on the board when a non-prior deal was attached, even though the person was prior.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 12:34:40 +03:30
MahdiandCursor 6bc5e1bec7 feat: separate prior records behind an owner switch and count last-period questions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 10:48:30 +03:30
MahdiandCursor 3a8a684aa4 docs: lock the prior-data archive design for a later start
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 20:44:30 +03:30
MahdiandCursor 831c682eb3 feat: show the full work history and load every lead stage on the board
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 19:47:32 +03:30
MahdiandCursor 2cc81bb596 feat: keep deletions restorable and confirm a pipeline's deals before it is removed
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:23:09 +03:30
MahdiandCursor c04582072d fix: drop the unused button import that blocked the type check
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:08:14 +03:30
MahdiandCursor 42f0573a5f feat: send one SMS from a person or lead and keep the dashboard inside the phone frame
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:05:17 +03:30