mirror of
https://github.com/fhswf/aki_prj23_transparenzregister.git
synced 2025-04-22 15:42:55 +02:00
Resolve mismatch between staging and prod db data for financials (#211)
SQL Creation is now done dynamicly by the definition of the enumeration type.
This commit is contained in:
parent
9f7d714403
commit
f8c111d7e2
@ -1,9 +1,11 @@
|
|||||||
"""Company model."""
|
"""Company model."""
|
||||||
from dataclasses import asdict, dataclass
|
from dataclasses import asdict, dataclass
|
||||||
from enum import Enum, StrEnum
|
from enum import StrEnum
|
||||||
|
|
||||||
from aenum import MultiValueEnum
|
from aenum import MultiValueEnum
|
||||||
|
|
||||||
|
from aki_prj23_transparenzregister.utils.enum_types import FinancialKPIEnum
|
||||||
|
|
||||||
|
|
||||||
class RelationshipRoleEnum(str, MultiValueEnum):
|
class RelationshipRoleEnum(str, MultiValueEnum):
|
||||||
"""Roles taken by entities in relationships to a Company."""
|
"""Roles taken by entities in relationships to a Company."""
|
||||||
@ -134,43 +136,6 @@ class CompanyToCompanyRelationship(CompanyRelationship):
|
|||||||
name: str
|
name: str
|
||||||
|
|
||||||
|
|
||||||
class FinancialKPIEnum(Enum):
|
|
||||||
"""Financial KPI keys."""
|
|
||||||
|
|
||||||
# Umsatz || Erlöse
|
|
||||||
REVENUE = "revenue"
|
|
||||||
# Jahresüberschuss || Nettoeinkommen
|
|
||||||
NET_INCOME = "net_income"
|
|
||||||
# Ebit
|
|
||||||
EBIT = "ebit"
|
|
||||||
# Ebitda
|
|
||||||
EBITDA = "ebitda"
|
|
||||||
# Bruttogewinn
|
|
||||||
GROSS_PROFIT = "gross_profit"
|
|
||||||
# Betriebsgewinn
|
|
||||||
OPERATING_PROFIT = "operating_profit"
|
|
||||||
# Bilanzsumme
|
|
||||||
ASSETS = "assets"
|
|
||||||
# Gesamtverbindlichkeiten
|
|
||||||
LIABILITIES = "liabilities"
|
|
||||||
# Eigenkapital
|
|
||||||
EQUITY = "equity"
|
|
||||||
# Umlaufvermögen
|
|
||||||
CURRENT_ASSETS = "current_assets"
|
|
||||||
# Kurzfristige Verbindlichkeiten
|
|
||||||
CURRENT_LIABILITIES = "current_liabilities"
|
|
||||||
# Langfristige Verbindlichkeiten
|
|
||||||
LONG_TERM_DEBT = "long_term_debt"
|
|
||||||
# Kurzfristige Verbindlichkeiten
|
|
||||||
SHORT_TERM_DEBT = "short_term_debt"
|
|
||||||
# Barmittel
|
|
||||||
CASH_AND_CASH_EQUIVALENTS = "cash_and_cash_equivalents"
|
|
||||||
# Dividende
|
|
||||||
DIVIDENDS = "dividends"
|
|
||||||
# Cash Flow
|
|
||||||
CASH_FLOW = "cash_flow"
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class YearlyResult:
|
class YearlyResult:
|
||||||
"""Company yearly result."""
|
"""Company yearly result."""
|
||||||
|
@ -6,7 +6,7 @@ from bs4 import BeautifulSoup
|
|||||||
from deutschland.bundesanzeiger import Bundesanzeiger as Ba
|
from deutschland.bundesanzeiger import Bundesanzeiger as Ba
|
||||||
|
|
||||||
from aki_prj23_transparenzregister.models.auditor import Auditor
|
from aki_prj23_transparenzregister.models.auditor import Auditor
|
||||||
from aki_prj23_transparenzregister.models.company import FinancialKPIEnum
|
from aki_prj23_transparenzregister.utils.enum_types import FinancialKPIEnum
|
||||||
|
|
||||||
pd.options.mode.chained_assignment = None # type: ignore
|
pd.options.mode.chained_assignment = None # type: ignore
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
"""Collection of enumeration types for the whole project."""
|
"""Collection of enumeration types for the whole project."""
|
||||||
import enum
|
import enum
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
class SentimentTypeEnum(enum.Enum):
|
class SentimentTypeEnum(enum.Enum):
|
||||||
@ -9,3 +10,40 @@ class SentimentTypeEnum(enum.Enum):
|
|||||||
sustainability = "sustainability"
|
sustainability = "sustainability"
|
||||||
environmental_aspects = "environmental_aspects"
|
environmental_aspects = "environmental_aspects"
|
||||||
perception = "perception"
|
perception = "perception"
|
||||||
|
|
||||||
|
|
||||||
|
class FinancialKPIEnum(Enum):
|
||||||
|
"""Financial KPI keys."""
|
||||||
|
|
||||||
|
# Umsatz || Erlöse
|
||||||
|
REVENUE = "revenue"
|
||||||
|
# Jahresüberschuss || Nettoeinkommen
|
||||||
|
NET_INCOME = "net_income"
|
||||||
|
# Ebit
|
||||||
|
EBIT = "ebit"
|
||||||
|
# Ebitda
|
||||||
|
EBITDA = "ebitda"
|
||||||
|
# Bruttogewinn
|
||||||
|
GROSS_PROFIT = "gross_profit"
|
||||||
|
# Betriebsgewinn
|
||||||
|
OPERATING_PROFIT = "operating_profit"
|
||||||
|
# Bilanzsumme
|
||||||
|
ASSETS = "assets"
|
||||||
|
# Gesamtverbindlichkeiten
|
||||||
|
LIABILITIES = "liabilities"
|
||||||
|
# Eigenkapital
|
||||||
|
EQUITY = "equity"
|
||||||
|
# Umlaufvermögen
|
||||||
|
CURRENT_ASSETS = "current_assets"
|
||||||
|
# Kurzfristige Verbindlichkeiten
|
||||||
|
CURRENT_LIABILITIES = "current_liabilities"
|
||||||
|
# Langfristige Verbindlichkeiten
|
||||||
|
LONG_TERM_DEBT = "long_term_debt"
|
||||||
|
# Kurzfristige Verbindlichkeiten
|
||||||
|
SHORT_TERM_DEBT = "short_term_debt"
|
||||||
|
# Barmittel
|
||||||
|
CASH_AND_CASH_EQUIVALENTS = "cash_and_cash_equivalents"
|
||||||
|
# Dividende
|
||||||
|
DIVIDENDS = "dividends"
|
||||||
|
# Cash Flow
|
||||||
|
CASH_FLOW = "cash_flow"
|
||||||
|
@ -10,6 +10,7 @@ from aki_prj23_transparenzregister.models.company import (
|
|||||||
RelationshipRoleEnum,
|
RelationshipRoleEnum,
|
||||||
)
|
)
|
||||||
from aki_prj23_transparenzregister.utils.enum_types import (
|
from aki_prj23_transparenzregister.utils.enum_types import (
|
||||||
|
FinancialKPIEnum,
|
||||||
SentimentTypeEnum,
|
SentimentTypeEnum,
|
||||||
)
|
)
|
||||||
from aki_prj23_transparenzregister.utils.sql.connector import Base
|
from aki_prj23_transparenzregister.utils.sql.connector import Base
|
||||||
@ -105,33 +106,17 @@ class Person(Base):
|
|||||||
works_for = sa.Column(sa.String(100), nullable=True)
|
works_for = sa.Column(sa.String(100), nullable=True)
|
||||||
|
|
||||||
|
|
||||||
class AnnualFinanceStatement(Base):
|
AnnualFinanceStatement = type(
|
||||||
"""Finance."""
|
"AnnualFinanceStatement",
|
||||||
|
(Base,),
|
||||||
__tablename__ = "annual_finance_statement"
|
{
|
||||||
|
"__tablename__": "annual_finance_statement",
|
||||||
id = sa.Column(sa.Integer, primary_key=True)
|
"id": sa.Column(sa.Integer, primary_key=True),
|
||||||
company_id = sa.Column(sa.Integer, sa.ForeignKey("company.id"))
|
"company_id": sa.Column(sa.Integer, sa.ForeignKey("company.id")),
|
||||||
date = sa.Column(sa.Date, nullable=False)
|
"date": sa.Column(sa.Date, nullable=False),
|
||||||
total_volume = sa.Column(sa.Float, default="NaN")
|
}
|
||||||
ebit = sa.Column(sa.Float, default="NaN")
|
| {_.value: sa.Column(sa.Float, default="NaN") for _ in FinancialKPIEnum},
|
||||||
ebitda = sa.Column(sa.Float, default="NaN")
|
)
|
||||||
ebit_margin = sa.Column(sa.Float, default="NaN")
|
|
||||||
total_balance = sa.Column(sa.Float, default="NaN")
|
|
||||||
equity = sa.Column(sa.Float, default="NaN")
|
|
||||||
debt = sa.Column(sa.Float, default="NaN")
|
|
||||||
return_on_equity = sa.Column(sa.Float, default="NaN")
|
|
||||||
capital_turnover_rate = sa.Column(sa.Float, default="NaN")
|
|
||||||
current_liabilities = sa.Column(sa.Float, default="NaN")
|
|
||||||
dividends = sa.Column(sa.Float, default="NaN")
|
|
||||||
net_income = sa.Column(sa.Float, default="NaN")
|
|
||||||
assets = sa.Column(sa.Float, default="NaN")
|
|
||||||
long_term_debt = sa.Column(sa.Float, default="NaN")
|
|
||||||
short_term_debt = sa.Column(sa.Float, default="NaN")
|
|
||||||
revenue = sa.Column(sa.Float, default="NaN")
|
|
||||||
cash_flow = sa.Column(sa.Float, default="NaN")
|
|
||||||
current_assets = sa.Column(sa.Float, default="NaN") # assets vs current assets
|
|
||||||
# company: Mapped[Company] = relationship(Company)
|
|
||||||
|
|
||||||
|
|
||||||
class Sentiment(Base):
|
class Sentiment(Base):
|
||||||
|
@ -56,47 +56,40 @@ def finance_statements() -> list[dict[str, Any]]:
|
|||||||
"id": 1,
|
"id": 1,
|
||||||
"company_id": 1,
|
"company_id": 1,
|
||||||
"date": datetime.date.fromisoformat("2023-01-01"),
|
"date": datetime.date.fromisoformat("2023-01-01"),
|
||||||
"total_volume": 1000.0,
|
|
||||||
"ebit": 1000.0,
|
"ebit": 1000.0,
|
||||||
"ebitda": 1000.0,
|
"ebitda": 1000.0,
|
||||||
"ebit_margin": 1000.0,
|
"gross_profit": 1000.0,
|
||||||
"total_balance": 1000.0,
|
|
||||||
"equity": 1000.0,
|
"equity": 1000.0,
|
||||||
"debt": 1000.0,
|
|
||||||
"return_on_equity": 1000.0,
|
|
||||||
"capital_turnover_rate": 1000.0,
|
|
||||||
"current_liabilities": 1000.0,
|
"current_liabilities": 1000.0,
|
||||||
"dividends": float("NaN"),
|
|
||||||
"net_income": float("NaN"),
|
|
||||||
"assets": 1000.0,
|
"assets": 1000.0,
|
||||||
|
"net_income": 100.0,
|
||||||
"long_term_debt": 1000.0,
|
"long_term_debt": 1000.0,
|
||||||
"short_term_debt": 1000.0,
|
"short_term_debt": 1000.0,
|
||||||
"revenue": 1000.0,
|
"revenue": 1000.0,
|
||||||
"cash_flow": 1000.0,
|
"cash_flow": 1000.0,
|
||||||
"current_assets": 1000.0,
|
"current_assets": 1000.0,
|
||||||
|
"liabilities": 0.0,
|
||||||
|
"cash_and_cash_equivalents": 1.0,
|
||||||
|
"dividends": 0.0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"company_id": 1,
|
"company_id": 1,
|
||||||
"date": datetime.date.fromisoformat("2022-01-01"),
|
"date": datetime.date.fromisoformat("2022-01-01"),
|
||||||
"total_volume": 1100.0,
|
"revenue": 1100.0,
|
||||||
|
"net_income": float("NaN"),
|
||||||
"ebit": 1100.0,
|
"ebit": 1100.0,
|
||||||
"ebitda": 1100.0,
|
"ebitda": 1100.0,
|
||||||
"ebit_margin": 1100.0,
|
"gross_profit": 1100.0,
|
||||||
"total_balance": 1100.0,
|
|
||||||
"equity": 1100.0,
|
"equity": 1100.0,
|
||||||
"debt": 1100.0,
|
|
||||||
"return_on_equity": 1100.0,
|
|
||||||
"capital_turnover_rate": 1100.0,
|
|
||||||
"current_liabilities": 1100.0,
|
"current_liabilities": 1100.0,
|
||||||
"dividends": float("NaN"),
|
"dividends": float("NaN"),
|
||||||
"net_income": float("NaN"),
|
|
||||||
"assets": 1100.0,
|
"assets": 1100.0,
|
||||||
"long_term_debt": 1100.0,
|
"long_term_debt": 1100.0,
|
||||||
"short_term_debt": 1100.0,
|
"short_term_debt": 1100.0,
|
||||||
"revenue": 1100.0,
|
|
||||||
"cash_flow": 1100.0,
|
"cash_flow": 1100.0,
|
||||||
"current_assets": 1100.0,
|
"current_assets": 1100.0,
|
||||||
|
"operating_profit": 1.0,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -65,24 +65,22 @@ def test_get_finance_data(full_db: Session) -> None:
|
|||||||
"annual_finance_statement_id": {0: 1, 1: 2},
|
"annual_finance_statement_id": {0: 1, 1: 2},
|
||||||
"annual_finance_statement_company_id": {0: 1, 1: 1},
|
"annual_finance_statement_company_id": {0: 1, 1: 1},
|
||||||
"annual_finance_statement_date": {0: "2023-01-01", 1: "2022-01-01"},
|
"annual_finance_statement_date": {0: "2023-01-01", 1: "2022-01-01"},
|
||||||
"annual_finance_statement_total_volume": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_revenue": {0: 1000.0, 1: 1100.0},
|
||||||
|
"annual_finance_statement_net_income": {0: 100.0},
|
||||||
"annual_finance_statement_ebit": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_ebit": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_ebitda": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_ebitda": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_ebit_margin": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_gross_profit": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_total_balance": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_operating_profit": {1: 1.0},
|
||||||
|
"annual_finance_statement_assets": {0: 1000.0, 1: 1100},
|
||||||
|
"annual_finance_statement_liabilities": {0: 0.0},
|
||||||
"annual_finance_statement_equity": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_equity": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_debt": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_current_assets": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_return_on_equity": {0: 1000.0, 1: 1100.0},
|
|
||||||
"annual_finance_statement_capital_turnover_rate": {0: 1000.0, 1: 1100.0},
|
|
||||||
"annual_finance_statement_current_liabilities": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_current_liabilities": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_dividends": {0: None, 1: None},
|
|
||||||
"annual_finance_statement_net_income": {0: None, 1: None},
|
|
||||||
"annual_finance_statement_assets": {0: 1000.0, 1: 1100.0},
|
|
||||||
"annual_finance_statement_long_term_debt": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_long_term_debt": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_short_term_debt": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_short_term_debt": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_revenue": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_cash_and_cash_equivalents": {0: 1.0},
|
||||||
|
"annual_finance_statement_dividends": {0: 0.0},
|
||||||
"annual_finance_statement_cash_flow": {0: 1000.0, 1: 1100.0},
|
"annual_finance_statement_cash_flow": {0: 1000.0, 1: 1100.0},
|
||||||
"annual_finance_statement_current_assets": {0: 1000.0, 1: 1100.0},
|
|
||||||
"company_name": {0: "Some Company GmbH", 1: "Some Company GmbH"},
|
"company_name": {0: "Some Company GmbH", 1: "Some Company GmbH"},
|
||||||
"company_id": {0: 1, 1: 1},
|
"company_id": {0: 1, 1: 1},
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,10 @@ from unittest.mock import Mock, patch
|
|||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
from aki_prj23_transparenzregister.models.company import FinancialKPIEnum
|
|
||||||
from aki_prj23_transparenzregister.utils.data_extraction.bundesanzeiger import (
|
from aki_prj23_transparenzregister.utils.data_extraction.bundesanzeiger import (
|
||||||
Bundesanzeiger,
|
Bundesanzeiger,
|
||||||
)
|
)
|
||||||
|
from aki_prj23_transparenzregister.utils.enum_types import FinancialKPIEnum
|
||||||
|
|
||||||
|
|
||||||
def test_extract_auditor_company_no_hits() -> None:
|
def test_extract_auditor_company_no_hits() -> None:
|
||||||
|
@ -615,7 +615,6 @@ def test_add_relationships_none(empty_relations: list, full_db: Session) -> None
|
|||||||
|
|
||||||
|
|
||||||
# noinspection SpellCheckingInspection
|
# noinspection SpellCheckingInspection
|
||||||
@pytest.mark.working_on()
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"documents",
|
"documents",
|
||||||
[
|
[
|
||||||
@ -980,7 +979,7 @@ def test_add_annual_report(
|
|||||||
year,
|
year,
|
||||||
{
|
{
|
||||||
"financials": {
|
"financials": {
|
||||||
"ebit": 123,
|
"revenue": 123,
|
||||||
"ebitda": 235,
|
"ebitda": 235,
|
||||||
"short_term_debt": short_term_debt,
|
"short_term_debt": short_term_debt,
|
||||||
},
|
},
|
||||||
@ -999,24 +998,9 @@ def test_add_annual_report(
|
|||||||
"id": 3,
|
"id": 3,
|
||||||
"company_id": company_id,
|
"company_id": company_id,
|
||||||
"date": pd.to_datetime(date(year, 1, 1)),
|
"date": pd.to_datetime(date(year, 1, 1)),
|
||||||
"total_volume": float("NaN"),
|
"revenue": 123.0,
|
||||||
"ebit": 123.0,
|
|
||||||
"ebitda": 235.0,
|
"ebitda": 235.0,
|
||||||
"ebit_margin": float("NaN"),
|
|
||||||
"total_balance": float("NaN"),
|
|
||||||
"equity": float("NaN"),
|
|
||||||
"debt": float("NaN"),
|
|
||||||
"return_on_equity": float("NaN"),
|
|
||||||
"capital_turnover_rate": float("NaN"),
|
|
||||||
"current_liabilities": float("NaN"),
|
|
||||||
"dividends": float("NaN"),
|
|
||||||
"net_income": float("NaN"),
|
|
||||||
"assets": float("NaN"),
|
|
||||||
"long_term_debt": float("NaN"),
|
|
||||||
"short_term_debt": short_term_debt,
|
"short_term_debt": short_term_debt,
|
||||||
"revenue": float("NaN"),
|
|
||||||
"cash_flow": float("NaN"),
|
|
||||||
"current_assets": float("NaN"),
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@ -1025,6 +1009,7 @@ def test_add_annual_report(
|
|||||||
pd.testing.assert_frame_equal(
|
pd.testing.assert_frame_equal(
|
||||||
expected_results,
|
expected_results,
|
||||||
df_prior,
|
df_prior,
|
||||||
|
check_like=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user