@accounter/server
Version:
Accounter GraphQL server
188 lines (177 loc) • 5.62 kB
text/typescript
/**
* Expense Scenario A: Local Currency (ILS) Receipt Expense
*
* This scenario represents a simple expense paid in local currency (ILS) with a receipt.
* It demonstrates the basic happy path for expense recording and ledger generation.
*
* Flow:
* 1. Admin business purchases from Local Supplier Ltd
* 2. Transaction recorded: -500 ILS (negative = expense/outflow)
* 3. Receipt document provided matching the transaction
* 4. Expected ledger: debit expense category, credit bank account
*
* Prerequisites:
* - Admin business entity exists (from seed)
* - General expense tax category exists (from seed)
*/
import {
createBusiness,
createCharge,
createDocument,
createTransaction,
createTaxCategory,
createFinancialAccount,
} from '../../factories';
import { makeUUID } from '../../../demo-fixtures/helpers/deterministic-uuid.js';
import type { Fixture } from '../../helpers/fixture-types';
import { Currency, CountryCode } from '../../../shared/enums.js';
const ADMIN_ID = makeUUID('business', 'admin-business-scenario-a');
/**
* Expense Scenario A: ILS Receipt Expense
*
* @description
* A local supplier provides a service, admin pays 500 ILS, receives a receipt.
* This is the simplest expense case with matching transaction and document.
*
* @example
* ```typescript
* import { expenseScenarioA } from './fixtures/expenses/expense-scenario-a';
* import { insertFixture } from './helpers/fixture-loader';
*
* await withTestTransaction(pool, async (client) => {
* await seedAdminCore(client); // Ensure admin context exists
* const idMap = await insertFixture(client, expenseScenarioA);
*
* // Now test ledger generation
* const chargeId = idMap.get('charge-office-supplies');
* // ... trigger ledger generation and assert
* });
* ```
*/
export const expenseScenarioA: Fixture = {
businesses: {
businesses: [
// Admin business (owner of the expense)
createBusiness({
id: ADMIN_ID,
name: 'Accountancy Management',
country: CountryCode.Israel,
}),
// Supplier business
createBusiness({
id: makeUUID('business', 'supplier-local-ltd'),
name: 'Local Supplier Ltd',
country: CountryCode.Israel,
exemptDealer: false,
isReceiptEnough: true, // Can provide receipts for small purchases
ownerId: ADMIN_ID,
}),
],
},
taxCategories: {
taxCategories: [
createTaxCategory({
id: makeUUID('tax-category', 'expense-general'),
name: 'General Expenses',
ownerId: ADMIN_ID,
}),
createTaxCategory({
id: makeUUID('tax-category', 'bank-account-tax-category'),
name: 'Bank Account',
ownerId: ADMIN_ID,
}),
],
},
accounts: {
accounts: [
createFinancialAccount({
accountNumber: 'BANK-ACCOUNT-001',
type: 'BANK_ACCOUNT',
ownerId: ADMIN_ID,
}),
],
},
accountTaxCategories: {
mappings: [
{
accountNumber: 'BANK-ACCOUNT-001',
currency: Currency.Ils,
taxCategoryId: makeUUID('tax-category', 'bank-account-tax-category'),
ownerId: ADMIN_ID,
},
],
},
charges: {
charges: [
createCharge(
{
owner_id: ADMIN_ID,
tax_category_id: makeUUID('tax-category', 'expense-general'),
user_description: 'Office supplies purchase',
},
{
id: makeUUID('charge', 'charge-office-supplies'),
},
),
],
},
transactions: {
transactions: [
createTransaction(
{
charge_id: makeUUID('charge', 'charge-office-supplies'),
business_id: makeUUID('business', 'supplier-local-ltd'),
amount: '-500.00', // Negative = expense/outflow
currency: Currency.Ils,
event_date: '2024-01-15',
is_fee: false,
owner_id: ADMIN_ID,
},
{
id: makeUUID('transaction', 'transaction-supplies-payment'),
account_id: 'BANK-ACCOUNT-001', // Will be resolved to UUID by loader
source_description: 'Office supplies - Local Supplier Ltd',
debit_date: '2024-01-15',
current_balance: '0', // Placeholder - not critical for test
owner_id: ADMIN_ID,
},
),
],
},
documents: {
documents: [
createDocument(
{
charge_id: makeUUID('charge', 'charge-office-supplies'),
creditor_id: makeUUID('business', 'supplier-local-ltd'), // Supplier is creditor
debtor_id: makeUUID('business', 'admin-business-scenario-a'), // Admin is debtor (owes money)
type: 'RECEIPT',
total_amount: 500.0, // Matches transaction amount (positive in document)
currency_code: Currency.Ils,
date: '2024-01-15', // Receipt date matches transaction
owner_id: ADMIN_ID,
},
{
id: makeUUID('document', 'document-supplies-receipt'),
serial_number: 'RCP-2024-001',
vat_amount: null, // For simplicity, no VAT breakdown on receipt
owner_id: ADMIN_ID,
},
),
],
},
expectations: {
ledger: [
{
chargeId: makeUUID('charge', 'charge-office-supplies'),
recordCount: 2, // Debit expense + credit bank
debitEntities: [makeUUID('tax-category', 'expense-general')],
creditEntities: [makeUUID('tax-category', 'bank-account-tax-category')],
totalDebitLocal: 500.0,
totalCreditLocal: 500.0,
balanced: true,
ownerId: ADMIN_ID,
},
],
},
};