enum AbacusWorksheetAdjApplyFlowthroughPayment {
    NO
    NONE
    YES
}
type AbacusWorksheetAdjustmentDetail {
    account: AbacusAccount!
    activityStatementPeriod: AbacusStatementPeriod!
    amount: String!
    applyToFlowthroughPayment: Boolean
    applyToStatementPeriod: AbacusStatementPeriod!
    contract: AbacusContract
    currencyCode: String!
    distributionType: String!
    internalNote: String
    note: String
    referenceAdjustmentType: ReferenceAdjustmentType!
    statementPeriodAdjustmentFile: AbacusStatementPeriodAdjustmentFile!
    upc: String!
    worksheetAdjustment: AbacusWorksheetAdjustment!
    worksheetAdjustmentDetailId: ID!
}

type AbacusWorksheetAdjustmentAndDetail {
    account: AbacusAccount!
    activityStatementPeriod: AbacusStatementPeriod!
    adjustmentAmount: String!
    adjustmentCurrencyCode: String!
    applyToFlowthroughPayment: Boolean
    applyToStatementPeriod: AbacusStatementPeriod!
    contract: AbacusContract
    deletedAt: String
    deletedBy: String
    distributionType: String
    internalNote: String
    note: String
    referenceAdjustmentType: ReferenceAdjustmentType!
    statementPeriodAdjustmentFile: AbacusStatementPeriodAdjustmentFile!
    upc: String
    worksheetAdjustmentDetailId: ID
    worksheetAdjustmentId: ID!
}

type AbacusWorksheetAdjustment @key(fields: "worksheetAdjustmentId") {
    account: AbacusAccount!
    activityStatementPeriod: AbacusStatementPeriod!
    adjustmentAmount: String!
    adjustmentCurrencyCode: String!
    applyToFlowthroughPayment: Boolean
    applyToStatementPeriod: AbacusStatementPeriod!
    contract: AbacusContract
    details(limit: Int = 100, offset: Int = 0): AbacusWorksheetAdjustmentDetails
    internalNote: String
    note: String
    referenceAdjustmentType: ReferenceAdjustmentType!
    statementPeriodAdjustmentFile: AbacusStatementPeriodAdjustmentFile!
    worksheetAdjustmentId: String!
}

type AbacusWorksheetAdjustmentAccount {
    account: AbacusAccount!
}

type AbacusWorksheetAdjustmentContract {
    contract: AbacusContract!
}

type AbacusWorksheetAdjustments {
    items: [AbacusWorksheetAdjustment],
    totalCount: Int
}

type AbacusWorksheetAdjustmentDetails {
    items: [AbacusWorksheetAdjustmentDetail],
    totalCount: Int
}

type AbacusWorksheetAdjustmentsAndDetails {
    items: [AbacusWorksheetAdjustmentAndDetail]!,
    totalCount: Int!
}

"""
Whole-file aggregate of soft-deleted entries only. currencyAgnosticDeletedAmount
sums across currencies (not a real money total).
"""
type AbacusWorksheetAdjustmentsDeletedAggregate {
    currencyAgnosticDeletedAmount: String!
    deletedCount: Int!
}

type AbacusWorksheetAdjustmentsAccounts {
    items: [AbacusWorksheetAdjustmentAccount]!,
    totalCount: Int!
}

type AbacusWorksheetAdjustmentsContracts {
    items: [AbacusWorksheetAdjustmentContract]!,
    totalCount: Int!
}

input AbacusWorksheetAdjustmentsAccountsFilterInput {
    accountSearchTerm: String
}

input AbacusWorksheetAdjustmentsContractsFilterInput {
    contractSearchTerm: String
}

input AbacusWorksheetAdjustmentsAndDetailsSearchFilterInput {
    accountIds: [ID!]
    applyToFlowthroughPayment: [AbacusWorksheetAdjApplyFlowthroughPayment!]
    contractIds: [ID!]
    """
    Deletion filter, forwarded to the backend as-is: "false" (active only,
    default), "true" (deleted only), or "all" (both). The backend BooleanFilter
    parses it and is the single source of validation; it also accepts common
    truthy/falsy spellings.
    """
    isDeleted: String
}

extend type Mutation {
    abacusWorksheetAdjustmentAndDetailsImport(statementPeriodAdjustmentFileId: ID!): AbacusImportResponse!
    abacusSoftDeleteWorksheetAdjustmentAndDetails(statementPeriodAdjustmentFileId: ID!): AbacusSoftDeleteResponse!
    abacusSoftDeleteWorksheetAdjustments(worksheetAdjustmentIds: [ID!]!): AbacusSoftDeleteResponse!
    abacusRestoreWorksheetAdjustments(worksheetAdjustmentIds: [ID!]!): AbacusRestoreResponse!
}

extend type Query {
    abacusWorksheetAdjustments(
        statementPeriodAdjustmentFileId: ID!,
        limit: Int = 100,
        offset: Int = 0
    ): AbacusWorksheetAdjustments!
    abacusWorksheetAdjustmentDetails(
        worksheetAdjustmentId: ID!,
        limit: Int = 100,
        offset: Int = 0
    ): AbacusWorksheetAdjustmentDetails!
    abacusWorksheetAdjustmentsAndDetails(
        statementPeriodAdjustmentFileId: ID!,
        limit: Int! = 100,
        offset: Int! = 0,
        filters: AbacusWorksheetAdjustmentsAndDetailsSearchFilterInput
    ): AbacusWorksheetAdjustmentsAndDetails!,
    abacusWorksheetAdjustmentsAccounts(
        statementPeriodAdjustmentFileId: ID!,
        limit: Int! = 100,
        offset: Int! = 0,
        filters: AbacusWorksheetAdjustmentsAccountsFilterInput
    ): AbacusWorksheetAdjustmentsAccounts!
    abacusWorksheetAdjustmentsContracts(
        statementPeriodAdjustmentFileId: ID!,
        limit: Int! = 100,
        offset: Int! = 0,
        filters: AbacusWorksheetAdjustmentsContractsFilterInput
    ): AbacusWorksheetAdjustmentsContracts!
}
