paging: paging groups, *80 intercom, auto-answer headers
/api/paging-groups CRUD (members as memberIds). The generator renders
sp-page-{id} per 03 §6.11 (desk phones only, auto-answer headers via
sp-sub-autoanswer) plus the number in sp-local-numbers. Added the `s`
option so phones already on a call aren't paged, which also keeps a
pager who is a member from being paged themselves. A group with no
members just hangs up.
*80<ext> intercom checks the target first: digits only and an endpoint
in sp-from-ext, else ss-noservice (the spec's one-liner passed
${EXTEN:3} straight into Page()). Both written back into 03.
Web: Paging page (list, drawer form with member checkboxes). Golden
case paging. e2e m8-t4 with baresip phones that honor the headers
(sip_autoanswer): an ordinary call rings, a page is answered by itself
and muted, the busy pager is skipped, *80 is two-way, *80999 refused.
The check on a real Yealink/Grandstream stays open (09).
Task: M8-T4
This commit is contained in:
1 parent
a6c423de97
commit
e95271e694
47 files changed
+1466
-22
No files matched your search
@@ -15,6 +15,7 @@ export * from './sounds.ts';
|
||||
export * from './ringgroups.ts';
|
||||
export * from './queues.ts';
|
||||
export * from './conferences.ts';
|
||||
export * from './paging.ts';
|
||||
export * from './ivrs.ts';
|
||||
export * from './timeconditions.ts';
|
||||
export * from './announcements.ts';
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// Paging groups (02 paging_groups, 03 §6.11): a number that makes several desk phones answer by
|
||||
// themselves and play what the caller says.
|
||||
import { z } from 'zod';
|
||||
import { InternalNumber } from './extensions.ts';
|
||||
|
||||
const PagingGroupFields = z.object({
|
||||
number: InternalNumber,
|
||||
name: z.string().trim().min(1, 'Required').max(40),
|
||||
/** false: one-way announcement; true: intercom, the paged phones can talk back. */
|
||||
duplex: z.boolean(),
|
||||
/** Extension ids. */
|
||||
memberIds: z
|
||||
.array(z.uuid())
|
||||
.max(50)
|
||||
.refine((ids) => new Set(ids).size === ids.length, 'Someone is listed twice'),
|
||||
});
|
||||
|
||||
export const PagingGroupCreateSchema = PagingGroupFields.partial().required({
|
||||
number: true,
|
||||
name: true,
|
||||
});
|
||||
export const PagingGroupUpdateSchema = PagingGroupFields.partial();
|
||||
export type PagingGroupCreate = z.input<typeof PagingGroupCreateSchema>;
|
||||
export type PagingGroupUpdate = z.input<typeof PagingGroupUpdateSchema>;
|
||||
|
||||
export type PagingGroupDto = z.output<typeof PagingGroupFields> & { id: string; createdAt: string };
|
||||
Reference in new issue
Block a user