Compare commits
45
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3630399ee | ||
|
|
5375c656af | ||
|
|
1792d49634 | ||
|
|
de98578fdd | ||
|
|
c0a59a2837 | ||
|
|
29201006d5 | ||
|
|
7a1c780088 | ||
|
|
550f34c128 | ||
|
|
d6b17b76db | ||
|
|
c42e803cfa | ||
|
|
0233c3a11a | ||
|
|
71a2b6956f | ||
|
|
8282557ebe | ||
|
|
083a162d0e | ||
|
|
60487ea02e | ||
|
|
60a8841439 | ||
|
|
184d1eb751 | ||
|
|
9fea30a44d | ||
|
|
04efcbcdb6 | ||
|
|
2b29b5607d | ||
|
|
20f19c2509 | ||
|
|
5d0e66763e | ||
|
|
bcfbc24e93 | ||
|
|
37d805b007 | ||
|
|
6a246e6c57 | ||
|
|
3a0229f60d | ||
|
|
0bf95ec568 | ||
|
|
6f05142447 | ||
|
|
e02108d535 | ||
|
|
b7e668217d | ||
|
|
472ffef5cf | ||
|
|
5acdb208f5 | ||
|
|
7bf5d9cf64 | ||
|
|
34a80180ef | ||
|
|
3bbba9c6cb | ||
|
|
b052c2e029 | ||
|
|
4eb884e2a6 | ||
|
|
3f8ce8ff50 | ||
|
|
67a2371c05 | ||
|
|
80250d32bd | ||
|
|
0fadbe1ce9 | ||
|
|
9c3ee262b4 | ||
|
|
b62eba8128 | ||
|
|
ef114d7727 | ||
|
|
be7d127c9e |
@@ -386,6 +386,11 @@ UNKEY_ROOT_KEY=
|
||||
# Used for Cal.ai Voice AI Agents
|
||||
# https://retellai.com
|
||||
RETELL_AI_KEY=
|
||||
# Local testing overrides for Retell AI
|
||||
RETELL_AI_TEST_MODE=false
|
||||
# JSON mapping of local to production event type IDs (e.g. {"50": 747280} without any string)
|
||||
RETELL_AI_TEST_EVENT_TYPE_MAP=
|
||||
RETELL_AI_TEST_CAL_API_KEY=
|
||||
|
||||
# Used for buying phone number for cal ai voice agent
|
||||
STRIPE_PHONE_NUMBER_MONTHLY_PRICE_ID=
|
||||
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
with:
|
||||
filters: |
|
||||
has-files-requiring-all-checks:
|
||||
- "!(**.md|.github/CODEOWNERS|docs/**|help/**|apps/web/public/static/locales/**/common.json|i18n.lock)"
|
||||
- "!(**.md|**.mdx|.github/CODEOWNERS|docs/**|help/**|apps/web/public/static/locales/**/common.json|i18n.lock)"
|
||||
- name: Get Latest Commit SHA
|
||||
id: get_sha
|
||||
run: |
|
||||
|
||||
Vendored
@@ -4,7 +4,7 @@ import type { NextApiRequest } from "next";
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import { defaultResponder } from "@calcom/lib/server/defaultResponder";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
|
||||
import { schemaEventTypeCreateBodyParams, schemaEventTypeReadPublic } from "~/lib/validations/event-type";
|
||||
import { canUserAccessTeamWithRole } from "~/pages/api/teams/[teamId]/_auth-middleware";
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"@axiomhq/winston": "^1.2.0",
|
||||
"@calcom/platform-constants": "*",
|
||||
"@calcom/platform-enums": "*",
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.335",
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.344",
|
||||
"@calcom/platform-types": "*",
|
||||
"@calcom/platform-utils": "*",
|
||||
"@calcom/prisma": "*",
|
||||
@@ -55,9 +55,9 @@
|
||||
"@nestjs/platform-express": "^10.0.0",
|
||||
"@nestjs/swagger": "^7.3.0",
|
||||
"@nestjs/throttler": "6.2.1",
|
||||
"@sentry/nestjs": "^8.37.1",
|
||||
"@sentry/node": "^8.8.0",
|
||||
"@sentry/profiling-node": "^8.37.1",
|
||||
"@sentry/nestjs": "^9.15.0",
|
||||
"@sentry/node": "^9.15.0",
|
||||
"@sentry/profiling-node": "^9.15.0",
|
||||
"@snyk/protect": "latest",
|
||||
"body-parser": "^1.20.2",
|
||||
"bull": "^4.12.4",
|
||||
|
||||
@@ -38,7 +38,6 @@ import {
|
||||
} from "@nestjs/common";
|
||||
import { ConfigService } from "@nestjs/config";
|
||||
import { ApiQuery, ApiExcludeController as DocsExcludeController } from "@nestjs/swagger";
|
||||
import { CreationSource } from "@prisma/client";
|
||||
import { Request } from "express";
|
||||
import { NextApiRequest } from "next/types";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
@@ -58,6 +57,7 @@ import {
|
||||
getBookingForReschedule,
|
||||
ErrorCode,
|
||||
} from "@calcom/platform-libraries";
|
||||
import { CreationSource } from "@calcom/platform-libraries";
|
||||
import {
|
||||
GetBookingsInput_2024_04_15,
|
||||
CancelBookingInput_2024_04_15,
|
||||
|
||||
@@ -22,7 +22,6 @@ import { UsersRepository } from "@/modules/users/users.repository";
|
||||
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
|
||||
import { Logger } from "@nestjs/common";
|
||||
import { ConfigService } from "@nestjs/config";
|
||||
import { CreationSource } from "@prisma/client";
|
||||
import { isURL, isPhoneNumber } from "class-validator";
|
||||
import { Request } from "express";
|
||||
import { DateTime } from "luxon";
|
||||
@@ -30,6 +29,7 @@ import { NextApiRequest } from "next/types";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import { z } from "zod";
|
||||
|
||||
import { CreationSource } from "@calcom/platform-libraries";
|
||||
import { EventTypeMetaDataSchema } from "@calcom/platform-libraries/event-types";
|
||||
import {
|
||||
CancelBookingInput,
|
||||
|
||||
+1
-1
@@ -30,6 +30,7 @@ import {
|
||||
NoticeThresholdUnitEnum,
|
||||
FrequencyInput,
|
||||
} from "@calcom/platform-enums";
|
||||
import { SchedulingType } from "@calcom/platform-libraries";
|
||||
import {
|
||||
ApiSuccessResponse,
|
||||
CreateEventTypeInput_2024_06_14,
|
||||
@@ -39,7 +40,6 @@ import {
|
||||
NotesDefaultFieldInput_2024_06_14,
|
||||
UpdateEventTypeInput_2024_06_14,
|
||||
} from "@calcom/platform-types";
|
||||
import { SchedulingType } from "@calcom/prisma/enums";
|
||||
|
||||
const orderBySlug = (a: { slug: string }, b: { slug: string }) => {
|
||||
if (a.slug < b.slug) return -1;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export const SYSTEM_ADMIN_ROLE = "SYSADMIN";
|
||||
export const ORG_ROLES = [
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Reflector } from "@nestjs/core";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export const MembershipRoles = Reflector.createDecorator<MembershipRole[]>();
|
||||
|
||||
@@ -6,7 +6,7 @@ import { UserWithProfile } from "@/modules/users/users.repository";
|
||||
import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common";
|
||||
import { Reflector } from "@nestjs/core";
|
||||
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
@Injectable()
|
||||
export class OrganizationRolesGuard implements CanActivate {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
|
||||
import { Injectable } from "@nestjs/common";
|
||||
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
@Injectable()
|
||||
export class MembershipsRepository {
|
||||
|
||||
+2
-4
@@ -1,5 +1,4 @@
|
||||
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
|
||||
import { Locales } from "@/lib/enums/locales";
|
||||
import { MembershipRoles } from "@/modules/auth/decorators/roles/membership-roles.decorator";
|
||||
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
|
||||
import { OrganizationRolesGuard } from "@/modules/auth/guards/organization-roles/organization-roles.guard";
|
||||
@@ -7,7 +6,6 @@ import { GetManagedUsersInput } from "@/modules/oauth-clients/controllers/oauth-
|
||||
import { CreateManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/create-managed-user.output";
|
||||
import { GetManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-user.output";
|
||||
import { GetManagedUsersOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-users.output";
|
||||
import { ManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/managed-user.output";
|
||||
import { TOKENS_DOCS } from "@/modules/oauth-clients/controllers/oauth-flow/oauth-flow.controller";
|
||||
import { KeysResponseDto } from "@/modules/oauth-clients/controllers/oauth-flow/responses/KeysResponse.dto";
|
||||
import { OAuthClientGuard } from "@/modules/oauth-clients/guards/oauth-client-guard";
|
||||
@@ -34,10 +32,10 @@ import {
|
||||
NotFoundException,
|
||||
} from "@nestjs/common";
|
||||
import { ApiOperation, ApiTags as DocsTags, ApiHeader } from "@nestjs/swagger";
|
||||
import { User, MembershipRole } from "@prisma/client";
|
||||
import { plainToInstance } from "class-transformer";
|
||||
import { User } from "@prisma/client";
|
||||
|
||||
import { SUCCESS_STATUS, X_CAL_SECRET_KEY } from "@calcom/platform-constants";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
@Controller({
|
||||
path: "/v2/oauth-clients/:clientId/users",
|
||||
|
||||
+2
-1
@@ -17,10 +17,11 @@ import { OAuthClientWebhooksService } from "@/modules/webhooks/services/oauth-cl
|
||||
import { WebhooksService } from "@/modules/webhooks/services/webhooks.service";
|
||||
import { Controller, Post, Body, UseGuards, Get, Param, Query, Delete, Patch } from "@nestjs/common";
|
||||
import { ApiHeader, ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger";
|
||||
import { Webhook, MembershipRole } from "@prisma/client";
|
||||
import { Webhook } from "@prisma/client";
|
||||
import { plainToClass } from "class-transformer";
|
||||
|
||||
import { SUCCESS_STATUS, X_CAL_SECRET_KEY } from "@calcom/platform-constants";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
import { SkipTakePagination } from "@calcom/platform-types";
|
||||
|
||||
import { OAuthClientGuard } from "../../guards/oauth-client-guard";
|
||||
|
||||
+1
-3
@@ -5,12 +5,10 @@ import { MembershipRoles } from "@/modules/auth/decorators/roles/membership-role
|
||||
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
|
||||
import { OrganizationRolesGuard } from "@/modules/auth/guards/organization-roles/organization-roles.guard";
|
||||
import { GetManagedUsersOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-users.output";
|
||||
import { ManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/managed-user.output";
|
||||
import { CreateOAuthClientResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/CreateOAuthClientResponse.dto";
|
||||
import { GetOAuthClientResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto";
|
||||
import { GetOAuthClientsResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientsResponse.dto";
|
||||
import { OAuthClientGuard } from "@/modules/oauth-clients/guards/oauth-client-guard";
|
||||
import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository";
|
||||
import { OAuthClientUsersOutputService } from "@/modules/oauth-clients/services/oauth-clients-users-output.service";
|
||||
import { OAuthClientsService } from "@/modules/oauth-clients/services/oauth-clients/oauth-clients.service";
|
||||
import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository";
|
||||
@@ -37,9 +35,9 @@ import {
|
||||
ApiExcludeEndpoint,
|
||||
ApiHeader,
|
||||
} from "@nestjs/swagger";
|
||||
import { User, MembershipRole } from "@prisma/client";
|
||||
|
||||
import { SUCCESS_STATUS } from "@calcom/platform-constants";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
import { CreateOAuthClientInput, UpdateOAuthClientInput, Pagination } from "@calcom/platform-types";
|
||||
|
||||
@Controller({
|
||||
|
||||
@@ -8,9 +8,10 @@ import { CreateManagedUserInput } from "@/modules/users/inputs/create-managed-us
|
||||
import { UpdateManagedUserInput } from "@/modules/users/inputs/update-managed-user.input";
|
||||
import { UsersRepository } from "@/modules/users/users.repository";
|
||||
import { BadRequestException, ConflictException, Injectable, Logger } from "@nestjs/common";
|
||||
import { User, CreationSource, PlatformOAuthClient } from "@prisma/client";
|
||||
import { User, PlatformOAuthClient } from "@prisma/client";
|
||||
|
||||
import { createNewUsersConnectToOrgIfExists, slugify } from "@calcom/platform-libraries";
|
||||
import { CreationSource } from "@calcom/platform-libraries";
|
||||
|
||||
@Injectable()
|
||||
export class OAuthClientUsersService {
|
||||
|
||||
+2
-1
@@ -1,6 +1,5 @@
|
||||
import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input";
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { AttributeType } from "@prisma/client";
|
||||
import { Type } from "class-transformer";
|
||||
import {
|
||||
IsArray,
|
||||
@@ -12,6 +11,8 @@ import {
|
||||
ValidateNested,
|
||||
} from "class-validator";
|
||||
|
||||
import { AttributeType } from "@calcom/platform-libraries";
|
||||
|
||||
export class CreateOrganizationAttributeInput {
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
|
||||
+2
-1
@@ -1,7 +1,8 @@
|
||||
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { AttributeType } from "@prisma/client";
|
||||
import { IsBoolean, IsEnum, IsOptional, IsString } from "class-validator";
|
||||
|
||||
import { AttributeType } from "@calcom/platform-libraries";
|
||||
|
||||
export class UpdateOrganizationAttributeInput {
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
|
||||
+2
-1
@@ -6,7 +6,7 @@ import { UsersModule } from "@/modules/users/users.module";
|
||||
import { INestApplication } from "@nestjs/common";
|
||||
import { NestExpressApplication } from "@nestjs/platform-express";
|
||||
import { Test } from "@nestjs/testing";
|
||||
import { SchedulingType, User } from "@prisma/client";
|
||||
import { User } from "@prisma/client";
|
||||
import * as request from "supertest";
|
||||
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
|
||||
import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture";
|
||||
@@ -24,6 +24,7 @@ import {
|
||||
ConfirmationPolicyEnum,
|
||||
NoticeThresholdUnitEnum,
|
||||
} from "@calcom/platform-enums";
|
||||
import { SchedulingType } from "@calcom/platform-libraries";
|
||||
import {
|
||||
ApiSuccessResponse,
|
||||
CreateTeamEventTypeInput_2024_06_14,
|
||||
|
||||
@@ -7,12 +7,12 @@ import { TeamsRepository } from "@/modules/teams/teams/teams.repository";
|
||||
import { UsersRepository } from "@/modules/users/users.repository";
|
||||
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
|
||||
|
||||
import { SchedulingType } from "@calcom/platform-libraries";
|
||||
import {
|
||||
CreateTeamEventTypeInput_2024_06_14,
|
||||
UpdateTeamEventTypeInput_2024_06_14,
|
||||
HostPriority,
|
||||
} from "@calcom/platform-types";
|
||||
import { SchedulingType } from "@calcom/prisma/client";
|
||||
|
||||
export type TransformedCreateTeamEventTypeInput = Awaited<
|
||||
ReturnType<InstanceType<typeof InputOrganizationsEventTypesService>["transformInputCreateTeamEventType"]>
|
||||
|
||||
@@ -2,9 +2,17 @@ import { OutputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types
|
||||
import { TeamsEventTypesRepository } from "@/modules/teams/event-types/teams-event-types.repository";
|
||||
import { UsersRepository } from "@/modules/users/users.repository";
|
||||
import { Injectable } from "@nestjs/common";
|
||||
import type { EventType, User, Schedule, Host, DestinationCalendar, CalVideoSettings } from "@prisma/client";
|
||||
import { SchedulingType, Team } from "@prisma/client";
|
||||
import type {
|
||||
Team,
|
||||
EventType,
|
||||
User,
|
||||
Schedule,
|
||||
Host,
|
||||
DestinationCalendar,
|
||||
CalVideoSettings,
|
||||
} from "@prisma/client";
|
||||
|
||||
import { SchedulingType } from "@calcom/platform-libraries";
|
||||
import { HostPriority, TeamEventTypeResponseHost } from "@calcom/platform-types";
|
||||
|
||||
type EventTypeRelations = {
|
||||
|
||||
+2
-1
@@ -1,7 +1,8 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { IsBoolean, IsOptional, IsEnum, IsInt } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class CreateOrgMembershipDto {
|
||||
@IsInt()
|
||||
@ApiProperty()
|
||||
|
||||
+2
-1
@@ -1,7 +1,8 @@
|
||||
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { IsBoolean, IsOptional, IsEnum } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class UpdateOrgMembershipDto {
|
||||
@IsOptional()
|
||||
@IsBoolean()
|
||||
|
||||
+1
-1
@@ -1,9 +1,9 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { Expose, Type } from "class-transformer";
|
||||
import { IsEnum, IsString, ValidateNested } from "class-validator";
|
||||
|
||||
import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants";
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
import { OrgTeamOutputDto } from "@calcom/platform-types";
|
||||
|
||||
export class OrgMeTeamOutputDto extends OrgTeamOutputDto {
|
||||
|
||||
+2
-1
@@ -1,7 +1,8 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { IsBoolean, IsOptional, IsEnum, IsInt } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class CreateOrgTeamMembershipDto {
|
||||
@IsInt()
|
||||
@ApiProperty()
|
||||
|
||||
+2
-1
@@ -1,7 +1,8 @@
|
||||
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { IsBoolean, IsOptional, IsEnum } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class UpdateOrgTeamMembershipDto {
|
||||
@IsOptional()
|
||||
@IsBoolean()
|
||||
|
||||
+2
-1
@@ -1,8 +1,9 @@
|
||||
import { CreateUserInput } from "@/modules/users/inputs/create-user.input";
|
||||
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { IsString, IsOptional, IsBoolean, IsEnum } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class CreateOrganizationUserInput extends CreateUserInput {
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
|
||||
+2
-1
@@ -4,10 +4,11 @@ import { UpdateOrganizationUserInput } from "@/modules/organizations/users/index
|
||||
import { OrganizationsUsersRepository } from "@/modules/organizations/users/index/organizations-users.repository";
|
||||
import { CreateUserInput } from "@/modules/users/inputs/create-user.input";
|
||||
import { Injectable, ConflictException, ForbiddenException } from "@nestjs/common";
|
||||
import { Team, CreationSource } from "@prisma/client";
|
||||
import { Team } from "@prisma/client";
|
||||
import { plainToInstance } from "class-transformer";
|
||||
|
||||
import { createNewUsersConnectToOrgIfExists } from "@calcom/platform-libraries";
|
||||
import { CreationSource } from "@calcom/platform-libraries";
|
||||
|
||||
@Injectable()
|
||||
export class OrganizationsUsersService {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { IsBoolean, IsOptional, IsEnum, IsInt } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class CreateTeamMembershipInput {
|
||||
@IsInt()
|
||||
@ApiProperty({ type: Number })
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { IsBoolean, IsOptional, IsEnum } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class UpdateTeamMembershipInput {
|
||||
@IsOptional()
|
||||
@IsBoolean()
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { Expose, Transform, Type } from "class-transformer";
|
||||
import { IsBoolean, IsInt, IsObject, IsOptional, IsString, ValidateNested } from "class-validator";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
class MembershipUserOutputDto {
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { Expose, Type } from "class-transformer";
|
||||
import { IsEnum, IsString, ValidateNested } from "class-validator";
|
||||
import { IsEnum, ValidateNested } from "class-validator";
|
||||
|
||||
import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants";
|
||||
import { TeamOutputDto } from "@calcom/platform-types";
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { Expose, Type } from "class-transformer";
|
||||
import { IsEnum, IsString, ValidateNested } from "class-validator";
|
||||
import { IsEnum, ValidateNested } from "class-validator";
|
||||
|
||||
import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants";
|
||||
import { TeamOutputDto } from "@calcom/platform-types";
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { Expose, Type } from "class-transformer";
|
||||
import { IsEnum, IsString, ValidateNested } from "class-validator";
|
||||
import { IsEnum, ValidateNested } from "class-validator";
|
||||
|
||||
import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants";
|
||||
import { TeamOutputDto } from "@calcom/platform-types";
|
||||
|
||||
@@ -4,7 +4,8 @@ import { CreateManagedUserInput } from "@/modules/users/inputs/create-managed-us
|
||||
import { UpdateManagedUserInput } from "@/modules/users/inputs/update-managed-user.input";
|
||||
import { Injectable, NotFoundException } from "@nestjs/common";
|
||||
import type { Profile, User, Team, Prisma } from "@prisma/client";
|
||||
import { CreationSource } from "@prisma/client";
|
||||
|
||||
import { CreationSource } from "@calcom/platform-libraries";
|
||||
|
||||
export type UserWithProfile = User & {
|
||||
movedToProfile?: (Profile & { organization: Pick<Team, "isPlatform" | "id" | "slug" | "name"> }) | null;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ApiProperty, ApiPropertyOptional, PartialType } from "@nestjs/swagger";
|
||||
import { WebhookTriggerEvents } from "@prisma/client";
|
||||
import { IsArray, IsBoolean, IsEnum, IsOptional, IsString } from "class-validator";
|
||||
|
||||
import { WebhookTriggerEvents } from "@calcom/platform-libraries";
|
||||
|
||||
export class CreateWebhookInputDto {
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { WebhookTriggerEvents } from "@prisma/client";
|
||||
import { Expose, Type } from "class-transformer";
|
||||
import { IsBoolean, IsEnum, IsInt, IsString, ValidateNested, IsArray } from "class-validator";
|
||||
|
||||
import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants";
|
||||
import { WebhookTriggerEvents } from "@calcom/platform-libraries";
|
||||
|
||||
export class WebhookOutputDto {
|
||||
@IsInt()
|
||||
|
||||
@@ -33,6 +33,11 @@ import {
|
||||
AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
|
||||
BaseWorkflowTriggerDto,
|
||||
BEFORE_EVENT,
|
||||
BOOKING_NO_SHOW_UPDATED,
|
||||
BOOKING_PAID,
|
||||
BOOKING_PAYMENT_INITIATED,
|
||||
BOOKING_REJECTED,
|
||||
BOOKING_REQUESTED,
|
||||
EVENT_CANCELLED,
|
||||
NEW_EVENT,
|
||||
OnAfterCalVideoGuestsNoShowTriggerDto,
|
||||
@@ -41,6 +46,11 @@ import {
|
||||
OnBeforeEventTriggerDto,
|
||||
OnCancelTriggerDto,
|
||||
OnCreationTriggerDto,
|
||||
OnNoShowUpdateTriggerDto,
|
||||
OnPaidTriggerDto,
|
||||
OnPaymentInitiatedTriggerDto,
|
||||
OnRejectedTriggerDto,
|
||||
OnRequestedTriggerDto,
|
||||
OnRescheduleTriggerDto,
|
||||
RESCHEDULE_EVENT,
|
||||
} from "./workflow-trigger.input";
|
||||
@@ -73,6 +83,11 @@ export type TriggerDtoType =
|
||||
| OnRescheduleTriggerDto
|
||||
| OnCancelTriggerDto
|
||||
| OnAfterCalVideoGuestsNoShowTriggerDto
|
||||
| OnRejectedTriggerDto
|
||||
| OnRequestedTriggerDto
|
||||
| OnPaymentInitiatedTriggerDto
|
||||
| OnPaidTriggerDto
|
||||
| OnNoShowUpdateTriggerDto
|
||||
| OnAfterCalVideoHostsNoShowTriggerDto;
|
||||
|
||||
@ApiExtraModels(
|
||||
@@ -81,6 +96,11 @@ export type TriggerDtoType =
|
||||
OnCancelTriggerDto,
|
||||
OnCreationTriggerDto,
|
||||
OnRescheduleTriggerDto,
|
||||
OnNoShowUpdateTriggerDto,
|
||||
OnRejectedTriggerDto,
|
||||
OnRequestedTriggerDto,
|
||||
OnPaymentInitiatedTriggerDto,
|
||||
OnPaidTriggerDto,
|
||||
OnAfterCalVideoGuestsNoShowTriggerDto,
|
||||
OnAfterCalVideoHostsNoShowTriggerDto,
|
||||
WorkflowEmailAddressStepDto,
|
||||
@@ -112,6 +132,11 @@ export class CreateWorkflowDto {
|
||||
{ $ref: getSchemaPath(OnRescheduleTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnAfterCalVideoGuestsNoShowTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnAfterCalVideoHostsNoShowTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnRejectedTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnRequestedTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnPaidTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnPaymentInitiatedTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnNoShowUpdateTriggerDto) },
|
||||
],
|
||||
})
|
||||
@ValidateNested()
|
||||
@@ -126,6 +151,11 @@ export class CreateWorkflowDto {
|
||||
{ value: OnRescheduleTriggerDto, name: RESCHEDULE_EVENT },
|
||||
{ value: OnAfterCalVideoGuestsNoShowTriggerDto, name: AFTER_GUESTS_CAL_VIDEO_NO_SHOW },
|
||||
{ value: OnAfterCalVideoHostsNoShowTriggerDto, name: AFTER_HOSTS_CAL_VIDEO_NO_SHOW },
|
||||
{ value: OnRequestedTriggerDto, name: BOOKING_REQUESTED },
|
||||
{ value: OnRejectedTriggerDto, name: BOOKING_REJECTED },
|
||||
{ value: OnPaymentInitiatedTriggerDto, name: BOOKING_PAYMENT_INITIATED },
|
||||
{ value: OnPaidTriggerDto, name: BOOKING_PAID },
|
||||
{ value: OnNoShowUpdateTriggerDto, name: BOOKING_NO_SHOW_UPDATED },
|
||||
],
|
||||
},
|
||||
})
|
||||
@@ -135,6 +165,11 @@ export class CreateWorkflowDto {
|
||||
| OnCreationTriggerDto
|
||||
| OnRescheduleTriggerDto
|
||||
| OnCancelTriggerDto
|
||||
| OnRejectedTriggerDto
|
||||
| OnRequestedTriggerDto
|
||||
| OnPaidTriggerDto
|
||||
| OnPaymentInitiatedTriggerDto
|
||||
| OnNoShowUpdateTriggerDto
|
||||
| OnAfterCalVideoGuestsNoShowTriggerDto
|
||||
| OnAfterCalVideoHostsNoShowTriggerDto;
|
||||
|
||||
|
||||
@@ -36,6 +36,16 @@ import {
|
||||
AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
|
||||
OnAfterCalVideoHostsNoShowTriggerDto,
|
||||
AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
|
||||
OnNoShowUpdateTriggerDto,
|
||||
OnRejectedTriggerDto,
|
||||
OnRequestedTriggerDto,
|
||||
OnPaymentInitiatedTriggerDto,
|
||||
OnPaidTriggerDto,
|
||||
BOOKING_REQUESTED,
|
||||
BOOKING_REJECTED,
|
||||
BOOKING_PAYMENT_INITIATED,
|
||||
BOOKING_PAID,
|
||||
BOOKING_NO_SHOW_UPDATED,
|
||||
} from "./workflow-trigger.input";
|
||||
|
||||
export type UpdateWorkflowStepDto =
|
||||
@@ -119,6 +129,11 @@ export class UpdateWhatsAppAttendeePhoneWorkflowStepDto extends WorkflowPhoneWha
|
||||
OnCancelTriggerDto,
|
||||
OnCreationTriggerDto,
|
||||
OnRescheduleTriggerDto,
|
||||
OnNoShowUpdateTriggerDto,
|
||||
OnRejectedTriggerDto,
|
||||
OnRequestedTriggerDto,
|
||||
OnPaymentInitiatedTriggerDto,
|
||||
OnPaidTriggerDto,
|
||||
OnAfterCalVideoGuestsNoShowTriggerDto,
|
||||
OnAfterCalVideoHostsNoShowTriggerDto,
|
||||
UpdateEmailAddressWorkflowStepDto,
|
||||
@@ -155,6 +170,11 @@ export class UpdateWorkflowDto {
|
||||
{ $ref: getSchemaPath(OnRescheduleTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnAfterCalVideoGuestsNoShowTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnAfterCalVideoHostsNoShowTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnRejectedTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnRequestedTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnPaidTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnPaymentInitiatedTriggerDto) },
|
||||
{ $ref: getSchemaPath(OnNoShowUpdateTriggerDto) },
|
||||
],
|
||||
})
|
||||
@IsOptional()
|
||||
@@ -170,6 +190,11 @@ export class UpdateWorkflowDto {
|
||||
{ value: OnRescheduleTriggerDto, name: RESCHEDULE_EVENT },
|
||||
{ value: OnAfterCalVideoGuestsNoShowTriggerDto, name: AFTER_GUESTS_CAL_VIDEO_NO_SHOW },
|
||||
{ value: OnAfterCalVideoHostsNoShowTriggerDto, name: AFTER_HOSTS_CAL_VIDEO_NO_SHOW },
|
||||
{ value: OnRequestedTriggerDto, name: BOOKING_REQUESTED },
|
||||
{ value: OnRejectedTriggerDto, name: BOOKING_REJECTED },
|
||||
{ value: OnPaymentInitiatedTriggerDto, name: BOOKING_PAYMENT_INITIATED },
|
||||
{ value: OnPaidTriggerDto, name: BOOKING_PAID },
|
||||
{ value: OnNoShowUpdateTriggerDto, name: BOOKING_NO_SHOW_UPDATED },
|
||||
],
|
||||
},
|
||||
})
|
||||
@@ -179,6 +204,11 @@ export class UpdateWorkflowDto {
|
||||
| OnCreationTriggerDto
|
||||
| OnRescheduleTriggerDto
|
||||
| OnCancelTriggerDto
|
||||
| OnRejectedTriggerDto
|
||||
| OnRequestedTriggerDto
|
||||
| OnPaidTriggerDto
|
||||
| OnPaymentInitiatedTriggerDto
|
||||
| OnNoShowUpdateTriggerDto
|
||||
| OnAfterCalVideoGuestsNoShowTriggerDto
|
||||
| OnAfterCalVideoHostsNoShowTriggerDto;
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { WorkflowActions, WorkflowTemplates } from "@prisma/client";
|
||||
import { Type } from "class-transformer";
|
||||
import { IsNumber, IsBoolean, IsString, ValidateNested, IsIn } from "class-validator";
|
||||
|
||||
import { WorkflowActions, WorkflowTemplates } from "@calcom/platform-libraries";
|
||||
|
||||
export const EMAIL_HOST = "email_host";
|
||||
export const EMAIL_ATTENDEE = "email_attendee";
|
||||
export const EMAIL_ADDRESS = "email_address";
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { TimeUnit, WorkflowTriggerEvents } from "@prisma/client";
|
||||
import { Type } from "class-transformer";
|
||||
import { IsIn, IsNumber, IsString, ValidateNested } from "class-validator";
|
||||
|
||||
import { TimeUnit, WorkflowTriggerEvents } from "@calcom/platform-libraries";
|
||||
|
||||
export const BEFORE_EVENT = "beforeEvent";
|
||||
export const EVENT_CANCELLED = "eventCancelled";
|
||||
export const NEW_EVENT = "newEvent";
|
||||
@@ -10,6 +11,11 @@ export const AFTER_EVENT = "afterEvent";
|
||||
export const RESCHEDULE_EVENT = "rescheduleEvent";
|
||||
export const AFTER_HOSTS_CAL_VIDEO_NO_SHOW = "afterHostsCalVideoNoShow";
|
||||
export const AFTER_GUESTS_CAL_VIDEO_NO_SHOW = "afterGuestsCalVideoNoShow";
|
||||
export const BOOKING_REJECTED = "bookingRejected";
|
||||
export const BOOKING_REQUESTED = "bookingRequested";
|
||||
export const BOOKING_PAYMENT_INITIATED = "bookingPaymentInitiated";
|
||||
export const BOOKING_PAID = "bookingPaid";
|
||||
export const BOOKING_NO_SHOW_UPDATED = "bookingNoShowUpdated";
|
||||
export const WORKFLOW_TRIGGER_TYPES = [
|
||||
BEFORE_EVENT,
|
||||
EVENT_CANCELLED,
|
||||
@@ -18,6 +24,11 @@ export const WORKFLOW_TRIGGER_TYPES = [
|
||||
RESCHEDULE_EVENT,
|
||||
AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
|
||||
AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
|
||||
BOOKING_REJECTED,
|
||||
BOOKING_REQUESTED,
|
||||
BOOKING_PAYMENT_INITIATED,
|
||||
BOOKING_PAID,
|
||||
BOOKING_NO_SHOW_UPDATED,
|
||||
] as const;
|
||||
|
||||
export const WORKFLOW_TRIGGER_TO_ENUM = {
|
||||
@@ -28,6 +39,11 @@ export const WORKFLOW_TRIGGER_TO_ENUM = {
|
||||
[RESCHEDULE_EVENT]: WorkflowTriggerEvents.RESCHEDULE_EVENT,
|
||||
[AFTER_HOSTS_CAL_VIDEO_NO_SHOW]: WorkflowTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
|
||||
[AFTER_GUESTS_CAL_VIDEO_NO_SHOW]: WorkflowTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
|
||||
[BOOKING_REJECTED]: WorkflowTriggerEvents.BOOKING_REJECTED,
|
||||
[BOOKING_REQUESTED]: WorkflowTriggerEvents.BOOKING_REQUESTED,
|
||||
[BOOKING_PAYMENT_INITIATED]: WorkflowTriggerEvents.BOOKING_PAYMENT_INITIATED,
|
||||
[BOOKING_NO_SHOW_UPDATED]: WorkflowTriggerEvents.BOOKING_NO_SHOW_UPDATED,
|
||||
[BOOKING_PAID]: WorkflowTriggerEvents.BOOKING_PAID,
|
||||
} as const;
|
||||
|
||||
export const ENUM_TO_WORKFLOW_TRIGGER = {
|
||||
@@ -38,6 +54,11 @@ export const ENUM_TO_WORKFLOW_TRIGGER = {
|
||||
[WorkflowTriggerEvents.RESCHEDULE_EVENT]: RESCHEDULE_EVENT,
|
||||
[WorkflowTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW]: AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
|
||||
[WorkflowTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW]: AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
|
||||
[WorkflowTriggerEvents.BOOKING_REJECTED]: BOOKING_REJECTED,
|
||||
[WorkflowTriggerEvents.BOOKING_REQUESTED]: BOOKING_REQUESTED,
|
||||
[WorkflowTriggerEvents.BOOKING_PAYMENT_INITIATED]: BOOKING_PAYMENT_INITIATED,
|
||||
[WorkflowTriggerEvents.BOOKING_PAID]: BOOKING_PAID,
|
||||
[WorkflowTriggerEvents.BOOKING_NO_SHOW_UPDATED]: BOOKING_NO_SHOW_UPDATED,
|
||||
} as const;
|
||||
|
||||
export const HOUR = "hour";
|
||||
@@ -108,6 +129,41 @@ export class OnCancelTriggerDto {
|
||||
type: typeof EVENT_CANCELLED = EVENT_CANCELLED;
|
||||
}
|
||||
|
||||
export class OnRejectedTriggerDto {
|
||||
@ApiProperty({
|
||||
description: "Trigger type for the workflow",
|
||||
})
|
||||
type: typeof BOOKING_REJECTED = BOOKING_REJECTED;
|
||||
}
|
||||
|
||||
export class OnRequestedTriggerDto {
|
||||
@ApiProperty({
|
||||
description: "Trigger type for the workflow",
|
||||
})
|
||||
type: typeof BOOKING_REQUESTED = BOOKING_REQUESTED;
|
||||
}
|
||||
|
||||
export class OnPaymentInitiatedTriggerDto {
|
||||
@ApiProperty({
|
||||
description: "Trigger type for the workflow",
|
||||
})
|
||||
type: typeof BOOKING_PAYMENT_INITIATED = BOOKING_PAYMENT_INITIATED;
|
||||
}
|
||||
|
||||
export class OnPaidTriggerDto {
|
||||
@ApiProperty({
|
||||
description: "Trigger type for the workflow",
|
||||
})
|
||||
type: typeof BOOKING_PAID = BOOKING_PAID;
|
||||
}
|
||||
|
||||
export class OnNoShowUpdateTriggerDto {
|
||||
@ApiProperty({
|
||||
description: "Trigger type for the workflow",
|
||||
})
|
||||
type: typeof BOOKING_NO_SHOW_UPDATED = BOOKING_NO_SHOW_UPDATED;
|
||||
}
|
||||
|
||||
export class TriggerOffsetDTO {
|
||||
@ApiProperty({
|
||||
description: "Offset before/after the trigger time; required for BEFORE_EVENT and AFTER_EVENT only",
|
||||
|
||||
@@ -2,11 +2,12 @@ import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
|
||||
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
|
||||
import { UserWithProfile } from "@/modules/users/users.repository";
|
||||
import { Injectable } from "@nestjs/common";
|
||||
import { TimeUnit, Workflow, WorkflowStep, WorkflowTriggerEvents } from "@prisma/client";
|
||||
|
||||
import { TimeUnit, WorkflowTriggerEvents } from "@calcom/platform-libraries";
|
||||
import { TUpdateInputSchema } from "@calcom/platform-libraries/workflows";
|
||||
import { updateWorkflow } from "@calcom/platform-libraries/workflows";
|
||||
import { PrismaClient } from "@calcom/prisma";
|
||||
import type { Workflow, WorkflowStep } from "@calcom/prisma/client";
|
||||
|
||||
export type WorkflowType = Workflow & { activeOn: { eventTypeId: number }[]; steps: WorkflowStep[] };
|
||||
|
||||
|
||||
@@ -9132,6 +9132,8 @@
|
||||
{
|
||||
"name": "credentialId",
|
||||
"in": "query",
|
||||
"description": "The ID of the user's calendar credential used to access the calendar. Retrieve this from your connected calendar credentials via the `/v2/credentials` endpoint.",
|
||||
"example": 135,
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "number"
|
||||
@@ -9140,6 +9142,8 @@
|
||||
{
|
||||
"name": "externalId",
|
||||
"in": "query",
|
||||
"description": "The external calendar identifier from the calendar provider (e.g., email address for Google Calendar). This is returned when listing connected calendars.",
|
||||
"example": "user@gmail.com",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "string"
|
||||
@@ -22554,7 +22558,12 @@
|
||||
"afterEvent",
|
||||
"rescheduleEvent",
|
||||
"afterHostsCalVideoNoShow",
|
||||
"afterGuestsCalVideoNoShow"
|
||||
"afterGuestsCalVideoNoShow",
|
||||
"bookingRejected",
|
||||
"bookingRequested",
|
||||
"bookingPaymentInitiated",
|
||||
"bookingPaid",
|
||||
"bookingNoShowUpdated"
|
||||
]
|
||||
},
|
||||
"offset": {
|
||||
@@ -22923,6 +22932,71 @@
|
||||
"type"
|
||||
]
|
||||
},
|
||||
"OnNoShowUpdateTriggerDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"default": "bookingNoShowUpdated",
|
||||
"description": "Trigger type for the workflow"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
]
|
||||
},
|
||||
"OnRejectedTriggerDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"default": "bookingRejected",
|
||||
"description": "Trigger type for the workflow"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
]
|
||||
},
|
||||
"OnRequestedTriggerDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"default": "bookingRequested",
|
||||
"description": "Trigger type for the workflow"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
]
|
||||
},
|
||||
"OnPaymentInitiatedTriggerDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"default": "bookingPaymentInitiated",
|
||||
"description": "Trigger type for the workflow"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
]
|
||||
},
|
||||
"OnPaidTriggerDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"default": "bookingPaid",
|
||||
"description": "Trigger type for the workflow"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
]
|
||||
},
|
||||
"OnAfterCalVideoGuestsNoShowTriggerDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -23642,6 +23716,21 @@
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnAfterCalVideoHostsNoShowTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnRejectedTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnRequestedTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnPaidTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnPaymentInitiatedTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnNoShowUpdateTriggerDto"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -24298,6 +24387,21 @@
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnAfterCalVideoHostsNoShowTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnRejectedTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnRequestedTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnPaidTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnPaymentInitiatedTriggerDto"
|
||||
},
|
||||
{
|
||||
"$ref": "#/components/schemas/OnNoShowUpdateTriggerDto"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
|
||||
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
|
||||
import { TestingModule } from "@nestjs/testing";
|
||||
import { Membership, MembershipRole, Prisma, Team, User } from "@prisma/client";
|
||||
import { Membership, Prisma, Team, User } from "@prisma/client";
|
||||
|
||||
import { MembershipRole } from "@calcom/platform-libraries";
|
||||
|
||||
export class MembershipRepositoryFixture {
|
||||
private prismaReadClient: PrismaReadService["prisma"];
|
||||
|
||||
@@ -3,7 +3,7 @@ import { _generateMetadata, getTranslate } from "app/_utils";
|
||||
import Link from "next/link";
|
||||
import { z } from "zod";
|
||||
|
||||
import { IdentityProvider } from "@calcom/prisma/client";
|
||||
import { IdentityProvider } from "@calcom/prisma/enums";
|
||||
import { Button } from "@calcom/ui/components/button";
|
||||
import { Icon } from "@calcom/ui/components/icon";
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import { verifyPassword } from "@calcom/features/auth/lib/verifyPassword";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { totpAuthenticatorCheck } from "@calcom/lib/totp";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { IdentityProvider } from "@calcom/prisma/client";
|
||||
import { IdentityProvider } from "@calcom/prisma/enums";
|
||||
|
||||
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
|
||||
|
||||
|
||||
@@ -3,9 +3,10 @@ import { useRouter } from "next/navigation";
|
||||
import type { IframeHTMLAttributes } from "react";
|
||||
import React, { useEffect, useState } from "react";
|
||||
|
||||
import { AppDependencyComponent } from "@calcom/app-store/AppDependencyComponent";
|
||||
import { InstallAppButton } from "@calcom/app-store/InstallAppButton";
|
||||
import { isRedirectApp } from "@calcom/app-store/_utils/redirectApps";
|
||||
import useAddAppMutation from "@calcom/app-store/_utils/useAddAppMutation";
|
||||
import { AppDependencyComponent, InstallAppButton } from "@calcom/app-store/components";
|
||||
import { doesAppSupportTeamInstall, isConferencing } from "@calcom/app-store/utils";
|
||||
import DisconnectIntegration from "@calcom/features/apps/components/DisconnectIntegration";
|
||||
import { AppOnboardingSteps } from "@calcom/lib/apps/appOnboardingSteps";
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, Suspense } from "react";
|
||||
|
||||
import { InstallAppButton } from "@calcom/app-store/components";
|
||||
import { InstallAppButton } from "@calcom/app-store/InstallAppButton";
|
||||
import { DestinationCalendarSettingsWebWrapper } from "@calcom/atoms/destination-calendar/wrappers/DestinationCalendarSettingsWebWrapper";
|
||||
import { SelectedCalendarsSettingsWebWrapper } from "@calcom/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper";
|
||||
import AppListCard from "@calcom/features/apps/components/AppListCard";
|
||||
|
||||
@@ -10,7 +10,7 @@ import Locations from "@calcom/features/eventtypes/components/locations/Location
|
||||
import type { LocationFormValues } from "@calcom/features/eventtypes/lib/types";
|
||||
import type { SingleValueLocationOption } from "@calcom/features/form/components/LocationSelect";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { SchedulingType } from "@calcom/prisma/client";
|
||||
import { SchedulingType } from "@calcom/prisma/enums";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Label } from "@calcom/ui/components/form";
|
||||
import { Skeleton, SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton";
|
||||
|
||||
@@ -6,10 +6,11 @@ import { sdkActionManager } from "@calcom/embed-core/embed-iframe";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { useRefreshData } from "@calcom/lib/hooks/useRefreshData";
|
||||
import { useTelemetry } from "@calcom/lib/hooks/useTelemetry";
|
||||
import { shouldChargeNoShowCancellationFee } from "@calcom/lib/payment/shouldChargeNoShowCancellationFee";
|
||||
import { collectPageParameters, telemetryEventTypes } from "@calcom/lib/telemetry";
|
||||
import type { RecurringEvent } from "@calcom/types/Calendar";
|
||||
import { Button } from "@calcom/ui/components/button";
|
||||
import { Label, Select, TextArea } from "@calcom/ui/components/form";
|
||||
import { Label, Select, TextArea, CheckboxField } from "@calcom/ui/components/form";
|
||||
import { Icon } from "@calcom/ui/components/icon";
|
||||
|
||||
interface InternalNotePresetsSelectProps {
|
||||
@@ -76,6 +77,12 @@ type Props = {
|
||||
title?: string;
|
||||
uid?: string;
|
||||
id?: number;
|
||||
startTime: Date;
|
||||
payment?: {
|
||||
amount: number;
|
||||
currency: string;
|
||||
appId: string | null;
|
||||
} | null;
|
||||
};
|
||||
profile: {
|
||||
name: string | null;
|
||||
@@ -100,6 +107,7 @@ type Props = {
|
||||
};
|
||||
isHost: boolean;
|
||||
internalNotePresets: { id: number; name: string; cancellationReason: string | null }[];
|
||||
eventTypeMetadata?: Record<string, unknown> | null;
|
||||
};
|
||||
|
||||
export default function CancelBooking(props: Props) {
|
||||
@@ -112,13 +120,48 @@ export default function CancelBooking(props: Props) {
|
||||
seatReferenceUid,
|
||||
bookingCancelledEventProps,
|
||||
currentUserEmail,
|
||||
teamId,
|
||||
eventTypeMetadata,
|
||||
} = props;
|
||||
const [loading, setLoading] = useState(false);
|
||||
const telemetry = useTelemetry();
|
||||
const [error, setError] = useState<string | null>(booking ? null : t("booking_already_cancelled"));
|
||||
const [internalNote, setInternalNote] = useState<{ id: number; name: string } | null>(null);
|
||||
const [acknowledgeCancellationNoShowFee, setAcknowledgeCancellationNoShowFee] = useState(false);
|
||||
|
||||
const getAppMetadata = (appId: string): Record<string, unknown> | null => {
|
||||
if (!eventTypeMetadata?.apps || !appId) return null;
|
||||
const apps = eventTypeMetadata.apps as Record<string, unknown>;
|
||||
return (apps[appId] as Record<string, unknown>) || null;
|
||||
};
|
||||
|
||||
const timeValue = booking?.payment?.appId
|
||||
? (getAppMetadata(booking.payment.appId) as Record<string, unknown> | null)?.autoChargeNoShowFeeTimeValue
|
||||
: null;
|
||||
const timeUnit = booking?.payment?.appId
|
||||
? (getAppMetadata(booking.payment.appId) as Record<string, unknown> | null)?.autoChargeNoShowFeeTimeUnit
|
||||
: null;
|
||||
|
||||
const autoChargeNoShowFee = () => {
|
||||
if (props.isHost) return false; // Hosts/organizers are exempt
|
||||
|
||||
if (!booking?.startTime) return false;
|
||||
|
||||
if (!booking?.payment) return false;
|
||||
|
||||
return shouldChargeNoShowCancellationFee({
|
||||
eventTypeMetadata: eventTypeMetadata || null,
|
||||
booking,
|
||||
payment: booking.payment,
|
||||
});
|
||||
};
|
||||
|
||||
const cancellationNoShowFeeWarning = autoChargeNoShowFee();
|
||||
|
||||
const hostMissingCancellationReason =
|
||||
props.isHost &&
|
||||
(!cancellationReason?.trim() || (props.internalNotePresets.length > 0 && !internalNote?.id));
|
||||
const cancellationNoShowFeeNotAcknowledged =
|
||||
!props.isHost && cancellationNoShowFeeWarning && !acknowledgeCancellationNoShowFee;
|
||||
const cancelBookingRef = useCallback((node: HTMLTextAreaElement) => {
|
||||
if (node !== null) {
|
||||
// eslint-disable-next-line @calcom/eslint/no-scroll-into-view-embed -- CancelBooking is not usually used in embed mode
|
||||
@@ -187,6 +230,23 @@ export default function CancelBooking(props: Props) {
|
||||
</p>
|
||||
</div>
|
||||
) : null}
|
||||
{cancellationNoShowFeeWarning && booking?.payment && (
|
||||
<div>
|
||||
<div className="bg-attention mb-5 rounded-md p-3">
|
||||
<CheckboxField
|
||||
description={t("cancel_booking_acknowledge_no_show_fee", {
|
||||
timeValue,
|
||||
timeUnit,
|
||||
amount: booking.payment.amount / 100,
|
||||
formatParams: { amount: { currency: booking.payment.currency } },
|
||||
})}
|
||||
onChange={(e) => setAcknowledgeCancellationNoShowFee(e.target.checked)}
|
||||
descriptionClassName="text-info font-semibold"
|
||||
/>
|
||||
<p className="text-subtle ml-9 mt-2 text-sm">{t("contact_organizer")}</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className="flex flex-col-reverse rtl:space-x-reverse ">
|
||||
<div className="ml-auto flex w-full space-x-4 ">
|
||||
<Button
|
||||
@@ -197,10 +257,7 @@ export default function CancelBooking(props: Props) {
|
||||
</Button>
|
||||
<Button
|
||||
data-testid="confirm_cancel"
|
||||
disabled={
|
||||
props.isHost &&
|
||||
(!cancellationReason?.trim() || (props.internalNotePresets.length > 0 && !internalNote?.id))
|
||||
}
|
||||
disabled={hostMissingCancellationReason || cancellationNoShowFeeNotAcknowledged}
|
||||
onClick={async () => {
|
||||
setLoading(true);
|
||||
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
import { render, screen } from "@testing-library/react";
|
||||
import * as React from "react";
|
||||
import { describe, expect, it, vi, beforeAll } from "vitest";
|
||||
|
||||
import * as shouldChargeModule from "@calcom/lib/payment/shouldChargeNoShowCancellationFee";
|
||||
|
||||
import CancelBooking from "../CancelBooking";
|
||||
|
||||
beforeAll(() => {
|
||||
Element.prototype.scrollIntoView = vi.fn();
|
||||
});
|
||||
|
||||
vi.mock("@calcom/trpc", () => ({
|
||||
trpc: {
|
||||
viewer: {
|
||||
bookings: {
|
||||
requestReschedule: {
|
||||
useMutation: () => ({
|
||||
mutate: vi.fn(),
|
||||
isLoading: false,
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}));
|
||||
|
||||
vi.mock("next-i18next", () => ({
|
||||
useTranslation: () => ({
|
||||
t: (key: string, options?: Record<string, unknown>) => {
|
||||
if (key === "cancellation_fee_warning_cancel") {
|
||||
const opts = options as {
|
||||
time?: string;
|
||||
unit?: string;
|
||||
amount?: number;
|
||||
formatParams?: { amount?: { currency?: string } };
|
||||
};
|
||||
return `Cancelling within ${opts?.time} ${opts?.unit} will result in a ${opts?.amount} ${opts?.formatParams?.amount?.currency} cancellation fee being charged to your card.`;
|
||||
}
|
||||
return key;
|
||||
},
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("@calcom/lib/hooks/useLocale", () => ({
|
||||
useLocale: () => ({
|
||||
t: (key: string, options?: Record<string, unknown>) => {
|
||||
if (key === "cancel_booking_acknowledge_no_show_fee") {
|
||||
const opts = options as {
|
||||
timeValue?: number;
|
||||
timeUnit?: string;
|
||||
amount?: number;
|
||||
formatParams?: { amount?: { currency?: string } };
|
||||
};
|
||||
return `I acknowledge that cancelling within ${opts?.timeValue} ${opts?.timeUnit} will result in a ${opts?.amount} ${opts?.formatParams?.amount?.currency} cancellation fee being charged to my card.`;
|
||||
}
|
||||
return key;
|
||||
},
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("@calcom/lib/hooks/useTelemetry", () => ({
|
||||
useTelemetry: () => ({
|
||||
event: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("@calcom/lib/hooks/useRefreshData", () => ({
|
||||
useRefreshData: () => vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock("next/router", () => ({
|
||||
useRouter: () => ({
|
||||
push: vi.fn(),
|
||||
query: {},
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("@calcom/lib/payment/shouldChargeNoShowCancellationFee", () => ({
|
||||
shouldChargeNoShowCancellationFee: vi.fn(),
|
||||
}));
|
||||
|
||||
const mockBookingWithCancellationFee = {
|
||||
uid: "test-booking-uid",
|
||||
title: "Test Meeting",
|
||||
id: 123,
|
||||
startTime: new Date(Date.now() + 30 * 60 * 1000),
|
||||
payment: {
|
||||
amount: 1000,
|
||||
currency: "usd",
|
||||
appId: "stripe",
|
||||
},
|
||||
};
|
||||
|
||||
const mockEventTypeMetadataWithFee = {
|
||||
apps: {
|
||||
stripe: {
|
||||
autoChargeNoShowFeeIfCancelled: true,
|
||||
autoChargeNoShowFeeTimeValue: 1,
|
||||
autoChargeNoShowFeeTimeUnit: "hours" as const,
|
||||
paymentOption: "HOLD" as const,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const mockEventTypeMetadataWithoutFee = {
|
||||
apps: {
|
||||
stripe: {
|
||||
autoChargeNoShowFeeIfCancelled: true,
|
||||
autoChargeNoShowFeeTimeValue: 1,
|
||||
autoChargeNoShowFeeTimeUnit: "hours" as const,
|
||||
paymentOption: "HOLD" as const,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const mockProps = {
|
||||
recurringEvent: null,
|
||||
setIsCancellationMode: vi.fn(),
|
||||
theme: "light",
|
||||
allRemainingBookings: false,
|
||||
seatReferenceUid: undefined,
|
||||
currentUserEmail: "test@example.com",
|
||||
bookingCancelledEventProps: {
|
||||
booking: {},
|
||||
organizer: {
|
||||
name: "Test Organizer",
|
||||
email: "organizer@example.com",
|
||||
timeZone: "UTC",
|
||||
},
|
||||
eventType: {},
|
||||
},
|
||||
internalNotePresets: [],
|
||||
};
|
||||
|
||||
const mockBookingWithoutCancellationFee = {
|
||||
uid: "test-booking-uid-2",
|
||||
title: "Test Meeting 2",
|
||||
id: 124,
|
||||
startTime: new Date(Date.now() + 2 * 60 * 60 * 1000),
|
||||
payment: {
|
||||
amount: 1000,
|
||||
currency: "usd",
|
||||
appId: "stripe",
|
||||
},
|
||||
};
|
||||
|
||||
describe("CancelBooking Cancellation Fee Warning", () => {
|
||||
it("should show cancellation fee warning when booking is within time threshold", () => {
|
||||
vi.mocked(shouldChargeModule.shouldChargeNoShowCancellationFee).mockReturnValue(true);
|
||||
|
||||
render(
|
||||
<CancelBooking
|
||||
booking={mockBookingWithCancellationFee}
|
||||
profile={{ name: "Test User", slug: "test-user" }}
|
||||
team={null}
|
||||
isHost={false}
|
||||
eventTypeMetadata={mockEventTypeMetadataWithFee}
|
||||
{...mockProps}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.getByText(/I acknowledge that cancelling within 1 hours will result in a/)
|
||||
).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("should not show cancellation fee warning when booking is outside time threshold", () => {
|
||||
vi.mocked(shouldChargeModule.shouldChargeNoShowCancellationFee).mockReturnValue(false);
|
||||
|
||||
render(
|
||||
<CancelBooking
|
||||
booking={mockBookingWithoutCancellationFee}
|
||||
profile={{ name: "Test User", slug: "test-user" }}
|
||||
team={null}
|
||||
isHost={false}
|
||||
eventTypeMetadata={mockEventTypeMetadataWithoutFee}
|
||||
{...mockProps}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(screen.queryByText(/I acknowledge that cancelling within/)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("should not show cancellation fee warning when user is host", () => {
|
||||
vi.mocked(shouldChargeModule.shouldChargeNoShowCancellationFee).mockReturnValue(false);
|
||||
|
||||
render(
|
||||
<CancelBooking
|
||||
booking={mockBookingWithCancellationFee}
|
||||
profile={{ name: "Test User", slug: "test-user" }}
|
||||
team={null}
|
||||
isHost={true}
|
||||
eventTypeMetadata={mockEventTypeMetadataWithFee}
|
||||
{...mockProps}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(screen.queryByText(/I acknowledge that cancelling within/)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("should not show cancellation fee warning when cancellation fee is disabled", () => {
|
||||
const eventTypeMetadataWithDisabledFee = {
|
||||
apps: {
|
||||
stripe: {
|
||||
autoChargeNoShowFeeIfCancelled: false,
|
||||
autoChargeNoShowFeeTimeValue: 1,
|
||||
autoChargeNoShowFeeTimeUnit: "hours" as const,
|
||||
paymentOption: "HOLD" as const,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
vi.mocked(shouldChargeModule.shouldChargeNoShowCancellationFee).mockReturnValue(false);
|
||||
|
||||
render(
|
||||
<CancelBooking
|
||||
booking={mockBookingWithCancellationFee}
|
||||
profile={{ name: "Test User", slug: "test-user" }}
|
||||
team={null}
|
||||
isHost={false}
|
||||
eventTypeMetadata={eventTypeMetadataWithDisabledFee}
|
||||
{...mockProps}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(screen.queryByText(/I acknowledge that cancelling within/)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("should not show cancellation fee warning when payment option is not HOLD", () => {
|
||||
const eventTypeMetadataWithOnBookingPayment = {
|
||||
apps: {
|
||||
stripe: {
|
||||
autoChargeNoShowFeeIfCancelled: true,
|
||||
autoChargeNoShowFeeTimeValue: 1,
|
||||
autoChargeNoShowFeeTimeUnit: "hours" as const,
|
||||
paymentOption: "ON_BOOKING" as const,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
vi.mocked(shouldChargeModule.shouldChargeNoShowCancellationFee).mockReturnValue(false);
|
||||
|
||||
render(
|
||||
<CancelBooking
|
||||
booking={mockBookingWithCancellationFee}
|
||||
profile={{ name: "Test User", slug: "test-user" }}
|
||||
team={null}
|
||||
isHost={false}
|
||||
eventTypeMetadata={eventTypeMetadataWithOnBookingPayment}
|
||||
{...mockProps}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(screen.queryByText(/I acknowledge that cancelling within/)).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
@@ -1,8 +1,8 @@
|
||||
import Link from "next/link";
|
||||
import { useState } from "react";
|
||||
|
||||
import { InstallAppButtonWithoutPlanCheck } from "@calcom/app-store/InstallAppButtonWithoutPlanCheck";
|
||||
import type { TDependencyData } from "@calcom/app-store/_appRegistry";
|
||||
import { InstallAppButtonWithoutPlanCheck } from "@calcom/app-store/components";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
"use client";
|
||||
|
||||
import { signIn } from "next-auth/react";
|
||||
import { useState } from "react";
|
||||
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { getRecentImpersonations, type RecentImpersonation } from "@calcom/lib/recentImpersonations";
|
||||
import { Button } from "@calcom/ui/components/button";
|
||||
import { PanelCard } from "@calcom/ui/components/card";
|
||||
import {
|
||||
TableNew,
|
||||
TableBody,
|
||||
TableCell,
|
||||
TableHead,
|
||||
TableHeader,
|
||||
TableRow,
|
||||
} from "@calcom/ui/components/table";
|
||||
|
||||
interface RecentImpersonationsListProps {
|
||||
onImpersonate?: (username: string) => void;
|
||||
}
|
||||
|
||||
export default function RecentImpersonationsList({ onImpersonate }: RecentImpersonationsListProps) {
|
||||
const { t } = useLocale();
|
||||
const [recentImpersonations] = useState<RecentImpersonation[]>(() => getRecentImpersonations());
|
||||
|
||||
const handleQuickImpersonate = (username: string) => {
|
||||
if (onImpersonate) {
|
||||
onImpersonate(username);
|
||||
} else {
|
||||
signIn("impersonation-auth", {
|
||||
username: username.toLowerCase(),
|
||||
callbackUrl: `${WEBAPP_URL}/event-types`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (recentImpersonations.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<PanelCard title={t("recent_impersonations")}>
|
||||
<div className="overflow-x-auto">
|
||||
<TableNew className="border-0">
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
<TableHead className="w-[40%]">User</TableHead>
|
||||
<TableHead>Impersonated At</TableHead>
|
||||
<TableHead className="text-right">Actions</TableHead>
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{recentImpersonations.map((impersonation) => (
|
||||
<TableRow key={impersonation.username}>
|
||||
<TableCell className="font-medium">{impersonation.username}</TableCell>
|
||||
<TableCell className="text-muted-foreground">
|
||||
{new Date(impersonation.timestamp).toLocaleDateString()}{" "}
|
||||
{new Date(impersonation.timestamp).toLocaleTimeString()}
|
||||
</TableCell>
|
||||
<TableCell className="text-right">
|
||||
<Button
|
||||
type="button"
|
||||
color="secondary"
|
||||
size="sm"
|
||||
onClick={() => handleQuickImpersonate(impersonation.username)}
|
||||
data-testid={`quick-impersonate-${impersonation.username}`}>
|
||||
{t("quick_impersonate")}
|
||||
</Button>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
))}
|
||||
</TableBody>
|
||||
</TableNew>
|
||||
</div>
|
||||
</PanelCard>
|
||||
);
|
||||
}
|
||||
@@ -3,7 +3,7 @@ import type { ParsedUrlQuery } from "querystring";
|
||||
import { vi, describe, it, expect, beforeEach, afterEach } from "vitest";
|
||||
|
||||
import * as constants from "@calcom/lib/constants";
|
||||
import { RedirectType } from "@calcom/prisma/client";
|
||||
import { RedirectType } from "@calcom/prisma/enums";
|
||||
|
||||
import { handleOrgRedirect, getRedirectWithOriginAndSearchString } from "./handleOrgRedirect";
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import { organizationScenarios } from "@calcom/lib/server/repository/__mocks__/o
|
||||
|
||||
import { describe, it, expect, beforeEach, vi } from "vitest";
|
||||
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { CreationSource } from "@calcom/prisma/enums";
|
||||
import { inviteMembersWithNoInviterPermissionCheck } from "@calcom/trpc/server/routers/viewer/teams/inviteMember/inviteMember.handler";
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { IS_STRIPE_ENABLED } from "@calcom/lib/constants";
|
||||
import { OrganizationRepository } from "@calcom/lib/server/repository/organization";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { CreationSource } from "@calcom/prisma/enums";
|
||||
import { userMetadata } from "@calcom/prisma/zod-utils";
|
||||
import { inviteMembersWithNoInviterPermissionCheck } from "@calcom/trpc/server/routers/viewer/teams/inviteMember/inviteMember.handler";
|
||||
|
||||
@@ -11,7 +11,7 @@ import { getSafe } from "@calcom/lib/getSafe";
|
||||
import { maybeGetBookingUidFromSeat } from "@calcom/lib/server/maybeGetBookingUidFromSeat";
|
||||
import { UserRepository } from "@calcom/lib/server/repository/user";
|
||||
import prisma, { bookingMinimalSelect } from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/client";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
|
||||
const querySchema = z.object({
|
||||
uid: z.string(),
|
||||
|
||||
@@ -12,7 +12,7 @@ import { shouldHideBrandingForTeamEvent } from "@calcom/lib/hideBranding";
|
||||
import slugify from "@calcom/lib/slugify";
|
||||
import prisma from "@calcom/prisma";
|
||||
import type { User } from "@calcom/prisma/client";
|
||||
import { BookingStatus, RedirectType, SchedulingType } from "@calcom/prisma/client";
|
||||
import { BookingStatus, RedirectType, SchedulingType } from "@calcom/prisma/enums";
|
||||
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
|
||||
|
||||
import { handleOrgRedirect } from "@lib/handleOrgRedirect";
|
||||
|
||||
@@ -16,7 +16,7 @@ import slugify from "@calcom/lib/slugify";
|
||||
import { stripMarkdown } from "@calcom/lib/stripMarkdown";
|
||||
import prisma from "@calcom/prisma";
|
||||
import type { Team, OrganizationSettings } from "@calcom/prisma/client";
|
||||
import { RedirectType } from "@calcom/prisma/client";
|
||||
import { RedirectType } from "@calcom/prisma/enums";
|
||||
import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
|
||||
|
||||
import { handleOrgRedirect } from "@lib/handleOrgRedirect";
|
||||
|
||||
@@ -184,6 +184,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
bookingId: bookingInfo.id,
|
||||
},
|
||||
select: {
|
||||
appId: true,
|
||||
success: true,
|
||||
refunded: true,
|
||||
currency: true,
|
||||
|
||||
@@ -867,7 +867,10 @@ export default function Success(props: PageProps) {
|
||||
uid: bookingInfo?.uid,
|
||||
title: bookingInfo?.title,
|
||||
id: bookingInfo?.id,
|
||||
startTime: bookingInfo?.startTime,
|
||||
payment: props.paymentStatus,
|
||||
}}
|
||||
eventTypeMetadata={eventType.metadata}
|
||||
profile={{ name: props.profile.name, slug: props.profile.slug }}
|
||||
recurringEvent={eventType.recurringEvent}
|
||||
team={eventType?.team?.name}
|
||||
|
||||
@@ -125,6 +125,13 @@ const OnboardingPage = (props: PageProps) => {
|
||||
};
|
||||
const currentStepIndex = steps.indexOf(currentStep);
|
||||
|
||||
const goToStep = (step: number) => {
|
||||
const newStep = steps[step];
|
||||
startTransition(() => {
|
||||
router.push(`/getting-started/${stepTransform(newStep)}`);
|
||||
});
|
||||
};
|
||||
|
||||
const goToNextStep = () => {
|
||||
const nextIndex = currentStepIndex + 1;
|
||||
const newStep = steps[nextIndex];
|
||||
@@ -159,7 +166,7 @@ const OnboardingPage = (props: PageProps) => {
|
||||
</p>
|
||||
))}
|
||||
</header>
|
||||
<Steps maxSteps={steps.length} currentStep={currentStepIndex + 1} nextStep={goToNextStep} />
|
||||
<Steps maxSteps={steps.length} currentStep={currentStepIndex + 1} navigateToStep={goToStep} />
|
||||
</div>
|
||||
<StepCard>
|
||||
<Suspense fallback={<Icon name="loader" />}>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage";
|
||||
import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { SMSLockState } from "@calcom/prisma/client";
|
||||
import { SMSLockState } from "@calcom/prisma/enums";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Avatar } from "@calcom/ui/components/avatar";
|
||||
import type { IconName } from "@calcom/ui/components/icon";
|
||||
|
||||
@@ -2,23 +2,29 @@
|
||||
|
||||
import { signIn } from "next-auth/react";
|
||||
import { useSearchParams } from "next/navigation";
|
||||
import { useRef, useEffect } from "react";
|
||||
import { useRef, useEffect, useState } from "react";
|
||||
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { TextField } from "@calcom/ui/components/form";
|
||||
import { addRecentImpersonation } from "@calcom/lib/recentImpersonations";
|
||||
import { Button } from "@calcom/ui/components/button";
|
||||
import { PanelCard } from "@calcom/ui/components/card";
|
||||
import { TextField } from "@calcom/ui/components/form";
|
||||
|
||||
import RecentImpersonationsList from "../../../components/settings/admin/RecentImpersonationsList";
|
||||
|
||||
const ImpersonationView = () => {
|
||||
const { t } = useLocale();
|
||||
const usernameRef = useRef<HTMLInputElement>(null);
|
||||
const searchParams = useSearchParams();
|
||||
const [refreshKey, setRefreshKey] = useState(0);
|
||||
|
||||
const username = searchParams?.get("username")?.toLowerCase();
|
||||
|
||||
useEffect(() => {
|
||||
if (username) {
|
||||
const enteredUsername = username.toLowerCase();
|
||||
addRecentImpersonation(enteredUsername);
|
||||
signIn("impersonation-auth", {
|
||||
username: enteredUsername,
|
||||
callbackUrl: `${WEBAPP_URL}/event-types`,
|
||||
@@ -26,32 +32,52 @@ const ImpersonationView = () => {
|
||||
}
|
||||
}, [username]);
|
||||
|
||||
const handleSubmit = (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
const enteredUsername = usernameRef.current?.value.toLowerCase();
|
||||
if (enteredUsername) {
|
||||
addRecentImpersonation(enteredUsername);
|
||||
setRefreshKey((prev) => prev + 1);
|
||||
signIn("impersonation-auth", {
|
||||
username: enteredUsername,
|
||||
callbackUrl: `${WEBAPP_URL}/event-types`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const handleQuickImpersonate = (username: string) => {
|
||||
if (usernameRef.current) {
|
||||
usernameRef.current.value = username;
|
||||
}
|
||||
addRecentImpersonation(username);
|
||||
setRefreshKey((prev) => prev + 1);
|
||||
signIn("impersonation-auth", {
|
||||
username: username.toLowerCase(),
|
||||
callbackUrl: `${WEBAPP_URL}/event-types`,
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<form
|
||||
className="mb-6 w-full"
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
const enteredUsername = usernameRef.current?.value.toLowerCase();
|
||||
signIn("impersonation-auth", {
|
||||
username: enteredUsername,
|
||||
callbackUrl: `${WEBAPP_URL}/event-types`,
|
||||
});
|
||||
}}>
|
||||
<div className="flex items-center space-x-2 rtl:space-x-reverse">
|
||||
<TextField
|
||||
containerClassName="w-full [&_input:-webkit-autofill]:!shadow-[0_0_0_1000px_white_inset]"
|
||||
name={t("user_impersonation_heading")}
|
||||
addOnLeading={<>{process.env.NEXT_PUBLIC_WEBSITE_URL}/</>}
|
||||
ref={usernameRef}
|
||||
hint={t("impersonate_user_tip")}
|
||||
defaultValue={undefined}
|
||||
data-testid="admin-impersonation-input"
|
||||
/>
|
||||
<Button type="submit" data-testid="impersonation-submit" className="mt-[-8px]">
|
||||
{t("impersonate")}
|
||||
</Button>
|
||||
</div>
|
||||
</form>
|
||||
<div className="flex flex-col gap-4">
|
||||
<PanelCard title={t("user_impersonation_heading")} subtitle={t("impersonate_user_tip")}>
|
||||
<form className="p-4" onSubmit={handleSubmit}>
|
||||
<div className="flex items-center space-x-2 rtl:space-x-reverse">
|
||||
<TextField
|
||||
containerClassName="w-full"
|
||||
name=""
|
||||
addOnLeading={<>{process.env.NEXT_PUBLIC_WEBSITE_URL}/</>}
|
||||
ref={usernameRef}
|
||||
defaultValue={undefined}
|
||||
data-testid="admin-impersonation-input"
|
||||
/>
|
||||
<Button type="submit" data-testid="impersonation-submit">
|
||||
{t("impersonate")}
|
||||
</Button>
|
||||
</div>
|
||||
</form>
|
||||
</PanelCard>
|
||||
<RecentImpersonationsList key={refreshKey} onImpersonate={handleQuickImpersonate} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -511,12 +511,12 @@ const ProfileForm = ({
|
||||
.max(FULL_NAME_LENGTH_MAX_LIMIT, {
|
||||
message: t("max_limit_allowed_hint", { limit: FULL_NAME_LENGTH_MAX_LIMIT }),
|
||||
}),
|
||||
email: emailSchema,
|
||||
email: emailSchema.toLowerCase(),
|
||||
bio: z.string(),
|
||||
secondaryEmails: z.array(
|
||||
z.object({
|
||||
id: z.number(),
|
||||
email: emailSchema,
|
||||
email: emailSchema.toLowerCase(),
|
||||
emailVerified: z.union([z.string(), z.null()]).optional(),
|
||||
emailPrimary: z.boolean().optional(),
|
||||
})
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@calcom/web",
|
||||
"version": "5.6.13",
|
||||
"version": "5.6.14",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"analyze": "ANALYZE=true next build",
|
||||
|
||||
@@ -9,7 +9,7 @@ import dayjs from "@calcom/dayjs";
|
||||
import { intervalLimitKeyToUnit } from "@calcom/lib/intervalLimits/intervalLimit";
|
||||
import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/client";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
import { entries } from "@calcom/prisma/zod-utils";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
|
||||
@@ -4,7 +4,7 @@ import { JSDOM } from "jsdom";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { generateHashedLink } from "@calcom/lib/generateHashedLink";
|
||||
import { randomString } from "@calcom/lib/random";
|
||||
import { SchedulingType } from "@calcom/prisma/client";
|
||||
import { SchedulingType } from "@calcom/prisma/enums";
|
||||
import type { Schedule, TimeRange } from "@calcom/types/schedule";
|
||||
|
||||
import { test, todo } from "./lib/fixtures";
|
||||
|
||||
@@ -2,8 +2,7 @@ import { expect } from "@playwright/test";
|
||||
import type { Page } from "@playwright/test";
|
||||
|
||||
import prisma from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/client";
|
||||
import { MembershipRole, SchedulingType } from "@calcom/prisma/enums";
|
||||
import { BookingStatus, MembershipRole, SchedulingType } from "@calcom/prisma/enums";
|
||||
|
||||
import { addFilter } from "./filter-helpers";
|
||||
import { createTeamEventType } from "./fixtures/users";
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
import { expect } from "@playwright/test";
|
||||
import type Prisma from "@prisma/client";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
import { IS_STRIPE_ENABLED, selectFirstAvailableTimeSlotNextMonth } from "./lib/testUtils";
|
||||
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
test.afterEach(({ users }) => users.deleteAll());
|
||||
|
||||
test.describe("Cancellation Fee Warning E2E", () => {
|
||||
test("Should display cancellation fee warning during booking submission", async ({ page, users }) => {
|
||||
// eslint-disable-next-line playwright/no-skipped-test
|
||||
test.skip(!IS_STRIPE_ENABLED, "It should only run if Stripe is installed");
|
||||
const user = await users.create();
|
||||
const eventType = user.eventTypes.find((e) => e.slug === "paid") as Prisma.EventType;
|
||||
await user.apiLogin();
|
||||
await page.goto("/apps/installed");
|
||||
|
||||
await user.installStripePersonal({ skip: true });
|
||||
await user.setupEventWithPrice(eventType, "stripe");
|
||||
|
||||
await page.goto(`/event-types/${eventType?.id}?tabName=advanced`);
|
||||
|
||||
await page.locator('[data-testid="cancellation-fee-toggle"]').click();
|
||||
await page.locator('[data-testid="cancellation-fee-time-value"]').fill("2");
|
||||
await page.locator('[data-testid="cancellation-fee-time-unit"]').selectOption("hours");
|
||||
|
||||
await page.getByTestId("update-eventtype").click();
|
||||
|
||||
await page.goto(`${user.username}/${eventType?.slug}`);
|
||||
await selectFirstAvailableTimeSlotNextMonth(page);
|
||||
|
||||
await page.fill('[name="name"]', "Test Booker");
|
||||
await page.fill('[name="email"]', "booker@example.com");
|
||||
|
||||
await expect(page.getByText(/I acknowledge that if I cancel within 2 hours/)).toBeVisible();
|
||||
});
|
||||
|
||||
test("Should display cancellation fee warning during cancellation", async ({ page, users }) => {
|
||||
// eslint-disable-next-line playwright/no-skipped-test
|
||||
test.skip(!IS_STRIPE_ENABLED, "It should only run if Stripe is installed");
|
||||
const user = await users.create();
|
||||
const eventType = user.eventTypes.find((e) => e.slug === "paid") as Prisma.EventType;
|
||||
await user.apiLogin();
|
||||
await page.goto("/apps/installed");
|
||||
|
||||
await user.installStripePersonal({ skip: true });
|
||||
await user.setupEventWithPrice(eventType, "stripe");
|
||||
|
||||
await page.goto(`/event-types/${eventType?.id}?tabName=advanced`);
|
||||
|
||||
await page.locator('[data-testid="cancellation-fee-toggle"]').click();
|
||||
await page.locator('[data-testid="cancellation-fee-time-value"]').fill("24");
|
||||
await page.locator('[data-testid="cancellation-fee-time-unit"]').selectOption("hours");
|
||||
|
||||
await page.getByTestId("update-eventtype").click();
|
||||
|
||||
await user.bookAndPayEvent(eventType);
|
||||
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
|
||||
|
||||
await page.goto("/bookings/upcoming");
|
||||
await page.click('[data-testid="cancel"]');
|
||||
|
||||
await expect(page.getByText(/Cancelling within 24 hours will result in a/)).toBeVisible();
|
||||
});
|
||||
|
||||
test("Should not display cancellation fee warning when outside time threshold", async ({ page, users }) => {
|
||||
// eslint-disable-next-line playwright/no-skipped-test
|
||||
test.skip(!IS_STRIPE_ENABLED, "It should only run if Stripe is installed");
|
||||
const user = await users.create();
|
||||
const eventType = user.eventTypes.find((e) => e.slug === "paid") as Prisma.EventType;
|
||||
await user.apiLogin();
|
||||
await page.goto("/apps/installed");
|
||||
|
||||
await user.installStripePersonal({ skip: true });
|
||||
await user.setupEventWithPrice(eventType, "stripe");
|
||||
|
||||
await page.goto(`/event-types/${eventType?.id}?tabName=advanced`);
|
||||
|
||||
await page.locator('[data-testid="cancellation-fee-toggle"]').click();
|
||||
await page.locator('[data-testid="cancellation-fee-time-value"]').fill("1");
|
||||
await page.locator('[data-testid="cancellation-fee-time-unit"]').selectOption("minutes");
|
||||
|
||||
await page.getByTestId("update-eventtype").click();
|
||||
|
||||
await page.goto(`${user.username}/${eventType?.slug}`);
|
||||
await selectFirstAvailableTimeSlotNextMonth(page);
|
||||
|
||||
await page.fill('[name="name"]', "Test Booker");
|
||||
await page.fill('[name="email"]', "booker@example.com");
|
||||
|
||||
await expect(page.getByText(/I acknowledge that if I cancel within/)).toBeHidden();
|
||||
});
|
||||
});
|
||||
@@ -7,7 +7,7 @@ test.describe("Change App Theme Test", () => {
|
||||
const pro = await users.create();
|
||||
await pro.apiLogin();
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
await expect(page.locator('text="Dashboard theme"')).toBeVisible();
|
||||
await expect(page.getByTestId("dashboard-shell").getByText("Dashboard theme")).toBeVisible();
|
||||
await page.click('[data-testid="appTheme-dark"]');
|
||||
await page.click('[data-testid="update-app-theme-btn"]');
|
||||
|
||||
@@ -25,7 +25,7 @@ test.describe("Change App Theme Test", () => {
|
||||
const pro = await users.create();
|
||||
await pro.apiLogin();
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
await expect(page.locator('text="Dashboard theme"')).toBeVisible();
|
||||
await expect(page.getByTestId("dashboard-shell").getByText("Dashboard theme")).toBeVisible();
|
||||
await page.click('[data-testid="appTheme-light"]');
|
||||
await page.click('[data-testid="update-app-theme-btn"]');
|
||||
|
||||
@@ -44,7 +44,7 @@ test.describe("Change App Theme Test", () => {
|
||||
await pro.apiLogin();
|
||||
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
await expect(page.locator('text="Dashboard theme"')).toBeVisible();
|
||||
await expect(page.getByTestId("dashboard-shell").getByText("Dashboard theme")).toBeVisible();
|
||||
await page.click('[data-testid="appTheme-light"]');
|
||||
await page.click('[data-testid="update-app-theme-btn"]');
|
||||
const toast1 = await page.waitForSelector('[data-testid="toast-success"]');
|
||||
@@ -72,7 +72,7 @@ test.describe("Change Booking Page Theme Test", () => {
|
||||
await pro.apiLogin();
|
||||
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
await expect(page.locator('text="Dashboard theme"')).toBeVisible();
|
||||
await expect(page.getByTestId("dashboard-shell").getByText("Dashboard theme")).toBeVisible();
|
||||
|
||||
//Click the "Dark" theme label
|
||||
await page.click('[data-testid="theme-dark"]');
|
||||
@@ -94,7 +94,7 @@ test.describe("Change Booking Page Theme Test", () => {
|
||||
await pro.apiLogin();
|
||||
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
await expect(page.locator('text="Dashboard theme"')).toBeVisible();
|
||||
await expect(page.getByTestId("dashboard-shell").getByText("Dashboard theme")).toBeVisible();
|
||||
|
||||
//Click the "Light" theme label
|
||||
await page.click('[data-testid="theme-light"]');
|
||||
@@ -114,7 +114,7 @@ test.describe("Change Booking Page Theme Test", () => {
|
||||
await pro.apiLogin();
|
||||
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
await expect(page.locator('text="Dashboard theme"')).toBeVisible();
|
||||
await expect(page.getByTestId("dashboard-shell").getByText("Dashboard theme")).toBeVisible();
|
||||
|
||||
await page.click('[data-testid="theme-light"]');
|
||||
await page.click('[data-testid="update-theme-btn"]');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
import {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { parse } from "node-html-parser";
|
||||
|
||||
import { getOrgFullOrigin } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { EMBED_LIB_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import { expect, type Page } from "@playwright/test";
|
||||
|
||||
import prisma from "@calcom/prisma";
|
||||
import { WorkflowTriggerEvents } from "@calcom/prisma/enums";
|
||||
import type { Fixtures } from "@calcom/web/playwright/lib/fixtures";
|
||||
|
||||
import { localize } from "../lib/localize";
|
||||
|
||||
@@ -12,6 +13,8 @@ type CreateWorkflowProps = {
|
||||
trigger?: WorkflowTriggerEvents;
|
||||
};
|
||||
|
||||
const subjectPattern = /^Reminder: /i;
|
||||
|
||||
export function createWorkflowPageFixture(page: Page) {
|
||||
const createWorkflow = async (props: CreateWorkflowProps) => {
|
||||
const { name, isTeam, trigger } = props;
|
||||
@@ -25,8 +28,8 @@ export function createWorkflowPageFixture(page: Page) {
|
||||
await fillNameInput(name);
|
||||
}
|
||||
if (trigger) {
|
||||
page.locator("div").filter({ hasText: WorkflowTriggerEvents.BEFORE_EVENT }).nth(1);
|
||||
page.getByText(trigger);
|
||||
await page.locator("#trigger-select").click();
|
||||
await page.getByTestId(`select-option-${trigger ?? WorkflowTriggerEvents.BEFORE_EVENT}`).click();
|
||||
await selectEventType("30 min");
|
||||
}
|
||||
const workflow = await saveWorkflow();
|
||||
@@ -112,6 +115,20 @@ export function createWorkflowPageFixture(page: Page) {
|
||||
expect(deleteButton.isDisabled()).toBeTruthy();
|
||||
};
|
||||
|
||||
const assertWorkflowWasTriggered = async (emails: Fixtures["emails"], emailsToBeReceived: string[]) => {
|
||||
const message = await emails.messages();
|
||||
emailsToBeReceived.forEach((email) => {
|
||||
expect(message?.items).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
subject: expect.stringMatching(subjectPattern),
|
||||
to: email,
|
||||
}),
|
||||
])
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
const assertWorkflowReminders = async (eventTypeId: number, count: number) => {
|
||||
const booking = await prisma.booking.findFirst({
|
||||
where: {
|
||||
@@ -143,5 +160,6 @@ export function createWorkflowPageFixture(page: Page) {
|
||||
selectedWorkflowPage,
|
||||
workflowOptionsAreDisabled,
|
||||
assertWorkflowReminders,
|
||||
assertWorkflowWasTriggered,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@ import { safeStringify } from "@calcom/lib/safeStringify";
|
||||
import { ProfileRepository } from "@calcom/lib/server/repository/profile";
|
||||
import prisma from "@calcom/prisma";
|
||||
import type { Team, User } from "@calcom/prisma/client";
|
||||
import { RedirectType } from "@calcom/prisma/client";
|
||||
import { Prisma } from "@calcom/prisma/client";
|
||||
import { RedirectType } from "@calcom/prisma/enums";
|
||||
import type { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { teamMetadataSchema, teamMetadataStrictSchema } from "@calcom/prisma/zod-utils";
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import type { Browser, Page } from "@playwright/test";
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import prisma from "@calcom/prisma";
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { SchedulingType } from "@calcom/prisma/enums";
|
||||
|
||||
import { test } from "../lib/fixtures";
|
||||
|
||||
@@ -3,7 +3,7 @@ import { expect } from "@playwright/test";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { MembershipRole } from "@calcom/prisma/client";
|
||||
import { MembershipRole } from "@calcom/prisma/enums";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
import { bookingMetadataSchema } from "@calcom/prisma/zod-utils";
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { v4 as uuidv4 } from "uuid";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/client";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
import {
|
||||
|
||||
@@ -7,7 +7,7 @@ import { bookEventOnThisPage } from "./lib/testUtils";
|
||||
test.describe("Workflow Tab - Event Type", () => {
|
||||
test.describe("Check the functionalities of the Workflow Tab", () => {
|
||||
test.describe("User Workflows", () => {
|
||||
test.beforeEach(async ({ page, users }) => {
|
||||
test.beforeEach(async ({ page, users, emails }) => {
|
||||
await loginUser(users);
|
||||
await page.goto("/workflows");
|
||||
});
|
||||
@@ -26,7 +26,8 @@ test.describe("Workflow Tab - Event Type", () => {
|
||||
await fillNameInput("Edited Workflow");
|
||||
await saveWorkflow();
|
||||
await page.getByTestId("go-back-button").click();
|
||||
page.getByTestId("workflow-list").waitFor();
|
||||
await page.getByTestId("workflow-list").waitFor();
|
||||
await page.reload();
|
||||
await hasWorkflowInList("Edited Workflow");
|
||||
});
|
||||
|
||||
@@ -42,16 +43,28 @@ test.describe("Workflow Tab - Event Type", () => {
|
||||
await assertListCount(1);
|
||||
});
|
||||
|
||||
test("Create an action and check if workflow is triggered", async ({ page, users, workflowPage }) => {
|
||||
test("Create an action and check if workflow reminder is added", async ({
|
||||
page,
|
||||
users,
|
||||
workflowPage,
|
||||
emails,
|
||||
}) => {
|
||||
const { createWorkflow, assertWorkflowReminders } = workflowPage;
|
||||
const [user] = users.get();
|
||||
const [eventType] = user.eventTypes;
|
||||
|
||||
await createWorkflow({ name: "A New Workflow", trigger: WorkflowTriggerEvents.NEW_EVENT });
|
||||
await createWorkflow({
|
||||
name: "A New Before Event Workflow",
|
||||
trigger: WorkflowTriggerEvents.BEFORE_EVENT,
|
||||
});
|
||||
await createWorkflow({
|
||||
name: "A New After Event Workflow",
|
||||
trigger: WorkflowTriggerEvents.AFTER_EVENT,
|
||||
});
|
||||
await page.goto(`/${user.username}/${eventType.slug}`);
|
||||
await page.click('[data-testid="incrementMonth"]');
|
||||
await bookEventOnThisPage(page);
|
||||
await assertWorkflowReminders(eventType.id, 1);
|
||||
await assertWorkflowReminders(eventType.id, 2);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "التضمينات",
|
||||
"impersonation": "انتحال الشخصية",
|
||||
"impersonation_description": "إعدادات إدارة انتحال شخصية مستخدم",
|
||||
"recent_impersonations": "عمليات انتحال الشخصية الأخيرة",
|
||||
"quick_impersonate": "انتحال شخصية سريع",
|
||||
"no_recent_impersonations": "لا توجد عمليات انتحال شخصية حديثة",
|
||||
"users": "المستخدمون",
|
||||
"user": "المستخدم",
|
||||
"profile_description": "إدارة الإعدادات لملفك الشخصي على {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "يتطلب ملء ملاحظات إضافية عند الحجز",
|
||||
"email_address_action": "إرسال بريد إلكتروني إلى عنوان بريد إلكتروني محدد",
|
||||
"after_event_trigger": "بعد انتهاء الحدث",
|
||||
"booking_rejected_trigger": "عند رفض الحجز",
|
||||
"booking_requested_trigger": "عند طلب الحجز",
|
||||
"booking_payment_initiated_trigger": "عند بدء الدفع للحجز",
|
||||
"booking_paid_trigger": "عند نجاح الدفع للحجز",
|
||||
"booking_no_show_updated_trigger": "عند تحديث حالة عدم الحضور للحجز",
|
||||
"how_long_after": "كم من الوقت بعد انتهاء الحدث؟",
|
||||
"how_long_after_hosts_no_show": "كم من الوقت بعد عدم ظهور المضيفين في اجتماع فيديو Cal؟",
|
||||
"how_long_after_guests_no_show": "كم من الوقت بعد عدم ظهور الضيوف في اجتماع فيديو Cal؟",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "عند اختبار سير العمل هذا، يجب أن تدرك أنه لا يمكن جدولة رسائل البريد الإلكتروني والرسائل القصيرة إلا قبل ساعة واحدة على الأقل",
|
||||
"insights_no_data_found_for_filter": "لم يتم العثور على بيانات لعامل التصفية المحدد أو التواريخ المحددة.",
|
||||
"acknowledge_booking_no_show_fee": "أقر بأنه إذا لم أحضر هذا الحدث فسيتم سحب رسوم عدم حضور من بطاقتي تبلغ {{amount, currency}}.",
|
||||
"days": "أيام",
|
||||
"card_details": "تفاصيل البطاقة",
|
||||
"something_went_wrong_on_our_end": "حدث خطأ ما من جانبنا. تواصل مع فريق الدعم لدينا، وسنقوم بإصلاحه فورًا لك.",
|
||||
"please_provide_following_text_to_suppport": "يرجى تقديم النص التالي عند الاتصال بالدعم لمساعدتك بشكل أفضل",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "الحجوزات",
|
||||
"pbac_resource_insights": "الرؤى",
|
||||
"pbac_resource_role": "الأدوار",
|
||||
"pbac_resource_routing_form": "نماذج التوجيه",
|
||||
"pbac_resource_workflow": "سير العمل",
|
||||
"pbac_action_all": "جميع الإجراءات",
|
||||
"pbac_action_create": "إنشاء",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "جميع الإجراءات على الحجوزات",
|
||||
"pbac_desc_view_team_insights": "عرض رؤى الفريق",
|
||||
"pbac_desc_manage_team_insights": "إدارة رؤى الفريق",
|
||||
"pbac_desc_create_routing_forms": "إنشاء نماذج التوجيه",
|
||||
"pbac_desc_view_routing_forms": "عرض نماذج التوجيه",
|
||||
"pbac_desc_update_routing_forms": "تحديث نماذج التوجيه",
|
||||
"pbac_desc_delete_routing_forms": "حذف نماذج التوجيه",
|
||||
"read_permission_auto_enabled_tooltip": "يتم تمكين إذن القراءة تلقائيًا عند إنشاء أو تحديث أو حذف مورد",
|
||||
"choose_restriction_schedule": "إضافة جدول القيود",
|
||||
"restriction_schedule_description": "تقييد توفر المضيفين لعرض الفترات الزمنية التي تقع ضمن جدول زمني محدد فقط.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "فكر في إنشاء مؤسسة لتوحيد الفواتير وأدوات الإدارة والتحليلات عبر فرقك.",
|
||||
"search_variables": "البحث عن المتغيرات",
|
||||
"no_variables_found": "لم يتم العثور على متغيرات",
|
||||
"api_key_name_too_long": "يجب ألا يتجاوز الاسم {{max}} حرفًا",
|
||||
"auto_charge_for_last_minute_cancellation": "فرض رسوم التخلف عن الحضور تلقائياً للإلغاءات في اللحظة الأخيرة",
|
||||
"before_scheduled_start_time": "قبل وقت البدء المحدد",
|
||||
"cancel_booking_acknowledge_no_show_fee": "أقر بأنه عند إلغاء الحجز قبل {{timeValue}} {{timeUnit}} من وقت البدء سيتم فرض رسوم التخلف عن الحضور بقيمة {{amount, currency}}",
|
||||
"contact_organizer": "إذا كانت لديك أي أسئلة، يرجى التواصل مع المنظم.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Daxiletmələr",
|
||||
"impersonation": "İmitasiya",
|
||||
"impersonation_description": "İstifadəçi imitasiya idarəetmə parametrləri",
|
||||
"recent_impersonations": "Son təqlidlər",
|
||||
"quick_impersonate": "Sürətli təqlid",
|
||||
"no_recent_impersonations": "Son təqlidlər yoxdur",
|
||||
"users": "İstifadəçilər",
|
||||
"user": "İstifadəçi",
|
||||
"profile_description": "{{appName}} profiliniz üçün parametrləri idarə edin",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Rezervasiya zamanı əlavə qeydlərin doldurulmasını tələb edin",
|
||||
"email_address_action": "müəyyən bir e-poçt ünvanına e-poçt göndərin",
|
||||
"after_event_trigger": "hadisə bitdikdən sonra",
|
||||
"booking_rejected_trigger": "rezervasiya rədd edildikdə",
|
||||
"booking_requested_trigger": "rezervasiya tələb olunduqda",
|
||||
"booking_payment_initiated_trigger": "rezervasiya ödənişi başladıldıqda",
|
||||
"booking_paid_trigger": "rezervasiya ödənişi uğurlu olduqda",
|
||||
"booking_no_show_updated_trigger": "rezervasiya gəlməmə halı yeniləndikdə",
|
||||
"how_long_after": "Hadisə bitdikdən nə qədər sonra?",
|
||||
"how_long_after_hosts_no_show": "Ev sahibləri Cal video görüşünə gəlmədikdən nə qədər sonra?",
|
||||
"how_long_after_guests_no_show": "Qonaqlar Cal video görüşünə gəlmədikdən nə qədər sonra?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Bu iş axınını sınaqdan keçirərkən, e-poçtların və SMS-lərin ən azı 1 saat əvvəl planlaşdırıla biləcəyini unutmayın",
|
||||
"insights_no_data_found_for_filter": "Seçilmiş filtr və ya tarixlər üçün məlumat tapılmadı.",
|
||||
"acknowledge_booking_no_show_fee": "Bu tədbirə qatılmasam, kartıma {{amount, currency}} gəlməmə haqqı tətbiq olunacağını qəbul edirəm.",
|
||||
"days": "günlər",
|
||||
"card_details": "Kart məlumatları",
|
||||
"something_went_wrong_on_our_end": "Bizim tərəfimizdə bir şey səhv getdi. Dəstək komandamızla əlaqə saxlayın və biz bunu sizin üçün dərhal həll edəcəyik.",
|
||||
"please_provide_following_text_to_suppport": "Dəstək ilə əlaqə saxlayarkən aşağıdakı mətni təqdim edin ki, sizə daha yaxşı kömək edə bilək",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Rezervasiyalar",
|
||||
"pbac_resource_insights": "Görüşlər",
|
||||
"pbac_resource_role": "Rollar",
|
||||
"pbac_resource_routing_form": "Marşrutlaşdırma Formları",
|
||||
"pbac_resource_workflow": "İş axınları",
|
||||
"pbac_action_all": "Bütün Fəaliyyətlər",
|
||||
"pbac_action_create": "Yaratmaq",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Rezervasiyalar üzərində bütün əməliyyatlar",
|
||||
"pbac_desc_view_team_insights": "Komanda analitikasına baxmaq",
|
||||
"pbac_desc_manage_team_insights": "Komanda analitikasını idarə etmək",
|
||||
"pbac_desc_create_routing_forms": "Marşrutlaşdırma formalarını yarat",
|
||||
"pbac_desc_view_routing_forms": "Marşrutlaşdırma formalarına bax",
|
||||
"pbac_desc_update_routing_forms": "Marşrutlaşdırma formalarını yenilə",
|
||||
"pbac_desc_delete_routing_forms": "Marşrutlaşdırma formalarını sil",
|
||||
"read_permission_auto_enabled_tooltip": "Resurs yaradarkən, yeniləyərkən və ya silənərkən oxuma icazəsi avtomatik olaraq aktivləşdirilir",
|
||||
"choose_restriction_schedule": "Məhdudiyyət qrafiki əlavə edin",
|
||||
"restriction_schedule_description": "Ev sahiblərinin əlçatanlığını yalnız müəyyən edilmiş qrafik daxilində olan slotları göstərməklə məhdudlaşdırın.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Komandalarınız üzrə ödənişləri, admin alətlərini və analitikanı birləşdirmək üçün təşkilat qurmağı nəzərdən keçirin.",
|
||||
"search_variables": "Dəyişənləri axtar",
|
||||
"no_variables_found": "Heç bir dəyişən tapılmadı",
|
||||
"api_key_name_too_long": "Ad {{max}} simvolu keçməməlidir",
|
||||
"auto_charge_for_last_minute_cancellation": "Son dəqiqə ləğvləri üçün avtomatik olaraq gəlməmə haqqını tutun",
|
||||
"before_scheduled_start_time": "Planlaşdırılmış başlama vaxtından əvvəl",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Təsdiq edirəm ki, rezervasiyanı başlama vaxtından {{timeValue}} {{timeUnit}} ərzində ləğv etməklə mənə {{amount, currency}} məbləğində gəlməmə haqqı tutulacaq",
|
||||
"contact_organizer": "Hər hansı sualınız varsa, təşkilatçı ilə əlaqə saxlayın.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Yeni sətirləri bura əlavə edin ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Вграждания",
|
||||
"impersonation": "Представяне като друг потребител",
|
||||
"impersonation_description": "Настройки за управление на представянето като друг потребител",
|
||||
"recent_impersonations": "Скорошни представяния",
|
||||
"quick_impersonate": "Бързо представяне",
|
||||
"no_recent_impersonations": "Няма скорошни представяния",
|
||||
"users": "Потребители",
|
||||
"user": "Потребител",
|
||||
"profile_description": "Управлявайте настройките на вашия {{appName}} профил",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Изискване на попълване на допълнителни бележки при резервация",
|
||||
"email_address_action": "изпращане на имейл до конкретен имейл адрес",
|
||||
"after_event_trigger": "след края на събитието",
|
||||
"booking_rejected_trigger": "когато резервацията е отхвърлена",
|
||||
"booking_requested_trigger": "когато резервацията е заявена",
|
||||
"booking_payment_initiated_trigger": "когато плащането за резервацията е инициирано",
|
||||
"booking_paid_trigger": "когато плащането за резервацията е успешно",
|
||||
"booking_no_show_updated_trigger": "когато статусът за неявяване е актуализиран",
|
||||
"how_long_after": "Колко време след края на събитието?",
|
||||
"how_long_after_hosts_no_show": "Колко време след като домакините не се появят на видео срещата в cal?",
|
||||
"how_long_after_guests_no_show": "Колко време след като гостите не се появят на видео срещата в cal?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Когато тествате този работен процес, имайте предвид, че имейлите и SMS съобщенията могат да бъдат планирани само поне 1 час предварително",
|
||||
"insights_no_data_found_for_filter": "Не са намерени данни за избрания филтър или избраните дати.",
|
||||
"acknowledge_booking_no_show_fee": "Потвърждавам, че ако не присъствам на това събитие, ще бъде начислена такса за неявяване в размер на {{amount, currency}} на моята карта.",
|
||||
"days": "дни",
|
||||
"card_details": "Данни на картата",
|
||||
"something_went_wrong_on_our_end": "Нещо се обърка от наша страна. Свържете се с нашия екип за поддръжка и ние ще го оправим веднага за вас.",
|
||||
"please_provide_following_text_to_suppport": "Моля, предоставете следния текст при контакт с поддръжката за по-добра помощ",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Резервации",
|
||||
"pbac_resource_insights": "Анализи",
|
||||
"pbac_resource_role": "Роли",
|
||||
"pbac_resource_routing_form": "Формуляри за маршрутизиране",
|
||||
"pbac_resource_workflow": "Работни процеси",
|
||||
"pbac_action_all": "Всички действия",
|
||||
"pbac_action_create": "Създаване",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Всички действия върху резервации",
|
||||
"pbac_desc_view_team_insights": "Преглед на анализи на екипа",
|
||||
"pbac_desc_manage_team_insights": "Управление на анализи на екипа",
|
||||
"pbac_desc_create_routing_forms": "Създаване на формуляри за маршрутизиране",
|
||||
"pbac_desc_view_routing_forms": "Преглед на формуляри за маршрутизиране",
|
||||
"pbac_desc_update_routing_forms": "Актуализиране на формуляри за маршрутизиране",
|
||||
"pbac_desc_delete_routing_forms": "Изтриване на формуляри за маршрутизиране",
|
||||
"read_permission_auto_enabled_tooltip": "Разрешението за четене се активира автоматично при създаване, актуализиране или изтриване на ресурс",
|
||||
"choose_restriction_schedule": "Добавяне на график с ограничения",
|
||||
"restriction_schedule_description": "Ограничете достъпността на домакините, за да се показват само слотове, които попадат в определен график.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Помислете за създаване на организация, за да обедините таксуването, административните инструменти и анализите за вашите екипи.",
|
||||
"search_variables": "Търсене на променливи",
|
||||
"no_variables_found": "Не са намерени променливи",
|
||||
"api_key_name_too_long": "Името не трябва да надвишава {{max}} символа",
|
||||
"auto_charge_for_last_minute_cancellation": "Автоматично таксуване на такса за неявяване при отмяна в последния момент",
|
||||
"before_scheduled_start_time": "Преди планираното начално време",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Потвърждавам, че при отмяна на резервацията в рамките на {{timeValue}} {{timeUnit}} преди началния час ще ми бъде начислена такса за неявяване в размер на {{amount, currency}}",
|
||||
"contact_organizer": "Ако имате въпроси, моля, свържете се с организатора.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Добавете новите си низове над този ред ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "এম্বেড",
|
||||
"impersonation": "ছদ্মবেশ",
|
||||
"impersonation_description": "ব্যবহারকারীর ছদ্মবেশ পরিচালনা করতে সেটিংস",
|
||||
"recent_impersonations": "সাম্প্রতিক প্রতিরূপণ",
|
||||
"quick_impersonate": "দ্রুত প্রতিরূপণ",
|
||||
"no_recent_impersonations": "কোনো সাম্প্রতিক প্রতিরূপণ নেই",
|
||||
"users": "ব্যবহারকারীরা",
|
||||
"user": "ব্যবহারকারী",
|
||||
"profile_description": "আপনার জন্য সেটিংস পরিচালনা করুন {{appName}} প্রোফাইল",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "বুকিংয়ের সময় অতিরিক্ত নোটগুলি পূরণ করতে হবে",
|
||||
"email_address_action": "একটি নির্দিষ্ট ইমেল ঠিকানায় ইমেল প্রেরণ করুন",
|
||||
"after_event_trigger": "ঘটনা শেষ হওয়ার পরে",
|
||||
"booking_rejected_trigger": "যখন বুকিং প্রত্যাখ্যান করা হয়",
|
||||
"booking_requested_trigger": "যখন বুকিং অনুরোধ করা হয়",
|
||||
"booking_payment_initiated_trigger": "যখন বুকিং পেমেন্ট শুরু করা হয়",
|
||||
"booking_paid_trigger": "যখন বুকিং পেমেন্ট সফল হয়",
|
||||
"booking_no_show_updated_trigger": "যখন বুকিং নো-শো আপডেট করা হয়",
|
||||
"how_long_after": "ইভেন্ট শেষ হওয়ার পরে কতক্ষণ?",
|
||||
"how_long_after_hosts_no_show": "হোস্টগুলি কতক্ষণ পরে ক্যাল ভিডিও সভায় প্রদর্শিত হয় না?",
|
||||
"how_long_after_guests_no_show": "অতিথিরা কতক্ষণ ক্যাল ভিডিও সভায় প্রদর্শিত হয় না?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "এই কর্মপ্রবাহটি পরীক্ষা করার সময়, সচেতন হন যে ইমেলগুলি এবং এসএমএস কেবলমাত্র কমপক্ষে 1 ঘন্টা আগে নির্ধারিত হতে পারে",
|
||||
"insights_no_data_found_for_filter": "নির্বাচিত ফিল্টার বা নির্বাচিত তারিখগুলির জন্য কোনও ডেটা পাওয়া যায় নি।",
|
||||
"acknowledge_booking_no_show_fee": "আমি স্বীকার করি যে আমি যদি এই ইভেন্টে অংশ না নিই তবে ক {{amount, currency}} আমার কার্ডে কোনও শো ফি প্রয়োগ করা হবে না।",
|
||||
"days": "দিন",
|
||||
"card_details": "কার্ডের বিশদ",
|
||||
"something_went_wrong_on_our_end": "আমাদের দিকে কিছু সমস্যা হয়েছে। আমাদের সাপোর্ট টিমের সাথে যোগাযোগ করুন, এবং আমরা আপনার জন্য এটি দ্রুত ঠিক করে দেব।",
|
||||
"please_provide_following_text_to_suppport": "আপনাকে আরও ভাল সহায়তা করতে সহায়তার সাথে যোগাযোগ করার সময় দয়া করে নিম্নলিখিত পাঠ্যটি সরবরাহ করুন",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "বুকিং",
|
||||
"pbac_resource_insights": "অন্তর্দৃষ্টি",
|
||||
"pbac_resource_role": "ভূমিকা",
|
||||
"pbac_resource_routing_form": "রাউটিং ফর্ম",
|
||||
"pbac_resource_workflow": "কর্মপ্রবাহ",
|
||||
"pbac_action_all": "সমস্ত ক্রিয়া",
|
||||
"pbac_action_create": "তৈরি করুন",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "বুকিংয়ের সকল কার্যক্রম",
|
||||
"pbac_desc_view_team_insights": "দলের অন্তর্দৃষ্টি দেখুন",
|
||||
"pbac_desc_manage_team_insights": "দলের অন্তর্দৃষ্টি পরিচালনা করুন",
|
||||
"pbac_desc_create_routing_forms": "রাউটিং ফর্ম তৈরি করুন",
|
||||
"pbac_desc_view_routing_forms": "রাউটিং ফর্ম দেখুন",
|
||||
"pbac_desc_update_routing_forms": "রাউটিং ফর্ম আপডেট করুন",
|
||||
"pbac_desc_delete_routing_forms": "রাউটিং ফর্ম মুছুন",
|
||||
"read_permission_auto_enabled_tooltip": "কোনো রিসোর্স তৈরি, আপডেট বা মুছে ফেলার সময় পড়ার অনুমতি স্বয়ংক্রিয়ভাবে সক্রিয় হয়",
|
||||
"choose_restriction_schedule": "বিধিনিষেধ সময়সূচি যোগ করুন",
|
||||
"restriction_schedule_description": "হোস্টদের উপলব্ধতা সীমিত করুন যাতে শুধুমাত্র নির্দিষ্ট সময়সূচীর মধ্যে পড়া স্লটগুলি প্রদর্শিত হয়।",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "আপনার দলগুলির মধ্যে বিলিং, অ্যাডমিন টুলস এবং অ্যানালিটিক্স একত্রিত করতে একটি সংগঠন সেট আপ করার কথা বিবেচনা করুন।",
|
||||
"search_variables": "ভেরিয়েবল অনুসন্ধান করুন",
|
||||
"no_variables_found": "কোন ভেরিয়েবল পাওয়া যায়নি",
|
||||
"api_key_name_too_long": "নাম অবশ্যই {{max}} অক্ষরের বেশি হবে না",
|
||||
"auto_charge_for_last_minute_cancellation": "শেষ মুহূর্তের বাতিলকরণের জন্য স্বয়ংক্রিয়ভাবে অনুপস্থিতি ফি চার্জ করুন",
|
||||
"before_scheduled_start_time": "নির্ধারিত শুরুর সময়ের আগে",
|
||||
"cancel_booking_acknowledge_no_show_fee": "আমি স্বীকার করছি যে শুরুর সময়ের {{timeValue}} {{timeUnit}} এর মধ্যে বুকিং বাতিল করলে আমাকে {{amount, currency}} অনুপস্থিতি ফি চার্জ করা হবে",
|
||||
"contact_organizer": "আপনার কোন প্রশ্ন থাকলে, অনুগ্রহ করে আয়োজকের সাথে যোগাযোগ করুন।",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑ুষান্ত"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Incrustacions",
|
||||
"impersonation": "Suplantació",
|
||||
"impersonation_description": "Configuració per gestionar la suplantació d'usuaris",
|
||||
"recent_impersonations": "Suplantacions recents",
|
||||
"quick_impersonate": "Suplantació ràpida",
|
||||
"no_recent_impersonations": "No hi ha suplantacions recents",
|
||||
"users": "Usuaris",
|
||||
"user": "Usuari",
|
||||
"profile_description": "Gestiona la configuració del teu perfil de {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Requerir que s'omplin notes addicionals en fer la reserva",
|
||||
"email_address_action": "enviar correu electrònic a una adreça específica",
|
||||
"after_event_trigger": "després que acabi l'esdeveniment",
|
||||
"booking_rejected_trigger": "quan la reserva és rebutjada",
|
||||
"booking_requested_trigger": "quan la reserva és sol·licitada",
|
||||
"booking_payment_initiated_trigger": "quan s'inicia el pagament de la reserva",
|
||||
"booking_paid_trigger": "quan el pagament de la reserva és correcte",
|
||||
"booking_no_show_updated_trigger": "quan s'actualitza la no presentació a la reserva",
|
||||
"how_long_after": "Quant temps després que acabi l'esdeveniment?",
|
||||
"how_long_after_hosts_no_show": "Quant temps després que els amfitrions no es presentin a la reunió de vídeo de cal?",
|
||||
"how_long_after_guests_no_show": "Quant temps després que els convidats no es presentin a la reunió de vídeo de cal?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Quan provis aquest flux de treball, tingues en compte que els correus electrònics i SMS només es poden programar amb almenys 1 hora d'antelació",
|
||||
"insights_no_data_found_for_filter": "No s'han trobat dades per al filtre seleccionat o les dates seleccionades.",
|
||||
"acknowledge_booking_no_show_fee": "Reconec que si no assisteixo a aquest esdeveniment, s'aplicarà una penalització de {{amount, currency}} a la meva targeta.",
|
||||
"days": "dies",
|
||||
"card_details": "Detalls de la targeta",
|
||||
"something_went_wrong_on_our_end": "Alguna cosa ha anat malament per la nostra part. Contacta amb el nostre equip de suport i ho solucionarem de seguida per a tu.",
|
||||
"please_provide_following_text_to_suppport": "Si us plau, proporciona el següent text quan contactis amb suport per ajudar-te millor",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Reserves",
|
||||
"pbac_resource_insights": "Estadístiques",
|
||||
"pbac_resource_role": "Rols",
|
||||
"pbac_resource_routing_form": "Formularis de redirecció",
|
||||
"pbac_resource_workflow": "Fluxos de treball",
|
||||
"pbac_action_all": "Totes les accions",
|
||||
"pbac_action_create": "Crear",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Totes les accions sobre reserves",
|
||||
"pbac_desc_view_team_insights": "Veure estadístiques d'equip",
|
||||
"pbac_desc_manage_team_insights": "Gestionar estadístiques d'equip",
|
||||
"pbac_desc_create_routing_forms": "Crear formularis de redirecció",
|
||||
"pbac_desc_view_routing_forms": "Veure formularis de redirecció",
|
||||
"pbac_desc_update_routing_forms": "Actualitzar formularis de redirecció",
|
||||
"pbac_desc_delete_routing_forms": "Eliminar formularis de redirecció",
|
||||
"read_permission_auto_enabled_tooltip": "El permís de lectura s'activa automàticament quan es crea, actualitza o elimina un recurs",
|
||||
"choose_restriction_schedule": "Afegir horari de restricció",
|
||||
"restriction_schedule_description": "Limita la disponibilitat dels amfitrions per mostrar només franges horàries que es trobin dins d'un horari especificat.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Considera configurar una organització per unificar la facturació, les eines d'administració i les analítiques dels teus equips.",
|
||||
"search_variables": "Cerca variables",
|
||||
"no_variables_found": "No s'han trobat variables",
|
||||
"api_key_name_too_long": "El nom no ha de superar els {{max}} caràcters",
|
||||
"auto_charge_for_last_minute_cancellation": "Càrrec automàtic de la tarifa per no assistència en cas de cancel·lacions d'última hora",
|
||||
"before_scheduled_start_time": "Abans de l'hora d'inici programada",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Reconec que en cancel·lar la reserva dins dels {{timeValue}} {{timeUnit}} abans de l'hora d'inici se'm cobrarà la tarifa per no assistència de {{amount, currency}}",
|
||||
"contact_organizer": "Si teniu alguna pregunta, poseu-vos en contacte amb l'organitzador.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Afegiu les vostres noves cadenes a dalt ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Vložené kalendáře",
|
||||
"impersonation": "Ztotožnění",
|
||||
"impersonation_description": "Nastavení správy ztotožnění uživatele",
|
||||
"recent_impersonations": "Nedávná vydávání se za jiné",
|
||||
"quick_impersonate": "Rychlé vydávání se za jiného",
|
||||
"no_recent_impersonations": "Žádná nedávná vydávání se za jiné",
|
||||
"users": "Uživatelé",
|
||||
"user": "Uživatel",
|
||||
"profile_description": "Správa nastavení profilu {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Požadovat vyplnění doplňujících poznámek při rezervaci",
|
||||
"email_address_action": "odeslat e-mail na specifickou e-mailovou adresu",
|
||||
"after_event_trigger": "po ukončení události",
|
||||
"booking_rejected_trigger": "když je rezervace zamítnuta",
|
||||
"booking_requested_trigger": "když je rezervace vyžádána",
|
||||
"booking_payment_initiated_trigger": "když je zahájena platba za rezervaci",
|
||||
"booking_paid_trigger": "když je platba za rezervaci úspěšná",
|
||||
"booking_no_show_updated_trigger": "když je aktualizována nepřítomnost na rezervaci",
|
||||
"how_long_after": "Jak dlouho po ukončení události?",
|
||||
"how_long_after_hosts_no_show": "Jak dlouho po tom, co se hostitelé neobjeví na cal video schůzce?",
|
||||
"how_long_after_guests_no_show": "Jak dlouho po tom, co se hosté neobjeví na cal video schůzce?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Při testování tohoto pracovního postupu mějte na paměti, že e-maily a SMS lze naplánovat pouze nejméně 1 hodinu předem.",
|
||||
"insights_no_data_found_for_filter": "Pro vybraný filtr nebo vybraná data nebyla nalezena žádná data.",
|
||||
"acknowledge_booking_no_show_fee": "Beru na vědomí, že pokud se této události nezúčastním, bude z mé karty stržen poplatek za nedostavení se ve výši {{amount, currency}}.",
|
||||
"days": "dny",
|
||||
"card_details": "Údaje o kartě",
|
||||
"something_went_wrong_on_our_end": "Na naší straně došlo k chybě. Kontaktujte náš tým podpory a my to pro vás co nejdříve opravíme.",
|
||||
"please_provide_following_text_to_suppport": "Při kontaktování podpory uveďte v zájmu lepší efektivity následující",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Rezervace",
|
||||
"pbac_resource_insights": "Přehledy",
|
||||
"pbac_resource_role": "Role",
|
||||
"pbac_resource_routing_form": "Směrovací formuláře",
|
||||
"pbac_resource_workflow": "Pracovní postupy",
|
||||
"pbac_action_all": "Všechny akce",
|
||||
"pbac_action_create": "Vytvořit",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Všechny akce s rezervacemi",
|
||||
"pbac_desc_view_team_insights": "Zobrazit přehledy týmu",
|
||||
"pbac_desc_manage_team_insights": "Spravovat přehledy týmu",
|
||||
"pbac_desc_create_routing_forms": "Vytvářet směrovací formuláře",
|
||||
"pbac_desc_view_routing_forms": "Zobrazit směrovací formuláře",
|
||||
"pbac_desc_update_routing_forms": "Aktualizovat směrovací formuláře",
|
||||
"pbac_desc_delete_routing_forms": "Odstranit směrovací formuláře",
|
||||
"read_permission_auto_enabled_tooltip": "Oprávnění ke čtení je automaticky povoleno při vytváření, aktualizaci nebo mazání zdroje",
|
||||
"choose_restriction_schedule": "Přidat plán omezení",
|
||||
"restriction_schedule_description": "Omezit dostupnost hostitelů tak, aby se zobrazovaly pouze časové úseky, které spadají do určeného rozvrhu.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Zvažte založení organizace pro sjednocení fakturace, administrativních nástrojů a analytiky napříč vašimi týmy.",
|
||||
"search_variables": "Hledat proměnné",
|
||||
"no_variables_found": "Nebyly nalezeny žádné proměnné",
|
||||
"api_key_name_too_long": "Název nesmí přesáhnout {{max}} znaků",
|
||||
"auto_charge_for_last_minute_cancellation": "Automaticky účtovat poplatek za nedostavení se při zrušení na poslední chvíli",
|
||||
"before_scheduled_start_time": "Před plánovaným časem zahájení",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Beru na vědomí, že zrušením rezervace v době kratší než {{timeValue}} {{timeUnit}} před začátkem mi bude účtován poplatek za nedostavení se ve výši {{amount, currency}}",
|
||||
"contact_organizer": "Pokud máte jakékoli dotazy, kontaktujte prosím organizátora.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Přidejte své nové řetězce nahoru ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Indlejringer",
|
||||
"impersonation": "Impersonation",
|
||||
"impersonation_description": "Indstillinger til håndtering af bruger-impersonation",
|
||||
"recent_impersonations": "Seneste imitationer",
|
||||
"quick_impersonate": "Hurtig imitation",
|
||||
"no_recent_impersonations": "Ingen seneste imitationer",
|
||||
"users": "Brugere",
|
||||
"user": "Bruger",
|
||||
"profile_description": "Administrér indstillinger for din {{appName}} profil",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Kræv yderligere noter der skal udfyldes ved booking",
|
||||
"email_address_action": "send e-mail til en specifik e-mailadresse",
|
||||
"after_event_trigger": "efter begivenheden slutter",
|
||||
"booking_rejected_trigger": "når booking afvises",
|
||||
"booking_requested_trigger": "når booking anmodes om",
|
||||
"booking_payment_initiated_trigger": "når bookingbetaling påbegyndes",
|
||||
"booking_paid_trigger": "når bookingbetalingen er gennemført",
|
||||
"booking_no_show_updated_trigger": "når booking no-show opdateres",
|
||||
"how_long_after": "Hvor længe efter begivenheden slutter?",
|
||||
"how_long_after_hosts_no_show": "Hvor lang tid efter værter ikke dukker op til cal video møde?",
|
||||
"how_long_after_guests_no_show": "Hvor lang tid efter gæster ikke dukker op til cal video møde?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Når du tester denne arbejdsgang, skal du være opmærksom på, at e-mails og SMS'er kun kan planlægges mindst 1 time i forvejen",
|
||||
"insights_no_data_found_for_filter": "Ingen data fundet for det valgte filter eller de valgte datoer.",
|
||||
"acknowledge_booking_no_show_fee": "Jeg anerkender, at hvis jeg ikke deltager i denne begivenhed, vil et gebyr for udeblivelse på {{amount, currency}} blive opkrævet på mit kort.",
|
||||
"days": "dage",
|
||||
"card_details": "Kortoplysninger",
|
||||
"something_went_wrong_on_our_end": "Noget gik galt hos os. Kontakt vores supportteam, så løser vi det straks for dig.",
|
||||
"please_provide_following_text_to_suppport": "Angiv venligst følgende tekst, når du kontakter support, for at hjælpe os bedre",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Bookinger",
|
||||
"pbac_resource_insights": "Indsigter",
|
||||
"pbac_resource_role": "Roller",
|
||||
"pbac_resource_routing_form": "Ruteformularer",
|
||||
"pbac_resource_workflow": "Workflows",
|
||||
"pbac_action_all": "Alle handlinger",
|
||||
"pbac_action_create": "Opret",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Alle handlinger på bookinger",
|
||||
"pbac_desc_view_team_insights": "Se teamindsigter",
|
||||
"pbac_desc_manage_team_insights": "Administrer teamindsigter",
|
||||
"pbac_desc_create_routing_forms": "Opret ruteformularer",
|
||||
"pbac_desc_view_routing_forms": "Se ruteformularer",
|
||||
"pbac_desc_update_routing_forms": "Opdater ruteformularer",
|
||||
"pbac_desc_delete_routing_forms": "Slet ruteformularer",
|
||||
"read_permission_auto_enabled_tooltip": "Læs tilladelse aktiveres automatisk, når en ressource oprettes, opdateres eller slettes",
|
||||
"choose_restriction_schedule": "Tilføj restriktionsskema",
|
||||
"restriction_schedule_description": "Begræns værternes tilgængelighed til kun at vise tidsrum, der falder inden for en specificeret tidsplan.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Overvej at oprette en organisation for at samle fakturering, adminværktøjer og analyser på tværs af dine teams.",
|
||||
"search_variables": "Søg i variabler",
|
||||
"no_variables_found": "Ingen variable fundet",
|
||||
"api_key_name_too_long": "Navnet må ikke overstige {{max}} tegn",
|
||||
"auto_charge_for_last_minute_cancellation": "Automatisk opkrævning af gebyr for udeblivelse ved aflysning i sidste øjeblik",
|
||||
"before_scheduled_start_time": "Før den planlagte starttid",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Jeg anerkender, at ved at aflyse bookingen inden for {{timeValue}} {{timeUnit}} før starttiden, vil jeg blive opkrævet gebyret for udeblivelse på {{amount, currency}}",
|
||||
"contact_organizer": "Hvis du har spørgsmål, bedes du kontakte arrangøren.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Tilføj dine nye strenge ovenfor her ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Embeds",
|
||||
"impersonation": "Benutzeridentitätswechsel",
|
||||
"impersonation_description": "Einstellungen zur Verwaltung der Benutzeridentifikation",
|
||||
"recent_impersonations": "Letzte Identitätswechsel",
|
||||
"quick_impersonate": "Schneller Identitätswechsel",
|
||||
"no_recent_impersonations": "Keine kürzlichen Identitätswechsel",
|
||||
"users": "Benutzer",
|
||||
"user": "Benutzer",
|
||||
"profile_description": "Einstellungen für Ihr {{appName}} Profil verwalten",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Zusätzliche Notizen bei der Buchung erforderlich machen",
|
||||
"email_address_action": "eine E-Mail an eine bestimmte E-Mail-Adresse senden",
|
||||
"after_event_trigger": "nach Ende des Termins",
|
||||
"booking_rejected_trigger": "wenn eine Buchung abgelehnt wird",
|
||||
"booking_requested_trigger": "wenn eine Buchung angefragt wird",
|
||||
"booking_payment_initiated_trigger": "wenn eine Buchungszahlung eingeleitet wird",
|
||||
"booking_paid_trigger": "wenn eine Buchungszahlung erfolgreich ist",
|
||||
"booking_no_show_updated_trigger": "wenn ein Nichterscheinen bei einer Buchung aktualisiert wird",
|
||||
"how_long_after": "Wie lange nach Ende des Termins?",
|
||||
"how_long_after_hosts_no_show": "Wie lange nachdem Gastgeber nicht zum Cal-Video-Meeting erscheinen?",
|
||||
"how_long_after_guests_no_show": "Wie lange nachdem Gäste nicht zum Cal-Video-Meeting erscheinen?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Bitte beachten Sie beim Testen dieses Workflows, dass E-Mails und SMS spätestens 1 Stunde im Voraus geplant werden können",
|
||||
"insights_no_data_found_for_filter": "Keine Daten für den ausgewählten Filter oder das ausgewählte Datum gefunden.",
|
||||
"acknowledge_booking_no_show_fee": "Ich bestätige, dass meiner Karte eine Gebühr von {{amount, currency}} berechnet wird, sofern ich nicht an diesem Ereignis teilnehme.",
|
||||
"days": "Tage",
|
||||
"card_details": "Karteninformationen",
|
||||
"something_went_wrong_on_our_end": "Bei uns ist etwas schiefgelaufen. Kontaktiere unseren Support und wir werden das Problem umgehend für dich beheben.",
|
||||
"please_provide_following_text_to_suppport": "Bitte geben Sie den folgenden Text an, wenn Sie den Support kontaktieren, damit wir Ihnen besser helfen können",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Buchungen",
|
||||
"pbac_resource_insights": "Erkenntnisse",
|
||||
"pbac_resource_role": "Rollen",
|
||||
"pbac_resource_routing_form": "Weiterleitungsformulare",
|
||||
"pbac_resource_workflow": "Workflows",
|
||||
"pbac_action_all": "Alle Aktionen",
|
||||
"pbac_action_create": "Erstellen",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Alle Aktionen für Buchungen",
|
||||
"pbac_desc_view_team_insights": "Team-Insights anzeigen",
|
||||
"pbac_desc_manage_team_insights": "Team-Insights verwalten",
|
||||
"pbac_desc_create_routing_forms": "Weiterleitungsformulare erstellen",
|
||||
"pbac_desc_view_routing_forms": "Weiterleitungsformulare anzeigen",
|
||||
"pbac_desc_update_routing_forms": "Weiterleitungsformulare aktualisieren",
|
||||
"pbac_desc_delete_routing_forms": "Weiterleitungsformulare löschen",
|
||||
"read_permission_auto_enabled_tooltip": "Leseberechtigung wird automatisch aktiviert, wenn eine Ressource erstellt, aktualisiert oder gelöscht wird",
|
||||
"choose_restriction_schedule": "Einschränkungszeitplan hinzufügen",
|
||||
"restriction_schedule_description": "Beschränken Sie die Verfügbarkeit von Gastgebern, um nur Zeitfenster anzuzeigen, die in einen festgelegten Zeitplan fallen.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Erwägen Sie die Einrichtung einer Organisation, um Abrechnung, Administrationstools und Analysen für Ihre Teams zu vereinheitlichen.",
|
||||
"search_variables": "Variablen durchsuchen",
|
||||
"no_variables_found": "Keine Variablen gefunden",
|
||||
"api_key_name_too_long": "Der Name darf {{max}} Zeichen nicht überschreiten",
|
||||
"auto_charge_for_last_minute_cancellation": "Automatische Berechnung der Ausfallgebühr für kurzfristige Stornierungen",
|
||||
"before_scheduled_start_time": "Vor dem geplanten Startzeitpunkt",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Ich bestätige, dass mir bei einer Stornierung innerhalb von {{timeValue}} {{timeUnit}} vor dem Startzeitpunkt die Ausfallgebühr von {{amount, currency}} berechnet wird",
|
||||
"contact_organizer": "Bei Fragen wenden Sie sich bitte an den Organisator.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Fügen Sie Ihre neuen Code-Zeilen über dieser hinzu ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Ενσωματώσεις",
|
||||
"impersonation": "Προσωποποίηση",
|
||||
"impersonation_description": "Ρυθμίσεις για τη διαχείριση προσωποποίησης χρηστών",
|
||||
"recent_impersonations": "Πρόσφατες προσωποποιήσεις",
|
||||
"quick_impersonate": "Γρήγορη προσωποποίηση",
|
||||
"no_recent_impersonations": "Δεν υπάρχουν πρόσφατες προσωποποιήσεις",
|
||||
"users": "Χρήστες",
|
||||
"user": "Χρήστης",
|
||||
"profile_description": "Διαχείριση ρυθμίσεων για το προφίλ σας στο {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Απαίτηση συμπλήρωσης πρόσθετων σημειώσεων κατά την κράτηση",
|
||||
"email_address_action": "αποστολή email σε συγκεκριμένη διεύθυνση",
|
||||
"after_event_trigger": "μετά τη λήξη του event",
|
||||
"booking_rejected_trigger": "όταν η κράτηση απορρίπτεται",
|
||||
"booking_requested_trigger": "όταν ζητείται κράτηση",
|
||||
"booking_payment_initiated_trigger": "όταν ξεκινά η πληρωμή της κράτησης",
|
||||
"booking_paid_trigger": "όταν η πληρωμή της κράτησης είναι επιτυχής",
|
||||
"booking_no_show_updated_trigger": "όταν ενημερώνεται η μη εμφάνιση στην κράτηση",
|
||||
"how_long_after": "Πόσο μετά τη λήξη του event;",
|
||||
"how_long_after_hosts_no_show": "Πόσο μετά την απουσία των διοργανωτών από τη συνάντηση βίντεο του cal;",
|
||||
"how_long_after_guests_no_show": "Πόσο μετά την απουσία των καλεσμένων από τη συνάντηση βίντεο του cal;",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Κατά τη δοκιμή αυτής της ροής εργασίας, λάβετε υπόψη ότι τα email και τα SMS μπορούν να προγραμματιστούν τουλάχιστον 1 ώρα νωρίτερα",
|
||||
"insights_no_data_found_for_filter": "Δεν βρέθηκαν δεδομένα για το επιλεγμένο φίλτρο ή τις επιλεγμένες ημερομηνίες.",
|
||||
"acknowledge_booking_no_show_fee": "Αναγνωρίζω ότι εάν δεν παρευρεθώ σε αυτήν την εκδήλωση, θα χρεωθεί στην κάρτα μου τέλος μη προσέλευσης ύψους {{amount, currency}}.",
|
||||
"days": "ημέρες",
|
||||
"card_details": "Στοιχεία κάρτας",
|
||||
"something_went_wrong_on_our_end": "Κάτι πήγε στραβά από την πλευρά μας. Επικοινωνήστε με την ομάδα υποστήριξής μας και θα το διορθώσουμε αμέσως για εσάς.",
|
||||
"please_provide_following_text_to_suppport": "Παρακαλούμε παρέχετε το ακόλουθο κείμενο όταν επικοινωνείτε με την υποστήριξη για καλύτερη βοήθεια",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Κρατήσεις",
|
||||
"pbac_resource_insights": "Αναλύσεις",
|
||||
"pbac_resource_role": "Ρόλοι",
|
||||
"pbac_resource_routing_form": "Φόρμες δρομολόγησης",
|
||||
"pbac_resource_workflow": "Ροές εργασίας",
|
||||
"pbac_action_all": "Όλες οι ενέργειες",
|
||||
"pbac_action_create": "Δημιουργία",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Όλες οι ενέργειες στις κρατήσεις",
|
||||
"pbac_desc_view_team_insights": "Προβολή αναλύσεων ομάδας",
|
||||
"pbac_desc_manage_team_insights": "Διαχείριση αναλύσεων ομάδας",
|
||||
"pbac_desc_create_routing_forms": "Δημιουργία φορμών δρομολόγησης",
|
||||
"pbac_desc_view_routing_forms": "Προβολή φορμών δρομολόγησης",
|
||||
"pbac_desc_update_routing_forms": "Ενημέρωση φορμών δρομολόγησης",
|
||||
"pbac_desc_delete_routing_forms": "Διαγραφή φορμών δρομολόγησης",
|
||||
"read_permission_auto_enabled_tooltip": "Το δικαίωμα ανάγνωσης ενεργοποιείται αυτόματα κατά τη δημιουργία, ενημέρωση ή διαγραφή ενός πόρου",
|
||||
"choose_restriction_schedule": "Προσθήκη προγράμματος περιορισμών",
|
||||
"restriction_schedule_description": "Περιορίστε τη διαθεσιμότητα των οικοδεσποτών ώστε να εμφανίζονται μόνο χρονοθυρίδες που εμπίπτουν σε ένα καθορισμένο πρόγραμμα.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Σκεφτείτε να δημιουργήσετε έναν οργανισμό για να ενοποιήσετε τη χρέωση, τα εργαλεία διαχείρισης και τα αναλυτικά στοιχεία σε όλες τις ομάδες σας.",
|
||||
"search_variables": "Αναζήτηση μεταβλητών",
|
||||
"no_variables_found": "Δεν βρέθηκαν μεταβλητές",
|
||||
"api_key_name_too_long": "Το όνομα δεν πρέπει να υπερβαίνει τους {{max}} χαρακτήρες",
|
||||
"auto_charge_for_last_minute_cancellation": "Αυτόματη χρέωση τέλους μη εμφάνισης για ακυρώσεις τελευταίας στιγμής",
|
||||
"before_scheduled_start_time": "Πριν την προγραμματισμένη ώρα έναρξης",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Αναγνωρίζω ότι με την ακύρωση της κράτησης εντός {{timeValue}} {{timeUnit}} από την ώρα έναρξης θα χρεωθώ το τέλος μη εμφάνισης ύψους {{amount, currency}}",
|
||||
"contact_organizer": "Εάν έχετε οποιεσδήποτε ερωτήσεις, παρακαλώ επικοινωνήστε με τον διοργανωτή.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Προσθέστε τις νέες συμβολοσειρές σας πάνω από εδώ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Embeds",
|
||||
"impersonation": "Impersonation",
|
||||
"impersonation_description": "Settings to manage user impersonation",
|
||||
"recent_impersonations": "Recent Impersonations",
|
||||
"quick_impersonate": "Quick Impersonate",
|
||||
"no_recent_impersonations": "No recent impersonations",
|
||||
"users": "Users",
|
||||
"user": "User",
|
||||
"profile_description": "Manage settings for your {{appName}} profile",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Require additional notes to be filled out when booking",
|
||||
"email_address_action": "send email to a specific email address",
|
||||
"after_event_trigger": "after event ends",
|
||||
"booking_rejected_trigger": "when booking is rejected",
|
||||
"booking_requested_trigger": "when booking is requested",
|
||||
"booking_payment_initiated_trigger": "when booking payment is initiated",
|
||||
"booking_paid_trigger": "when booking payment is successful",
|
||||
"booking_no_show_updated_trigger": "when booking no-show is updated",
|
||||
"how_long_after": "How long after event ends?",
|
||||
"how_long_after_hosts_no_show": "How long after hosts don't show up on cal video meeting?",
|
||||
"how_long_after_guests_no_show": "How long after guests don't show up on cal video meeting?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "When testing this workflow, be aware that Emails and SMS can only be scheduled at least 1 hour in advance",
|
||||
"insights_no_data_found_for_filter": "No data found for the selected filter or selected dates.",
|
||||
"acknowledge_booking_no_show_fee": "I acknowledge that if I do not attend this event that a {{amount, currency}} no show fee will be applied to my card.",
|
||||
"days": "days",
|
||||
"card_details": "Card details",
|
||||
"something_went_wrong_on_our_end": "Something went wrong on our end. Get in touch with our support team, and we'll get it fixed right away for you.",
|
||||
"please_provide_following_text_to_suppport": "Please provide the following text when contacting support to better help you",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Bookings",
|
||||
"pbac_resource_insights": "Insights",
|
||||
"pbac_resource_role": "Roles",
|
||||
"pbac_resource_routing_form": "Routing Forms",
|
||||
"pbac_resource_workflow": "Workflows",
|
||||
"pbac_action_all": "All Actions",
|
||||
"pbac_action_create": "Create",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "All actions on bookings",
|
||||
"pbac_desc_view_team_insights": "View team insights",
|
||||
"pbac_desc_manage_team_insights": "Manage team insights",
|
||||
"pbac_desc_create_routing_forms": "Create routing forms",
|
||||
"pbac_desc_view_routing_forms": "View routing forms",
|
||||
"pbac_desc_update_routing_forms": "Update routing forms",
|
||||
"pbac_desc_delete_routing_forms": "Delete routing forms",
|
||||
"read_permission_auto_enabled_tooltip": "Read permission is automatically enabled when creating, updating, or deleting a resource",
|
||||
"choose_restriction_schedule": "Add restriction schedule",
|
||||
"restriction_schedule_description": "Limit availability of hosts to only display slots that fall within a specified schedule.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Consider setting up an organization to unify billing, admin tools, and analytics across your teams.",
|
||||
"search_variables": "Search variables",
|
||||
"no_variables_found": "No variables found",
|
||||
"api_key_name_too_long": "Name must not exceed {{max}} characters",
|
||||
"auto_charge_for_last_minute_cancellation": "Auto charge no-show fee for last minute cancellations",
|
||||
"before_scheduled_start_time": "Before scheduled start time",
|
||||
"cancel_booking_acknowledge_no_show_fee": "I acknowledge that by cancelling the booking within {{timeValue}} {{timeUnit}} of the start time I will be charged the no show fee of {{amount, currency}}",
|
||||
"contact_organizer": "If you have any questions, please contact the organizer.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Incrustaciones",
|
||||
"impersonation": "Suplantación",
|
||||
"impersonation_description": "Configuraciones para gestionar la suplantación de usuarios",
|
||||
"recent_impersonations": "Suplantaciones recientes",
|
||||
"quick_impersonate": "Suplantar rápidamente",
|
||||
"no_recent_impersonations": "No hay suplantaciones recientes",
|
||||
"users": "Usuarios",
|
||||
"user": "Usuario",
|
||||
"profile_description": "Gestiona las configuraciones de tu perfil de {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Requiere que se llenen notas adicionales al reservar",
|
||||
"email_address_action": "enviar correo electrónico a una dirección específica",
|
||||
"after_event_trigger": "después de que termine el evento",
|
||||
"booking_rejected_trigger": "cuando la reserva es rechazada",
|
||||
"booking_requested_trigger": "cuando la reserva es solicitada",
|
||||
"booking_payment_initiated_trigger": "cuando se inicia el pago de la reserva",
|
||||
"booking_paid_trigger": "cuando el pago de la reserva es exitoso",
|
||||
"booking_no_show_updated_trigger": "cuando se actualiza la no presentación de la reserva",
|
||||
"how_long_after": "¿Cuánto tiempo después de que termine el evento?",
|
||||
"how_long_after_hosts_no_show": "¿Cuánto tiempo después de que los anfitriones no se presenten en la reunión de video de Cal?",
|
||||
"how_long_after_guests_no_show": "¿Cuánto tiempo después de que los invitados no se presenten en la reunión de video de Cal?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Al probar este flujo de trabajo, tenga en cuenta que los correos electrónicos y SMS solo se pueden programar con al menos 1 hora de anticipación",
|
||||
"insights_no_data_found_for_filter": "No se encontraron datos para el filtro o las fechas seleccionadas.",
|
||||
"acknowledge_booking_no_show_fee": "Reconozco que si no asisto a este evento, se aplicará una tarifa de no presentación de {{amount, currency}} a mi tarjeta.",
|
||||
"days": "días",
|
||||
"card_details": "Detalles de la tarjeta",
|
||||
"something_went_wrong_on_our_end": "Algo salió mal de nuestra parte. Ponte en contacto con nuestro equipo de soporte y lo solucionaremos de inmediato para ti.",
|
||||
"please_provide_following_text_to_suppport": "Por favor, proporcione el siguiente texto al contactar con el soporte para ayudarle mejor",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Reservas",
|
||||
"pbac_resource_insights": "Perspectivas",
|
||||
"pbac_resource_role": "Roles",
|
||||
"pbac_resource_routing_form": "Formularios de enrutamiento",
|
||||
"pbac_resource_workflow": "Flujos de trabajo",
|
||||
"pbac_action_all": "Todas las acciones",
|
||||
"pbac_action_create": "Crear",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Todas las acciones en reservas",
|
||||
"pbac_desc_view_team_insights": "Ver estadísticas del equipo",
|
||||
"pbac_desc_manage_team_insights": "Administrar estadísticas del equipo",
|
||||
"pbac_desc_create_routing_forms": "Crear formularios de enrutamiento",
|
||||
"pbac_desc_view_routing_forms": "Ver formularios de enrutamiento",
|
||||
"pbac_desc_update_routing_forms": "Actualizar formularios de enrutamiento",
|
||||
"pbac_desc_delete_routing_forms": "Eliminar formularios de enrutamiento",
|
||||
"read_permission_auto_enabled_tooltip": "El permiso de lectura se habilita automáticamente al crear, actualizar o eliminar un recurso",
|
||||
"choose_restriction_schedule": "Agregar horario de restricción",
|
||||
"restriction_schedule_description": "Limita la disponibilidad de los anfitriones para mostrar solo espacios que se encuentren dentro de un horario específico.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Considera configurar una organización para unificar la facturación, herramientas de administración y análisis en tus equipos.",
|
||||
"search_variables": "Buscar variables",
|
||||
"no_variables_found": "No se encontraron variables",
|
||||
"api_key_name_too_long": "El nombre no debe exceder los {{max}} caracteres",
|
||||
"auto_charge_for_last_minute_cancellation": "Cobrar automáticamente la tarifa por no presentarse en caso de cancelaciones de último minuto",
|
||||
"before_scheduled_start_time": "Antes de la hora de inicio programada",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Reconozco que al cancelar la reserva dentro de los {{timeValue}} {{timeUnit}} previos a la hora de inicio, se me cobrará la tarifa por no presentarme de {{amount, currency}}",
|
||||
"contact_organizer": "Si tienes alguna pregunta, comunícate con el organizador.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Agrega tus nuevas cadenas arriba de esta línea ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Inserciones",
|
||||
"impersonation": "Suplantación",
|
||||
"impersonation_description": "Configuración para administrar la suplantación del usuario",
|
||||
"recent_impersonations": "Suplantaciones recientes",
|
||||
"quick_impersonate": "Suplantar rápidamente",
|
||||
"no_recent_impersonations": "No hay suplantaciones recientes",
|
||||
"users": "Usuarios",
|
||||
"user": "Usuario",
|
||||
"profile_description": "Administra los ajustes para tu perfil de {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Solicitar completar las notas adicionales al reservar",
|
||||
"email_address_action": "enviar un correo electrónico a una dirección específica",
|
||||
"after_event_trigger": "después de que el evento termine",
|
||||
"booking_rejected_trigger": "cuando la reserva es rechazada",
|
||||
"booking_requested_trigger": "cuando la reserva es solicitada",
|
||||
"booking_payment_initiated_trigger": "cuando el pago de la reserva es iniciado",
|
||||
"booking_paid_trigger": "cuando el pago de la reserva es exitoso",
|
||||
"booking_no_show_updated_trigger": "cuando la no presentación de la reserva es actualizada",
|
||||
"how_long_after": "¿Cuánto tiempo después de que termine el evento?",
|
||||
"how_long_after_hosts_no_show": "¿Cuánto tiempo después de que los anfitriones no se presenten en la reunión de video de Cal?",
|
||||
"how_long_after_guests_no_show": "¿Cuánto tiempo después de que los invitados no se presenten en la reunión de video de Cal?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Al probar este flujo de trabajo, tenga en cuenta que los correos electrónicos y los SMS solo se pueden programar con al menos 1 hora de anticipación",
|
||||
"insights_no_data_found_for_filter": "No se encontraron datos para el filtro seleccionado o las fechas seleccionadas.",
|
||||
"acknowledge_booking_no_show_fee": "Reconozco que si no asisto a este evento, se aplicará a mi tarjeta una tarifa de {{amount, currency}} por no presentarme.",
|
||||
"days": "días",
|
||||
"card_details": "Detalles de la tarjeta",
|
||||
"something_went_wrong_on_our_end": "Algo salió mal por nuestra parte. Ponte en contacto con nuestro equipo de soporte y lo solucionaremos de inmediato.",
|
||||
"please_provide_following_text_to_suppport": "Proporcione el siguiente texto cuando se comunique con el soporte para ayudarlo mejor",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Reservas",
|
||||
"pbac_resource_insights": "Perspectivas",
|
||||
"pbac_resource_role": "Roles",
|
||||
"pbac_resource_routing_form": "Formularios de enrutamiento",
|
||||
"pbac_resource_workflow": "Flujos de trabajo",
|
||||
"pbac_action_all": "Todas las acciones",
|
||||
"pbac_action_create": "Crear",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Todas las acciones en reservas",
|
||||
"pbac_desc_view_team_insights": "Ver estadísticas del equipo",
|
||||
"pbac_desc_manage_team_insights": "Gestionar estadísticas del equipo",
|
||||
"pbac_desc_create_routing_forms": "Crear formularios de enrutamiento",
|
||||
"pbac_desc_view_routing_forms": "Ver formularios de enrutamiento",
|
||||
"pbac_desc_update_routing_forms": "Actualizar formularios de enrutamiento",
|
||||
"pbac_desc_delete_routing_forms": "Eliminar formularios de enrutamiento",
|
||||
"read_permission_auto_enabled_tooltip": "El permiso de lectura se habilita automáticamente al crear, actualizar o eliminar un recurso",
|
||||
"choose_restriction_schedule": "Añadir horario de restricción",
|
||||
"restriction_schedule_description": "Limita la disponibilidad de los anfitriones para mostrar solo los espacios que se encuentran dentro de un horario específico.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Considera configurar una organización para unificar la facturación, herramientas de administración y análisis en tus equipos.",
|
||||
"search_variables": "Buscar variables",
|
||||
"no_variables_found": "No se encontraron variables",
|
||||
"api_key_name_too_long": "El nombre no debe exceder los {{max}} caracteres",
|
||||
"auto_charge_for_last_minute_cancellation": "Cobrar automáticamente la tarifa por no presentarse en caso de cancelaciones de último minuto",
|
||||
"before_scheduled_start_time": "Antes de la hora de inicio programada",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Reconozco que al cancelar la reserva dentro de los {{timeValue}} {{timeUnit}} previos a la hora de inicio, se me cobrará la tarifa por no presentarme de {{amount, currency}}",
|
||||
"contact_organizer": "Si tienes alguna pregunta, por favor contacta al organizador.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Agregue sus nuevas cadenas arriba ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Manustad",
|
||||
"impersonation": "Esinemine kellegi teisena",
|
||||
"impersonation_description": "Kasutaja kellegi teisena esinemise haldamise seaded",
|
||||
"recent_impersonations": "Hiljutised esindamised",
|
||||
"quick_impersonate": "Kiir-esindamine",
|
||||
"no_recent_impersonations": "Hiljutisi esindamisi pole",
|
||||
"users": "Kasutajad",
|
||||
"user": "Kasutaja",
|
||||
"profile_description": "Hallake oma {{appName}} profiili seadeid",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Nõua broneerimisel lisamärkuste täitmist",
|
||||
"email_address_action": "saada e-kiri kindlale e-posti aadressile",
|
||||
"after_event_trigger": "pärast sündmuse lõppu",
|
||||
"booking_rejected_trigger": "kui broneeringust keeldutakse",
|
||||
"booking_requested_trigger": "kui broneering on taotletud",
|
||||
"booking_payment_initiated_trigger": "kui broneeringu makse algatatakse",
|
||||
"booking_paid_trigger": "kui broneeringu makse on edukas",
|
||||
"booking_no_show_updated_trigger": "kui broneeringu mitteilmumine on uuendatud",
|
||||
"how_long_after": "Kui kaua pärast ürituse lõppu?",
|
||||
"how_long_after_hosts_no_show": "Kui kaua pärast seda, kui võõrustajad ei ilmu Cal videokoosolekule?",
|
||||
"how_long_after_guests_no_show": "Kui kaua pärast seda, kui külalised ei ilmu Cal videokoosolekule?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Selle töövoo testimisel pidage meeles, et e-kirju ja SMS-e saab ajastada ainult vähemalt 1 tund ette",
|
||||
"insights_no_data_found_for_filter": "Valitud filtri või valitud kuupäevade kohta andmeid ei leitud.",
|
||||
"acknowledge_booking_no_show_fee": "Ma tean, et kui ma sellel üritusel ei osale, rakendatakse minu kaardile {{summa, valuuta}} mitteilmumise tasu.",
|
||||
"days": "päevad",
|
||||
"card_details": "Kaardi andmed",
|
||||
"something_went_wrong_on_our_end": "Midagi läks meie poolel valesti. Võtke ühendust meie tugitiimiga ja me lahendame selle kohe teie jaoks.",
|
||||
"please_provide_following_text_to_suppport": "Teid paremaks abistamiseks esitage tugiteenusega ühenduse võtmisel järgmine tekst",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Broneeringud",
|
||||
"pbac_resource_insights": "Teadmised",
|
||||
"pbac_resource_role": "Rollid",
|
||||
"pbac_resource_routing_form": "Marsruutimisvormid",
|
||||
"pbac_resource_workflow": "Töövood",
|
||||
"pbac_action_all": "Kõik toimingud",
|
||||
"pbac_action_create": "Loo",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Kõik toimingud broneeringutega",
|
||||
"pbac_desc_view_team_insights": "Vaata meeskonna ülevaateid",
|
||||
"pbac_desc_manage_team_insights": "Halda meeskonna ülevaateid",
|
||||
"pbac_desc_create_routing_forms": "Loo marsruutimisvorme",
|
||||
"pbac_desc_view_routing_forms": "Vaata marsruutimisvorme",
|
||||
"pbac_desc_update_routing_forms": "Uuenda marsruutimisvorme",
|
||||
"pbac_desc_delete_routing_forms": "Kustuta marsruutimisvorme",
|
||||
"read_permission_auto_enabled_tooltip": "Lugemisõigus lubatakse automaatselt ressursi loomisel, uuendamisel või kustutamisel",
|
||||
"choose_restriction_schedule": "Lisa piirangute ajakava",
|
||||
"restriction_schedule_description": "Piira hostide saadavust, et kuvada ainult ajavahemikke, mis jäävad määratud ajakava sisse.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Kaaluge organisatsiooni loomist, et ühtlustada arveldamist, haldustööriistu ja analüütikat oma meeskondade vahel.",
|
||||
"search_variables": "Otsi muutujaid",
|
||||
"no_variables_found": "Muutujaid ei leitud",
|
||||
"api_key_name_too_long": "Nimi ei tohi ületada {{max}} tähemärki",
|
||||
"auto_charge_for_last_minute_cancellation": "Viimase hetke tühistamiste eest puudumise tasu automaatne arvestamine",
|
||||
"before_scheduled_start_time": "Enne planeeritud algusaega",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Mõistan, et tühistades broneeringu {{timeValue}} {{timeUnit}} jooksul enne algusaega, võetakse minult puudumise tasu summas {{amount, currency}}",
|
||||
"contact_organizer": "Kui teil on küsimusi, võtke palun ühendust korraldajaga.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Txertaketak",
|
||||
"impersonation": "Ordezkatzea",
|
||||
"impersonation_description": "Erabiltzaile ordezkatzearen ezarpenak kudeatu",
|
||||
"recent_impersonations": "Azken nortasun-ordezkatzeak",
|
||||
"quick_impersonate": "Nortasun-ordezkatze azkarra",
|
||||
"no_recent_impersonations": "Ez dago azken nortasun-ordezkatzerik",
|
||||
"users": "Erabiltzaileak",
|
||||
"user": "Erabiltzailea",
|
||||
"profile_description": "Kudeatu zure {{appName}} profilaren ezarpenak",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Erreserba egiterakoan ohar gehigarriak betetzea beharrezkoa izan dadila",
|
||||
"email_address_action": "bidali emaila email helbide jakin batera",
|
||||
"after_event_trigger": "gertaera bukatu ondoren",
|
||||
"booking_rejected_trigger": "erreserba errefusatzen denean",
|
||||
"booking_requested_trigger": "erreserba eskatzen denean",
|
||||
"booking_payment_initiated_trigger": "erreserba ordainketa hasten denean",
|
||||
"booking_paid_trigger": "erreserba ordainketa arrakastatsua denean",
|
||||
"booking_no_show_updated_trigger": "ez agertzea eguneratzen denean",
|
||||
"how_long_after": "Gertaera bukatzen denetik zenbat denborara?",
|
||||
"how_long_after_hosts_no_show": "Zenbat denbora igaro behar da ostalariak Cal bideo-bileran agertzen ez direnean?",
|
||||
"how_long_after_guests_no_show": "Zenbat denbora igaro behar da gonbidatuak Cal bideo-bileran agertzen ez direnean?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Lan-fluxu hau probatzean, kontuan izan e-mailak eta SMSak gutxienez ordubete lehenago soilik programa daitezkeela",
|
||||
"insights_no_data_found_for_filter": "Ez da daturik aurkitu hautatutako iragazkirako edo hautatutako datetan.",
|
||||
"acknowledge_booking_no_show_fee": "Onartzen dut ekitaldi honetara ez joatekotan nire txartelean {{amount, currency}}-ko ez agertzeagatiko tarifa kobratuko zaidala.",
|
||||
"days": "egun",
|
||||
"card_details": "Txartelaren xehetasunak",
|
||||
"something_went_wrong_on_our_end": "Zerbait gaizki joan da gure aldetik. Jarri harremanetan gure laguntza-taldearekin, eta berehala konponduko dizugu.",
|
||||
"please_provide_following_text_to_suppport": "Mesedez, eman ondorengo testua laguntzarekin harremanetan jartzerakoan hobeto lagundu ahal izateko",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Erreserbak",
|
||||
"pbac_resource_insights": "Ikuspegiak",
|
||||
"pbac_resource_role": "Eginkizunak",
|
||||
"pbac_resource_routing_form": "Bideratze-formularioak",
|
||||
"pbac_resource_workflow": "Lan-fluxuak",
|
||||
"pbac_action_all": "Ekintza guztiak",
|
||||
"pbac_action_create": "Sortu",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Erreserbetan ekintza guztiak",
|
||||
"pbac_desc_view_team_insights": "Taldearen estatistikak ikusi",
|
||||
"pbac_desc_manage_team_insights": "Taldearen estatistikak kudeatu",
|
||||
"pbac_desc_create_routing_forms": "Bideratze-formularioak sortu",
|
||||
"pbac_desc_view_routing_forms": "Bideratze-formularioak ikusi",
|
||||
"pbac_desc_update_routing_forms": "Bideratze-formularioak eguneratu",
|
||||
"pbac_desc_delete_routing_forms": "Bideratze-formularioak ezabatu",
|
||||
"read_permission_auto_enabled_tooltip": "Irakurtzeko baimena automatikoki gaituta dago baliabide bat sortu, eguneratu edo ezabatzean",
|
||||
"choose_restriction_schedule": "Gehitu murrizketa-ordutegia",
|
||||
"restriction_schedule_description": "Ostalariaren erabilgarritasuna mugatu zehaztutako ordutegi baten barruan dauden txandak soilik erakusteko.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Pentsatu erakunde bat sortzeaz zure taldeen fakturazioa, administrazio-tresnak eta analitika bateratzeko.",
|
||||
"search_variables": "Bilatu aldagaiak",
|
||||
"no_variables_found": "Ez da aldagairik aurkitu",
|
||||
"api_key_name_too_long": "Izenak ezin ditu {{max}} karaktere baino gehiago izan",
|
||||
"auto_charge_for_last_minute_cancellation": "Azken minutuko ezeztapenengatik ez agertzeko tasa automatikoki kobratu",
|
||||
"before_scheduled_start_time": "Programatutako hasiera ordua baino lehen",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Onartzen dut hasiera ordua baino {{timeValue}} {{timeUnit}} lehenago erreserba ezeztatuz gero, {{amount, currency}}-ko ez agertzeko tasa kobratuko zaidala",
|
||||
"contact_organizer": "Galderarik baduzu, jarri harremanetan antolatzailearekin.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Gehitu zure kate berriak honen gainean ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Upotukset",
|
||||
"impersonation": "Käyttäjänä esiintyminen",
|
||||
"impersonation_description": "Käyttäjänä esiintymisen hallinta-asetukset",
|
||||
"recent_impersonations": "Viimeaikaiset esiintymiset",
|
||||
"quick_impersonate": "Nopea esiintyminen",
|
||||
"no_recent_impersonations": "Ei viimeaikaisia esiintymisiä",
|
||||
"users": "Käyttäjät",
|
||||
"user": "Käyttäjä",
|
||||
"profile_description": "Hallinnoi {{appName}}-profiilisi asetuksia",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Vaadi lisätietojen täyttämistä varauksen yhteydessä",
|
||||
"email_address_action": "lähetä sähköposti tiettyyn osoitteeseen",
|
||||
"after_event_trigger": "tapahtuman päättymisen jälkeen",
|
||||
"booking_rejected_trigger": "kun varaus hylätään",
|
||||
"booking_requested_trigger": "kun varaus pyydetään",
|
||||
"booking_payment_initiated_trigger": "kun varauksen maksu aloitetaan",
|
||||
"booking_paid_trigger": "kun varauksen maksu onnistuu",
|
||||
"booking_no_show_updated_trigger": "kun varauksen no-show päivitetään",
|
||||
"how_long_after": "Kuinka kauan tapahtuman päättymisen jälkeen?",
|
||||
"how_long_after_hosts_no_show": "Kuinka kauan sen jälkeen, kun järjestäjät eivät saavu Cal-videotapaamiseen?",
|
||||
"how_long_after_guests_no_show": "Kuinka kauan sen jälkeen, kun vieraat eivät saavu Cal-videotapaamiseen?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Huomioi tätä työnkulkua testatessasi, että sähköpostit ja tekstiviestit voidaan ajastaa vain vähintään 1 tunnin päähän",
|
||||
"insights_no_data_found_for_filter": "Valituilla suodattimilla tai päivämäärillä ei löytynyt tietoja.",
|
||||
"acknowledge_booking_no_show_fee": "Hyväksyn, että mikäli en saavu paikalle, kortiltani veloitetaan {{amount, currency}} saapumattajättämismaksu.",
|
||||
"days": "päivää",
|
||||
"card_details": "Kortin tiedot",
|
||||
"something_went_wrong_on_our_end": "Jotain meni vikaan meidän päässämme. Ota yhteyttä asiakaspalveluumme, ja korjaamme ongelman sinulle välittömästi.",
|
||||
"please_provide_following_text_to_suppport": "Anna seuraava teksti ottaessasi yhteyttä tukeen, jotta voimme auttaa sinua paremmin",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Varaukset",
|
||||
"pbac_resource_insights": "Analytiikka",
|
||||
"pbac_resource_role": "Roolit",
|
||||
"pbac_resource_routing_form": "Reitityskaavakkeet",
|
||||
"pbac_resource_workflow": "Työnkulut",
|
||||
"pbac_action_all": "Kaikki toiminnot",
|
||||
"pbac_action_create": "Luo",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Kaikki varauksiin liittyvät toiminnot",
|
||||
"pbac_desc_view_team_insights": "Näytä tiimin analytiikka",
|
||||
"pbac_desc_manage_team_insights": "Hallinnoi tiimin analytiikkaa",
|
||||
"pbac_desc_create_routing_forms": "Luo reitityskaavakkeita",
|
||||
"pbac_desc_view_routing_forms": "Tarkastele reitityskaavakkeita",
|
||||
"pbac_desc_update_routing_forms": "Päivitä reitityskaavakkeita",
|
||||
"pbac_desc_delete_routing_forms": "Poista reitityskaavakkeita",
|
||||
"read_permission_auto_enabled_tooltip": "Lukuoikeus otetaan automaattisesti käyttöön, kun luot, päivität tai poistat resurssin",
|
||||
"choose_restriction_schedule": "Lisää rajoitusaikataulu",
|
||||
"restriction_schedule_description": "Rajoita isäntien saatavuutta näyttämään vain aikavälit, jotka osuvat määritellyn aikataulun sisälle.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Harkitse organisaation perustamista yhdistääksesi laskutuksen, hallintatyökalut ja analytiikan tiimiesi kesken.",
|
||||
"search_variables": "Etsi muuttujia",
|
||||
"no_variables_found": "Muuttujia ei löytynyt",
|
||||
"api_key_name_too_long": "Nimi ei saa ylittää {{max}} merkkiä",
|
||||
"auto_charge_for_last_minute_cancellation": "Veloita automaattisesti peruutusmaksu viime hetken peruutuksista",
|
||||
"before_scheduled_start_time": "Ennen sovittua aloitusaikaa",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Ymmärrän, että peruuttaessani varauksen {{timeValue}} {{timeUnit}} sisällä aloitusajasta minulta veloitetaan peruutusmaksu {{amount, currency}}",
|
||||
"contact_organizer": "Jos sinulla on kysyttävää, ota yhteyttä järjestäjään.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Lisää uudet merkkijonot tämän yläpuolelle ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Intégrations",
|
||||
"impersonation": "Emprunt d'identité",
|
||||
"impersonation_description": "Gérez les paramètres d'emprunt d'identité.",
|
||||
"recent_impersonations": "Usurpations récentes",
|
||||
"quick_impersonate": "Usurpation rapide",
|
||||
"no_recent_impersonations": "Aucune usurpation récente",
|
||||
"users": "Utilisateurs",
|
||||
"user": "Utilisateur",
|
||||
"profile_description": "Gérez les paramètres de votre profil {{appName}}.",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Exigez des notes supplémentaires à saisir lors de la réservation.",
|
||||
"email_address_action": "envoyer un e-mail à une adresse e-mail spécifique",
|
||||
"after_event_trigger": "après la fin de l'événement",
|
||||
"booking_rejected_trigger": "lorsque la réservation est rejetée",
|
||||
"booking_requested_trigger": "lorsque la réservation est demandée",
|
||||
"booking_payment_initiated_trigger": "lorsque le paiement de la réservation est initié",
|
||||
"booking_paid_trigger": "lorsque le paiement de la réservation est réussi",
|
||||
"booking_no_show_updated_trigger": "lorsque l'absence au rendez-vous est mise à jour",
|
||||
"how_long_after": "Combien de temps après la fin de l'événement ?",
|
||||
"how_long_after_hosts_no_show": "Combien de temps après que les hôtes ne se présentent pas à la réunion vidéo Cal ?",
|
||||
"how_long_after_guests_no_show": "Combien de temps après que les invités ne se présentent pas à la réunion vidéo Cal ?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Lors du test de ce workflow, sachez que les e-mails et les SMS ne peuvent être programmés qu'au moins 1 heure à l'avance",
|
||||
"insights_no_data_found_for_filter": "Aucune donnée trouvée pour le filtre ou les dates sélectionnés.",
|
||||
"acknowledge_booking_no_show_fee": "Je reconnais que si je ne participe pas à cet événement, des frais d'absence de {{amount, currency}} seront appliqués à ma carte.",
|
||||
"days": "jours",
|
||||
"card_details": "Détails de la carte",
|
||||
"something_went_wrong_on_our_end": "Un problème est survenu de notre côté. Contactez notre équipe d'assistance, et nous le résoudrons immédiatement pour vous.",
|
||||
"please_provide_following_text_to_suppport": "Veuillez fournir le texte suivant lorsque vous contactez le support pour mieux vous aider",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Réservations",
|
||||
"pbac_resource_insights": "Statistiques",
|
||||
"pbac_resource_role": "Rôles",
|
||||
"pbac_resource_routing_form": "Formulaires de routage",
|
||||
"pbac_resource_workflow": "Workflows",
|
||||
"pbac_action_all": "Toutes les actions",
|
||||
"pbac_action_create": "Créer",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Toutes les actions sur les réservations",
|
||||
"pbac_desc_view_team_insights": "Voir les analyses de l'équipe",
|
||||
"pbac_desc_manage_team_insights": "Gérer les analyses de l'équipe",
|
||||
"pbac_desc_create_routing_forms": "Créer des formulaires de routage",
|
||||
"pbac_desc_view_routing_forms": "Voir les formulaires de routage",
|
||||
"pbac_desc_update_routing_forms": "Mettre à jour les formulaires de routage",
|
||||
"pbac_desc_delete_routing_forms": "Supprimer les formulaires de routage",
|
||||
"read_permission_auto_enabled_tooltip": "L'autorisation de lecture est automatiquement activée lors de la création, la mise à jour ou la suppression d'une ressource",
|
||||
"choose_restriction_schedule": "Ajouter un calendrier de restriction",
|
||||
"restriction_schedule_description": "Limiter la disponibilité des hôtes pour n'afficher que les créneaux qui correspondent à un horaire spécifié.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Envisagez de créer une organisation pour unifier la facturation, les outils d'administration et les analyses pour vos équipes.",
|
||||
"search_variables": "Rechercher des variables",
|
||||
"no_variables_found": "Aucune variable trouvée",
|
||||
"api_key_name_too_long": "Le nom ne doit pas dépasser {{max}} caractères",
|
||||
"auto_charge_for_last_minute_cancellation": "Facturer automatiquement des frais de non-présentation pour les annulations de dernière minute",
|
||||
"before_scheduled_start_time": "Avant l'heure de début prévue",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Je reconnais qu'en annulant la réservation dans les {{timeValue}} {{timeUnit}} précédant l'heure de début, des frais de non-présentation de {{amount, currency}} me seront facturés",
|
||||
"contact_organizer": "Si vous avez des questions, veuillez contacter l'organisateur.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Ajoutez vos nouvelles chaînes ci-dessus ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "הטמעות",
|
||||
"impersonation": "התחזות",
|
||||
"impersonation_description": "הגדרות לניהול התחזות למשתמשים",
|
||||
"recent_impersonations": "התחזויות אחרונות",
|
||||
"quick_impersonate": "התחזות מהירה",
|
||||
"no_recent_impersonations": "אין התחזויות אחרונות",
|
||||
"users": "משתמשים",
|
||||
"user": "משתמש",
|
||||
"profile_description": "ניהול הגדרות עבור פרופיל {{appName}} שלך",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "לדרוש למלא הערות נוספות בעת ביצוע הזמנה",
|
||||
"email_address_action": "לשלוח דוא״ל לכתובת מסוימת",
|
||||
"after_event_trigger": "לאחר סיום האירוע",
|
||||
"booking_rejected_trigger": "כאשר הזמנה נדחית",
|
||||
"booking_requested_trigger": "כאשר מתקבלת בקשת הזמנה",
|
||||
"booking_payment_initiated_trigger": "כאשר מופעל תשלום על הזמנה",
|
||||
"booking_paid_trigger": "כאשר התשלום על ההזמנה הושלם בהצלחה",
|
||||
"booking_no_show_updated_trigger": "כאשר מתעדכן סטטוס אי-הופעה בהזמנה",
|
||||
"how_long_after": "כמה זמן לאחר סיום האירוע?",
|
||||
"how_long_after_hosts_no_show": "כמה זמן לאחר שהמארחים לא מופיעים בשיחת הווידאו ב-Cal?",
|
||||
"how_long_after_guests_no_show": "כמה זמן לאחר שהאורחים לא מופיעים בשיחת הווידאו ב-Cal?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "במהלך בדיקת תהליך העבודה הזה, קח/י בחשבון שניתן לתזמן הודעות דוא\"ל ו-SMS לפחות שעה אחת מראש",
|
||||
"insights_no_data_found_for_filter": "לא נמצאו נתונים עבור המסנן שנבחר או התאריכים שנבחרו.",
|
||||
"acknowledge_booking_no_show_fee": "מובן לי שאם לא אשתתף באירוע הזה, דמי אי-הגעה בסך {{amount, currency}} ינוכו מהכרטיס שלי.",
|
||||
"days": "ימים",
|
||||
"card_details": "פרטי כרטיס",
|
||||
"something_went_wrong_on_our_end": "משהו השתבש בצד שלנו. צור/י קשר עם צוות התמיכה שלנו, ואנו נתקן זאת עבורך בהקדם.",
|
||||
"please_provide_following_text_to_suppport": "כשפונים לתמיכה, יש לספק את הטקסט הבא כדי שנוכל לסייע לך בצורה יעילה יותר",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "הזמנות",
|
||||
"pbac_resource_insights": "תובנות",
|
||||
"pbac_resource_role": "תפקידים",
|
||||
"pbac_resource_routing_form": "טפסי ניתוב",
|
||||
"pbac_resource_workflow": "תהליכים",
|
||||
"pbac_action_all": "כל הפעולות",
|
||||
"pbac_action_create": "יצירה",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "כל הפעולות על הזמנות",
|
||||
"pbac_desc_view_team_insights": "צפייה בתובנות הצוות",
|
||||
"pbac_desc_manage_team_insights": "ניהול תובנות הצוות",
|
||||
"pbac_desc_create_routing_forms": "יצירת טפסי ניתוב",
|
||||
"pbac_desc_view_routing_forms": "צפייה בטפסי ניתוב",
|
||||
"pbac_desc_update_routing_forms": "עדכון טפסי ניתוב",
|
||||
"pbac_desc_delete_routing_forms": "מחיקת טפסי ניתוב",
|
||||
"read_permission_auto_enabled_tooltip": "הרשאת קריאה מופעלת אוטומטית בעת יצירה, עדכון או מחיקה של משאב",
|
||||
"choose_restriction_schedule": "הוספת לוח זמנים מגביל",
|
||||
"restriction_schedule_description": "הגבל את הזמינות של המארחים כך שיוצגו רק משבצות זמן שנופלות בתוך לוח זמנים מוגדר.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "שקול להקים ארגון כדי לאחד חיובים, כלי ניהול ואנליטיקה עבור הצוותים שלך.",
|
||||
"search_variables": "חפש משתנים",
|
||||
"no_variables_found": "לא נמצאו משתנים",
|
||||
"api_key_name_too_long": "השם לא יכול לעלות על {{max}} תווים",
|
||||
"auto_charge_for_last_minute_cancellation": "חיוב אוטומטי של דמי אי-הופעה עבור ביטולים ברגע האחרון",
|
||||
"before_scheduled_start_time": "לפני זמן ההתחלה המתוכנן",
|
||||
"cancel_booking_acknowledge_no_show_fee": "אני מאשר/ת שבביטול ההזמנה תוך {{timeValue}} {{timeUnit}} מזמן ההתחלה אחויב בדמי אי-הופעה בסך {{amount, currency}}",
|
||||
"contact_organizer": "אם יש לך שאלות כלשהן, אנא צור/י קשר עם המארגן.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Beágyazás",
|
||||
"impersonation": "Megszemélyesítés",
|
||||
"impersonation_description": "Beállítások a felhasználói megszemélyesítés kezeléséhez",
|
||||
"recent_impersonations": "Legutóbbi megszemélyesítések",
|
||||
"quick_impersonate": "Gyors megszemélyesítés",
|
||||
"no_recent_impersonations": "Nincsenek legutóbbi megszemélyesítések",
|
||||
"users": "Felhasználók",
|
||||
"user": "Felhasználó",
|
||||
"profile_description": "Kezelje {{appName}}-profiljának beállításait",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Kötelező kitölteni az egyéb megjegyzéeseket a foglaláshoz",
|
||||
"email_address_action": "küldjön e-mailt egy adott e-mail címre",
|
||||
"after_event_trigger": "az esemény befejezése után",
|
||||
"booking_rejected_trigger": "amikor a foglalás visszautasításra kerül",
|
||||
"booking_requested_trigger": "amikor foglalást kérnek",
|
||||
"booking_payment_initiated_trigger": "amikor a foglalási fizetés elindításra kerül",
|
||||
"booking_paid_trigger": "amikor a foglalási fizetés sikeres",
|
||||
"booking_no_show_updated_trigger": "amikor a foglalás meg nem jelenése frissítésre kerül",
|
||||
"how_long_after": "Mennyi idővel az esemény vége után?",
|
||||
"how_long_after_hosts_no_show": "Mennyi idő után, ha a házigazdák nem jelennek meg a cal videó találkozón?",
|
||||
"how_long_after_guests_no_show": "Mennyi idő után, ha a vendégek nem jelennek meg a cal videó találkozón?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "A munkafolyamat tesztelésekor ügyeljen arra, hogy az e-mailek és SMS-ek legalább 1 órával későbbre ütemezhetők",
|
||||
"insights_no_data_found_for_filter": "Nem található adat a kiválasztott szűrőhöz vagy a kiválasztott dátumokhoz.",
|
||||
"acknowledge_booking_no_show_fee": "Tudomásul veszem, hogy ha nem veszek részt ezen az eseményen, {{amount, currency}} meg nem jelenési díj kerül felszámításra.",
|
||||
"days": "nap",
|
||||
"card_details": "Kártya adatai",
|
||||
"something_went_wrong_on_our_end": "Valami hiba történt a mi oldalunkon. Vedd fel a kapcsolatot az ügyfélszolgálatunkkal, és azonnal kijavítjuk neked.",
|
||||
"please_provide_following_text_to_suppport": "Kérjük, adja meg a következő szöveget, amikor kapcsolatba lép az ügyfélszolgálattal, hogy jobban segíthessünk",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Foglalások",
|
||||
"pbac_resource_insights": "Betekintések",
|
||||
"pbac_resource_role": "Szerepkörök",
|
||||
"pbac_resource_routing_form": "Irányító űrlapok",
|
||||
"pbac_resource_workflow": "Munkafolyamatok",
|
||||
"pbac_action_all": "Minden művelet",
|
||||
"pbac_action_create": "Létrehozás",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Minden művelet a foglalásokon",
|
||||
"pbac_desc_view_team_insights": "Csapat elemzéseinek megtekintése",
|
||||
"pbac_desc_manage_team_insights": "Csapat elemzéseinek kezelése",
|
||||
"pbac_desc_create_routing_forms": "Irányító űrlapok létrehozása",
|
||||
"pbac_desc_view_routing_forms": "Irányító űrlapok megtekintése",
|
||||
"pbac_desc_update_routing_forms": "Irányító űrlapok frissítése",
|
||||
"pbac_desc_delete_routing_forms": "Irányító űrlapok törlése",
|
||||
"read_permission_auto_enabled_tooltip": "Az olvasási jogosultság automatikusan engedélyezve van erőforrás létrehozásakor, frissítésekor vagy törlésekor",
|
||||
"choose_restriction_schedule": "Korlátozási ütemterv hozzáadása",
|
||||
"restriction_schedule_description": "Korlátozza a házigazdák elérhetőségét, hogy csak a megadott időbeosztáson belüli időpontokat jelenítse meg.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Fontold meg egy szervezet létrehozását a számlázás, az adminisztrációs eszközök és az elemzések egyesítéséhez a csapataidban.",
|
||||
"search_variables": "Változók keresése",
|
||||
"no_variables_found": "Nem találhatók változók",
|
||||
"api_key_name_too_long": "A név nem haladhatja meg a {{max}} karaktert",
|
||||
"auto_charge_for_last_minute_cancellation": "Automatikus lemondási díj felszámolása az utolsó pillanatban történő lemondásokért",
|
||||
"before_scheduled_start_time": "A tervezett kezdési idő előtt",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Tudomásul veszem, hogy a foglalás lemondásával a kezdési időpont előtti {{timeValue}} {{timeUnit}}on belül felszámításra kerül a meg nem jelenési díj: {{amount, currency}}",
|
||||
"contact_organizer": "Ha bármilyen kérdése van, kérjük, vegye fel a kapcsolatot a szervezővel.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adja hozzá az új karakterláncokat fent ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Integrazioni",
|
||||
"impersonation": "Accesso con altra identità",
|
||||
"impersonation_description": "Impostazioni per gestire gli accessi con altra identità",
|
||||
"recent_impersonations": "Impersonificazioni recenti",
|
||||
"quick_impersonate": "Impersonificazione rapida",
|
||||
"no_recent_impersonations": "Nessuna impersonificazione recente",
|
||||
"users": "Utenti",
|
||||
"user": "Utente",
|
||||
"profile_description": "Gestisci le impostazioni del tuo profilo {{appName}}",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "Chiedi di compilare le note aggiuntive al momento della prenotazione",
|
||||
"email_address_action": "invia e-mail a un indirizzo e-mail specifico",
|
||||
"after_event_trigger": "dopo la fine dell'evento",
|
||||
"booking_rejected_trigger": "quando la prenotazione viene rifiutata",
|
||||
"booking_requested_trigger": "quando viene richiesta una prenotazione",
|
||||
"booking_payment_initiated_trigger": "quando viene avviato il pagamento della prenotazione",
|
||||
"booking_paid_trigger": "quando il pagamento della prenotazione è andato a buon fine",
|
||||
"booking_no_show_updated_trigger": "quando lo stato no-show della prenotazione viene aggiornato",
|
||||
"how_long_after": "Quanto tempo dopo la fine dell'evento?",
|
||||
"how_long_after_hosts_no_show": "Quanto tempo dopo che gli host non si presentano alla riunione video di Cal?",
|
||||
"how_long_after_guests_no_show": "Quanto tempo dopo che gli ospiti non si presentano alla riunione video di Cal?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "Durante il test di questo flusso di lavoro, tieni presente che le e-mail e i messaggi SMS devono essere programmati con almeno 1 ora di anticipo",
|
||||
"insights_no_data_found_for_filter": "Nessun dato trovato per il filtro selezionato o le date selezionate.",
|
||||
"acknowledge_booking_no_show_fee": "Confermo che in caso di mia mancata partecipazione a questo evento, una penale per mancata presentazione di {{amount, currency}} verrà addebitata sulla mia carta.",
|
||||
"days": "giorni",
|
||||
"card_details": "Dati della carta",
|
||||
"something_went_wrong_on_our_end": "Qualcosa è andato storto da parte nostra. Contatta il nostro team di supporto e risolveremo il problema immediatamente per te.",
|
||||
"please_provide_following_text_to_suppport": "Fornisci il seguente testo quando contatterai il team di supporto per permeterci di aiutarti meglio",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "Prenotazioni",
|
||||
"pbac_resource_insights": "Approfondimenti",
|
||||
"pbac_resource_role": "Ruoli",
|
||||
"pbac_resource_routing_form": "Moduli di instradamento",
|
||||
"pbac_resource_workflow": "Flussi di lavoro",
|
||||
"pbac_action_all": "Tutte le azioni",
|
||||
"pbac_action_create": "Crea",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "Tutte le azioni sulle prenotazioni",
|
||||
"pbac_desc_view_team_insights": "Visualizza insight del team",
|
||||
"pbac_desc_manage_team_insights": "Gestisci insight del team",
|
||||
"pbac_desc_create_routing_forms": "Crea moduli di instradamento",
|
||||
"pbac_desc_view_routing_forms": "Visualizza moduli di instradamento",
|
||||
"pbac_desc_update_routing_forms": "Aggiorna moduli di instradamento",
|
||||
"pbac_desc_delete_routing_forms": "Elimina moduli di instradamento",
|
||||
"read_permission_auto_enabled_tooltip": "Il permesso di lettura viene abilitato automaticamente quando si crea, aggiorna o elimina una risorsa",
|
||||
"choose_restriction_schedule": "Aggiungi programma di restrizione",
|
||||
"restriction_schedule_description": "Limita la disponibilità degli host per mostrare solo gli slot che rientrano in un programma specificato.",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "Considera la creazione di un'organizzazione per unificare fatturazione, strumenti di amministrazione e analisi per i tuoi team.",
|
||||
"search_variables": "Cerca variabili",
|
||||
"no_variables_found": "Nessuna variabile trovata",
|
||||
"api_key_name_too_long": "Il nome non deve superare i {{max}} caratteri",
|
||||
"auto_charge_for_last_minute_cancellation": "Addebita automaticamente la penale per cancellazioni dell'ultimo minuto",
|
||||
"before_scheduled_start_time": "Prima dell'orario di inizio programmato",
|
||||
"cancel_booking_acknowledge_no_show_fee": "Riconosco che cancellando la prenotazione entro {{timeValue}} {{timeUnit}} dall'orario di inizio mi verrà addebitata la penale di mancata presenza di {{amount, currency}}",
|
||||
"contact_organizer": "Per qualsiasi domanda, contatta l'organizzatore.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi le tue nuove stringhe qui sopra ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "埋め込み",
|
||||
"impersonation": "なりすまし",
|
||||
"impersonation_description": "ユーザーのなりすましを管理するための設定です",
|
||||
"recent_impersonations": "最近のなりすまし",
|
||||
"quick_impersonate": "クイックなりすまし",
|
||||
"no_recent_impersonations": "最近のなりすましはありません",
|
||||
"users": "ユーザー",
|
||||
"user": "ユーザー",
|
||||
"profile_description": "{{appName}} プロフィールの設定を管理します",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "予約を行う際には追加のメモを入力する必要があります",
|
||||
"email_address_action": "特定のメールアドレスにメールを送信する",
|
||||
"after_event_trigger": "イベントの終了後",
|
||||
"booking_rejected_trigger": "予約が拒否された時",
|
||||
"booking_requested_trigger": "予約がリクエストされた時",
|
||||
"booking_payment_initiated_trigger": "予約の支払いが開始された時",
|
||||
"booking_paid_trigger": "予約の支払いが完了した時",
|
||||
"booking_no_show_updated_trigger": "予約の不参加が更新された時",
|
||||
"how_long_after": "イベント終了後のどのくらい後にしますか?",
|
||||
"how_long_after_hosts_no_show": "ホストがCalビデオ会議に現れない場合、どのくらい後に?",
|
||||
"how_long_after_guests_no_show": "ゲストがCalビデオ会議に現れない場合、どのくらい後に?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "このワークフローをテストする場合、少なくとも 1 時間前でなければメールと SMS のスケジュール設定ができないことにご注意ください",
|
||||
"insights_no_data_found_for_filter": "選択したフィルターまたは日付のデータが見つかりませんでした。",
|
||||
"acknowledge_booking_no_show_fee": "このイベントに出席しなかった場合、不参加費用として {{amount, currency}} が私のカードに請求されることに同意します。",
|
||||
"days": "日",
|
||||
"card_details": "カードの詳細",
|
||||
"something_went_wrong_on_our_end": "当社側で問題が発生しました。サポートチームにお問い合わせください。すぐに修正いたします。",
|
||||
"please_provide_following_text_to_suppport": "サポートにお問い合わせいただく際に次のテキストをご提供いただければ、解決に役立ちます。",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "予約",
|
||||
"pbac_resource_insights": "インサイト",
|
||||
"pbac_resource_role": "ロール",
|
||||
"pbac_resource_routing_form": "ルーティングフォーム",
|
||||
"pbac_resource_workflow": "ワークフロー",
|
||||
"pbac_action_all": "すべてのアクション",
|
||||
"pbac_action_create": "作成",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "予約に関するすべてのアクション",
|
||||
"pbac_desc_view_team_insights": "チームインサイトの表示",
|
||||
"pbac_desc_manage_team_insights": "チームインサイトの管理",
|
||||
"pbac_desc_create_routing_forms": "ルーティングフォームを作成する",
|
||||
"pbac_desc_view_routing_forms": "ルーティングフォームを表示する",
|
||||
"pbac_desc_update_routing_forms": "ルーティングフォームを更新する",
|
||||
"pbac_desc_delete_routing_forms": "ルーティングフォームを削除する",
|
||||
"read_permission_auto_enabled_tooltip": "リソースの作成、更新、削除時に読み取り権限は自動的に有効になります",
|
||||
"choose_restriction_schedule": "制限スケジュールを追加",
|
||||
"restriction_schedule_description": "ホストの利用可能時間を指定されたスケジュール内の枠のみに制限します。",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "組織を設定して、チーム全体の請求、管理ツール、分析を統合することを検討してください。",
|
||||
"search_variables": "変数を検索",
|
||||
"no_variables_found": "変数が見つかりません",
|
||||
"api_key_name_too_long": "名前は{{max}}文字を超えてはいけません",
|
||||
"auto_charge_for_last_minute_cancellation": "直前のキャンセルに対して自動的に無断キャンセル料を請求する",
|
||||
"before_scheduled_start_time": "予定開始時刻より前",
|
||||
"cancel_booking_acknowledge_no_show_fee": "開始時刻の{{timeValue}}{{timeUnit}}以内にキャンセルした場合、{{amount, currency}}の無断キャンセル料が請求されることを承諾します",
|
||||
"contact_organizer": "ご質問がある場合は、主催者にお問い合わせください。",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ この上に新しい文字列を追加してください ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
@@ -1645,6 +1645,9 @@
|
||||
"embeds": "Embeds",
|
||||
"impersonation": "ការបន្លំជាអ្នកដទៃ",
|
||||
"impersonation_description": "ការកំណត់ដើម្បីគ្រប់គ្រងការបន្លំជាអ្នកដទៃ",
|
||||
"recent_impersonations": "ការក្លែងបន្លំថ្មីៗ",
|
||||
"quick_impersonate": "ក្លែងបន្លំរហ័ស",
|
||||
"no_recent_impersonations": "គ្មានការក្លែងបន្លំថ្មីៗទេ",
|
||||
"users": "អ្នកប្រើប្រាស់",
|
||||
"user": "អ្នកប្រើប្រាស់",
|
||||
"profile_description": "គ្រប់គ្រងការកំណត់សម្រាប់ប្រវត្តិរូប {{appName}} របស់អ្នក",
|
||||
@@ -1855,6 +1858,11 @@
|
||||
"require_additional_notes_description": "តម្រូវឱ្យមានកំណត់ចំណាំបន្ថែមត្រូវបានបំពេញនៅពេលកក់",
|
||||
"email_address_action": "ផ្ញើអ៊ីមែលទៅអាសយដ្ឋានអ៊ីមែលជាក់លាក់",
|
||||
"after_event_trigger": "បន្ទាប់ពីព្រឹត្តិការណ៍បញ្ចប់",
|
||||
"booking_rejected_trigger": "នៅពេលការកក់ត្រូវបានបដិសេធ",
|
||||
"booking_requested_trigger": "នៅពេលការកក់ត្រូវបានស្នើសុំ",
|
||||
"booking_payment_initiated_trigger": "នៅពេលការទូទាត់ការកក់ត្រូវបានចាប់ផ្តើម",
|
||||
"booking_paid_trigger": "នៅពេលការទូទាត់ការកក់ជោគជ័យ",
|
||||
"booking_no_show_updated_trigger": "នៅពេលការកក់មិនបានមកត្រូវបានធ្វើបច្ចុប្បន្នភាព",
|
||||
"how_long_after": "បន្ទាប់ពីព្រឹត្តិការណ៍បញ្ចប់យូរប៉ុណ្ណា?",
|
||||
"how_long_after_hosts_no_show": "តើបន្ទាប់ពីម្ចាស់ផ្ទះមិនបង្ហាញខ្លួនក្នុងកិច្ចប្រជុំវីដេអូ cal រយៈពេលប៉ុន្មាន?",
|
||||
"how_long_after_guests_no_show": "តើបន្ទាប់ពីភ្ញៀវមិនបង្ហាញខ្លួនក្នុងកិច្ចប្រជុំវីដេអូ cal រយៈពេលប៉ុន្មាន?",
|
||||
@@ -2306,6 +2314,7 @@
|
||||
"testing_workflow_info_message": "នៅពេលសាកល្បងដំណើរការនេះ សូមចំណាំថា អ៊ីមែល និងសារ SMS អាចត្រូវបានកំណត់ពេលយ៉ាងហោចណាស់ 1 ម៉ោងមុន",
|
||||
"insights_no_data_found_for_filter": "មិនមានទិន្នន័យសម្រាប់តម្រង ឬកាលបរិច្ឆេទដែលបានជ្រើស។",
|
||||
"acknowledge_booking_no_show_fee": "ខ្ញុំយល់ព្រមថា ប្រសិនបើខ្ញុំមិនចូលរួមព្រឹត្តិការណ៍នេះ នោះថ្លៃសេវាកម្មមិនមកចូលរួមចំនួន {{amount, currency}} នឹងត្រូវបានគិតលើកាតរបស់ខ្ញុំ។",
|
||||
"days": "ថ្ងៃ",
|
||||
"card_details": "ព័ត៌មានកាត",
|
||||
"something_went_wrong_on_our_end": "មានបញ្ហាខាងយើង។ ទាក់ទងក្រុមគាំទ្ររបស់យើង ហើយយើងនឹងជួសជុលវាភ្លាមៗសម្រាប់អ្នក។",
|
||||
"please_provide_following_text_to_suppport": "សូមផ្តល់អត្ថបទខាងក្រោមនៅពេលទាក់ទងគាំទ្រ ដើម្បីជួយអ្នកបានល្អប្រសើរ",
|
||||
@@ -3388,6 +3397,7 @@
|
||||
"pbac_resource_booking": "ការកក់",
|
||||
"pbac_resource_insights": "ព័ត៌មានជ្រៅ",
|
||||
"pbac_resource_role": "តួនាទី",
|
||||
"pbac_resource_routing_form": "ទម្រង់បញ្ជូន",
|
||||
"pbac_resource_workflow": "លំហូរការងារ",
|
||||
"pbac_action_all": "សកម្មភាពទាំងអស់",
|
||||
"pbac_action_create": "បង្កើត",
|
||||
@@ -3458,6 +3468,10 @@
|
||||
"pbac_desc_manage_bookings": "សកម្មភាពទាំងអស់លើការកក់",
|
||||
"pbac_desc_view_team_insights": "មើលការយល់ដឹងរបស់ក្រុម",
|
||||
"pbac_desc_manage_team_insights": "គ្រប់គ្រងការយល់ដឹងរបស់ក្រុម",
|
||||
"pbac_desc_create_routing_forms": "បង្កើតទម្រង់បញ្ជូន",
|
||||
"pbac_desc_view_routing_forms": "មើលទម្រង់បញ្ជូន",
|
||||
"pbac_desc_update_routing_forms": "ធ្វើបច្ចុប្បន្នភាពទម្រង់បញ្ជូន",
|
||||
"pbac_desc_delete_routing_forms": "លុបទម្រង់បញ្ជូន",
|
||||
"read_permission_auto_enabled_tooltip": "សិទ្ធិអានត្រូវបានបើកដោយស្វ័យប្រវត្តិនៅពេលបង្កើត ធ្វើបច្ចុប្បន្នភាព ឬលុបធនធាន",
|
||||
"choose_restriction_schedule": "បន្ថែមកាលវិភាគដែនកំណត់",
|
||||
"restriction_schedule_description": "កំណត់កម្រិតលទ្ធភាពរបស់ម្ចាស់ដើម្បីបង្ហាញតែពេលវេលាដែលស្ថិតក្នុងកាលវិភាគដែលបានបញ្ជាក់។",
|
||||
@@ -3591,5 +3605,10 @@
|
||||
"consider_consolidating_multi_team_org": "សូមពិចារណាបង្កើតអង្គភាពមួយដើម្បីបង្រួបបង្រួមការចេញវិក្កយបត្រ ឧបករណ៍គ្រប់គ្រង និងការវិភាគនៅក្នុងក្រុមរបស់អ្នក។",
|
||||
"search_variables": "ស្វែងរកអថេរ",
|
||||
"no_variables_found": "រកមិនឃើញអថេរទេ",
|
||||
"api_key_name_too_long": "ឈ្មោះមិនត្រូវលើសពី {{max}} តួអក្សរទេ",
|
||||
"auto_charge_for_last_minute_cancellation": "គិតថ្លៃសេវាដោយស្វ័យប្រវត្តិសម្រាប់ការលុបចោលនៅនាទីចុងក្រោយ",
|
||||
"before_scheduled_start_time": "មុនពេលចាប់ផ្តើមដែលបានកំណត់",
|
||||
"cancel_booking_acknowledge_no_show_fee": "ខ្ញុំទទួលស្គាល់ថាដោយការលុបចោលការកក់ក្នុងរយៈពេល {{timeValue}} {{timeUnit}} មុនពេលចាប់ផ្តើម ខ្ញុំនឹងត្រូវបង់ថ្លៃសេវាមិនបានចូលរួមចំនួន {{amount, currency}}",
|
||||
"contact_organizer": "ប្រសិនបើអ្នកមានសំណួរណាមួយ សូមទាក់ទងអ្នករៀបចំ។",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ បន្ថែមខ្សែអក្សរថ្មីរបស់អ្នកនៅខាងលើនេះ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user