arc/hesabixAPI/tests/test_general_ledger_electronic_export.py

127 lines
4.2 KiB
Python

from __future__ import annotations
from datetime import date
import pytest
from app.services.general_ledger_electronic_export_service import (
ELECTRONIC_GENERAL_LEDGER_HEADERS,
build_electronic_general_ledger_csv_bytes,
build_electronic_general_ledger_excel_bytes,
build_electronic_general_ledger_rows,
item_to_electronic_general_ledger_row,
)
from app.services.journal_ledger_service import _find_detail_account
def _accounts_map() -> dict:
return {
1: {"id": 1, "code": "11", "name": "موجودی نقد", "parent_id": None},
2: {"id": 2, "code": "1101", "name": "صندوق", "parent_id": 1},
3: {"id": 3, "code": "110101", "name": "صندوق مرکزی", "parent_id": 2},
4: {"id": 4, "code": "41", "name": "فروش", "parent_id": None},
}
def test_find_detail_account_below_subsidiary():
accounts = _accounts_map()
subsidiary = accounts[2]
detail = _find_detail_account(3, accounts, subsidiary)
assert detail is not None
assert detail["code"] == "110101"
assert detail["name"] == "صندوق مرکزی"
def test_find_detail_account_none_at_subsidiary_level():
accounts = _accounts_map()
subsidiary = accounts[2]
assert _find_detail_account(2, accounts, subsidiary) is None
def test_find_detail_account_none_at_general_level():
accounts = _accounts_map()
subsidiary = accounts[2]
assert _find_detail_account(1, accounts, subsidiary) is None
def test_general_ledger_headers_match_tax_template():
assert len(ELECTRONIC_GENERAL_LEDGER_HEADERS) == 9
assert ELECTRONIC_GENERAL_LEDGER_HEADERS[-1] == "تاریخ گردش"
assert ELECTRONIC_GENERAL_LEDGER_HEADERS[6] == "گردش بدهکار (ریال)"
def test_item_to_electronic_general_ledger_row_with_detail():
row = item_to_electronic_general_ledger_row(
{
"document_date": date(2024, 3, 20),
"general_account_code": "11",
"general_account_name": "موجودی نقد",
"subsidiary_account_code": "1101",
"subsidiary_account_name": "صندوق",
"detail_account_code": "110101",
"detail_account_name": "صندوق مرکزی",
"debit_amount": 500000,
"credit_amount": 0,
}
)
assert row[0] == "11"
assert row[4] == "110101"
assert row[6] == 500000
assert row[7] is None
assert row[8] == "1403/01/01"
def test_item_to_electronic_general_ledger_row_credit_only():
row = item_to_electronic_general_ledger_row(
{
"document_date": date(2024, 3, 20),
"general_account_code": "41",
"general_account_name": "فروش",
"subsidiary_account_code": "",
"subsidiary_account_name": "",
"detail_account_code": "",
"detail_account_name": "",
"debit_amount": 0,
"credit_amount": 1200000,
}
)
assert row[6] is None
assert row[7] == 1200000
def test_build_electronic_general_ledger_rows_skips_zero_lines():
rows = build_electronic_general_ledger_rows(
[
{
"document_date": date(2024, 3, 20),
"general_account_code": "11",
"general_account_name": "موجودی نقد",
"debit_amount": 0,
"credit_amount": 0,
}
]
)
assert rows == []
def test_build_excel_and_csv_outputs():
items = [
{
"document_date": date(2024, 3, 20),
"general_account_code": "11",
"general_account_name": "موجودی نقد",
"subsidiary_account_code": "1101",
"subsidiary_account_name": "صندوق",
"detail_account_code": "110101",
"detail_account_name": "صندوق مرکزی",
"debit_amount": 1000,
"credit_amount": 0,
}
]
rows = build_electronic_general_ledger_rows(items)
xlsx = build_electronic_general_ledger_excel_bytes(rows)
csv = build_electronic_general_ledger_csv_bytes(rows)
assert xlsx[:2] == b"PK"
assert csv.startswith(b"\xef\xbb\xbf")
assert "گردش بدهکار (ریال)" in csv.decode("utf-8-sig")
assert "تاریخ گردش" in csv.decode("utf-8-sig")