def get_list_invoice(invoice_df, db): li_no_company = [] #a enlever apres que ça marche for tup in invoice_df.itertuples(): company = Company.query.filter_by(company_name=tup.nom_entreprise) if company.count() == 1: quote = Quote.query.filter_by(ref_quote=tup.ref_devis) invoice_params = { 'ref_invoice': tup.ref_facture, 'invoice_type': tup.type_facture, 'company': company.first(), 'created_at': tup.date_paiement_recu, 'quotes': quote.all() } if quote.count() != 0: invoice_params['quotes'] = quote.all() invoice = Invoice(**invoice_params) db.session.add(invoice) db.session.commit() else: # ?? si pas compagnie on ajoute pas ? li_no_company.append({ 'nb_comp': company.count(), 'nom_entreprise': tup.nom_entreprise, 'ref_invoice': tup.ref_facture, 'ref_quote': tup.ref_devis }) return li_no_company #a enlever apres que ça marche
def test_bad_invoice(self): """ notify returns error when invoice params don't match request """ inv = Invoice(10, '980', 'bad') db.session.add(inv) db.session.commit() with app.app.app_context(): rv = self.app.post( url_for("notify"), data=GOOD_REQUEST, headers=HEADERS) assert 'ERROR' == rv.data
def makeInvoice(): test = Invoice(invoiceID='111', date='2/21/20', mvr4seasons='mvr', clinic='test clinic 2', clinicSerialNum='456', doctor='Doctor2', docSerialNum='789', svcTotal=1200) db.session.add(test) db.session.commit()
def test_good_invoice(self): """ notify returns OK when invoice matches request """ inv = Invoice(10, '980', 'description') db.session.add(inv) db.session.commit() with app.app.app_context(): rv = self.app.post( url_for("notify"), data=GOOD_REQUEST, headers=HEADERS) print rv.data assert 'OK' == rv.data
def createInvoice(inv_data, supplier_id, user): groups = defaultdict(lambda: defaultdict(lambda: defaultdict(list))) for c in inv_data: if c.amount > 0: groups[c.product][c.price]['+'].append(c) else: groups[c.product][c.price]['-'].append(c) invoice = Invoice(user=user, sent=(user.id == supplier_id), paid=(user.id == supplier_id), date=datetime.datetime.utcnow(), positions=[], supplier_id=supplier_id) for product, pricedict in groups.items(): for price, consumptions in pricedict.items(): if len(consumptions['+']) > 0: summe = sum((c.price * c.amount) for c in consumptions['+']) amount = sum(c.amount for c in consumptions['+']) p = Position(amount=amount, price=price, sum=summe, invoice=invoice, product=product) invoice.positions.append(p) if len(consumptions['-']) > 0: summe = sum((c.price * c.amount) for c in consumptions['-']) amount = sum(c.amount for c in consumptions['-']) p = Position(amount=amount, price=price, sum=summe, invoice=invoice, product=product) invoice.positions.append(p) for c in inv_data: c.invoice = invoice c.billed = True invsum = float("{0:.2f}".format(sum(p.sum for p in invoice.positions))) invoice.sum = invsum db.session.add(invoice)
def create_invoice(self, invoice_payload): fiat_currency = 'USD' if invoice_payload['currency'].lower() == 'btc': fiat_amount = ExchangeRate.query.filter_by( token=fiat_currency.lower(), ).one().convert_from_bitcoin( invoice_payload['price']) elif invoice_payload['currency'].lower() == 'sats': fiat_amount = ExchangeRate.query.filter_by( token=fiat_currency.lower(), ).one().convert_from_bitcoin( invoice_payload['price'], is_sats=True) else: fiat_amount = invoice_payload['price'] fiat_currency = invoice_payload['currency'] raw_invoice = self.client.create_invoice({ 'price': invoice_payload['price'], 'memo': invoice_payload['message'], 'currency': invoice_payload['currency'], 'notificationURL': (f'{os.getenv("FLASK_SERVER_URL")}' 'callbacks/btcpay') }) db_invoice = Invoice( status=InvoiceStatus.UNPAID, invoice_unique_id=raw_invoice['id'], raw_invoice=json.dumps(raw_invoice), payment_processor_id=self.id, message=invoice_payload['message'], username=invoice_payload['tipper_name'], user_id=self.user_id, fiat_amount=fiat_amount, fiat_currency=fiat_currency, ) db.session.add(db_invoice) db.session.commit() return raw_invoice
def salesorder(): form = Invoice() title = 'New Order' sql = text('SELECT count(*) + 1 from invoice;') next_num = db.engine.execute(sql) invnum = 0 for x in next_num: invnum = x[0] # This one not working? #print( datetime.datetime.today()) # print(form.valid_support_date.data) #print(request.form["invoice_num"]) # try: # #print(form.date_created.data) #invoice2 = Invoice(invoice_num=form.invoice_num.data, amount=str(form.amount.data), description=str(form.description.data), date_created=datetime.datetime.today(), cx_id=str(form.cx_id.data), sales_rep_id=str(form.sales_rep_id.data)) try: invoice = text( 'INSERT INTO invoice (invoice_num, amount, description, cx_id, sales_rep_id, valid_support_date, date_created) VALUES ({}, {}, "{}", {}, {}, {}, {});' .format(invnum, form.amount.data, 'x', form.cx_id.data, form.sales_rep_id.data, '11/19/2019', '11/19/2019')) print(invoice) db.engine.execute(invoice) db.session.commit() except: print('bad') #for x in invoice2: # print(x) #invoice = Invoice(invoice_num=next_num[0], amount=str(form.amount.data), description=str(form.description.data), date_created=str(form.date_created.data), cx_id=str(form.cx_id.data), support_plan=str(form.support_plan.data), sales_rep_id=str(form.sales_rep_id.data), valid_support_date=str(form.valid_support_date.data)) #db.session.add(invoice) #db.session.commit() # except: # print("failed writing ivnoice to table") user = User.query.filter_by(username=current_user.username) now = datetime.datetime.now() return render_template('salesorder.html', next_num=invnum, month=month, user=user, title=title, form=form)
def post(self): try: current_user.id except AttributeError as e: abort(403) args = parser.parse_args() args = dict((k, v) for k, v in args.items() if v is not None) args['user_id'] = current_user.id view_return = {} if args['request_type'] == 'add': args['id'] = makeID(args['total'] + args['to_name'] + args['from_name'] + str(time.time())) args['issued_date'] = datetime.today().strftime("%Y-%m-%d") del args['request_type'] newCol = Invoice(**args) db.session.add(newCol) view_return = { 'status': 200, 'id': args['id'], 'date': args['issued_date'], 'action': 'add' } elif args['request_type'] == 'update': print(args) del args['request_type'] db.session.query(Invoice).filter_by(id=args['id']).update(args) view_return = {'status': 200, 'id': args['id'], 'action': 'update'} elif args['request_type'] == 'delete': row = db.session.query(Invoice).filter_by(id=args['id']).first() row.hidden = True view_return = {'status': 200, 'id': args['id'], 'action': 'delete'} db.session.commit() return jsonify(view_return)
def load_invoices(file='../data/invoices.json'): input_file = open(file, encoding='utf-8') json_array = json.load(input_file) for inv in json_array: company = Company.query.get(inv['company_id']) buyer = Contact.query.get(inv['buyer_id']) user = User.query.get(inv['user_id']) issue_date = dt.datetime.strptime(inv['issue_date'], '%Y-%m-%d') due_date = dt.datetime.strptime(inv['due_date'], '%Y-%m-%d') invoice = Invoice(issue_date=issue_date, due_date=due_date, payment_form=inv['payment_form'], type=inv['type'], invoice_buyer=buyer, invoice_company=company, invoice_author=user) invoice.create_serial_number() db.session.add(invoice) load_invoice_items(inv['items'], invoice) invoice.total_sum = sum([item['total_price'] for item in inv['items']]) db.session.commit()
def process_bill(): if request.method == "POST": file = request.files["inputFile"] if not file.filename: flash("No se ha seleccionado ningún archivo") return redirect(url_for("customer.upload_bill")) if file and __allowed_file(file.filename): # save file to upload directory with a hash code file_extension = file.filename.rsplit(".", 1)[1].lower() filename = str(uuid.uuid4()) + "." + file_extension bill_path = os.path.join(app.config["UPLOAD_FOLDER"], filename) file.save(bill_path) # information extraction from the bill results = docreco.process_bill(bill_path, file_extension) # return results # Delete the bill uploaded os.remove(bill_path) contract_number = __get_first_value(results["Datos del contrato"]["ReferenciaContrato"]) \ .split('/')[0] \ .split('-')[0] \ .split(' ')[0] if contract_number: contract = Contract.get_by_contract_number(contract_number) if not contract: company_name = __get_first_value( results["Datos de la factura"]["Comercializadora"]) if company_name: trading_company = Company.get_trading_company_by_name( company_name, unidecode.unidecode(company_name)) if trading_company: cif = trading_company.cif else: flash( "No se encuentra la comercializadora ni existe cif en la factura" ) return redirect(url_for("customer.my_bills")) else: flash( "No se encuentra el nombre de la comercializadora en la factura" ) return redirect(url_for("customer.my_bills")) contract_data = __get_contract_data(results) contract = Contract( contract_number=contract_number, contracted_power=contract_data["contracted_power"], toll_access=contract_data["toll_access"], end_date=contract_data["end_date"], CNAE=contract_data["CNAE"], tariff_access=contract_data["tariff_access"], cif=cif) contract.save() else: flash("No se encuentra el número de referencia del contrato") return redirect(url_for("customer.my_bills")) invoice_data = __get_invoice_data(results, contract_number) invoice = Invoice( invoice_number=invoice_data["invoice_number"], contracted_power_amount=invoice_data[ "contracted_power_amount"], consumed_energy_amount=invoice_data["consumed_energy_amount"], issue_date=invoice_data["issue_date"], charge_date=invoice_data["charge_date"], init_date=invoice_data["init_date"], end_date=invoice_data["end_date"], total_amount=invoice_data["total_amount"], contract_reference=invoice_data["contract_reference"], contract_number=invoice_data["contract_number"], document=file.read()) try: invoice.save() except IntegrityError: flash("Esta factura ya está registrada") return redirect(url_for("customer.my_bills")) cups = __get_first_value(results["Datos del contrato"]["CUPS"]) if cups and not Dwelling.get_by_cups(cups): __create_dwelling_with_cups(results, cups) else: cups = __create_dwelling_with_random_cups(results) customer_dwelling_contract = Customer_Dwelling_Contract( nif=Customer.get_by_user_id(current_user.id).nif, cups=cups, contract_number=contract_number) customer_dwelling_contract.save() flash("La factura se ha guardado con éxito") return redirect( url_for("customer.show_bill", invoice_number=invoice.invoice_number)) else: flash( "Los tipos de fichero permitidos son txt, pdf, png, jpg, jpeg, gif" ) return redirect(url_for("customer.upload_bill")) return "Error POST"
def invoice(): form = InvoiceForm() report_ct = Report_CT.query.order_by(Report_CT.timestamp.desc()).limit(10) report_radio = Report_Radiographic.query.order_by( Report_Radiographic.timestamp.desc()).limit(10) report_us = Report_US.query.order_by(Report_US.timestamp.desc()).limit(10) misc = Report_Misc.query.order_by(Report_Misc.timestamp.desc()).limit(10) echo = Report_Echo.query.order_by(Report_Echo.timestamp.desc()).limit(10) if form.validate_on_submit(): print('validated!!!') clinicData = form.practice.data clinicData = clinicData.split('__') doctorData = form.doctor.data doctorData = doctorData.split('__') newInvoice = Invoice(invoiceID=randomStringDigits(8), date=form.date.data, mvr4seasons=form.mvr4seasons.data, clinic=clinicData[0], clinicSerialNum=clinicData[1], doctor=doctorData[0], docSerialNum=doctorData[1], svcTotal=form.priceTotal.data) db.session.add(newInvoice) #flush to get the invoice's new ID for reference in invoice items db.session.flush() print('InvoiceID:', newInvoice.invoiceID) #start seaching each slot for invoices, and add them to the database print('form report1 data: ' + form.reportID1.data) if form.reportID1.data != '': newinvoiceitem = Invoice_Item(invoiceID=newInvoice.invoiceID, serviceType=form.service1.data, reportID=form.reportID1.data, patient=form.patient1.data, price=form.price1.data) db.session.add(newinvoiceitem) if form.reportID2.data != '': newinvoiceitem = Invoice_Item(invoiceID=newInvoice.invoiceID, serviceType=form.service2.data, reportID=form.reportID2.data, patient=form.patient2.data, price=form.price2.data) db.session.add(newinvoiceitem) if form.reportID3.data != '': newinvoiceitem = Invoice_Item(invoiceID=newInvoice.invoiceID, serviceType=form.service3.data, reportID=form.reportID3.data, patient=form.patient3.data, price=form.price3.data) db.session.add(newinvoiceitem) db.session.commit() flash('Added Invoice to Database') return redirect(url_for('index')) return render_template('/invoice.html', title='New Invoice', report_ct=report_ct, report_radio=report_radio, report_us=report_us, misc=misc, echo=echo, form=form)
def process_bill(): try: file = request.files["file"] except BadRequestKeyError: return { "message": "No se ha seleccionado ningún archivo", "type": "error" }, 200 if not __allowed_file(file.filename): return { "message": "Los tipos de fichero permitidos son txt, pdf, png, jpg, jpeg, gif", "type": "error" }, 200 # save file to upload directory with a hash code file_extension = file.filename.rsplit(".", 1)[1].lower() filename = str(uuid.uuid4()) + "." + file_extension bill_path = os.path.join(app.config["UPLOAD_FOLDER"], filename) file.save(bill_path) # information extraction from the bill results = docreco.process_bill(bill_path, file_extension) # Delete the bill uploaded os.remove(bill_path) contract_number = __get_first_value( results["Datos del contrato"]["ReferenciaContrato"]).split( '/')[0].split('-')[0].split(' ')[0] if contract_number: contract = Contract.get_by_contract_number(contract_number) if not contract: cif = __get_first_value(results["Datos de la factura"]["CIF"]) if cif: trading_company = Company.get_by_cif(cif) if not trading_company: return { "message": "No se encuentra la comercializadora", "type": "error" }, 200 else: company_name = __get_first_value( results["Datos de la factura"]["Comercializadora"]) if company_name: trading_company = Company.get_trading_company_by_name( company_name, unidecode.unidecode(company_name)) if trading_company: cif = trading_company.cif else: return { "message": "No se encuentra la comercializadora ni el cif en la factura", "type": "error" }, 200 else: return { "message": "No se encuentra el nombre de la comercializadora en la factura", "type": "error" }, 200 contract_data = __get_contract_data(results) contract = Contract( contract_number=contract_number, contracted_power=contract_data["contracted_power"], toll_access=contract_data["toll_access"], end_date=contract_data["end_date"], CNAE=contract_data["CNAE"], tariff_access=contract_data["tariff_access"], cif=cif) contract.save() else: return { "message": "No se encuentra el número de referencia del contrato", "type": "error" }, 200 invoice_data = __get_invoice_data(results, contract_number) invoice = Invoice( invoice_number=invoice_data["invoice_number"], contracted_power_amount=invoice_data["contracted_power_amount"], consumed_energy_amount=invoice_data["consumed_energy_amount"], issue_date=invoice_data["issue_date"], charge_date=invoice_data["charge_date"], init_date=invoice_data["init_date"], end_date=invoice_data["end_date"], total_amount=invoice_data["total_amount"], contract_reference=invoice_data["contract_reference"], contract_number=invoice_data["contract_number"], document=file.read()) try: invoice.save() except IntegrityError: return { "message": "Esta factura ya está registrada", "type": "error" }, 200 cups = __get_first_value(results["Datos del contrato"]["CUPS"]) if cups: if not Dwelling.get_by_cups(cups): __create_dwelling_with_cups(results, cups) else: cups = __create_dwelling_with_random_cups(results) logged_user = User.get_by_username(get_jwt_identity()) logged_customer = Customer.get_by_user_id(logged_user.id) nif = logged_customer.nif if not Customer_Dwelling_Contract.get_by_nif_and_contract_number( nif, contract_number): customer_dwelling_contract = Customer_Dwelling_Contract( nif=nif, cups=cups, contract_number=contract_number) try: customer_dwelling_contract.save() except IntegrityError: pass return { "message": "La factura se ha guardado con éxito", "type": "success" }, 200