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
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
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])
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