|
@@ -0,0 +1,132 @@
|
|
|
|
|
+// web-admin/src/utils/mp-crm-quote-card.test.ts
|
|
|
|
|
+import assert from 'node:assert/strict'
|
|
|
|
|
+import { describe, it } from 'node:test'
|
|
|
|
|
+import {
|
|
|
|
|
+ MP_QUOTE_MANAGE_TABS,
|
|
|
|
|
+ MP_QUOTE_APPROVE_TABS,
|
|
|
|
|
+ buildQuoteListQuery,
|
|
|
|
|
+ buildQuoteCard,
|
|
|
|
|
+ formatQuoteMoney,
|
|
|
|
|
+ quoteTypeLabel,
|
|
|
|
|
+ quoteTypeTagType
|
|
|
|
|
+} from './mp-crm-quote-card'
|
|
|
|
|
+
|
|
|
|
|
+describe('tabs', () => {
|
|
|
|
|
+ it('manage has all/submitted/accepted; approve has submitted/accepted', () => {
|
|
|
|
|
+ assert.deepEqual(
|
|
|
|
|
+ MP_QUOTE_MANAGE_TABS.map((x) => x.value),
|
|
|
|
|
+ ['all', 'submitted', 'accepted']
|
|
|
|
|
+ )
|
|
|
|
|
+ assert.deepEqual(
|
|
|
|
|
+ MP_QUOTE_APPROVE_TABS.map((x) => x.value),
|
|
|
|
|
+ ['submitted', 'accepted']
|
|
|
|
|
+ )
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+describe('buildQuoteListQuery', () => {
|
|
|
|
|
+ it('manage all excludes invalid and trims keyword', () => {
|
|
|
|
|
+ assert.deepEqual(
|
|
|
|
|
+ buildQuoteListQuery({
|
|
|
|
|
+ mode: 'manage',
|
|
|
|
|
+ view: 'all',
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 20,
|
|
|
|
|
+ keyword: ' 酸 ',
|
|
|
|
|
+ currentUserId: 'u1'
|
|
|
|
|
+ }),
|
|
|
|
|
+ {
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 20,
|
|
|
|
|
+ keyword: '酸',
|
|
|
|
|
+ excludeStatus: 'invalid'
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('manage submitted sets status only', () => {
|
|
|
|
|
+ const q = buildQuoteListQuery({
|
|
|
|
|
+ mode: 'manage',
|
|
|
|
|
+ view: 'submitted',
|
|
|
|
|
+ pageNum: 2,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ keyword: '',
|
|
|
|
|
+ currentUserId: 'u1'
|
|
|
|
|
+ })
|
|
|
|
|
+ assert.equal(q.status, 'submitted')
|
|
|
|
|
+ assert.equal(q.excludeStatus, undefined)
|
|
|
|
|
+ assert.equal('pendingApprovalUserId' in q, false)
|
|
|
|
|
+ assert.equal('keyword' in q, false)
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('manage accepted sets status accepted', () => {
|
|
|
|
|
+ const q = buildQuoteListQuery({
|
|
|
|
|
+ mode: 'manage',
|
|
|
|
|
+ view: 'accepted',
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 20,
|
|
|
|
|
+ keyword: '',
|
|
|
|
|
+ currentUserId: 'u1'
|
|
|
|
|
+ })
|
|
|
|
|
+ assert.equal(q.status, 'accepted')
|
|
|
|
|
+ assert.equal('approvedByUserId' in q, false)
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('approve submitted uses pendingApprovalUserId', () => {
|
|
|
|
|
+ const q = buildQuoteListQuery({
|
|
|
|
|
+ mode: 'approve',
|
|
|
|
|
+ view: 'submitted',
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 20,
|
|
|
|
|
+ keyword: '',
|
|
|
|
|
+ currentUserId: 'u9'
|
|
|
|
|
+ })
|
|
|
|
|
+ assert.equal(q.status, 'submitted')
|
|
|
|
|
+ assert.equal(q.pendingApprovalUserId, 'u9')
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('approve accepted uses approvedByUserId', () => {
|
|
|
|
|
+ const q = buildQuoteListQuery({
|
|
|
|
|
+ mode: 'approve',
|
|
|
|
|
+ view: 'accepted',
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 20,
|
|
|
|
|
+ keyword: 'x',
|
|
|
|
|
+ currentUserId: 'u9'
|
|
|
|
|
+ })
|
|
|
|
|
+ assert.equal(q.approvedByUserId, 'u9')
|
|
|
|
|
+ assert.equal(q.keyword, 'x')
|
|
|
|
|
+ assert.equal('status' in q && q.status !== undefined, false)
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+describe('buildQuoteCard', () => {
|
|
|
|
|
+ it('maps fields and money', () => {
|
|
|
|
|
+ const card = buildQuoteCard({
|
|
|
|
|
+ id: 'q1',
|
|
|
|
|
+ quoteNo: 'BJ001',
|
|
|
|
|
+ quoteTitle: '硫酸报价',
|
|
|
|
|
+ customerName: '甲公司',
|
|
|
|
|
+ quoteType: 'sales',
|
|
|
|
|
+ finalAmount: 1234.5,
|
|
|
|
|
+ status: 'draft',
|
|
|
|
|
+ quoteDate: '2026-10-01'
|
|
|
|
|
+ })
|
|
|
|
|
+ assert.equal(card.id, 'q1')
|
|
|
|
|
+ assert.equal(card.quoteNo, 'BJ001')
|
|
|
|
|
+ assert.equal(card.quoteTypeLabel, '销售')
|
|
|
|
|
+ assert.equal(card.quoteTypeTagType, 'success')
|
|
|
|
|
+ assert.equal(card.amountText, '¥1,234.50')
|
|
|
|
|
+ assert.equal(card.status, 'draft')
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+describe('quoteType helpers', () => {
|
|
|
|
|
+ it('maps purchase/sales', () => {
|
|
|
|
|
+ assert.equal(quoteTypeLabel('purchase'), '采购')
|
|
|
|
|
+ assert.equal(quoteTypeTagType('purchase'), 'warning')
|
|
|
|
|
+ assert.equal(quoteTypeLabel('sales'), '销售')
|
|
|
|
|
+ assert.equal(formatQuoteMoney(1000), '¥1,000.00')
|
|
|
|
|
+ assert.equal(formatQuoteMoney(undefined), '—')
|
|
|
|
|
+ })
|
|
|
|
|
+})
|