def handle(self, *args, **options): #faster and less likely to mess stuff up. klasses = [] #kl_paths = accountifie.environment.api.variable({'name':'BMO_MODULES'}).split(',') kl_paths = api_func('environment', 'variable_list', 'BMO_MODULES') # find all the BMO classes for path in kl_paths: for name, kl in inspect.getmembers(importlib.import_module(path), inspect.isclass): if BusinessModelObject in kl.__bases__: klasses.append(kl) with transaction.atomic(): Transaction.objects.all().delete() for cmpny in [c['id'] for c in api_func('gl', 'company')]: QueryManagerStrategyFactory().erase(cmpny) print "deleted all transactions" QueryManagerStrategyFactory().set_fast_inserts('*', True) for klass in klasses: print 'working on', klass qs = klass.objects.all() for obj in qs: obj.update_gl() print 'finished with', klass QueryManagerStrategyFactory().set_fast_inserts('*', False) QueryManagerStrategyFactory().take_snapshot('*') print "updated %d transactions" % qs.count()
def forecast_run_task(fcast_id, report_id, col_tag, company_ID=utils.get_default_company(), version='v1'): fcast = Forecast.objects.get(id=fcast_id) strategy = QueryManagerStrategyFactory().get('forecast') strategy.set_cache(fcast_id=fcast_id, proj_gl_entries=fcast.get_gl_entries()) report = accountifie.reporting.rptutils.get_report(report_id, company_ID, version=version) report.configure(col_tag=col_tag) report.set_gl_strategy(strategy) report_data = report.calcs() path = os.path.join(settings.DATA_ROOT, 'forecast_%s_%s.csv' % (fcast_id, report_id)) f = open(path, 'wb') writer = csv.writer(f) writer.writerow([''] + report.column_order) map_values = lambda x: '' if x == '' else str(x['text']) for row in report_data: writer.writerow([row['label']] + [ map_values(row[col]) for col in [x for x in report.column_order if x in row] ]) f.close()
def save(self): models.Model.save(self) logger.info('saving snapshot with snapshot time %s' % self.snapped_at) # now create snapshot for company_id in [ c['id'] for c in api_func('gl', 'company') if c['cmpy_type'] == 'ALO' ]: fmt = '%Y-%m-%dT%H:%M:%SZ' snapshot_time = self.snapped_at.astimezone(UTC).strftime(fmt) QueryManagerStrategyFactory().get().take_snapshot( company_id, snapshot_time=snapshot_time)
def glsnapshots_balances(request, snap_id): snapshot = models.GLSnapshot.objects.get(id=snap_id) snapshot_time = snapshot.snapped_at.isoformat() strategy = QueryManagerStrategyFactory().get('snapshot') strategy.set_cache(snapshot_time) report, is_report, format = report_prep(request, 'RecBalances') if not is_report: return report report.qm_strategy = strategy report.snapshot = snapshot report.columns = { 'snapshot': 'snapshot', 'current': 'current', 'diff': 'diff' } report_data = report.calcs() if format == 'json': return HttpResponse(json.dumps(report_data, cls=DjangoJSONEncoder), content_type="application/json") elif format == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="report.csv"' writer = csv.writer(response) writer.writerow([''] + report.column_order) map_values = lambda x: '' if x == '' else str(x['text']).replace( '-', '0') for row in report_data: writer.writerow( [row['label']] + [map_values(row[col]) for col in report.column_order]) return response elif format == 'html': # not bootstrap ... the more custom style for more complex reports context = report.html_report_context() context['query_string'] = request.META['QUERY_STRING'] context['rows'] = [] for rec in report_data: context['rows'] += report.get_row(rec) return render_to_response('report.html', RequestContext(request, context)) else: msg = "Sorry. This format is not recognised : %s" % format return render_to_response('404.html', RequestContext(request, {'message': msg})), False
def fcast_report(request, fcast_id, rpt_id): fcast = Forecast.objects.get(id=fcast_id) strategy = QueryManagerStrategyFactory().get('forecast') strategy.set_cache(fcast_id=fcast_id, proj_gl_entries=fcast.get_gl_entries()) report, is_report, format = report_prep(request, rpt_id, version='v1', strategy=strategy) if not is_report: return report report_data = report.calcs() if format == 'json': return HttpResponse(json.dumps(report_data, cls=DjangoJSONEncoder), content_type="application/json") elif format == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="report.csv"' writer = csv.writer(response) writer.writerow([''] + report.column_order) map_values = lambda x: '' if x == '' else str(x['text']) for row in report_data: writer.writerow([row['label']] + [ map_values(row[col]) for col in [x for x in report.column_order if x in row] ]) return response elif format == 'html': # not bootstrap ... the more custom style for more complex reports context = report.html_report_context() context['query_string'] = request.META['QUERY_STRING'] context['rows'] = [] for rec in report_data: context['rows'] += report.get_row(rec) return render_to_response('report.html', RequestContext(request, context)) else: msg = "Sorry. This format is not recognised : %s" % format return render_to_response('404.html', RequestContext(request, {'message': msg})), False
def download_transactions(request): company_ID = utils.get_company(request) snapshot_time = datetime.datetime.now() strategy = QueryManagerStrategyFactory().get('snapshot') strategy.set_cache(None) trans = strategy.get_all_transactions(company_ID) all_accts_list = api_func('gl', 'account') all_accts = dict((r['id'], r) for r in all_accts_list) response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="transactions.csv"' writer = csv.writer(response) writer.writerow(['', '', '', '', '', '','debit', 'debit', 'debit', 'debit','credit', 'credit', 'credit', 'credit']) writer.writerow(['Id', 'dateEnd', 'date', 'type', 'comment', 'counterpartyId', 'amount', 'accountId', 'account name','counterpartyId', 'amount', 'accountId', 'account name']) for ex in trans: first_line = ex['lines'][0] acct_id = first_line['accountId'] acct = api_func('gl', 'account', acct_id) if (acct['role'] in ['asset', 'expense'] and float(first_line['amount']) >0) or \ (acct['role'] in ['liability', 'income', 'capital'] and float(first_line['amount']) < 0): debit = ex['lines'][0] credit = ex['lines'][1] else: debit = ex['lines'][1] credit = ex['lines'][0] row = [ex[k] for k in ['bmoId', 'dateEnd', 'date', 'type', 'comment']] row += [debit[k] for k in ['counterpartyId', 'amount', 'accountId']] row.append(all_accts[debit['accountId']]['display_name']) row += [credit[k] for k in ['counterpartyId', 'amount', 'accountId']] row.append(all_accts[credit['accountId']]['display_name']) writer.writerow(row) return response