예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
 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)
예제 #4
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'
예제 #5
0
 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,
         )
예제 #6
0
 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', '')
예제 #7
0
 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'])
예제 #8
0
 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)
예제 #9
0
 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]
예제 #10
0
 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)
예제 #11
0
 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)
예제 #12
0
 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
예제 #13
0
 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'
예제 #14
0
 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
예제 #15
0
 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
예제 #16
0
 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)
예제 #17
0
 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
예제 #18
0
 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
예제 #19
0
 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)
예제 #20
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%>
                &nbsp;
                <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%>
                &nbsp;
                <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,
    }