Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

QBI Quickbooks Import


adam5532

Recommended Posts

You may want to try adding

 ? ? ? ? ?
tep_set_time_limit(0);

To the top of the orders script. I think this will stop php from timing out.

 

Thank you for your reply =)

But i am still a noob with OS.. can you please tell me where is this orders script :blush:

 

Thx!!

Link to comment
Share on other sites

I made the change to the qbi_engine_orders.php file as suggested in post 575 however am still getting transaction out of balance errors, first starting on line 9, then skips to line 17, etc.

 

any other ideas on that one?

Link to comment
Share on other sites

Thank you for your reply =)

But i am still a noob with OS.. can you please tell me where is this orders script :blush:

 

Thx!!

 

Put it at the top of admin/includes/qbi_engine_orders.php

 

I think that will do the trick.

osCommerce is a great piece of software with wonderful contributions.

Spend some time in the contribution area. There are a lot of gems there.

Link to comment
Share on other sites

Once again, I'm stuck trying to make sense of all this accounting stuff, and I don't want to go mangling Adam's code if I don't have to.

 

The issue that we're running into at the moment is that we are going to need to vector different items into different items accounts. I was looking through the code, and I saw that this functionality looks like it's built in if you are using the product matching feature of QBI.

 

I'm not sure if this is true, because unfortunatly, we aren't using the matching feature as some of our products have more than two attributes. Plus there is some custom code to handle text attributes as well.

 

Anyway, since I don't yet fully understand all the in's and out's of QBI, and I'm still completly lost when it comes to setting up a QuickBooks store, I though that I would ask to see if this functionality is alreay built in.

 

If not, I'm wondering what everyone thought of my solution. I was thinking of just adding a field to the products table called qbi_account or something like that, then when you do the product lookup, you substuite ITEM_ACCT for the products.qbi_account field. I'm pretty sure that this will work for our purposes, and shouldn't be too hard to implement.

 

Hopefully, I won't have to mess with Adam's code at all, and someone will tell me of a feature already built into QBI that handles this for me. Otherwise, maybe I'll spend some time putting a nice admin on it and post it as an addition to QBI.

 

Thanks for your help.

osCommerce is a great piece of software with wonderful contributions.

Spend some time in the contribution area. There are a lot of gems there.

Link to comment
Share on other sites

Hi all, have just installed this awesome addon, and yes very easy to install and get up and going. Adam just a few issues. i can import the customer details but not invoice data, somthign about the balance? is Tax an issue?

 

error 1 & error2

 

error1.jpg

error2.jpg

 

 

and matching up the products there isnt anything selected in the drop down boxes. error3

error3.jpg

 

Thanks Craig

PS: I am running Quickbooks 2005/06 Professional

Link to comment
Share on other sites

Hello there,

I installed this contribution a while back and it was working wonderfully. However, today, I received this error, which I've seen others have as well. The problem is I am using the updated version (2.10) and I even did a fresh install of the suggested files, just to be sure. I did not uninstall and reinstall completely however, because I didn't want to lose those HOURS of product matching ;)

 

1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM qbi_groups_items AS gi, qbi_items AS g WHERE qbi_groups_

SELECT gi.qbi_items_refnum AS qbi_items_refnum_gi, g.qbi_items_refnum AS qbi_items_refnum_g, * FROM qbi_groups_items AS gi, qbi_items AS g WHERE qbi_groups_refnum='539' AND gi.qbi_items_refnum='183' AND gi.qbi_items_refnum=g.qbi_items_refnum ORDER BY gi.qbi_items_refnum

 

Any ideas what is wrong and why this would happen suddenly? I'm sure I did something to my code inadvertantly, although I have no idea how. I am a super amateur at this...any help would be great!

 

Thank you!

Angela

Link to comment
Share on other sites

go read post 575 see if that helps you

 

Hi all, have just installed this awesome addon, and yes very easy to install and get up and going. Adam just a few issues. i can import the customer details but not invoice data, somthign about the balance? is Tax an issue?

 

error 1 & error2

 

error1.jpg

error2.jpg

and matching up the products there isnt anything selected in the drop down boxes. error3

error3.jpg

 

Thanks Craig

PS: I am running Quickbooks 2005/06 Professional

Link to comment
Share on other sites

hey guys i just installed qbi and need a little help with Customer number configuration . This is the code i have %F10%WL-%I  and this is how i see it in my quickbooks

First Name"First Letter of last name"-OrderNumber

so like

JohnD-2054

 

i want it to appear as

 

First Name Last Name - Order number

John Doe - 2054

 

also can any one please tell me how to delete all the customers from quickbooks. i imported around 1000 customers and its really hard to delete them one by one instead of deleting all at once

 

any help is greatly apprecaited

 

thankyou

Try this - I have been also playing round with the variables and seems to work OK

 

%F10W %L10W - %I

Link to comment
Share on other sites

looks like this:

 

gi, qbi_items

 

should be this:

 

gi.qbi_items

 

if i am not mistaken

 

Hello there,

I installed this contribution a while back and it was working wonderfully. However, today, I received this error, which I've seen others have as well. The problem is I am using the updated version (2.10) and I even did a fresh install of the suggested files, just to be sure. I did not uninstall and reinstall completely however, because I didn't want to lose those HOURS of product matching ;)

 

1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM qbi_groups_items AS gi, qbi_items AS g WHERE qbi_groups_

SELECT gi.qbi_items_refnum AS qbi_items_refnum_gi, g.qbi_items_refnum AS qbi_items_refnum_g, * FROM qbi_groups_items AS gi, qbi_items AS g WHERE qbi_groups_refnum='539' AND gi.qbi_items_refnum='183' AND gi.qbi_items_refnum=g.qbi_items_refnum ORDER BY gi.qbi_items_refnum

 

Any ideas what is wrong and why this would happen suddenly? I'm sure I did something to my code inadvertantly, although I have no idea how. I am a super amateur at this...any help would be great!

 

Thank you!

Angela

Link to comment
Share on other sites

Adam,

  Thanks for your response.  We are using the same QB store for each of the store fronts, but we needed a way to tell which store the orders came from.  We made a simple addition to the code to vector off to different classes within QuickBooks.  I think that it's going to work OK.

Akkinmore,

    We are using QBI with the options type attributes, at least using the text box feature of option type.  We had to add in some custom code to make it work the way we wanted.  What we ended up doing for the import is to place the actual text in the memo field.  Then for the product sub-product, we just passed in a value if it existed.  We also have one that uses a yes no value.

 

For example, we have one text field called name drop where a user can add custom text to a T-Shirt.  In the QBI we created custom code so if it's there it gets a value of ND if not it gets a value of NOND so a T-Shirt combo might look like:

TSHIRT2000:Blue:Large:ND

Where TSHIRT2000 is our product ID.  This seems to be working pretty well, but I would be interested to see other approaches if someone has a better idea.

 

Hi Ryan Smith

 

Would you mind sharing your custom code? Thank you. :)

Link to comment
Share on other sites

Hi Ryan Smith

 

Would you mind sharing your custom code? Thank you. :)

 

I think that the majority of the code that handles that is in this products loop here:

      while ($myrowop=tep_db_fetch_array($resultop)) {
       $ordprod_id=$myrowop["orders_products_id"];
       $prod_id=$myrowop["products_id"];
       $prod_model=$myrowop["products_model"];
       $prod_name_cust=$myrowop["products_name"];	
       $prod_quan=$myrowop["prod_quan"];
       $prod_price=round_amt($myrowop["final_price"]);
       $prod_totalprice=$prod_price*$prod_quan;
       ($myrowop["products_tax"]>0) ? $prod_taxable="Y" : $prod_taxable="N";
       ($myrowop["products_tax_class_id"]>0) ? $prod_tax_class_id=$myrowop["products_tax_class_id"] : $prod_tax_class_id=0; 	 

// Get product description in default language
       $resultxp=tep_db_query("SELECT * FROM ".TABLE_PRODUCTS_DESCRIPTION." WHERE products_id='$prod_id' AND language_id='$language_id_default'");
       $myrowxp=tep_db_fetch_array($resultxp);
       $prod_name=$myrowxp["products_name"];
       $resultopa=tep_db_query("SELECT * FROM ".TABLE_ORDERS_PRODUCTS_ATTRIBUTES." WHERE orders_products_id='$ordprod_id'");
// Check for product options and values
       unset($prod_opt_cust,$prod_opt_val_cust,$prod_opt,$prod_opt_val,$prod_opt_id,$prod_opt_val_id,$prod_opt_cust_memo,$prod_opt_val_cust_memo,$prod_opt_val_memo);

// Start product options and values loop
       while ($myrowopa=tep_db_fetch_array($resultopa)) {
         $prod_opt_cust[]=$myrowopa["products_options"];  // Size, etc.
         $prod_opt_val_cust[]=$myrowopa["products_options_values"]; // Small, Large, etc.

 //nthcs - Ryan Smith - 050714
 //Fields to hold memo data for the product.  This is customized to accomadate Name Drops and Custom Text   
         $prod_opt_cust_memo[]=$myrowopa["products_options"];  // Size, etc.
         $prod_opt_val_cust_memo[]=$myrowopa["products_options_values"]; // Small, Large, etc.
  
// Find current array value
         $prodoptcust=mysql_escape_string(end($prod_opt_cust));  // Size, etc.
         $prodoptvalcust=mysql_escape_string(end($prod_opt_val_cust)); // Small, Large, etc.
// Get product options in default language
      $resultpo=tep_db_query("SELECT po2.products_options_name AS products_options_name_po2, po2.products_options_id AS products_options_id_po2 FROM ".TABLE_PRODUCTS_OPTIONS." As po1, ".TABLE_PRODUCTS_OPTIONS." As po2 WHERE po1.products_options_name='$prodoptcust' AND  po1.products_options_id=po2.products_options_id AND po2.language_id='$language_id_default'");
         if ($myrowpo=tep_db_fetch_array($resultpo)) {
           $prod_opt[]=$myrowpo["products_options_name_po2"]; // Get option name in default language
           $prod_opt_id[]=$myrowpo["products_options_id_po2"]; // Get option id (not used at this time)      
         }

// Get product option values in default language
         $resultpov=tep_db_query("SELECT pov2.products_options_values_id AS products_options_values_id_pov2, pov2.products_options_values_name AS products_options_values_name_pov2 FROM ".TABLE_PRODUCTS_OPTIONS_VALUES." As pov1, ".TABLE_PRODUCTS_OPTIONS_VALUES." As pov2 WHERE pov1.products_options_values_name='$prodoptvalcust' AND  pov1.products_options_values_id=pov2.products_options_values_id AND pov2.language_id='$language_id_default'");
         if ($myrowpov=tep_db_fetch_array($resultpov)) {
           $prod_opt_val[]=$myrowpov["products_options_values_name_pov2"]; // Get option value name in default language
           $prod_opt_val_id[]=$myrowpov["products_options_values_id_pov2"]; // Get option value id
           $prod_opt_val_memo[]=$myrowpov["products_options_values_name_pov2"]; // Get option value name in default language
           $prod_opt_val_id_memo[]=$myrowpov["products_options_values_id_pov2"]; // Get option value id
         } else if($prodoptcust == "Custom Text") {
  	 //nthcs - Ryan Smith - 050714
	 //Checking for custom text options and provide custom handler. 	 
           $prod_opt_val[]='CT'; // Get option value name in default language
           $prod_opt_val_id[]=0; // Get option value id    
           $prod_opt_val_memo[]=$prodoptvalcust; // Get option value name in default language
           $prod_opt_val_id_memo[]=0; // Get option value id    
   } else {
           $prod_opt_val_memo[]=$prodoptvalcust; // Get option value name in default language
           $prod_opt_val_id_memo[]=0; // Get option value id    
   }
       }
// Determine language to use
       if (ITEM_OSC_LANG==1) {
         $prod_name=$prod_name_cust;
         $prod_opt=$prod_opt_cust;
         $prod_opt_val=$prod_opt_val_cust;
       }

// Construct product model and name
       if (is_array($prod_opt_val) AND is_array($prod_opt)) {
         foreach ($prod_opt_val as $prod_opt_vals) {
           $prod_model.=":".$prod_opt_vals;
         }
         $prod_opt_val_opt=arraycombine($prod_opt,$prod_opt_val_memo);
         foreach ($prod_opt_val_opt as $prod_opts=>$prod_opt_vals_memo) {
           $prod_name.=", ".$prod_opts.": ".$prod_opt_vals_memo;
         }
       }

 

You can see that if we have a custom text attribute, I append :CT to the end of the products attributes string. We also had to do some custom work on the qbi_engine_products.php page to get the products to export correctly out of osC into QBI, but you you understand how to setup your store that shouldn't be a problem.

 

You'll obviously have to edit this to make it work for your own needs, but at least it's some direction. Let me know if you have any questions about what I did, and also let me know if you found a more elegant way of doing this.

osCommerce is a great piece of software with wonderful contributions.

Spend some time in the contribution area. There are a lot of gems there.

Link to comment
Share on other sites

Adam,

 

1. I just added your fix that you posted a few pages back that is supposed to remedy the out of balance errors when sales taxes are charged. Hopefully that will fix our problems. Thanks for helping us all out so much!

 

2. I'm using Authorize.net consolidated for Aim and I'd like the payment card type to be imported into quickbooks. For example, if someone uses a visa card, then the payment type will be imported into QB as "VISA". Then, when we reconcile, it will be so much easier because the invoices will be batched by cc type. Can you help me with this?

 

Also, Authorize.net Consolidated has a problem in that is logs orders in the orders table even though the card has been declined. You mentioned a few posts back that you can create a "declined" status and then tell Authorize to mark declined transactions as "declined". How do I do that? I know how to create new statuses, but how do I tell authorize.net to mark it's declined transactions as "declined"?

 

Thanks everyone!

Link to comment
Share on other sites

I made the change to the qbi_engine_orders.php file as suggested in post 575 however am still getting transaction out of balance errors, first starting on line 9, then skips to line 17, etc.

 

any other ideas on that one?

 

 

Is there anything else I should be looking at to get the import to work properly? I have followed post 575, wondering if having other contributions installed could be causing this to fail.

Link to comment
Share on other sites

Adam,

 

1. I just added your fix that you posted a few pages back that is supposed to remedy the out of balance errors when sales taxes are charged.  Hopefully that will fix our problems.  Thanks for helping us all out so much!

 

2. I'm using Authorize.net consolidated for Aim and I'd like the payment card type to be imported into quickbooks.  For example, if someone uses a visa card, then the payment type will be imported into QB as "VISA".  Then, when we reconcile, it will be so much easier because the invoices will be batched by cc type.  Can you help me with this?

Thanks for the suggestion. I'll add it to my to-do list for the next version.

Also, Authorize.net Consolidated has a problem in that is logs orders in the orders table even though the card has been declined.  You mentioned a few posts back that you can create a "declined" status and then tell Authorize to mark declined transactions as "declined".  How do I do that?  I know how to create new statuses, but how do I tell authorize.net to mark it's declined transactions as "declined"?

 

Thanks everyone!

First, add a Status to osC named "Declined". In my store, this corresponds to an indicator of 5 in the database - yours may be different if you only have 3 existing status's, so modify the code appropriately.

 

Then, in authorizenet.php, change the function before_process as follows:

function before_process() {
global $response;
global $insert_id;

$response_vars = explode(',', $response);
$x_response_code = $response_vars[0];
$x_response_subcode = $response_vars[1];
$x_response_reason_code = $response_vars[2];
$x_response_reason_text = $response_vars[3];

if ($x_response_code != '1') {
 tep_db_query("UPDATE " . TABLE_ORDERS . " SET orders_status=5 WHERE orders_id = '" . (int)$insert_id . "' LIMIT 1"); //Save order, set status to declined
 if($x_response_code == '') {
	 tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode('The server cannot connect to Authorize.net.  Please check your cURL and server settings.'), 'SSL', true, false));
 }
 else if($x_response_code == '2') {
	 tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode('Your credit card was declined ') . urlencode('(') . urlencode("$x_response_reason_code") . urlencode('): ') . urlencode("$x_response_reason_text"), 'SSL', true, false));
 }
 else if($x_response_code == '3') {
	 tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode('There was an error processing your credit card ') . urlencode('(') . urlencode("$x_response_reason_code") . urlencode('): ') . urlencode("$x_response_reason_text"), 'SSL', true, false));
 }
 else {
       tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode('There was an unspecified error processing your credit card.'), 'SSL', true, false));
 }
}
}

- Adam

Link to comment
Share on other sites

Thank you for your reply =)

But i am still a noob with OS.. can you please tell me where is this orders script :blush:

 

Thx!!

I think that the script processing time limit is also set on the php server, to prevent it from locking up on a bad script. I'm not sure if tep_time_limit can override that. I am aware of the problem, and in some future version I will add the ability to split the file.

 

You might also look in the qbi_output directory for the file and download it by ftp. Even though the script hasn't looped through all the orders, you might see how close it was to finishing and if the file is useful. Each order is written individually to the file, so it will contain all the orders until it timed out.

 

Thanks,

Adam

Link to comment
Share on other sites

Hi Angela,

 

I will look into this shortly and try to solve it for you. Please clarify: Did the problem happen just after you upgraded? When you upgraded, did you follow the provided upgrade procedure and did the automatic database upgrade procedure run properly after you upgraded?

 

Thanks,

Adam

 

Hello there,

I installed this contribution a while back and it was working wonderfully. However, today, I received this error, which I've seen others have as well. The problem is I am using the updated version (2.10) and I even did a fresh install of the suggested files, just to be sure. I did not uninstall and reinstall completely however, because I didn't want to lose those HOURS of product matching ;)

 

1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM qbi_groups_items AS gi, qbi_items AS g WHERE qbi_groups_

SELECT gi.qbi_items_refnum AS qbi_items_refnum_gi, g.qbi_items_refnum AS qbi_items_refnum_g, * FROM qbi_groups_items AS gi, qbi_items AS g WHERE qbi_groups_refnum='539' AND gi.qbi_items_refnum='183' AND gi.qbi_items_refnum=g.qbi_items_refnum ORDER BY gi.qbi_items_refnum

 

Any ideas what is wrong and why this would happen suddenly? I'm sure I did something to my code inadvertantly, although I have no idea how. I am a super amateur at this...any help would be great!

 

Thank you!

Angela

Link to comment
Share on other sites

Hi all, have just installed this awesome addon, and yes very easy to install and get up and going. Adam just a few issues. i can import the customer details but not invoice data, somthign about the balance? is Tax an issue?

I see a lot of Australian Dollars in the image. Are you using the US version of Quickbooks? QBI does not yet support any non-US versions due to the different sales tax systems and fields used.

and matching up the products there isnt anything selected in the drop down boxes.

Did you complete the Product:Setup procedure and import all your QB products before going to the matching screen?

 

Thanks,

Adam

Link to comment
Share on other sites

Is there anything else I should be looking at to get the import to work properly?  I have followed post 575, wondering if having other contributions installed could be causing this to fail.

I assume you mean post 574 on the sales tax rounding error.

 

Please send me your iif file, and also an image or pdf of the invoice for some of the offending orders from osC. The line number reported in the failure notice is the last line of the problem transaction.

 

If you look at the iif file yourself, you may find the error. Either it is a rounding error, where the problem will generally be an error of 1 cent, or there is an item missing, such as a low order fee or discount coupon. The line with the total for the order must match the sum of all the previous line items.

 

Thanks,

Adam

Link to comment
Share on other sites

Adam,

 

I also tried that fix that you posted that supposedly fixes the rounding error. It doesn't seem to be working for me either. I'm using the latest version of QBI.

 

I'm wondering though, why don't you just copy the total for the order straight from the database? If we know that osc is totalling the order correctly, then why not just copy that number straight over into the QBI import file? Then we'd never have balance errors again. I thinks it's a mess having QBI try to do calculations when we already have all of the correct #'s. Or am I wrong?

 

One other request --> when doing invoices and payments, is there anyway that you can have QBI automatically check the invoice as PAID? I'm getting QBI to record the payments, but then I have to go into the "customer payments" screen in QB and check off each invoice record individually (you actually click with the mouse and add a check mark to mark the invoice as paid). It would be awesome to have that option. One less thing for me to do!

 

BTW, this program is amazing and I really appreciate your efforts to help and support your users. We really appreciate it.

Link to comment
Share on other sites

First, add a Status to osC named "Declined". In my store, this corresponds to an indicator of 5 in the database - yours may be different if you only have 3 existing status's, so modify the code appropriately.

 

Then, in authorizenet.php, change the function before_process as follows:

 

I appreciate your reply on how to set a declined order as "declined" in the db. However, I was wondering, is there any way to prevent authorize.net consolidated from even recording a declined order in the first place?? I know this is the QBI forum, but you seem to know a little about this.

Link to comment
Share on other sites

Hi,

 

Adam,

 

I also tried that fix that you posted that supposedly fixes the rounding error.  It doesn't seem to be working for me either.  I'm using the latest version of QBI.

The latest fix solves a problem rounding the sales tax. Your out-of-balance error may have a different cause.

I'm wondering though, why don't you just copy the total for the order straight from the database?  If we know that osc is totalling the order correctly, then why not just copy that number straight over into the QBI import file?  Then we'd never have balance errors again.  I thinks it's a mess having QBI try to do calculations when we already have all of the correct #'s.  Or am I wrong?

Yup. Actually, QBI is not totalling the order - it is copying the order total straight from the database, as you suggest. But osC stores the order total with four digits to the right of the decimal point, so QBI must round it to read correctly as dollars and cents. The same must be done with the sales tax.

 

Due to an error inherent in many languages, due to how computers deal with fractions, the rounding function may work incorrectly, causing .500000 for example to convert to .499999 and round down instead of up. This has been corrected by inserting a very small offset to force it to round up.

 

The other common reason for total errors in QBI is that something is missing from the order in the iif file, so the total calculated by osC doesn't equal the sum of the line items.

 

Every line item that QBI puts in the iif file must be an item that exists in QB, so that it will be properly imported and recognized by QB. If QBI hasn't been told what to call it (except for products that import with exactly the same name), then it is unable to add it to the order and the line items will not equal the total.

 

The common causes of these errors are that the sales tax, shipping, or discount coupons and fees have not been properly set up in QBI, so QBI is unable to include them.

 

Another possible cause is that the sales tax is being calculated differently due to the tax rate not being set the same in QB and osC.

 

On top of that, other rounding madness includes a rounding error in the authorize.net contribution that can cause the charge to be off by 1 cent relative to the osC total. A fix for this is included with the QBI instructions. And then, there is a defect in QB that prevents the sales tax group function from working at all with fractional percentages, due to the fact that they round the fractional percentage amounts off before adding them together, instead of adding them first and rounding off the total (and they've been aware of this simple problem for years and haven't gotten around to fixing it yet).

 

So, yes, it shouldn't be this complicated but it is! What I can try to do in the future is to have QBI alert you to some of these errors, by either inserting a comment in the iif file or in the log file (a new feature in v2.10 that is only partially completed) when it is unable to insert a line in an order.

One other request --> when doing invoices and payments, is there anyway that you can have QBI automatically check the invoice as PAID?  I'm getting QBI to record the payments, but then I have to go into the "customer payments" screen in QB and check off each invoice record individually (you actually click with the mouse and add a check mark to mark the invoice as paid).  It would be awesome to have that option.  One less thing for me to do!

No. This is a problem inherent in the iif import system of QB, not a problem in QBI, and there is no solution that I am aware of (until I convert QBI sometime in the future to use allow XML importing instead of iif).

 

BUT, if you set up QBI to import your credit card orders as Sales Receipts instead of as Invoices, then you will not have this problem at all. This requires setting up the Payment Setup and Matching appropriately, and also selecting the option in the configuration screen.

BTW, this program is amazing and I really appreciate your efforts to help and support your users.  We really appreciate it.

Thanks!

 

- Adam

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...