2016-07-13 14:11:42 +00:00
|
|
|
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):
|
2016-07-15 14:48:12 +00:00
|
|
|
# first try to split at last space
|
2016-07-13 14:11:42 +00:00
|
|
|
r = streethouse.rsplit(' ', 1)
|
2016-07-15 14:48:12 +00:00
|
|
|
# if that fails, try to split at last dot
|
|
|
|
if len(r) < 2:
|
|
|
|
r = streethouse.rsplit('.', 1)
|
|
|
|
# if that also fails, return empty house number
|
|
|
|
if len(r) < 2:
|
|
|
|
return (streethouse, '')
|
2016-07-13 14:11:42 +00:00
|
|
|
return (r[0], r[1])
|
|
|
|
|
|
|
|
def split_first_lastname(name):
|
2016-07-15 14:48:12 +00:00
|
|
|
# try to split at last space
|
2016-07-13 14:11:42 +00:00
|
|
|
r = name.rsplit(' ', 1)
|
2016-07-15 14:48:12 +00:00
|
|
|
# if this fails, simply claim everything is the last name
|
|
|
|
if len(r) < 2:
|
|
|
|
return ("", name)
|
2016-07-13 14:11:42 +00:00
|
|
|
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)
|
2016-07-15 14:48:49 +00:00
|
|
|
street2 = None
|
|
|
|
if partner.street2:
|
|
|
|
street2 = partner.street2
|
2016-07-13 14:11:42 +00:00
|
|
|
addr = im.build_addr(street = street,
|
|
|
|
house = house,
|
2016-07-15 14:48:49 +00:00
|
|
|
additional = street2,
|
2016-07-13 14:11:42 +00:00
|
|
|
zipcode = partner.zip,
|
|
|
|
city = partner.city,
|
|
|
|
country = country)
|
2016-07-15 15:03:20 +00:00
|
|
|
if partner.is_company:
|
2016-07-15 15:12:35 +00:00
|
|
|
return im.build_comp_addr(company = ptartner.name,
|
2016-07-15 15:03:20 +00:00
|
|
|
address = addr)
|
|
|
|
else:
|
|
|
|
if partner.parent_id.name:
|
|
|
|
person = None
|
|
|
|
if partner.name:
|
|
|
|
person = partner.name
|
|
|
|
return im.build_comp_addr(company = partner.parent_id.name,
|
|
|
|
address = addr,
|
|
|
|
person = person)
|
2016-07-15 15:10:43 +00:00
|
|
|
else:
|
|
|
|
(first, last) = split_first_lastname(partner.name)
|
|
|
|
return im.build_pers_addr(first = first,
|
|
|
|
last = last,
|
|
|
|
address = addr)
|
2016-07-13 14:11:42 +00:00
|
|
|
|
|
|
|
@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)
|
2016-07-15 14:49:20 +00:00
|
|
|
im_sender = self.build_im_addr(im, warehouse)
|
2016-07-13 14:11:42 +00:00
|
|
|
service = self.sudo().dp_service_type
|
2016-07-15 14:49:20 +00:00
|
|
|
position = im.build_position(service.code, im_sender, im_recipient)
|
2016-07-13 14:11:42 +00:00
|
|
|
im.add_position(position)
|
|
|
|
r = im.checkoutPNG()
|
|
|
|
voucher = r.shoppingCart.voucherList.voucher[0]
|
2016-07-15 15:10:54 +00:00
|
|
|
filename = 'DP'+voucher.voucherId+'.png'
|
2016-07-15 14:49:34 +00:00
|
|
|
tracking_nr = ' '
|
|
|
|
if voucher.trackId:
|
|
|
|
tracking_nr += voucher.trackId
|
|
|
|
result = { 'exact_price': im.compute_total()/100,
|
2016-07-13 14:11:42 +00:00
|
|
|
'weight': service.weight,
|
|
|
|
'date_delivery': None,
|
2016-07-15 14:49:34 +00:00
|
|
|
'tracking_number': tracking_nr,
|
2016-07-13 14:11:42 +00:00
|
|
|
'voucher_id' : voucher.voucherId,
|
|
|
|
'order_id' : r.shoppingCart.shopOrderId,
|
|
|
|
'wallet_balance': r.walletBalance,
|
2016-07-15 14:49:20 +00:00
|
|
|
'attachments': [(filename, voucher.png_bin)]}
|
2016-07-13 14:11:42 +00:00
|
|
|
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!')
|