@fayz-ai/plugin-agenda 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/AgendaContext.d.ts +13 -0
- package/dist/AgendaContext.d.ts.map +1 -0
- package/dist/AgendaPage.d.ts +11 -0
- package/dist/AgendaPage.d.ts.map +1 -0
- package/dist/bridges/create-financial-bridge.d.ts +19 -0
- package/dist/bridges/create-financial-bridge.d.ts.map +1 -0
- package/dist/calendar-styles.d.ts +8 -0
- package/dist/calendar-styles.d.ts.map +1 -0
- package/dist/chunk-3LJKZQK4.js +12 -0
- package/dist/chunk-3LJKZQK4.js.map +1 -0
- package/dist/chunk-SYDBDI3Q.cjs +15 -0
- package/dist/chunk-SYDBDI3Q.cjs.map +1 -0
- package/dist/components/AgendaGeneralSettings.d.ts +3 -0
- package/dist/components/AgendaGeneralSettings.d.ts.map +1 -0
- package/dist/components/AppointmentModal.d.ts +16 -0
- package/dist/components/AppointmentModal.d.ts.map +1 -0
- package/dist/components/AppointmentPopover.d.ts +14 -0
- package/dist/components/AppointmentPopover.d.ts.map +1 -0
- package/dist/components/BookingPaymentPanel.d.ts +18 -0
- package/dist/components/BookingPaymentPanel.d.ts.map +1 -0
- package/dist/components/CalendarSidebar.d.ts +3 -0
- package/dist/components/CalendarSidebar.d.ts.map +1 -0
- package/dist/components/CalendarToolbar.d.ts +13 -0
- package/dist/components/CalendarToolbar.d.ts.map +1 -0
- package/dist/components/EventContextMenu.d.ts +14 -0
- package/dist/components/EventContextMenu.d.ts.map +1 -0
- package/dist/components/FloatingPanel.d.ts +27 -0
- package/dist/components/FloatingPanel.d.ts.map +1 -0
- package/dist/components/MiniCalendar.d.ts +9 -0
- package/dist/components/MiniCalendar.d.ts.map +1 -0
- package/dist/components/PaymentStatusBadge.d.ts +13 -0
- package/dist/components/PaymentStatusBadge.d.ts.map +1 -0
- package/dist/components/SearchCombobox.d.ts +38 -0
- package/dist/components/SearchCombobox.d.ts.map +1 -0
- package/dist/components/StatusBadge.d.ts +5 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/config.d.ts +151 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/supabase.d.ts +3 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/types.d.ts +26 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/financial-bridge.d.ts +92 -0
- package/dist/financial-bridge.d.ts.map +1 -0
- package/dist/hooks/useAgendaSettings.d.ts +7 -0
- package/dist/hooks/useAgendaSettings.d.ts.map +1 -0
- package/dist/index.cjs +5135 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5120 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/tenant.d.ts +3 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/index.d.ts +2 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/pt-BR.d.ts +2 -0
- package/dist/locales/pt-BR.d.ts.map +1 -0
- package/dist/registries.d.ts +3 -0
- package/dist/registries.d.ts.map +1 -0
- package/dist/store.d.ts +66 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/tenant-222EHYUC.cjs +16 -0
- package/dist/tenant-222EHYUC.cjs.map +1 -0
- package/dist/tenant-LAUWVUYB.js +3 -0
- package/dist/tenant-LAUWVUYB.js.map +1 -0
- package/dist/types.d.ts +202 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/CalendarView.d.ts +3 -0
- package/dist/views/CalendarView.d.ts.map +1 -0
- package/dist/views/ConfirmationsView.d.ts +3 -0
- package/dist/views/ConfirmationsView.d.ts.map +1 -0
- package/package.json +63 -0
- package/src/AgendaContext.tsx +11 -0
- package/src/AgendaPage.tsx +33 -0
- package/src/bridges/create-financial-bridge.ts +298 -0
- package/src/calendar-styles.css +245 -0
- package/src/calendar-styles.ts +285 -0
- package/src/components/AgendaGeneralSettings.tsx +64 -0
- package/src/components/AppointmentModal.tsx +1031 -0
- package/src/components/AppointmentPopover.tsx +221 -0
- package/src/components/BookingPaymentPanel.tsx +394 -0
- package/src/components/CalendarSidebar.tsx +119 -0
- package/src/components/CalendarToolbar.tsx +83 -0
- package/src/components/EventContextMenu.tsx +122 -0
- package/src/components/FloatingPanel.tsx +123 -0
- package/src/components/MiniCalendar.tsx +120 -0
- package/src/components/PaymentStatusBadge.tsx +62 -0
- package/src/components/SearchCombobox.tsx +216 -0
- package/src/components/StatusBadge.tsx +23 -0
- package/src/config.ts +269 -0
- package/src/data/index.ts +3 -0
- package/src/data/mock.ts +324 -0
- package/src/data/supabase.ts +570 -0
- package/src/data/types.ts +37 -0
- package/src/financial-bridge.ts +96 -0
- package/src/hooks/useAgendaSettings.ts +17 -0
- package/src/index.ts +180 -0
- package/src/lib/tenant.ts +3 -0
- package/src/locales/en.ts +207 -0
- package/src/locales/index.ts +7 -0
- package/src/locales/pt-BR.ts +207 -0
- package/src/registries.ts +36 -0
- package/src/store.ts +304 -0
- package/src/types.ts +265 -0
- package/src/views/CalendarView.tsx +904 -0
- package/src/views/ConfirmationsView.tsx +155 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Agenda × Financial Bridge — Cross-plugin integration types
|
|
3
|
+
// Pure types only. Runtime implementation in bridges/create-financial-bridge.ts
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
|
|
6
|
+
/** Payment status for a booking's linked invoice */
|
|
7
|
+
export type BookingPaymentStatus = 'none' | 'pending' | 'partial' | 'paid' | 'overdue' | 'cancelled'
|
|
8
|
+
|
|
9
|
+
/** Compact payment summary for calendar enrichment */
|
|
10
|
+
export interface BookingPaymentSummary {
|
|
11
|
+
invoiceId: string
|
|
12
|
+
referenceNumber?: string
|
|
13
|
+
status: BookingPaymentStatus
|
|
14
|
+
totalAmount: number
|
|
15
|
+
paidAmount: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Detailed payment info with installment breakdown */
|
|
19
|
+
export interface BookingPaymentDetail extends BookingPaymentSummary {
|
|
20
|
+
movements: Array<{
|
|
21
|
+
id: string
|
|
22
|
+
amount: number
|
|
23
|
+
paidAmount: number
|
|
24
|
+
status: string
|
|
25
|
+
dueDate: string
|
|
26
|
+
installmentNumber?: number
|
|
27
|
+
paymentDate?: string
|
|
28
|
+
paymentMethodTypeName?: string
|
|
29
|
+
cardBrand?: string
|
|
30
|
+
cardInstallments?: number
|
|
31
|
+
}>
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Bridge interface for agenda → financial plugin integration.
|
|
36
|
+
* Injected via `AgendaPluginOptions.financialBridge`.
|
|
37
|
+
* Follows the same DI pattern as `EntityLookup`.
|
|
38
|
+
*/
|
|
39
|
+
export interface AgendaFinancialBridge {
|
|
40
|
+
/** Batch-resolve payment status for multiple order IDs (for calendar enrichment) */
|
|
41
|
+
resolvePaymentStatuses(orderIds: string[]): Promise<Map<string, BookingPaymentSummary>>
|
|
42
|
+
|
|
43
|
+
/** Get detailed payment info for a single booking's order */
|
|
44
|
+
getPaymentDetail(orderId: string): Promise<BookingPaymentDetail | null>
|
|
45
|
+
|
|
46
|
+
/** Create a receivable invoice from the booking's service_order. Returns invoice ID */
|
|
47
|
+
createInvoiceFromOrder(orderId: string, options?: {
|
|
48
|
+
installments?: number
|
|
49
|
+
dueDate?: string
|
|
50
|
+
paymentMethodTypeId?: string
|
|
51
|
+
}): Promise<string>
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Accrue the assigned professional's commission for a booking's order as a
|
|
55
|
+
* payable `financial_movements` row (direction='debit', movement_kind='commission').
|
|
56
|
+
* Commission = order.total × professional commission_rate%. Resolves the rate
|
|
57
|
+
* from the `v_staff` bridge view via the order's `assignee_id`.
|
|
58
|
+
*
|
|
59
|
+
* Idempotent per order: returns the existing commission movement id if one was
|
|
60
|
+
* already accrued. Returns null when there is no professional, no configured
|
|
61
|
+
* rate, a zero base, or Supabase is unavailable (nothing to accrue).
|
|
62
|
+
*/
|
|
63
|
+
createCommissionMovement?(orderId: string, options?: {
|
|
64
|
+
dueDate?: string
|
|
65
|
+
}): Promise<string | null>
|
|
66
|
+
|
|
67
|
+
/** Record a payment against a movement (installment) */
|
|
68
|
+
payMovement(input: {
|
|
69
|
+
movementId: string
|
|
70
|
+
amount: number
|
|
71
|
+
paymentDate: string
|
|
72
|
+
paymentMethodTypeId?: string
|
|
73
|
+
paymentMethodId?: string
|
|
74
|
+
bankAccountId?: string
|
|
75
|
+
cardBrand?: string
|
|
76
|
+
cardInstallments?: number
|
|
77
|
+
}): Promise<void>
|
|
78
|
+
|
|
79
|
+
/** One-step POS checkout: create invoice + pay in full. Returns paid detail. */
|
|
80
|
+
checkout(orderId: string, input: {
|
|
81
|
+
paymentMethodTypeId: string
|
|
82
|
+
paymentMethodId?: string
|
|
83
|
+
bankAccountId?: string
|
|
84
|
+
cardBrand?: string
|
|
85
|
+
cardInstallments?: number
|
|
86
|
+
}): Promise<BookingPaymentDetail>
|
|
87
|
+
|
|
88
|
+
/** Get payment methods filtered by type */
|
|
89
|
+
getPaymentMethods?(paymentMethodTypeId: string): Promise<Array<{ id: string; name: string }>>
|
|
90
|
+
|
|
91
|
+
/** Get payment method types for the payment UI */
|
|
92
|
+
getPaymentMethodTypes(): Promise<Array<{ id: string; name: string; transactionType?: string }>>
|
|
93
|
+
|
|
94
|
+
/** Get bank accounts for payment destination */
|
|
95
|
+
getBankAccounts(): Promise<Array<{ id: string; name: string; accountType: string }>>
|
|
96
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { usePluginPrefs } from '@fayz-ai/saas'
|
|
2
|
+
|
|
3
|
+
const DEFAULTS = {
|
|
4
|
+
startTime: '07:00',
|
|
5
|
+
endTime: '21:00',
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function useAgendaSettings() {
|
|
9
|
+
const prefs = usePluginPrefs('agenda', DEFAULTS)
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
startTime: prefs.get('startTime'),
|
|
13
|
+
endTime: prefs.get('endTime'),
|
|
14
|
+
setStartTime: (v: string) => prefs.set('startTime', v),
|
|
15
|
+
setEndTime: (v: string) => prefs.set('endTime', v),
|
|
16
|
+
}
|
|
17
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import type { PluginManifest } from '@fayz-ai/core'
|
|
3
|
+
import { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'
|
|
4
|
+
import type { AgendaPluginOptions } from './config'
|
|
5
|
+
import { resolveConfig } from './config'
|
|
6
|
+
import { AgendaPage } from './AgendaPage'
|
|
7
|
+
import { createSupabaseAgendaProvider } from './data/supabase'
|
|
8
|
+
import { createMockAgendaProvider } from './data/mock'
|
|
9
|
+
import { setAgendaTenantId } from './lib/tenant'
|
|
10
|
+
import { createAgendaStore } from './store'
|
|
11
|
+
import { agendaRegistries } from './registries'
|
|
12
|
+
import { AgendaGeneralSettings } from './components/AgendaGeneralSettings'
|
|
13
|
+
import { agendaLocales } from './locales'
|
|
14
|
+
import { setScheduleBlockConfig, getScheduleBlockConfig } from '@fayz-ai/saas'
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Factory
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
export function createAgendaPlugin(options?: AgendaPluginOptions): PluginManifest {
|
|
21
|
+
const config = resolveConfig(options)
|
|
22
|
+
registerTranslations(agendaLocales)
|
|
23
|
+
const provider = options?.dataProvider ?? createSafeDataProvider(
|
|
24
|
+
() => createSupabaseAgendaProvider(),
|
|
25
|
+
() => createMockAgendaProvider(),
|
|
26
|
+
)
|
|
27
|
+
const store = createAgendaStore(provider, options?.financialBridge)
|
|
28
|
+
|
|
29
|
+
// Register schedule block config globally so ScheduleEditor can read it
|
|
30
|
+
setScheduleBlockConfig({
|
|
31
|
+
defaults: config.scheduleBlockDefaults,
|
|
32
|
+
showServices: !!config.serviceLookup,
|
|
33
|
+
showConcurrent: true,
|
|
34
|
+
showBookingWindow: true,
|
|
35
|
+
showLocations: config.modules.locationSelection,
|
|
36
|
+
locations: config.locations.map((l) => ({ id: l.id, name: l.name })),
|
|
37
|
+
// Lazy fetcher — called by ScheduleEditor when locations are needed but empty
|
|
38
|
+
fetchLocations: config.modules.locationSelection && provider.getLocations
|
|
39
|
+
? async () => {
|
|
40
|
+
const locations = await provider.getLocations!()
|
|
41
|
+
const current = getScheduleBlockConfig()
|
|
42
|
+
if (current) setScheduleBlockConfig({ ...current, locations })
|
|
43
|
+
return locations
|
|
44
|
+
}
|
|
45
|
+
: undefined,
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const PageComponent: React.FC<any> = () =>
|
|
49
|
+
React.createElement(AgendaPage, { config, provider, store })
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
id: 'agenda',
|
|
53
|
+
name: config.labels.pageTitle,
|
|
54
|
+
icon: 'Calendar',
|
|
55
|
+
version: '1.0.0',
|
|
56
|
+
scope: options?.scope ?? 'universal',
|
|
57
|
+
verticalId: options?.verticalId,
|
|
58
|
+
defaultEnabled: true,
|
|
59
|
+
dependencies: [],
|
|
60
|
+
declaredFeatures: [
|
|
61
|
+
{ id: 'appointments', label: config.labels.pageTitle, group: config.labels.pageTitle },
|
|
62
|
+
{ id: 'agenda.schedules', label: 'Schedule Management', group: config.labels.pageTitle },
|
|
63
|
+
],
|
|
64
|
+
|
|
65
|
+
navigation: [
|
|
66
|
+
{
|
|
67
|
+
section: options?.navSection ?? 'main',
|
|
68
|
+
position: options?.navPosition ?? 2,
|
|
69
|
+
label: config.labels.pageTitle,
|
|
70
|
+
route: '/agenda',
|
|
71
|
+
icon: 'Calendar',
|
|
72
|
+
permission: { feature: 'appointments', action: 'read' as const },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
|
|
76
|
+
routes: [
|
|
77
|
+
{
|
|
78
|
+
path: '/agenda',
|
|
79
|
+
component: PageComponent,
|
|
80
|
+
permission: { feature: 'appointments', action: 'read' as const },
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
|
|
84
|
+
widgets: [],
|
|
85
|
+
|
|
86
|
+
aiTools: [
|
|
87
|
+
{
|
|
88
|
+
id: 'agenda.list-appointments',
|
|
89
|
+
name: 'listAppointments',
|
|
90
|
+
description: 'Lists upcoming appointments for a given date or date range, optionally filtered by professional.',
|
|
91
|
+
icon: 'Calendar',
|
|
92
|
+
mode: 'read' as const,
|
|
93
|
+
category: 'Scheduling',
|
|
94
|
+
parameters: {
|
|
95
|
+
type: 'object' as const,
|
|
96
|
+
properties: {
|
|
97
|
+
date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or "today", "tomorrow", "this week"' },
|
|
98
|
+
professional: { type: 'string' as const, description: 'Professional name to filter by' },
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
suggestions: [
|
|
102
|
+
{ label: "What's on the agenda today?" },
|
|
103
|
+
{ label: 'Show me tomorrow\'s appointments' },
|
|
104
|
+
{ label: 'Who has the most bookings this week?' },
|
|
105
|
+
],
|
|
106
|
+
permission: { feature: 'appointments', action: 'read' as const },
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 'agenda.create-appointment',
|
|
110
|
+
name: 'createAppointment',
|
|
111
|
+
description: 'Creates a new appointment for a client with a specific professional and service.',
|
|
112
|
+
icon: 'CalendarPlus',
|
|
113
|
+
mode: 'persist' as const,
|
|
114
|
+
category: 'Scheduling',
|
|
115
|
+
parameters: {
|
|
116
|
+
type: 'object' as const,
|
|
117
|
+
properties: {
|
|
118
|
+
client: { type: 'string' as const, description: 'Client name' },
|
|
119
|
+
professional: { type: 'string' as const, description: 'Professional name' },
|
|
120
|
+
service: { type: 'string' as const, description: 'Service name' },
|
|
121
|
+
date: { type: 'string' as const, description: 'Date (YYYY-MM-DD)' },
|
|
122
|
+
time: { type: 'string' as const, description: 'Time (HH:MM)' },
|
|
123
|
+
},
|
|
124
|
+
required: ['client', 'professional', 'service', 'date', 'time'],
|
|
125
|
+
},
|
|
126
|
+
suggestions: [
|
|
127
|
+
{ label: 'Book a haircut for Sarah tomorrow at 10am' },
|
|
128
|
+
],
|
|
129
|
+
permission: { feature: 'appointments', action: 'create' as const },
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: 'agenda.check-availability',
|
|
133
|
+
name: 'checkAvailability',
|
|
134
|
+
description: 'Checks available time slots for a professional on a given date.',
|
|
135
|
+
icon: 'Clock',
|
|
136
|
+
mode: 'read' as const,
|
|
137
|
+
category: 'Scheduling',
|
|
138
|
+
parameters: {
|
|
139
|
+
type: 'object' as const,
|
|
140
|
+
properties: {
|
|
141
|
+
professional: { type: 'string' as const, description: 'Professional name' },
|
|
142
|
+
date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or "today", "tomorrow"' },
|
|
143
|
+
duration: { type: 'number' as const, description: 'Required duration in minutes' },
|
|
144
|
+
},
|
|
145
|
+
required: ['professional', 'date'],
|
|
146
|
+
},
|
|
147
|
+
suggestions: [
|
|
148
|
+
{ label: 'When is Ana available tomorrow?' },
|
|
149
|
+
{ label: 'Find a 90-minute slot for Carlos this week' },
|
|
150
|
+
],
|
|
151
|
+
permission: { feature: 'appointments', action: 'read' as const },
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
|
|
155
|
+
registries: agendaRegistries,
|
|
156
|
+
|
|
157
|
+
settings: [
|
|
158
|
+
{
|
|
159
|
+
id: 'agenda',
|
|
160
|
+
label: 'Agenda',
|
|
161
|
+
icon: 'Calendar',
|
|
162
|
+
component: (() => {
|
|
163
|
+
const AgendaSettingsTab: React.FC = () => React.createElement(AgendaGeneralSettings)
|
|
164
|
+
AgendaSettingsTab.displayName = 'AgendaSettingsTab'
|
|
165
|
+
return AgendaSettingsTab as unknown as React.ComponentType<unknown>
|
|
166
|
+
})(),
|
|
167
|
+
order: 5,
|
|
168
|
+
permission: { feature: 'appointments', action: 'read' as const },
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
locales: agendaLocales,
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Re-export types for consumers
|
|
176
|
+
export type { AgendaPluginOptions } from './config'
|
|
177
|
+
export type { ResolvedAgendaConfig } from './config'
|
|
178
|
+
export type { AgendaDataProvider } from './data/types'
|
|
179
|
+
export type { AgendaFinancialBridge, BookingPaymentStatus, BookingPaymentSummary, BookingPaymentDetail } from './financial-bridge'
|
|
180
|
+
export { createFinancialBridge, computeCommissionAmount } from './bridges/create-financial-bridge'
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// agenda.* — merged plugin-own + saas-core central i18n
|
|
2
|
+
export const en: Record<string, string> = {
|
|
3
|
+
"agenda.appointment.addDescription": "Add description...",
|
|
4
|
+
"agenda.appointment.addService": "Add service",
|
|
5
|
+
"agenda.appointment.cancel": "Cancel",
|
|
6
|
+
"agenda.appointment.clientTab": "Client",
|
|
7
|
+
"agenda.appointment.noClientData": "No client data available",
|
|
8
|
+
"agenda.appointment.client": "Client",
|
|
9
|
+
"agenda.appointment.conflict": "Time conflict — this professional is already booked at this time.",
|
|
10
|
+
"agenda.appointment.create": "Create",
|
|
11
|
+
"agenda.appointment.createClientFailed": "Failed to create client",
|
|
12
|
+
"agenda.appointment.creating": "Creating...",
|
|
13
|
+
"agenda.appointment.delete": "Delete",
|
|
14
|
+
"agenda.appointment.deleteConfirm": "Delete this appointment?",
|
|
15
|
+
"agenda.appointment.confirmDelete": "Delete",
|
|
16
|
+
"agenda.appointment.deleting": "Deleting…",
|
|
17
|
+
"agenda.appointment.edit": "Edit Appointment",
|
|
18
|
+
"agenda.appointment.emailOptional": "Email (optional)",
|
|
19
|
+
"agenda.appointment.location": "Location",
|
|
20
|
+
"agenda.appointment.name": "Name",
|
|
21
|
+
"agenda.appointment.new": "New Appointment",
|
|
22
|
+
"agenda.appointment.newClient": "New client",
|
|
23
|
+
"agenda.appointment.notes": "Notes",
|
|
24
|
+
"agenda.appointment.phone": "Phone",
|
|
25
|
+
"agenda.appointment.professional": "Professional",
|
|
26
|
+
"agenda.appointment.save": "Save",
|
|
27
|
+
"agenda.appointment.saving": "Saving...",
|
|
28
|
+
"agenda.appointment.searchClient": "Search client...",
|
|
29
|
+
"agenda.appointment.searchService": "Search service to add...",
|
|
30
|
+
"agenda.appointment.selectLocation": "Select location...",
|
|
31
|
+
"agenda.appointment.selectProfessional": "Select professional...",
|
|
32
|
+
"agenda.appointment.services": "Services",
|
|
33
|
+
"agenda.appointment.status": "Status",
|
|
34
|
+
"agenda.appointment.to": "to",
|
|
35
|
+
"agenda.appointment.total": "Total",
|
|
36
|
+
"agenda.appointment.update": "Update",
|
|
37
|
+
"agenda.payment.title": "Payment",
|
|
38
|
+
"agenda.payment.generateInvoice": "Generate invoice",
|
|
39
|
+
"agenda.payment.generating": "Generating…",
|
|
40
|
+
"agenda.payment.pending": "Pending",
|
|
41
|
+
"agenda.payment.partial": "Partial",
|
|
42
|
+
"agenda.payment.paid": "Paid",
|
|
43
|
+
"agenda.payment.collect": "Collect",
|
|
44
|
+
"agenda.payment.overdue": "Overdue",
|
|
45
|
+
"agenda.payment.cancelled": "Cancelled",
|
|
46
|
+
"agenda.payment.none": "Payment",
|
|
47
|
+
"agenda.payment.pay": "Pay",
|
|
48
|
+
"agenda.payment.paying": "Paying…",
|
|
49
|
+
"agenda.payment.remaining": "Remaining",
|
|
50
|
+
"agenda.payment.installment": "Installment",
|
|
51
|
+
"agenda.payment.total": "Total",
|
|
52
|
+
"agenda.payment.noInvoice": "No invoice generated",
|
|
53
|
+
"agenda.payment.selectAccount": "Select account",
|
|
54
|
+
"agenda.payment.registerPayment": "Register payment",
|
|
55
|
+
"agenda.payment.registerPaymentHint": "Record a payment for this appointment",
|
|
56
|
+
"agenda.payment.pendingHint": "Invoice generated, awaiting payment",
|
|
57
|
+
"agenda.payment.partialHint": "Partially paid, tap to complete",
|
|
58
|
+
"agenda.payment.paidHint": "Payment completed",
|
|
59
|
+
"agenda.payment.overdueHint": "Payment overdue",
|
|
60
|
+
"agenda.payment.backToAppointment": "Back to appointment",
|
|
61
|
+
"agenda.payment.checkout": "Confirm",
|
|
62
|
+
"agenda.payment.checkingOut": "Processing…",
|
|
63
|
+
"agenda.payment.serviceSummary": "Service summary",
|
|
64
|
+
"agenda.payment.paymentMethod": "Payment method",
|
|
65
|
+
"agenda.payment.noMethods": "No payment methods configured.",
|
|
66
|
+
"agenda.payment.configureMethods": "Set up payment methods",
|
|
67
|
+
"agenda.payment.checkoutComplete": "Payment confirmed",
|
|
68
|
+
"agenda.payment.card": "Card",
|
|
69
|
+
"agenda.payment.method": "Method",
|
|
70
|
+
"agenda.payment.select": "Select…",
|
|
71
|
+
"agenda.payment.cardBrand": "Brand",
|
|
72
|
+
"agenda.payment.selectBrand": "Select brand…",
|
|
73
|
+
"agenda.payment.cardInstallments": "Installments",
|
|
74
|
+
"agenda.payment.bankAccount": "Account",
|
|
75
|
+
"agenda.payment.viewInvoice": "View invoice details",
|
|
76
|
+
"agenda.calendar.agendas": "Agendas",
|
|
77
|
+
"agenda.calendar.create": "Create",
|
|
78
|
+
"agenda.calendar.next": "Next",
|
|
79
|
+
"agenda.calendar.previous": "Previous",
|
|
80
|
+
"agenda.calendar.status": "Status",
|
|
81
|
+
"agenda.calendar.today": "Today",
|
|
82
|
+
"agenda.calendar.viewAgenda": "Agenda",
|
|
83
|
+
"agenda.calendar.viewDay": "Day",
|
|
84
|
+
"agenda.calendar.viewMonth": "Month",
|
|
85
|
+
"agenda.calendar.viewWeek": "Week",
|
|
86
|
+
"agenda.confirmations.confirmed": "Confirmed:",
|
|
87
|
+
"agenda.confirmations.empty": "No pending confirmations",
|
|
88
|
+
"agenda.confirmations.emptySubtitle": "All upcoming appointments have been confirmed",
|
|
89
|
+
"agenda.confirmations.loading": "Loading...",
|
|
90
|
+
"agenda.confirmations.subtitle": "Upcoming appointments pending confirmation",
|
|
91
|
+
"agenda.confirmations.unknownClient": "Unknown client",
|
|
92
|
+
"agenda.confirmations.sendWhatsApp": "Send WhatsApp",
|
|
93
|
+
"agenda.confirmations.call": "Call",
|
|
94
|
+
"agenda.confirmations.markConfirmed": "Mark Confirmed",
|
|
95
|
+
"agenda.confirmations.markCancelled": "Mark Cancelled",
|
|
96
|
+
"agenda.contextMenu.changeStatus": "Change status",
|
|
97
|
+
"agenda.contextMenu.delete": "Delete",
|
|
98
|
+
"agenda.contextMenu.edit": "Edit",
|
|
99
|
+
"agenda.contextMenu.notAvailable": "(not available)",
|
|
100
|
+
"agenda.index.settingsSubtitle": "Working hours, scheduling preferences, and confirmations",
|
|
101
|
+
"agenda.index.settingsTitle": "Agenda Settings",
|
|
102
|
+
"settings.plugin.agenda-working-hours": "Working Hours",
|
|
103
|
+
"agenda.popover.unknown": "Unknown",
|
|
104
|
+
"agenda.settings.autoConfirm": "Auto-confirm",
|
|
105
|
+
"agenda.settings.autoConfirmDesc": "Automatically confirm new bookings",
|
|
106
|
+
"agenda.settings.autoCreateOrder": "Auto-create Order",
|
|
107
|
+
"agenda.settings.autoCreateOrderDesc": "Automatically create a financial order for new bookings",
|
|
108
|
+
"agenda.settings.blockOutside": "Block Outside Hours",
|
|
109
|
+
"agenda.settings.blockOutsideDesc": "Prevent bookings outside working hours",
|
|
110
|
+
"agenda.settings.calendarDisplay": "Calendar Display",
|
|
111
|
+
"agenda.settings.calendarDisplayDesc": "Visual settings for the calendar",
|
|
112
|
+
"agenda.settings.cancelAlerts": "Cancellation Alerts",
|
|
113
|
+
"agenda.settings.cancelAlertsDesc": "Notify when a booking is cancelled",
|
|
114
|
+
"agenda.settings.compact": "Compact Mode",
|
|
115
|
+
"agenda.settings.compactDesc": "Use smaller event blocks",
|
|
116
|
+
"agenda.settings.confirmations": "Confirmations",
|
|
117
|
+
"agenda.settings.confirmationsDesc": "Booking confirmation settings",
|
|
118
|
+
"agenda.settings.conflictDetection": "Conflict Detection",
|
|
119
|
+
"agenda.settings.conflictDetectionDesc": "Warn when bookings overlap",
|
|
120
|
+
"agenda.settings.dragDrop": "Drag & Drop",
|
|
121
|
+
"agenda.settings.dragDropDesc": "Allow rescheduling by dragging events",
|
|
122
|
+
"agenda.settings.enableConfirmations": "Enable Confirmations",
|
|
123
|
+
"agenda.settings.enableConfirmationsDesc": "Require confirmation for new bookings",
|
|
124
|
+
"agenda.settings.enableLocation": "Enable Location Selection",
|
|
125
|
+
"agenda.settings.enableLocationDesc": "Show location picker in booking modal",
|
|
126
|
+
"agenda.settings.enableWorkingHours": "Enable Working Hours",
|
|
127
|
+
"agenda.settings.enableWorkingHoursDesc": "Show working hours overlay on calendar",
|
|
128
|
+
"agenda.settings.locations": "Locations",
|
|
129
|
+
"agenda.settings.locationsDesc": "Multi-location settings",
|
|
130
|
+
"agenda.settings.newBookingNotif": "New Booking Alerts",
|
|
131
|
+
"agenda.settings.newBookingNotifDesc": "Notify when a new booking is created",
|
|
132
|
+
"agenda.settings.noShowTracking": "No-show Tracking",
|
|
133
|
+
"agenda.settings.noShowTrackingDesc": "Track and alert on no-shows",
|
|
134
|
+
"agenda.settings.notifications": "Notifications",
|
|
135
|
+
"agenda.settings.notificationsDesc": "Notification preferences",
|
|
136
|
+
"agenda.settings.reminder": "Reminders",
|
|
137
|
+
"agenda.settings.reminderDesc": "Send reminders before appointments",
|
|
138
|
+
"agenda.settings.scheduling": "Scheduling",
|
|
139
|
+
"agenda.settings.schedulingDesc": "Configure scheduling behavior",
|
|
140
|
+
"agenda.settings.showCancelled": "Show Cancelled",
|
|
141
|
+
"agenda.settings.showCancelledDesc": "Display cancelled bookings on calendar",
|
|
142
|
+
"agenda.settings.showNoShow": "Show No-shows",
|
|
143
|
+
"agenda.settings.showNoShowDesc": "Display no-show bookings on calendar",
|
|
144
|
+
"agenda.settings.workingHours": "Working Hours",
|
|
145
|
+
"agenda.settings.workingHoursDesc": "Working hours and availability",
|
|
146
|
+
"agenda.sidebar.agendas": "Agendas",
|
|
147
|
+
"agenda.sidebar.allLocations": "All locations",
|
|
148
|
+
"agenda.sidebar.create": "Create",
|
|
149
|
+
"agenda.sidebar.location": "Location",
|
|
150
|
+
"agenda.sidebar.status": "Status",
|
|
151
|
+
"agenda.toolbar.next": "Next",
|
|
152
|
+
"agenda.toolbar.previous": "Previous",
|
|
153
|
+
"agenda.toolbar.today": "Today",
|
|
154
|
+
"agenda.workingHours.addBreak": "Add break",
|
|
155
|
+
"agenda.workingHours.copyToAll": "Copy to all",
|
|
156
|
+
"agenda.workingHours.dayOff": "Day off",
|
|
157
|
+
"agenda.workingHours.removePeriod": "Remove period",
|
|
158
|
+
"agenda.workingHours.professional": "Professional",
|
|
159
|
+
"agenda.workingHours.save": "Save",
|
|
160
|
+
"agenda.workingHours.saveFailed": "Failed to save",
|
|
161
|
+
"agenda.workingHours.saved": "Working hours saved",
|
|
162
|
+
"agenda.workingHours.saving": "Saving...",
|
|
163
|
+
"agenda.workingHours.subtitle": "Manage working hours per professional",
|
|
164
|
+
"agenda.workingHours.to": "to",
|
|
165
|
+
"agenda.title": "Agenda",
|
|
166
|
+
"agenda.calendar.title": "Calendar",
|
|
167
|
+
"agenda.calendar.noScheduleConfirm": "This time slot has no open schedule for this professional. Do you want to book anyway?",
|
|
168
|
+
"agenda.calendar.newAppointment": "New Appointment",
|
|
169
|
+
"agenda.booking.create": "New Appointment",
|
|
170
|
+
"agenda.booking.edit": "Edit Appointment",
|
|
171
|
+
"agenda.booking.delete": "Delete Appointment",
|
|
172
|
+
"agenda.booking.deleteConfirm": "Are you sure you want to delete this appointment?",
|
|
173
|
+
"agenda.booking.client": "Client",
|
|
174
|
+
"agenda.booking.professional": "Professional",
|
|
175
|
+
"agenda.booking.services": "Services",
|
|
176
|
+
"agenda.booking.date": "Date",
|
|
177
|
+
"agenda.booking.time": "Time",
|
|
178
|
+
"agenda.booking.duration": "Duration",
|
|
179
|
+
"agenda.booking.notes": "Notes",
|
|
180
|
+
"agenda.booking.status": "Status",
|
|
181
|
+
"agenda.booking.save": "Save Appointment",
|
|
182
|
+
"agenda.booking.saving": "Saving...",
|
|
183
|
+
"agenda.confirmations.title": "Confirmations",
|
|
184
|
+
"agenda.confirmations.pending": "Pending Confirmations",
|
|
185
|
+
"agenda.confirmations.emptyDescription": "All upcoming appointments have been confirmed",
|
|
186
|
+
"agenda.confirmations.confirm": "Confirm",
|
|
187
|
+
"agenda.confirmations.cancel": "Cancel",
|
|
188
|
+
"agenda.workingHours.title": "Working Hours",
|
|
189
|
+
"agenda.workingHours.addPeriod": "Add period",
|
|
190
|
+
"agenda.workingHours.loading": "Loading...",
|
|
191
|
+
"agenda.appointment.addClient": "Add client",
|
|
192
|
+
"agenda.appointment.addServiceFirst": "Add service",
|
|
193
|
+
"agenda.appointment.addNotes": "Add notes",
|
|
194
|
+
"agenda.appointment.duration": "Duration (minutes)",
|
|
195
|
+
"agenda.appointment.price": "Price",
|
|
196
|
+
"agenda.bookingType.appointment": "Appointment",
|
|
197
|
+
"agenda.bookingType.task": "Task",
|
|
198
|
+
"agenda.bookingType.out_of_office": "Out of Office",
|
|
199
|
+
"agenda.bookingType.block": "Block",
|
|
200
|
+
"agenda.settings.title": "Agenda Settings",
|
|
201
|
+
"agenda.settings.slotDuration": "Slot Duration",
|
|
202
|
+
"agenda.settings.bookingKind": "Booking Kind",
|
|
203
|
+
"agenda.settings.dayStartTime": "Day Start Time",
|
|
204
|
+
"agenda.settings.dayStartTimeDesc": "First hour shown on the calendar",
|
|
205
|
+
"agenda.settings.dayEndTime": "Day End Time",
|
|
206
|
+
"agenda.settings.dayEndTimeDesc": "Last hour shown on the calendar",
|
|
207
|
+
}
|