Example #1
0
def cancel_subscription():
    user = User(current_user)
    party = user.party

    subscriptions = Subscription.search([('party', '=', party.id),
                                         ('is_online', '=', True),
                                         ('state', '=', 'running')])

    invoices = Invoice.search([('party', '=', party.id),
                               ('state', '=', 'posted')])
    cancel_form = CancelEnrollForm()
    if len(subscriptions) == 0 and len(invoices) == 0:
        return redirect(url_for('course.index'))

    if len(subscriptions) > 0 or len(invoices) > 0:
        if cancel_form.validate_on_submit():
            if len(subscriptions) > 0:
                for subscription in subscriptions:
                    Subscription.draft([subscription])
                    Subscription.cancel([subscription])
            if len(invoices) > 0:
                for invoice in invoices:
                    Invoice.cancel([invoice])
            return redirect(url_for('course.index'))
    return render_template('course/cancel_enroll.html',
                           user=user,
                           cancel_form=cancel_form,
                           invoices=invoices,
                           subscriptions=subscriptions)
def fillData():
    user        =  User("test", "secret", "jaak", "*****@*****.**")
    user.admin = True

    i1lines =  [InvoiceLine(desc="Kommunaalid", sum=50.0),
                    InvoiceLine(desc="Toit", sum=220.0),
                    InvoiceLine(desc="Bensiin", sum=150.0),
                    InvoiceLine(desc="Kommunikatsioonid", sum=12.0)]
    invoice = Invoice(desc="test", lines=i1lines, number="A-001")
    i2lines = [InvoiceLine(desc="Kommunaalid", sum=45.0),
                    InvoiceLine(desc="Toit", sum=320.0),
                    InvoiceLine(desc="Bussipiletid", sum=99.0),
                    InvoiceLine(desc="Kommunikatsioonid", sum=32.0)]
    invoice2 = Invoice(desc="test2", lines=i2lines, number="A-003")
    i3lines = [InvoiceLine(desc="Kommunaalid", sum=65.0),
                    InvoiceLine(desc="Toit", sum=280.0),
                    InvoiceLine(desc="Bensiin", sum=159.0),
                    InvoiceLine(desc="Auto remont", sum=320),
                    InvoiceLine(desc="Kommunikatsioonid", sum=42.0)]
    invoice3 = Invoice(desc="test3", lines=i3lines)
    company = Company(name=u"Firma 1 OÜ", code=u"1234567", phone=u"+372-54321", repname=u"Eesnimi Perenimi", address=u"Õnnetuse  7 - 7, Kapa-Kohila alevik", email=u"*****@*****.**", issuer=True)
    db.session.add(company)
    client = Company(name=u"Kliendisuhete OÜ", code=u"11234567", repname=u"Teine Nimi", address=u"Kliendisuhete allee 2 - 5, Tallinn", email=u"*****@*****.**")
    db.session.add(client)
    invoice.issuer = company
    invoice.client = client
    db.session.add(user)
    db.session.add(invoice)
    db.session.add(invoice2)
    db.session.add(invoice3)
    db.session.commit()
Example #3
0
	def post(self):
		args = parse.parse_args()
		try:
			c_id = args['contact_id']
			dcontact = Contact.query.get(c_id).first()
		except:
			abort(404, message="Contact id: %s doesn't exist" % (c_id))
		inv = Invoice()
		inv.email = args['email']
		inv.invoice_date = args['invoice_date']
		inv.recipient_note = args['recipient_note']
		inv.subtotal = args['subtotal']
		inv.total = args['total']
		inv.paid = False
		inv.contact_id = c_id
		import paypalrestsdk
		paypalrestsdk.configure({
				"mode": "sandbox", # PAYPAL_MODE
				"client_id": app.config['PAYPAL_CLIENT_ID'], # PAYPAL_CLIENT_ID
				"client_secret": app.config['PAYPAL_CLIENT_SECRET'] })		# PAYPAL_CLIENT_SECRET
		paypal_invoice = paypalrestsdk.Invoice({
				"merchant_info": {
					"email":"*****@*****.**",
					"first_name":"Francisco",
					"last_name": "Barcena",
					"business_name":"fdev.tk",
					"phone":{"country_code": "001","national_number":"5555555555"},
					"address":{
						"line1":"123 Fake St. Apt.A",
						"city":"Fake City",
						"country_code":"US",
						"state":"California"
					},
				},
				"billing_info":[{"email":request.form["email"]}],
				"note":"MAKE MONEY F*CK B*TCHES"
		})
		# inv_lines (from list in args)
		the_items = []
		for the_item in inv_lines:
			# append to the_items (for paypal)
			the_items.append(dict({"name":the_item.d_description.data,"quantity":str(the_item.qty.data),"unit_price":{"currency":"USD","value":str(the_item.unit_price.data)}}))
			# Create and append to Invoice model
			new_invoice_line = InvoiceLine()
			new_invoice_line.description
			new_invoice_line.quantity
			new_invoice_line.unit_price
			new_invoice_line.amount
			inv.invoice_lines.append(new_invoice_line)	
		paypal_invoice.items = the_items
		error = None
		if paypal_invoice.create():
			print('paypal invoice created')
			# Add invoice lines here (from list as argument) 
			db.session.add(inv)
			db.session.commit()
		else:
			error = paypal_invoice.error
			abort(404, message="Invoice creation error: %s" % (error)) 
		return inv, 201
Example #4
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
Example #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)
Example #6
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()
Example #7
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
Example #8
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
Example #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()
Example #10
0
def delete_invoice(invoice_number):
    invoice = Invoice.get_by_invoice_number(invoice_number)
    invoice.delete()
    contract = Contract.get_by_contract_number(invoice.contract_number)
    invoices = __get_invoices(contract.contract_number)
    if len(invoices) == 0:
        logged_user = User.get_by_username(get_jwt_identity())
        logged_customer = Customer.get_by_user_id(logged_user.id)
        nif = logged_customer.nif
        cus_dwe_con = Customer_Dwelling_Contract \
         .get_by_nif_and_contract_number(
          nif,
          invoice.contract_number
         )
        cus_dwe_con.delete()
        contract.delete()
    return "", 200
Example #11
0
def my_bills():
    customer = None
    contracts = None
    contract_invoices = None
    if current_user.user_type == 1:
        customer = Customer.get_by_user_id(current_user.id)
        customers_dwellings_contracts = Customer_Dwelling_Contract.get_by_nif(
            customer.nif)
        contracts = []
        for customer_dwelling_contract in customers_dwellings_contracts:
            contracts.append(
                Contract.get_by_contract_number(
                    customer_dwelling_contract.contract_number))
        contract_invoices = {}
        for contract in contracts:
            contract_invoices[contract] = Invoice.get_by_contract_number(
                contract.contract_number)
    return render_template("bills/my_bills.html",
                           contracts=contracts,
                           contract_invoices=contract_invoices)
Example #12
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
Example #13
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)
Example #14
0
def get_stats():
    customer = None
    contracts = None
    contract_invoices = None
    if current_user.user_type == 1:
        customer = Customer.get_by_user_id(current_user.id)
        customers_dwellings_contracts = Customer_Dwelling_Contract.get_by_nif(
            customer.nif)
        contracts = []
        for customer_dwelling_contract in customers_dwellings_contracts:
            contracts.append(
                Contract.get_by_contract_number(
                    customer_dwelling_contract.contract_number))
        contract_invoices = {}
        for contract in contracts:
            year = int(contract.init_date.strftime("%Y"))
            year_invoices = Invoice.get_by_contract_number(
                contract.contract_number)
            total_amounts = []
            for invoice in year_invoices:
                total_amounts.append(invoice.total_amount)
            contract_invoices[year] = total_amounts
    return contract_invoices
Example #15
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)
Example #16
0
def inventory(request):
	if request.method == 'POST':
		#get the pending invoice for this user.
		# if one doesn't exist then create a new one
		user_invoice = Invoice.get_cart_invoice(request.user)

		if not user_invoice:
			response = HttpResponse()
			response.status_code = 303
			response['location'] = 'login'
			return response
				

		inventoryItem = InventoryType.objects.get(product_name=request.POST['item'])
		
		itemCount = int(request.POST['quantity'])
		#add invoice items to the invoice with the drone
		for x in range(itemCount):
			inv_item = InvoiceItem(invoice=user_invoice, inventory_type=inventoryItem)
			inv_item.save()
		
		#update the inventory count
		inventoryItem.stock_count = inventoryItem.stock_count - itemCount
		inventoryItem.save()
		
		response = HttpResponse()
		response.status_code = 303
		if request.POST['submit'] == 'add and go to checkout':
			response['location'] = 'checkout'
		else:
			response['location'] = 'inventory#body'
		return response
	
	inventory_items = InventoryType.objects.all()
	context = {'inventory_items': inventory_items}
	return render(request, 'app/inventory.html', context)
def process_order(request):
    print "placing order"

    try:
        phone_number = request.POST.get("phone_number")
        user_name = request.POST.get("userName")
        email = request.POST.get("email")
        app_version = request.POST.get("app_version")
        device_id = request.POST.get("device_id")
        app_id = request.POST.get("app_id")
        bring_change_of = int(request.POST.get("bring_change_of", "0"))
        address_str = request.POST.get("address")
        landmark = request.POST.get("landmark")
        location_show = request.POST.get("location_show")
        location_id = request.POST.get("location_id")
        api_key = request.POST.get("api_key")
        products = request.POST.get("products")
        tomorrow = request.POST.get("tomorrow")
        delivery_time = request.POST.get("delivery_time")
        # print request
        coupon_id = int(request.POST.get("coupon_id", "0"))

        coupon = None

        print "coupon"
        print phone_number
        user = User.objects.get(username=phone_number)
        if user:
            user.email = email
            user.first_name = user_name.title()
            user.save()
            user_profile = user.userprofile
            user_profile.app_version = app_version
            user_profile.app_id = app_id
            user_profile.device_id = device_id
            user_profile.save()
            if user.api_key.key != api_key:
                print "api key is not valid"
                data = simplejson.dumps({"status": "Not Valid Request"})
                return HttpResponse(data, content_type="application/json", status=403)
        else:
            print "User not found"
            data = simplejson.dumps({"status": "Not Valid Request"})
            return HttpResponse(data, content_type="application/json", status=403)

        print "user obj created"
        print coupon_id

        if coupon_id > 0:
            coupon = Coupon.objects.get(pk=coupon_id)
            coupon.used_count += 1
            coupon.save()
            print coupon
            prev_order = Order.objects.filter(coupon_applied=coupon, user=user)
            print user
            if prev_order:
                if prev_order[0].status != 1:
                    print "coupon invalidation1"
                    coupon = None
            print coupon
        print "check for coupon"
        location = Location.objects.get(pk=location_id)
        address = Address.objects.filter(user=user, address=address_str, landmark=landmark)
        if address:
            address = address[0]
            address.location = location
            address.save()
        else:
            address = Address(
                user=user, address=address_str, landmark=landmark, location_show=location_show, location=location
            )
            address.save()
        print "address done"

        # print products
        products = products.split(",")
        product_ids = map(lambda x: x.split("::")[0], products)
        product_qns = map(lambda x: x.split("::")[1], products)
        print product_ids
        print product_qns
        order = Order(user=user, total_amount=0, address=address, status=3)
        if tomorrow == "1":
            print delivery_time
            if dt.datetime.now().hour > 20:
                order.delivery_time = dt.datetime.strptime(
                    str((dt.datetime.now() + dt.timedelta(days=1)).date()) + " " + delivery_time, "%Y-%m-%d %I:%M %p"
                )
            else:
                order.delivery_time = dt.datetime.strptime(
                    str(dt.datetime.now().date()) + " " + delivery_time, "%Y-%m-%d %I:%M %p"
                )
        else:
            order.delivery_time = dt.datetime.now() + dt.timedelta(hours=1)
        if bring_change_of:
            order.change_requested = bring_change_of
        order.save()
        invoice = Invoice(order=order, product_json="")
        invoice.save()
        print "order obj saved"
        total_amount = 0
        index = 0

        ordered_services = {}
        products_json = []
        for p_id in product_ids:
            prd = StoreProductMapping.objects.get(pk=p_id)
            products_json.append(
                {
                    "spid": prd.id,
                    "pid": prd.product.product.id,
                    "name": prd.product.product.name,
                    "price": prd.price,
                    "discount": prd.discount,
                    "qn": product_qns[index],
                    "size_id": prd.product.size.id,
                }
            )
            service = prd.product.product.category.service
            if "offer" in service.name.lower():
                OfferDeviceId(device_id=device_id).save()
                OfferProductOrderMapping(
                    device_id=device_id, order=order, offer_product=prd.offerproductmapping_set.all()[0]
                ).save()
            if str(service.id) not in ordered_services:
                ordered_services[str(service.id)] = 0
            total_amount += int(product_qns[index]) * (prd.price - prd.discount)
            ordered_services[str(service.id)] += int(product_qns[index]) * (prd.price - prd.discount)
            store = prd.store
            cart = Cart.objects.filter(order=order, store=store)
            if cart:
                cart = cart[0]
            else:
                cart = Cart(order=order, store=store)
                cart.save()

            OrderedProduct(product=prd, cart=cart, quantity=product_qns[index]).save()
            index += 1
        products_json = simplejson.dumps(products_json)
        invoice.product_json = products_json
        invoice.save()

        service_amount_ordered = []
        for key in ordered_services:
            service_amount_ordered.append(str(key) + ":" + str(ordered_services[key]))
        service_amount_ordered = ";;".join(service_amount_ordered)
        print total_amount

        final_amount = total_amount

        if coupon:
            if total_amount >= coupon.min_total:
                order.coupon_applied = coupon
                print "found coupon"
                print coupon.code
                print coupon
                print user
                print location_id
                print int(app_version)
                print final_amount
                print service_amount_ordered
                discount = verify_coupon(
                    coupon, user, location_id, int(app_version), final_amount, service_amount_ordered
                )["discount"]
                print "discount" + str(discount)
                final_amount -= discount

        print "passed coupon part"

        delivery_charges = {}
        for key in ordered_services:
            service = Service.objects.get(pk=key)
            lsm = LocationServiceMapping.objects.filter(service=service, location=location)
            if lsm:
                lsm = lsm[0]
                stl = StoreTimingInLocation.objects.filter(store__is_active=True, is_active=True, lsm=lsm)
                print "done"
                if stl:
                    stl = stl[0]
                    if key not in delivery_charges:
                        delivery_charges[key] = {"delivery_charges": 0, "delivery_amount_min": stl.delivery_min_amount}
                    if ordered_services[key] < stl.delivery_min_amount:
                        final_amount += -stl.delivery_charges
                        total_amount += stl.delivery_charges
                        delivery_charges[key]["delivery_charges"] = stl.delivery_charges
                else:
                    delivery_charges[key] = {"delivery_charges": 0, "delivery_amount_min": 0}
            else:
                delivery_charges[key] = {"delivery_charges": 0, "delivery_amount_min": 0}

        print "passed delivery part"

        order.total_amount = total_amount
        order.final_amount = final_amount
        order.delivery_charges = simplejson.dumps(delivery_charges)
        order.save()
        OrderActivity(order=order, user=order.user, actions=0, comment=" ").save()

        data = simplejson.dumps({"status": "done"})
        return HttpResponse(data, content_type="application/json", status=201)
    except Exception as process_order_function_error:
        print "process_order: " + str(process_order_function_error)
        data = simplejson.dumps({"status": "Server Error"})
        send_mail(
            "Order placing Error " + str(process_order_function_error),
            str(request) + "\n\n\n" + str(simplejson.dumps(request.POST)),
            "*****@*****.**",
            ["*****@*****.**"],
            fail_silently=False,
        )
        return HttpResponse(data, content_type="application/json", status=500)
Example #18
0
def payment():
    #FIX WHEN CREDIT CARD IS ACTIVE
    return redirect(url_for('course.pay_with_bank'))
    user = User(current_user)
    party = user.party
    today = date.today()
    courses = []
    subscriptions = Subscription.search([('is_online', '=', True),
                                         ('party', '=', party.id),
                                         ('state', '=', 'running')])
    if len(subscriptions) < 1:
        return render_template(
            'bienvenido.html',
            user=user,
            flash_message=
            "Something wrong. Sorry the inconvenient. We will call you later.")
    else:
        for subscription in subscriptions:
            for line in subscription.lines:
                courses.append(line.service.id)
    with Transaction().set_context(courses=courses):
        user = User(current_user)
        if user.active_membership:
            return redirect(url_for('course.index'))

    ip_address = request.remote_addr
    if not ip_address or ip_address == '127.0.0.1':
        ip_address = '186.189.195.217'
    if ipaddress.ip_address(ip_address).is_private:
        ip_address = '186.189.195.217'
    access_token = 'cda5ddffc1e6b7'
    handler = ipinfo.getHandler(access_token)

    details = handler.getDetails(ip_address)
    country_code = details.country
    country_code = str(country_code)
    lcase_country_code = country_code.lower()
    currency_id = 16

    for currency in data:
        if str(currency['code']) == country_code:
            currency_id = currency['id']
            break
    currency = Currency(currency_id)

    with Transaction().set_context(currency_web=currency_id):
        invoices = Invoice.search([
            ('party', '=', party.id),
            ('state', '=', 'posted'),
        ])

    if len(subscriptions) >= 1 and len(invoices) >= 1:
        credentials = current_app.config['QPAYPRO_CREDENTIALS']
        cc_form = CreditCardForm()

        defaults = {}
        defaults['sessionid'] = uniqid()
        defaults['orgid'] = 'k8vif92e'  #'1snn5n9w' TEST OR PRODUCTION
        defaults['merchantid'] = credentials['merchantid']  #'visanetgt_qpay'
        defaults['user'] = user
        defaults['cc_form'] = cc_form
        defaults['invoices'] = invoices
        defaults['subscriptions'] = subscriptions
        defaults['currency'] = currency

        url_test = 'https://sandbox.qpaypro.com/payment/api_v1'
        url_production = 'https://payments.qpaypro.com/checkout/api_v1'

        if cc_form.validate_on_submit():
            credit_card = str(cc_form.card_number.data)
            credit_card.replace(' ', '')
            #invoice, = invoices
            success = True
            for invoice in invoices:
                params = {}
                params['x_login'] = credentials['x_login']  #'visanetgt_qpay'
                params['x_private_key'] = credentials[
                    'x_private_key']  # '88888888888'
                params['x_api_secret'] = credentials[
                    'x_api_secret']  #'99999999999'
                params['x_product_id'] = invoice.lines[0].product.id  #6
                params['x_audit_number'] = random.randint(1, 999999)
                params[
                    'x_fp_sequence'] = invoice.number  #1988679099 #INVOICE SEQUENCE NUMBER
                params[
                    'x_invoice_num'] = invoice.id  #random.randint(1,999999) #INVOICE SEQUENCE NUMBER
                params['x_fp_timestamp'] = time()
                params['x_currency_code'] = 'GTQ'
                params[
                    'x_amount'] = invoice.total_amount  #1.00 #invoice.total_amount
                params['x_line_item'] = invoice.lines[
                    0].product.name  #'T-shirt Live Dreams<|>w01<|><|>1<|>1000.00<|>N'
                params['x_freight'] = 0.00
                params['x_email'] = '*****@*****.**'
                params['cc_name'] = cc_form.name.data  #'john doe'
                params['cc_number'] = credit_card  #'4111111111111111'
                params['cc_exp'] = str(cc_form.expiration_date.data)  #'01/21'
                params['cc_cvv2'] = cc_form.code.data  #'4567'
                params['cc_type'] = 'visa'
                params['x_first_name'] = user.party.name  #'john'
                params['x_last_name'] = user.party.name  #'doe'
                params['x_company'] = 'API CENTRO'  #'Company'
                params['x_address'] = user.party.city  #'711-2880 Nulla'
                params['x_city'] = user.party.city  #'Guatemala'
                params['x_state'] = user.party.city  #'Guatemala'
                params['x_country'] = user.party.country  #'Guatemala'
                params['x_zip'] = '09001'
                params['x_relay_response'] = 'none'
                params['x_relay_url'] = 'none'
                params['x_type'] = 'AUTH_ONLY'
                params['x_method'] = 'CC'
                params[
                    'http_origin'] = 'https://www.apixela.net'  #'http://local.test.com'
                params['visaencuotas'] = 0
                params['device_fingerprint_id'] = defaults['sessionid']

                response = requests.post(url=url_production, params=params)

                res = response.raise_for_status()
                response_content = response.json()

                #response_content = {'responseCode':"100",
                #    'idTransaction':"102030"}

                response_code = response_content['responseCode']
                message = get_code(response_code)

                if response_code == "00":
                    transaction_id = response_content['idTransaction']
                    Invoice.card_payment_succeed([invoice],
                                                 reference=transaction_id)
                else:
                    success = False
                    break
            if success:
                return render_template('bienvenido.html',
                                       flash_message=message,
                                       user=user)
            else:
                return render_template(
                    'bienvenido.html',
                    user=user,
                    flash_message=
                    "Something wrong. Sorry the inconvenient. We will call you later."
                )
        return render_template('course/pay_enroll.html', **defaults)
    elif len(subscriptions) >= 1 and user.party.receivable != 0:
        return render_template(
            'bienvenido.html',
            user=user,
            flash_message=
            "Something wrong. Sorry the inconvenient. We will call you later.")
    else:
        return redirect(url_for('course.index'))
Example #19
0
def pay_with_bank():
    user = User(current_user)
    party = user.party
    today = date.today()
    courses = []
    subscriptions = Subscription.search([('is_online', '=', True),
                                         ('party', '=', party.id),
                                         ('state', '=', 'running')])
    if len(subscriptions) < 1:
        return render_template(
            'bienvenido.html',
            user=user,
            flash_message=
            "Something wrong. Sorry the inconvenient. We will call you later.")
    else:
        for subscription in subscriptions:
            for line in subscription.lines:
                courses.append(line.service.id)
    with Transaction().set_context(courses=courses):
        if user.active_membership:
            return redirect(url_for('course.index'))

    ip_address = request.remote_addr
    if not ip_address or ip_address == '127.0.0.1':
        ip_address = '186.189.195.217'
    if ipaddress.ip_address(ip_address).is_private:
        ip_address = '186.189.195.217'
    access_token = 'cda5ddffc1e6b7'
    handler = ipinfo.getHandler(access_token)

    details = handler.getDetails(ip_address)
    country_code = details.country
    country_code = str(country_code)
    lcase_country_code = country_code.lower()
    currency_id = 16

    for currency in data:
        if str(currency['code']) == country_code:
            currency_id = currency['id']
            break
    currency = Currency(currency_id)

    subscriptions = Subscription.search([('party', '=', party.id),
                                         ('is_online', '=', True),
                                         ('state', '=', 'running')])

    invoices = Invoice.search([
        ('party', '=', party.id),
        ('state', '=', 'posted'),
    ],
                              limit=1)

    current_line = None
    for invoice in invoices:
        move = invoice.move
        lines = move.lines
        for line in lines:
            if line.debit > 0:
                current_line = MoveLine(line.id)
                break
    if current_line is not None:
        enroll_form = EnrollRegistrationForm(invoice=current_line.description,
                                             amount=current_line.debit)
    if len(subscriptions) >= 1 and len(invoices) >= 1:
        if enroll_form.validate_on_submit():

            def _group_payment_key(payment):
                return (('journal', payment.journal.id), ('kind',
                                                          payment.kind))

            def _new_group(values):
                return PaymentGroup(**values)

            invoice = enroll_form.invoice.data
            amount = enroll_form.amount.data
            ticket = enroll_form.ticket.data
            if not current_line:
                return redirect(url_for('main.welcome'))
            journal, = Journal.search([('name', '=', 'DCOMPENSA')], limit=1)
            new_payment = Payment.create([{
                'journal': journal.id,
                'kind': 'receivable',
                'party': party.id,
                'line': current_line.id,
                'description': ticket,
                'amount': current_line.debit,
            }])
            Payment.approve(new_payment)
            payment, = new_payment
            groups = []
            new_payment = sorted(new_payment, key=_group_payment_key)
            for key, grouped_payments in groupby(new_payment,
                                                 key=_group_payment_key):

                def group():
                    group = _new_group(dict(key))
                    group.save()
                    groups.append(group)
                    return group

                Payment.process(list(grouped_payments), group)
            body = "Hemos recibido la siguiente informacion: " + \
                "Nombre: "+ party.name + \
                " \n  Ticket: " + ticket + \
                " \n  Usuario: " + user.email

            msg = Message('Usuario Web API: '+ party.name, \
                sender = '*****@*****.**', \
                recipients = ['*****@*****.**'])
            msg.body = "Usuario Web API " + body
            mail.send(msg)

            return redirect(url_for('main.welcome'))
        return render_template('course/pay_enroll_with_bank.html',
                               user=user,
                               enroll_form=enroll_form,
                               invoices=invoices,
                               subscriptions=subscriptions,
                               currency=currency)
    else:
        return redirect(url_for('course.index'))
Example #20
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"
Example #21
0
def delete_bill(invoice_number):
    invoice = Invoice.get_by_invoice_number(invoice_number)
    invoice.delete()
    return redirect(url_for("customer.my_bills"))
Example #22
0
def show_bill(invoice_number):
    invoice = Invoice.get_by_invoice_number(invoice_number)
    return render_template("bills/show_bill.html", invoice=invoice)
Example #23
0
def buy_with_card():

    course_id = request.args.get('course')

    if course_id == None:
        return redirect(url_for('course.index'))

    bank_form = EnrollBankForm()
    cc_form = EnrollCreditCardForm()

    if cc_form.validate_on_submit():
        course_id = int(course_id)
        user = User(current_user)
        courses = []
        courses.append(course_id)
        with Transaction().set_context(courses=courses):
            user = User(current_user)
            if user.active_membership:
                return redirect(url_for('course.index'))
        courses = Course.search([('id', '=', course_id)], limit=1)
        if len(courses) == 1:
            course, = courses
            if cc_form.cc_membership.data == 'MONTHLY':
                service_id = course.service.id
            else:
                service_id = course.yearly_service.id
            service = Service(service_id)
        party = user.party
        today = date.today()
        subscriptions = Subscription.search([
            ('party', '=', party.id),
            ('state', '=', 'running'),
            ('is_online', '=', True),
            ('lines.service', '=', service_id),
        ])
        if len(subscriptions) >= 1:
            return redirect(url_for('course.payment'))
        else:
            enrolment, = Product.search([('is_enrolment', '=', True)], limit=1)
            payment_term, = PaymentTerm.search([()], limit=1)
            address = user.party.addresses[0]
            new_subscription = Subscription.create([{
                'party':
                user.party.id,
                'start_date':
                today,
                'invoice_start_date':
                today,
                'invoice_recurrence':
                service.consumption_recurrence,
                'enrolment':
                enrolment.id,
                'unit_price_enrolment':
                0,
                'invoice_address':
                address,
                'payment_term':
                payment_term.id,
                'is_online':
                True,
            }])
            new_subscription_line, = SubscriptionLine.create([{
                'subscription':
                new_subscription[0].id,
                'service':
                service.id,
                'quantity':
                1,
                'start_date':
                today,
                'consumption_recurrence':
                service.consumption_recurrence,
                'unit':
                1,
                'unit_price':
                service.product.list_price,
            }])
            Subscription.quote(new_subscription)
            Subscription.run(new_subscription)
            SaleSubscriptionLine.generate_consumption(date=today,
                                                      party=user.party)
            Subscription.generate_invoice(date=today, party=user.party)
            invoices = Invoice.search([('party', '=', user.party)],
                                      order=[('number', 'DESC')])
            if len(invoices) >= 1:
                for invoice in invoices:
                    if invoice.state == 'draft':
                        Invoice.post([invoice])

            current_invoice = None
            for invoice in invoices:
                if invoice.state not in ['cancel', 'paid']:
                    current_invoice = invoice
                    break

            credentials = current_app.config['QPAYPRO_CREDENTIALS']
            cc_form = CreditCardForm()

            defaults = {}
            defaults['sessionid'] = uniqid()
            defaults['orgid'] = 'k8vif92e'  #'1snn5n9w' TEST OR PRODUCTION
            defaults['merchantid'] = credentials[
                'merchantid']  #'visanetgt_qpay'
            defaults['user'] = user
            defaults['cc_form'] = cc_form

            url_test = 'https://sandbox.qpaypro.com/payment/api_v1'
            url_production = 'https://payments.qpaypro.com/checkout/api_v1'

            credit_card = str(cc_form.card_number.data)
            credit_card.replace(' ', '')

            success = True

            params = {}
            params['x_login'] = credentials['x_login']  #'visanetgt_qpay'
            params['x_private_key'] = credentials[
                'x_private_key']  # '88888888888'
            params['x_api_secret'] = credentials[
                'x_api_secret']  #'99999999999'
            params['x_product_id'] = current_invoice.lines[0].product.id  #6
            params['x_audit_number'] = random.randint(1, 999999)
            params[
                'x_fp_sequence'] = current_invoice.number  #1988679099 #INVOICE SEQUENCE NUMBER
            params[
                'x_invoice_num'] = current_invoice.id  #random.randint(1,999999) #INVOICE SEQUENCE NUMBER
            params['x_fp_timestamp'] = time()
            params['x_currency_code'] = 'GTQ'
            params[
                'x_amount'] = current_invoice.total_amount  #1.00 #invoice.total_amount
            params['x_line_item'] = current_invoice.lines[
                0].product.name  #'T-shirt Live Dreams<|>w01<|><|>1<|>1000.00<|>N'
            params['x_freight'] = 0.00
            params['x_email'] = '*****@*****.**'
            params['cc_name'] = cc_form.name.data  #'john doe'
            params['cc_number'] = credit_card  #'4111111111111111'
            params['cc_exp'] = str(cc_form.expiration_date.data)  #'01/21'
            params['cc_cvv2'] = cc_form.code.data  #'4567'
            params['cc_type'] = 'visa'
            params['x_first_name'] = user.party.name  #'john'
            params['x_last_name'] = user.party.name  #'doe'
            params['x_company'] = 'API CENTRO'  #'Company'
            params['x_address'] = user.party.city  #'711-2880 Nulla'
            params['x_city'] = user.party.city  #'Guatemala'
            params['x_state'] = user.party.city  #'Guatemala'
            params['x_country'] = user.party.country  #'Guatemala'
            params['x_zip'] = '09001'
            params['x_relay_response'] = 'none'
            params['x_relay_url'] = 'none'
            params['x_type'] = 'AUTH_ONLY'
            params['x_method'] = 'CC'
            params[
                'http_origin'] = 'https://www.apixela.net'  #'http://local.test.com'
            params['visaencuotas'] = 0
            params['device_fingerprint_id'] = defaults['sessionid']
            params['bank_form'] = bank_form
            params['cc_form'] = cc_form

            response = requests.post(url=url_production, params=params)

            res = response.raise_for_status()
            response_content = response.json()

            #response_content = {'responseCode':"100",
            #    'idTransaction':"102030"}

            response_code = response_content['responseCode']
            message = get_code(response_code)

            if response_code == "00":
                transaction_id = response_content['idTransaction']
                Invoice.card_payment_succeed([current_invoice],
                                             reference=transaction_id)
            else:
                success = False
                Subscription.draft(new_subscription)
                Subscription.cancel(new_subscription)
                Invoice.cancel([current_invoice])
            if success:
                return render_template('bienvenido.html',
                                       flash_message=message,
                                       user=user)
            else:
                return render_template(
                    'bienvenido.html',
                    user=user,
                    flash_message=message,
                )
    return render_template('enroll.html', cc_form=cc_form, bank_form=bank_form)
Example #24
0
def buy_with_bank():
    course_id = request.args.get('course')
    if course_id == None:
        return redirect(url_for('course.index'))

    bank_form = EnrollBankForm()
    cc_form = EnrollCreditCardForm()
    course_id = int(course_id)
    user = User(current_user)
    courses = []
    courses.append(course_id)
    with Transaction().set_context(courses=courses):
        user = User(current_user)
        if user.active_membership:
            return redirect(url_for('course.index'))
    courses = Course.search([('id', '=', course_id)], limit=1)
    if len(courses) == 1:
        course, = courses
        if bank_form.bank_membership.data == 'MONTHLY':
            service_id = course.service.id
        else:
            service_id = course.yearly_service.id
        service = Service(service_id)
    if course:
        web_course = course

    ip_address = request.remote_addr
    if not ip_address or ip_address == '127.0.0.1':
        ip_address = '186.189.195.217'
    if ipaddress.ip_address(ip_address).is_private:
        ip_address = '186.189.195.217'
    access_token = 'cda5ddffc1e6b7'
    handler = ipinfo.getHandler(access_token)

    details = handler.getDetails(ip_address)
    country_code = details.country
    country_code = str(country_code)
    lcase_country_code = country_code.lower()
    currency_id = 16

    for currency in data:
        if str(currency['code']) == country_code:
            currency_id = currency['id']
            break
    currency = Currency(currency_id)

    if bank_form.validate_on_submit():
        party = user.party
        today = date.today()
        subscriptions = Subscription.search([
            ('party', '=', party.id),
            ('state', '=', 'running'),
            ('lines.service', '=', service_id),
        ])
        if len(subscriptions) >= 1:
            print("NO ACTIVE SUBSCRIPTIONS")
            return redirect(url_for('course.payment'))
        else:
            enrolment, = Product.search([('is_enrolment', '=', True)], limit=1)
            payment_term, = PaymentTerm.search([()], limit=1)
            address = user.party.addresses[0]
            new_subscription = Subscription.create([{
                'party':
                user.party.id,
                'start_date':
                today,
                'invoice_start_date':
                today,
                'invoice_recurrence':
                service.consumption_recurrence,
                'enrolment':
                enrolment.id,
                'unit_price_enrolment':
                0,
                'invoice_address':
                address,
                'is_online':
                True,
                'payment_term':
                payment_term.id,
            }])
            new_subscription_line, = SubscriptionLine.create([{
                'subscription':
                new_subscription[0].id,
                'service':
                service.id,
                'quantity':
                1,
                'start_date':
                today,
                'consumption_recurrence':
                service.consumption_recurrence,
                'unit':
                1,
                'unit_price':
                service.product.list_price,
            }])
            Subscription.quote(new_subscription)
            Subscription.run(new_subscription)
            SaleSubscriptionLine.generate_consumption(date=today,
                                                      party=user.party)
            Subscription.generate_invoice(date=today, party=user.party)
            invoices = Invoice.search([('party', '=', user.party)],
                                      order=[('number', 'DESC')])
            if len(invoices) >= 1:
                for invoice in invoices:
                    if invoice.state == 'draft':
                        Invoice.post([invoice])

            current_line = None
            current_invoice = None

            for invoice in invoices:
                if invoice.state not in ['cancel', 'paid']:
                    move = invoice.move
                    for line in move.lines:
                        if line.debit > 0:
                            current_line = MoveLine(line.id)
                            current_invoice = invoice
                            break
            if not current_line or not current_invoice:
                return redirect(url_for('main.welcome'))

            def _group_payment_key(payment):
                return (('journal', payment.journal.id), ('kind',
                                                          payment.kind))

            def _new_group(values):
                return PaymentGroup(**values)

            invoice = current_invoice
            amount = current_invoice.total_amount
            ticket = bank_form.ticket.data
            journal, = Journal.search([('name', '=', 'DCOMPENSA')], limit=1)
            new_payment = Payment.create([{
                'journal': journal.id,
                'kind': 'receivable',
                'party': party.id,
                'line': current_line.id,
                'description': ticket,
                'amount': current_line.debit,
            }])
            Payment.approve(new_payment)
            payment, = new_payment
            groups = []
            new_payment = sorted(new_payment, key=_group_payment_key)
            for key, grouped_payments in groupby(new_payment,
                                                 key=_group_payment_key):

                def group():
                    group = _new_group(dict(key))
                    group.save()
                    groups.append(group)
                    return group

                Payment.process(list(grouped_payments), group)
            body = "Hemos recibido la siguiente informacion: " + \
                "Nombre: "+ party.name + \
                " \n  Ticket: " + ticket + \
                " \n  Usuario: " + user.email

            msg = Message('Usuario Web API: '+ party.name, \
                sender = '*****@*****.**', \
                recipients = ['*****@*****.**'])
            msg.body = "Usuario Web API " + body
            mail.send(msg)

            return redirect(url_for('main.welcome'))

    return render_template('course/enroll.html',
                           cc_form=cc_form,
                           bank_form=bank_form,
                           user=user,
                           web_course=course,
                           currency=currency)
Example #25
0
def get_consumption_data():
    contract_invoices = {}
    logged_user = User.get_by_username(get_jwt_identity())
    if logged_user.user_type == 1:
        logged_customer = Customer.get_by_user_id(logged_user.id)
        customers_dwellings_contracts = Customer_Dwelling_Contract.get_by_nif(
            logged_customer.nif)
        contracts = []
        for customer_dwelling_contract in customers_dwellings_contracts:
            contracts.append(
                Contract.get_by_contract_number(
                    customer_dwelling_contract.contract_number))
        for contract in contracts:
            invoices = Invoice.get_by_contract_number(contract.contract_number)
            for invoice in invoices:
                year = int(invoice.init_date.strftime("%Y"))
                total_amount_list = [0 for _ in range(12)]
                consumed_energy_list = [0 for _ in range(12)]
                contracted_power_amount_list = [0 for _ in range(12)]
                consumed_energy_amount_list = [0 for _ in range(12)]
                tax_amount_list = [0 for _ in range(12)]
                if year in contract_invoices:
                    total_amount_list = contract_invoices[year][
                        "total_amount_list"]
                    consumed_energy_list = contract_invoices[year][
                        "consumed_energy_list"]
                    contracted_power_amount_list = contract_invoices[year][
                        "contracted_power_amount_list"]
                    consumed_energy_amount_list = contract_invoices[year][
                        "consumed_energy_amount_list"]
                    tax_amount_list = contract_invoices[year][
                        "tax_amount_list"]
                month = int(invoice.init_date.strftime("%m")) - 1

                if invoice.total_amount:
                    total_amount_list[month] = round(invoice.total_amount, 2)
                else:
                    total_amount_list[month] = 0

                if invoice.consumed_energy:
                    consumed_energy_list[month] = invoice.consumed_energy
                else:
                    consumed_energy_list[month] = 0

                if invoice.contracted_power_amount:
                    contracted_power_amount_list[month] = round(
                        invoice.contracted_power_amount, 2)
                else:
                    contracted_power_amount_list[month] = 0

                if invoice.consumed_energy_amount:
                    consumed_energy_amount_list[month] = round(
                        invoice.consumed_energy_amount, 2)
                else:
                    consumed_energy_amount_list[month] = 0

                if invoice.tax_amount:
                    tax_amount_list[month] = round(invoice.tax_amount, 2)
                else:
                    tax_amount_list[month] = 0
                contract_invoices[year] = {
                    "total_amount_list": total_amount_list,
                    "consumed_energy_list": consumed_energy_list,
                    "contracted_power_amount_list":
                    contracted_power_amount_list,
                    "consumed_energy_amount_list": consumed_energy_amount_list,
                    "tax_amount_list": tax_amount_list
                }
    else:
        return "No tienes permiso", 403
    return contract_invoices
Example #26
0
def __get_invoices(contract_number):
    _invoices = Invoice.get_by_contract_number(contract_number)
    invoices = []
    for invoice in _invoices:
        invoices.append(invoice.to_dict())
    return invoices
Example #27
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)
Example #28
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
Example #29
0
def yearly_enroll():
    course_id = request.args.get('course')
    if course_id == None:
        return redirect(url_for('course.index'))
    course_id = int(course_id)
    user = User(current_user)
    courses = []
    courses.append(course_id)
    with Transaction().set_context(courses=courses):
        user = User(current_user)
        if user.active_membership:
            return redirect(url_for('course.index'))
    courses = Course.search([('id', '=', course_id)], limit=1)
    if len(courses) == 1:
        course, = courses
        service_id = course.yearly_service.id
        service = Service(service_id)
    party = user.party
    today = date.today()
    subscriptions = Subscription.search([
        ('party', '=', party.id),
        ('state', '=', 'running'),
        ('lines.service', '=', service_id),
    ])
    if len(subscriptions) >= 1:
        return redirect(url_for('course.payment'))
    else:
        enrolment, = Product.search([('is_enrolment', '=', True)], limit=1)
        payment_term, = PaymentTerm.search([()], limit=1)
        address = user.party.addresses[0]
        new_subscription = Subscription.create([{
            'party':
            user.party.id,
            'start_date':
            today,
            'invoice_start_date':
            today,
            'invoice_recurrence':
            service.consumption_recurrence,
            'enrolment':
            enrolment.id,
            'unit_price_enrolment':
            0,
            'invoice_address':
            address,
            'is_online':
            True,
            'payment_term':
            payment_term.id,
        }])
        new_subscription_line, = SubscriptionLine.create([{
            'subscription':
            new_subscription[0].id,
            'service':
            service.id,
            'quantity':
            1,
            'start_date':
            today,
            'consumption_recurrence':
            service.consumption_recurrence,
            'unit':
            1,
            'unit_price':
            service.product.list_price,
        }])
        Subscription.quote(new_subscription)
        Subscription.run(new_subscription)
        SaleSubscriptionLine.generate_consumption(date=today, party=user.party)
        Subscription.generate_invoice(date=today, party=user.party)
        invoices = Invoice.search([('party', '=', user.party)])
        if len(invoices) >= 1:
            for invoice in invoices:
                if invoice.state == 'draft':
                    Invoice.post([invoice])
        return redirect(url_for('course.payment'))