type Account implements Node { accountingFont: String accountingFooterManagingDirector: String accountingFooterOffice: String accountingHeader: String accountingTaxNumber: String accountingVatId: String advancePaymentTitleDe: String advancePaymentTitleEn: String aiApiKeyHint: String aiBaseUrl: String aiConnectionsEnabled: Boolean! aiDocumentRules: String aiDocuments: Boolean! aiModel: String aiProvider: AiProvider! aiQuotaShare: Float aiReceiptReading: Boolean! aiReceiptReadingAutomatic: Boolean! aiTimeEntry: Boolean! """ Whether members may make personal API keys for the GraphQL API """ apiAccessEnabled: Boolean! bic: String billing: Stripe! cancellationInvoiceTitleDe: String cancellationInvoiceTitleEn: String companyCity: String companyName: String companyPostalCode: String companyStreet: String country: String! countryAndCurrencyLocked: Boolean! createdAt: ISO8601DateTime! currency: String! """ Whether customer numbers are typed on the address instead of given by docket """ customCustomerNumber: Boolean! customInvoiceNumber: Boolean! """ Where docket's customer numbers start """ customerNumberStart: Int! """ How far apart docket's customer numbers are """ customerNumberStep: Int! """ The cases an account can be set for: domestic_ per VAT rate, the other tax treatments, expense, expense_reverse_charge_eu, expense_reverse_charge_third_country, debtors, creditors """ datevAccountKeys: [String!]! """ The account per case, by the keys of datevAccountKeys """ datevAccounts: JSON """ Whether the workspace can have the DATEV booking batch (a German one) """ datevAvailable: Boolean! datevBookings: Boolean datevClientNumber: Int datevConsultantNumber: Int """ The month the fiscal year starts in """ datevFiscalYearStart: Int """ What the form starts with, per chart (skr03, skr04) """ datevStandardAccounts: JSON! defaultTaxRate: Float! documentFontConfirmedAt: ISO8601DateTime documentFontFiles: [DocumentFontFile!]! domain: String! finalInvoiceTitleDe: String finalInvoiceTitleEn: String iban: String id: ID! invoiceContactEmail: String invoiceContactName: String invoiceContactPhone: String invoiceFooterDe: String invoiceFooterEn: String invoiceNumberPrefix: String invoiceTitleDe: String invoiceTitleEn: String """ The most recent full workspace export (admins only) """ latestExport: WorkspaceExport letterheadLines: String locale: Locale logo: String logoSize: Int name: String! """ The number docket gives the next customer address (Account#next_customer_number) """ nextCustomerNumber: Int! onboardingCompleted: Boolean! partialInvoiceTitleDe: String partialInvoiceTitleEn: String """ Days from the invoice date to the due date, unless the customer has its own term """ paymentTermDays: Int! quotationFooterDe: String quotationFooterEn: String requireTwoFactor: Boolean! """ Whether the workspace is a small business today """ smallBusiness: Boolean! taxRates: [Float!]! updatedAt: ISO8601DateTime! """ The VAT status history, oldest first """ vatStatuses: [VatStatus!]! } type AccountantAccess { createdAt: ISO8601DateTime! """ The address the sign-in links go to """ email: String! id: ID! """ The member who gave the access; null once they are gone """ invitedBy: User """ Null until the tax office first signs in """ lastSignedInAt: ISO8601DateTime """ The tax office's name, if one was given """ name: String """ Null while the access is good """ revokedAt: ISO8601DateTime } """ A billing cycle of a project: a quotation with its order confirmation, delivery notes and invoices, or an invoice on its own. Only project managers and admins can read it. """ type Accounting implements Node { accountId: ID! accountingCustomFields( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): AccountingCustomFieldConnection! createdAt: ISO8601DateTime! """ The values of the workspace's custom fields for this cycle """ customFields: [AccountingCustomFieldValue!]! id: ID! invoices( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: InvoiceFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): InvoiceConnection! """ The invoice types the cycle still takes: advance payments or partial invoices (never both), then one final invoice, after which none. Canceled invoices do not count. """ invoicesTypesThatCanBeCreated: [InvoiceTypeEnum!] """ The cycle's quotation; null for an invoice on its own """ quotation: Quotation """ Every service with the daily rate this cycle's documents are priced with, as the rates stood when the cycle last took them over """ serviceRates: [ServiceRate!]! """ Whether a rate of a service, the customer or the project changed since, so the cycle could take over the new rates """ serviceRatesUpdatable: Boolean! updatedAt: ISO8601DateTime! } type AccountingCustomField implements Node { accounting: Accounting! createdAt: ISO8601DateTime! customField: CustomField! customFieldValue: String id: ID! updatedAt: ISO8601DateTime! } """ The connection type for AccountingCustomField. """ type AccountingCustomFieldConnection { count: Int! """ A list of edges. """ edges: [AccountingCustomFieldEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [AccountingCustomField!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type AccountingCustomFieldEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: AccountingCustomField! } input AccountingCustomFieldInput { customFieldId: ID customFieldValue: String } type AccountingCustomFieldValue implements Node { createdAt: ISO8601DateTime! id: ID! name: String! type: String! updatedAt: ISO8601DateTime! value: String } """ Where a billing cycle's money stands: the quotation total and how much of it the issued invoices made paid, open or overdue. Net amounts in the workspace's currency. Cycles of which nothing has gone out yet are not listed. """ type AccountingCycle { """ Issued invoices (published or paid); cancellation invoices are not counted """ invoiceCount: Int! """ What published invoices that are not overdue ask for """ open: Float! """ What published invoices past their due date ask for """ overdue: Float! """ How many days the longest-overdue invoice is past its due date; null when none is overdue """ overdueDays: Int """ What the paid invoices asked for """ paid: Float! """ The quotation's number as printed (Quotation.qnr); null for a cycle without a quotation """ quotationNumber: String """ PUBLISHED (sent, not confirmed yet), CONFIRMED, or CANCELED while invoices still stand; null for a cycle without a quotation """ quotationStatus: QuotationStatus """ The quotation's net total; without a standing quotation, what the issued invoices ask for """ total: Float! } enum AccountingCycleStatus { """ The quotation (or all invoices, if there was no quotation) was canceled """ CANCELED """ An invoice was sent to the customer and is not yet overdue or paid """ INVOICE_OPEN """ An invoice was sent to the customer, is past its due date and hasn't been paid """ INVOICE_OVERDUE """ An invoice for this cycle has been paid """ PAID """ Quotation is internally approved, not yet sent to the customer """ QUOTE_APPROVED """ Customer confirmed the quotation, no invoice has been sent or paid yet """ QUOTE_CONFIRMED_AWAITING_INVOICE """ Quotation is a draft, not yet approved internally """ QUOTE_DRAFT """ Quotation was sent to the customer, awaiting confirmation """ QUOTE_SENT } enum AiProvider { """ The workspace's own Anthropic key """ ANTHROPIC """ docket's own Mistral key, under the monthly quota """ DOCKET """ The workspace's own Mistral key """ MISTRAL """ The workspace's own OpenAI key """ OPENAI """ The workspace's own key with a service that has OpenAI's chat API, at its own address """ OPENAI_COMPATIBLE } type ApiToken { createdAt: ISO8601DateTime! """ From when the key is refused; null: it never expires """ expiresAt: ISO8601DateTime id: ID! """ The key's last four characters, to tell keys apart """ lastFour: String! lastUsedAt: ISO8601DateTime name: String! } """ Autogenerated input type of ApplyDocumentPlan """ input ApplyDocumentPlanInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ As askDocumentAssistant answered it """ plan: Json! """ The draft quotation or invoice """ recordId: ID! """ The file it came from, attached to the comment """ uploadKey: String } """ Autogenerated return type of ApplyDocumentPlan. """ type ApplyDocumentPlanPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of ApplyDocumentTemplate """ input ApplyDocumentTemplateInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The empty quotation or invoice to fill """ documentId: ID! id: ID! } """ Autogenerated return type of ApplyDocumentTemplate. """ type ApplyDocumentTemplatePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of ApplyQuotationToProjectBudget """ input ApplyQuotationToProjectBudgetInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! mode: BudgetHandoffMode! } """ Autogenerated return type of ApplyQuotationToProjectBudget. """ type ApplyQuotationToProjectBudgetPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project } """ Autogenerated input type of AskDocumentAssistant """ input AskDocumentAssistantInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The conversation so far, oldest first """ history: [DocumentAssistantTurnInput!] """ What the document should get, in plain words; at most 4,000 characters """ message: String! """ The quotation's or invoice's id """ recordId: ID! """ An XLSX or CSV from /api/upload """ uploadKey: String } """ Autogenerated return type of AskDocumentAssistant. """ type AskDocumentAssistantPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json """ Why nothing came of it """ notice: String """ To hand to applyDocumentPlan as it is """ plan: Json preview: DocumentPlanPreview questions: [DocumentAssistantQuestion!]! skipped: DocumentAssistantSkipped summary: String } type Attachment implements Node { blobId: ID! byteSize: Int! contentType: String! createdAt: ISO8601DateTime! """ The file's path on the workspace. Fetch it signed in, or with the API key in the Authorization header """ downloadUrl: String! filename: String! id: ID! previewImage: String updatedAt: ISO8601DateTime! } type AvgTimetrackingPerDay { from: ISO8601Date! nodes: [AvgTimetrackingPerDayNode!]! to: ISO8601Date! } input AvgTimetrackingPerDayFilter { dates: [String!] userIds: [ID!] userIdsNot: [ID!] } type AvgTimetrackingPerDayNode { date: ISO8601Date! duration: Float! } type BilledBefore { invoiceId: ID! net: Float! } type Block { deleted: Boolean description: String footer: String id: ID! modified: Boolean new: Boolean optional: Boolean! positions: [BlockPosition!]! title: String total: Float! type: BlockTypeEnum! } type BlockPosition { alreadySelected: Boolean deleted: Boolean description: String footer: String id: ID! modified: Boolean new: Boolean optional: Boolean! selected: Boolean subpositions: [BlockPositionSubposition!]! title: String! total: Float! } type BlockPositionSubposition { amount: Float billedQuantity: Float dailyRate: Float deleted: Boolean description: String exists: Boolean id: ID! modified: Boolean name: String new: Boolean optional: Boolean! quantity: Float rate: Float service: BlockPositionSubpositionServiceEnum serviceId: String """ This line's VAT rate in percent (the document's unless set on the line) """ taxRate: Float title: String total: Float! type: BlockPositionSubpositionTypeEnum! unit: String unitLabel: String } input BlockPositionSubpositionInput { amount: Float deleted: Boolean description: String id: ID name: String optional: Boolean quantity: Float rate: Float service: BlockPositionSubpositionServiceEnum serviceId: String """ VAT rate in percent; omit for the document's rate """ taxRate: Float type: BlockPositionSubpositionTypeEnum unit: String } enum BlockPositionSubpositionServiceEnum { agency_service external_service } enum BlockPositionSubpositionTypeEnum { custom flatrate service } enum BlockTypeEnum { agency_service external_service phase } """ A column of a project's kanban board. Every project starts with a backlog and a done column. """ type Board implements Node { createdAt: ISO8601DateTime! id: ID! """ Rank among the project's columns, for ordering (not consecutive) """ position: Int! """ BACKLOG and DONE are the two columns every project has, where tickets land by their status; they cannot be deleted. CUSTOM is any other. """ preset: BoardPreset! project: Project! """ The ticket status this column stands for """ ticketStatus: TicketStatus! tickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! title: String! updatedAt: ISO8601DateTime! } """ The connection type for Board. """ type BoardConnection { count: Int! """ A list of edges. """ edges: [BoardEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Board!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type BoardEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Board! } input BoardFilter { ids: [ID!] } enum BoardPreset { backlog custom done } type BookkeepingExport { createdAt: ISO8601DateTime! """ Who made it: the member's name, or the tax office's name (else its e-mail address) for an export from its portal. Null once they are gone """ exportedBy: String externalCostsCount: Int! id: ID! invoicesCount: Int! periodFrom: ISO8601Date! periodTo: ISO8601Date! """ The member who made it in the app; null for the tax office's own exports """ userName: String """ Whether the ZIP held the DATEV booking batch """ withBookings: Boolean! } type BookkeepingPeriod { """ How many of these documents an earlier export already held """ exportedBeforeCount: Int! """ The latest exports, newest first """ exports: [BookkeepingExport!]! """ External costs of the period that are ok or processed """ externalCostsCount: Int! """ Invoices issued in the period, cancellations included """ invoicesCount: Int! """ Whether the ZIP will hold the DATEV booking batch (the workspace has set its accounts) """ withBookings: Boolean! } enum BudgetHandoffMode { """ The quote's figure is added to the budget (a supplementary quote) """ ADD """ The quote's figure becomes the budget """ SET } """ Autogenerated input type of BulkUpdateExternalCost """ input BulkUpdateExternalCostInput { """ Net, in the workspace's currency """ amount: Float """ Always send all positions, since using this argument will replace the whole collection """ assignmentsAttributes: [ExternalCostAssignmentInput!] """ The supplier's invoice file: the id of a file uploaded through /api/upload. Required on create; on update it replaces the file. """ blobId: ID """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The invoice's currency, where it is not the workspace's """ currency: Currency """ The external costs to change; at least one """ ids: [ID!]! """ Omitted on a new cost: taken from the workspace's VAT status on the invoice date """ inputTaxDeductible: Boolean invoiceDate: ISO8601Date invoiceNumber: String """ Net in the invoice's currency; `amount` is then the net in the workspace's (omitted: at the ECB rate of the invoice date) """ originalAmount: Float """ true: the cost is split over several assignments; false: it goes to one quotation as a whole """ partialAmount: Boolean """ One of several invoices from the supplier for the same job """ partialBill: Boolean """ Another cost of the same supplier this one belongs with: both join one group (see relatedCosts). An empty string takes it out """ relatedCostId: String status: ExternalCostStatus supplierId: ID """ The VAT amount as the invoice states it; omitted, it is worked out from amount and rate """ tax: Float """ In percent """ taxRate: Float """ The responsible person; they get an email when it is set or changed """ userId: ID } """ Autogenerated return type of BulkUpdateExternalCost. """ type BulkUpdateExternalCostPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json externalCosts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int ): ExternalCostConnection } """ Autogenerated input type of BulkUpdateTimetracking """ input BulkUpdateTimetrackingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String date: ISO8601Date description: String """ In minutes, in steps of 15 """ duration: Float ids: [ID!]! projectId: ID """ The kind of work; the entry is priced at the project's rate for it """ serviceId: ID """ A ticket of the project in `projectId` """ ticketId: ID """ Whose time it is. Default on create: the caller. Only admins may name someone else """ userId: ID } """ Autogenerated return type of BulkUpdateTimetracking. """ type BulkUpdateTimetrackingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int ): TimetrackingConnection } """ Autogenerated input type of CancelInvoice """ input CancelInvoiceInput { """ Why it was canceled; kept with the canceled invoice """ canceledNote: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of CancelInvoice. """ type CancelInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of CancelQuotation """ input CancelQuotationInput { """ Why it was canceled; shown with the quotation """ canceledNote: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of CancelQuotation. """ type CancelQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of CloseTicket """ input CloseTicketInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of CloseTicket. """ type CloseTicketPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } enum CommentOn { DELIVERY_NOTE INVOICE ORDER_CONFIRMATION QUOTATION TICKET } """ A comment on a ticket or a billing document """ union CommentUnion = DeliveryNoteComment | InvoiceComment | OrderConfirmationComment | QuotationComment | TicketComment """ Autogenerated input type of CompleteAccountOnboarding """ input CompleteAccountOnboardingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of CompleteAccountOnboarding. """ type CompleteAccountOnboardingPayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of CompleteUserOnboarding """ input CompleteUserOnboardingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String } """ Autogenerated return type of CompleteUserOnboarding. """ type CompleteUserOnboardingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json onboarded: Boolean! } """ Autogenerated input type of ConfirmQuotation """ input ConfirmQuotationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's signed confirmation as a data URL (data:application/pdf;base64,...): a PDF of at most 2 MB """ confirmationFile: String """ The file name to store the confirmation under """ confirmationFilename: String """ A note on the confirmation, e.g. how the customer accepted """ confirmedNote: String id: ID! } """ Autogenerated return type of ConfirmQuotation. """ type ConfirmQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } type ConnectedAiApp { connectedAt: ISO8601DateTime! id: ID! lastUsedAt: ISO8601DateTime name: String! scopes: [String!]! } """ A person at a customer, who quotations, invoices and the other documents can be addressed to. Lists return the contacts of customers the caller can see. """ type Contact implements Node { archived: Boolean! createdAt: ISO8601DateTime! """ The customers this person is a contact of """ customers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomerFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): CustomerConnection! department: String email: String! firstname: String! id: ID! lastname: String! phone: String salutation: String! """ Academic or professional title, e.g. Dr. """ title: String updatedAt: ISO8601DateTime! } """ The connection type for Contact. """ type ContactConnection { count: Int! """ A list of edges. """ edges: [ContactEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Contact!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type ContactEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Contact! } input ContactFilter { archived: Boolean """ Contacts of any of these customers """ customerIds: [ID!] ids: [ID!] """ Text to find, as the app's search finds it: by the contact's name and details """ search: String } """ Autogenerated input type of ConvertJiraAuthorWorklogs """ input ConvertJiraAuthorWorklogsInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of ConvertJiraAuthorWorklogs. """ type ConvertJiraAuthorWorklogsPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String convertedCount: Int errors: Json jiraUserMapping: JiraUserMapping } """ Autogenerated input type of CopyTimetracking """ input CopyTimetrackingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The day of the copy. Default: the day of the original """ date: ISO8601Date id: ID! } """ Autogenerated return type of CopyTimetracking. """ type CopyTimetrackingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetracking: Timetracking } """ Autogenerated input type of CorrectInvoice """ input CorrectInvoiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ Why it is corrected — kept as the canceled invoice's note """ note: String } """ Autogenerated return type of CorrectInvoice. """ type CorrectInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json """ The new draft """ invoice: Invoice } type Country { code: String! name: String! } """ Autogenerated input type of CreateAccountantAccess """ input CreateAccountantAccessInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String email: String! """ The tax office's name """ name: String } """ Autogenerated return type of CreateAccountantAccess. """ type CreateAccountantAccessPayload { accountantAccess: AccountantAccess """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of CreateApiToken """ input CreateApiTokenInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ 30, 90 or 365; omitted: 90; null: the key never expires """ expiresInDays: Int = 90 name: String! """ The caller's current password """ password: String! } """ Autogenerated return type of CreateApiToken. """ type CreateApiTokenPayload { apiToken: ApiToken """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json """ The key, shown this once """ key: String } """ Autogenerated input type of CreateBlock """ input CreateBlockInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block's place in the document, counted from 0 """ index: Int! """ Where the block goes, counted from 0 """ newIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The draft quotation or invoice to change """ recordId: ID! title: String type: BlockTypeEnum } """ Autogenerated return type of CreateBlock. """ type CreateBlockPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of CreateBlockPosition """ input CreateBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean! """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!]! title: String! } """ Autogenerated return type of CreateBlockPosition. """ type CreateBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of CreateBoard """ input CreateBoardInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String projectId: ID """ The status a ticket takes when it is put into this column """ ticketStatus: TicketStatus title: String } """ Autogenerated return type of CreateBoard. """ type CreateBoardPayload { board: Board """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of CreateContact """ input CreateContactInput { archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customers this person is a contact of; replaces the whole list """ customerIds: [ID!] department: String email: String firstname: String lastname: String phone: String salutation: String title: String } """ Autogenerated return type of CreateContact. """ type CreateContactPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String contact: Contact errors: Json } """ Autogenerated input type of CreateCustomField """ input CreateCustomFieldInput { archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer whose documents carry the field """ customerId: ID defaultValue: String """ `text` or `contact` """ fieldType: String label: String name: String } """ Autogenerated return type of CreateCustomField. """ type CreateCustomFieldPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customField: CustomField errors: Json } """ Autogenerated input type of CreateCustomerAddress """ input CreateCustomerAddressInput { address1: String address2: String """ The e-invoice's buyer reference (BT-10), e.g. a Leitweg-ID """ buyerReference: String city: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Free text, from before the list; prefer countryCode """ country: String """ ISO 3166-1 alpha-2 """ countryCode: String customerId: ID! department: String """ Where this customer receives e-invoices (BT-49) """ invoiceEmail: String """ The customer number; typed where the workspace numbers its customers itself, else docket's """ number: Int recipient: String taxTreatment: TaxTreatment vatNo: String zip: String } """ Autogenerated return type of CreateCustomerAddress. """ type CreateCustomerAddressPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customerAddress: CustomerAddress errors: Json } """ Autogenerated input type of CreateCustomer """ input CreateCustomerInput { """ Commission in percent on the external costs billed in a document """ accountingCommissionPercent: Float """ Net total of external costs in a document from which the commission applies """ accountingCommissionThreshold: Float archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String company: String """ The customer's own account (debtor number) in DATEV; empty = the collective account """ datevAccount: String description: String email: String initial: String invoiceFooterDe: String invoiceFooterEn: String """ The customer has a master agreement; advance-payment invoices then name it """ masterAgreement: Boolean """ This customer's payment term in days, 0 to 365; null = the workspace's """ paymentTermDays: Int phone: String quotationFooterDe: String quotationFooterEn: String """ The customer's own daily rates; `id` is a ServiceRate id as Customer.serviceRates returns it """ serviceRates: [ServiceRateInput!] web: String } """ Autogenerated return type of CreateCustomer. """ type CreateCustomerPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customer: Customer errors: Json } """ Autogenerated input type of CreateDeliveryNoteComment """ input CreateDeliveryNoteCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The delivery note to comment on; needed when creating, ignored when updating """ deliveryNoteId: ID } """ Autogenerated return type of CreateDeliveryNoteComment. """ type CreateDeliveryNoteCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNoteComment: DeliveryNoteComment errors: Json } """ Autogenerated input type of CreateDeliveryNote """ input CreateDeliveryNoteInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date description: String footer: String invoiceId: ID """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The delivery note's running number within its project; the next free one when omitted """ number: Int orderConfirmationId: ID showPositionSubtotal: Boolean status: DeliveryNoteStatus @deprecated(reason: "Refused unless unchanged: a document's status moves through its own mutations (publish, draft, …).") } """ Autogenerated return type of CreateDeliveryNote. """ type CreateDeliveryNotePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNote: DeliveryNote errors: Json } """ Autogenerated input type of CreateDiscountSurcharge """ input CreateDiscountSurchargeInput { """ The net amount as a positive number; a discount is subtracted, a surcharge added """ amount: Float """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Its place in the document's list of discounts and surcharges, counted from 0 """ index: Int! """ The draft quotation or invoice to change """ recordId: ID! title: String type: DiscountSurchargeTypeEnum! } """ Autogenerated return type of CreateDiscountSurcharge. """ type CreateDiscountSurchargePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String discountSurcharge: JSON errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of CreateDocumentTemplate """ input CreateDocumentTemplateInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Offer it only for this customer; omit for every customer """ customerId: ID """ The quotation or invoice to save """ documentId: ID! name: String! """ An internal note on what the template is for """ note: String } """ Autogenerated return type of CreateDocumentTemplate. """ type CreateDocumentTemplatePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String documentTemplate: DocumentTemplate errors: Json } """ Autogenerated input type of CreateExternalCost """ input CreateExternalCostInput { """ Net, in the workspace's currency """ amount: Float """ Always send all positions, since using this argument will replace the whole collection """ assignmentsAttributes: [ExternalCostAssignmentInput!] """ The supplier's invoice file: the id of a file uploaded through /api/upload. Required on create; on update it replaces the file. """ blobId: ID """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The invoice's currency, where it is not the workspace's """ currency: Currency """ Omitted on a new cost: taken from the workspace's VAT status on the invoice date """ inputTaxDeductible: Boolean invoiceDate: ISO8601Date invoiceNumber: String """ Net in the invoice's currency; `amount` is then the net in the workspace's (omitted: at the ECB rate of the invoice date) """ originalAmount: Float """ true: the cost is split over several assignments; false: it goes to one quotation as a whole """ partialAmount: Boolean """ One of several invoices from the supplier for the same job """ partialBill: Boolean """ Another cost of the same supplier this one belongs with: both join one group (see relatedCosts). An empty string takes it out """ relatedCostId: String status: ExternalCostStatus supplierId: ID """ The VAT amount as the invoice states it; omitted, it is worked out from amount and rate """ tax: Float """ In percent """ taxRate: Float """ The responsible person; they get an email when it is set or changed """ userId: ID } """ Autogenerated return type of CreateExternalCost. """ type CreateExternalCostPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json externalCost: ExternalCost } """ Autogenerated input type of CreateInvoiceComment """ input CreateInvoiceCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The invoice to comment on; needed when creating, ignored when updating """ invoiceId: ID } """ Autogenerated return type of CreateInvoiceComment. """ type CreateInvoiceCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoiceComment: InvoiceComment } """ Autogenerated input type of CreateInvoice """ input CreateInvoiceInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The content: the whole list of blocks, each with its positions and their lines. Replaces what is there; only in a draft """ blocks: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ Values for the workspace's custom fields; they are shared by all documents of the billing cycle """ customFields: [AccountingCustomFieldInput!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date """ How to read deductionValue: percentage_amount or fixed_amount. Advance payments only """ deductionType: String """ An advance payment's share of the job: a percentage (above 0, up to 100) or a net amount, as deductionType says """ deductionValue: Float """ The date of delivery or service printed on the invoice; today when omitted on creation """ deliveryDate: ISO8601Date description: String """ The whole list of discounts and surcharges, each with type (discount or surcharge), title and amount (net). Only in a draft """ discountSurcharge: Json footer: String invoiceType: InvoiceTypeEnum! """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The invoice number. Leave it out: publishing assigns the next one in the workspace's sequence """ number: Int """ The order confirmation whose billing cycle the invoice joins """ orderConfirmationId: ID """ The project to bill, for an invoice without a quotation or order confirmation """ projectId: ID """ The quotation whose billing cycle the invoice joins """ quotationId: ID showPositionSubtotal: Boolean """ Only PUBLISHED can be set, in updateInvoice and by admins; every other status change has its own mutation """ status: InvoiceStatus """ The VAT rate lines use unless they set their own; fixed once the document leaves draft """ taxRate: Float """ Take the project's time entries that are still open (billable, on no other invoice) as lines """ timetrackingsAsPosition: Boolean """ Only entries from this day on """ timetrackingsFrom: ISO8601Date """ Only entries up to this day """ timetrackingsUntil: ISO8601Date } """ Autogenerated return type of CreateInvoice. """ type CreateInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of CreateJiraConnection """ input CreateJiraConnectionInput { """ That account's API token """ apiToken: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Jira authors without a docket user get a placeholder user when their worklogs are converted. Default true. """ createPlaceholderUsers: Boolean """ The Atlassian account docket reads the site with """ email: String name: String! """ The service new placeholder users book with; without one none are created """ placeholderServiceId: ID """ The Jira site's address, e.g. https://example.atlassian.net """ siteUrl: String! """ For the TEMPO backend """ tempoApiToken: String """ Where the site keeps its time; JIRA if omitted """ worklogBackend: JiraWorklogBackend } """ Autogenerated return type of CreateJiraConnection. """ type CreateJiraConnectionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraConnection: JiraSite } """ Autogenerated input type of CreateOrderConfirmationComment """ input CreateOrderConfirmationCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The order confirmation to comment on; needed when creating, ignored when updating """ orderConfirmationId: ID } """ Autogenerated return type of CreateOrderConfirmationComment. """ type CreateOrderConfirmationCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmationComment: OrderConfirmationComment } """ Autogenerated input type of CreateOrderConfirmation """ input CreateOrderConfirmationInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date description: String footer: String """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The order confirmation's running number within its project; the next free one when omitted """ number: Int """ The quotation it confirms """ quotationId: ID! showPositionSubtotal: Boolean status: OrderConfirmationStatus @deprecated(reason: "Refused unless unchanged: a document's status moves through its own mutations (publish, draft, …).") } """ Autogenerated return type of CreateOrderConfirmation. """ type CreateOrderConfirmationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmation: OrderConfirmation } """ Autogenerated input type of CreatePhase """ input CreatePhaseInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String """ ISO 8601 date (YYYY-MM-DD) """ endDate: String projectId: ID """ ISO 8601 date (YYYY-MM-DD) """ startDate: String title: String } """ Autogenerated return type of CreatePhase. """ type CreatePhasePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json phase: Phase } """ Autogenerated input type of CreateProject """ input CreateProjectInput { archived: Boolean """ The budget in the unit of `budgetType`: minutes, or an amount in the workspace's currency """ budgetRate: Float budgetType: ProjectBudget """ A unique identifier for the client performing the mutation. """ clientMutationId: String customerId: ID deadline: ISO8601Date description: String """ Project number, unique in the workspace. Default: the next free number """ number: Int """ Whether hours beyond the contingent (a budget of hours per month) are billed on top of the fee. Default: true """ retainerBillsOverage: Boolean """ The hours one fee covers, in minutes per period (month or quarter). Null: the budget stands in when it is hours per month """ retainerContingentMinutes: Int """ The last day of the retainer; null for an open-ended one """ retainerEndsOn: ISO8601Date """ The retainer's fee per period (month or quarter), net, in the workspace's currency """ retainerFee: Float """ 1: billed monthly (default); 3: billed quarterly, counted from the month it starts in """ retainerIntervalMonths: Int """ The notice period in months """ retainerNoticeMonths: Int """ The first day of the retainer. A project with a start is a retainer; null ends it (invoices written stay) """ retainerStartsOn: ISO8601Date """ The project's own daily rates, replacing all it had. `id` is a rate's id as `serviceRates` returns it (it ends in the service's id) """ serviceRates: [ServiceRateInput!] status: ProjectStatus """ Since when the project has its status. Set to today whenever the status changes """ statusDate: ISO8601Date """ The users who manage the project; at least one. On update: the whole list, users left out are removed """ supervisorIds: [ID!] title: String } """ Autogenerated input type of CreateProjectLabel """ input CreateProjectLabelInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Hex colour code: #rgb or #rrggbb """ color: String description: String projectId: ID title: String } """ Autogenerated return type of CreateProjectLabel. """ type CreateProjectLabelPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json projectLabel: ProjectLabel } """ Autogenerated return type of CreateProject. """ type CreateProjectPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project } """ Autogenerated input type of CreateQuotationComment """ input CreateQuotationCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The quotation to comment on; needed when creating, ignored when updating """ quotationId: ID } """ Autogenerated return type of CreateQuotationComment. """ type CreateQuotationCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotationComment: QuotationComment } """ Autogenerated input type of CreateQuotation """ input CreateQuotationInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The content: the whole list of blocks, each with its positions and their lines. Replaces what is there; only in a draft """ blocks: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ Values for the workspace's custom fields; they are shared by all documents of the billing cycle """ customFields: [AccountingCustomFieldInput!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date description: String """ The whole list of discounts and surcharges, each with type (discount or surcharge), title and amount (net). Only in a draft """ discountSurcharge: Json footer: String """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The quotation's running number within its project; the next free one when omitted """ number: Int projectId: ID! showPositionSubtotal: Boolean status: QuotationStatus @deprecated(reason: "Refused unless unchanged: a document's status moves through its own mutations (publish, draft, …).") """ The VAT rate lines use unless they set their own; fixed once the document leaves draft """ taxRate: Float } """ Autogenerated return type of CreateQuotation. """ type CreateQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of CreateRetainerInvoice """ input CreateRetainerInvoiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Any day of the month to invoice """ month: ISO8601Date! projectId: ID! } """ Autogenerated return type of CreateRetainerInvoice. """ type CreateRetainerInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of CreateSavedView """ input CreateSavedViewInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String list: SavedViewList! name: String! """ For a project's lists (its tickets, its controlling) """ projectId: ID """ The list's URL query string (its filters), at most 2000 characters """ query: String! """ For everyone in the project or workspace (PMs and admins) """ shared: Boolean = false } """ Autogenerated return type of CreateSavedView. """ type CreateSavedViewPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json savedView: SavedView } """ Autogenerated input type of CreateServiceCategory """ input CreateServiceCategoryInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String title: String } """ Autogenerated return type of CreateServiceCategory. """ type CreateServiceCategoryPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json serviceCategory: ServiceCategory } """ Autogenerated input type of CreateService """ input CreateServiceInput { archived: Boolean """ Whether time booked on this service is billed to the customer """ billable: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Net, in the workspace's currency """ dailyRate: Float """ The VAT rate in percent a document line of this service starts with; null = the document's """ defaultTaxRate: Float description: String serviceCategoryId: ID title: String } """ Autogenerated return type of CreateService. """ type CreateServicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json service: Service } """ Autogenerated input type of CreateSharedProjectReport """ input CreateSharedProjectReportInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Last day the link works; null: no end """ expiresOn: ISO8601Date projectId: ID """ Shows the budget and the revenue of the time entries """ showBudget: Boolean """ Shows who booked the time """ showExecutive: Boolean """ Adds the list of the project's tickets. Default: false """ showTickets: Boolean } """ Autogenerated return type of CreateSharedProjectReport. """ type CreateSharedProjectReportPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project sharedProjectReport: SharedProjectReport } """ Autogenerated input type of CreateStopwatch """ input CreateStopwatchInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Start it right away """ start: Boolean = true """ A ticket the caller can open; it can be set later """ ticketId: ID """ Default: Stopwatch 1, 2, … """ title: String } """ Autogenerated return type of CreateStopwatch. """ type CreateStopwatchPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json stopwatch: Stopwatch stopwatches: [Stopwatch!]! } """ Autogenerated input type of CreateSupplier """ input CreateSupplierInput { archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The supplier's own account (creditor number) in DATEV; empty = the collective account """ datevAccount: String """ Subject to the German artists' social insurance levy (KSK), which is then shown on each of their invoices """ ksk: Boolean taxTreatment: SupplierTaxTreatment title: String } """ Autogenerated return type of CreateSupplier. """ type CreateSupplierPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json supplier: Supplier } """ Autogenerated input type of CreateTicketAssignment """ input CreateTicketAssignmentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Ignored: the project is the ticket's """ projectId: ID ticketId: ID userId: ID } """ Autogenerated return type of CreateTicketAssignment. """ type CreateTicketAssignmentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticketAssignment: TicketAssignment } """ Autogenerated input type of CreateTicketComment """ input CreateTicketCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment's text. As a Tiptap (ProseMirror) document in JSON: { type: 'doc', content: […] } """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Plain text instead of `body`: blank lines separate paragraphs, single line breaks stay line breaks. Ignored when `body` is sent """ text: String ticketId: ID } """ Autogenerated return type of CreateTicketComment. """ type CreateTicketCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticketComment: TicketComment } """ Autogenerated input type of CreateTicket """ input CreateTicketInput { """ Users who can open the project. On update: the whole list, users left out are unassigned """ assigneeIds: [ID!] authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The column of the project's kanban board. Default: Backlog for an open ticket, Done for a closed one """ boardId: ID """ The ticket's description. As a Tiptap (ProseMirror) document in JSON: { type: 'doc', content: […] } """ body: Json """ The budget in the unit of `budgetType`: minutes, or an amount in the workspace's currency """ budgetRate: Float """ Ignored, like `budgetRate`, unless the caller sees financial data (project managers and admins) """ budgetType: TicketBudget """ A unique identifier for the client performing the mutation. """ clientMutationId: String endDate: ISO8601Date """ Labels of the ticket's project. On update: the whole list, labels left out are removed """ labelIds: [ID!] """ Ignored on create: a new ticket gets the next number in its project """ number: Int phaseId: ID priority: TicketPriority projectId: ID serviceCategoryId: ID startDate: ISO8601Date """ Default: OPEN. A ticket created with `boardId` takes that column's status instead """ status: TicketStatus """ Plain text instead of `body`: blank lines separate paragraphs, single line breaks stay line breaks. Ignored when `body` is sent """ text: String title: String } """ Autogenerated return type of CreateTicket. """ type CreateTicketPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } """ Autogenerated input type of CreateTimetracking """ input CreateTimetrackingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String date: ISO8601Date description: String """ In minutes, in steps of 15 """ duration: Float projectId: ID """ The kind of work; the entry is priced at the project's rate for it """ serviceId: ID """ Books this stopwatch of yours: it is removed together with creating the entry """ stopwatchId: ID """ A ticket of the project in `projectId` """ ticketId: ID """ Whose time it is. Default on create: the caller. Only admins may name someone else """ userId: ID } """ Autogenerated return type of CreateTimetracking. """ type CreateTimetrackingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetracking: Timetracking } """ Autogenerated input type of CreateUser """ input CreateUserInput { """ An archived user can't sign in; their sessions and API keys stop working. Admins only, never on themselves. """ archived: Boolean """ A PNG or JPEG as a data URL, at most 2 MB """ avatar: String birthday: ISO8601Date """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Required to change one's own email or password """ currentPassword: String """ The customers the person is assigned to; replaces the whole list. Admins only. """ customerAssignmentsIds: [ID!] dashboardRssEnabled: Boolean dashboardRssExcerpt: Boolean dashboardRssUrl: String """ Admins, or the person themselves with currentPassword """ email: String entryDate: ISO8601Date firstname: String initial: String lastname: String """ Language of the person's emails and sign-in pages; null = the workspace's default. Only the person themselves. """ locale: Locale """ Admins, or the person themselves with currentPassword """ password: String passwordConfirmation: String """ The projects the person is assigned to; replaces the whole list. Admins only. """ projectAssignmentsIds: [ID!] """ Admins only, never on themselves """ role: UserRole """ The service the person's time is booked with by default """ serviceId: ID settings: Json username: String """ Working-hours profiles: target hours per weekday from a date on """ workTimesAttributes: [UserWorkTimeInput!] } """ Autogenerated return type of CreateUser. """ type CreateUserPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json user: User } """ Autogenerated input type of CreateUserWorkTime """ input CreateUserWorkTimeInput { """ The first day the profile applies; required, one profile per user and day """ activeFrom: ISO8601Date """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Target working hours on Fridays """ fri: Float """ Target working hours on Mondays """ mon: Float """ Target working hours on Saturdays """ sat: Float """ Target working hours on Sundays """ sun: Float """ Target working hours on Thursdays """ thu: Float """ Target working hours on Tuesdays """ tue: Float userId: ID """ Target working hours on Wednesdays """ wed: Float } """ Autogenerated return type of CreateUserWorkTime. """ type CreateUserWorkTimePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json userWorkTime: UserWorkTime } """ Autogenerated input type of CreateVatStatus """ input CreateVatStatusInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ true: a small business that charges no VAT; false: VAT is charged """ smallBusiness: Boolean! """ The first day the status applies """ validFrom: ISO8601Date! } """ Autogenerated return type of CreateVatStatus. """ type CreateVatStatusPayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json vatStatus: VatStatus } """ Autogenerated input type of CreateWebhookEndpoint """ input CreateWebhookEndpointInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Event names such as `invoice.published`, `ticket.created` or `time_entry.created`; at least one """ events: [String!]! """ A public https address """ url: String! } """ Autogenerated return type of CreateWebhookEndpoint. """ type CreateWebhookEndpointPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json webhookEndpoint: WebhookEndpoint } enum Currency { AUD BRL CAD CHF CNY CZK DKK EUR GBP HKD HUF IDR ILS INR ISK JPY KRW MXN MYR NOK NZD PHP PLN RON SEK SGD THB TRY USD ZAR } type CustomField implements Node { archived: Boolean! createdAt: ISO8601DateTime! customer: Customer! defaultValue: String fieldType: String! id: ID! name: String! updatedAt: ISO8601DateTime! } """ The connection type for CustomField. """ type CustomFieldConnection { count: Int! """ A list of edges. """ edges: [CustomFieldEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [CustomField!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type CustomFieldEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: CustomField! } input CustomFieldFilter { archived: Boolean customerIds: [ID!] ids: [ID!] } """ A customer of the agency: the company projects are run for and documents are written to. Admins, project managers and basic users read every customer; a timetracker only those they are assigned to, directly or through a project. """ type Customer implements Node { """ Agency commission in percent, charged on the external services a document bills; null = none. Null unless you may see financial data (project managers and admins). """ accountingCommissionPercent: Float """ The agency commission applies once a document's external services reach this net amount (workspace currency). Null unless you may see financial data (project managers and admins). """ accountingCommissionThreshold: Float addresses( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomerAddressFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): CustomerAddressConnection! archived: Boolean! """ The customer's name """ company: String! contacts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ContactConnection! createdAt: ISO8601DateTime! customFields( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomFieldFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): CustomFieldConnection! """ The customer's own account (debtor number) in the tax office's DATEV; null = the collective account """ datevAccount: String description: String email: String id: ID! """ Short code, unique in the workspace; it starts the numbers of the customer's projects (Project.pnr) """ initial: String! """ Footer text for this customer's invoices in German """ invoiceFooterDe: String """ Footer text for this customer's invoices in English """ invoiceFooterEn: String """ Whether there is a master agreement with the customer; advance-payment invoices then name it. Null unless you may see financial data (project managers and admins). """ masterAgreement: Boolean """ This customer's payment term in days; null = the workspace's """ paymentTermDays: Int phone: String projects( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ProjectFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectConnection! """ Footer text for this customer's quotations in German """ quotationFooterDe: String """ Footer text for this customer's quotations in English """ quotationFooterEn: String """ Every service with the daily rate that applies to this customer (the customer's own, else the service's). Null unless you may see financial data (project managers and admins). """ serviceRates: [ServiceRate!] slug: String! updatedAt: ISO8601DateTime! web: String } """ One of a customer's addresses, with what a document sent to it needs: the customer number, the VAT ID and how the customer is taxed. Lists return the addresses of customers the caller can see. """ type CustomerAddress implements Node { address1: String address2: String """ The e-invoice's buyer reference (BT-10) for this address, e.g. a Leitweg-ID; none: the invoice's PO number, else the customer number """ buyerReference: String city: String """ What was typed as the country before the list, where it names none docket knows """ country: String """ ISO 3166-1 alpha-2; none for a customer in the workspace's own country """ countryCode: String """ The country as the app shows it (English) """ countryName: String createdAt: ISO8601DateTime! """ Why this address can't be deleted, or null when it can """ deletionRefusal: String department: String """ Quotations, order confirmations, delivery notes and invoices written to this address """ documentsCount: Int! id: ID! """ Where this customer receives e-invoices (BT-49); none: the customer's e-mail """ invoiceEmail: String """ The customer number, unique in the workspace """ number: Int! recipient: String """ How documents to this address are taxed """ taxTreatment: TaxTreatment! updatedAt: ISO8601DateTime! """ Whether VAT is charged (tax treatment is domestic) """ vatEnabled: Boolean! """ The customer's VAT identification number; needed for reverse charge """ vatNo: String zip: String } """ The connection type for CustomerAddress. """ type CustomerAddressConnection { count: Int! """ A list of edges. """ edges: [CustomerAddressEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [CustomerAddress!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type CustomerAddressEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: CustomerAddress! } input CustomerAddressFilter { customerIds: [ID!] ids: [ID!] } """ The connection type for Customer. """ type CustomerConnection { count: Int! """ A list of edges. """ edges: [CustomerEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Customer!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type CustomerEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Customer! } input CustomerFilter { archived: Boolean ids: [ID!] """ true = customers with at least one archived project, false = with at least one project that is not archived """ projectArchived: Boolean """ Customers with a project whose title contains this text """ projectTitle: String """ Text to find, as the app's search finds it: by name, customer number or VAT ID """ search: String } """ Autogenerated input type of DeleteApiToken """ input DeleteApiTokenInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteApiToken. """ type DeleteApiTokenPayload { apiToken: ApiToken """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of DeleteBlock """ input DeleteBlockInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block's place in the document, counted from 0 """ index: Int! """ Where the block goes, counted from 0 """ newIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The draft quotation or invoice to change """ recordId: ID! title: String type: BlockTypeEnum } """ Autogenerated return type of DeleteBlock. """ type DeleteBlockPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of DeleteBlockPosition """ input DeleteBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!] title: String } """ Autogenerated return type of DeleteBlockPosition. """ type DeleteBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of DeleteBoard """ input DeleteBoardInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteBoard. """ type DeleteBoardPayload { board: Board """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of DeleteContact """ input DeleteContactInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteContact. """ type DeleteContactPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String contact: Contact errors: Json } """ Autogenerated input type of DeleteCustomField """ input DeleteCustomFieldInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteCustomField. """ type DeleteCustomFieldPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customField: CustomField errors: Json } """ Autogenerated input type of DeleteCustomerAddress """ input DeleteCustomerAddressInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteCustomerAddress. """ type DeleteCustomerAddressPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customerAddress: CustomerAddress errors: Json } """ Autogenerated input type of DeleteCustomer """ input DeleteCustomerInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteCustomer. """ type DeleteCustomerPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customer: Customer errors: Json } """ Autogenerated input type of DeleteDeliveryNoteComment """ input DeleteDeliveryNoteCommentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteDeliveryNoteComment. """ type DeleteDeliveryNoteCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNoteComment: DeliveryNoteComment errors: Json } """ Autogenerated input type of DeleteDeliveryNote """ input DeleteDeliveryNoteInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteDeliveryNote. """ type DeleteDeliveryNotePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNote: DeliveryNote errors: Json } """ Autogenerated input type of DeleteDiscountSurcharge """ input DeleteDiscountSurchargeInput { """ The net amount as a positive number; a discount is subtracted, a surcharge added """ amount: Float """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Its place in the document's list of discounts and surcharges, counted from 0 """ index: Int! """ The draft quotation or invoice to change """ recordId: ID! title: String type: DiscountSurchargeTypeEnum } """ Autogenerated return type of DeleteDiscountSurcharge. """ type DeleteDiscountSurchargePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String discountSurcharge: JSON errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of DeleteDocumentTemplate """ input DeleteDocumentTemplateInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteDocumentTemplate. """ type DeleteDocumentTemplatePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String documentTemplate: DocumentTemplate errors: Json } """ Autogenerated input type of DeleteExternalCost """ input DeleteExternalCostInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteExternalCost. """ type DeleteExternalCostPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json externalCost: ExternalCost } """ Autogenerated input type of DeleteInvoiceComment """ input DeleteInvoiceCommentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteInvoiceComment. """ type DeleteInvoiceCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoiceComment: InvoiceComment } """ Autogenerated input type of DeleteInvoice """ input DeleteInvoiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteInvoice. """ type DeleteInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of DeleteJiraConnection """ input DeleteJiraConnectionInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteJiraConnection. """ type DeleteJiraConnectionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraConnection: JiraSite } """ Autogenerated input type of DeleteJiraUserCredential """ input DeleteJiraUserCredentialInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteJiraUserCredential. """ type DeleteJiraUserCredentialPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraUserCredential: JiraUserCredential } """ Autogenerated input type of DeleteJiraUserMapping """ input DeleteJiraUserMappingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteJiraUserMapping. """ type DeleteJiraUserMappingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraUserMapping: JiraUserMapping } """ Autogenerated input type of DeleteOrderConfirmationComment """ input DeleteOrderConfirmationCommentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteOrderConfirmationComment. """ type DeleteOrderConfirmationCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmationComment: OrderConfirmationComment } """ Autogenerated input type of DeleteOrderConfirmation """ input DeleteOrderConfirmationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteOrderConfirmation. """ type DeleteOrderConfirmationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmation: OrderConfirmation } """ Autogenerated input type of DeletePhase """ input DeletePhaseInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeletePhase. """ type DeletePhasePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json phase: Phase } """ Autogenerated input type of DeleteProject """ input DeleteProjectInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated input type of DeleteProjectLabel """ input DeleteProjectLabelInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteProjectLabel. """ type DeleteProjectLabelPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json projectLabel: ProjectLabel } """ Autogenerated return type of DeleteProject. """ type DeleteProjectPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project } """ Autogenerated input type of DeleteQuotationComment """ input DeleteQuotationCommentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteQuotationComment. """ type DeleteQuotationCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotationComment: QuotationComment } """ Autogenerated input type of DeleteQuotation """ input DeleteQuotationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ Another quotation of the same project that takes over this one's external costs """ moveExternalCostsToId: ID """ Take the external costs off the quotation and set them back to draft """ unassignExternalCosts: Boolean } """ Autogenerated return type of DeleteQuotation. """ type DeleteQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of DeleteSavedView """ input DeleteSavedViewInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteSavedView. """ type DeleteSavedViewPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json savedView: SavedView } """ Autogenerated input type of DeleteServiceCategory """ input DeleteServiceCategoryInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteServiceCategory. """ type DeleteServiceCategoryPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json serviceCategory: ServiceCategory } """ Autogenerated input type of DeleteService """ input DeleteServiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteService. """ type DeleteServicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json service: Service } """ Autogenerated input type of DeleteSharedProjectReport """ input DeleteSharedProjectReportInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteSharedProjectReport. """ type DeleteSharedProjectReportPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project sharedProjectReport: SharedProjectReport } """ Autogenerated input type of DeleteStopwatch """ input DeleteStopwatchInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteStopwatch. """ type DeleteStopwatchPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json stopwatch: Stopwatch stopwatches: [Stopwatch!]! } """ Autogenerated input type of DeleteSupplier """ input DeleteSupplierInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteSupplier. """ type DeleteSupplierPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json supplier: Supplier } """ Autogenerated input type of DeleteTicketComment """ input DeleteTicketCommentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteTicketComment. """ type DeleteTicketCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticketComment: TicketComment } """ Autogenerated input type of DeleteTicket """ input DeleteTicketInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteTicket. """ type DeleteTicketPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } """ Autogenerated input type of DeleteTimetracking """ input DeleteTimetrackingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteTimetracking. """ type DeleteTimetrackingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetracking: Timetracking } """ Autogenerated input type of DeleteUser """ input DeleteUserInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteUser. """ type DeleteUserPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json user: User } """ Autogenerated input type of DeleteUserWorkTime """ input DeleteUserWorkTimeInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteUserWorkTime. """ type DeleteUserWorkTimePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json userWorkTime: UserWorkTime } """ Autogenerated input type of DeleteVatStatus """ input DeleteVatStatusInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteVatStatus. """ type DeleteVatStatusPayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json vatStatus: VatStatus } """ Autogenerated input type of DeleteWebhookEndpoint """ input DeleteWebhookEndpointInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DeleteWebhookEndpoint. """ type DeleteWebhookEndpointPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json webhookEndpoint: WebhookEndpoint } """ A delivery note, created from the order confirmation with its content. Optional, as many per billing cycle as there are deliveries. Only project managers and admins can read it. """ type DeliveryNote implements Node { """ The billing cycle it belongs to """ accounting: Accounting! """ Who created it """ author: User! comments( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): DeliveryNoteCommentConnection! """ The customer's contacts the document is addressed to """ contactCustomers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ContactConnection! """ The agency's contact persons named on the document """ contactInternals( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! createdAt: ISO8601DateTime! """ The customer of the document's project """ customer: Customer! """ The customer address it is written to; needed before it can go out """ customerAddress: CustomerAddress date: ISO8601Date """ Soft-delete flag; deleted documents are not listed """ deleted: Boolean! """ Introductory text (HTML) """ description: String """ File name of its PDF """ filename: String! """ Footer text (HTML) """ footer: String id: ID! """ Language of the document and its PDF: de or en """ language: String """ Free name beside the number; the project's title unless given """ name: String """ The number as printed: project number, a dot and the two-digit number """ no: String! notificationRecipients: [User!]! """ Running number within the project """ number: Int! project: Project! """ Whether the PDF shows a subtotal under each position """ showPositionSubtotal: Boolean! status: DeliveryNoteStatus! """ Its comments and events (status changes, edits), oldest first """ stream( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): DeliveryNoteStreamConnection! """ The document's computed totals: net, discounts and surcharges, VAT, gross """ summary: Summary! """ Why it charges no VAT, as its PDF says it; null when VAT is charged """ taxNote: String """ The VAT rate in percent its lines use unless a line has its own """ taxRate: Float! """ How the customer is taxed; anything but DOMESTIC means no VAT on any line. Frozen once the document is issued. """ taxTreatment: TaxTreatment! """ no followed by the name """ title: String! updatedAt: ISO8601DateTime! """ Why the caller follows it (for example because they wrote it or were assigned); null when they don't """ viewerFollowReason: String """ Whether the caller follows it and so gets its notifications """ viewerIsFollowing: Boolean! } type DeliveryNoteComment implements Node { author: User! body: Json! bodyHtml: String! """ Written by docket when the AI added positions (shown as docket's); the author applied them """ byAi: Boolean! createdAt: ISO8601DateTime! deliveryNote: DeliveryNote! id: ID! """ Its reactions by emoji, in the order they were first given """ reactions: [Reaction!]! updatedAt: ISO8601DateTime! viewerCanEdit: Boolean! } """ The connection type for DeliveryNoteComment. """ type DeliveryNoteCommentConnection { count: Int! """ A list of edges. """ edges: [DeliveryNoteCommentEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [DeliveryNoteComment!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } type DeliveryNoteCommentDeleted { id: ID! } """ An edge in a connection. """ type DeliveryNoteCommentEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: DeliveryNoteComment! } """ The connection type for DeliveryNote. """ type DeliveryNoteConnection { count: Int! """ A list of edges. """ edges: [DeliveryNoteEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [DeliveryNote!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type DeliveryNoteEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: DeliveryNote! } input DeliveryNoteFilter { ids: [ID!] search: String } enum DeliveryNoteStatus { """ Not sent yet: its content can be changed. """ DRAFT """ Ready to go to the customer: its content is locked. """ PUBLISHED } """ The connection type for DeliveryNoteStreamUnion. """ type DeliveryNoteStreamConnection { count: Int! """ A list of edges. """ edges: [DeliveryNoteStreamEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [DeliveryNoteStreamUnion!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type DeliveryNoteStreamEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: DeliveryNoteStreamUnion! } """ Objects which may appear in a delivery note's stream """ union DeliveryNoteStreamSubscriptionUnion = DeliveryNoteComment | DeliveryNoteCommentDeleted | Event """ Objects which may appear in a delivery note's stream """ union DeliveryNoteStreamUnion = DeliveryNoteComment | Event """ Autogenerated input type of DisconnectAiConnection """ input DisconnectAiConnectionInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The ConnectedAiApp id (OAuth application) """ id: ID! } """ Autogenerated return type of DisconnectAiConnection. """ type DisconnectAiConnectionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String disconnected: Boolean! errors: Json } type DiscountSurcharge { amount: Float! title: String! type: DiscountSurchargeTypeEnum! } enum DiscountSurchargeTypeEnum { discount surcharge } """ A value of the file and the service the AI suggests billing it as, for the person to change """ type DocumentAssistantMapping { """ The service's title; null when none fits """ service: String value: String! } """ A question the AI asks back, with answers to pick from """ type DocumentAssistantQuestion { """ A file's values with the suggested service each, to change """ mapping: [DocumentAssistantMapping!]! """ Several answers may be picked """ multiple: Boolean! options: [String!]! question: String! } """ Rows of the file that didn't count """ type DocumentAssistantSkipped { """ Without hours or days to read """ noQuantity: Int! """ Without a service to bill """ noService: Int! } input DocumentAssistantTurnInput { """ user or assistant """ role: String! text: String! } type DocumentFontFile { filename: String! style: DocumentFontStyle! } enum DocumentFontStyle { BOLD BOLD_ITALIC ITALIC REGULAR } """ A service line of the plan, priced from the project's rates """ type DocumentPlanLine { description: String! quantity: Float! """ The service's title """ service: String! """ What the line comes to; null for a service the document's rates lack """ total: Float """ hours or days """ unit: String! } type DocumentPlanPhase { positions: [DocumentPlanPosition!]! title: String! } type DocumentPlanPosition { lines: [DocumentPlanLine!]! title: String! } """ What a plan adds to a document and what it comes to, net """ type DocumentPlanPreview { net: Float! phases: [DocumentPlanPhase!]! positions: [DocumentPlanPosition!]! } type DocumentTemplate implements Node { author: User """ Its phase or block titles, for a preview """ blockTitles: [String!]! createdAt: ISO8601DateTime! """ The one customer it's offered for; null: every customer """ customer: Customer id: ID! """ quotation or invoice: the documents it's for """ kind: String! """ Services in it the workspace no longer has: their lines would be priced at nothing """ missingServiceCount: Int! name: String! """ What the template is for """ note: String """ phases or agency (agency and external services) """ structure: String! updatedAt: ISO8601DateTime! } """ Autogenerated input type of DraftDeliveryNote """ input DraftDeliveryNoteInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DraftDeliveryNote. """ type DraftDeliveryNotePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNote: DeliveryNote errors: Json } """ Autogenerated input type of DraftInvoice """ input DraftInvoiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DraftInvoice. """ type DraftInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of DraftOrderConfirmation """ input DraftOrderConfirmationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DraftOrderConfirmation. """ type DraftOrderConfirmationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmation: OrderConfirmation } """ Autogenerated input type of DraftQuotation """ input DraftQuotationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of DraftQuotation. """ type DraftQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of DuplicateBlock """ input DuplicateBlockInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block's place in the document, counted from 0 """ index: Int! """ Where the block goes, counted from 0 """ newIndex: Int! """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The draft quotation or invoice to change """ recordId: ID! title: String type: BlockTypeEnum } """ Autogenerated return type of DuplicateBlock. """ type DuplicateBlockPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of DuplicateBlockPosition """ input DuplicateBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int! """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!] title: String } """ Autogenerated return type of DuplicateBlockPosition. """ type DuplicateBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of DuplicateInvoice """ input DuplicateInvoiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The project the copy goes into """ projectId: ID! } """ Autogenerated return type of DuplicateInvoice. """ type DuplicateInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of DuplicateQuotation """ input DuplicateQuotationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The project the copy goes into """ projectId: ID! } """ Autogenerated return type of DuplicateQuotation. """ type DuplicateQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } type Event implements Node { action: EventAction! createdAt: ISO8601DateTime! id: ID! payload: Json record: EventRecordUnion! """ What a TICKET_CHANGED event changed; null for every other action """ ticketChanges: [TicketChange!] updatedAt: ISO8601DateTime! user: User! } enum EventAction { """ Delivery note was draft """ DELIVERY_NOTE_DRAFT """ Delivery note was published """ DELIVERY_NOTE_PUBLISHED """ Invoice was approved """ INVOICE_APPROVED """ Invoice was canceled """ INVOICE_CANCELED """ Invoice was draft """ INVOICE_DRAFT """ Invoice was marked as paid """ INVOICE_PAID """ A payment was taken back: the invoice is unpaid again """ INVOICE_PAYMENT_REVERSED """ Invoice was published """ INVOICE_PUBLISHED """ Order confirmation was draft """ ORDER_CONFIRMATION_DRAFT """ Order confirmation was published """ ORDER_CONFIRMATION_PUBLISHED """ Quotation was approved """ QUOTATION_APPROVED """ Quotation was canceled """ QUOTATION_CANCELED """ Quotation was confirmed """ QUOTATION_CONFIRMED """ Quotation was draft """ QUOTATION_DRAFT """ Quotation was published """ QUOTATION_PUBLISHED """ Ticket was edited: see ticketChanges """ TICKET_CHANGED """ Ticket was closed """ TICKET_CLOSED """ Ticket was reopened """ TICKET_REOPENED } """ Objects which may appear in an event """ union EventRecordUnion = Ticket type ExchangeRate { """ The day the rate is from: the date asked for, or the last working day before it """ on: ISO8601Date! rate: Float! } """ An external cost: a supplier's invoice for something bought for a project, assigned to projects and quotations so it counts in their budget and controlling. Only project managers and admins can read it. """ type ExternalCost implements Node { """ Net amount in the workspace's currency """ amount: Float! """ The projects and quotations it is assigned to, each with its amount and whether it is passed on to the customer """ assignments: [ExternalCostAssignment!]! """ With partial amounts: the net amount not assigned yet; otherwise 0 """ assignmentsDifference: Float! createdAt: ISO8601DateTime! """ The currency of the supplier's invoice """ currency: Currency! """ Units of the currency per euro (ECB) """ exchangeRate: Float """ The day the exchange rate is from """ exchangeRateOn: ISO8601Date id: ID! """ false when the workspace could not reclaim the VAT (a small business): the cost then counts with its VAT """ inputTaxDeductible: Boolean! """ The invoice file (PDF) """ invoice: Attachment! invoiceDate: ISO8601Date! """ The supplier's invoice number; unique per supplier and VAT rate """ invoiceNumber: String! """ The KSK levy (German artists' social insurance) on the net amount at the invoice year's rate; 0 unless the supplier is subject to it """ ksk: Float! """ Net amount in the invoice's currency, for an invoice in another currency than the workspace's """ originalAmount: Float """ Whether the invoice is split: each assignment takes a part of the amount. Otherwise it has one assignment for all of it. """ partialAmount: Boolean! """ Marks an invoice that is one of several from the supplier for the same job """ partialBill: Boolean! """ The projects it is assigned to """ projects( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectConnection! """ The quotations it is assigned to """ quotations( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): QuotationConnection! """ The supplier's other invoices for the same job, linked to this one; oldest first """ relatedCosts: [ExternalCost!]! """ What the linked invoices come to, this one included (net, in the workspace's currency) """ relatedTotal: Float! status: ExternalCostStatus! """ When the status last changed """ statusChangedAt: ISO8601DateTime! supplier: Supplier! """ The VAT amount, as the supplier's invoice states it """ tax: Float! """ The VAT rate in percent, e.g. 19.0 """ taxRate: Float! updatedAt: ISO8601DateTime! """ The person responsible for it, if one is set """ user: User } type ExternalCostAssignment implements Node { amount: Float boundsExtended: [ExternalCostAssignmentExtended!] boundsHeight: Float boundsLeft: Float boundsTop: Float boundsWidth: Float chargeable: Boolean! createdAt: ISO8601DateTime! id: ID! page: Int project: Project! quotation: Quotation! updatedAt: ISO8601DateTime! } type ExternalCostAssignmentExtended { boundsHeight: Float! boundsLeft: Float! boundsTop: Float! boundsWidth: Float! page: Int! } input ExternalCostAssignmentExtendedInput { boundsHeight: Float boundsLeft: Float boundsTop: Float boundsWidth: Float page: Int } input ExternalCostAssignmentInput { amount: Float boundsExtended: [ExternalCostAssignmentExtendedInput!] boundsHeight: Float boundsLeft: Float boundsTop: Float boundsWidth: Float chargeable: Boolean page: Int projectId: ID quotationId: ID } """ The connection type for ExternalCost. """ type ExternalCostConnection { count: Int! """ A list of edges. """ edges: [ExternalCostEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [ExternalCost!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type ExternalCostEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: ExternalCost! } type ExternalCostFigures { """ The net amount at that rate, in the workspace's currency """ convertedAmount: Float """ The ECB rate of the invoice date, for an invoice in another currency """ exchangeRate: ExchangeRate """ Whether the VAT comes back as input tax: not while the workspace was a small business """ inputTaxDeductible: Boolean! """ The net amount given (or the converted one) at the VAT rate """ taxAtRate: Float } input ExternalCostFilter { ids: [ID!] """ The supplier invoice's date. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ invoiceDates: [String!] """ External costs assigned, in whole or in part, to any of these projects """ projectIds: [ID!] """ External costs assigned, in whole or in part, to any of these quotations """ quotationIds: [ID!] """ Text to find, as the app's search finds it: by the supplier and the supplier's invoice number """ search: String """ Any of these statuses. A value with a leading "!" excludes that one, e.g. "!PROCESSED". """ status: [NegatableExternalCostStatus!] """ The day the status last changed, in the workspace's time zone. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ statusChangedDates: [String!] supplierIds: [ID!] userIds: [ID!] } enum ExternalCostStatus { """ Just captured, not checked yet. The only status in which it may be unassigned; a draft counts in no budget or total. """ DRAFT """ Checked and correctly assigned. """ OK """ Handled downstream, for example paid or passed on to the customer. """ PROCESSED """ Something is off (the amount, the project) and needs a decision. It is assigned and counts. """ TO_CLARIFY } type ExternalCostsCheck { """ Supplier invoices assigned to the quote, passed on or not, net, drafts left out """ booked: Float! """ The part of booked that isn't passed on to the customer """ notCharged: Float! """ Booked above quoted """ over: Boolean! """ Booked as a percentage of quoted; null when nothing was quoted """ percent: Float """ The external services the confirmed quote sold """ quoted: Float! } type ExternalCostsOverrun { check: ExternalCostsCheck! quotation: Quotation! } type FinancialSummary { awaitingOrderConfirmation: [Quotation!]! """ The year's confirmed quotations whose order confirmation isn't published yet """ awaitingOrderConfirmationCount: Int! awaitingOrderConfirmationTotal: Float! """ Unpaid invoices from earlier years """ carriedOverCount: Int! carriedOverInvoices: [Invoice!]! carriedOverTotal: Float! """ The running jobs (confirmed quotations without an issued final invoice, any year) whose booked external costs are over what they sold, the furthest over first """ externalCostsOverruns: [ExternalCostsOverrun!]! monthlyRevenue: [MonthlyRevenue!]! openInvoicesCount: Int! openInvoicesTotal: Float! orderConfirmationsCount: Int! orderConfirmationsTotal: Float! overdueCount: Int! overdueInvoices: [Invoice!]! overdueTotal: Float! paidCount: Int! paidTotal: Float! pipelineCount: Int! pipelineTotal: Float! quotationStatusBreakdown: [StatusBreakdown!]! """ The years that have a quotation or an invoice, newest first — empty while the workspace has no document """ years: [Int!]! } type ForecastMonth { expected: Float! month: Int! paid: Float! } type ForecastReport { invoiceCount: Int! months: [ForecastMonth!]! quotationCount: Int! rows: [ForecastRow!]! totals: ForecastTotals! year: Int! """ The years that have a quotation or an invoice, newest first — empty while the workspace has no document """ years: [Int!]! } type ForecastRow { allocationMonth: Int bookedExternalCosts: Float deltaToQuotation: Float! externalCosts: Float! externalCostsOver: Boolean id: ID! invoiceDate: ISO8601Date invoiceNumber: String invoicePaidDate: ISO8601DateTime invoiceStatus: String invoiceTotal: Float! isPaid: Boolean! kvNumber: String monthlyAmount: Float! poNumber: String projectManager: String projectSlug: String! projectTitle: String quotationBudget: Float! quotationDate: ISO8601Date quotationNumber: Int quotationStatus: String } type ForecastTotals { """ The confirmed quotations' booked external costs """ bookedExternalCosts: Float! deltaToQuotation: Float! externalCosts: Float! invoiceTotal: Float! """ Net total of the confirmed quotations """ quotationBudget: Float! } """ An ISO 8601-encoded date """ scalar ISO8601Date @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") """ An ISO 8601-encoded datetime """ scalar ISO8601DateTime @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") """ An invoice. A draft has no number; publishing (admins only) gives it its number and makes it final. Only project managers and admins can read it. """ type Invoice implements Node { """ The billing cycle it belongs to """ accounting: Accounting! """ Who created it """ author: User! """ The note given when it was canceled """ canceledNote: String comments( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): InvoiceCommentConnection! """ The customer's contacts the document is addressed to """ contactCustomers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ContactConnection! """ The agency's contact persons named on the document """ contactInternals( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! """ Each time it was reopened for correction before it went out, oldest first """ corrections: [InvoiceCorrection!]! createdAt: ISO8601DateTime! """ The customer of the document's project """ customer: Customer! """ The customer address it is written to; needed before it can go out """ customerAddress: CustomerAddress """ The invoice date """ date: ISO8601Date """ Days past the due date of a published, unpaid invoice; null otherwise """ daysOverdue: Int """ Soft-delete flag; deleted documents are not listed """ deleted: Boolean! """ The date of delivery or performance printed on the invoice """ deliveryDate: ISO8601Date """ Introductory text (HTML) """ description: String """ The template it was started from, if any """ documentTemplate: DocumentTemplate """ The invoice date plus the payment term (the customer's, else the workspace's), fixed when it is published; null for a cancellation invoice """ dueDate: ISO8601Date """ What the invoice asks the customer for, net: a final invoice's total minus what was invoiced before, any other invoice's total """ dueNet: Float! """ Whether the e-invoice (XRechnung XML) archived at publish can be downloaded, at /api/invoices/xml/:id """ eInvoiceAvailable: Boolean! """ Net total of its external-service lines, in the workspace's currency """ externalServiceTotal: Float """ File name of its PDF """ filename: String! """ Footer text (HTML) """ footer: String id: ID! """ Reopened for correction and not published again yet — a draft that keeps its number """ inCorrection: Boolean! """ The invoice number as printed: project number, a dot, the workspace's number prefix if any, and the number (a placeholder while a draft) """ inr: String! """ inr followed by the name """ inrWithName: String! """ Advance payment, partial, final or cancellation invoice """ invoiceType: InvoiceTypeEnum """ Language of the document and its PDF: de or en """ language: String """ Free name beside the number; the project's title unless given """ name: String notificationRecipients: [User!]! """ Assigned when it is published; null for a draft """ number: Int """ The cycle's order confirmation, if its quotation was confirmed """ orderConfirmation: OrderConfirmation """ For a cancellation invoice: the invoice it reverses """ originalInvoice: Invoice """ Whether its status is PAID """ paid: Boolean! """ When it was marked as paid """ paidAt: ISO8601DateTime """ Who marked it as paid """ paidBy: User """ For a final invoice and its cancellation: the cycle's earlier invoices it deducts, oldest first. Null for the other types. """ partialInvoices: [Invoice!] project: Project! """ The quotation of its billing cycle; null for an invoice without one """ quotation: Quotation """ The month of a retainer this invoice bills (its first day); null for any other invoice """ retainerMonth: ISO8601Date """ Whether someone picks the positions it bills: a partial invoice, and a job's final invoice; one on its own bills all """ selectsPositions: Boolean! """ Whether the PDF shows a subtotal under each position """ showPositionSubtotal: Boolean! status: InvoiceStatus! """ Its comments and events (status changes, edits), oldest first """ stream( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): InvoiceStreamConnection! """ The document's computed totals: net, discounts and surcharges, VAT, gross """ summary: Summary! """ Why it charges no VAT, as its PDF says it; null when VAT is charged """ taxNote: String """ The VAT rate in percent its lines use unless a line has its own """ taxRate: Float! """ How the customer is taxed; anything but DOMESTIC means no VAT on any line. Frozen once the document is issued. """ taxTreatment: TaxTreatment! """ Whether a document template can still fill it, which needs an empty draft """ templateCanFill: Boolean! """ What the app calls it, in the caller's language: its kind, its number and the quotation or invoice it refers to """ title: String! """ Net total in the workspace's currency; for a final invoice the whole job, before what was invoiced earlier is deducted """ totalNet: Float updatedAt: ISO8601DateTime! """ Whether the caller may correct it, which cancels it and opens a copy as a new draft: project managers and admins, for an invoice that can be canceled """ viewerCanCorrect: Boolean! """ Whether the caller may take the published invoice back to draft with its number: admins, while it is neither paid, canceled nor settled by a final invoice """ viewerCanReopenForCorrection: Boolean! """ Whether the caller may take it back to draft: an invoice without a number that is not a draft """ viewerCanReturnToDraft: Boolean! """ Whether the caller may make a paid invoice unpaid again: admins """ viewerCanReversePayment: Boolean! """ Why the caller follows it (for example because they wrote it or were assigned); null when they don't """ viewerFollowReason: String """ Whether the caller follows it and so gets its notifications """ viewerIsFollowing: Boolean! } type InvoiceComment implements Node { author: User! body: Json! bodyHtml: String! """ Written by docket when the AI added positions (shown as docket's); the author applied them """ byAi: Boolean! createdAt: ISO8601DateTime! id: ID! invoice: Invoice! """ Its reactions by emoji, in the order they were first given """ reactions: [Reaction!]! updatedAt: ISO8601DateTime! viewerCanEdit: Boolean! } """ The connection type for InvoiceComment. """ type InvoiceCommentConnection { count: Int! """ A list of edges. """ edges: [InvoiceCommentEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [InvoiceComment!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } type InvoiceCommentDeleted { id: ID! } """ An edge in a connection. """ type InvoiceCommentEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: InvoiceComment! } """ The connection type for Invoice. """ type InvoiceConnection { count: Int! """ A list of edges. """ edges: [InvoiceEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Invoice!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } type InvoiceCorrection { """ When it was reopened """ createdAt: ISO8601DateTime! id: ID! """ The invoice date before the correction """ previousDate: ISO8601Date reason: String! """ When it was published again; null while it is being corrected """ republishedAt: ISO8601DateTime """ The PDF as it was archived before the correction """ supersededPdfUrl: String """ Who reopened it and confirmed the customer hadn't received it """ user: User! } """ An edge in a connection. """ type InvoiceEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Invoice! } input InvoiceFilter { """ Invoices naming any of these contacts as the customer's contact """ contactCustomerIds: [ID!] """ Invoices naming any of these users as internal contact """ contactInternalIds: [ID!] ids: [ID!] """ true = status paid, false = every other status """ isPaid: Boolean """ The day the invoice was paid, in the workspace's time zone, as "2026-10-20" or with a comparison (">=2026-10-01", "<2026-11-01"); several values must all hold """ paidAt: [String!] """ Text to find, as the app's search finds it: by number, name, text and customer """ search: String """ Any of "draft", "approved", "published", "canceled", "paid"; upper or lower case """ statuses: [String!] """ The year of the invoice date """ year: Int } enum InvoiceStatus { """ A former internal sign-off that is no longer set. An invoice still in it goes back to draft or is published. """ APPROVED """ Reversed by a cancellation invoice. Final: an issued invoice is never deleted. """ CANCELED """ Being written: it can be changed and deleted and has no number yet. A published invoice an admin reopened for correction is a draft again, keeps its number and cannot be deleted. """ DRAFT """ The payment has arrived. Final, except that an admin can reverse the payment, which makes it PUBLISHED again. """ PAID """ Issued: it has its number and due date, its content is frozen and it counts as billed. Only admins publish. From here it is marked as paid, canceled (which creates a cancellation invoice) or corrected. """ PUBLISHED } """ The connection type for InvoiceStreamUnion. """ type InvoiceStreamConnection { count: Int! """ A list of edges. """ edges: [InvoiceStreamEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [InvoiceStreamUnion!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type InvoiceStreamEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: InvoiceStreamUnion! } """ Objects which may appear in a invoice's stream """ union InvoiceStreamSubscriptionUnion = Event | InvoiceComment | InvoiceCommentDeleted """ Objects which may appear in a invoice's stream """ union InvoiceStreamUnion = Event | InvoiceComment enum InvoiceTypeEnum { """ Asks for a percentage or a fixed amount of the job's total before or during the work. Needs an order confirmation; not combined with partial invoices in one billing cycle. """ ADVANCE_PAYMENT """ Reverses a published invoice figure for figure. Created by canceling that invoice; it gets its own number when published. """ CANCELLATION_INVOICE """ Bills the job's total minus everything invoiced before in the billing cycle; after it the cycle takes no more invoices. Also the type of an invoice without an order confirmation, which bills all it lists. """ FINAL_INVOICE """ Bills only the positions selected on it. Needs an order confirmation; as many as needed, not combined with an advance payment in one billing cycle. """ PARTIAL_INVOICE } """ Represents untyped JSON """ scalar JSON enum JiraConnectionStatus { """ Connection is healthy """ ACTIVE """ Service credential was rejected by Jira """ AUTH_FAILED """ Connection manually disabled """ DISABLED } type JiraCredentialCheck { error: String jiraAccountId: String jiraConnection: JiraSiteSummary! ok: Boolean! } type JiraEpicRef { id: String! key: String! status: String summary: String } input JiraEpicRefInput { id: String! key: String! summary: String } enum JiraLinkSyncState { """ Incrementally syncing """ ACTIVE """ Initial full import running """ BACKFILLING """ Last sync failed """ ERROR """ Link created, first sync not started yet """ PENDING } type JiraMirrorConflict { bookedMinutes: Float! project: Project! ticketCount: Int! } type JiraProjectLink implements Node { convertWorklogs: Boolean! createdAt: ISO8601DateTime! defaultService: Service id: ID! importForeignWorklogs: Boolean! jiraConnection: JiraSite! jiraProjectId: String! jiraProjectKey: String! lastError: String lastSyncedAt: ISO8601DateTime mirrorConflicts: [JiraMirrorConflict!]! mirroredBookedMinutes: Int! mirroredTimetrackingCount: Int! mirroredWorklogCount: Int! project: Project! pushWorklogs: Boolean! scopeEpics: [JiraEpicRef!]! scopeKind: JiraScopeKind! syncState: JiraLinkSyncState! ticketsMode: JiraTicketsMode! updatedAt: ISO8601DateTime! } type JiraProjectRef { jiraProjectId: String! key: String! name: String! } enum JiraPushRequirement { """ An admin mapping their Jira account — Tempo posts the worklog for them """ ACCOUNT_MAPPING """ Their own Jira connection (profile settings) — core Jira posts the worklog as them """ OWN_CONNECTION } enum JiraScopeKind { """ Only the chosen epics, with their children and sub-tasks """ EPICS """ Every issue of the Jira project """ PROJECT } type JiraSite implements Node { authKind: String! cloudId: String createPlaceholderUsers: Boolean! createdAt: ISO8601DateTime! hasTempoToken: Boolean! id: ID! lastCheckedAt: ISO8601DateTime lastError: String linkedProjectsCount: Int! name: String! placeholderService: Service projectLinks: [JiraProjectLink!] siteUrl: String! status: JiraConnectionStatus! updatedAt: ISO8601DateTime! userMappings: [JiraUserMapping!] worklogBackend: JiraWorklogBackend! } type JiraSiteSummary { id: ID! name: String! siteUrl: String! } enum JiraTicketsMode { """ docket's own tickets stay; the Jira tickets are listed below them """ EXTEND """ Jira replaces the tickets area: the Tickets tab opens Jira, Boards and Roadmap are hidden """ REPLACE } enum JiraTokenStatus { """ Token was rejected by Jira """ INVALID """ Token verified against at least one connection """ OK """ Token not verified yet """ UNCHECKED } type JiraUserCredential implements Node { authKind: String! createdAt: ISO8601DateTime! displayName: String email: String id: ID! jiraConnection: JiraSiteSummary tokenCheckedAt: ISO8601DateTime tokenError: String tokenStatus: JiraTokenStatus! updatedAt: ISO8601DateTime! } type JiraUserMapping implements Node { createdAt: ISO8601DateTime! displayName: String id: ID! jiraAccountId: String! jiraConnection: JiraSite! pendingWorklogCount: Int! updatedAt: ISO8601DateTime! user: User! } type JiraUserRef { accountId: String! avatarUrl: String displayName: String! emailAddress: String } enum JiraWorklogBackend { """ Time tracked in Jira core worklogs """ JIRA """ Time tracked via Tempo Timesheets """ TEMPO } type JiraWorklogSummary { authorDisplayName: String! minutes: Float! revenue: Float user: User } scalar Json """ Autogenerated input type of LinkJiraProject """ input LinkJiraProjectInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Newly imported worklogs of mapped authors become docket time entries. Default false. """ convertWorklogs: Boolean defaultServiceId: ID """ Time logged in Jira is imported and shown read-only. Default true. """ importForeignWorklogs: Boolean jiraConnectionId: ID! """ Jira's id of the project """ jiraProjectId: String! jiraProjectKey: String! projectId: ID! """ Time booked in docket on mirrored tickets is written to Jira. Default true. """ pushWorklogs: Boolean """ The epics to mirror, for scopeKind EPICS """ scopeEpics: [JiraEpicRefInput!] """ Default PROJECT """ scopeKind: JiraScopeKind """ Default REPLACE """ ticketsMode: JiraTicketsMode } """ Autogenerated return type of LinkJiraProject. """ type LinkJiraProjectPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraProjectLink: JiraProjectLink } enum Locale { """ German """ DE """ English """ EN } """ Autogenerated input type of MarkAllNotificationsAsRead """ input MarkAllNotificationsAsReadInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The caller's own user id """ userId: ID! } """ Autogenerated return type of MarkAllNotificationsAsRead. """ type MarkAllNotificationsAsReadPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json notifications: [Notification!]! } """ Autogenerated input type of MarkInvoiceAsPaid """ input MarkInvoiceAsPaidInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ When the payment arrived; now when omitted """ paidAt: ISO8601DateTime } """ Autogenerated return type of MarkInvoiceAsPaid. """ type MarkInvoiceAsPaidPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of MarkNotificationAsRead """ input MarkNotificationAsReadInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of MarkNotificationAsRead. """ type MarkNotificationAsReadPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json notification: Notification } type Mention implements Node { createdAt: ISO8601DateTime! id: ID! mentionableId: ID! mentionableType: String! updatedAt: ISO8601DateTime! user: User! } """ Autogenerated input type of MergeJiraPlaceholderUser """ input MergeJiraPlaceholderUserInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The placeholder user, who is deleted """ id: ID! """ The real user who takes over the time and the mapping """ userId: ID! } """ Autogenerated return type of MergeJiraPlaceholderUser. """ type MergeJiraPlaceholderUserPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json user: User } type MonthlyRevenue { count: Int! month: Int! """ The year's published, unpaid invoices dated in the month """ open: Float! """ Confirmed quotations not invoiced yet, in the month the forecast puts them """ quoted: Float! total: Float! } """ Autogenerated input type of MoveBlock """ input MoveBlockInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block's place in the document, counted from 0 """ index: Int! """ Where the block goes, counted from 0 """ newIndex: Int! """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The draft quotation or invoice to change """ recordId: ID! title: String type: BlockTypeEnum } """ Autogenerated return type of MoveBlock. """ type MoveBlockPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of MoveBlockPosition """ input MoveBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int! """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int! """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!] title: String } """ Autogenerated return type of MoveBlockPosition. """ type MoveBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of MoveBoard """ input MoveBoardInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The new position, counted from 1 """ toPosition: Int! } """ Autogenerated return type of MoveBoard. """ type MoveBoardPayload { board: Board """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project } """ Autogenerated input type of MovePhase """ input MovePhaseInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The new position, counted from 1 """ toPosition: Int! } """ Autogenerated return type of MovePhase. """ type MovePhasePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json phase: Phase project: Project } """ Autogenerated input type of MoveTicketInBoard """ input MoveTicketInBoardInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ ID of the column (board) of the same project to put the ticket into """ toBoard: ID! """ The position in that column, counted from 1 """ toPosition: Int! } """ Autogenerated return type of MoveTicketInBoard. """ type MoveTicketInBoardPayload { board: Board """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project ticket: Ticket } """ Autogenerated input type of MoveTicketInPhase """ input MoveTicketInPhaseInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ ID of a phase of the same project, or `__NO__PHASE__` for no phase """ toPhase: ID! """ The position in that phase, counted from 1 """ toPosition: Int! } """ Autogenerated return type of MoveTicketInPhase. """ type MoveTicketInPhasePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json phase: Phase project: Project ticket: Ticket } """ Autogenerated input type of MoveTimetracking """ input MoveTimetrackingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The day to move the entry to """ date: ISO8601Date id: ID! } """ Autogenerated return type of MoveTimetracking. """ type MoveTimetrackingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetracking: Timetracking } type Mutation { """ Adds the plan askDocumentAssistant answered to the draft quotation or invoice and notes what was added in a comment on it. Project managers and admins. The plan is checked again and refused when it no longer fits the document. Returns the changed document under quotation or invoice, whichever it is. """ applyDocumentPlan( """ Parameters for ApplyDocumentPlan """ input: ApplyDocumentPlanInput! ): ApplyDocumentPlanPayload """ Fills an empty draft quotation or invoice with a template of its kind: content, texts and footer. Service lines are priced from the rates of the document's project. Project managers and admins. Refused when the document already has content or is not a draft, and for an invoice that belongs to a quotation or order confirmation. """ applyDocumentTemplate( """ Parameters for ApplyDocumentTemplate """ input: ApplyDocumentTemplateInput! ): ApplyDocumentTemplatePayload """ Takes what a confirmed quotation sold into its project's budget: its hours or its net total, whichever the budget counts. The figure comes from the quotation, never from the caller. Project managers and admins who may also change the project and see its budget. A quotation goes into the budget only once; a second call is refused. """ applyQuotationToProjectBudget( """ Parameters for ApplyQuotationToProjectBudget """ input: ApplyQuotationToProjectBudgetInput! ): ApplyQuotationToProjectBudgetPayload """ One turn with the AI assistant of a draft quotation or invoice: describe what the document should get, optionally with a spreadsheet of hours, and get either questions back or a plan with a priced preview. Changes nothing; applyDocumentPlan adds the plan. Project managers and admins. Every call counts against the workspace's AI quota. The conversation is not stored: send what came before in history. """ askDocumentAssistant( """ Parameters for AskDocumentAssistant """ input: AskDocumentAssistantInput! ): AskDocumentAssistantPayload """ Sets the same values, typically the status or the responsible person, on several external costs at once. Assignments are not changed here. Project managers and admins. """ bulkUpdateExternalCost( """ Parameters for BulkUpdateExternalCost """ input: BulkUpdateExternalCostInput! ): BulkUpdateExternalCostPayload """ Makes the same change to several time entries at once: every argument sent is set on each of them. The caller must be allowed to change every one of them (their own entries, on projects they can open; admins any entry), or nothing is changed. """ bulkUpdateTimetracking( """ Parameters for BulkUpdateTimetracking """ input: BulkUpdateTimetrackingInput! ): BulkUpdateTimetrackingPayload """ Cancels a published invoice. docket creates a cancellation invoice that reverses it figure for figure (a draft that gets its own number when published) and marks the invoice canceled. Project managers and admins. Refused for an invoice that is not published, for a cancellation invoice, and for one an issued final invoice has settled: cancel the final invoice first. """ cancelInvoice( """ Parameters for CancelInvoice """ input: CancelInvoiceInput! ): CancelInvoicePayload """ Marks a published or confirmed quotation as canceled, with an optional note. Project managers and admins. A draft cannot be canceled: delete it instead. Followers of the document and of its project get a mail and an inbox entry. """ cancelQuotation( """ Parameters for CancelQuotation """ input: CancelQuotationInput! ): CancelQuotationPayload """ Closes a ticket and moves it to its project's Done column. The ticket's followers are notified by mail. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ closeTicket( """ Parameters for CloseTicket """ input: CloseTicketInput! ): CloseTicketPayload """ Marks the workspace's setup wizard as finished or dismissed: it does not come back, and the caller's own product tour counts as seen too. Admins of the workspace only. Not available with an API key. """ completeAccountOnboarding( """ Parameters for CompleteAccountOnboarding """ input: CompleteAccountOnboardingInput! ): CompleteAccountOnboardingPayload """ Marks the product tour as seen for the caller, so it is not shown again. Anyone, for themselves. """ completeUserOnboarding( """ Parameters for CompleteUserOnboarding """ input: CompleteUserOnboardingInput! ): CompleteUserOnboardingPayload """ Records that the customer accepted the quotation. docket then creates the order confirmation with the quotation's content, or updates the existing one when the quotation is confirmed again. Project managers and admins. Refused without a customer address, and while the order confirmation is published (take that back to draft first). Followers of the document and of its project get a mail and an inbox entry. """ confirmQuotation( """ Parameters for ConfirmQuotation """ input: ConfirmQuotationInput! ): ConfirmQuotationPayload """ Turns the imported, read-only Jira worklogs of a mapped Jira author into docket time entries, on project links that convert worklogs. For an author who was mapped after their worklogs were imported. Admins only. Not available with an API key. """ convertJiraAuthorWorklogs( """ Parameters for ConvertJiraAuthorWorklogs """ input: ConvertJiraAuthorWorklogsInput! ): ConvertJiraAuthorWorklogsPayload """ Books a copy of a time entry: same project, ticket, service, person, description and duration, priced at the current rate. Everyone their own entries, on projects they can open; admins any entry. """ copyTimetracking( """ Parameters for CopyTimetracking """ input: CopyTimetrackingInput! ): CopyTimetrackingPayload """ Corrects a published invoice the customer already has: it is canceled with a cancellation invoice, and a copy starts as a new draft in the same billing cycle. Returns the new draft. Project managers and admins. Refused where cancelInvoice is refused. Publish the cancellation invoice and the corrected invoice afterwards; each gets its own number. """ correctInvoice( """ Parameters for CorrectInvoice """ input: CorrectInvoiceInput! ): CorrectInvoicePayload """ Gives the workspace's tax office access to the export for the bookkeeping, and nothing else: it is no member and takes no seat. The address gets a mail with a link to sign in at the workspace's portal (`accountantPortalUrl`). An address whose access was revoked gets it back. At most five at a time. Admins only. Not available with an API key. """ createAccountantAccess( """ Parameters for CreateAccountantAccess """ input: CreateAccountantAccessInput! ): CreateAccountantAccessPayload """ Makes a personal API key for the caller. The key acts as its owner, with their role. `key` in the answer is the only time the key itself can be read. Needs the caller's password; a wrong one counts as a failed sign-in attempt. Any member, once an admin has switched on API access for the workspace. Not available with an API key. """ createApiToken( """ Parameters for CreateApiToken """ input: CreateApiTokenInput! ): CreateApiTokenPayload """ Inserts a block into a draft quotation or invoice. A block is a section of the document that holds its positions: a phase, or a group of agency or external services. Project managers and admins. Returns the changed document under quotation or invoice, whichever it is. Refused unless the document is a draft. """ createBlock( """ Parameters for CreateBlock """ input: CreateBlockInput! ): CreateBlockPayload """ Adds a position, a titled group of price lines, to a block of a draft quotation or invoice. Project managers and admins. docket prices service lines from the rates of the document's project. On an invoice the new position comes ticked, so it is billed. Returns the changed document under quotation or invoice, whichever it is. Refused unless the document is a draft. """ createBlockPosition( """ Parameters for CreateBlockPosition """ input: CreateBlockPositionInput! ): CreateBlockPositionPayload """ Adds a column to a project's kanban board. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). `projectId` and `title` are required; the title is unique within the project. """ createBoard( """ Parameters for CreateBoard """ input: CreateBoardInput! ): CreateBoardPayload """ Adds a contact person and links them to customers. Admins only. """ createContact( """ Parameters for CreateContact """ input: CreateContactInput! ): CreateContactPayload """ Defines a custom field for one customer; the field is then filled in on that customer's billing documents. `name`, `fieldType` and `customerId` are required. Admins only. """ createCustomField( """ Parameters for CreateCustomField """ input: CreateCustomFieldInput! ): CreateCustomFieldPayload """ Adds a customer. Its addresses (which carry the customer number) are added with createCustomerAddress. Admins only. """ createCustomer( """ Parameters for CreateCustomer """ input: CreateCustomerInput! ): CreateCustomerPayload """ Adds an address to a customer; documents are written to an address. Unless the workspace numbers its customers itself, docket assigns the next customer number. Admins only. """ createCustomerAddress( """ Parameters for CreateCustomerAddress """ input: CreateCustomerAddressInput! ): CreateCustomerAddressPayload """ Creates a draft delivery note from an order confirmation or an invoice, in the same billing cycle and with that document's content. Project managers and admins. One of orderConfirmationId and invoiceId is needed. A cycle can have as many delivery notes as you deliver in parts. """ createDeliveryNote( """ Parameters for CreateDeliveryNote """ input: CreateDeliveryNoteInput! ): CreateDeliveryNotePayload """ Adds a comment to a delivery note, as the caller. Project managers and admins. The caller starts following the delivery note; its other followers and the people mentioned are notified. """ createDeliveryNoteComment( """ Parameters for CreateDeliveryNoteComment """ input: CreateDeliveryNoteCommentInput! ): CreateDeliveryNoteCommentPayload """ Adds a discount or a surcharge to a draft quotation or invoice: a net amount taken off or added to the total of the positions. Project managers and admins. Returns the document's whole list of discounts and surcharges. Refused unless the document is a draft. """ createDiscountSurcharge( """ Parameters for CreateDiscountSurcharge """ input: CreateDiscountSurchargeInput! ): CreateDiscountSurchargePayload """ Saves the content of a quotation or an invoice as a new template for that kind of document. Project managers and admins. The document itself is not changed. """ createDocumentTemplate( """ Parameters for CreateDocumentTemplate """ input: CreateDocumentTemplateInput! ): CreateDocumentTemplatePayload """ Enters a supplier invoice as an external cost. Needs the supplier, the invoice number (unique per supplier and VAT rate), the invoice date, the net amount and the invoice file (`blobId`); any status but DRAFT also needs at least one assignment. The responsible person (`userId`) gets an email. Project managers and admins. """ createExternalCost( """ Parameters for CreateExternalCost """ input: CreateExternalCostInput! ): CreateExternalCostPayload """ Starts a draft invoice. With orderConfirmationId or quotationId it joins that billing cycle as an advance payment, a partial invoice or the final invoice; with only projectId it is a billing cycle of its own and must be a FINAL_INVOICE. Project managers and admins. Advance payments and partial invoices cannot be mixed in one cycle. The invoice gets its number when an admin publishes it. """ createInvoice( """ Parameters for CreateInvoice """ input: CreateInvoiceInput! ): CreateInvoicePayload """ Adds a comment to an invoice, as the caller. Project managers and admins. The caller starts following the invoice; its other followers and the people mentioned are notified. """ createInvoiceComment( """ Parameters for CreateInvoiceComment """ input: CreateInvoiceCommentInput! ): CreateInvoiceCommentPayload """ Connects a Jira site to the workspace with a service account's credentials, which are checked right away (see the connection's status). Admins only. Not available with an API key. """ createJiraConnection( """ Parameters for CreateJiraConnection """ input: CreateJiraConnectionInput! ): CreateJiraConnectionPayload """ Creates the order confirmation of a quotation's billing cycle, as a draft with the quotation's content. Project managers and admins. confirmQuotation does this by itself, so you rarely need it. """ createOrderConfirmation( """ Parameters for CreateOrderConfirmation """ input: CreateOrderConfirmationInput! ): CreateOrderConfirmationPayload """ Adds a comment to an order confirmation, as the caller. Project managers and admins. The caller starts following the order confirmation; its other followers and the people mentioned are notified. """ createOrderConfirmationComment( """ Parameters for CreateOrderConfirmationComment """ input: CreateOrderConfirmationCommentInput! ): CreateOrderConfirmationCommentPayload """ Adds a phase to a project's roadmap. Project managers and admins. `projectId` and `title` are required; the title is unique within the project. """ createPhase( """ Parameters for CreatePhase """ input: CreatePhaseInput! ): CreatePhasePayload """ Creates a project for a customer. Project managers and admins. `title`, `customerId` and at least one of `supervisorIds` are required. The project starts with a Backlog and a Done board and a first general ticket, and the `project.created` webhook fires. """ createProject( """ Parameters for CreateProject """ input: CreateProjectInput! ): CreateProjectPayload """ Adds a label to a project, to tag its tickets with. Project managers and admins. `projectId`, `title` and `color` are required. """ createProjectLabel( """ Parameters for CreateProjectLabel """ input: CreateProjectLabelInput! ): CreateProjectLabelPayload """ Starts a draft quotation in a project, and with it a new billing cycle. Project managers and admins. The number is the next one in the project unless you send one, and the address starts as the customer's first. Add the content with blocks here, or with createBlock and createBlockPosition afterwards. """ createQuotation( """ Parameters for CreateQuotation """ input: CreateQuotationInput! ): CreateQuotationPayload """ Adds a comment to a quotation, as the caller. Project managers and admins. The caller starts following the quotation; its other followers and the people mentioned are notified. """ createQuotationComment( """ Parameters for CreateQuotationComment """ input: CreateQuotationCommentInput! ): CreateQuotationCommentPayload """ Starts the invoice of a retainer's month as a draft: the monthly fee as one line and, with a contingent whose overage is billed, the hours beyond it at the project's rates. The month's open time entries are held by the invoice, so they aren't billed again. Project managers and admins. Refused for a project without a retainer, a month outside its term, and a month that has an invoice. """ createRetainerInvoice( """ Parameters for CreateRetainerInvoice """ input: CreateRetainerInvoiceInput! ): CreateRetainerInvoicePayload """ Saves a list's filters under a name, as the caller's own view or one shared with everyone. Own views: anyone who can open the list (a project's lists: the project). Shared views: project managers and admins. At most 50 views per list, project and owner. """ createSavedView( """ Parameters for CreateSavedView """ input: CreateSavedViewInput! ): CreateSavedViewPayload """ Adds a service: a kind of work with a daily rate, which time is booked on and which document lines are priced with. Admins only. """ createService( """ Parameters for CreateService """ input: CreateServiceInput! ): CreateServicePayload """ Adds a category that groups services. Admins only. """ createServiceCategory( """ Parameters for CreateServiceCategory """ input: CreateServiceCategoryInput! ): CreateServiceCategoryPayload """ Creates a public link to a project's report, meant for the customer: whoever has the link opens the report without signing in. Project managers and admins. `projectId` is required. """ createSharedProjectReport( """ Parameters for CreateSharedProjectReport """ input: CreateSharedProjectReportInput! ): CreateSharedProjectReportPayload """ Creates a stopwatch for the caller, running unless `start` is false. Stopwatches are private: only their owner sees and uses them. At most 20 per person. Book one with `createTimetracking(stopwatchId: …)`. Like every stopwatch mutation, it answers with the stopwatch and the caller's full list. """ createStopwatch( """ Parameters for CreateStopwatch """ input: CreateStopwatchInput! ): CreateStopwatchPayload """ Adds a supplier, whose invoices are entered as external costs. Project managers and admins. """ createSupplier( """ Parameters for CreateSupplier """ input: CreateSupplierInput! ): CreateSupplierPayload """ Creates a ticket in a project. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). `projectId`, `title` and a description (`body`, or `text` as plain text) are required; the caller becomes the author. Assignees get a mail and follow the ticket, the project's followers are notified, and the `ticket.created` webhook fires. """ createTicket( """ Parameters for CreateTicket """ input: CreateTicketInput! ): CreateTicketPayload """ Assigns a user to a ticket. Anyone who can open the ticket's project; the assigned user must be able to open it too. The user starts following the ticket and gets a mail, unless they assign themselves. Refused for a ticket mirrored from Jira: its assignees come from Jira. """ createTicketAssignment( """ Parameters for CreateTicketAssignment """ input: CreateTicketAssignmentInput! ): CreateTicketAssignmentPayload """ Comments on a ticket. Anyone who can open the ticket's project; the caller becomes the author and starts following the ticket. The ticket's followers and anyone mentioned are notified by mail. Refused for a ticket mirrored from Jira: it is discussed in Jira. """ createTicketComment( """ Parameters for CreateTicketComment """ input: CreateTicketCommentInput! ): CreateTicketCommentPayload """ Books time on a ticket. Everyone books their own time, on projects they can open; admins may book for anyone (`userId`). `date`, `duration`, `projectId`, `ticketId` and `serviceId` are required, and the ticket must belong to the project. The entry is priced at the project's rate for the service and the `time_entry.created` webhook fires; time on a ticket mirrored from Jira is sent to Jira as a worklog when the project's Jira link does that. """ createTimetracking( """ Parameters for CreateTimetracking """ input: CreateTimetrackingInput! ): CreateTimetrackingPayload """ Adds a person to the workspace. They get an email with a link to set their own password, and the subscription's seats are updated. Admins only. Not available with an API key. """ createUser( """ Parameters for CreateUser """ input: CreateUserInput! ): CreateUserPayload """ Adds a working-hours profile for a user: the target hours per weekday from `activeFrom` on, until the user's next profile starts. A user has one profile per start date. Admins only. """ createUserWorkTime( """ Parameters for CreateUserWorkTime """ input: CreateUserWorkTimeInput! ): CreateUserWorkTimePayload """ Adds an entry to the workspace's VAT status history: from `validFrom` on the workspace is, or is no longer, a small business that charges no VAT. Refused where it would contradict what was already issued or booked. Answers with the whole account, since neighbouring entries change too. Admins only. Not available with an API key. """ createVatStatus( """ Parameters for CreateVatStatus """ input: CreateVatStatusInput! ): CreateVatStatusPayload """ Registers an address that docket sends the chosen events to. The answer carries the endpoint's `secret`, which signs every delivery. Admins only. Not available with an API key. """ createWebhookEndpoint( """ Parameters for CreateWebhookEndpoint """ input: CreateWebhookEndpointInput! ): CreateWebhookEndpointPayload """ Removes a personal API key; requests with it are refused from then on. Only the key's owner. Not available with an API key. """ deleteApiToken( """ Parameters for DeleteApiToken """ input: DeleteApiTokenInput! ): DeleteApiTokenPayload """ Removes a block and its positions from a draft quotation or invoice. Project managers and admins. On an invoice, a block that comes from the job's quotation or an earlier invoice is only marked deleted; restoreBlock brings it back. Returns the changed document under quotation or invoice, whichever it is. """ deleteBlock( """ Parameters for DeleteBlock """ input: DeleteBlockInput! ): DeleteBlockPayload """ Removes a position from a draft quotation or invoice. Project managers and admins. On an invoice, a position that comes from the job's quotation or an earlier invoice is only marked deleted; restoreBlockPosition brings it back. Returns the changed document under quotation or invoice, whichever it is. """ deleteBlockPosition( """ Parameters for DeleteBlockPosition """ input: DeleteBlockPositionInput! ): DeleteBlockPositionPayload """ Deletes a column of a project's kanban board; its open tickets go to Backlog, its closed ones to Done. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). The Backlog and Done columns themselves can't be deleted. """ deleteBoard( """ Parameters for DeleteBoard """ input: DeleteBoardInput! ): DeleteBoardPayload """ Deletes a contact person; quotations and invoices that named them keep existing without a contact. Admins only. """ deleteContact( """ Parameters for DeleteContact """ input: DeleteContactInput! ): DeleteContactPayload """ Deletes a customer's custom field together with the values documents hold for it. To keep them, set `archived` with updateCustomField instead. Admins only. """ deleteCustomField( """ Parameters for DeleteCustomField """ input: DeleteCustomFieldInput! ): DeleteCustomFieldPayload """ Deletes a customer together with its addresses, custom fields and projects. To keep the history, set `archived` with updateCustomer instead. Admins only. """ deleteCustomer( """ Parameters for DeleteCustomer """ input: DeleteCustomerInput! ): DeleteCustomerPayload """ Removes an address of a customer. Refused for an address that documents were written to. Admins only. """ deleteCustomerAddress( """ Parameters for DeleteCustomerAddress """ input: DeleteCustomerAddressInput! ): DeleteCustomerAddressPayload """ Deletes a delivery note. Admins only. """ deleteDeliveryNote( """ Parameters for DeleteDeliveryNote """ input: DeleteDeliveryNoteInput! ): DeleteDeliveryNotePayload """ Deletes a comment on a delivery note. Only its author, as long as they are a project manager or admin. """ deleteDeliveryNoteComment( """ Parameters for DeleteDeliveryNoteComment """ input: DeleteDeliveryNoteCommentInput! ): DeleteDeliveryNoteCommentPayload """ Removes a discount or surcharge from a draft quotation or invoice. Project managers and admins. Refused unless the document is a draft. """ deleteDiscountSurcharge( """ Parameters for DeleteDiscountSurcharge """ input: DeleteDiscountSurchargeInput! ): DeleteDiscountSurchargePayload """ Deletes a template. Project managers and admins. Documents started from it keep their content. """ deleteDocumentTemplate( """ Parameters for DeleteDocumentTemplate """ input: DeleteDocumentTemplateInput! ): DeleteDocumentTemplatePayload """ Deletes an external cost together with its assignments to projects and quotations. Project managers and admins. """ deleteExternalCost( """ Parameters for DeleteExternalCost """ input: DeleteExternalCostInput! ): DeleteExternalCostPayload """ Deletes a draft invoice. Project managers and admins. An invoice that was published stays (cancel it instead), and so does one reopened for correction, which keeps its number. Time entries the draft held are free to be billed again. """ deleteInvoice( """ Parameters for DeleteInvoice """ input: DeleteInvoiceInput! ): DeleteInvoicePayload """ Deletes a comment on an invoice. Only its author, as long as they are a project manager or admin. """ deleteInvoiceComment( """ Parameters for DeleteInvoiceComment """ input: DeleteInvoiceCommentInput! ): DeleteInvoiceCommentPayload """ Removes a Jira site connection and unlinks every project linked through it: mirrored tickets with booked or imported time stay, empty ones are deleted. Admins only. Not available with an API key. """ deleteJiraConnection( """ Parameters for DeleteJiraConnection """ input: DeleteJiraConnectionInput! ): DeleteJiraConnectionPayload """ Removes the caller's own Jira credential. Only its owner, not even admins. Not available with an API key. """ deleteJiraUserCredential( """ Parameters for DeleteJiraUserCredential """ input: DeleteJiraUserCredentialInput! ): DeleteJiraUserCredentialPayload """ Removes the mapping between a docket user and their Jira account on a connection. Admins only. Not available with an API key. """ deleteJiraUserMapping( """ Parameters for DeleteJiraUserMapping """ input: DeleteJiraUserMappingInput! ): DeleteJiraUserMappingPayload """ Deletes an order confirmation. Admins only. """ deleteOrderConfirmation( """ Parameters for DeleteOrderConfirmation """ input: DeleteOrderConfirmationInput! ): DeleteOrderConfirmationPayload """ Deletes a comment on an order confirmation. Only its author, as long as they are a project manager or admin. """ deleteOrderConfirmationComment( """ Parameters for DeleteOrderConfirmationComment """ input: DeleteOrderConfirmationCommentInput! ): DeleteOrderConfirmationCommentPayload """ Deletes a phase. Its tickets stay in the project, without a phase. Project managers and admins. """ deletePhase( """ Parameters for DeletePhase """ input: DeletePhaseInput! ): DeletePhasePayload """ Deletes a project with everything in it: its tickets, time entries, boards, phases and billing documents. Admins only. Fails while external costs are assigned to the project. """ deleteProject( """ Parameters for DeleteProject """ input: DeleteProjectInput! ): DeleteProjectPayload """ Deletes a label and takes it off every ticket that carries it. Project managers and admins. """ deleteProjectLabel( """ Parameters for DeleteProjectLabel """ input: DeleteProjectLabelInput! ): DeleteProjectLabelPayload """ Deletes a draft or a canceled quotation; a published or confirmed one stays. Project managers and admins. A quotation with external costs on it is refused unless you say where they go: moveExternalCostsToId or unassignExternalCosts. """ deleteQuotation( """ Parameters for DeleteQuotation """ input: DeleteQuotationInput! ): DeleteQuotationPayload """ Deletes a comment on a quotation. Only its author, as long as they are a project manager or admin. """ deleteQuotationComment( """ Parameters for DeleteQuotationComment """ input: DeleteQuotationCommentInput! ): DeleteQuotationCommentPayload """ Deletes a saved view. Own views: their owner. Shared views: project managers and admins. """ deleteSavedView( """ Parameters for DeleteSavedView """ input: DeleteSavedViewInput! ): DeleteSavedViewPayload """ Deletes a service. Fails for a service that time was booked on; set `archived` with updateService instead. Admins only. """ deleteService( """ Parameters for DeleteService """ input: DeleteServiceInput! ): DeleteServicePayload """ Deletes a service category. Fails while services or tickets still use it. Admins only. """ deleteServiceCategory( """ Parameters for DeleteServiceCategory """ input: DeleteServiceCategoryInput! ): DeleteServiceCategoryPayload """ Deletes a public report link: it stops working at once. Project managers and admins. """ deleteSharedProjectReport( """ Parameters for DeleteSharedProjectReport """ input: DeleteSharedProjectReportInput! ): DeleteSharedProjectReportPayload """ Discards a stopwatch without booking its time. Only the stopwatch's owner. """ deleteStopwatch( """ Parameters for DeleteStopwatch """ input: DeleteStopwatchInput! ): DeleteStopwatchPayload """ Deletes a supplier. Fails while external costs of this supplier exist; set `archived` with updateSupplier instead. Admins only. """ deleteSupplier( """ Parameters for DeleteSupplier """ input: DeleteSupplierInput! ): DeleteSupplierPayload """ Deletes a ticket together with its comments and the time booked on it. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ deleteTicket( """ Parameters for DeleteTicket """ input: DeleteTicketInput! ): DeleteTicketPayload """ Deletes a ticket comment. Only its author, while they can still open the ticket's project. """ deleteTicketComment( """ Parameters for DeleteTicketComment """ input: DeleteTicketCommentInput! ): DeleteTicketCommentPayload """ Deletes a time entry. Everyone their own entries; admins any entry. A worklog that was sent to Jira for it is deleted there too. """ deleteTimetracking( """ Parameters for DeleteTimetracking """ input: DeleteTimetrackingInput! ): DeleteTimetrackingPayload """ Deletes a user together with their time entries, comments and assignments. Admins only, and never themselves. A user who wrote quotations, order confirmations, delivery notes or invoices can't be deleted; archive them instead (`archived` on updateUser). Not available with an API key. """ deleteUser( """ Parameters for DeleteUser """ input: DeleteUserInput! ): DeleteUserPayload """ Removes a working-hours profile of a user. Admins only. """ deleteUserWorkTime( """ Parameters for DeleteUserWorkTime """ input: DeleteUserWorkTimeInput! ): DeleteUserWorkTimePayload """ Removes an entry of the workspace's VAT status history. Refused for the only entry and for one with documents or external costs under it. Answers with the whole account, since neighbouring entries change too. Admins only. Not available with an API key. """ deleteVatStatus( """ Parameters for DeleteVatStatus """ input: DeleteVatStatusInput! ): DeleteVatStatusPayload """ Removes a webhook endpoint; nothing is sent to it any more. Admins only. Not available with an API key. """ deleteWebhookEndpoint( """ Parameters for DeleteWebhookEndpoint """ input: DeleteWebhookEndpointInput! ): DeleteWebhookEndpointPayload """ Removes one AI app's access to docket for the caller: the app's tokens stop working at once. Anyone, for their own connections. Not available with an API key. """ disconnectAiConnection( """ Parameters for DisconnectAiConnection """ input: DisconnectAiConnectionInput! ): DisconnectAiConnectionPayload """ Takes a published delivery note back to draft. Project managers and admins. Followers of the document and of its project get a mail and an inbox entry. """ draftDeliveryNote( """ Parameters for DraftDeliveryNote """ input: DraftDeliveryNoteInput! ): DraftDeliveryNotePayload """ Takes an invoice that has no number yet back to draft. This only applies to invoices in the former approved status. Project managers and admins. For a published invoice use reopenInvoiceForCorrection or correctInvoice. """ draftInvoice( """ Parameters for DraftInvoice """ input: DraftInvoiceInput! ): DraftInvoicePayload """ Takes a published order confirmation back to draft. Project managers and admins. Followers of the document and of its project get a mail and an inbox entry. """ draftOrderConfirmation( """ Parameters for DraftOrderConfirmation """ input: DraftOrderConfirmationInput! ): DraftOrderConfirmationPayload """ Takes a published, confirmed or canceled quotation back to draft, so its content can be changed again. Project managers and admins. Its date is set to today. Followers of the document and of its project get a mail and an inbox entry. """ draftQuotation( """ Parameters for DraftQuotation """ input: DraftQuotationInput! ): DraftQuotationPayload """ Copies a phase with all its positions and inserts the copy at newIndex. Project managers and admins. Only blocks of type phase are copied; for any other block, or an index out of range, the document comes back unchanged. Refused unless the document is a draft. """ duplicateBlock( """ Parameters for DuplicateBlock """ input: DuplicateBlockInput! ): DuplicateBlockPayload """ Copies a position with its lines and inserts the copy at newPositionIndex of the same block. Project managers and admins. With an index out of range the document comes back unchanged. Refused unless the document is a draft. """ duplicateBlockPosition( """ Parameters for DuplicateBlockPosition """ input: DuplicateBlockPositionInput! ): DuplicateBlockPositionPayload """ Copies an invoice's name, description, content and discounts and surcharges into a new draft invoice in the given project. Project managers and admins. The copy is a billing cycle of its own and therefore always a final invoice, whatever the original was. """ duplicateInvoice( """ Parameters for DuplicateInvoice """ input: DuplicateInvoiceInput! ): DuplicateInvoicePayload """ Copies a quotation into a new draft quotation in the given project, as a billing cycle of its own: name, description, content, discounts and surcharges, internal contacts and language. Project managers and admins. The address is kept only when the project belongs to the same customer; otherwise the copy starts at that customer's first address. """ duplicateQuotation( """ Parameters for DuplicateQuotation """ input: DuplicateQuotationInput! ): DuplicateQuotationPayload """ Links a docket project to a Jira project and starts the first import of its issues, which become mirrored tickets, in the background. Project managers and admins. Not available with an API key. """ linkJiraProject( """ Parameters for LinkJiraProject """ input: LinkJiraProjectInput! ): LinkJiraProjectPayload """ Marks all of the caller's unread notifications as read and answers with the ones it changed. Anyone, for their own notifications. """ markAllNotificationsAsRead( """ Parameters for MarkAllNotificationsAsRead """ input: MarkAllNotificationsAsReadInput! ): MarkAllNotificationsAsReadPayload """ Marks a published invoice as paid. Project managers and admins. Only reverseInvoicePayment takes this back. Followers of the document and of its project get a mail and an inbox entry. """ markInvoiceAsPaid( """ Parameters for MarkInvoiceAsPaid """ input: MarkInvoiceAsPaidInput! ): MarkInvoiceAsPaidPayload """ Marks one notification as read. Only the person it was sent to. """ markNotificationAsRead( """ Parameters for MarkNotificationAsRead """ input: MarkNotificationAsReadInput! ): MarkNotificationAsReadPayload """ Merges a Jira placeholder user (who stands in for a Jira author without a docket account) into a real user: time entries, ticket assignments and the Jira mapping move over, and the placeholder is deleted. Refused where the real user already has a Jira mapping of their own on the same site. Admins only. Not available with an API key. """ mergeJiraPlaceholderUser( """ Parameters for MergeJiraPlaceholderUser """ input: MergeJiraPlaceholderUserInput! ): MergeJiraPlaceholderUserPayload """ Moves a block to another place in a draft quotation or invoice. Project managers and admins. With an index out of range the document comes back unchanged. Refused unless the document is a draft. """ moveBlock( """ Parameters for MoveBlock """ input: MoveBlockInput! ): MoveBlockPayload """ Moves a position within its block or into another block of the same document. Project managers and admins. With an index out of range the document comes back unchanged. Refused unless the document is a draft. """ moveBlockPosition( """ Parameters for MoveBlockPosition """ input: MoveBlockPositionInput! ): MoveBlockPositionPayload """ Moves a column to another place on its project's kanban board. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). """ moveBoard( """ Parameters for MoveBoard """ input: MoveBoardInput! ): MoveBoardPayload """ Moves a phase to another place in the order of its project's phases. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). """ movePhase( """ Parameters for MovePhase """ input: MovePhaseInput! ): MovePhasePayload """ Puts a ticket into a column of its project's kanban board, at a position. A column with another ticket status closes or reopens the ticket, and its followers are notified by mail. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ moveTicketInBoard( """ Parameters for MoveTicketInBoard """ input: MoveTicketInBoardInput! ): MoveTicketInBoardPayload """ Puts a ticket into a phase of its project (or takes it out of its phase), at a position within the phase. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ moveTicketInPhase( """ Parameters for MoveTicketInPhase """ input: MoveTicketInPhaseInput! ): MoveTicketInPhasePayload """ Moves a time entry to another day. Everyone their own entries, on projects they can open; admins any entry. """ moveTimetracking( """ Parameters for MoveTimetracking """ input: MoveTimetrackingInput! ): MoveTimetrackingPayload """ Reopens a closed ticket and moves it to its project's Backlog column. The ticket's followers are notified by mail. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ openTicket( """ Parameters for OpenTicket """ input: OpenTicketInput! ): OpenTicketPayload """ Pauses a running stopwatch; the time counted so far stays. Only the stopwatch's owner. """ pauseStopwatch( """ Parameters for PauseStopwatch """ input: PauseStopwatchInput! ): PauseStopwatchPayload """ Publishes a delivery note. Project managers and admins. docket sends nothing to the customer; send the PDF yourself. Followers of the document and of its project get a mail and an inbox entry. """ publishDeliveryNote( """ Parameters for PublishDeliveryNote """ input: PublishDeliveryNoteInput! ): PublishDeliveryNotePayload """ Publishes a draft invoice and makes it final: it gets its number (the next in the workspace's sequence, unless it has one), its due date from the payment term, and its figures and PDF are fixed. Admins only. Refused when it bills nothing, has no customer address, lacks tax details the invoice must carry, or when an issued final invoice of its billing cycle has settled it. Followers of the document and of its project get a mail and an inbox entry. """ publishInvoice( """ Parameters for PublishInvoice """ input: PublishInvoiceInput! ): PublishInvoicePayload """ Publishes an order confirmation. Project managers and admins. While it is published its quotation cannot be confirmed again, as that would change it. docket sends nothing to the customer; send the PDF yourself. Followers of the document and of its project get a mail and an inbox entry. """ publishOrderConfirmation( """ Parameters for PublishOrderConfirmation """ input: PublishOrderConfirmationInput! ): PublishOrderConfirmationPayload """ Publishes a quotation: its content is locked until it is taken back to draft. Project managers and admins. Refused without a customer address. docket sends nothing to the customer; send the PDF yourself. Followers of the document and of its project get a mail and an inbox entry. """ publishQuotation( """ Parameters for PublishQuotation """ input: PublishQuotationInput! ): PublishQuotationPayload """ Deletes, in the background, every worklog docket wrote to Jira for this project and clears their sync state. The time entries in docket stay. Admins only. Not available with an API key. """ purgeJiraProjectWorklogs( """ Parameters for PurgeJiraProjectWorklogs """ input: PurgeJiraProjectWorklogsInput! ): PurgeJiraProjectWorklogsPayload """ Reads an uploaded supplier invoice and returns what it found, to fill in an external cost; nothing is saved. An e-invoice (ZUGFeRD, Factur-X, XRechnung) is read directly; any other file only with AI, where the workspace switched that on, and such a reading counts against the workspace's monthly AI quota. Project managers and admins. """ readExternalCostReceipt( """ Parameters for ReadExternalCostReceipt """ input: ReadExternalCostReceiptInput! ): ReadExternalCostReceiptPayload """ Removes one style of the workspace's own PDF font. Without the regular style the documents go back to the built-in font (Inter). Admins of the workspace only. Not available with an API key. """ removeDocumentFont( """ Parameters for RemoveDocumentFont """ input: RemoveDocumentFontInput! ): RemoveDocumentFontPayload """ Takes a published invoice that has not reached the customer back to draft. It keeps its number; the reason and the PDF as it was are kept with it. Fix it and publish it again. Admins only. Refused for a cancellation invoice and for an invoice an issued final invoice has settled. If the customer already has the invoice, use correctInvoice. """ reopenInvoiceForCorrection( """ Parameters for ReopenInvoiceForCorrection """ input: ReopenInvoiceForCorrectionInput! ): ReopenInvoiceForCorrectionPayload """ Starts a full export of the caller's workspace (a ZIP with its data, issued PDFs and files) or returns the one already being built. An email follows when it is ready. Admins of the workspace only. Not available with an API key. """ requestWorkspaceExport( """ Parameters for RequestWorkspaceExport """ input: RequestWorkspaceExportInput! ): RequestWorkspaceExportPayload """ Mails the tax office its invitation again, with a new sign-in link valid for seven days; a link sent before stops working. Not for a revoked access. Admins only. Not available with an API key. """ resendAccountantAccessInvitation( """ Parameters for ResendAccountantAccessInvitation """ input: ResendAccountantAccessInvitationInput! ): ResendAccountantAccessInvitationPayload """ Turns off another member's two-factor authentication, for someone who lost their device and backup codes. If the workspace requires it, they set it up again at their next sign-in. Admins only, and never for themselves. Not available with an API key. """ resetUserTwoFactor( """ Parameters for ResetUserTwoFactor """ input: ResetUserTwoFactorInput! ): ResetUserTwoFactorPayload """ Brings back a block that deleteBlock marked as deleted on a draft invoice. Project managers and admins. Returns the changed document under quotation or invoice, whichever it is. """ restoreBlock( """ Parameters for RestoreBlock """ input: RestoreBlockInput! ): RestoreBlockPayload """ Brings back a position that deleteBlockPosition marked as deleted on a draft invoice. Project managers and admins. Returns the changed document under quotation or invoice, whichever it is. """ restoreBlockPosition( """ Parameters for RestoreBlockPosition """ input: RestoreBlockPositionInput! ): RestoreBlockPositionPayload """ Writes all time entries of this project that are not in Jira yet to Jira, in the background: a catch-up after switching on `pushWorklogs` or after failures. Project managers and admins. Not available with an API key. """ resyncJiraProjectWorklogs( """ Parameters for ResyncJiraProjectWorklogs """ input: ResyncJiraProjectWorklogsInput! ): ResyncJiraProjectWorklogsPayload """ Queues a time entry once more for writing to Jira, after a push failed or was not possible (for example before the person connected their Jira account). The entry's owner; admins for any entry. Not available with an API key. """ retryJiraWorklogPush( """ Parameters for RetryJiraWorklogPush """ input: RetryJiraWorklogPushInput! ): RetryJiraWorklogPushPayload """ Takes back the payment of a paid invoice, marked by mistake or returned by the bank: the invoice is published and unpaid again. Admins only. Its number, PDF and figures stay as they went out, and nobody is notified. """ reverseInvoicePayment( """ Parameters for ReverseInvoicePayment """ input: ReverseInvoicePaymentInput! ): ReverseInvoicePaymentPayload """ Takes the tax office's access away: it is signed out of the portal at once and its links stop working. The entry stays in the list, so earlier exports keep their name; `createAccountantAccess` with the same address gives the access back. Admins only. Not available with an API key. """ revokeAccountantAccess( """ Parameters for RevokeAccountantAccess """ input: RevokeAccountantAccessInput! ): RevokeAccountantAccessPayload """ Ticks or unticks a position. A partial or final invoice bills only its ticked positions. Project managers and admins. Returns the changed document under quotation or invoice, whichever it is. Refused unless the document is a draft. """ selectBlockPosition( """ Parameters for SelectBlockPosition """ input: SelectBlockPositionInput! ): SelectBlockPositionPayload """ Follows or unfollows a ticket, a project or a billing document (quotation, order confirmation, delivery note, invoice) for the caller. Followers are notified of what happens there. Anyone who can open the record; it only ever changes the caller's own notifications. """ setFollow( """ Parameters for SetFollow """ input: SetFollowInput! ): SetFollowPayload """ Signs every member of the caller's workspace out on every device, the macOS app included, and removes all personal API keys and AI connections. The caller stays signed in where they made the request. Admins of the workspace only. Not available with an API key. """ signOutEveryone( """ Parameters for SignOutEveryone """ input: SignOutEveryoneInput! ): SignOutEveryonePayload """ Starts a stopwatch or resumes a paused one; does nothing to one that is running. Only the stopwatch's owner. """ startStopwatch( """ Parameters for StartStopwatch """ input: StartStopwatchInput! ): StartStopwatchPayload """ Turns a note in free text ("2h checkout bug, 30 min call") into suggested time entries, read by AI; a note that asks what is not booked yet gets the tickets the caller worked in without booking time. Books nothing: book what fits with `createTimetracking`. Anyone; only tickets the caller can open are suggested. Only in a workspace whose admin switched AI for time entries on; each call counts against the monthly AI quota unless the workspace uses its own key. """ suggestTimeEntries( """ Parameters for SuggestTimeEntries """ input: SuggestTimeEntriesInput! ): SuggestTimeEntriesPayload """ Suggests a description for a time entry, written by AI from what the caller did in the ticket that day (their comments and changes). Saves nothing. Anyone who can open the ticket's project. Only in a workspace whose admin switched AI for time entries on; each call counts against the monthly AI quota unless the workspace uses its own key. """ suggestTimeEntryDescription( """ Parameters for SuggestTimeEntryDescription """ input: SuggestTimeEntryDescriptionInput! ): SuggestTimeEntryDescriptionPayload """ Fetches the whole Jira project again in the background: the issues and, where the link imports them, the time logged on them. Project managers and admins. Not available with an API key. """ syncJiraProjectIssues( """ Parameters for SyncJiraProjectIssues """ input: SyncJiraProjectIssuesInput! ): SyncJiraProjectIssuesPayload """ Checks the connection's service credentials against Jira and updates the connection's status. `ok` says whether Jira accepted them; if not, `errors` carries Jira's answer. Admins only. Not available with an API key. """ testJiraConnection( """ Parameters for TestJiraConnection """ input: TestJiraConnectionInput! ): TestJiraConnectionPayload """ Sends a `ping` event to the endpoint, to see whether it arrives and what the receiver gets. The delivery is queued, not sent before the answer. Admins only. Not available with an API key. """ testWebhookEndpoint( """ Parameters for TestWebhookEndpoint """ input: TestWebhookEndpointInput! ): TestWebhookEndpointPayload """ Adds the caller's reaction with an emoji to a comment, or takes it back when it is already there. Anyone who can see what the comment is on: a ticket's project or the billing document; comments on tickets mirrored from Jira included. The comment's author gets a notification that arrives as read, without a mail. """ toggleCommentReaction( """ Parameters for ToggleCommentReaction """ input: ToggleCommentReactionInput! ): ToggleCommentReactionPayload """ Ticks or unticks one checklist item in a ticket comment. Anyone who can open the ticket's project, not only the comment's author. """ toggleTicketCommentTodo( """ Parameters for ToggleTicketCommentTodo """ input: ToggleTicketCommentTodoInput! ): ToggleTicketCommentTodoPayload """ Pins a ticket, or unpins a pinned one. Pinned (sticky) tickets are marked with a pin in the lists. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ toggleTicketSticky( """ Parameters for ToggleTicketSticky """ input: ToggleTicketStickyInput! ): ToggleTicketStickyPayload """ Ticks or unticks one checklist item in a ticket's description. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. """ toggleTicketTodo( """ Parameters for ToggleTicketTodo """ input: ToggleTicketTodoInput! ): ToggleTicketTodoPayload """ Ends a project's link to Jira. Mirrored tickets with booked or imported time stay, empty ones are deleted. Admins only. Not available with an API key. """ unlinkJiraProject( """ Parameters for UnlinkJiraProject """ input: UnlinkJiraProjectInput! ): UnlinkJiraProjectPayload """ Changes the workspace's settings: company details and letterhead, invoicing (VAT rates, numbering, payment term, document texts), security, AI features, API access and the DATEV export. Only the arguments sent are changed. Admins of the workspace only. Not available with an API key. """ updateAccount( """ Parameters for UpdateAccount """ input: UpdateAccountInput! ): UpdateAccountPayload """ Changes a block's type, title, texts or optional flag; only the arguments you send change. Project managers and admins. Setting optional applies it to all of the block's positions and lines. Returns the changed document under quotation or invoice, whichever it is. Refused unless the document is a draft. """ updateBlock( """ Parameters for UpdateBlock """ input: UpdateBlockInput! ): UpdateBlockPayload """ Changes a position's title, texts, optional flag and lines. Project managers and admins. Always send the whole list of subpositions: it replaces the position's lines. Returns the changed document under quotation or invoice, whichever it is. Refused unless the document is a draft. """ updateBlockPosition( """ Parameters for UpdateBlockPosition """ input: UpdateBlockPositionInput! ): UpdateBlockPositionPayload """ Changes a column of a project's kanban board. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). The column stays in its project: `projectId` is ignored. """ updateBoard( """ Parameters for UpdateBoard """ input: UpdateBoardInput! ): UpdateBoardPayload """ Changes a contact person. Only the arguments sent are changed. Admins only. """ updateContact( """ Parameters for UpdateContact """ input: UpdateContactInput! ): UpdateContactPayload """ Changes a customer's custom field. Only the arguments sent are changed. Admins only. """ updateCustomField( """ Parameters for UpdateCustomField """ input: UpdateCustomFieldInput! ): UpdateCustomFieldPayload """ Changes a customer's master data, its own daily rates and its accounting defaults. Only the arguments sent are changed. Admins only. """ updateCustomer( """ Parameters for UpdateCustomer """ input: UpdateCustomerInput! ): UpdateCustomerPayload """ Changes an address of a customer. Only the arguments sent are changed. Admins only. """ updateCustomerAddress( """ Parameters for UpdateCustomerAddress """ input: UpdateCustomerAddressInput! ): UpdateCustomerAddressPayload """ Changes a delivery note's header: name, date, texts, address, contacts, custom fields. Only the arguments you send change. Project managers and admins. The status has its own mutations. """ updateDeliveryNote( """ Parameters for UpdateDeliveryNote """ input: UpdateDeliveryNoteInput! ): UpdateDeliveryNotePayload """ Changes the text of a comment on a delivery note. Only its author, as long as they are a project manager or admin. The note docket writes when the AI assistant added positions cannot be changed. """ updateDeliveryNoteComment( """ Parameters for UpdateDeliveryNoteComment """ input: UpdateDeliveryNoteCommentInput! ): UpdateDeliveryNoteCommentPayload """ Changes a discount or surcharge of a draft quotation or invoice; only the arguments you send change. Project managers and admins. Refused unless the document is a draft. """ updateDiscountSurcharge( """ Parameters for UpdateDiscountSurcharge """ input: UpdateDiscountSurchargeInput! ): UpdateDiscountSurchargePayload """ Renames a template, changes its note or its customer and, with documentId, replaces its content with that document's. Project managers and admins. The document must be of the template's kind. """ updateDocumentTemplate( """ Parameters for UpdateDocumentTemplate """ input: UpdateDocumentTemplateInput! ): UpdateDocumentTemplatePayload """ Changes an external cost. Only the arguments sent are changed, but `assignmentsAttributes` replaces all assignments and `blobId` replaces the invoice file. A new responsible person (`userId`) gets an email. Project managers and admins. """ updateExternalCost( """ Parameters for UpdateExternalCost """ input: UpdateExternalCostInput! ): UpdateExternalCostPayload """ Changes an invoice. Only the arguments you send change; blocks, discountSurcharge and the contact lists each replace the whole list. Project managers and admins. Content can only be changed in a draft. Sending status PUBLISHED publishes it as publishInvoice does (admins only); every other status change has its own mutation. """ updateInvoice( """ Parameters for UpdateInvoice """ input: UpdateInvoiceInput! ): UpdateInvoicePayload """ Changes the text of a comment on an invoice. Only its author, as long as they are a project manager or admin. The note docket writes when the AI assistant added positions cannot be changed. """ updateInvoiceComment( """ Parameters for UpdateInvoiceComment """ input: UpdateInvoiceCommentInput! ): UpdateInvoiceCommentPayload """ Changes a Jira site connection. The credentials are checked again afterwards, unless `status` is sent: that is taken as it is (DISABLED pauses the connection). Admins only. Not available with an API key. """ updateJiraConnection( """ Parameters for UpdateJiraConnection """ input: UpdateJiraConnectionInput! ): UpdateJiraConnectionPayload """ Changes the settings of a project's link to Jira. A changed scope starts a new import of the issues in the background. Project managers and admins. Not available with an API key. """ updateJiraProjectLink( """ Parameters for UpdateJiraProjectLink """ input: UpdateJiraProjectLinkInput! ): UpdateJiraProjectLinkPayload """ Sets the read and the archived state of all of the caller's notifications about the given records: the inbox shows one entry per record and event. Both states are always set. Only ever the caller's own notifications. """ updateNotificationsByRecords( """ Parameters for UpdateNotificationByRecords """ input: UpdateNotificationByRecordsInput! ): UpdateNotificationByRecordsPayload """ Changes an order confirmation's header: name, date, texts, address, contacts, custom fields. Only the arguments you send change. Project managers and admins. Its positions are the quotation's: change the quotation and confirm it again. The status has its own mutations. """ updateOrderConfirmation( """ Parameters for UpdateOrderConfirmation """ input: UpdateOrderConfirmationInput! ): UpdateOrderConfirmationPayload """ Changes the text of a comment on an order confirmation. Only its author, as long as they are a project manager or admin. The note docket writes when the AI assistant added positions cannot be changed. """ updateOrderConfirmationComment( """ Parameters for UpdateOrderConfirmationComment """ input: UpdateOrderConfirmationCommentInput! ): UpdateOrderConfirmationCommentPayload """ Changes a phase's title, description or dates. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). The phase stays in its project: `projectId` is ignored. """ updatePhase( """ Parameters for UpdatePhase """ input: UpdatePhaseInput! ): UpdatePhasePayload """ Sets the caller's pinned pages. Always send the whole list: it replaces the current one. Anyone, for themselves. """ updatePinnedPages( """ Parameters for UpdatePinnedPages """ input: UpdatePinnedPagesInput! ): UpdatePinnedPagesPayload """ Changes a user's profile. Everyone may change their own, admins everyone's; role, `archived` and the project and customer assignments are for admins (role and `archived` never on themselves). Changing one's own email or password needs `currentPassword`. Not available with an API key. """ updateProfile( """ Parameters for UpdateUser """ input: UpdateUserInput! ): UpdateUserPayload """ Changes a project; only the arguments sent are changed. Project managers and admins. Time already booked keeps its rates unless `updateTimetrackings` is true. """ updateProject( """ Parameters for UpdateProject """ input: UpdateProjectInput! ): UpdateProjectPayload """ Changes a label's title, description or colour. Project managers and admins. The label stays in its project: `projectId` is ignored. """ updateProjectLabel( """ Parameters for UpdateProjectLabel """ input: UpdateProjectLabelInput! ): UpdateProjectLabelPayload """ Changes a quotation. Only the arguments you send change; blocks, discountSurcharge and the contact lists each replace the whole list. Project managers and admins. Content (blocks, discountSurcharge) can only be changed in a draft, and the status only through its own mutations (publishQuotation, confirmQuotation, cancelQuotation, draftQuotation). """ updateQuotation( """ Parameters for UpdateQuotation """ input: UpdateQuotationInput! ): UpdateQuotationPayload """ Changes the text of a comment on a quotation. Only its author, as long as they are a project manager or admin. The note docket writes when the AI assistant added positions cannot be changed. """ updateQuotationComment( """ Parameters for UpdateQuotationComment """ input: UpdateQuotationCommentInput! ): UpdateQuotationCommentPayload """ Changes a service. Send `updateTimetrackings: true` to reprice the time already booked on it with the new rate. Admins only. """ updateService( """ Parameters for UpdateService """ input: UpdateServiceInput! ): UpdateServicePayload """ Renames a service category. Admins only. """ updateServiceCategory( """ Parameters for UpdateServiceCategory """ input: UpdateServiceCategoryInput! ): UpdateServiceCategoryPayload """ Changes what a public report link shows or when it ends; the link itself stays the same. Project managers and admins. """ updateSharedProjectReport( """ Parameters for UpdateSharedProjectReport """ input: UpdateSharedProjectReportInput! ): UpdateSharedProjectReportPayload """ Renames a stopwatch, attaches it to a ticket or detaches it, or sets its clock by hand. Only the stopwatch's owner. """ updateStopwatch( """ Parameters for UpdateStopwatch """ input: UpdateStopwatchInput! ): UpdateStopwatchPayload """ Changes a supplier. Only the arguments sent are changed. Admins only. """ updateSupplier( """ Parameters for UpdateSupplier """ input: UpdateSupplierInput! ): UpdateSupplierPayload """ Changes a ticket; only the arguments sent are changed. Anyone who can open the project (timetrackers: only the projects and customers they are assigned to). Refused for a ticket mirrored from Jira: those are changed in Jira. A change of status notifies the ticket's followers by mail, a new assignee gets a mail. `projectId` moves the ticket into another project the caller can open; it then loses its phase and lands in that project's Backlog or Done. """ updateTicket( """ Parameters for UpdateTicket """ input: UpdateTicketInput! ): UpdateTicketPayload """ Changes the text of a ticket comment. Only its author, while they can still open the ticket's project. Only `body` is used. """ updateTicketComment( """ Parameters for UpdateTicketComment """ input: UpdateTicketCommentInput! ): UpdateTicketCommentPayload """ Changes a time entry; only the arguments sent are changed. Everyone their own entries, on projects they can open; admins any entry. The entry keeps the rate it was booked at unless its project or service changes. """ updateTimetracking( """ Parameters for UpdateTimetracking """ input: UpdateTimetrackingInput! ): UpdateTimetrackingPayload """ Changes a user's profile. Everyone may change their own, admins everyone's; role, `archived` and the project and customer assignments are for admins (role and `archived` never on themselves). Changing one's own email or password needs `currentPassword`. Not available with an API key. """ updateUser( """ Parameters for UpdateUser """ input: UpdateUserInput! ): UpdateUserPayload """ Changes a working-hours profile of a user. Admins only. """ updateUserWorkTime( """ Parameters for UpdateUserWorkTime """ input: UpdateUserWorkTimeInput! ): UpdateUserWorkTimePayload """ Changes a webhook endpoint's address, its events or whether it is on. Switching it on again resets its count of failed deliveries, after which docket had switched it off. Admins only. Not available with an API key. """ updateWebhookEndpoint( """ Parameters for UpdateWebhookEndpoint """ input: UpdateWebhookEndpointInput! ): UpdateWebhookEndpointPayload """ Attaches the customer's signed confirmation to a quotation, replacing an earlier one. Project managers and admins. The file must be a PDF of at most 2 MB. """ uploadConfirmationFileToQuotation( """ Parameters for UploadConfirmationFileToQuotation """ input: UploadConfirmationFileToQuotationInput! ): UploadConfirmationFileToQuotationPayload """ Uploads one style of the workspace's own font for its PDF documents; `accountingFont` can be set to Custom once the regular style is there. Refused unless `licenseConfirmed` is true, and for a file that is too big or not a usable font. Admins of the workspace only. Not available with an API key. """ uploadDocumentFont( """ Parameters for UploadDocumentFont """ input: UploadDocumentFontInput! ): UploadDocumentFontPayload """ Saves or replaces the caller's own Atlassian API token, with which their time is written to Jira in their name, and checks it at once: `checks` says per Jira connection whether it works. Anyone, for themselves. Not available with an API key. """ upsertJiraUserCredential( """ Parameters for UpsertJiraUserCredential """ input: UpsertJiraUserCredentialInput! ): UpsertJiraUserCredentialPayload """ Sets which Jira account a docket user is on a connection, replacing the user's existing mapping there. It decides whom Jira tickets and worklogs are attributed to. Admins only. Not available with an API key. """ upsertJiraUserMapping( """ Parameters for UpsertJiraUserMapping """ input: UpsertJiraUserMappingInput! ): UpsertJiraUserMappingPayload """ Starts a new draft from a template in a project: a quotation, or an invoice that is a billing cycle of its own. Project managers and admins. A template saved for one customer is refused in another customer's project. """ useDocumentTemplate( """ Parameters for UseDocumentTemplate """ input: UseDocumentTemplateInput! ): UseDocumentTemplatePayload """ Switches a billing cycle to the service rates as they are now. A cycle otherwise prices its documents at the rates of the moment it was created, or of the last time this was called. Project managers and admins. """ useLatestServiceRatesInAccounting( """ Parameters for UseLatestServiceRatesInAccounting """ input: UseLatestServiceRatesInAccountingInput! ): UseLatestServiceRatesInAccountingPayload """ Checks one price line and returns it priced exactly as the document will price it, without changing anything. Use it to preview a line before sending it with createBlockPosition or updateBlockPosition. Project managers and admins. A line for a service that is not billable is refused. """ validateBlockPositionSubposition( """ Parameters for ValidateBlockPositionSubposition """ input: ValidateBlockPositionSubpositionInput! ): ValidateBlockPositionSubpositionPayload """ Checks the caller's own Jira credential again against every connection it should reach; `checks` has the result per connection. Only the credential's owner. Not available with an API key. """ verifyJiraUserCredential( """ Parameters for VerifyJiraUserCredential """ input: VerifyJiraUserCredentialInput! ): VerifyJiraUserCredentialPayload } scalar NegatableAccountingCycleStatus scalar NegatableExternalCostStatus scalar NegatableProjectStatus scalar NegatableTicketPriority """ An object with an ID. """ interface Node { """ ID of the object. """ id: ID! } type Notification { action: NotificationAction! """ How many different people did it """ actorCount: Int! """ Who did it, the latest first, each once; up to three """ actors: [User!]! count: Int! countArchived: Int! countIsNew: Int! createdAt: ISO8601DateTime! """ The reactions, for TICKET_COMMENT_REACTED, the latest first, each once """ emojis: [String!]! id: String! record: NotificationRecordUnion } enum NotificationAction { """ Delivery note comment was added """ DELIVERY_NOTE_COMMENT_ADDED """ A user was mentioned in a delivery note comment """ DELIVERY_NOTE_COMMENT_MENTIONED """ Someone reacted to the user's delivery note comment """ DELIVERY_NOTE_COMMENT_REACTED """ Delivery note was set back to draft """ DELIVERY_NOTE_DRAFT """ Delivery note was published """ DELIVERY_NOTE_PUBLISHED """ Invoice was approved """ INVOICE_APPROVED """ Invoice was canceled """ INVOICE_CANCELED """ Invoice comment was added """ INVOICE_COMMENT_ADDED """ A user was mentioned in an invoice comment """ INVOICE_COMMENT_MENTIONED """ Someone reacted to the user's invoice comment """ INVOICE_COMMENT_REACTED """ Invoice was set back to draft """ INVOICE_DRAFT """ Invoice was paid """ INVOICE_PAID """ Invoice was published """ INVOICE_PUBLISHED """ Order confirmation comment was added """ ORDER_CONFIRMATION_COMMENT_ADDED """ A user was mentioned in a order confirmation comment """ ORDER_CONFIRMATION_COMMENT_MENTIONED """ Someone reacted to the user's order confirmation comment """ ORDER_CONFIRMATION_COMMENT_REACTED """ Order confirmation was set back to draft """ ORDER_CONFIRMATION_DRAFT """ Order confirmation was published """ ORDER_CONFIRMATION_PUBLISHED """ Quotation was approved """ QUOTATION_APPROVED """ Quotation was canceled """ QUOTATION_CANCELED """ Quotation comment was added """ QUOTATION_COMMENT_ADDED """ A user was mentioned in a quotation comment """ QUOTATION_COMMENT_MENTIONED """ Someone reacted to the user's quotation comment """ QUOTATION_COMMENT_REACTED """ Quotation was confirmed """ QUOTATION_CONFIRMED """ Quotation was set back to draft """ QUOTATION_DRAFT """ Quotation was published """ QUOTATION_PUBLISHED """ Ticket was assigned to a user """ TICKET_ASSIGNED """ Ticket was closed """ TICKET_CLOSED """ Ticket comment was added """ TICKET_COMMENT_ADDED """ A user was mentioned in a ticket comment """ TICKET_COMMENT_MENTIONED """ Someone reacted to the user's ticket comment """ TICKET_COMMENT_REACTED """ Ticket was created """ TICKET_CREATED """ A User was mentioned in a ticket """ TICKET_MENTIONED """ Ticket was planned """ TICKET_PLANNED """ Ticket was reopened """ TICKET_REOPENED """ Ticket was unassigned from a user """ TICKET_UNASSIGNED } """ The connection type for Notification. """ type NotificationConnection { count: Int! """ A list of edges. """ edges: [NotificationEdge!]! groupBy: NotificationGroup! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Notification!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type NotificationEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Notification! } input NotificationFilter { archived: Boolean """ The day the notification was created, in the workspace's time zone. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ createdAt: [String!] """ true = unread, false = read """ isNew: Boolean } type NotificationGroup { project: [NotificationGroupProjectResult!]! record: [NotificationGroupRecordResult!]! } type NotificationGroupProjectResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): NotificationConnection! key: Project! } type NotificationGroupRecordResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): NotificationConnection! key: NotificationRecordUnion! } input NotificationRecordInput { id: ID! type: NotificationRecordType! } enum NotificationRecordType { DELIVERY_NOTE INVOICE ORDER_CONFIRMATION QUOTATION TICKET } """ Objects which may appear in a notification's stream """ union NotificationRecordUnion = DeliveryNote | Invoice | OrderConfirmation | Quotation | Ticket """ Autogenerated input type of OpenTicket """ input OpenTicketInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of OpenTicket. """ type OpenTicketPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } """ The order confirmation of a billing cycle. docket creates it with the quotation's content when the quotation is confirmed; delivery notes and invoices are created from it. Only project managers and admins can read it. """ type OrderConfirmation implements Node { """ The billing cycle it belongs to """ accounting: Accounting! """ Who created it """ author: User! comments( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): OrderConfirmationCommentConnection! """ The customer's contacts the document is addressed to """ contactCustomers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ContactConnection! """ The agency's contact persons named on the document """ contactInternals( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! createdAt: ISO8601DateTime! """ The customer of the document's project """ customer: Customer! """ The customer address it is written to; needed before it can go out """ customerAddress: CustomerAddress date: ISO8601Date """ Soft-delete flag; deleted documents are not listed """ deleted: Boolean! """ Introductory text (HTML) """ description: String """ File name of its PDF """ filename: String! """ Footer text (HTML) """ footer: String id: ID! """ Language of the document and its PDF: de or en """ language: String """ Free name beside the number; the project's title unless given """ name: String """ The number as printed: project number, a dot and the two-digit number """ no: String! notificationRecipients: [User!]! """ Running number within the project """ number: Int! project: Project! """ Whether the PDF shows a subtotal under each position """ showPositionSubtotal: Boolean! status: OrderConfirmationStatus! """ Its comments and events (status changes, edits), oldest first """ stream( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): OrderConfirmationStreamConnection! """ The document's computed totals: net, discounts and surcharges, VAT, gross """ summary: Summary! """ Why it charges no VAT, as its PDF says it; null when VAT is charged """ taxNote: String """ The VAT rate in percent its lines use unless a line has its own """ taxRate: Float! """ How the customer is taxed; anything but DOMESTIC means no VAT on any line. Frozen once the document is issued. """ taxTreatment: TaxTreatment! """ no followed by the name """ title: String! updatedAt: ISO8601DateTime! """ Why the caller follows it (for example because they wrote it or were assigned); null when they don't """ viewerFollowReason: String """ Whether the caller follows it and so gets its notifications """ viewerIsFollowing: Boolean! } type OrderConfirmationComment implements Node { author: User! body: Json! bodyHtml: String! """ Written by docket when the AI added positions (shown as docket's); the author applied them """ byAi: Boolean! createdAt: ISO8601DateTime! id: ID! orderConfirmation: OrderConfirmation! """ Its reactions by emoji, in the order they were first given """ reactions: [Reaction!]! updatedAt: ISO8601DateTime! viewerCanEdit: Boolean! } """ The connection type for OrderConfirmationComment. """ type OrderConfirmationCommentConnection { count: Int! """ A list of edges. """ edges: [OrderConfirmationCommentEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [OrderConfirmationComment!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } type OrderConfirmationCommentDeleted { id: ID! } """ An edge in a connection. """ type OrderConfirmationCommentEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: OrderConfirmationComment! } """ The connection type for OrderConfirmation. """ type OrderConfirmationConnection { count: Int! """ A list of edges. """ edges: [OrderConfirmationEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [OrderConfirmation!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type OrderConfirmationEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: OrderConfirmation! } input OrderConfirmationFilter { ids: [ID!] search: String } enum OrderConfirmationStatus { """ Not sent yet: its content can be changed, and confirming the quotation again overwrites it. """ DRAFT """ Ready to go to the customer: its content is locked, and the quotation cannot be confirmed again until it is a draft again. """ PUBLISHED } """ The connection type for OrderConfirmationStreamUnion. """ type OrderConfirmationStreamConnection { count: Int! """ A list of edges. """ edges: [OrderConfirmationStreamEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [OrderConfirmationStreamUnion!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type OrderConfirmationStreamEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: OrderConfirmationStreamUnion! } """ Objects which may appear in a order confirmation's stream """ union OrderConfirmationStreamSubscriptionUnion = Event | OrderConfirmationComment | OrderConfirmationCommentDeleted """ Objects which may appear in a order confirmation's stream """ union OrderConfirmationStreamUnion = Event | OrderConfirmationComment """ Information about pagination in a connection. """ type PageInfo { """ When paginating forwards, the cursor to continue. """ endCursor: String """ When paginating forwards, are there more items? """ hasNextPage: Boolean! """ When paginating backwards, are there more items? """ hasPreviousPage: Boolean! """ When paginating backwards, the cursor to continue. """ startCursor: String } """ Autogenerated input type of PauseStopwatch """ input PauseStopwatchInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of PauseStopwatch. """ type PauseStopwatchPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json stopwatch: Stopwatch stopwatches: [Stopwatch!]! } """ A phase of a project: a stage that groups tickets and gives the roadmap its structure. Lists return the phases of projects the caller can open. """ type Phase implements Node { """ The latest end date of the phase's tickets; null when none has one """ computedEndDate: String """ The earliest start date of the phase's tickets; null when none has one """ computedStartDate: String createdAt: ISO8601DateTime! description: String """ Planned end (YYYY-MM-DD) """ endDate: String id: ID! """ Rank among the project's phases, for ordering (not consecutive) """ position: Int project: Project! slug: String! """ Planned start (YYYY-MM-DD) """ startDate: String tickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! ticketsClosed: Int! ticketsOpen: Int! title: String! updatedAt: ISO8601DateTime! } """ The connection type for Phase. """ type PhaseConnection { count: Int! """ A list of edges. """ edges: [PhaseEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Phase!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type PhaseEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Phase! } input PhaseFilter { ids: [ID!] projectIds: [ID!] """ Phases whose title contains this text """ search: String } type PinnedPage { """ The app path it opens, query string included """ path: String! title: String! } input PinnedPageInput { path: String! title: String! } """ A project: the work for one customer, with its tickets, time entries, budget and billing documents. Admins, project managers and basic users read every project; a timetracker only those they are assigned to, directly or through the project's customer. """ type Project implements Node { """ One entry per billing cycle that has gone out to the customer, oldest first: what is paid, open and overdue. Null unless you may see financial data (project managers and admins). """ accountingCycles: [AccountingCycle!] """ What happened in the project lately, newest first: tickets opened, closed and reopened, comments, and status changes of documents for those who may see them. limit is 1 to 50 (default 20). """ activity( """ Only what happened before this moment (the oldest item shown so far) """ before: ISO8601DateTime limit: Int = 20 ): [ProjectActivityItem!]! archived: Boolean! """ Everyone assigned to one of the project's tickets """ assignees( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! boards( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: BoardFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): BoardConnection! """ The external costs booked on the project, in the workspace's currency. Null unless you may see the budget (project managers and admins). """ budgetExternalCosts: Float """ Whether more than 100 % is used or, for an hour budget, the external costs exceed what the confirmed quotations sold. Always false for a timetracker. """ budgetOver: Boolean! """ The budget: minutes for MINUTES and MINUTES_PER_MONTH, an amount in the workspace's currency for AMOUNT and AMOUNT_PER_MONTH. Null without a budget. Null unless you may see the budget (project managers and admins). """ budgetRate: Float """ The time entries the budget counts: for a monthly budget those of the current month unless the filter names dates, otherwise all. Visibility as in timetrackings. """ budgetTimetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int orderBy: [String!] ): TimetrackingConnection! """ What the budget counts. Null unless you may see the budget (project managers and admins). """ budgetType: ProjectBudget """ How much of the budget is used, in percent (above 100 when over). An amount budget counts the revenue of the booked time and the external costs, an hour budget the booked time; a monthly budget the current month. 0 without a budget and for a timetracker. """ budgetUsed: Float! createdAt: ISO8601DateTime! customer: Customer! deadline: ISO8601Date """ Null unless you may see financial data (project managers and admins). """ deliveryNotes( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: DeliveryNoteFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int orderBy: [String!] ): DeliveryNoteConnection description: String """ Supplier invoices assigned to the project. Null unless you may see financial data (project managers and admins). """ externalCosts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: ExternalCostFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int orderBy: [String!] ): ExternalCostConnection """ The external costs booked against the external services the project's confirmed quotations sold; null without a confirmed quotation. Null unless you may see financial data (project managers and admins). """ externalCostsCheck: ExternalCostsCheck """ The external costs assigned to the project's quotations (drafts left out), with the KSK levy where it applies, in the workspace's currency. Null unless you may see financial data (project managers and admins). """ externalCostsTotal: Float """ What the project's quotations and invoices add up to. Null unless you may see financial data (project managers and admins). """ financials: ProjectFinancials """ Whether a budget is set. Always false for a timetracker. """ hasBudget: Boolean! id: ID! """ The types an invoice created without an order confirmation can have """ invoiceTypesWithoutOrderConfirmation: [InvoiceTypeEnum!]! """ Null unless you may see financial data (project managers and admins). """ invoices( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: InvoiceFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int orderBy: [String!] ): InvoiceConnection """ Whether the project is linked to a Jira project """ jiraLinked: Boolean! """ The link to a Jira project and its settings; null when unlinked """ jiraProjectLink: JiraProjectLink """ Address of the linked project in Jira; null when unlinked """ jiraProjectUrl: String """ How the linked Jira project shows up in the tickets area; null when unlinked """ jiraTicketsMode: JiraTicketsMode """ Time logged in Jira and imported read-only, summed per Jira author, most first. A timetracker sees only their own row; revenue is null unless you may see revenue (project managers and admins). Empty when unlinked. """ jiraWorklogSummary: [JiraWorklogSummary!]! labels( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectLabelConnection! """ The project's running number in the workspace (the first is 1001) """ number: Int! """ Null unless you may see financial data (project managers and admins). """ orderConfirmations( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: OrderConfirmationFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int orderBy: [String!] ): OrderConfirmationConnection """ Supervisors and ticket assignees together """ participants( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! phases( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): PhaseConnection! """ The project number as shown everywhere: the customer's initial followed by number, e.g. ACME1001 """ pnr: String! """ Share of the project's tickets that are closed, in percent (0 without tickets) """ progress: Int! """ Null unless you may see financial data (project managers and admins). """ quotations( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String filter: QuotationFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int orderBy: [String!] ): QuotationConnection """ The project's retainer; null when it isn't one, and unless you may see financial data (project managers and admins). """ retainer: Retainer """ Every service with the daily rate that applies to this project (the project's own, else the customer's, else the service's). With customerId: as they would apply under that customer. """ serviceRates(customerId: ID): [ServiceRate!]! """ The project's public report links. Null unless you may see the budget (project managers and admins). """ sharedReports: [SharedProjectReport!] slug: String! status: ProjectStatus! """ The day the status last changed """ statusDate: ISO8601Date """ Closed tickets that are pinned """ stickyTicketsClosed: Int! """ Open tickets that are pinned """ stickyTicketsOpen: Int! """ The people assigned to the project (project assignments) """ supervisors( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! tickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! ticketsClosed: Int! ticketsOpen: Int! """ Time booked on the project. A timetracker sees only their own entries, everyone else all of them. """ timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): TimetrackingConnection! title: String! updatedAt: ISO8601DateTime! """ Why the caller follows it (for example because they wrote it or were assigned); null when they don't """ viewerFollowReason: String """ Whether the caller follows it and so gets its notifications """ viewerIsFollowing: Boolean! """ The project's open tickets per assignee by deadline """ workload( """ Leave out the project's general ticket (number 1) """ excludeGeneral: Boolean = true ): WorkloadOverview! } type ProjectActivityItem { """ What happened to the document, for DOCUMENT entries """ action: EventAction """ The document, for DOCUMENT and DOCUMENT_COMMENT_REACTED entries """ document: ProjectDocumentUnion """ The reaction, for TICKET_COMMENT_REACTED and DOCUMENT_COMMENT_REACTED entries """ emoji: String id: ID! kind: ProjectActivityKind! occurredAt: ISO8601DateTime! ticket: Ticket user: User } enum ProjectActivityKind { """ A quotation, order confirmation, delivery note or invoice changed state (see action) """ DOCUMENT """ Someone reacted to a comment on a quotation, order confirmation, delivery note or invoice (see document and emoji) """ DOCUMENT_COMMENT_REACTED """ A ticket was closed """ TICKET_CLOSED """ A ticket got a comment """ TICKET_COMMENTED """ Someone reacted to a ticket's comment (see emoji) """ TICKET_COMMENT_REACTED """ A ticket was created """ TICKET_OPENED """ A ticket was reopened """ TICKET_REOPENED } enum ProjectBudget { """ A budget of money for the whole project, in the workspace's currency; the revenue of the booked time and the external costs count against it """ AMOUNT """ A budget of money per calendar month, in the workspace's currency; the current month counts against it """ AMOUNT_PER_MONTH """ A budget of time for the whole project, in minutes; the booked time counts against it """ MINUTES """ A budget of time per calendar month, in minutes; the time booked in the current month counts against it """ MINUTES_PER_MONTH } """ The connection type for Project. """ type ProjectConnection { count: Int! """ A list of edges. """ edges: [ProjectEdge!]! groupBy: ProjectGroup! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Project!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ A project's quotation, order confirmation, delivery note or invoice """ union ProjectDocumentUnion = DeliveryNote | Invoice | OrderConfirmation | Quotation """ An edge in a connection. """ type ProjectEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Project! } input ProjectFilter { """ Projects with a billing cycle in any of these states. A value with a leading "!" excludes that one, e.g. "!PAID". """ accountingStatus: [NegatableAccountingCycleStatus!] archived: Boolean """ Projects with a ticket assigned to any of these users """ assigneeIds: [ID!] customerIds: [ID!] """ The project's deadline. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ deadlines: [String!] """ true = only projects the current user follows (see Follow) """ followedByViewer: Boolean """ true = projects with at least one sticky ticket, false = with at least one ticket that is not sticky """ hasStickyTickets: Boolean ids: [ID!] """ Projects any of these users take part in: assigned to the project or to one of its tickets """ participantIds: [ID!] """ Words to find in the project's number, title or description; any of the words may match, also as the beginning of a word """ search: String """ Any of these statuses. A value with a leading "!" excludes that one, e.g. "!REQUESTED". """ status: [NegatableProjectStatus!] """ Projects any of these users are assigned to """ supervisorIds: [ID!] } type ProjectFinancials { """ Issued invoices, paid or not (no cancellations, nothing canceled) """ invoicedCount: Int! """ What they ask for: a final invoice counts its debit """ invoicedTotal: Float! """ Issued invoices not paid yet """ openCount: Int! openTotal: Float! overdueCount: Int! overdueTotal: Float! paidTotal: Float! """ Confirmed quotations """ quotedCount: Int! quotedTotal: Float! } type ProjectGroup { customer: [ProjectGroupCustomerCompanyResult!]! } type ProjectGroupCustomerCompanyResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectConnection! key: Customer! } type ProjectLabel implements Node { color: String! createdAt: ISO8601DateTime! description: String id: ID! project: Project! slug: String! title: String! updatedAt: ISO8601DateTime! } """ The connection type for ProjectLabel. """ type ProjectLabelConnection { count: Int! """ A list of edges. """ edges: [ProjectLabelEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [ProjectLabel!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type ProjectLabelEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: ProjectLabel! } input ProjectLabelFilter { ids: [ID!] projectIds: [ID!] } enum ProjectStatus { """ Project was canceled """ CANCELED """ Project is done """ DONE """ Project is in progress """ IN_PROGRESS """ Project is on hold """ ON_HOLD """ Customer has requested a new project """ REQUESTED } """ Autogenerated input type of PublishDeliveryNote """ input PublishDeliveryNoteInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of PublishDeliveryNote. """ type PublishDeliveryNotePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNote: DeliveryNote errors: Json } """ Autogenerated input type of PublishInvoice """ input PublishInvoiceInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of PublishInvoice. """ type PublishInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of PublishOrderConfirmation """ input PublishOrderConfirmationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of PublishOrderConfirmation. """ type PublishOrderConfirmationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmation: OrderConfirmation } """ Autogenerated input type of PublishQuotation """ input PublishQuotationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of PublishQuotation. """ type PublishQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of PurgeJiraProjectWorklogs """ input PurgeJiraProjectWorklogsInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of PurgeJiraProjectWorklogs. """ type PurgeJiraProjectWorklogsPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraProjectLink: JiraProjectLink } """ Everything that can be read. Each field returns only what the caller's role may see (timetracker, basic user, project manager, admin): a single record the caller may not see is null, a list leaves it out. Lists are connections: page with first/after cursors or with page/perPage, sort with orderBy, narrow with filter; count and totalCount give the size. """ type Query { """ The workspace itself: its settings and company data. Only the caller's own workspace is returned; any other id gives null. """ account(id: ID!): Account """ The tax office's accesses to the export for the bookkeeping: those in force first, then the revoked ones, newest first. Admins only; anyone else gets an error. """ accountantAccesses: [AccountantAccess!]! """ Where the workspace's tax office signs in and downloads the export for the bookkeeping. Admins only; anyone else gets an error. """ accountantPortalUrl: String! """ A billing cycle of a project by id: the container of its quotation, order confirmations, delivery notes and invoices. Project managers and admins only; null for everyone else. """ accounting(id: ID!): Accounting """ Whether the workspace allows connecting AI apps over MCP. """ aiConnectionsEnabled: Boolean! """ The signed-in person's own API keys, newest first """ apiTokens: [ApiToken!]! """ What an export for the bookkeeping would hold for a period, and the latest exports. Admins only; anyone else gets an error. The period must not end before it starts and spans at most 366 days. """ bookkeepingPeriod( """ First day of the period """ from: ISO8601Date! """ Last day of the period, included """ to: ISO8601Date! ): BookkeepingPeriod! """ A customer's contact person by id. Null when not found or not visible: timetrackers only see contacts of customers they are assigned to. """ contact(id: ID!): Contact """ Contact persons of customers. Admins, project managers and basic users see all of them, timetrackers only those of customers they are assigned to, directly or through a project. """ contacts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): ContactConnection! """ The countries an address can be in, with their ISO code and English name, sorted by name. """ countries: [Country!]! """ A custom field defined for a customer by id. Basic users, project managers and admins; null for timetrackers. """ customField(id: ID!): CustomField """ The custom fields defined for customers. Basic users, project managers and admins; an empty list for timetrackers. """ customFields( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomFieldFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): CustomFieldConnection! """ A customer by id. Admins, project managers and basic users see every customer, timetrackers only customers they are assigned to, directly or through a project; null otherwise. """ customer(id: ID!): Customer """ A customer's address by id. Null when the caller cannot see the customer (see customer). """ customerAddress(id: ID!): CustomerAddress """ Addresses of customers, limited to the customers the caller can see (see customers). """ customerAddresses( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomerAddressFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): CustomerAddressConnection! """ A customer by its slug, the name in its URL. Visibility as for customer. """ customerBySlug(slug: String!): Customer """ The workspace's customers, archived ones included unless filtered. Admins, project managers and basic users see every customer, timetrackers only customers they are assigned to, directly or through a project. """ customers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomerFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): CustomerConnection! """ A delivery note by id. Project managers and admins only; null for everyone else. """ deliveryNote(id: ID!): DeliveryNote """ A delivery note by its number and the project it belongs to. Visibility as for deliveryNote. """ deliveryNoteByNumber(number: Int!, projectId: ID!): DeliveryNote """ Delivery notes. Project managers and admins only; an empty list for everyone else. """ deliveryNotes( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: DeliveryNoteFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): DeliveryNoteConnection! """ Templates for quotations and invoices, sorted by name. Project managers and admins only; an empty list for everyone else. """ documentTemplates( """ Only the templates offered for this customer's documents: its own and those for every customer """ customerId: ID """ quotation or invoice; omit for both """ kind: String ): [DocumentTemplate!]! """ An external cost (a supplier's invoice) by id. Project managers and admins only; null for everyone else. """ externalCost(id: ID!): ExternalCost """ Works out the figures of an external cost that were not given, exactly as saving it would: the amount converted at the ECB rate of the invoice date, the tax at the VAT rate, and whether the VAT is deductible. Saves nothing. Pass what is known and leave out the rest. """ externalCostFigures( """ Net amount in the workspace's currency; leave out to have it converted from originalAmount """ amount: Float """ The currency of the supplier's invoice """ currency: Currency! """ Decides which day's ECB rate applies """ invoiceDate: ISO8601Date """ Net amount in the invoice's currency, when that is not the workspace's currency """ originalAmount: Float """ VAT rate in percent; the workspace's default when left out """ taxRate: Float ): ExternalCostFigures! """ External costs (suppliers' invoices). Project managers and admins only; an empty list for everyone else. """ externalCosts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ExternalCostFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): ExternalCostConnection! """ The finance dashboard's figures for a year (the current one when left out): open, paid and overdue invoices, the pipeline of quotations, revenue per month. Admins only; anyone else gets an error. """ financialSummary( """ Defaults to the current year """ year: Int ): FinancialSummary! """ The revenue forecast of a year: the year's quotations and the invoices written for them. Admins only, and only while the workspace has the forecast feature; anyone else gets an error. """ forecast( """ Narrows the quotations """ filter: QuotationFilter """ Narrows the invoices counted for those quotations """ invoiceFilter: InvoiceFilter year: Int! ): ForecastReport! """ The emojis the workspace reacts to comments with most, most used first (at most nine). """ frequentReactions: [String!]! """ An invoice by id. Project managers and admins only; null for everyone else. """ invoice(id: ID!): Invoice """ An invoice by its invoice number. Visibility as for invoice. """ invoiceByNumber(number: Int!): Invoice """ Invoices of every type and status, drafts and cancellations included unless filtered. Project managers and admins only; an empty list for everyone else. """ invoices( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: InvoiceFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): InvoiceConnection! """ A connected Jira site by id. Admins only. """ jiraConnection(id: ID!): JiraSite """ The Jira sites connected to the workspace, with their sync settings. Admins only; an empty list for everyone else. """ jiraConnections: [JiraSite!]! """ The epics of a Jira project, newest first, at most 50, asked from Jira live. Project managers and admins; anyone else gets an error. """ jiraEpics( jiraConnectionId: ID! """ The Jira project's key, e.g. "WEB" """ jiraProjectKey: String! """ Only epics whose summary starts with this text """ query: String ): [JiraEpicRef!]! """ Tickets mirrored from this Jira project that live in other docket projects and have time booked on them. Linking the Jira project elsewhere would not move them. Project managers and admins; anyone else gets an error. """ jiraMirrorConflicts( """ A docket project whose own mirrored tickets are not conflicts (the one being linked) """ excludeProjectId: ID jiraConnectionId: ID! """ The Jira project's key, e.g. "WEB" """ jiraProjectKey: String! ): [JiraMirrorConflict!]! """ Whether signing in to Jira with an Atlassian account (OAuth) is set up on this server; if not, a Jira account is connected with an API token. """ jiraOauthAvailable: Boolean! """ The Jira projects the connection's service account can see, asked from Jira live. Project managers and admins; anyone else gets an error. """ jiraProjects( jiraConnectionId: ID! """ Only Jira projects matching this text """ query: String ): [JiraProjectRef!]! """ Jira users matching a text, asked from Jira live, for mapping a docket user to a Jira account. Admins only; anyone else gets an error. """ jiraUsers( jiraConnectionId: ID! """ The text to look for; an empty text finds nobody """ query: String! ): [JiraUserRef!]! """ The MCP server address to enter in an AI app. The same for every workspace. """ mcpUrl: String! """ The AI apps (MCP clients) the caller has connected to docket. Never anyone else's. """ myAiConnections: [ConnectedAiApp!]! """ The caller's own connected Jira accounts. Never anyone else's. """ myJiraCredentials: [JiraUserCredential!]! """ The workspace's active Jira sites by name, with just enough to connect one's own Jira account. Visible to everyone in the workspace. """ myJiraSites: [JiraSiteSummary!]! """ An order confirmation by id. Project managers and admins only; null for everyone else. """ orderConfirmation(id: ID!): OrderConfirmation """ An order confirmation by its number and the project it belongs to. Visibility as for orderConfirmation. """ orderConfirmationByNumber(number: Int!, projectId: ID!): OrderConfirmation """ Order confirmations. Project managers and admins only; an empty list for everyone else. """ orderConfirmations( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: OrderConfirmationFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): OrderConfirmationConnection! """ A project phase by id. Null when the caller cannot open its project. """ phase(id: ID!): Phase """ Project phases, limited to projects the caller can open (see projects). """ phases( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: PhaseFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): PhaseConnection! """ A project by id. Admins, project managers and basic users open every project, timetrackers only projects they are assigned to, directly or through the customer; null otherwise. Budgets and other money fields are restricted further on the type. """ project(id: ID!): Project """ A project by its slug, the name in its URL. Visibility as for project. """ projectBySlug(slug: String!): Project """ A ticket label of a project by id. Null when the caller cannot open its project. """ projectLabel(id: ID!): ProjectLabel """ The ticket labels of projects, limited to projects the caller can open (see projects). """ projectLabels( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ProjectLabelFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): ProjectLabelConnection! """ Projects, archived ones included unless filtered. Admins, project managers and basic users see every project, timetrackers only projects they are assigned to, directly or through the customer. Besides plain fields, orderBy accepts budgetUsed and progressRelative. """ projects( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ProjectFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): ProjectConnection! """ A quotation by id. Project managers and admins only; null for everyone else. """ quotation(id: ID!): Quotation """ A quotation by its number and the project it belongs to. Visibility as for quotation. """ quotationByNumber(number: Int!, projectId: ID!): Quotation """ Quotations of all projects that are not archived. Project managers and admins only; an empty list for everyone else. """ quotations( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: QuotationFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): QuotationConnection! """ The months of the workspace's retainers that are over and have no invoice yet, by project. Project managers and admins; an empty list for everyone else. """ retainersDue: [RetainerMonth!]! """ The saved views (stored list settings) of a list, sorted by name: those shared with the team and the caller's own. For a list inside a project, pass the project; views of projects the caller cannot open are left out. """ savedViews( list: SavedViewList! """ Required for a list inside a project (tickets, boards, controlling); ignored for the others """ projectId: ID ): [SavedView!]! """ The global search over projects, tickets and their comments, billing documents, external costs, the team, customers and contacts. Returns only what the caller may open. A project or customer slug the caller cannot see gives an empty list. """ search( """ Only this customer's projects, what's in them, and its contacts """ customerSlug: String """ Only this project and what's in it """ projectSlug: String """ The text to look for """ query: String! """ Only these kinds (all when left out) """ scopes: [SearchScope!] ): [SearchResult!]! """ A service (a kind of work, with its daily rate) by id. Everyone in the workspace sees services; the rate is null unless the caller may see financial data (project managers and admins). """ service(id: ID!): Service """ A service by its slug, the name in its URL. Visibility as for service. """ serviceBySlug(slug: String!): Service """ The workspace's service categories (groups of services). Visible to everyone in the workspace. """ serviceCategories( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ServiceCategoryFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): ServiceCategoryConnection! """ A service category (a group of services) by id. Visible to everyone in the workspace. """ serviceCategory(id: ID!): ServiceCategory """ A service category by its slug, the name in its URL. """ serviceCategoryBySlug(slug: String!): ServiceCategory """ The workspace's services (kinds of work, each with a daily rate), archived ones included unless filtered. Everyone sees them; rates only project managers and admins. Besides plain fields, orderBy accepts expertCount. """ services( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ServiceFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): ServiceConnection! """ A public report link of a project by id. Project managers and admins only, and only for projects they can open; null otherwise. """ sharedProjectReport(id: ID!): SharedProjectReport """ The caller's own stopwatches, running and paused, oldest first. Nobody sees another person's stopwatches. """ stopwatches: [Stopwatch!]! """ A supplier by id. Basic users, project managers and admins; null for timetrackers. """ supplier(id: ID!): Supplier """ A supplier by its slug, the name in its URL. Visibility as for supplier. """ supplierBySlug(slug: String!): Supplier """ The workspace's suppliers, archived ones included unless filtered. Basic users, project managers and admins; an empty list for timetrackers. """ suppliers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: SupplierFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): SupplierConnection! """ A ticket by id. Null when not found or when the caller cannot open its project (timetrackers only open projects they are assigned to, directly or through the customer). """ ticket(id: ID!): Ticket """ A ticket by its number within a project. Visibility as for ticket. """ ticketByNumber( """ The ticket's number within its project """ number: Int! projectId: ID! ): Ticket """ A ticket by its project's slug and its number within that project, as in the ticket's URL. Visibility as for ticket. """ ticketByProjectSlugAndNumber( """ The ticket's number within its project """ number: Int! projectSlug: String! ): Ticket """ Tickets, including those mirrored from Jira: timetrackers only in projects they are assigned to, directly or through the customer; everyone else in every project. Closed tickets and tickets of archived projects are included unless filtered. """ tickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): TicketConnection! """ Why no description can be suggested by AI for a time entry on this ticket and day, as a sentence to show; null when a suggestion is possible. Only checks, calls no AI. For a ticket the caller cannot open it returns the not-authorized message. """ timeEntryDescriptionRefusal( """ The day of the time entry """ date: ISO8601Date! ticketId: ID! ): String """ A time entry by id. Admins see every entry, timetrackers only their own, everyone else also colleagues' entries on projects they can open; null otherwise. """ timetracking(id: ID!): Timetracking """ Figures computed over time entries: the average time booked per day. """ timetrackingAggregation: TimetrackingAggregation! """ Time entries. Admins see everyone's, timetrackers only their own, project managers and basic users their own and those on every project they can open. Revenue and rates are null unless the caller may see financial data. """ timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): TimetrackingConnection! """ A person of the workspace by id, archived ones included. Visible to everyone in the workspace; private fields are restricted on the type. """ user(id: ID!): User """ A person of the workspace by their slug, the name in their profile's URL. """ userBySlug(slug: String!): User """ A person's weekly working hours (hours per weekday, valid from a date) by id. Everyone sees their own; basic users, project managers and admins see everyone's; null otherwise. """ userWorkTime(id: ID!): UserWorkTime """ The people of the workspace, archived ones included unless filtered with archived: false. Visible to everyone in the workspace. Placeholder users created for Jira authors are left out unless the filter asks for them. """ users( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): UserConnection! """ The signed-in person; with an API key, the key's owner. """ viewer: Viewer! """ The workspace's webhooks. Admins only; anyone else gets an error. """ webhookEndpoints: [WebhookEndpoint!]! """ The events a webhook can ask for """ webhookEvents: [String!]! """ Open tickets counted per assignee (plus a row for unassigned ones) by when they are planned: overdue, this week, this month, next month, later, unplanned. Counts only tickets the caller can see (see tickets). """ workloadOverview( """ Leave out ticket number 1 of each project """ excludeGeneral: Boolean = true ): WorkloadOverview! } """ A quotation to a customer. It opens a billing cycle; confirming it creates the cycle's order confirmation. Only project managers and admins can read it. """ type Quotation implements Node { """ The billing cycle it belongs to """ accounting: Accounting! """ Who created it """ author: User! """ What the quotation sold and what taking it over would make of the project's budget. Null unless it is confirmed, the caller may change the project's budget and there is something to take over. """ budgetHandoff: QuotationBudgetHandoff """ The note given when it was canceled """ canceledNote: String comments( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): QuotationCommentConnection! """ Path of the customer's signed confirmation, if one was attached when confirming """ confirmationFile: String """ File name of the customer's signed confirmation """ confirmationFilename: String """ The note given when it was confirmed """ confirmedNote: String """ The customer's contacts the document is addressed to """ contactCustomers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ContactConnection! """ The agency's contact persons named on the document """ contactInternals( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! createdAt: ISO8601DateTime! """ The customer of the document's project """ customer: Customer! """ The customer address it is written to; needed before it can go out """ customerAddress: CustomerAddress date: ISO8601Date """ Soft-delete flag; deleted documents are not listed """ deleted: Boolean! """ Introductory text (HTML) """ description: String """ The template it was started from, if any """ documentTemplate: DocumentTemplate """ The supplier invoices assigned to this quotation, by invoice date """ externalCosts: [ExternalCost!]! """ The part of externalCostsTotal that is passed on to the customer """ externalCostsChargeableTotal: Float! """ The booked external costs against the external services the quotation sold; null unless it is confirmed """ externalCostsCheck: ExternalCostsCheck """ File name of its external-costs PDF """ externalCostsFilename: String! """ The part of externalCostsTotal that is not passed on to the customer """ externalCostsNonchargeableTotal: Float! """ This quotation's share of the external costs assigned to it (drafts left out), with the KSK levy where it applies; net, or with VAT where the workspace could not reclaim it. Workspace currency. """ externalCostsTotal: Float! """ Net total of its external-service lines, in the workspace's currency """ externalServiceTotal: Float """ File name of its PDF """ filename: String! """ Footer text (HTML) """ footer: String id: ID! """ Language of the document and its PDF: de or en """ language: String """ Free name beside the number; the project's title unless given """ name: String notificationRecipients: [User!]! """ Running number within the project """ number: Int! project: Project! """ The quotation number as printed: project number, a dot and the two-digit number, e.g. ACME1001.01 """ qnr: String! """ qnr followed by the name """ qnrWithName: String! """ Whether the PDF shows a subtotal under each position """ showPositionSubtotal: Boolean! status: QuotationStatus! """ Its comments and events (status changes, edits), oldest first """ stream( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): QuotationStreamConnection! """ The document's computed totals: net, discounts and surcharges, VAT, gross """ summary: Summary! """ Why it charges no VAT, as its PDF says it; null when VAT is charged """ taxNote: String """ The VAT rate in percent its lines use unless a line has its own """ taxRate: Float! """ How the customer is taxed; anything but DOMESTIC means no VAT on any line. Frozen once the document is issued. """ taxTreatment: TaxTreatment! """ The same as qnrWithName """ title: String! """ Net total in the workspace's currency """ totalNet: Float updatedAt: ISO8601DateTime! """ Why the caller follows it (for example because they wrote it or were assigned); null when they don't """ viewerFollowReason: String """ Whether the caller follows it and so gets its notifications """ viewerIsFollowing: Boolean! } type QuotationBudgetHandoff { """ The agency's own lines """ agencyServicesAmount: Float! budgetAfterAdd: Float budgetAfterSet: Float! """ The budget the hand-off writes: the project's, or without one hours when the quote sold any """ budgetType: ProjectBudget! """ The customer's commission on external services """ commissionAmount: Float! """ The project's budget now (minutes or amount), null without one """ currentBudget: Float """ Discounts (negative) and surcharges together """ discountsAndSurchargesAmount: Float! """ Bought-in work passed on """ externalServicesAmount: Float! """ What may be done, the suggestion first: add needs a budget to add to """ modes: [BudgetHandoffMode!]! """ The quote's net total, as its PDF prints it """ soldAmount: Float! """ Hours sold, in minutes: hour and day lines that reach the total, no external services """ soldMinutes: Float! suggestedMode: BudgetHandoffMode! } type QuotationComment implements Node { author: User! body: Json! bodyHtml: String! """ Written by docket when the AI added positions (shown as docket's); the author applied them """ byAi: Boolean! createdAt: ISO8601DateTime! id: ID! quotation: Quotation! """ Its reactions by emoji, in the order they were first given """ reactions: [Reaction!]! updatedAt: ISO8601DateTime! viewerCanEdit: Boolean! } """ The connection type for QuotationComment. """ type QuotationCommentConnection { count: Int! """ A list of edges. """ edges: [QuotationCommentEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [QuotationComment!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } type QuotationCommentDeleted { id: ID! } """ An edge in a connection. """ type QuotationCommentEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: QuotationComment! } """ The connection type for Quotation. """ type QuotationConnection { count: Int! """ A list of edges. """ edges: [QuotationEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Quotation!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type QuotationEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Quotation! } input QuotationFilter { customerIds: [ID!] """ Quotations whose billing cycle is in any of these states. A value with a leading "!" excludes that one, e.g. "!PAID". """ cycleStatus: [NegatableAccountingCycleStatus!] """ The quotation's date. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ dates: [String!] """ Quotations dated in this year, or with an invoice that counts for it in the forecast """ forecastYear: Int ids: [ID!] """ Quotations with an invoice dated on these days, as "2026-10-20" or with a comparison (">=2026-10-01", "<2026-11-01"); several values must all hold """ invoiceDate: [String!] """ Quotations with a sent, unpaid invoice due on these days, as "2026-10-20" or with a comparison (">=2026-10-01", "<2026-11-01"); several values must all hold """ invoiceDueDate: [String!] """ Quotations with an invoice in any of these statuses: "draft", "approved", "published", "canceled", "paid" """ invoiceStatuses: [String!] """ true = quotations with at least one paid invoice, false = with none """ isPaid: Boolean """ Quotations with an invoice paid on these days (workspace's time zone), as "2026-10-20" or with a comparison (">=2026-10-01", "<2026-11-01"); several values must all hold """ paidAt: [String!] projectIds: [ID!] """ Text to find, as the app's search finds it: by number, name, text and customer """ search: String """ Any of "draft", "approved", "published", "canceled", "confirmed"; upper or lower case """ statuses: [String!] } enum QuotationStatus { """ A former internal sign-off that is no longer set. A quotation still in it moves on like a draft. """ APPROVED """ Withdrawn or declined. It can be deleted, or reopened as a draft. """ CANCELED """ The customer accepted: the billing cycle's order confirmation is created from it (or updated, unless that is published). It can still be canceled or taken back to draft. """ CONFIRMED """ Being written: its content can be changed, and it can be deleted. """ DRAFT """ Sent to the customer: its content is locked. It is confirmed, canceled, or taken back to draft to change it. Needs a customer address. """ PUBLISHED } """ The connection type for QuotationStreamUnion. """ type QuotationStreamConnection { count: Int! """ A list of edges. """ edges: [QuotationStreamEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [QuotationStreamUnion!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type QuotationStreamEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: QuotationStreamUnion! } """ Objects which may appear in a quotation's stream """ union QuotationStreamSubscriptionUnion = Event | QuotationComment | QuotationCommentDeleted """ Objects which may appear in a quotation's stream """ union QuotationStreamUnion = Event | QuotationComment type Reaction { count: Int! emoji: String! users: [User!]! viewerReacted: Boolean! } """ Autogenerated input type of ReadExternalCostReceipt """ input ReadExternalCostReceiptInput { """ A file uploaded through /api/upload, or the invoice file of an existing external cost """ blobId: ID! """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Read with AI if there's no e-invoice (the wand); else only when the workspace reads every upload """ withAi: Boolean } """ Autogenerated return type of ReadExternalCostReceipt. """ type ReadExternalCostReceiptPayload { """ Net """ amount: Float """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ As the invoice says; amount and tax are in it """ currency: String errors: Json """ The ECB rate of the invoice date, for an invoice in another currency docket can convert """ exchangeRate: ExchangeRate invoiceDate: ISO8601Date invoiceNumber: String mixedTaxRates: Boolean """ Why nothing was read, when it says """ notice: String source: ReceiptSource """ The workspace's supplier of that name """ supplier: Supplier supplierName: String """ The VAT amount the invoice states """ tax: Float taxRate: Float } enum ReceiptSource { """ Read by the AI (Mistral) — to be checked """ AI """ An e-invoice inside the file, read exactly """ E_INVOICE """ Nothing read """ NONE } """ Autogenerated input type of RemoveDocumentFont """ input RemoveDocumentFontInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! style: DocumentFontStyle! } """ Autogenerated return type of RemoveDocumentFont. """ type RemoveDocumentFontPayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of ReopenInvoiceForCorrection """ input ReopenInvoiceForCorrectionInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The customer hasn't received this invoice """ notSentToCustomer: Boolean! """ What is wrong — kept with the correction """ reason: String! } """ Autogenerated return type of ReopenInvoiceForCorrection. """ type ReopenInvoiceForCorrectionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of RequestWorkspaceExport """ input RequestWorkspaceExportInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of RequestWorkspaceExport. """ type RequestWorkspaceExportPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json export: WorkspaceExport } """ Autogenerated input type of ResendAccountantAccessInvitation """ input ResendAccountantAccessInvitationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of ResendAccountantAccessInvitation. """ type ResendAccountantAccessInvitationPayload { accountantAccess: AccountantAccess """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of ResetUserTwoFactor """ input ResetUserTwoFactorInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of ResetUserTwoFactor. """ type ResetUserTwoFactorPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json user: User } """ Autogenerated input type of RestoreBlock """ input RestoreBlockInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block's place in the document, counted from 0 """ index: Int! """ Where the block goes, counted from 0 """ newIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The draft quotation or invoice to change """ recordId: ID! title: String type: BlockTypeEnum } """ Autogenerated return type of RestoreBlock. """ type RestoreBlockPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of RestoreBlockPosition """ input RestoreBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!] title: String } """ Autogenerated return type of RestoreBlockPosition. """ type RestoreBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of ResyncJiraProjectWorklogs """ input ResyncJiraProjectWorklogsInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of ResyncJiraProjectWorklogs. """ type ResyncJiraProjectWorklogsPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraProjectLink: JiraProjectLink } """ A project billed with a fixed fee per month. With a budget of hours per month the fee covers that contingent, and hours beyond it are billed on top. docket proposes each month's invoice once the month is over. """ type Retainer { """ Whether hours beyond the contingent are billed on top of the fee """ billsOverage: Boolean! """ The hours a period's fee covers, in minutes: the retainer's own contingent, else the project's budget when it is hours per month (times three for a quarter); null without either """ contingentMinutes: Int """ The periods (months or quarters) that are over and have no invoice yet, oldest first """ dueMonths: [RetainerMonth!]! """ Null for an open-ended retainer """ endsOn: ISO8601Date """ The fee per period (month or quarter), net, in the workspace's currency """ fee: Float! """ How many months one fee covers: 1 (billed monthly) or 3 (billed quarterly, from the month it starts in) """ intervalMonths: Int! """ The latest twelve periods of the term up to the current one, newest first """ months: [RetainerMonth!]! """ The last day to give notice so it ends on its end date; null when open-ended """ noticeBy: ISO8601Date """ The notice period in months """ noticeMonths: Int """ The contingent entered for the retainer itself, in minutes per period; null when the budget stands in """ ownContingentMinutes: Int startsOn: ISO8601Date! } """ One billing period of a retainer, a month or a quarter: the time booked against the hours its fee covers, what is over, and whether it has been invoiced. """ type RetainerMonth { """ Whether hours beyond the contingent are billed on top of the fee """ billsOverage: Boolean! """ Billable time booked in the month, in minutes """ bookedMinutes: Int! """ The hours the fee covers, in minutes; null without a contingent """ contingentMinutes: Int """ The month is over and has no invoice yet """ due: Boolean! """ The period's fee, net, in the workspace's currency """ fee: Float! """ The first day of the period inside the retainer's term """ from: ISO8601Date! """ The invoice that bills the month; null while there is none """ invoice: Invoice """ The first day of the period's first month """ month: ISO8601Date! """ How many months the period covers: 1 or 3 """ months: Int! """ Time beyond the contingent, in minutes; 0 without a contingent """ overageMinutes: Int! project: Project! """ The last day of the period inside the retainer's term """ to: ISO8601Date! """ What is left of the contingent and lapses at the end of the month, in minutes """ unusedMinutes: Int! } """ Autogenerated input type of RetryJiraWorklogPush """ input RetryJiraWorklogPushInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String timetrackingId: ID! } """ Autogenerated return type of RetryJiraWorklogPush. """ type RetryJiraWorklogPushPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetracking: Timetracking } """ Autogenerated input type of ReverseInvoicePayment """ input ReverseInvoicePaymentInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of ReverseInvoicePayment. """ type ReverseInvoicePaymentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of RevokeAccountantAccess """ input RevokeAccountantAccessInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of RevokeAccountantAccess. """ type RevokeAccountantAccessPayload { accountantAccess: AccountantAccess """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } type RssFeed { feed: [RssItem!]! title: String! } type RssItem { date: ISO8601DateTime! excerpt: String image: String link: String! tags: [String!]! title: String! } type SavedView implements Node { createdAt: ISO8601DateTime! id: ID! name: String! """ The list's query string (filters, what it shows; no order) """ query: String! """ Shared with everyone in the project or workspace, not someone's own """ shared: Boolean! updatedAt: ISO8601DateTime! } enum SavedViewList { BOARDS CONTROLLING_TICKETS CONTROLLING_TIMETRACKINGS EXTERNAL_COSTS FORECAST PROJECTS TICKETS TIMETRACKING_REPORTS WORKLOAD_TICKETS } type SearchResult { id: ID! meta: String """ A project's or a customer's — to search in it (projectSlug / customerSlug) """ slug: String title: String! type: SearchResultModel! url: String! } enum SearchResultModel { CONTACT CUSTOMER DELIVERY_NOTE EXTERNAL_COST INVOICE ORDER_CONFIRMATION PROJECT QUOTATION TICKET USER } enum SearchScope { """ Customers and their contacts """ CUSTOMERS """ Quotations, order confirmations, delivery notes, invoices and external costs """ DOCUMENTS """ The team """ PEOPLE PROJECTS """ Tickets, found by their own text or a comment """ TICKETS } """ Autogenerated input type of SelectBlockPosition """ input SelectBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean! """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!] title: String } """ Autogenerated return type of SelectBlockPosition. """ type SelectBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ A kind of work the agency sells (design, development, project management …), with a daily rate. Time is booked for a service and document lines are priced by it. """ type Service implements Node { archived: Boolean! """ false for internal work: it has no rate and its time is never billed """ billable: Boolean! category: ServiceCategory! createdAt: ISO8601DateTime! """ The standard rate per day (8 hours), net in the workspace's currency; customers and projects can have their own. Null unless you may see financial data (project managers and admins). """ dailyRate: Float """ The VAT rate a line of this service starts with; null = the workspace's default """ defaultTaxRate: Float description: String """ The users whose own service this is """ experts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! id: ID! slug: String! timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TimetrackingConnection! title: String! updatedAt: ISO8601DateTime! } type ServiceCategory implements Node { createdAt: ISO8601DateTime! id: ID! services( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ServiceFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ServiceConnection! slug: String! tickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ContactFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! title: String! updatedAt: ISO8601DateTime! } """ The connection type for ServiceCategory. """ type ServiceCategoryConnection { count: Int! """ A list of edges. """ edges: [ServiceCategoryEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [ServiceCategory!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type ServiceCategoryEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: ServiceCategory! } input ServiceCategoryFilter { ids: [ID!] """ Categories whose title contains this text """ search: String """ Categories with a service whose title contains this text """ searchServices: String } """ The connection type for Service. """ type ServiceConnection { count: Int! """ A list of edges. """ edges: [ServiceEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Service!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type ServiceEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Service! } input ServiceFilter { archived: Boolean ids: [ID!] """ Services whose title contains this text """ search: String } type ServiceRate implements Node { archived: Boolean! billable: Boolean! category: String! createdAt: ISO8601DateTime! dailyRate: Float """ The VAT rate a line of this service starts with; null = the document's """ defaultTaxRate: Float description: String id: ID! isCustomRate: Boolean! originalRate: Float title: String! updatedAt: ISO8601DateTime! } input ServiceRateInput { dailyRate: Float id: ID } """ Autogenerated input type of SetFollow """ input SetFollowInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ true follows, false unfollows """ following: Boolean! """ ID of a ticket, a project, a quotation, an order confirmation, a delivery note or an invoice """ id: ID! } """ Autogenerated return type of SetFollow. """ type SetFollowPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json followableId: ID viewerIsFollowing: Boolean } type SharedProjectReport implements Node { budgetRate: Float budgetType: ProjectBudget! budgetUsed(month: ISO8601Date): Float! createdAt: ISO8601DateTime! crypt: String! earliestTimetracking: ISO8601Date expired: Boolean! expiresOn: ISO8601Date id: ID! latestTimetracking: ISO8601Date project: Project! showBudget: Boolean! showExecutive: Boolean! showTickets: Boolean! """ The project's tickets (number, title, status) — empty unless the link shows them; open ones first """ tickets: [SharedReportTicket!]! updatedAt: ISO8601DateTime! } type SharedReportTicket { number: Int! status: TicketStatus! title: String! } """ Autogenerated input type of SignOutEveryone """ input SignOutEveryoneInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of SignOutEveryone. """ type SignOutEveryonePayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of StartStopwatch """ input StartStopwatchInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of StartStopwatch. """ type StartStopwatchPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json stopwatch: Stopwatch stopwatches: [Stopwatch!]! } type StatusBreakdown { count: Int! status: String! total: Float! } """ A stopwatch: it collects time until it is booked as a time entry. Several can run at once. Private: only its owner can read it, admins included. """ type Stopwatch implements Node { createdAt: ISO8601DateTime! id: ID! """ What booking it suggests: rounded up to the next full 15 minutes """ roundedMinutes: Int! """ false while paused """ running: Boolean! """ Time on the clock right now, in seconds """ seconds: Int! """ Optional — can also be picked when booking """ ticket: Ticket title: String! updatedAt: ISO8601DateTime! } type Stripe implements Node { createdAt: ISO8601DateTime! id: ID! invoices: [StripeInvoice!]! payment: StripePayment! subscription: StripeSubscription updatedAt: ISO8601DateTime! } type StripeCreditCard implements Node { brand: String! createdAt: ISO8601DateTime! expMonth: String expYear: String id: ID! number: String updatedAt: ISO8601DateTime! } type StripeInvoice implements Node { createdAt: ISO8601DateTime! date: ISO8601Date! downloadLink: String! id: ID! number: String price: String! seats: String! updatedAt: ISO8601DateTime! } type StripePayment implements Node { billingPortalUrl: String! createdAt: ISO8601DateTime! creditCard: StripeCreditCard id: ID! updatedAt: ISO8601DateTime! } type StripePlan implements Node { amount: Float! createdAt: ISO8601DateTime! id: ID! quantity: Int! title: String! updatedAt: ISO8601DateTime! } type StripeSubscription implements Node { cancelAt: ISO8601Date createdAt: ISO8601DateTime! id: ID! nextInvoice: ISO8601Date nextInvoiceAmount: String plans: [StripePlan!]! status: String! trialEnd: ISO8601Date updatedAt: ISO8601DateTime! } type Subscription { deliveryNoteStream(deliveryNoteId: ID!): DeliveryNoteStreamSubscriptionUnion invoiceStream(invoiceId: ID!): InvoiceStreamSubscriptionUnion orderConfirmationStream(orderConfirmationId: ID!): OrderConfirmationStreamSubscriptionUnion quotationStream(quotationId: ID!): QuotationStreamSubscriptionUnion stopwatches(userId: ID!): [Stopwatch!]! ticketStream(ticketId: ID!): TicketStreamSubscriptionUnion unreadNotificationCount(userId: ID!): Int! } """ Autogenerated input type of SuggestTimeEntries """ input SuggestTimeEntriesInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The day the note is about, unless it names another """ date: ISO8601Date! note: String! } """ Autogenerated return type of SuggestTimeEntries. """ type SuggestTimeEntriesPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String entries: [TimeEntrySuggestion!]! errors: Json """ What the suggestions are, when it isn't obvious: the period of work found without booked time """ heading: String """ Why there are no suggestions, when there are none """ notice: String } """ Autogenerated input type of SuggestTimeEntryDescription """ input SuggestTimeEntryDescriptionInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String date: ISO8601Date! ticketId: ID! } """ Autogenerated return type of SuggestTimeEntryDescription. """ type SuggestTimeEntryDescriptionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String errors: Json """ Why there is no suggestion, when there is none """ notice: String } type Summary { billedBefore: [BilledBefore!]! billedTaxBreakdown: [TaxGroup!]! blocks: [Block!]! commissionPercent: Float commissionThreshold: Float! commissionTotal: Float! debitTaxBreakdown: [TaxGroup!]! deductionType: String deductionValue: Float discountSurcharge: [DiscountSurcharge!]! exceedsQuotationTotal: Boolean! externalServiceTotal: Float! externalServiceTotalBilled: Float! """ More than one VAT rate on this document """ mixedTaxRates: Boolean! onlyOptionalCostsIncluded: Boolean! optionalCostsIncluded: Boolean! reachesQuotationTotal: Boolean! subtotal: Float! taxBreakdown: [TaxGroup!]! taxRate: Float! taxTreatment: TaxTreatment! totalBilledGross: Float! totalBilledNet: Float! totalBilledSoFarNet: Float! totalBilledTax: Float! totalDebitGross: Float! totalDebitNet: Float! totalDebitTax: Float! totalGross: Float! totalNet: Float! totalTax: Float! } """ A supplier whose invoices are recorded as external costs. Basic users, project managers and admins can read it, timetrackers cannot. """ type Supplier implements Node { archived: Boolean! createdAt: ISO8601DateTime! """ The supplier's own account (creditor number) in the tax office's DATEV; null = the collective account """ datevAccount: String """ The supplier's invoices; only project managers and admins see any """ externalCosts( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ExternalCostConnection! id: ID! """ Whether the supplier is subject to the KSK levy (German artists' social insurance), which is then added to its invoices' cost """ ksk: Boolean! slug: String! """ How the supplier's invoices are taxed: domestic, or abroad — then an invoice without VAT is reverse charge (the workspace owes the tax) """ taxTreatment: SupplierTaxTreatment! """ The supplier's name """ title: String! updatedAt: ISO8601DateTime! } """ The connection type for Supplier. """ type SupplierConnection { count: Int! """ A list of edges. """ edges: [SupplierEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Supplier!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type SupplierEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Supplier! } input SupplierFilter { archived: Boolean ids: [ID!] """ Suppliers whose name contains this text """ search: String } enum SupplierTaxTreatment { """ Invoices carry the workspace's country's VAT """ DOMESTIC """ In another EU country: without VAT on the invoice the workspace owes the tax """ REVERSE_CHARGE_EU """ Outside the EU: without VAT on the invoice the workspace owes the tax """ REVERSE_CHARGE_THIRD_COUNTRY } """ Autogenerated input type of SyncJiraProjectIssues """ input SyncJiraProjectIssuesInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of SyncJiraProjectIssues. """ type SyncJiraProjectIssuesPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraProjectLink: JiraProjectLink } type TaxGroup { gross: Float! net: Float! """ The VAT rate in percent (19, 7, 0) """ rate: Float! tax: Float! } enum TaxTreatment { """ VAT is charged at the lines' rates """ DOMESTIC """ Business customer in another EU country: no VAT, reverse-charge note """ EU_REVERSE_CHARGE """ Tax-exempt supply: no VAT, exemption note """ EXEMPT """ Only on documents issued before the reasons existed: no VAT, no note. An address can't have it. """ NO_VAT """ Only on documents: a domestic customer of a workspace under the small business scheme (§ 19 UStG): no VAT, § 19 note. An address can't have it. """ SMALL_BUSINESS """ Customer outside the EU: no VAT, not taxable in Germany """ THIRD_COUNTRY } """ Autogenerated input type of TestJiraConnection """ input TestJiraConnectionInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of TestJiraConnection. """ type TestJiraConnectionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraConnection: JiraSite ok: Boolean! } """ Autogenerated input type of TestWebhookEndpoint """ input TestWebhookEndpointInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of TestWebhookEndpoint. """ type TestWebhookEndpointPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json webhookEndpoint: WebhookEndpoint } """ A ticket: a task in a project, and what time is booked on. Lists and lookups return only tickets of projects the caller can open. A ticket mirrored from Jira (isExternal) is read-only here; time is still booked on it. """ type Ticket implements Node { assignees( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserConnection! """ The assignments behind assignees, one per assigned person """ assignments( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketAssignmentConnection! """ The files in the description and the comments, oldest first """ attachments: [TicketAttachment!]! author: User! """ Rank within its board column, for ordering (not consecutive) """ boardPosition: Int! """ The description as a rich-text JSON document (type doc with content nodes) """ body: Json! """ The description rendered as HTML """ bodyHtml: String! """ Time booked on this ticket and its sub-tasks — what Jira shows as the aggregate """ bookedMinutesIncludingChildren: Int! """ The ticket's budget: minutes for MINUTES, an amount in the workspace's currency for AMOUNT. Null without a budget. Null unless you may see financial data (project managers and admins). """ budgetRate: Float """ What the ticket's budget counts. Null unless you may see financial data (project managers and admins). """ budgetType: TicketBudget """ Share of the ticket's budget used by the time booked on it, in percent (above 100 when over); 0 without a budget or booked time, and for time trackers """ budgetUsed: Float! """ Sub-tasks (and an epic's children) mirrored from Jira, by key """ childTickets: [Ticket!]! """ The day it was closed; null while open """ closedAt: ISO8601Date """ Who closed it; null while open """ closedBy: User comments( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketCommentConnection! createdAt: ISO8601DateTime! """ Planned end, the ticket's deadline """ endDate: ISO8601Date """ The Jira issue key, e.g. ABC-123; null for a native ticket """ externalKey: String """ Jira assignees that have no docket user (accountId, displayName); null for a native ticket """ externalRawAssignees: Json """ jira for a ticket mirrored from Jira; null for one created in docket """ externalSource: String """ Address of the issue in Jira; null for a native ticket """ externalUrl: String id: ID! """ Whether it is mirrored from Jira and therefore read-only in docket """ isExternal: Boolean! """ Whether the ticket is pinned """ isSticky: Boolean! """ The Jira issue type (epic, story, sub-task, …); null for a native ticket """ jiraIssueType: String """ Whether it mirrors a Jira sub-task """ jiraSubtask: Boolean! labels( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectLabelConnection! notificationRecipients: [User!]! """ Running number within the project, starting at 1 (the general ticket every project starts with) """ number: Int! """ The mirror of its Jira parent issue; null for native tickets and top-level issues """ parentTicket: Ticket phase: Phase """ Rank within its phase, for ordering (not consecutive) """ phasePosition: Int! priority: TicketPriority! project: Project! """ The category of work the ticket belongs to, if one is set """ serviceCategory: ServiceCategory """ Planned start """ startDate: ISO8601Date status: TicketStatus! """ Its comments and events (status changes, edits), oldest first """ stream( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketStreamConnection! """ Time booked on the ticket. A timetracker sees only their own entries, everyone else all of them. """ timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TimetrackingConnection! title: String! """ Checked to-do items in the description """ todosClosed: Int! """ Unchecked to-do items in the description """ todosOpen: Int! updatedAt: ISO8601DateTime! """ Why the caller follows it (for example because they wrote it or were assigned); null when they don't """ viewerFollowReason: String """ Whether the caller follows it and so gets its notifications """ viewerIsFollowing: Boolean! } type TicketAssignment implements Node { assignee: User! createdAt: ISO8601DateTime! id: ID! ticket: Ticket! updatedAt: ISO8601DateTime! } """ The connection type for TicketAssignment. """ type TicketAssignmentConnection { count: Int! """ A list of edges. """ edges: [TicketAssignmentEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [TicketAssignment!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type TicketAssignmentEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: TicketAssignment! } type TicketAttachment { """ Who wrote the comment it is in; null for the description """ author: User byteSize: Int! """ The comment it is in; null for the description """ commentId: ID contentType: String createdAt: ISO8601DateTime! filename: String! """ The file's (blob's) id """ id: ID! """ An image, shown as a thumbnail """ image: Boolean! """ A small square of an image, made on first request """ thumbnailUrl: String """ Opens the file: an image in the browser, anything else as a download. A path on the workspace; fetch it signed in, or with the API key in the Authorization header """ url: String! } enum TicketBudget { """ A budget of money for the ticket, in the workspace's currency; the revenue of the time booked on it counts against it """ AMOUNT """ A budget of time for the ticket, in minutes; the time booked on it counts against it """ MINUTES } type TicketChange { added: [TicketChangeValue!]! field: TicketChangeField! from: TicketChangeValue removed: [TicketChangeValue!]! to: TicketChangeValue } """ What a line of a ticket's change entry is about (Ticket::ChangeLog::FIELDS) """ enum TicketChangeField { ASSIGNEES DESCRIPTION END_DATE LABELS PHASE PRIORITY SERVICE START_DATE TITLE } type TicketChangeValue { """ A label's colour """ color: String """ It was deleted since: the name is the one it had then """ deleted: Boolean! id: ID """ The current name while it exists, the one stored with the change once it was deleted """ name: String! } type TicketComment implements Node { author: User! body: Json! bodyHtml: String! createdAt: ISO8601DateTime! id: ID! mentions: [Mention!]! """ Its reactions by emoji, in the order they were first given """ reactions: [Reaction!]! ticket: Ticket! todosClosed: Int! todosOpen: Int! updatedAt: ISO8601DateTime! viewerCanEdit: Boolean! } """ The connection type for TicketComment. """ type TicketCommentConnection { count: Int! """ A list of edges. """ edges: [TicketCommentEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [TicketComment!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } type TicketCommentDeleted { id: ID! } """ An edge in a connection. """ type TicketCommentEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: TicketComment! } """ The connection type for Ticket. """ type TicketConnection { count: Int! """ A list of edges. """ edges: [TicketEdge!]! groupBy: TicketGroup! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Ticket!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type TicketEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Ticket! } input TicketFilter { """ true = has at least one assignee, false = unassigned """ assigned: Boolean """ Tickets assigned to any of these users """ assigneeIds: [ID!] """ Tickets with an assignee who is none of these users; unassigned tickets do not match """ assigneeIdsNot: [ID!] """ true = only what the time-entry form offers (on a Jira-linked project: its Jira tickets) """ bookable: Boolean customerIds: [ID!] """ true = tickets ending between today and Sunday (by end date, else start date), false = all others """ dueThisWeek: Boolean """ The ticket's end date. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ endDates: [String!] """ true = only tickets mirrored from Jira, false = only docket's own """ external: Boolean """ true = only tickets the current user follows (see Follow) """ followedByViewer: Boolean """ true = only tickets with a start or an end date; false has no effect """ hasStartOrEndDate: Boolean ids: [ID!] isSticky: Boolean labelIds: [ID!] """ The ticket's number within its project """ number: String """ Get all tickets scheduled or overdue for this week """ overdueOrCurrentWeek: Boolean phaseIds: [ID!] """ Any of these priorities. A value with a leading "!" excludes that one, e.g. "!HIGH". """ priorities: [NegatableTicketPriority!] projectArchived: Boolean projectIds: [ID!] projectSlugs: [String!] """ When the ticket is planned — the workload buckets """ scheduleBuckets: [TicketScheduleBucket!] """ Words to find in the ticket's title, text, number or comments; any of the words may match, also as the beginning of a word """ search: String serviceCategoryIds: [ID!] """ The ticket's start date. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ startDates: [String!] status: TicketStatus } type TicketGroup { project: [TicketGroupProjectResult!]! } type TicketGroupProjectResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! key: Project! } enum TicketPriority { """ Ticket has high priority """ HIGH """ Ticket has low priority """ LOW """ Ticket has normal priority """ NORMAL } enum TicketScheduleBucket { """ Ends after next month """ LATER """ Ends next month """ NEXT_MONTH """ Ended before today """ OVERDUE """ Ends later this month """ THIS_MONTH """ Lies in this week """ THIS_WEEK """ No dates """ UNPLANNED } enum TicketStatus { """ Done: closedAt and closedBy say when and by whom. It can be reopened. """ CLOSED """ Work to do """ OPEN } """ The connection type for TicketStreamUnion. """ type TicketStreamConnection { count: Int! """ A list of edges. """ edges: [TicketStreamEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [TicketStreamUnion!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type TicketStreamEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: TicketStreamUnion! } """ Objects which may appear in a ticket's stream """ union TicketStreamSubscriptionUnion = Event | TicketComment | TicketCommentDeleted """ Objects which may appear in a ticket's stream """ union TicketStreamUnion = Event | TicketComment type TimeEntrySuggestion { date: ISO8601Date! description: String """ What docket saw in the ticket, for an entry found from the person's activity """ found: String minutes: Int project: Project service: Service ticket: Ticket } """ A time entry: the time one person booked on a ticket of a project, for a service. Admins see every entry, a timetracker only their own, everyone else their own and those on projects they can open. """ type Timetracking implements Node { """ Whether an invoice holds this entry as a line. A billed entry can't be changed or deleted until its line or its invoice is gone """ billed: Boolean! createdAt: ISO8601DateTime! """ The service's rate per day (8 hours) on this project when the entry was booked, net in the workspace's currency. Null unless you may see revenue (project managers and admins). """ dailyRate: Float """ The day the work was done """ date: ISO8601Date! description: String """ Minutes, in steps of 15 """ duration: Float! id: ID! """ The invoice that bills this entry (billing by effort), drafts included; null while it is not billed, and for those who may not see invoices """ invoice: Invoice """ Set while the state is NOT_SYNCABLE: what the person lacks for the push """ jiraMissingForPush: JiraPushRequirement """ What Jira answered when the push failed """ jiraSyncError: String """ Where the push of this entry to Jira as a worklog stands; null for entries on tickets not mirrored from Jira """ jiraSyncState: TimetrackingJiraSyncState project: Project! """ What the entry is worth: daily rate × duration, net in the workspace's currency; 0 for a non-billable service. Null unless you may see revenue (project managers and admins). """ revenue: Float """ The kind of work; it decides the rate """ service: Service! ticket: Ticket! updatedAt: ISO8601DateTime! """ Who did the work """ user: User! } type TimetrackingAggregation { avgTimetrackingsPerDay(filter: AvgTimetrackingPerDayFilter): AvgTimetrackingPerDay! } enum TimetrackingBilling { """ A line of an invoice, draft or issued """ BILLED """ Billable and on no invoice yet """ OPEN } """ The connection type for Timetracking. """ type TimetrackingConnection { count: Int! """ A list of edges. """ edges: [TimetrackingEdge!]! groupBy: TimetrackingGroup! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [Timetracking!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type TimetrackingEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: Timetracking! } input TimetrackingFilter { """ Billing by effort: OPEN = billable and on no invoice yet, BILLED = taken into an invoice; both together find either """ billing: [TimetrackingBilling!] customerIds: [ID!] """ Leaves out the entries of these customers' projects """ customerIdsNot: [ID!] """ The day the time was worked. Days as "2026-10-20", with a comparison (">=2026-10-01", "<2026-11-01") or as a range "2026-10-01 > 2026-10-31" (both days included); several values must all hold. "NULL" finds records without this date, "NOT NULL" those with one. """ dates: [String!] """ Minutes, as "60" or with a comparison (">=60", "<120"); several values must all hold """ durations: [String!] projectIds: [ID!] """ Leaves out the entries of these projects """ projectIdsNot: [ID!] """ Whole amounts in the workspace's currency, as "500" or with a comparison (">=500"); several values must all hold. Ignored for callers who may not see financial data """ revenues: [String!] """ Entries whose description contains this text """ search: String serviceIds: [ID!] """ Leaves out the entries booked with these services """ serviceIdsNot: [ID!] ticketIds: [ID!] """ Leaves out the entries on these tickets """ ticketIdsNot: [ID!] userIds: [ID!] """ Leaves out the entries of these users """ userIdsNot: [ID!] } type TimetrackingGroup { date: [TimetrackingGroupDateResult!]! service: [TimetrackingGroupServiceResult!]! user: [TimetrackingGroupUserResult!]! } type TimetrackingGroupDateResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TimetrackingConnection! key: String! } type TimetrackingGroupServiceResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TimetrackingConnection! key: Service! } type TimetrackingGroupUserResult { connection( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TimetrackingConnection! key: User! } enum TimetrackingJiraSyncState { """ Push failed (see error) """ FAILED """ User has no connected Jira token """ NOT_SYNCABLE """ Queued to push to Jira """ PENDING """ Pushed to the Jira worklog """ SYNCED } """ Autogenerated input type of ToggleCommentReaction """ input ToggleCommentReactionInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String commentId: ID! """ A single emoji. A comment takes at most 20 different ones """ emoji: String! """ What the comment is on """ kind: CommentOn! } """ Autogenerated return type of ToggleCommentReaction. """ type ToggleCommentReactionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String comment: CommentUnion errors: Json } """ Autogenerated input type of ToggleTicketCommentTodo """ input ToggleTicketCommentTodoInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The `id` attribute of the checklist item in the body's JSON """ todoId: String! } """ Autogenerated return type of ToggleTicketCommentTodo. """ type ToggleTicketCommentTodoPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticketComment: TicketComment } """ Autogenerated input type of ToggleTicketSticky """ input ToggleTicketStickyInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of ToggleTicketSticky. """ type ToggleTicketStickyPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } """ Autogenerated input type of ToggleTicketTodo """ input ToggleTicketTodoInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The `id` attribute of the checklist item in the body's JSON """ todoId: String! } """ Autogenerated return type of ToggleTicketTodo. """ type ToggleTicketTodoPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } """ Autogenerated input type of UnlinkJiraProject """ input UnlinkJiraProjectInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ true also deletes the mirrored tickets that carry time, together with that time """ deleteMirroredTickets: Boolean id: ID! } """ Autogenerated return type of UnlinkJiraProject. """ type UnlinkJiraProjectPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project } """ Autogenerated input type of UpdateAccount """ input UpdateAccountInput { """ Font of the PDF documents: Inter, or Custom for the workspace's own (uploadDocumentFont) """ accountingFont: String accountingFooterManagingDirector: String accountingFooterOffice: String accountingHeader: String accountingTaxNumber: String accountingVatId: String advancePaymentTitleDe: String advancePaymentTitleEn: String """ The workspace's own key. Write-only; omitted, the stored key is kept. """ aiApiKey: String """ For OPENAI_COMPATIBLE: the service's https address, e.g. https://api.example.com/v1 """ aiBaseUrl: String """ Members may connect AI apps through the MCP endpoint. Off by default. """ aiConnectionsEnabled: Boolean """ The workspace's own rules for the AI assistant, part of every request """ aiDocumentRules: String """ Quotations and invoices can be written with the AI assistant. Off by default. """ aiDocuments: Boolean """ For OPENAI_COMPATIBLE: the model's name """ aiModel: String """ Whose key the AI features use """ aiProvider: AiProvider """ Supplier invoices without an e-invoice may be read with AI """ aiReceiptReading: Boolean """ Every uploaded supplier invoice is read with AI, without asking """ aiReceiptReadingAutomatic: Boolean """ Booking time with AI: entries from a note, descriptions from the ticket. Off by default. """ aiTimeEntry: Boolean """ Members may make personal API keys for this API. Off by default. """ apiAccessEnabled: Boolean bic: String cancellationInvoiceTitleDe: String cancellationInvoiceTitleEn: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String companyCity: String companyName: String companyPostalCode: String companyStreet: String """ Country code of the workspace; fixed once a document or an external cost exists """ country: String """ One of the country's currencies; fixed once a document or an external cost exists """ currency: String """ Customer numbers are entered by hand instead of assigned by docket """ customCustomerNumber: Boolean customInvoiceNumber: Boolean """ The first customer number docket assigns """ customerNumberStart: Int """ The distance between two customer numbers docket assigns, 1 to 1000 """ customerNumberStep: Int """ Account numbers (digits only) by case, as an object; the keys are Account.datevAccountKeys """ datevAccounts: JSON """ Adds a DATEV booking batch to the export for the bookkeeping """ datevBookings: Boolean datevClientNumber: Int datevConsultantNumber: Int """ The month the fiscal year starts with, 1 to 12 """ datevFiscalYearStart: Int """ In percent; one of taxRates """ defaultTaxRate: Float finalInvoiceTitleDe: String finalInvoiceTitleEn: String iban: String id: ID! invoiceContactEmail: String invoiceContactName: String invoiceContactPhone: String invoiceFooterDe: String invoiceFooterEn: String invoiceNumberPrefix: String invoiceTitleDe: String invoiceTitleEn: String """ Further letterhead lines below the company address, one per line """ letterheadLines: String """ Default language of emails and sign-in pages; users without their own choice follow it """ locale: Locale """ An SVG as a data URL, at most 2 MB """ logo: String """ Width of the logo on PDF documents in points; at most 200, 100 if empty """ logoSize: Int name: String partialInvoiceTitleDe: String partialInvoiceTitleEn: String """ Default payment term of invoices in days, 0 to 365 """ paymentTermDays: Int quotationFooterDe: String quotationFooterEn: String """ Every member must use two-factor authentication """ requireTwoFactor: Boolean """ The small-business status (no VAT) from the start: replaces the only VAT status while nothing was issued or booked under it. A history is changed with createVatStatus and deleteVatStatus. """ smallBusiness: Boolean """ The VAT rates, in percent, that documents can use """ taxRates: [Float!] } """ Autogenerated return type of UpdateAccount. """ type UpdateAccountPayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of UpdateBlock """ input UpdateBlockInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block's place in the document, counted from 0 """ index: Int! """ Where the block goes, counted from 0 """ newIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ The draft quotation or invoice to change """ recordId: ID! title: String type: BlockTypeEnum } """ Autogenerated return type of UpdateBlock. """ type UpdateBlockPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of UpdateBlockPosition """ input UpdateBlockPositionInput { """ The place of the position's block in the document, counted from 0 """ blockIndex: Int! """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String footer: String id: ID """ The block the position goes into, counted from 0 """ newBlockIndex: Int """ Where in that block the position goes, counted from 0 """ newPositionIndex: Int """ Offered as an option: printed, but not counted into the total """ optional: Boolean! """ The position's place in its block, counted from 0 """ positionIndex: Int! """ The draft quotation or invoice to change """ recordId: ID! """ Ticked: a partial or final invoice bills the position """ selected: Boolean """ The price lines, always the whole list: service (quantity, unit), custom (name, rate, quantity, unit) or flatrate (name, amount) lines """ subpositions: [BlockPositionSubpositionInput!]! title: String! } """ Autogenerated return type of UpdateBlockPosition. """ type UpdateBlockPositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of UpdateBoard """ input UpdateBoardInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! projectId: ID """ The status a ticket takes when it is put into this column """ ticketStatus: TicketStatus title: String } """ Autogenerated return type of UpdateBoard. """ type UpdateBoardPayload { board: Board """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of UpdateContact """ input UpdateContactInput { archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customers this person is a contact of; replaces the whole list """ customerIds: [ID!] department: String email: String firstname: String id: ID! lastname: String phone: String salutation: String title: String } """ Autogenerated return type of UpdateContact. """ type UpdateContactPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String contact: Contact errors: Json } """ Autogenerated input type of UpdateCustomField """ input UpdateCustomFieldInput { archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer whose documents carry the field """ customerId: ID defaultValue: String """ `text` or `contact` """ fieldType: String id: ID! label: String name: String } """ Autogenerated return type of UpdateCustomField. """ type UpdateCustomFieldPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customField: CustomField errors: Json } """ Autogenerated input type of UpdateCustomerAddress """ input UpdateCustomerAddressInput { address1: String address2: String """ The e-invoice's buyer reference (BT-10), e.g. a Leitweg-ID """ buyerReference: String city: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Free text, from before the list; prefer countryCode """ country: String """ ISO 3166-1 alpha-2 """ countryCode: String department: String id: ID! """ Where this customer receives e-invoices (BT-49) """ invoiceEmail: String """ The customer number; typed where the workspace numbers its customers itself, else docket's """ number: Int recipient: String taxTreatment: TaxTreatment vatNo: String zip: String } """ Autogenerated return type of UpdateCustomerAddress. """ type UpdateCustomerAddressPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customerAddress: CustomerAddress errors: Json } """ Autogenerated input type of UpdateCustomer """ input UpdateCustomerInput { """ Commission in percent on the external costs billed in a document """ accountingCommissionPercent: Float """ Net total of external costs in a document from which the commission applies """ accountingCommissionThreshold: Float archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String company: String """ The customer's own account (debtor number) in DATEV; empty = the collective account """ datevAccount: String description: String email: String id: ID! initial: String invoiceFooterDe: String invoiceFooterEn: String """ The customer has a master agreement; advance-payment invoices then name it """ masterAgreement: Boolean """ This customer's payment term in days, 0 to 365; null = the workspace's """ paymentTermDays: Int phone: String quotationFooterDe: String quotationFooterEn: String """ The customer's own daily rates; `id` is a ServiceRate id as Customer.serviceRates returns it """ serviceRates: [ServiceRateInput!] """ true: time already booked for this customer is repriced where a service's rate changed, in the background """ updateTimetrackings: Boolean web: String } """ Autogenerated return type of UpdateCustomer. """ type UpdateCustomerPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String customer: Customer errors: Json } """ Autogenerated input type of UpdateDeliveryNoteComment """ input UpdateDeliveryNoteCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The delivery note to comment on; needed when creating, ignored when updating """ deliveryNoteId: ID id: ID! } """ Autogenerated return type of UpdateDeliveryNoteComment. """ type UpdateDeliveryNoteCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNoteComment: DeliveryNoteComment errors: Json } """ Autogenerated input type of UpdateDeliveryNote """ input UpdateDeliveryNoteInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ Values for the workspace's custom fields; they are shared by all documents of the billing cycle """ customFields: [AccountingCustomFieldInput!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date description: String footer: String id: ID! """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The delivery note's running number within its project; the next free one when omitted """ number: Int showPositionSubtotal: Boolean status: DeliveryNoteStatus @deprecated(reason: "Refused unless unchanged: a document's status moves through its own mutations (publish, draft, …).") } """ Autogenerated return type of UpdateDeliveryNote. """ type UpdateDeliveryNotePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String deliveryNote: DeliveryNote errors: Json } """ Autogenerated input type of UpdateDiscountSurcharge """ input UpdateDiscountSurchargeInput { """ The net amount as a positive number; a discount is subtracted, a surcharge added """ amount: Float """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Its place in the document's list of discounts and surcharges, counted from 0 """ index: Int! """ The draft quotation or invoice to change """ recordId: ID! title: String type: DiscountSurchargeTypeEnum } """ Autogenerated return type of UpdateDiscountSurcharge. """ type UpdateDiscountSurchargePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String discountSurcharge: JSON errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of UpdateDocumentTemplate """ input UpdateDocumentTemplateInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ null: offer it for every customer """ customerId: ID """ Replace the template's content with this quotation's or invoice's """ documentId: ID id: ID! name: String """ An internal note on what the template is for """ note: String } """ Autogenerated return type of UpdateDocumentTemplate. """ type UpdateDocumentTemplatePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String documentTemplate: DocumentTemplate errors: Json } """ Autogenerated input type of UpdateExternalCost """ input UpdateExternalCostInput { """ Net, in the workspace's currency """ amount: Float """ Always send all positions, since using this argument will replace the whole collection """ assignmentsAttributes: [ExternalCostAssignmentInput!] """ The supplier's invoice file: the id of a file uploaded through /api/upload. Required on create; on update it replaces the file. """ blobId: ID """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The invoice's currency, where it is not the workspace's """ currency: Currency id: ID! """ Omitted on a new cost: taken from the workspace's VAT status on the invoice date """ inputTaxDeductible: Boolean invoiceDate: ISO8601Date invoiceNumber: String """ Net in the invoice's currency; `amount` is then the net in the workspace's (omitted: at the ECB rate of the invoice date) """ originalAmount: Float """ true: the cost is split over several assignments; false: it goes to one quotation as a whole """ partialAmount: Boolean """ One of several invoices from the supplier for the same job """ partialBill: Boolean """ Another cost of the same supplier this one belongs with: both join one group (see relatedCosts). An empty string takes it out """ relatedCostId: String status: ExternalCostStatus supplierId: ID """ The VAT amount as the invoice states it; omitted, it is worked out from amount and rate """ tax: Float """ In percent """ taxRate: Float """ The responsible person; they get an email when it is set or changed """ userId: ID } """ Autogenerated return type of UpdateExternalCost. """ type UpdateExternalCostPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json externalCost: ExternalCost } """ Autogenerated input type of UpdateInvoiceComment """ input UpdateInvoiceCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The invoice to comment on; needed when creating, ignored when updating """ invoiceId: ID } """ Autogenerated return type of UpdateInvoiceComment. """ type UpdateInvoiceCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoiceComment: InvoiceComment } """ Autogenerated input type of UpdateInvoice """ input UpdateInvoiceInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The content: the whole list of blocks, each with its positions and their lines. Replaces what is there; only in a draft """ blocks: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ Values for the workspace's custom fields; they are shared by all documents of the billing cycle """ customFields: [AccountingCustomFieldInput!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date """ How to read deductionValue: percentage_amount or fixed_amount. Advance payments only """ deductionType: String """ An advance payment's share of the job: a percentage (above 0, up to 100) or a net amount, as deductionType says """ deductionValue: Float """ The date of delivery or service printed on the invoice; today when omitted on creation """ deliveryDate: ISO8601Date description: String """ The whole list of discounts and surcharges, each with type (discount or surcharge), title and amount (net). Only in a draft """ discountSurcharge: Json footer: String id: ID! invoiceType: InvoiceTypeEnum """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The invoice number. Leave it out: publishing assigns the next one in the workspace's sequence """ number: Int showPositionSubtotal: Boolean """ Only PUBLISHED can be set, in updateInvoice and by admins; every other status change has its own mutation """ status: InvoiceStatus """ The VAT rate lines use unless they set their own; fixed once the document leaves draft """ taxRate: Float } """ Autogenerated return type of UpdateInvoice. """ type UpdateInvoicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice } """ Autogenerated input type of UpdateJiraConnection """ input UpdateJiraConnectionInput { """ Empty or omitted: the stored token is kept """ apiToken: String """ A unique identifier for the client performing the mutation. """ clientMutationId: String createPlaceholderUsers: Boolean email: String id: ID! name: String """ The service new placeholder users book with; without one none are created """ placeholderServiceId: ID siteUrl: String """ Taken as it is, without checking the credentials; DISABLED pauses the connection """ status: JiraConnectionStatus """ Empty or omitted: the stored token is kept """ tempoApiToken: String worklogBackend: JiraWorklogBackend } """ Autogenerated return type of UpdateJiraConnection. """ type UpdateJiraConnectionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraConnection: JiraSite } """ Autogenerated input type of UpdateJiraProjectLink """ input UpdateJiraProjectLinkInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String convertWorklogs: Boolean defaultServiceId: ID id: ID! importForeignWorklogs: Boolean pushWorklogs: Boolean """ The epics to mirror, for scopeKind EPICS; replaces the whole list """ scopeEpics: [JiraEpicRefInput!] scopeKind: JiraScopeKind ticketsMode: JiraTicketsMode } """ Autogenerated return type of UpdateJiraProjectLink. """ type UpdateJiraProjectLinkPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraProjectLink: JiraProjectLink } """ Autogenerated input type of UpdateNotificationByRecords """ input UpdateNotificationByRecordsInput { archived: Boolean! """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ false marks them as read, true as unread """ isNew: Boolean! records: [NotificationRecordInput!]! } """ Autogenerated return type of UpdateNotificationByRecords. """ type UpdateNotificationByRecordsPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json notifications: [Notification!]! } """ Autogenerated input type of UpdateOrderConfirmationComment """ input UpdateOrderConfirmationCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The order confirmation to comment on; needed when creating, ignored when updating """ orderConfirmationId: ID } """ Autogenerated return type of UpdateOrderConfirmationComment. """ type UpdateOrderConfirmationCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmationComment: OrderConfirmationComment } """ Autogenerated input type of UpdateOrderConfirmation """ input UpdateOrderConfirmationInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ Values for the workspace's custom fields; they are shared by all documents of the billing cycle """ customFields: [AccountingCustomFieldInput!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date description: String footer: String id: ID! """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The order confirmation's running number within its project; the next free one when omitted """ number: Int showPositionSubtotal: Boolean status: OrderConfirmationStatus @deprecated(reason: "Refused unless unchanged: a document's status moves through its own mutations (publish, draft, …).") } """ Autogenerated return type of UpdateOrderConfirmation. """ type UpdateOrderConfirmationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json orderConfirmation: OrderConfirmation } """ Autogenerated input type of UpdatePhase """ input UpdatePhaseInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String """ ISO 8601 date (YYYY-MM-DD) """ endDate: String id: ID! projectId: ID """ ISO 8601 date (YYYY-MM-DD) """ startDate: String title: String } """ Autogenerated return type of UpdatePhase. """ type UpdatePhasePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json phase: Phase } """ Autogenerated input type of UpdatePinnedPages """ input UpdatePinnedPagesInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String pages: [PinnedPageInput!]! } """ Autogenerated return type of UpdatePinnedPages. """ type UpdatePinnedPagesPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json pinnedPages: [PinnedPage!] } """ Autogenerated input type of UpdateProject """ input UpdateProjectInput { archived: Boolean """ The budget in the unit of `budgetType`: minutes, or an amount in the workspace's currency """ budgetRate: Float budgetType: ProjectBudget """ A unique identifier for the client performing the mutation. """ clientMutationId: String customerId: ID deadline: ISO8601Date description: String id: ID! """ Project number, unique in the workspace. Default: the next free number """ number: Int """ Whether hours beyond the contingent (a budget of hours per month) are billed on top of the fee. Default: true """ retainerBillsOverage: Boolean """ The hours one fee covers, in minutes per period (month or quarter). Null: the budget stands in when it is hours per month """ retainerContingentMinutes: Int """ The last day of the retainer; null for an open-ended one """ retainerEndsOn: ISO8601Date """ The retainer's fee per period (month or quarter), net, in the workspace's currency """ retainerFee: Float """ 1: billed monthly (default); 3: billed quarterly, counted from the month it starts in """ retainerIntervalMonths: Int """ The notice period in months """ retainerNoticeMonths: Int """ The first day of the retainer. A project with a start is a retainer; null ends it (invoices written stay) """ retainerStartsOn: ISO8601Date """ The project's own daily rates, replacing all it had. `id` is a rate's id as `serviceRates` returns it (it ends in the service's id) """ serviceRates: [ServiceRateInput!] status: ProjectStatus """ Since when the project has its status. Set to today whenever the status changes """ statusDate: ISO8601Date """ The users who manage the project; at least one. On update: the whole list, users left out are removed """ supervisorIds: [ID!] title: String """ true: time already booked on services whose rate changed is repriced at the new rate """ updateTimetrackings: Boolean } """ Autogenerated input type of UpdateProjectLabel """ input UpdateProjectLabelInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Hex colour code: #rgb or #rrggbb """ color: String description: String id: ID! projectId: ID title: String } """ Autogenerated return type of UpdateProjectLabel. """ type UpdateProjectLabelPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json projectLabel: ProjectLabel } """ Autogenerated return type of UpdateProject. """ type UpdateProjectPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project } """ Autogenerated input type of UpdateQuotationComment """ input UpdateQuotationCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment as a rich-text document in the editor's JSON format (Tiptap/ProseMirror) """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ The quotation to comment on; needed when creating, ignored when updating """ quotationId: ID } """ Autogenerated return type of UpdateQuotationComment. """ type UpdateQuotationCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotationComment: QuotationComment } """ Autogenerated input type of UpdateQuotation """ input UpdateQuotationInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The content: the whole list of blocks, each with its positions and their lines. Replaces what is there; only in a draft """ blocks: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's contacts the document names; replaces the whole list """ contactCustomerIds: [ID!] """ The workspace's users named as contacts on the document; replaces the whole list """ contactInternalIds: [ID!] """ Values for the workspace's custom fields; they are shared by all documents of the billing cycle """ customFields: [AccountingCustomFieldInput!] """ One of the customer's addresses; the document is made out to it """ customerAddressId: ID date: ISO8601Date description: String """ The whole list of discounts and surcharges, each with type (discount or surcharge), title and amount (net). Only in a draft """ discountSurcharge: Json footer: String id: ID! """ The language the document is printed in, as a locale code: de (the default) or en """ language: String name: String """ The quotation's running number within its project; the next free one when omitted """ number: Int showPositionSubtotal: Boolean status: QuotationStatus @deprecated(reason: "Refused unless unchanged: a document's status moves through its own mutations (publish, draft, …).") """ The VAT rate lines use unless they set their own; fixed once the document leaves draft """ taxRate: Float } """ Autogenerated return type of UpdateQuotation. """ type UpdateQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of UpdateServiceCategory """ input UpdateServiceCategoryInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! title: String } """ Autogenerated return type of UpdateServiceCategory. """ type UpdateServiceCategoryPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json serviceCategory: ServiceCategory } """ Autogenerated input type of UpdateService """ input UpdateServiceInput { archived: Boolean """ Whether time booked on this service is billed to the customer """ billable: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Net, in the workspace's currency """ dailyRate: Float """ The VAT rate in percent a document line of this service starts with; null = the document's """ defaultTaxRate: Float description: String id: ID! serviceCategoryId: ID title: String """ true: time already booked on this service is repriced with the new rate, in the background """ updateTimetrackings: Boolean } """ Autogenerated return type of UpdateService. """ type UpdateServicePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json service: Service } """ Autogenerated input type of UpdateSharedProjectReport """ input UpdateSharedProjectReportInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Last day the link works; null: no end """ expiresOn: ISO8601Date id: ID! projectId: ID """ Shows the budget and the revenue of the time entries """ showBudget: Boolean """ Shows who booked the time """ showExecutive: Boolean """ Adds the list of the project's tickets. Default: false """ showTickets: Boolean } """ Autogenerated return type of UpdateSharedProjectReport. """ type UpdateSharedProjectReportPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json project: Project sharedProjectReport: SharedProjectReport } """ Autogenerated input type of UpdateStopwatch """ input UpdateStopwatchInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ Sets the clock, in seconds (at most 7 days). A running stopwatch keeps running from there """ seconds: Int """ null detaches the ticket """ ticketId: ID title: String } """ Autogenerated return type of UpdateStopwatch. """ type UpdateStopwatchPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json stopwatch: Stopwatch stopwatches: [Stopwatch!]! } """ Autogenerated input type of UpdateSupplier """ input UpdateSupplierInput { archived: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The supplier's own account (creditor number) in DATEV; empty = the collective account """ datevAccount: String id: ID! """ Subject to the German artists' social insurance levy (KSK), which is then shown on each of their invoices """ ksk: Boolean taxTreatment: SupplierTaxTreatment title: String } """ Autogenerated return type of UpdateSupplier. """ type UpdateSupplierPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json supplier: Supplier } """ Autogenerated input type of UpdateTicketComment """ input UpdateTicketCommentInput { authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The comment's text. As a Tiptap (ProseMirror) document in JSON: { type: 'doc', content: […] } """ body: Json """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! """ Plain text instead of `body`: blank lines separate paragraphs, single line breaks stay line breaks. Ignored when `body` is sent """ text: String ticketId: ID } """ Autogenerated return type of UpdateTicketComment. """ type UpdateTicketCommentPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticketComment: TicketComment } """ Autogenerated input type of UpdateTicket """ input UpdateTicketInput { """ Users who can open the project. On update: the whole list, users left out are unassigned """ assigneeIds: [ID!] authorId: ID @deprecated(reason: "Ignored: the author is always the signed-in user.") """ The column of the project's kanban board. Default: Backlog for an open ticket, Done for a closed one """ boardId: ID """ The ticket's description. As a Tiptap (ProseMirror) document in JSON: { type: 'doc', content: […] } """ body: Json """ The budget in the unit of `budgetType`: minutes, or an amount in the workspace's currency """ budgetRate: Float """ Ignored, like `budgetRate`, unless the caller sees financial data (project managers and admins) """ budgetType: TicketBudget """ A unique identifier for the client performing the mutation. """ clientMutationId: String endDate: ISO8601Date id: ID! """ Labels of the ticket's project. On update: the whole list, labels left out are removed """ labelIds: [ID!] """ Ignored on create: a new ticket gets the next number in its project """ number: Int phaseId: ID priority: TicketPriority projectId: ID serviceCategoryId: ID startDate: ISO8601Date """ Default: OPEN. A ticket created with `boardId` takes that column's status instead """ status: TicketStatus """ Plain text instead of `body`: blank lines separate paragraphs, single line breaks stay line breaks. Ignored when `body` is sent """ text: String title: String } """ Autogenerated return type of UpdateTicket. """ type UpdateTicketPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json ticket: Ticket } """ Autogenerated input type of UpdateTimetracking """ input UpdateTimetrackingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String date: ISO8601Date description: String """ In minutes, in steps of 15 """ duration: Float id: ID! projectId: ID """ The kind of work; the entry is priced at the project's rate for it """ serviceId: ID """ A ticket of the project in `projectId` """ ticketId: ID """ Whose time it is. Default on create: the caller. Only admins may name someone else """ userId: ID } """ Autogenerated return type of UpdateTimetracking. """ type UpdateTimetrackingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json timetracking: Timetracking } """ Autogenerated input type of UpdateUser """ input UpdateUserInput { """ An archived user can't sign in; their sessions and API keys stop working. Admins only, never on themselves. """ archived: Boolean """ A PNG or JPEG as a data URL, at most 2 MB """ avatar: String birthday: ISO8601Date """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Required to change one's own email or password """ currentPassword: String """ The customers the person is assigned to; replaces the whole list. Admins only. """ customerAssignmentsIds: [ID!] dashboardRssEnabled: Boolean dashboardRssExcerpt: Boolean dashboardRssUrl: String """ Admins, or the person themselves with currentPassword """ email: String entryDate: ISO8601Date firstname: String id: ID! initial: String lastname: String """ Language of the person's emails and sign-in pages; null = the workspace's default. Only the person themselves. """ locale: Locale """ Admins, or the person themselves with currentPassword """ password: String passwordConfirmation: String """ The projects the person is assigned to; replaces the whole list. Admins only. """ projectAssignmentsIds: [ID!] """ Admins only, never on themselves """ role: UserRole """ The service the person's time is booked with by default """ serviceId: ID settings: Json username: String } """ Autogenerated return type of UpdateUser. """ type UpdateUserPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json user: User } """ Autogenerated input type of UpdateUserWorkTime """ input UpdateUserWorkTimeInput { """ The first day the profile applies; required, one profile per user and day """ activeFrom: ISO8601Date """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Target working hours on Fridays """ fri: Float id: ID! """ Target working hours on Mondays """ mon: Float """ Target working hours on Saturdays """ sat: Float """ Target working hours on Sundays """ sun: Float """ Target working hours on Thursdays """ thu: Float """ Target working hours on Tuesdays """ tue: Float userId: ID """ Target working hours on Wednesdays """ wed: Float } """ Autogenerated return type of UpdateUserWorkTime. """ type UpdateUserWorkTimePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json userWorkTime: UserWorkTime } """ Autogenerated input type of UpdateWebhookEndpoint """ input UpdateWebhookEndpointInput { """ false pauses the deliveries """ active: Boolean """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ Replaces the whole list """ events: [String!] id: ID! url: String } """ Autogenerated return type of UpdateWebhookEndpoint. """ type UpdateWebhookEndpointPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json webhookEndpoint: WebhookEndpoint } """ Autogenerated input type of UploadConfirmationFileToQuotation """ input UploadConfirmationFileToQuotationInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The customer's signed confirmation as a data URL (data:application/pdf;base64,...): a PDF of at most 2 MB """ confirmationFile: String """ The file name to store the confirmation under """ confirmationFilename: String id: ID! } """ Autogenerated return type of UploadConfirmationFileToQuotation. """ type UploadConfirmationFileToQuotationPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json quotation: Quotation } """ Autogenerated input type of UploadDocumentFont """ input UploadDocumentFontInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The font file as a data URL """ file: String! filename: String! id: ID! licenseConfirmed: Boolean! style: DocumentFontStyle! } """ Autogenerated return type of UploadDocumentFont. """ type UploadDocumentFontPayload { account: Account """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ Autogenerated input type of UpsertJiraUserCredential """ input UpsertJiraUserCredentialInput { apiToken: String! """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The caller's Atlassian account """ email: String! """ Omitted: the default credential, used for every connection the account can reach """ jiraConnectionId: ID } """ Autogenerated return type of UpsertJiraUserCredential. """ type UpsertJiraUserCredentialPayload { checks: [JiraCredentialCheck!] """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraUserCredential: JiraUserCredential } """ Autogenerated input type of UpsertJiraUserMapping """ input UpsertJiraUserMappingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String displayName: String """ The person's Atlassian accountId on that site """ jiraAccountId: String! jiraConnectionId: ID! userId: ID! } """ Autogenerated return type of UpsertJiraUserMapping. """ type UpsertJiraUserMappingPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraUserMapping: JiraUserMapping } """ Autogenerated input type of UseDocumentTemplate """ input UseDocumentTemplateInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! projectId: ID! } """ Autogenerated return type of UseDocumentTemplate. """ type UseDocumentTemplatePayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json invoice: Invoice quotation: Quotation } """ Autogenerated input type of UseLatestServiceRatesInAccounting """ input UseLatestServiceRatesInAccountingInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String """ The billing cycle (accounting) of a project """ id: ID! } """ Autogenerated return type of UseLatestServiceRatesInAccounting. """ type UseLatestServiceRatesInAccountingPayload { accounting: Accounting """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json } """ A person in the workspace. Everyone has exactly one role, which decides what they see and may do. """ type User implements Node { archived: Boolean! """ Customers the user is assigned to; for a timetracker they open the customers' projects """ assignedCustomers( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: CustomerFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): CustomerConnection! """ The same as projects """ assignedProjects( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ProjectFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectConnection! """ Path of the avatar image, cropped to a square of size pixels (default 256); null without one """ avatar(size: Int): String """ Null for timetrackers, unless it is their own. """ birthday: ISO8601Date """ All time booked by this user, in minutes. 0 for timetrackers, unless it is their own. """ bookedMinutes: Int! createdAt: ISO8601DateTime! """ Whether the user's dashboard shows an RSS feed """ dashboardRssEnabled: Boolean! """ Whether that feed shows an excerpt of each item """ dashboardRssExcerpt: Boolean! dashboardRssUrl: String email: String! """ The day the person joined the agency. Null for timetrackers, unless it is their own. """ entryDate: ISO8601Date """ The user's own service: what their time is booked for unless another is chosen """ expertise: Service firstname: String! """ The longest day, in hours, that a working-time profile valid in the month of that date plans; null as for workTimeForMonth """ highestWorkTimeInMonth(date: ISO8601Date!): Float """ The longest day, in hours, that a working-time profile valid in the week of that date plans; null as for workTimeForWeek """ highestWorkTimeInWeek(date: ISO8601Date!): Float id: ID! """ Short code shown where space is tight """ initial: String! """ A stand-in for a Jira author without a docket account: archived, cannot sign in; its time counts like anyone's """ jiraPlaceholder: Boolean! """ The Jira accounts mapped to this user. Empty unless you are the user or an admin. """ jiraUserMappings: [JiraUserMapping!]! lastname: String! """ The user's own language for emails and sign-in pages; null when it follows the workspace, and unless you are this user or an admin """ locale: Locale """ Projects the user is assigned to (project assignments) """ projects( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ProjectFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectConnection! role: UserRole! """ Preferences the app stores for the user (free-form JSON). Null unless you are this user or an admin. """ settings: Json slug: String! """ Target working hours on that day, from the profile valid then (null: none) """ targetHours(date: ISO8601Date!): Float """ Tickets assigned to the user """ tickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TimetrackingConnection! """ Whether two-factor sign-in is on; null unless you are this user or an admin """ twoFactorEnabled: Boolean updatedAt: ISO8601DateTime! username: String! """ Whether the caller may change this user's role and archive them: admins, never for themselves """ viewerCanManageAccess: Boolean! """ Target working hours in the month of that date, from the working-time profiles valid then; null when none, and unless you are this user or at least a basic user """ workTimeForMonth(date: ISO8601Date!): Float """ Target working hours in the week of that date; null when none, and unless you are this user or at least a basic user """ workTimeForWeek(date: ISO8601Date!): Float """ The user's working-time profiles: target hours per weekday, each valid from a date """ workTimes( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: UserWorkTimeFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): UserWorkTimeConnection! """ The workspace's language, which locale falls back to; null unless you are this user or an admin """ workspaceLocale: Locale } """ The connection type for User. """ type UserConnection { count: Int! """ A list of edges. """ edges: [UserEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [User!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type UserEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: User! } input UserFilter { archived: Boolean """ Dates of birth as "1990-05-17" or with a comparison (">=1990-01-01"); several values must all hold. "NULL" finds people without a birthday on file, "NOT NULL" those with one """ birthdays: [String!] """ Only users who can open billing documents """ canAccessDocuments: Boolean """ Only users who can open this project (ID or slug) """ canAccessProject: ID ids: [ID!] """ Leaves out these users """ idsNot: [ID!] """ Only (true) or no (false) Jira placeholder users; left out, placeholders are not listed """ jiraPlaceholder: Boolean """ People whose first or last name contains this text """ search: String """ The exact username """ username: String """ List the Jira placeholder users too (they're archived, so with archived: false this means active users plus placeholders) — for filters over booked time """ withJiraPlaceholders: Boolean } enum UserRole { """ Everything: publishes invoices, corrects anyone's time entries, manages users, customers, services, suppliers, integrations and the workspace's settings. """ ADMIN """ The default for team members: sees all projects and tickets and the time booked on them, books time and changes only their own entries. No financial data; of a budget only how much is used. """ BASIC """ Project manager: everything BASIC can, plus financial data (rates, revenue, budgets), the billing documents and external costs, and creating projects and changing their settings. Prepares invoices but cannot publish them. """ PM """ For freelancers and externals: sees only the projects they are assigned to (directly or through the customer) and only their own time. No financial data. """ TIMETRACKER } type UserWorkTime implements Node { activeFrom: ISO8601Date! createdAt: ISO8601DateTime! fri: Float! id: ID! mon: Float! sat: Float! sun: Float! thu: Float! tue: Float! updatedAt: ISO8601DateTime! user: User! wed: Float! } """ The connection type for UserWorkTime. """ type UserWorkTimeConnection { count: Int! """ A list of edges. """ edges: [UserWorkTimeEdge!]! max(field: String!): Float min(field: String!): Float """ A list of nodes. """ nodes: [UserWorkTime!]! """ Information to aid in pagination. """ pageInfo: PageInfo! sum(field: String!): Float totalCount: Int! } """ An edge in a connection. """ type UserWorkTimeEdge { """ A cursor for use in pagination. """ cursor: String! """ The item at the end of the edge. """ node: UserWorkTime! } input UserWorkTimeFilter { """ Only the working hours in force on this day (the latest that started on or before it) """ date: ISO8601Date """ true = only the working hours in force today (the latest that started on or before today) """ limitCurrentWeek: Boolean } input UserWorkTimeInput { activeFrom: ISO8601Date fri: Float mon: Float sat: Float sun: Float thu: Float tue: Float userId: ID wed: Float } """ Autogenerated input type of ValidateBlockPositionSubposition """ input ValidateBlockPositionSubpositionInput { """ For a flatrate line: the net price """ amount: Float """ A unique identifier for the client performing the mutation. """ clientMutationId: String description: String id: String """ The label of a custom or flatrate line """ name: String """ Offered as an option: printed, but not counted into the total """ optional: Boolean """ How many units; for a service line, hours or days """ quantity: Float """ For a custom line: the net price per unit """ rate: Float """ The quotation or invoice the line is meant for; its project's rates price the line """ recordId: ID! """ Whether the line is the agency's own work or an external service """ service: BlockPositionSubpositionServiceEnum """ For a service line: the service's id as the document's billing cycle lists its rates (a__) """ serviceId: String """ VAT rate in percent; omit for the document's rate """ taxRate: Float """ service: time of a service at the project's rate; custom: a free line with rate and quantity; flatrate: a fixed amount """ type: BlockPositionSubpositionTypeEnum """ For a service line hours or days (a day is 8 hours); for a custom line any unit to print """ unit: String } """ Autogenerated return type of ValidateBlockPositionSubposition. """ type ValidateBlockPositionSubpositionPayload { """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json subposition: BlockPositionSubposition } type VatStatus implements Node { createdAt: ISO8601DateTime! id: ID! """ Why it can't be deleted, or null when it can """ lockReason: String """ Documents were issued or external costs recorded in its period: it can't be deleted any more """ locked: Boolean! smallBusiness: Boolean! updatedAt: ISO8601DateTime! validFrom: ISO8601Date! } """ Autogenerated input type of VerifyJiraUserCredential """ input VerifyJiraUserCredentialInput { """ A unique identifier for the client performing the mutation. """ clientMutationId: String id: ID! } """ Autogenerated return type of VerifyJiraUserCredential. """ type VerifyJiraUserCredentialPayload { checks: [JiraCredentialCheck!] """ A unique identifier for the client performing the mutation. """ clientMutationId: String errors: Json jiraUserCredential: JiraUserCredential } """ The signed-in person; with an API key, the key's owner. Everything here is that person's own. """ type Viewer implements Node { archived: Boolean! """ The tickets assigned to the person, open and closed, in projects that are not archived. On a project whose tickets come from Jira only the Jira tickets count. """ assignedTickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! createdAt: ISO8601DateTime! email: String! """ The person's own service: the kind of work their time entries default to """ expertise: Service firstname: String! """ The tickets the person follows and may open, in projects that are not archived. On a project whose tickets come from Jira only the Jira tickets count. """ followedTickets( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TicketFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): TicketConnection! id: ID! """ The person's short sign, e.g. initials, shown on avatars """ initial: String! lastname: String! """ The person's notification inbox, newest first: one entry per record and event, standing for all notifications of that kind. Only the filters isNew and archived apply here, and orderBy has no effect. """ notificationStream( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: NotificationFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): NotificationConnection! """ Pages pinned to the sidebar """ pinnedPages: [PinnedPage!]! """ The projects the person is assigned to or has a ticket assigned in, archived ones included unless filtered. """ projectsInvolved( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: ProjectFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] ): ProjectConnection! """ The tickets the person last booked time on, latest first: only tickets of projects that are not archived and that time can still be booked on. """ recentlyTrackedTickets( """ How many tickets at most """ count: Int! ): [Ticket!]! """ The highest role the person holds; it decides what every query returns to them """ role: UserRole! """ The RSS feed the person put on their dashboard; null when they have none switched on """ rssFeed: RssFeed """ Interface state the app keeps for the person (e.g. whether the sidebar is open), as free-form JSON """ settings: Json slug: String! """ The descriptions the person used for earlier time entries on a ticket, latest first, without duplicates. """ timetrackingSuggestions( """ Without a ticket the list is empty """ ticketId: ID ): [String!]! """ The person's own time entries. """ timetrackings( """ Returns the elements in the list that come after the specified cursor. """ after: String """ Returns the elements in the list that come before the specified cursor. """ before: String """ Narrows the list; every filter given must match. In a list of IDs or statuses, a value with a leading "!" excludes what it names, e.g. ["!"]. """ filter: TimetrackingFilter """ Returns the first _n_ elements from the list. """ first: Int """ Returns the last _n_ elements from the list. """ last: Int """ Sort order, applied in sequence: field names of the listed type, descending with a leading "-", e.g. ["-date", "title"]. A field of a record it belongs to is written "project.number". Text sorts case-insensitively. Unknown fields are ignored, as are money fields for callers who may not see financial data. """ orderBy: [String!] """ Page number, starting at 1. Only takes effect together with perPage. The cursor arguments (first/after) page through the same list instead. """ page: Int """ How many records a page holds. Without page: the first perPage records. On a paged list, count and sum only see the page: ask for totals in a second field without perPage. """ perPage: Int ): TimetrackingConnection! """ Unread notifications that mention the viewer """ unreadMentionCount: Int! """ Unread notifications that are not archived, counted once per record and event: three new comments on one ticket count as one """ unreadNotificationCount: Int! updatedAt: ISO8601DateTime! username: String! } type WebhookDelivery { attempts: Int! createdAt: ISO8601DateTime! deliveredAt: ISO8601DateTime error: String event: String! id: ID! responseCode: Int """ pending, delivered or failed """ status: String! } type WebhookEndpoint { active: Boolean! createdAt: ISO8601DateTime! """ The latest twenty deliveries, newest first """ deliveries: [WebhookDelivery!]! """ When docket switched it off after too many failures """ disabledAt: ISO8601DateTime events: [String!]! """ Deliveries given up on in a row """ failureCount: Int! id: ID! """ Signs every delivery (X-Docket-Signature). Not readable with an API key """ secret: String url: String! } type WorkloadCounts { """ Of thisWeek: due this week """ dueThisWeek: Int! later: Int! nextMonth: Int! overdue: Int! thisMonth: Int! thisWeek: Int! unplanned: Int! } type WorkloadGroup { category: ServiceCategory rows: [WorkloadRow!]! subtotals: WorkloadCounts! total: Int! } type WorkloadOverview { groups: [WorkloadGroup!]! max: Int! total: Int! totals: WorkloadCounts! unassigned: WorkloadRow! } type WorkloadRow { assignee: User counts: WorkloadCounts! total: Int! } type WorkspaceExport { """ Size of the ZIP in bytes, once it is ready """ byteSize: Int createdAt: ISO8601DateTime! """ The app's download link (it checks the session again) — null unless the export is ready and not expired """ downloadUrl: String expiresAt: ISO8601DateTime id: ID! status: WorkspaceExportStatus! } enum WorkspaceExportStatus { """ Building the ZIP failed; a new export can be requested """ FAILED """ Requested, waiting for the export job """ PENDING """ The ZIP is being built """ PROCESSING """ The ZIP can be downloaded (until expiresAt) """ READY }