From 14356e820330731f2c0a5ef785271d9ab151d3e2 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 13 Jul 2016 16:11:42 +0200 Subject: [PATCH] initial import of Odoo Internetmarke Code --- __init__.py | 1 + __openerp__.py | 21 ++++++++ data/data.xml | 98 +++++++++++++++++++++++++++++++++++ data/delivery_demo.xml | 20 +++++++ models/dp_delivery_carrier.py | 98 +++++++++++++++++++++++++++++++++++ models/dp_shipping_service.py | 27 ++++++++++ security/ir.model.access.csv | 4 ++ views/dp_delivery_carrier.xml | 75 +++++++++++++++++++++++++++ views/res_config.xml | 43 +++++++++++++++ 9 files changed, 387 insertions(+) create mode 100644 __init__.py create mode 100644 __openerp__.py create mode 100644 data/data.xml create mode 100644 data/delivery_demo.xml create mode 100644 models/dp_delivery_carrier.py create mode 100644 models/dp_shipping_service.py create mode 100644 security/ir.model.access.csv create mode 100644 views/dp_delivery_carrier.xml create mode 100644 views/res_config.xml diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..2c4eac3 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ +import models \ No newline at end of file diff --git a/__openerp__.py b/__openerp__.py new file mode 100644 index 0000000..9c85f74 --- /dev/null +++ b/__openerp__.py @@ -0,0 +1,21 @@ +{ + 'name': 'Deutsche Post Internetmarke Shipping Integration', + 'category': 'Website/Shipping Logistics', + 'summary': 'Integrate Deutsche Post shipping functionality directly within Odoo ERP applications to deliver increased logistical efficiencies.', + 'website': '', + 'version': '0.1', + 'description':""" + """, + 'author': 'Harald Welte', + 'depends': ['odoo_shipping_service_apps'], + 'data': [ + 'views/dp_delivery_carrier.xml', + 'views/res_config.xml', + 'data/data.xml', + 'data/delivery_demo.xml', + 'security/ir.model.access.csv', + ] + 'installable': True, + 'application': True, + "images":['static/description/Banner.png'] +} diff --git a/data/data.xml b/data/data.xml new file mode 100644 index 0000000..83aee40 --- /dev/null +++ b/data/data.xml @@ -0,0 +1,98 @@ + + + · + + Standardbrief + Standard Natl + 20 + 0.70 + 0.020 + False + + + Kompaktbrief + Kompakt Natl + 11 + 0.85 + 0.050 + False + + + Großbrief + Gross Natl + 21 + 1.45 + 0.500 + False + + + Maxibrief + Maxi Natl 1k + 31 + 2.60 + 1.000 + False + + + + + Großbrief Integral + EINSCHREIBEN + Gross Natl EIN + 1027 + 3.95 + 0.500 + False + + + Maxibrief Integral + EINSCHREIBEN + Maxi Natl 1kg EIN + 1037 + 5.10 + 1.000 + False + + + Großbrief Integral + EINSCHREIBEN EINWURF + Gross Natl WURF + 1022 + 3.60 + 0.500 + False + + + Maxibrief Integral + EINSCHREIBEN EINWURF + Maxi Natl 1kg WURF + 1032 + 4.75 + 1.000 + False + + + + + Großbrief Intern. GK Integral + EINSCHREIBEN + Gross Intl EIN + 11056 + 6.20 + 0.500 + True + + + Maxibrief Intern. bis 1.000g GK Integral + EINSCHREIBE + Maxi Intl 1kg EIN + 11076 + 9.50 + 1.000 + True + + + Maxibrief Intern. bis 2.000g GK Integral + EINSCHREIBE + Maxi Intl 2kg EIN + 11096 + 19.50 + 2.000 + True + + + + diff --git a/data/delivery_demo.xml b/data/delivery_demo.xml new file mode 100644 index 0000000..00438ea --- /dev/null +++ b/data/delivery_demo.xml @@ -0,0 +1,20 @@ + + + + + Deutsche Post Brief + 0 + dp + + + test + 0 + False + True + False + + kg + + + + diff --git a/models/dp_delivery_carrier.py b/models/dp_delivery_carrier.py new file mode 100644 index 0000000..d80ece7 --- /dev/null +++ b/models/dp_delivery_carrier.py @@ -0,0 +1,98 @@ +from openerp import api, fields, models +import logging +from openerp.exceptions import Warning +import pycountry +from inema import Internetmarke + +_logger = logging.getLogger(__name__) + +TRACKING_URL = 'https://www.deutschepost.de/sendung/simpleQuery.html?locale=en_GB' + +# convert from ISO3166 2-digit to 3-digit +def get_alpha3_country_from_alpha2(twodigit): + c = pycountry.countries.get(alpha2=twodigit) + return c.alpha3 + +# split the last word of a string containing stree name + house number +def split_street_house(streethouse): + r = streethouse.rsplit(' ', 1) + return (r[0], r[1]) + +def split_first_lastname(name): + r = name.rsplit(' ', 1) + return (r[0], r[1]) + +class DPDeliveryCarrier(models.Model): + _inherit="delivery.carrier" + + def conn_auth_im(self): + config = self._get_config() + partner_id = config['dp_partner_id'] + key = config['dp_key'] + key_phase = config['dp_key_phase'] + pk_user = config['dp_portokasse_user'] + pk_passwd = config['dp_portokasse_passwd'] + im = Internetmarke(partner_id, key, key_phase) + im.authenticate(pk_user, pk_passwd) + return im + + # Convert an Odoo Partner object into Internetmarke Address + def build_im_addr(self, im, partner): + (street, house) = split_street_house(partner.street) + country = get_alpha3_country_from_alpha2(partner.country_id.code) + addr = im.build_addr(street = street, + house = house, + additional = partner.street2, + zipcode = partner.zip, + city = partner.city, + country = country) + if partner.parent_id.name: + return im.build_comp_addr(company = partner.parent_id.name, + address = addr, + person = partner.name) + else: + (first, last) = split_first_lastname(partner.name) + return im.build_pers_addr(first = first, + last = last, + address = addr) + + @api.one + def dp_send_shipping(self, pickings): + config = self._get_config() + order = self.env['sale.order'].search([('name','=',pickings.origin)]) + recipient = pickings.partner_id + warehouse = pickings.picking_type_id.warehouse_id.partner_id + service = self.sudo().dp_service_type + im = self.conn_auth_im() + im_recipient = self.build_im_addr(im, recipient) + im_sender = self.build_im_addr(im, wareohouse) + service = self.sudo().dp_service_type + position = im.build_position(service_type.code, im_sender, im_recipient) + im.add_position(position) + r = im.checkoutPNG() + voucher = r.shoppingCart.voucherList.voucher[0] + filename = 'DP'+voucher.trackId+'.png' + result = { 'exact_price': im.compute_total(), + 'weight': service.weight, + 'date_delivery': None, + 'tracking_number': voucher.trackId, + 'voucher_id' : voucher.voucherId, + 'order_id' : r.shoppingCart.shopOrderId, + 'wallet_balance': r.walletBalance, + 'attachments': [(filename, voucher.png_bin)]}, + return result + + def dp_get_shipping_price_from_so(self, order): + config = self._get_config() + recipient = order.partner_shipping_id if order.partner_shipping_id else order.partner_id + warehouse = order.warehouse_id.partner_id + service = self.sudo().dp_service_type + return service.cost_price + + @api.one + def dp_get_tracking_link(self, pickings): + return TRACKING_URL + + @api.one + def dp_cancel_shipment(self, pickings): + raise Warning('Cancelling DP Shipments not supported!') diff --git a/models/dp_shipping_service.py b/models/dp_shipping_service.py new file mode 100644 index 0000000..69a6478 --- /dev/null +++ b/models/dp_shipping_service.py @@ -0,0 +1,27 @@ +from openerp import api, fields, models + +# extnd delivery.carrier with DP +class SMCShippingDp(models.Model): + _inherit="delivery.carrier" + delivery_type = fields.Selection(selection_add=[('dp','Deutsche Post')]) + dp_service_type = fields.Many2one(comodel_name = 'delivery.carrier.dp.service', string = 'DP Service') + +# New model for DP Products/Services (from ProdWS) +class SMCShippingDpService(models.Model): + _name = "delivery.carrier.dp.service" + name = fields.Char(string="Name", required=1) + short_name = fields.Char(string="Short Name") + code = fields.Integer("Product Code", required=1) + prodws_id = fields.Integer("ProdWS ID") + cost_price = fields.Float("Price", required=1) + weight = fields.Float("Allowed Weight", required=1) + height = fields.Integer("Height") + width = fields.Integer("Width") + length = fields.Integer("Length") + international = fields.Boolean("International", required=1) + +# extend stock.picking with fields for Shipment and Voucher ID +class StockPicking(models.Model): + _inerit = "stock.picking" + dp_shipping_number = fields.Char(string="DP Shipment ID") + dp_voucher_number = fields.Char(string="DP Voucher ID") diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv new file mode 100644 index 0000000..aac23ad --- /dev/null +++ b/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_dp_service_public_user,delivery.carrier.dp.service,model_delivery_carrier_dp_service,base.group_public,1,0,0,0 +access_dp_service_users,delivery.carrier.dp.service,model_delivery_carrier_dp_service,,1,0,0,0 +access_dp_service_portal_user,delivery.carrier.dp.service,model_delivery_carrier_dp_service,base.group_portal,1,0,0,0 diff --git a/views/dp_delivery_carrier.xml b/views/dp_delivery_carrier.xml new file mode 100644 index 0000000..ed4aa2f --- /dev/null +++ b/views/dp_delivery_carrier.xml @@ -0,0 +1,75 @@ + + + + + delivery.stock.picking_withlabel.form.view + stock.picking + + + + + + + + + shipping.dp.form + delivery.carrier + form + + + + + + + + + + + + delivery.carrier.dp.service.form + delivery.carrier.dp.service + form + +
+ + + + + + + + + + + + + + + + +
+
+
+ + delivery.carrier.dp.service.tree + delivery.carrier.dp.service + tree + + + + + + + + + + + + + + + + + +
+
diff --git a/views/res_config.xml b/views/res_config.xml new file mode 100644 index 0000000..ea2694e --- /dev/null +++ b/views/res_config.xml @@ -0,0 +1,43 @@ + + + + website.dp.config.settings + website.dp.config.settings + +
+ + + + + + + + + + + +
+
+
+
+
+ + + Internetmarke Configuration + website.dp.config.settings + form + new + + + + + + + 15 + automatic + + +
+