I will be using Ubercart for an internet store. My business is located in Florida but I intend to ship products to any state or country. I've been trying to read up on how to charge Florida sales taxes but (being government documentation) none of it is quite clear. Does anyone have experience with a Florida business and sales taxes to Florida and non-Florida buyers? Does anyone know how to configure the Florida sales tax in Ubercart?
Florida Sales Tax & Ubercart Configuration
|
|
I don't know how helpful this is, but in Kentucky, customers only pay sales tax if they receive the product in the state. This means it's delivered to them at a Kentucky location, or they come pick it up from us.
Kentucky also asks you to declare the value of anything that was bought out of state for tax purposes, but that's really a separate issue.
Unless they've changed things since I live there in 2003 Florida requires sales tax to be collected only on purchases made in the state that are delivering products to a buyer in the state. Also, the tax you charge to Florida buyers will be the tax rate for your county so in Orange County the rate was 6% (just the state rate) but in Seminole County the rate was 7% (because the county added 1%).
Check with your local tax collector's office for the exact requirements.
In Ubercart you'll setup the tax under Adminter > Store Administration > Configuration > Tax rates and settings
Then go to Site Building > Workflow-ng and click the Label Florida for the configuration that is setup and add a new condition that checks the Order Zone about whether it is in Florida.
That should take care of things. Again, double check with your local tax collector about what is taxable.
Here's what makes this all seem overly complicated ...
FROM http://dor.myflorida.com/dor/taxes/sales_tax.html
How Is Tax Calculated?
Sales tax is calculated at the time of each transaction. When sales transactions fall between whole dollar amounts, use the bracket system to calculate tax due when any part of each total sale is less than a whole dollar amount. The total tax collected must be calculated on the total amount of the sale. The sales tax and discretionary sales surtax must be separately shown on each invoice or other evidence of the sales transaction. Taxpayers must remit the actual tax collected which in many cases is more than a straight percentage of the sales or untaxed purchases. You can obtain a Sales Tax Rate Table (Form DR-2X) and individual bracket cards from your local DOR service center or one of the contacts listed below.
How would this be accomplished in Ubercart? Do I need a separate tax rule for every county in Florida? And, what about that bracket rule?
I've been thinking about this more and think I may have to just wing it.
For the 6% Florida sales tax that uses that tedious bracket system, I'll set up one tax rule. How does Ubercart perform it's rounding when calculating sales anyhow? Close is better than nothing. I don't want to program my own module just to figure out these stupid taxes.
For the county discretionary surtax, I figure I'll just have another tax rule for "Florida Counties Discretionary Surtax" and charge the maximum percentage shown, which is 1.5%. Across Florida, the counties charge none, 25%, 5%, 1%, or 1.5%. So, assuming the maximum percentage would be safe, I suppose. I don't see any way through the tax rules or workflow-ng to determine a county in Florida.
What do you think?
I live in Florida and this is something that I will have to tackle sometime too. Although my UberCart store is on hold as I wait and hope to find out how to handle Freight Shipping (hint, hint)
The way I handle the discretionary sales tax in another system (Lotus Notes) was by purchasing a cheap zip code list. It was a CSV file that had zipcode in one column and city, county, etc in the others. I would simply match the ZIPCODE and then pull the county name from the other column.
When you sign up to collect tax in FL, one of the documents (Doc. DR-15DSS) has a list of all the FL counties (aporx. 50) and their discretionary tax amount. So simply compare the zip>county to the county list, find the discretionary tax amount and add 6% to it. Their are a lot of counties that do not have a discretionary tax, so that makes it a little simpler.
The only other things to watch out for are changing zip codes and discretionary tax amounts.
Now I had assumed that UC would correctly add the tax amount for the FL county, am I wrong?
As far as I can see, Ubercart allows rules to be established (through Workflow-ng) but they only go as deep as the state level, no counties or ZIPs.
Interestingly enough, I was exploring some Florida shopping sites last night to see how they handle it. I'm in Hillsborough County so I would expect to 6% Florida sales tax and 1.5% Hillsborough County discretionary surtax. One site I visited (which was located in Gainesville), was charging me about 6.22%. So, practically speaking I'm not sure that other online stores are following the rules anyhow.
You go as far as a range of ZIP codes with Übercart. They're just called postal codes for a generic international label.
How/where? I don't think I've come across that feature yet.
admin/workflow-ng/configurations/YOUR_TAX_NAME
Click "Add a condition",
select under "Order: Delivery address":
- Check an order's delivery country
- Check an order's delivery postal code
- Check an order's delivery zone
Good luck.
When you're choosing a Workflow-ng condition, there's one called "Check an order's delivery postal code." You can put in a single ZIP code, or a range with a wildcard: 402* gets all ZIP codes that start with "402".
Thanks! Now if I could only get Workflow-ng to actually work. It's given me issues from the start. I haven't got a single rule configuration to work yet and I must have loaded and reloaded it about 10 times.
I"M FEELING LUCKY! I got both a Florida tax and a County Discretionary Tax to work with Ubercart and Workflow-NG! I'm so excited I attached a screen shot so you can see my success!
| Attachment | Size |
|---|---|
| success.PNG | 43.98 KB |
Okay, one final question on this topic. In Workflow-NG, I see that the condition, "Check an order's delivery postal code" says ...
"Specify a postal code or postal code pattern. Use "*" as a wild card to specify a range of postal codes.
Example: In the US, 402* represents all areas from 40200 to 40299."
Does this mean that comma delimited postal codes are acceptable as well like ...?
32615,32616,32621
Nope. But that's a pretty good idea, I think. It's probably easier to have a textfield with one code per line.
Hrm, but we are in a feature freeze, so I probably shouldn't add one in when you can just make multiple conditions.
I've probably got about 100 conditions to make to configure these Florida taxes. Seems ZIPs aren't really organized too well across counties so I'm unable to use the wild card as freely as I'd like. I'll survive.
Are you sure Florida taxes are charged based on the recipient's location, not the shipper's ? Most states don't do that, and as far as I can tell Florida is not a participant in the SSUTA (interstate agreement to standardize taxes by calculating them based on destination).
FWIW, we have a much more difficult situation here in WA; in July we will be changing to destination-based sales taxes, but ZIP is NOT sufficient to calculate the tax. You must actually look up the full address, since taxing districts don't follow town, county, or ZIP boundaries. Furthermore, the state doesn't provide anything in the way of support for automation. No web service to tell us the tax rate. Oh, there's a 750,000 row CSV address table they will give you, but you still have to do a JOIN on a second rate table to find the actual tax rates, and the tables are updated every quarter so each merchant is responsible for completely reloading his own DB or facing penalties. The tax table is many times larger than my entire store DB, all for a variation of a few tenths of a percent rate across the state.
Yep, I checked and double checked and Florida taxes are really that tedious. For the 6% base tax as well, I've got this bracket system that I intend to just be non-compliant with. The bracket system is some tedious approach to rounding based on 6 cent brackets. Obviously, Ubercart is not programmed that way so I'll just eat those rounding discrepancies when it comes to paying my sales taxes to the Department of Revenue each year. With setting up several tax rules Workflow-NG conditions, I'll come pretty close to getting it right.
Okay, I just started to truly analyze the number of conditions I will need based on individual ZIPs and wild cards alone ... and, this is beyond tedium!
Attached you'll see a spreadsheet I was using to complete this analysis. There are 1487 unique ZIPs in the spreadsheet. I have only gone through the first 294 and already I have well over a hundred unique conditions that I would need to create based on the possible groupings using wild card alone. Column D shows the possible groupings.
All that said, I would like to appeal to the Ubercourt to have mercy on me. If allowing multiple, comma-delimited ZIPs is a low risk feature at this point, I beg for this feature to be available by April 1st.
There, I rest my case!
| Attachment | Size |
|---|---|
| Florida-ZIP-Counties-03142008.xls | 101.5 KB |
In a case like this, I would use a custom PHP condition... isn't it possible to do this in Workflow-ng? Then you could simply plug in a code snippet that could be modified to check the zip against a whole array of zip codes...
Is this the teaching me how to fish part? ;>
I guess I need to find me a PHP progammer.
Would it be practical to develop a FL sales tax module? Like I had said in my previous post, you can purchase a CSV file with all zip codes in the US. This file can be striped down into two columns - column one would be all FL zip codes and column two would be the county that that zip is in.
Using this data, how easy would it be to make a module that would do the lookup? I have no real experience in Drupal module development, so I don't really know what would be involved. Would you put the zip/county data in an external file, in the module, or in the drupal database?
I've been thinking a lot about how to handle calculating FL sales tax. This is something that must be tackled. I checked on other ecommerce programs and it seems that most have a FL sales tax module.
There are approximately 1700 zip codes in FL and 67 counties. What is the best way to handle this in UC?
Logic: IF state="FL", when User Enters ZIP -> lookup county that zip is in -> Add county tax to 6% sales tax
Is it practical to create the table and populate 1700 records in a module .install file?
Would a FL tax module interface with, or replace, the tax module?
If we can figure out the best method to handle this I don't mind trying to implement the solution. I've never developed a module but I am armed with the Pro Drupal Development book .
Okay, I'm back ... 17 hours, 5 tax rules, and well over 500 ZIP Code conditions later! I decided to input all of the conditions by hand since I'm a week away from launch and I can't find a programmer in that amount of time.
Anyhow, I've uncovered a very bizarre bug that only presents itself upon the initial completion of the checkout form (which for most people is the only completion of the checkout form). This bug impacts the proper calculation of Florida taxes against the shipping plus tax_subtotal.
Here's how the story goes ...
1. I have a shippable product.
2. I have a tax rule in Ubercart for 6% Florida Sales Tax specified to belorida applied to shipping and tax_subtotal. The related Workflow-NG rule is weighted a 5 (my shipping rules are weighted a 0) and correctly specifies Florida as the zone.
3. I have a tax rule in Ubercart for 1% Discretionary Sales Tax specified to be applied to shipping and tax_subtotal. The related Workflow-NG rule is weighted a 5 (my shipping rules are weighted a 0) and correctly specifies multiple ZIP Codes as OR conditions.
4. I purchase products (any products and any quantity) and select to "Checkout" from either the cart page or cart block.
5. I insert my Zone as Florida and my ZIP Code as any qualifying Florida ZIP Code (i.e., 32011 or 32038, etc.).
6. The shipping, taxes, and totals auto-calculate. However, the taxes are INCORRECTLY applied against the tax_subtotal only and not the shipping. A subtotal fails to appear at all.
7. Within the same checkout form, make a change to the ZIP Code (even if it's for a ZIP Code within the same tax rule) and step off the cell. You will find that the checkout form recalculates the taxes and totals, correctly displays a subtotal, and correctly applies the taxes to tax_subtotal and the shipping.
PLEASE, PLEASE give me a solution to this that doesn't require me to alter or recreate my tax rules. I've found that Ubercart and Workflow-NG don't really have any update/delete interaction once a tax rule is created. So, I don't want to have to make a change that requires me to scrap to 500 plus conditions that I created manually over a 17 hour period.
My associate suggests that at a glance it looks like it is because shipping (although weighted lighter than taxes) are not being calculated until the "Calculate Shipping..." button is pressed. So, the first time through the checkout, the shipping costs are not being considered prior to the taxes having been calculated once the user steps off the Zone and ZIP Code fields.
How difficult would it be to split up the check out screens? I made a post about another semi-related problem of using an automatic form filler like the one in google toolbar. If you use an autofill program for inputing your shipping/billing information the auto-calculations do not get triggered at all.
I think the solution to both of our problems may be to not have any $ totals on the initial address gathering screen, but rather give you the totals and payment options on a second screen.
Is this possible?
btw- WiSeOz, I just in case your are interested, I have finished developing a Florida Sales Tax module. It integrates with the existing tax module and uses database tables to find the correct county and tax rate. The reason I went with a module was for easy portability and tax rate changing/updates.
Complete Computer Care | The Cosmic Gift | Florida Fossils | Team Hope Evangelism
How are you using Zip Code as a means of calculating county discretionary tax, when some zip codes split counties? For example 32696 is a Williston (city) zip code, 89% of the zip code resides in Levy county which has a 1% discretionary tax. The other 11% reside in Alachua county which has a .25% discretionary tax. So, my question is how are zip codes used to calculate county sales tax when they are not county specific???
In my zipcode list that I use for the calculations I am showing Levy as the only county in the 32696 zip code. If there are indeed multiple counties for one zip I would hope that these instances are rare and that the zip given would be for the largest populated county.
Other than that I suppose it is impossible to determine the county unless the customer inputs it manually. If there is a slight discrepancy I think it is something we can live with. After all, the sales tax all goes to the State without any indication of what was collected from what counties when it is submitted.
I know many ecommerce sites simply collect the tax from the county in which they do business - so I think that this method is easily good enough.
Thoughts...?
Complete Computer Care | The Cosmic Gift | Florida Fossils | Team Hope Evangelism
look at some zip codes through melissadata.com it is free to lookup the zip codes by county and each county list has a percentage beside the zip codes of what percent of the zip code lies with in the county. It is very common that zip codes straddle two counties in rural regions, think about it in a rural region the postal service is usually based out of small offices that cover large areas, and sometimes two counties. My problem with using zip codes is not when .02 or so percent lie in a different county, what do you do, though is 51 percent lie in one county and the other 49 lie in the adjacent county??? which is less common but still occurs?
Lyle
|
|







Joined: 12/05/2007