Yes this is best achieved based on weight. Best way I have found is set up a table in your database with all your shippingcountries
CREATE TABLE `shippingcountry` (
`shippingcountryid` int(11) NOT NULL,
`country` varchar(50) DEFAULT NULL,
`shipping_country_code` varchar(50) DEFAULT NULL,
`language` varchar(50) DEFAULT NULL,
PRIMARY KEY (`shippingcountryid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
then create your shipping rates
CREATE TABLE `shippingrates` (
`shippingrateid` int(11) NOT NULL,
`shippingrate` double DEFAULT NULL,
`shippingtype` int(11) DEFAULT NULL,
`shippingcountry` int(11) DEFAULT NULL,
`shippingincrement` double DEFAULT NULL,
PRIMARY KEY (`shippingrateid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
the bring them all together in a view and then use this view in your checkout
VIEW `view_shipping_and_sales_tax` AS
SELECT
`shippingrates`.`shippingrateid` AS `shippingrateID`,
`shippingrates`.`shippingrate` AS `shippingrate`,
`shippingrates`.`shippingtype` AS `shippingtype`,
`shippingrates`.`shippingcountry` AS `shippingcountry`,
`shippingrates`.`shippingincrement` AS `shippingincrement`,
`shippingtype`.`shippingtypeid` AS `shippingtypeID`,
`shippingtype`.`shippingtypename` AS `shippingtypename`,
`shippingcountry`.`shippingcountryid` AS `shippingcountryID`,
`shippingcountry`.`shipping_country_code` AS `shipping_country_code`,
`shippingcountry`.`country` AS `country`,
`shippingcountry`.`language` AS `language`
FROM
((`shippingtype`
JOIN `shippingrates` ON ((`shippingtype`.`shippingtypeid` = `shippingrates`.`shippingtype`)))
JOIN `shippingcountry` ON ((`shippingrates`.`shippingcountry` = `shippingcountry`.`shippingcountryid`)))
set up ecart so you have a BaseRate for shipping and then an IncrementRate for every extra kg
Hope this helps.
Oops you also need shippingtypes
CREATE TABLE `shippingtype` (
`shippingtypeid` int(11) NOT NULL,
`shippingtypename` varchar(50) DEFAULT NULL,
PRIMARY KEY (`shippingtypeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;