def get_quarter_date(period, accumulated=False):
    """
    Returns end of the quarter associated to the informed period
    :param period: a date
    :return: the end date of the quarter associated to the period
    """
    if not accumulated:
        period_quarter = quarter(period)
        month = MONTHS_PER_QUARTER[period_quarter - 1]
        return date(period.year, month,
                    calendar.monthrange(period.year, month)[1])
    else:
        periods = []

        period_quarter = quarter(period)
        month_per_quarter = [3, 6, 9, 12]
        month = month_per_quarter[period_quarter - 1]
        while True:
            new_period = \
                date(
                    period.year,
                    month,
                    calendar.monthrange(period.year, month)[1])
            periods.append(new_period)

            if period_quarter == 1:
                break

            period_quarter -= 1
            month = month_per_quarter[period_quarter - 1]
        return periods
Пример #2
0
def get_same_quarter_prev_period(period, accumulated=False):
    """
    Returns the previous period (quarter) given a date. If the period is part
    of the first quarter non previous quarter is returned.
    :param period: a date
    :param accumulated: if we want all the dates from
                    the start of the prev year until the quarter
    :return: the previous quarter or null if the period is part of the
             first quarter
    """
    if not accumulated:
        period_quarter = quarter(period)
        month_per_quarter = [3, 6, 9, 12]
        month = month_per_quarter[period_quarter - 1]

        return date(period.year - 1, month,
                    calendar.monthrange(period.year - 1, month)[1])
    else:
        periods = []

        period_quarter = quarter(period)
        month_per_quarter = [3, 6, 9, 12]
        month = month_per_quarter[period_quarter - 1]
        while True:
            new_period = date(period.year - 1, month,
                              calendar.monthrange(period.year - 1, month)[1])
            periods.append(new_period)

            if period_quarter == 1:
                break

            period_quarter -= 1
            month = month_per_quarter[period_quarter - 1]
        return periods
Пример #3
0
def pre_save_bovespa_company_file(sender,
                                  instance=None,
                                  using=None,
                                  update_fields=None,
                                  **kwargs):
    instance.updated_at = datetime.utcnow()

    if instance.fiscal_date:
        date_data = instance.fiscal_date.date().timetuple()
        instance.fiscal_date_y = date_data.tm_year
        instance.fiscal_date_yd = date_data.tm_yday
        instance.fiscal_date_q = quarter(instance.fiscal_date.date())
        instance.fiscal_date_m = date_data.tm_mon
        instance.fiscal_date_md = date_data.tm_mday
        instance.fiscal_date_w = week_of_year(instance.fiscal_date.date())
        instance.fiscal_date_wd = date_data.tm_wday
        instance.fiscal_date_yq = "{year}-Q{quarter}".\
            format(year=instance.fiscal_date_y,
                   quarter=instance.fiscal_date_q)
        instance.fiscal_date_ym = "{year}-{month:02d}".\
            format(year=instance.fiscal_date_y,
                   month=instance.fiscal_date_m)
    else:
        instance.fiscal_date_y = None
        instance.fiscal_date_yd = None
        instance.fiscal_date_q = None
        instance.fiscal_date_m = None
        instance.fiscal_date_md = None
        instance.fiscal_date_w = None
        instance.fiscal_date_wd = None
        instance.fiscal_date_yq = None
        instance.fiscal_date_ym = None
def get_prev_quarter_date(period):
    """
    Returns the previous period (quarter) given a date. If the period is part
    of the first quarter non previous quarter is returned.
    :param period: a date
    :return: the previous quarter or null if the period is part of the
             first quarter
    """
    period_quarter = quarter(period)
    if period_quarter == 1:
        return

    previous_quarter = period_quarter - 1 if period_quarter > 1 else 4

    month_per_quarter = [3, 6, 9, 12]

    year = period.year if period_quarter > 1 else period.year - 1
    month = month_per_quarter[previous_quarter - 1]

    return date(year, month, calendar.monthrange(year, month)[1])
Пример #5
0
def get_financial_info_accounts(sector, available_files, company_file):
    accounts = []

    money_scale, quant_scale = get_scales(available_files, company_file)

    data = convert_xml_into_json(available_files[FILE_FINANCIAL_INFO.format(
        doc_type=company_file.doc_type.lower())])

    for account_info in data["ArrayOfInfoFinaDFin"]["InfoFinaDFin"]:
        acc_version = account_info["PlanoConta"]["VersaoPlanoConta"]
        try:
            account = {
                "ccvm":
                company_file.ccvm,
                "period":
                company_file.fiscal_date,
                "version":
                company_file.version,
                "balance_type":
                BALANCE_TYPES[int(
                    acc_version["CodigoTipoDemonstracaoFinanceira"]["$"])],
                "financial_info_type":
                FINANCIAL_INFO_TYPES[
                    int(acc_version["CodigoTipoInformacaoFinanceira"]["$"]) -
                    1],
                "number":
                str(account_info["PlanoConta"]["NumeroConta"]["$"]),
                "name":
                str(account_info["DescricaoConta1"]["$"]),
                "sector":
                sector,
            }
        except KeyError as ex:
            _logger.exception(
                "Unable to found a field in account=[{}]".format(
                    json.dumps(account_info, sort_keys=True, indent=4)), ex)
            raise ex

        if account["balance_type"] == DFP_BALANCE_DMPL:
            period = account_info["PeriodoDemonstracaoFinanceira"][
                "NumeroIdentificacaoPeriodo"]["$"]
            if (company_file.doc_type == DOC_TYPE_DFP
                    and period != 1) or (company_file.doc_type == DOC_TYPE_ITR
                                         and period != 4):
                continue

            # Shares outstanding
            dmpl_account = dict(account)
            dmpl_account["comments"] = "Capital social integralizado"
            dmpl_account["amount"] = float(account_info["ValorConta1"]["$"])
            dmpl_account = BovespaAccount.create(**dmpl_account)
            accounts.append(dmpl_account)

            # Reserves
            dmpl_account = dict(account)
            dmpl_account["comments"] = "Reservas de capital"
            dmpl_account["amount"] = float(account_info["ValorConta2"]["$"] /
                                           money_scale)
            dmpl_account = BovespaAccount.create(**dmpl_account)
            accounts.append(dmpl_account)

            # Revenue reserves
            dmpl_account = dict(account)
            dmpl_account["comments"] = "Reservas de lucro"
            dmpl_account["amount"] = float(account_info["ValorConta3"]["$"] /
                                           money_scale)
            dmpl_account = BovespaAccount.create(**dmpl_account)
            accounts.append(dmpl_account)

            # Accrued Profit/Loss
            dmpl_account = dict(account)
            dmpl_account["comments"] = "Lucros/Prejuízos acumulados"
            dmpl_account["amount"] = float(account_info["ValorConta4"]["$"] /
                                           money_scale)
            dmpl_account = BovespaAccount.create(**dmpl_account)
            accounts.append(dmpl_account)

            # Accumulated other comprehensive income
            dmpl_account = dict(account)
            dmpl_account["comments"] = "Outros resultados abrangentes"
            dmpl_account["amount"] = float(account_info["ValorConta5"]["$"] /
                                           money_scale)
            dmpl_account = BovespaAccount.create(**dmpl_account)
            accounts.append(dmpl_account)

            # Stockholder's equity
            dmpl_account = dict(account)
            dmpl_account["comments"] = "Patrimônio Líquido"
            dmpl_account["amount"] = float(account_info["ValorConta6"]["$"] /
                                           money_scale)
            dmpl_account = BovespaAccount.create(**dmpl_account)
            accounts.append(dmpl_account)
        else:
            if company_file.doc_type == DOC_TYPE_DFP:
                account["amount"] = float(
                    account_info["ValorConta1"]["$"]) / money_scale
            elif company_file.doc_type == DOC_TYPE_ITR:
                # Profit and Los (ASSETS or LIABILITIES)
                if account["balance_type"] in [
                        DFP_BALANCE_BPA, DFP_BALANCE_BPP
                ]:
                    account["amount"] = float(
                        account_info["ValorConta2"]["$"]) / money_scale
                # Discounted Cash-flow (direct/indirect) and
                #   Value Added Demostration
                elif account["balance_type"] in [
                        DFP_BALANCE_DFC_MD, DFP_BALANCE_DFC_MI, DFP_BALANCE_DVA
                ]:
                    account["amount"] = float(
                        account_info["ValorConta4"]["$"]) / money_scale
                else:
                    q = quarter(account["period"].date())
                    if q == 1:
                        account["amount"] = float(
                            account_info["ValorConta4"]["$"]) / money_scale
                    else:
                        account["amount"] = float(
                            account_info["ValorConta2"]["$"]) / money_scale
            account = BovespaAccount.create(**account)
            accounts.append(account)

    return accounts