def populate(self, *args): cur_settings = local_storage.read_settings() self.ids.business_company_name.text = cur_settings.get( 'business_company_name', '') self.ids.business_owner_first_name.text = cur_settings.get( 'business_owner_first_name', '') self.ids.business_owner_last_name.text = cur_settings.get( 'business_owner_last_name', '') self.ids.business_address.text = cur_settings.get( 'business_address', '') self.ids.business_email.text = cur_settings.get('business_email', '') self.ids.business_phone.text = cur_settings.get('business_phone', '') self.ids.disclosure_statement.text = cur_settings.get( 'disclosure_statement', '') self.ids.receiving_btc_address.text = '\n'.join( cur_settings.get('receiving_btc_address_list', [])) self.ids.coinmarketcap_api_key.text = cur_settings.get( 'coinmarketcap_api_key', '') self.ids.btc_usd_commission_percent.text = cur_settings.get( 'btc_usd_commission_percent', '0.0') self.ids.usd_btc_commission_percent.text = cur_settings.get( 'usd_btc_commission_percent', '0.0') self.ids.price_precision_matching_percent.text = cur_settings.get( 'price_precision_matching_percent', '1.0') self.ids.price_precision_fixed_amount.text = cur_settings.get( 'price_precision_fixed_amount', '1.0') self.ids.time_matching_seconds_before.text = cur_settings.get( 'time_matching_seconds_before', '0') self.ids.time_matching_seconds_after.text = cur_settings.get( 'time_matching_seconds_after', '0') self.ids.contract_expiration_period_days.text = cur_settings.get( 'contract_expiration_period_days', '0') self.ids.save_settings_button.disabled = True
def on_save_button_clicked(self, *args): cur_settings = local_storage.read_settings() cur_settings[ 'business_company_name'] = self.ids.business_company_name.text cur_settings[ 'business_owner_first_name'] = self.ids.business_owner_first_name.text cur_settings[ 'business_owner_last_name'] = self.ids.business_owner_last_name.text cur_settings['business_address'] = self.ids.business_address.text cur_settings['business_email'] = self.ids.business_email.text cur_settings['business_phone'] = self.ids.business_phone.text cur_settings[ 'disclosure_statement'] = self.ids.disclosure_statement.text cur_settings['receiving_btc_address_list'] = list( filter(None, self.ids.receiving_btc_address.text.split('\n'))) cur_settings[ 'coinmarketcap_api_key'] = self.ids.coinmarketcap_api_key.text cur_settings[ 'btc_usd_commission_percent'] = self.ids.btc_usd_commission_percent.text cur_settings[ 'usd_btc_commission_percent'] = self.ids.usd_btc_commission_percent.text cur_settings[ 'price_precision_matching_percent'] = self.ids.price_precision_matching_percent.text cur_settings[ 'price_precision_fixed_amount'] = self.ids.price_precision_fixed_amount.text cur_settings[ 'time_matching_seconds_before'] = self.ids.time_matching_seconds_before.text cur_settings[ 'time_matching_seconds_after'] = self.ids.time_matching_seconds_after.text cur_settings[ 'contract_expiration_period_days'] = self.ids.contract_expiration_period_days.text local_storage.write_settings(cur_settings) self.ids.save_settings_button.disabled = True
def on_verfy_transactions_button_clicked(self): cur_settings = local_storage.read_settings() try: contract_expiration_period_days = int( cur_settings.get('contract_expiration_period_days')) except: contract_expiration_period_days = 0 self.ids.verify_contracts_button.disabled = True self.verification_progress = 0 for transaction_details in local_storage.load_transactions_list(): if transaction_details.get('blockchain_status') == 'confirmed': continue if transaction_details.get('void'): continue if contract_expiration_period_days: contract_local_time = datetime.datetime.strptime( '{} {}'.format(transaction_details['date'], transaction_details['time']), '%b %d %Y %I:%M %p') t_now = datetime.datetime.now() if (t_now - contract_local_time ).days > contract_expiration_period_days: continue self.transactions_to_be_verified.append(transaction_details) if len(self.transactions_to_be_verified) >= 10: break Clock.schedule_once(self.verify_next_transaction, 0)
def on_start_transaction_button_clicked(self): cur_settings = local_storage.read_settings() t_now = datetime.datetime.now() btc_usd_commission_percent = float( cur_settings.get('btc_usd_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) factor = (100.0 + btc_usd_commission_percent) / 100.0 contract_btc_price = str(round(btc_price_current * factor, 2)) transaction_details = {} transaction_details.update( dict( contract_type='sales', usd_amount=self.ids.usd_amount_input.text, world_btc_price=self.ids.btc_price_input.text, btc_price=contract_btc_price, btc_amount=btc_util.clean_btc_amount( self.ids.btc_amount_input.text), fee_percent=str( float(cur_settings.get('btc_usd_commission_percent', '0.0'))), date=t_now.strftime("%b %d %Y"), time=t_now.strftime("%I:%M %p"), seller=dict( customer_id=None, first_name=cur_settings.get('business_owner_first_name', ''), last_name=cur_settings.get('business_owner_last_name', ''), address=cur_settings.get('business_address', ''), email=cur_settings.get('business_email', ''), phone=cur_settings.get('business_phone', ''), btc_address=(cur_settings.get('receiving_btc_address_list', [ '', ]) or [ '', ])[0], ), buyer=dict( customer_id=self.selected_customer_id, first_name=self.ids.person_first_name_input.text, last_name=self.ids.person_last_name_input.text, address=self.ids.person_address_input.text, email=self.ids.person_email_input.text, phone=self.ids.person_phone_input.text, btc_address=self.ids.receive_address_input.text, ), company_name=cur_settings.get('business_company_name', ''), )) new_transaction_details = local_storage.create_new_transaction( transaction_details) local_storage.write_transaction( new_transaction_details['transaction_id'], new_transaction_details) self.clean_input_fields() self.scr('one_transaction_screen' ).transaction_id = new_transaction_details['transaction_id'] self.scr_manager().current = 'one_transaction_screen'
def populate_btc_usd_price(self): cur_settings = local_storage.read_settings() coinmarketcap_api_key = cur_settings.get('coinmarketcap_api_key', '') if coinmarketcap_api_key: coinmarketcap_client.cryptocurrency_listings( api_key=coinmarketcap_api_key, start=1, limit=1, convert='USD', cb=self.on_coinmarketcap_response, )
def clean_input_fields(self): self.selected_customer_id = None self.ids.person_first_name_input.text = '' self.ids.person_last_name_input.text = '' self.ids.person_phone_input.text = '' self.ids.person_email_input.text = '' self.ids.person_address_input.text = '' self.ids.usd_amount_input.text = '0.0' self.ids.btc_price_input.text = '0.0' self.ids.btc_amount_input.text = '0.0' cur_settings = local_storage.read_settings() self.ids.receive_address_input.text = cur_settings.get( 'receiving_btc_address', '')
def on_pdf_file_button_clicked(self): cur_settings = local_storage.read_settings() transaction_details = local_storage.read_transaction( self.transaction_id) if transaction_details: buy_contract = render_pdf.build_pdf_contract( transaction_details=transaction_details, disclosure_statement=cur_settings.get('disclosure_statement') or '', pdf_filepath=os.path.join( local_storage.contracts_dir(), 'transaction_{}.pdf'.format(self.transaction_id)), ) system.open_system_explorer(buy_contract['filename'])
def on_btc_amount_input_changed_earlier(self, *args): self.populate_usd_amount_task = None if not self.ids.btc_amount_input.focused: return cur_settings = local_storage.read_settings() try: btc_amount_current = float(self.ids.btc_amount_input.text) usd_btc_commission_percent = float( cur_settings.get('usd_btc_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) factor = (100.0 + usd_btc_commission_percent) / 100.0 except: return self.ids.usd_amount_input.text = '%.2f' % round( factor * btc_amount_current * btc_price_current, 2)
def populate_next_btc_address(self): cur_settings = local_storage.read_settings() recent_btc_address = cur_settings.get('recent_btc_address') receiving_btc_address_list = cur_settings.get( 'receiving_btc_address_list', []) if receiving_btc_address_list: recent_pos = -1 if recent_btc_address and recent_btc_address in receiving_btc_address_list: recent_pos = receiving_btc_address_list.index( recent_btc_address) recent_pos += 1 if recent_pos >= len(receiving_btc_address_list): recent_pos = 0 self.ids.receive_address_input.text = receiving_btc_address_list[ recent_pos]
def populate_usd_amount_from_btc_amount(self): # USD_amount = ((100.0 + BTC_USD_commission) / 100.0) * BTC_amount * BTC_price_coinmarkercap cur_settings = local_storage.read_settings() try: btc_amount_current = float(self.ids.btc_amount_input.text) btc_usd_commission_percent = float( cur_settings.get('btc_usd_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) rate_for_this_contract = btc_price_current * ( 1.0 + btc_usd_commission_percent / 100.0) except: import traceback traceback.print_exc() return self.ids.usd_amount_input.text = '%.2f' % round( btc_amount_current * rate_for_this_contract, 2)
def on_btc_amount_input_changed_earlier(self, *args): self.populate_usd_amount_task = None if not self.ids.btc_amount_input.focused: return cur_settings = local_storage.read_settings() try: btc_amount_current = float( btc_util.clean_btc_amount(self.ids.btc_amount_input.text)) usd_btc_commission_percent = float( cur_settings.get('usd_btc_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) rate_for_this_contract = btc_price_current * ( 1.0 + usd_btc_commission_percent / 100.0) except: return self.ids.usd_amount_input.text = '%.2f' % round( btc_amount_current * rate_for_this_contract, 2)
def populate_btc_amount_from_usd_amount(self): cur_settings = local_storage.read_settings() try: usd_amount_current = float(self.ids.usd_amount_input.text) btc_usd_commission_percent = float( cur_settings.get('btc_usd_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) rate_for_this_contract = btc_price_current * ( 1.0 + btc_usd_commission_percent / 100.0) except: import traceback traceback.print_exc() return if btc_price_current: t = ('%.6f' % round(usd_amount_current / rate_for_this_contract, 6)).rstrip('0') if t.endswith('.'): t += '0' self.ids.btc_amount_input.text = t
def on_start_transaction_button_clicked(self): cur_settings = local_storage.read_settings() t_now = datetime.datetime.now() transaction_details = {} transaction_details.update( dict( contract_type='purchase', usd_amount=self.ids.usd_amount_input.text, btc_price=self.ids.btc_price_input.text, btc_amount=self.ids.btc_amount_input.text, fee_percent=str( float(cur_settings.get('usd_btc_commission_percent', '0.0'))), date=t_now.strftime("%b %d %Y"), time=t_now.strftime("%H:%M %p"), seller=dict( customer_id=self.selected_customer_id, first_name=self.ids.person_first_name_input.text, last_name=self.ids.person_last_name_input.text, btc_address=self.ids.receive_address_input.text, address=self.ids.person_address_input.text, email=self.ids.person_email_input.text, phone=self.ids.person_phone_input.text, ), buyer=dict( customer_id=None, first_name=cur_settings.get('business_owner_first_name', ''), last_name=cur_settings.get('business_owner_last_name', ''), address=cur_settings.get('business_address', ''), email=cur_settings.get('business_email', ''), phone=cur_settings.get('business_phone', ''), btc_address=cur_settings.get('receiving_btc_address', ''), ), company_name=cur_settings.get('business_company_name', ''), )) new_transaction_details = local_storage.create_new_transaction( transaction_details) local_storage.write_transaction( new_transaction_details['transaction_id'], new_transaction_details) self.scr('one_transaction_screen' ).transaction_id = new_transaction_details['transaction_id'] self.scr_manager().current = 'one_transaction_screen'
def on_usd_amount_input_changed_earlier(self, *args): self.populate_btc_amount_task = None if not self.ids.usd_amount_input.focused: return cur_settings = local_storage.read_settings() try: usd_amount_current = float(self.ids.usd_amount_input.text) btc_usd_commission_percent = float( cur_settings.get('btc_usd_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) factor = 100.0 / (100.0 + btc_usd_commission_percent) except: return if btc_price_current: t = ('%.6f' % round(factor * usd_amount_current / btc_price_current, 6)).rstrip('0') if t.endswith('.'): t += '0' self.ids.btc_amount_input.text = t
def on_usd_amount_input_changed_earlier(self, *args): self.populate_btc_amount_task = None if not self.ids.usd_amount_input.focused: return cur_settings = local_storage.read_settings() try: usd_amount_current = float(self.ids.usd_amount_input.text) usd_btc_commission_percent = float( cur_settings.get('usd_btc_commission_percent', '0.0')) btc_price_current = float(self.ids.btc_price_input.text) rate_for_this_contract = btc_price_current * ( 1.0 + usd_btc_commission_percent / 100.0) except: return if btc_price_current: t = ('%.6f' % round(usd_amount_current / rate_for_this_contract, 6)).rstrip('0') if t.endswith('.'): t += '0' self.ids.btc_amount_input.text = t
def on_verify_button_clicked(self): transaction_details = local_storage.read_transaction( self.transaction_id) if transaction_details.get('blockchain_status') == 'confirmed': return cur_settings = local_storage.read_settings() self.ids.verify_button.disabled = True self.ids.verify_status_label.text = '[color=#505050]requesting transactions from btc.com ...[/color]' matching_transactions = btc_util.verify_contract( contract_details=transaction_details, price_precision_fixed_amount=float( cur_settings.get('price_precision_fixed_amount', '0.0')), price_precision_matching_percent=float( cur_settings.get('price_precision_matching_percent', '0.0')), time_matching_seconds_before=float( cur_settings.get('time_matching_seconds_before', '0.0')), time_matching_seconds_after=float( cur_settings.get('time_matching_seconds_after', '0.0')), ) self.ids.verify_button.disabled = False st = '' if len(matching_transactions) == 0: st = '[color=#505050]did not found any matching transactions for BTC address %s[/color]' % transaction_details[ 'buyer']['btc_address'] elif len(matching_transactions) > 1: st = '[color=#F05050]found multiple matching transactions for BTC address %s[/color]' % transaction_details[ 'buyer']['btc_address'] else: st = '[color=#70a070]found corresponding transaction of %s BTC for address %s[/color]' % ( transaction_details['btc_amount'], transaction_details['buyer']['btc_address']) transaction_details['blockchain_status'] = 'confirmed' transaction_details['blockchain_tx_info'] = matching_transactions[ 0] local_storage.write_transaction( transaction_details['transaction_id'], transaction_details) self.ids.verify_status_label.text = st self.populate_fields(transaction_details)
def on_save_button_clicked(self, *args): cur_settings = local_storage.read_settings() cur_settings[ 'business_company_name'] = self.ids.business_company_name.text cur_settings[ 'business_owner_first_name'] = self.ids.business_owner_first_name.text cur_settings[ 'business_owner_last_name'] = self.ids.business_owner_last_name.text cur_settings['business_address'] = self.ids.business_address.text cur_settings['business_email'] = self.ids.business_email.text cur_settings['business_phone'] = self.ids.business_phone.text cur_settings[ 'disclosure_statement'] = self.ids.disclosure_statement.text cur_settings[ 'receiving_btc_address'] = self.ids.receiving_btc_address.text cur_settings[ 'coinmarketcap_api_key'] = self.ids.coinmarketcap_api_key.text cur_settings[ 'btc_usd_commission_percent'] = self.ids.btc_usd_commission_percent.text cur_settings[ 'usd_btc_commission_percent'] = self.ids.usd_btc_commission_percent.text local_storage.write_settings(cur_settings) self.ids.save_settings_button.disabled = True
def populate(self, *args): cur_settings = local_storage.read_settings() self.ids.business_company_name.text = cur_settings.get( 'business_company_name', '') self.ids.business_owner_first_name.text = cur_settings.get( 'business_owner_first_name', '') self.ids.business_owner_last_name.text = cur_settings.get( 'business_owner_last_name', '') self.ids.business_address.text = cur_settings.get( 'business_address', '') self.ids.business_email.text = cur_settings.get('business_email', '') self.ids.business_phone.text = cur_settings.get('business_phone', '') self.ids.disclosure_statement.text = cur_settings.get( 'disclosure_statement', '') self.ids.receiving_btc_address.text = cur_settings.get( 'receiving_btc_address', '') self.ids.coinmarketcap_api_key.text = cur_settings.get( 'coinmarketcap_api_key', '') self.ids.btc_usd_commission_percent.text = cur_settings.get( 'btc_usd_commission_percent', '0.0') self.ids.usd_btc_commission_percent.text = cur_settings.get( 'usd_btc_commission_percent', '0.0') self.ids.save_settings_button.disabled = True
def verify_next_transaction(self, *args): if not self.transactions_to_be_verified: self.ids.verify_contracts_button.disabled = False return transaction_details = self.transactions_to_be_verified.pop(0) self.verification_progress += 1 if _Debug: print('verify_next_transaction %r progress is %r' % (transaction_details['transaction_id'], self.verification_progress)) cur_settings = local_storage.read_settings() matching_transactions = btc_util.verify_contract( contract_details=transaction_details, price_precision_matching_percent=float( cur_settings.get('price_precision_matching_percent', '0.0')), price_precision_fixed_amount=float( cur_settings.get('price_precision_fixed_amount', '0.0')), time_matching_seconds_before=float( cur_settings.get('time_matching_seconds_before', '0.0')), time_matching_seconds_after=float( cur_settings.get('time_matching_seconds_after', '0.0')), ) if len(matching_transactions) == 1: transaction_details['blockchain_status'] = 'confirmed' transaction_details['blockchain_tx_info'] = matching_transactions[ 0] local_storage.write_transaction( transaction_details['transaction_id'], transaction_details) for transaction_item in self.ids.transactions_view.data: if transaction_item['tr_id'] == transaction_details[ 'transaction_id']: transaction_item[ 'blockchain_status'] = '[color={}][{}][/color]'.format( '#60b060', 'confirmed') self.ids.transactions_view.refresh_from_data() Clock.schedule_once(self.verify_next_transaction, 5.0)
def build_pdf_contract(transaction_details, disclosure_statement='', pdf_filepath=None, qr_filepath=None, face_photo_filepath=None): if not pdf_filepath: pdf_filepath = tempfile.mktemp(suffix='.pdf', prefix='btc-contract-') if os.path.isfile(pdf_filepath): os.remove(pdf_filepath) if not qr_filepath: qr_filepath = tempfile.mktemp(suffix='.png', prefix='btc-contract-qr-') if os.path.isfile(qr_filepath): os.remove(qr_filepath) html_template = """ <html> <head> <title>Bitcoin.ai Ltd.</title> </head> <body> <table width=100%> <tr> <td align=right colspan="4"> <font size=+1>BITCOIN {contract_type_str} CONTRACT</font> <hr> </td> </tr> <tr valign=top> <td align=left colspan="4"> <font size=+1><h1>BitCoin.ai Ltd.</h1></font> </td> </tr> <tr valign=top> <td colspan="3"> <font size=+2> <p> Customer {buying_selling} Bitcoin: <b>{first_name} {last_name}</b> <br> Customer number: {customer_id} <br> Price at coinmarketcap.com: <b>${world_btc_price}</b> US / BTC <br> Price offset: {fee_percent}% <br> Price for this contract: <b>${btc_price}</b> US / BTC <br> Dollar Amount: <b>${usd_amount}</b> US <br> Bitcoin Amount: {btc_amount} <br> Date: {date} <br> Time: {time} </p> </font> </td> <td colspan="1"> <img src="{face_photo_filepath}" width="150"> </td> </tr> <tr> <td colspan="4"> <hr> </td> </tr> <tr> <td colspan="4" align=center> <p>Where {sender} will send {btc_amount} to:</p> <font size=+2> <code> {buyer[btc_address]} </code> </font> <img src="{qr_filepath}" width="600"> <hr> <p align=left>{disclosure_statement}</p> </td> </tr> </table> <table width=100% align=left cellspacing=50> <tr> <td align=left width=50%> <br> <hr> <font size=+1><b>{business_owner_first_name} {business_owner_last_name}</b> for {business_company_name}</font> </td> <td align=left width=50%> <br> <hr> <font size=+1><b>{first_name} {last_name}</b></font> </td> </tr> </table> </body> </html> """ cur_settings = local_storage.read_settings() contract_type = transaction_details['contract_type'] buyer = transaction_details['buyer'] seller = transaction_details['seller'] customer_id = seller['customer_id'] if contract_type == 'purchase' else buyer['customer_id'] if not face_photo_filepath: face_photo_filepath = local_storage.customer_photo_filepath(customer_id) params = { 'qr_filepath': qr_filepath, 'face_photo_filepath': face_photo_filepath, 'contract_type_str': contract_type.upper(), 'buying_selling': 'selling' if contract_type == 'purchase' else 'buying', 'first_name': seller['first_name'] if contract_type == 'purchase' else buyer['first_name'], 'last_name': seller['last_name'] if contract_type == 'purchase' else buyer['last_name'], 'customer_id': customer_id, 'sender': '{} {}'.format(seller['first_name'], seller['last_name']), 'business_company_name': cur_settings.get('business_company_name') or '', 'business_owner_first_name': cur_settings.get('business_owner_first_name') or '', 'business_owner_last_name': cur_settings.get('business_owner_last_name') or '', 'fee_percent': '0.0', 'disclosure_statement': disclosure_statement, } params.update(transaction_details) if str(params['fee_percent']).endswith('.0'): params['fee_percent'] = str(params['fee_percent'])[:-2] if 'world_btc_price' not in params: params['world_btc_price'] = '' qr_src_text = 'bitcoin:{}?label={}'.format( transaction_details['buyer']['btc_address'], cur_settings.get('business_company_name', '').replace(' ', '_'), ) if params['btc_amount']: qr_src_text = 'bitcoin:{}?amount={}'.format( transaction_details['buyer']['btc_address'], params['btc_amount'], ) params['btc_amount'] = '<b>{} BTC</b> ( {} mBTC )'.format( params['btc_amount'], str(round(float(params['btc_amount']) * 1000.0, 6))) render_qr.make_qr_file(qr_src_text, qr_filepath) rendered_html = html_template.format(**params) pdfkit.from_string( input=rendered_html, output_path=pdf_filepath, ) with open(pdf_filepath, "rb") as pdf_file: pdf_raw = pdf_file.read() os.remove(qr_filepath) return { 'body': pdf_raw, 'filename': pdf_filepath, }