def getMonthsList(): firstMovement = Movement.select().order_by(Movement.date.asc()).get() firstMovement.date = firstMovement.date + relativedelta(months=-1) lastMovement = Movement.select().order_by(Movement.date.desc()).get() startDate = datetime.datetime.strftime(firstMovement.date, '%Y-%m-%d') endDate = datetime.datetime.strftime(lastMovement.date, '%Y-%m-%d') months = pd.date_range(startDate, endDate, freq='MS').strftime("%b-%Y$%Y/%m").tolist() return months
def addMovement(year, month): movement = Movement.create(date=request.form['date'], original_name=request.form['name'], value=request.form['value'], type=request.form['type'], status='SHOW') movement.save() return redirect("/" + year + "/" + month)
def addCategory(movement_id): name = request.form['name'] try: category = Category.get(name=name) except: category = Category.create(name=name) category.save() movement = Movement.get(id=movement_id) Movement_has_Category.create(movement=movement, category=category).save() return jsonify({'id': category.id})
def list(year, month): if not month: now = datetime.datetime.now() year = str(now.year) month = str(now.month) try: movements = Movement.select().where( Movement.date.between(year + '-' + month + '-01', year + '-' + month + '-31')).order_by(Movement.date.asc()) months = getMonthsList() total = 0 totalIncome = 0 totalOutcome = 0 for movement in movements: if movement.status == 'SHOW': movement.tags = Category.select().join( Movement_has_Category).join(Movement).where( Movement.id == movement.id) if movement.type == 'OUTCOME': total = total - movement.value totalOutcome = totalOutcome + movement.value else: total = total + movement.value totalIncome = totalIncome + movement.value return render_template('movements.jinja2', movements=movements, total=total, months=months, totalIncome=totalIncome, totalOutcome=totalOutcome, year=year, month=month) except: return render_template('movements.jinja2', movements=[], total=0, months=[], totalIncome=0, totalOutcome=0)
def getMovementsByTags(year, month): tags = Category.select().execute() data = [] for tag in tags: movements = Movement.select().join(Movement_has_Category).join( Category).where((Category.id == tag.id) & (Movement.date.between( year + '-' + month + '-01', year + '-' + month + '-31'))) sum = 0 for movement in movements: if movement.type == "OUTCOME": sum = sum + movement.value if sum: data.append({'name': tag.name, 'value': sum}) data = sorted(data, key=lambda k: k['value']) for item in data: item['value'] = str(item['value']) return jsonify(data)
def changeMovementName(movement_id): movement = Movement.get(id=movement_id) movement.edited_name = request.form['newName'] movement.save() return "ok"
def removeMovement(movement_id): movement = Movement.get(id=movement_id) movement.status = Movement.STATUS_HIDE movement.save() return "ok"
def __init__(self, uuid): # Movement_has_Category.delete().execute() # Movement.delete().execute() downloader = Downloader(uuid) account_statements = downloader.download_account_data() for statement in account_statements: try: movement = Movement.get(hash=statement['id']) if movement.id: continue except: date = datetime.strptime(statement['postDate'], '%Y-%m-%d') if statement['__typename'] == 'BarcodePaymentEvent': type = 'OUTCOME' original_name = statement['title'] + " " + statement[ 'detail'] elif statement['__typename'] == 'TransferOutEvent': type = 'OUTCOME' original_name = statement['title'] + " " + statement[ 'destinationAccount']['name'] elif statement['__typename'] == 'TransferInEvent': original_name = statement['title'] if statement['originAccount']: original_name = original_name + " " + statement[ 'originAccount']['name'] type = 'INCOME' if statement['__typename'] == 'TransferOutReversalEvent': value = float(statement['detail'].split( 'R$ ', 1)[1].replace('.', '').replace(',', '.')) type = 'REVERSAL' else: value = statement['amount'] Movement.create(original_name=original_name, date=date, value=value, status='SHOW', type=type, hash=statement['id']) card_statements = downloader.download_credit_card_data() for statement in card_statements: try: movement = Movement.get(hash=statement['id']) if movement.id: continue except: rest = statement['time'].split( 'T', 1)[0] # todo Haw ficou de corrigir para a data iso date = datetime.strptime(rest, '%Y-%m-%d') Movement.create(original_name=statement['description'], date=date, value=statement['amount'] / 100, status='SHOW', type='OUTCOME', hash=statement['id'])