type Query { """Hent alle organisasjoner for innlogget bruker""" organizations: [Organization!]! """ Månedssammendrag - viser budsjett vs faktisk for en gitt måned. Tilsvarer dashbordet i appen. """ dashboard(organizationId: ID!, year: Int!, month: Int!): Dashboard! """Kontoplan med saldo og budsjett for et gitt år""" accounts(organizationId: ID!, year: Int!): [AccountSummary!]! """ Resultatregnskap - inntekter og utgifter gruppert per kategori. Valgfri månedlig nedbrytning. """ profitAndLoss(organizationId: ID!, year: Int!): [AccountGroupReport!]! """Balanse - eiendeler og gjeld per dato.""" balance(organizationId: ID!, year: Int!): [AccountGroupReport!]! """Transaksjoner for en konto, med løpende saldo""" transactions(organizationId: ID!, year: Int!, accountId: ID!): TransactionList! """Alle transaksjoner for et år (alle konti)""" allTransactions(organizationId: ID!, year: Int!): [TransactionDetail!]! """Hent alle tilbakemeldinger / issues""" feedbackItems(status: String): [FeedbackItem!]! """ Status for siste bank-synkronisering (cron-jobb). Viser om synkroniseringen var vellykket og eventuelle feil per bankkonto. """ syncStatus(organizationId: ID!): SyncStatus """ Banktransaksjoner for en konto og måned, med match-status og forslag. Krever at kontoen er koblet til en bankkonto via Nordigen. """ bankTransactions(organizationId: ID!, year: Int!, accountId: ID!, month: Int!): BankTransactionList! } type Mutation { """ Opprett en transaksjon med poster. Dobbelt bokholderi: entries bør summere til 0. """ createTransaction(input: CreateTransactionInput!): TransactionDetail! """Send tilbakemelding eller rapporter en feil""" createFeedback(input: CreateFeedbackInput!): FeedbackItem! """Lukk en tilbakemelding""" closeFeedback(id: ID!): FeedbackItem """ Hent banktransaksjoner fra Nordigen (via S3-cache). Filtrerer for angitt måned, lagrer til S3, og auto-bokfører transaksjoner med nøyaktig 1 forslag. """ fetchBankTransactions(organizationId: ID!, year: Int!, accountId: ID!, month: Int!): FetchBankTransactionsResult! """ Opprett en bokført transaksjon fra en banktransaksjon. Bestemmer debet/kredit basert på beløpets fortegn (negativt = ut fra bankkonto, positivt = inn til bankkonto). """ createTransactionFromBank(input: CreateTransactionFromBankInput!): TransactionDetail! """ Slett en transaksjon og alle tilhørende poster. Reverserer saldoendringer automatisk. Returnerer ID-en til den slettede transaksjonen. """ deleteTransaction(organizationId: ID!, year: Int!, id: ID!): DeleteTransactionPayload """ Opprett en ny konto i kontoplanen med budsjett. Beregneraarlig budsjett som (target - openingBalance) og fordeler det jevnt over gjenvaerende maaneder fra firstMonth. """ createAccount(input: CreateAccountInput!): CreateAccountPayload! """ Oppdater en eksisterende konto (navn, kode, aapningssaldo, maal, notater). Omberegner maanedlige budsjetter for gjenvaerende maaneder. """ updateAccount(input: UpdateAccountInput!): UpdateAccountPayload! """ Slett en konto. Kontoen maa ha deletable=true (ingen transaksjoner bokfoert paa den). """ deleteAccount(organizationId: ID!, year: Int!, accountId: ID!): DeleteAccountPayload! """ Oppdater maanedlig budsjett for en konto. Tre moduser: THIS_MONTH, THIS_MONTH_AS_ACTUAL, ALL_FOLLOWING_MONTHS. """ updateMonthlyBudget(input: UpdateMonthlyBudgetInput!): UpdateMonthlyBudgetPayload! } type DeleteTransactionPayload { deletedTransactionId: ID } type Organization { id: ID! name: String! years: [Int!]! } type Dashboard { month: Int! year: Int! """Inntekter og utgifter (resultatkonti 3xxx-8xxx)""" incomeAndExpenses: [DashboardGroup!]! """Eiendeler og gjeld (balansekonti 1xxx-2xxx)""" assetsAndLiabilities: [DashboardGroup!]! } type DashboardGroup { """F.eks. 'Inntekter', 'Faste regninger'""" name: String! """Kontokode-prefiks: 1, 2, 3, ... 8""" accountGroup: String! """Normalisering: 1 eller -1""" factor: Int! accounts: [DashboardAccount!]! """Sum planlagt for gruppen""" totalBudget: Float! """Sum faktisk for gruppen""" totalActual: Float! } type DashboardAccount { id: ID! name: String! sequence: String! """Budsjettert beløp for måneden""" budget: Float! """Faktisk beløp for måneden (normalisert med factor)""" actual: Float! """Prosentandel av budsjett brukt (0-100)""" budgetUsedPercent: Float """Startsaldo ved månedsskiftet (kun for balansekonti)""" openingBalance: Float } type AccountSummary { id: ID! name: String! sequence: String! """Kontokategori, f.eks. 'Eiendeler', 'Inntekter'""" category: String! """'balance' eller 'result'""" type: String! openingBalance: Float! closingBalance: Float! budget: Float! change: Float! } type AccountGroupReport { name: String! accountGroup: String! factor: Int! type: String! accounts: [AccountReportRow!]! """Total for gruppen""" total: Float! } type AccountReportRow { id: ID! name: String! sequence: String! openingBalance: Float! closingBalance: Float! change: Float! """Månedsvise endringer, index 0 = januar""" monthlyChanges: [Float!]! } type TransactionList { accountName: String! openingBalance: Float! """Transaksjoner ordnet etter dato med løpende saldo""" transactions: [TransactionWithBalance!]! } type TransactionWithBalance { id: ID! date: String! description: String! amount: Float! """Motkonto-navn""" otherAccountName: String! """Løpende saldo etter denne transaksjonen""" balance: Float! } type TransactionDetail { id: ID! date: String! description: String! entries: [TransactionEntryDetail!]! } type TransactionEntryDetail { accountId: ID! accountName: String! accountSequence: String! amount: Float! } input CreateTransactionInput { organizationId: ID! year: Int! date: String! description: String! entries: [TransactionEntryInput!]! } input TransactionEntryInput { accountId: ID! amount: Float! } type FeedbackItem { id: ID! createdAt: String! source: String! email: String! type: String! title: String! description: String! status: String! } type SyncStatus { """Tidspunkt for siste synkronisering""" timestamp: String! organizationId: ID! """Status per bankkonto""" accounts: [SyncAccountStatus!]! totalAccounts: Int! successCount: Int! errorCount: Int! """True hvis alle konti ble synkronisert uten feil""" allSuccessful: Boolean! """Menneskevennlig statusmelding""" summary: String! } type SyncAccountStatus { """Ekstern bank-konto ID""" accountId: String! """Kontonavn i regnskapet""" accountName: String! success: Boolean! """Feilmelding hvis synkronisering feilet""" error: String } input CreateFeedbackInput { """'agent' eller 'user'""" source: String! """'bug', 'feature', 'improvement', eller 'other'""" type: String! title: String! description: String! } type BankTransaction { """Ekstern ID fra banken""" externalId: String! date: String! amount: Float! description: String! creditorName: String creditorAccountBban: String debtorName: String debtorAccountBban: String """Om transaksjonen er matchet mot en bokført transaksjon""" matched: Boolean! """ID til matchet bokført transaksjon, hvis funnet""" matchedTransactionId: String """Forslag til motkonto, sortert etter hyppighet""" suggestions: [BankTransactionSuggestion!]! } type BankTransactionSuggestion { """Konto-ID for foreslått motkonto""" accountId: ID! """Kontonavn""" accountName: String """Kontogruppe/sekvens""" accountSequence: String } type BankTransactionList { """Inngående saldo for måneden""" openingBalance: Float! """Utgående saldo for måneden""" closingBalance: Float! """Tidspunkt transaksjoner ble hentet fra bank""" fetchedAt: String """Banktransaksjoner med match-status og forslag""" transactions: [BankTransaction!]! """Antall umatchede transaksjoner""" unmatchedCount: Int! """Antall matchede transaksjoner""" matchedCount: Int! } type FetchBankTransactionsResult { success: Boolean! """Feilmelding hvis henting feilet""" error: String } input CreateTransactionFromBankInput { organizationId: ID! year: Int! """Bankkonto-ID i regnskapet (1920-konto e.l.)""" bankAccountId: ID! """Motkonto-ID""" counterAccountId: ID! date: String! description: String! """Beløp fra bankens perspektiv (positivt = inn, negativt = ut)""" amount: Float! } input CreateAccountInput { organizationId: ID! year: Int! """Kontokode, f.eks. '6100'. Foerste siffer (1-8) bestemmer kategori.""" sequence: String! """Kontonavn/beskrivelse""" description: String! """Aapningssaldo per 01.01. Default: 0""" openingBalance: Float """ Maalsaldo per 31.12 (balansekonti) eller total aarsbudsjett + openingBalance. Default: 0 """ target: Float notes: String """ Foerste maaned med budsjett (1-12). Maaneder foer denne faar budsjett 0. Default: gjeldende maaned. """ firstMonth: Int } input UpdateAccountInput { organizationId: ID! year: Int! accountId: ID! """Kontokode, f.eks. '6100'""" sequence: String! """Kontonavn/beskrivelse""" description: String! """Aapningssaldo per 01.01. Default: 0""" openingBalance: Float """Maalsaldo per 31.12. Default: 0""" target: Float notes: String """Foerste maaned med budsjett (1-12). Default: gjeldende maaned.""" firstMonth: Int } enum BudgetUpdateMode { """Sett budsjett kun for angitt maaned""" THIS_MONTH """Sett budsjett lik faktisk transaksjonsbeloep for maaneden""" THIS_MONTH_AS_ACTUAL """Sett budsjett for denne og alle foelgende maaneder""" ALL_FOLLOWING_MONTHS } input UpdateMonthlyBudgetInput { organizationId: ID! year: Int! accountId: ID! """Maaned (1-12)""" month: Int! """ Ny budsjettverdi. Paakrevd for THIS_MONTH og ALL_FOLLOWING_MONTHS, ignoreres for THIS_MONTH_AS_ACTUAL. """ budget: Float notes: String mode: BudgetUpdateMode! } type CreateAccountPayload { accountId: ID! sequence: String! description: String! """Beregnet aarsbudsjett (target - openingBalance)""" yearlyBudget: Float! } type UpdateAccountPayload { accountId: ID! sequence: String! description: String! yearlyBudget: Float! } type DeleteAccountPayload { deletedAccountId: ID! } type UpdateMonthlyBudgetPayload { accountId: ID! month: Int! """Oppdatert budsjett for maaneden""" budget: Float! """Oppdatert totalt aarsbudsjett for kontoen""" accountBudget: Float! }