pub mod control_accounts {
pub const AR_CONTROL: &str = "1200";
pub const AP_CONTROL: &str = "3300";
pub const INVENTORY: &str = "1100";
pub const FIXED_ASSETS: &str = "0200";
pub const ACCUMULATED_DEPRECIATION: &str = "0700";
pub const GR_IR_CLEARING: &str = "3350";
pub const IC_AR_CLEARING: &str = "1400";
pub const IC_AP_CLEARING: &str = "3500";
}
pub mod cash_accounts {
pub const OPERATING_CASH: &str = "1800";
pub const BANK_ACCOUNT: &str = "1810";
pub const PETTY_CASH: &str = "1600";
}
pub mod revenue_accounts {
pub const PRODUCT_REVENUE: &str = "4000";
pub const SERVICE_REVENUE: &str = "4400";
pub const IC_REVENUE: &str = "4500";
pub const PURCHASE_DISCOUNT_INCOME: &str = "4730";
pub const OTHER_REVENUE: &str = "4900";
pub const SALES_DISCOUNTS: &str = "4720";
pub const SALES_RETURNS: &str = "4710";
}
pub mod expense_accounts {
pub const COGS: &str = "5000";
pub const RAW_MATERIALS: &str = "5100";
pub const DEPRECIATION: &str = "6220";
pub const SALARIES_WAGES: &str = "6000";
pub const RENT: &str = "6310";
pub const INTEREST_EXPENSE: &str = "7300";
pub const PURCHASE_DISCOUNTS: &str = "5730";
pub const FX_GAIN_LOSS: &str = "7400";
pub const BAD_DEBT: &str = "6340";
}
pub mod tax_accounts {
pub const OUTPUT_VAT: &str = "3800";
pub const INPUT_VAT: &str = "1570";
pub const TAX_RECEIVABLE: &str = "1550";
pub const TAX_EXPENSE: &str = "7600";
pub const DEFERRED_TAX_LIABILITY: &str = "3060";
pub const DEFERRED_TAX_ASSET: &str = "1550";
}
pub mod liability_accounts {
pub const ACCRUED_EXPENSES: &str = "3070";
pub const ACCRUED_SALARIES: &str = "3720";
pub const UNEARNED_REVENUE: &str = "3250";
pub const SHORT_TERM_DEBT: &str = "3100";
pub const LONG_TERM_DEBT: &str = "3150";
pub const IC_PAYABLE: &str = "3510";
}
pub mod equity_accounts {
pub const COMMON_STOCK: &str = "2000";
pub const RETAINED_EARNINGS: &str = "2970";
pub const CURRENT_YEAR_EARNINGS: &str = "2960";
pub const CTA: &str = "2909";
pub const INCOME_SUMMARY: &str = "2990";
pub const DIVIDENDS_PAID: &str = "2980";
pub const PROVISIONS: &str = "3000";
}
pub mod suspense_accounts {
pub const GENERAL_SUSPENSE: &str = "9000";
pub const PAYROLL_CLEARING: &str = "9100";
pub const BANK_RECONCILIATION_SUSPENSE: &str = "9200";
}
pub mod personnel_accounts {
pub const WAGES_PAYABLE: &str = "3720";
pub const SOCIAL_SECURITY: &str = "6100";
}
pub mod fixed_asset_accounts {
pub const LAND: &str = "0060";
pub const BUILDINGS: &str = "0090";
pub const MACHINERY: &str = "0200";
pub const VEHICLES: &str = "0320";
pub const OFFICE_EQUIPMENT: &str = "0400";
pub const IT_EQUIPMENT: &str = "0420";
pub const GWG: &str = "0480";
}
#[inline]
pub fn skr_class(account: &str) -> Option<u8> {
let first = account.chars().next()?;
first.to_digit(10).map(|d| d as u8)
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
#[test]
fn test_skr_class_extraction() {
assert_eq!(skr_class("1200"), Some(1));
assert_eq!(skr_class("3300"), Some(3));
assert_eq!(skr_class("0200"), Some(0));
assert_eq!(skr_class("4000"), Some(4));
assert_eq!(skr_class("9000"), Some(9));
assert_eq!(skr_class(""), None);
}
#[test]
fn test_control_accounts() {
assert_eq!(control_accounts::AR_CONTROL, "1200");
assert_eq!(control_accounts::AP_CONTROL, "3300");
assert_eq!(control_accounts::INVENTORY, "1100");
}
#[test]
fn test_all_accounts_are_4_digit() {
let accounts = [
control_accounts::AR_CONTROL,
control_accounts::AP_CONTROL,
control_accounts::INVENTORY,
control_accounts::FIXED_ASSETS,
cash_accounts::OPERATING_CASH,
revenue_accounts::PRODUCT_REVENUE,
expense_accounts::COGS,
expense_accounts::SALARIES_WAGES,
equity_accounts::COMMON_STOCK,
equity_accounts::RETAINED_EARNINGS,
];
for acct in accounts {
assert_eq!(acct.len(), 4, "SKR04 account {} should be 4 digits", acct);
}
}
}