We have mainly long, awkwardly shaped items. But we also have very small accessories that people sometimes want to purchase with those large items.
We have the exact same thing - think everything from swords to earrings. You may need a custom solution. I struggled with it for almost three months and finally programmed something that works. :-) It's really close. Sometimes a dollar over, sometimes a dollar under, but most of the time it's very close.
The logic is roughly like so.
We integrate with both the USPS and UPS API. We've dumped UPS, working with them in this area is burgeonsome and USPS woks out much better for us - but this system connects to both in real time. (But we still get emails: "
You want too much for shipping." Doh.)
The first presets are series of "maximums" - for example, anything over x lbs or a certain set of dimensions places an oversize fee on the parcel, and it's different between the two API's. So the goal is to shoot for multiple boxes if the weight or dimension maximums are reached.
Each item has a SHIPPING dimension entered into the database. So earrings are say, 1" X 3" X 3", basically a padded envelope that can go first class. A sword, 6" X 6" X 42". We weigh the items themselves and this is also attached to each item, but not a shipping weight because of the very reason you mention - combining items in one parcel. Final shipping weight is managed in the calculator.
We have presets for box weight, I think it's like .005 oz per square inch (or something) and there is a global setting for a percentage of padding weight.
Now the fun starts. I organize the items from longest to shortest, secondly by widest to narrowest.
6X6X42
12X14X16
8X6X14
6X6X14
3X4X6
2X2X3
I begin stacking the items in the virtual box by width. If the next item will fit behind the previous item and not exceed the longest item, in it goes, otherwise it adds to the packed width. When the maximum box width is reached it starts another "layer" until the maximum box height is reached. At any point, if maximum weight is exceeded, new box. Based on the sum of the item weights and dimensions of the box, a padding weight factor and the box wieght factor is added in for this parcel's total weight. This box's dimensions and weight goes in an array.
Next box, and next, until the order is complete. We pass the number of boxes, weight of each (and dimensions, in the case of UPS) to the API. User sees links for each:
Choose your shipping method:
first class = $2.95, 7-10 day delivery
parcel post - $6.05, 7-10 day delivery
priority mail - $12.95, 3-5 day delivery
express mail - 28.95, 1-2 day delivery
In the case of multiple boxes:
parcel post - $36.05 in 3 boxes, 7-10 day delivery
priority mail - $48.95 in 3 boxes, 3-5 day delivery
express mail - 120.95 in 3 boxes, 1-2 day delivery
These numbers are arbitrary, just for example. International priority mail is supported, as well as insurance and signature confirmation.
I've never found anything that comes close, and some day I'll sell it, it's on my list. :-) Maybe this might give you ideas to pass on to your programmer or start coding it yourself.