Beispiel #1
0
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
Beispiel #2
0
 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
Beispiel #3
0
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()
Beispiel #4
0
 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
Beispiel #5
0
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)
Beispiel #6
0
    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
Beispiel #7
0
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)
Beispiel #8
0
    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)
Beispiel #9
0
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()
Beispiel #10
0
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"
Beispiel #11
0
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)
Beispiel #12
0
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