pub mod intangible_accounts {
pub const GOODWILL: &str = "1900";
pub const CUSTOMER_RELATIONSHIPS: &str = "1910";
pub const TRADE_NAME: &str = "1920";
pub const TECHNOLOGY: &str = "1930";
pub const ACCUMULATED_AMORTIZATION: &str = "1950";
pub const AMORTIZATION_EXPENSE: &str = "6010";
pub const BARGAIN_PURCHASE_GAIN: &str = "4850";
}
pub mod control_accounts {
pub const AR_CONTROL: &str = "1100";
pub const AP_CONTROL: &str = "2000";
pub const INVENTORY: &str = "1200";
pub const FIXED_ASSETS: &str = "1500";
pub const ACCUMULATED_DEPRECIATION: &str = "1510";
pub const GR_IR_CLEARING: &str = "2900";
pub const IC_AR_CLEARING: &str = "1150";
pub const IC_AP_CLEARING: &str = "2050";
}
pub mod cash_accounts {
pub const OPERATING_CASH: &str = "1000";
pub const BANK_ACCOUNT: &str = "1010";
pub const PETTY_CASH: &str = "1020";
pub const WIRE_CLEARING: &str = "1030";
}
pub mod revenue_accounts {
pub const PRODUCT_REVENUE: &str = "4000";
pub const SERVICE_REVENUE: &str = "4100";
pub const IC_REVENUE: &str = "4500";
pub const PURCHASE_DISCOUNT_INCOME: &str = "4800";
pub const OTHER_REVENUE: &str = "4900";
pub const SALES_DISCOUNTS: &str = "4010";
pub const SALES_RETURNS: &str = "4020";
}
pub mod expense_accounts {
pub const COGS: &str = "5000";
pub const RAW_MATERIALS: &str = "5100";
pub const DIRECT_LABOR: &str = "5200";
pub const MANUFACTURING_OVERHEAD: &str = "5300";
pub const DEPRECIATION: &str = "6000";
pub const SALARIES_WAGES: &str = "6100";
pub const BENEFITS: &str = "6200";
pub const RENT: &str = "6300";
pub const UTILITIES: &str = "6400";
pub const OFFICE_SUPPLIES: &str = "6500";
pub const TRAVEL_ENTERTAINMENT: &str = "6600";
pub const PROFESSIONAL_FEES: &str = "6700";
pub const INSURANCE: &str = "6800";
pub const BAD_DEBT: &str = "6900";
pub const PENSION_EXPENSE: &str = "6205";
pub const INTEREST_EXPENSE: &str = "7100";
pub const STOCK_COMP_EXPENSE: &str = "7200";
pub const PURCHASE_DISCOUNTS: &str = "7400";
pub const FX_GAIN_LOSS: &str = "7500";
}
pub mod manufacturing_accounts {
pub const WIP: &str = "1420";
pub const FINISHED_GOODS: &str = "1410";
pub const SCRAP_EXPENSE: &str = "5210";
pub const LABOR_ACCRUAL: &str = "2150";
pub const OVERHEAD_APPLIED: &str = "5310";
pub const MATERIAL_PRICE_VARIANCE: &str = "5110";
pub const MATERIAL_USAGE_VARIANCE: &str = "5120";
pub const LABOR_RATE_VARIANCE: &str = "5130";
pub const LABOR_EFFICIENCY_VARIANCE: &str = "5140";
pub const OVERHEAD_VOLUME_VARIANCE: &str = "5150";
pub const WARRANTY_PROVISION: &str = "2410";
pub const WARRANTY_EXPENSE: &str = "5400";
}
pub mod treasury_accounts {
pub const INTEREST_PAYABLE: &str = "2160";
pub const DEBT_PREMIUM: &str = "2610";
pub const DEBT_DISCOUNT: &str = "2620";
pub const DERIVATIVE_ASSET: &str = "1450";
pub const DERIVATIVE_LIABILITY: &str = "2460";
pub const OCI_CASH_FLOW_HEDGE: &str = "3510";
pub const HEDGE_INEFFECTIVENESS: &str = "7510";
pub const CASH_POOL_IC_RECEIVABLE: &str = "1155";
pub const CASH_POOL_IC_PAYABLE: &str = "2055";
}
pub mod provision_accounts {
pub const PROVISION_LIABILITY: &str = "2450";
pub const PROVISION_EXPENSE: &str = "6850";
}
pub mod tax_accounts {
pub const SALES_TAX_PAYABLE: &str = "2100";
pub const VAT_PAYABLE: &str = "2110";
pub const WITHHOLDING_TAX_PAYABLE: &str = "2120";
pub const INCOME_TAX_PAYABLE: &str = "2130";
pub const INPUT_VAT: &str = "1160";
pub const TAX_RECEIVABLE: &str = "1460";
pub const TAX_EXPENSE: &str = "8000";
pub const DEFERRED_TAX_LIABILITY: &str = "2500";
pub const DEFERRED_TAX_ASSET: &str = "1600";
}
pub mod liability_accounts {
pub const ACCRUED_EXPENSES: &str = "2200";
pub const ACCRUED_SALARIES: &str = "2210";
pub const ACCRUED_BENEFITS: &str = "2220";
pub const UNEARNED_REVENUE: &str = "2300";
pub const SHORT_TERM_DEBT: &str = "2400";
pub const LONG_TERM_DEBT: &str = "2600";
pub const IC_PAYABLE: &str = "2700";
pub const NET_PENSION_LIABILITY: &str = "2800";
}
pub mod asset_class_accounts {
pub const LAND: &str = "1510";
pub const BUILDINGS: &str = "1520";
pub const BUILDING_IMPROVEMENTS: &str = "1525";
pub const MACHINERY_EQUIPMENT: &str = "1530";
pub const VEHICLES: &str = "1540";
pub const OFFICE_EQUIPMENT: &str = "1550";
pub const COMPUTER_HARDWARE: &str = "1555";
pub const SOFTWARE_INTANGIBLES: &str = "1560";
pub const FURNITURE_FIXTURES: &str = "1570";
pub const LEASEHOLD_IMPROVEMENTS: &str = "1580";
pub const OTHER_ASSETS: &str = "1590";
pub const LOW_VALUE_ASSETS: &str = "1595";
pub const CONSTRUCTION_IN_PROGRESS: &str = "1600";
pub const ACC_DEP_LAND: &str = "1519";
pub const ACC_DEP_BUILDINGS: &str = "1529";
pub const ACC_DEP_MACHINERY: &str = "1539";
pub const ACC_DEP_VEHICLES: &str = "1549";
pub const ACC_DEP_OFFICE_EQUIPMENT: &str = "1559";
pub const ACC_DEP_SOFTWARE: &str = "1569";
pub const ACC_DEP_FURNITURE: &str = "1579";
pub const ACC_DEP_LEASEHOLD: &str = "1589";
pub const ACC_DEP_OTHER: &str = "1599";
pub const ACC_DEP_CIP: &str = "1609";
pub const ACQUISITION_CLEARING: &str = "1599";
pub const DEPRECIATION_EXPENSE: &str = "7100";
pub const GAIN_ON_DISPOSAL: &str = "4900";
pub const LOSS_ON_DISPOSAL: &str = "7900";
}
pub mod inventory_accounts {
pub const WRITEUP_INCOME: &str = "4950";
pub const WRITEDOWN_EXPENSE: &str = "6950";
}
pub mod equity_accounts {
pub const COMMON_STOCK: &str = "3000";
pub const APIC: &str = "3100";
pub const APIC_STOCK_COMP: &str = "3150";
pub const RETAINED_EARNINGS: &str = "3200";
pub const CURRENT_YEAR_EARNINGS: &str = "3300";
pub const TREASURY_STOCK: &str = "3400";
pub const CTA: &str = "3500";
pub const INCOME_SUMMARY: &str = "3600";
pub const DIVIDENDS_PAID: &str = "3700";
pub const OCI_REMEASUREMENTS: &str = "3800";
}
pub mod dividend_accounts {
pub const DIVIDENDS_PAYABLE: &str = "2170";
pub const DIVIDENDS_DECLARED: &str = "3710";
}
pub mod suspense_accounts {
pub const GENERAL_SUSPENSE: &str = "9000";
pub const PAYROLL_CLEARING: &str = "9100";
pub const BANK_RECONCILIATION_SUSPENSE: &str = "9200";
pub const IC_ELIMINATION_SUSPENSE: &str = "9300";
}
pub mod dormant_accounts {
pub const LEGACY_SUSPENSE: &str = "199999";
pub const LEGACY_CLEARING: &str = "299999";
pub const OBSOLETE: &str = "399999";
pub const TEST_ACCOUNT: &str = "999999";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AccountCategory {
Asset,
Liability,
Equity,
Revenue,
Cogs,
OperatingExpense,
OtherIncomeExpense,
Tax,
Suspense,
Unknown,
}
impl AccountCategory {
pub fn as_label(&self) -> &'static str {
match self {
Self::Asset => "asset",
Self::Liability => "liability",
Self::Equity => "equity",
Self::Revenue => "revenue",
Self::Cogs => "cogs",
Self::OperatingExpense => "operating_expense",
Self::OtherIncomeExpense => "other_income_expense",
Self::Tax => "tax",
Self::Suspense => "suspense",
Self::Unknown => "unknown",
}
}
pub fn from_account(account: &str) -> Self {
if account.is_empty() {
return Self::Unknown;
}
match account.chars().next() {
Some('1') => Self::Asset,
Some('2') => Self::Liability,
Some('3') => Self::Equity,
Some('4') => Self::Revenue,
Some('5') => Self::Cogs,
Some('6') => Self::OperatingExpense,
Some('7') => Self::OtherIncomeExpense,
Some('8') => Self::Tax,
Some('9') => Self::Suspense,
_ => Self::Unknown,
}
}
pub fn is_debit_normal(&self) -> bool {
matches!(
self,
Self::Asset
| Self::Cogs
| Self::OperatingExpense
| Self::OtherIncomeExpense
| Self::Tax
)
}
pub fn is_credit_normal(&self) -> bool {
matches!(self, Self::Liability | Self::Equity | Self::Revenue)
}
pub fn is_balance_sheet(&self) -> bool {
matches!(self, Self::Asset | Self::Liability | Self::Equity)
}
pub fn is_income_statement(&self) -> bool {
matches!(
self,
Self::Revenue
| Self::Cogs
| Self::OperatingExpense
| Self::OtherIncomeExpense
| Self::Tax
)
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
#[test]
fn test_account_category_from_account() {
assert_eq!(
AccountCategory::from_account(control_accounts::AR_CONTROL),
AccountCategory::Asset
);
assert_eq!(
AccountCategory::from_account(control_accounts::AP_CONTROL),
AccountCategory::Liability
);
assert_eq!(
AccountCategory::from_account(equity_accounts::RETAINED_EARNINGS),
AccountCategory::Equity
);
assert_eq!(
AccountCategory::from_account(revenue_accounts::PRODUCT_REVENUE),
AccountCategory::Revenue
);
assert_eq!(
AccountCategory::from_account(expense_accounts::COGS),
AccountCategory::Cogs
);
}
#[test]
fn test_debit_credit_normal() {
assert!(AccountCategory::Asset.is_debit_normal());
assert!(AccountCategory::Revenue.is_credit_normal());
assert!(!AccountCategory::Asset.is_credit_normal());
assert!(!AccountCategory::Revenue.is_debit_normal());
}
#[test]
fn test_balance_sheet_vs_income_statement() {
assert!(AccountCategory::Asset.is_balance_sheet());
assert!(AccountCategory::Liability.is_balance_sheet());
assert!(AccountCategory::Equity.is_balance_sheet());
assert!(!AccountCategory::Revenue.is_balance_sheet());
assert!(AccountCategory::Revenue.is_income_statement());
assert!(AccountCategory::Cogs.is_income_statement());
assert!(!AccountCategory::Asset.is_income_statement());
}
}