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