From ce10ef2f4d726635cc76cf9dfedcf927acc56624 Mon Sep 17 00:00:00 2001 From: Mayank Patel Date: Wed, 11 Sep 2024 05:44:48 +0000 Subject: [PATCH] [REM] delivery_gso: available in professional H14528 --- delivery_gso/__init__.py | 3 - delivery_gso/__manifest__.py | 26 -- delivery_gso/i18n/es.po | 190 ---------- delivery_gso/models/__init__.py | 3 - delivery_gso/models/delivery_gso.py | 462 ----------------------- delivery_gso/models/requests_gso.py | 49 --- delivery_gso/views/delivery_gso_view.xml | 28 -- 7 files changed, 761 deletions(-) delete mode 100644 delivery_gso/__init__.py delete mode 100644 delivery_gso/__manifest__.py delete mode 100644 delivery_gso/i18n/es.po delete mode 100644 delivery_gso/models/__init__.py delete mode 100644 delivery_gso/models/delivery_gso.py delete mode 100644 delivery_gso/models/requests_gso.py delete mode 100644 delivery_gso/views/delivery_gso_view.xml diff --git a/delivery_gso/__init__.py b/delivery_gso/__init__.py deleted file mode 100644 index 09434554..00000000 --- a/delivery_gso/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from . import models diff --git a/delivery_gso/__manifest__.py b/delivery_gso/__manifest__.py deleted file mode 100644 index 26968b3a..00000000 --- a/delivery_gso/__manifest__.py +++ /dev/null @@ -1,26 +0,0 @@ -{ - 'name': 'Golden State Overnight (gso.com) Shipping', - 'summary': 'Send your shippings through gso.com and track them online.', - 'version': '15.0.1.0.1', - 'author': "Hibou Corp.", - 'category': 'Warehouse', - 'license': 'OPL-1', - 'images': [], - 'website': "https://hibou.io", - 'description': """ -Golden State Overnight (gso.com) Shipping -========================================= - -* Provides estimates on shipping costs through gso.com. -* Send your shippings through gso.com and allows tracking of packages. -""", - 'depends': [ - 'delivery_hibou', - ], - 'demo': [], - 'data': [ - 'views/delivery_gso_view.xml', - ], - 'auto_install': False, - 'installable': True, -} diff --git a/delivery_gso/i18n/es.po b/delivery_gso/i18n/es.po deleted file mode 100644 index a466c4f8..00000000 --- a/delivery_gso/i18n/es.po +++ /dev/null @@ -1,190 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * delivery_gso -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 15.0+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-29 23:44+0000\n" -"PO-Revision-Date: 2021-10-29 23:44+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__sam -msgid "AM Select (8A-12P) Delivery Window" -msgstr "Rango de Entrega: En la Mañana (8A - 12P)" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_stock_package_type__package_carrier_type -msgid "Carrier" -msgstr "Transportista" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__gso_default_packaging_id -msgid "Default Package Type" -msgstr "Tipo de Paquete Predeterminado" - -#. module: delivery_gso -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#, python-format -msgid "Delivery Method not found in result" -msgstr "Método de envío no se encontro en la busqueda" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__eps -msgid "Early Priority Overnight" -msgstr "Entrega Temprana Prioritaria: Al día siguiente " - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__ess -msgid "Early Saturday Delivery" -msgstr "Entrega el Sábado Temprano" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__sev -msgid "Evening Select (4P-8P) Delivery Window" -msgstr "Ventana de Entrega: En la Noche (4P - 8P)" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__cps -msgid "GSO Ground" -msgstr "GSO Terrestre" - -#. module: delivery_gso -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#, python-format -msgid "GSO web service returned an error. " -msgstr "El servicio de web de GSO ha retornado un error" - -#. module: delivery_gso -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#, python-format -msgid "GSO web service returned an error." -msgstr "El servicio de web de GSO ha retornado un error" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__gso_image_type -msgid "Image Type" -msgstr "Tipo de Imagen" - -#. module: delivery_gso -#: model:ir.model.fields,help:delivery_gso.field_delivery_carrier__gso_image_type -msgid "Image Type is the type of Label to use" -msgstr "El tipo de imagen es el tipo de etiqueta para utilizar" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_image_type__zpl_long_label -msgid "Long label" -msgstr "Etiqueta larga" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_image_type__no_label -msgid "No Label" -msgstr "Sin etiqueta" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__nps -msgid "Noon Priority Overnight" -msgstr "Entrega Prioritaria: Al Día Siguiente en la Tarde" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__spm -msgid "PM Select (12P-4P) Delivery Window" -msgstr "Ventana de Entrega: En la tarde (12P - 4P)" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_image_type__paper_label -msgid "Paper Label" -msgstr "Etiqueta de papel" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__pds -msgid "Priority Overnight" -msgstr "Entrega Prioritaria: Al Día Siguiente" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__delivery_type -msgid "Provider" -msgstr "Proveedor" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_service_type__sds -msgid "Saturday Delivery" -msgstr "Entrega el Sábado" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__gso_service_type -msgid "Service Type" -msgstr "Tipo de Servicio" - -#. module: delivery_gso -#: model:ir.model.fields,help:delivery_gso.field_delivery_carrier__gso_service_type -msgid "Service Type determines speed of delivery" -msgstr "El tipo de servicio determina la velocidad de entrega" - -#. module: delivery_gso -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#, python-format -msgid "Shipment N° %s has been cancelled" -msgstr "El número de envío %s ha sido cancelado" - -#. module: delivery_gso -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#, python-format -msgid "Shipment created into GSO
Tracking Numbers: %s" -msgstr "" -"El envío ha sido creado en GSO
Números de Seguimiento: %s" - -#. module: delivery_gso -#: model:ir.model,name:delivery_gso.model_delivery_carrier -msgid "Shipping Methods" -msgstr "Métodos de Envío" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__gso_image_type__zpl_short_label -msgid "Short Label" -msgstr "Etiqueta corta" - -#. module: delivery_gso -#: model:ir.model,name:delivery_gso.model_stock_package_type -msgid "Stock package type" -msgstr "Tipo de Paquete de Stock" - -#. module: delivery_gso -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#: code:addons/delivery_gso/models/delivery_gso.py:0 -#, python-format -msgid "TotalCharge not found." -msgstr "El CostoTotal no se encontró" - -#. module: delivery_gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__delivery_carrier__delivery_type__gso -#: model:ir.model.fields.selection,name:delivery_gso.selection__stock_package_type__package_carrier_type__gso -msgid "gso.com" -msgstr "gso.com" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__gso_account_number -msgid "gso.com Account Number" -msgstr "gso.com Número de Cuenta" - -#. module: delivery_gso -#: model_terms:ir.ui.view,arch_db:delivery_gso.view_delivery_carrier_form_with_provider_gso -msgid "gso.com Configuration" -msgstr "gso.com Configuración" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__gso_password -msgid "gso.com Password" -msgstr "gso.com Clave" - -#. module: delivery_gso -#: model:ir.model.fields,field_description:delivery_gso.field_delivery_carrier__gso_username -msgid "gso.com Username" -msgstr "gso.com Usuario" diff --git a/delivery_gso/models/__init__.py b/delivery_gso/models/__init__.py deleted file mode 100644 index c9a65a9e..00000000 --- a/delivery_gso/models/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from . import delivery_gso diff --git a/delivery_gso/models/delivery_gso.py b/delivery_gso/models/delivery_gso.py deleted file mode 100644 index cc3a6965..00000000 --- a/delivery_gso/models/delivery_gso.py +++ /dev/null @@ -1,462 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -import pytz -from math import ceil -from base64 import b64decode -from requests import HTTPError -from hashlib import sha1 - -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError, UserError - -from .requests_gso import GSORequest -import logging -_logger = logging.getLogger(__name__) - -GSO_TZ = 'PST8PDT' - - -def inline_b64decode(data): - try: - return b64decode(data) - except: - return '' - - -class StockPackageType(models.Model): - _inherit = 'stock.package.type' - - package_carrier_type = fields.Selection(selection_add=[('gso', 'gso.com')], ondelete={'gso': 'set default'}) - - -class ProviderGSO(models.Model): - _inherit = 'delivery.carrier' - - delivery_type = fields.Selection(selection_add=[('gso', 'gso.com')], ondelete={'gso': 'cascade'}) - gso_username = fields.Char(string='gso.com Username', groups='base.group_system') - gso_password = fields.Char(string='gso.com Password', groups='base.group_system') - gso_account_number = fields.Char(string='gso.com Account Number', groups='base.group_system') - gso_default_packaging_id = fields.Many2one('stock.package.type', string='Default Package Type') - # For service type, SAM, SPM, and SEV require authorized accounts. - gso_service_type = fields.Selection([('PDS', 'Priority Overnight'), - ('EPS', 'Early Priority Overnight'), - ('NPS', 'Noon Priority Overnight'), - ('SDS', 'Saturday Delivery'), - ('ESS', 'Early Saturday Delivery'), - ('CPS', 'GSO Ground'), - ('SAM', 'AM Select (8A-12P) Delivery Window'), - ('SPM', 'PM Select (12P-4P) Delivery Window'), - ('SEV', 'Evening Select (4P-8P) Delivery Window'), - ], - string="Service Type", default="CPS", help="Service Type determines speed of delivery") - gso_image_type = fields.Selection([('NO_LABEL', 'No Label'), - ('PAPER_LABEL', 'Paper Label'), - ('ZPL_SHORT_LABEL', 'Short Label'), - ('ZPL_LONG_LABEL', 'Long label'), - ], - string="Image Type", default="ZPL_SHORT_LABEL", help="Image Type is the type of Label to use") - - def _get_gso_service(self): - return GSORequest(self.prod_environment, - self.gso_username, - self.gso_password, - self.gso_account_number) - - def _gso_make_ship_address(self, partner): - # Addresses look like - # { - # 'ShipToCompany': '', - # 'ShipToAttention': '', - # 'ShipToPhone': '', - # 'ShipToEmail': '', - # 'DeliveryAddress1': '', - # 'DeliveryAddress2': '', - # 'DeliveryCity': '', - # 'DeliveryState': '', - # 'DeliveryZip': '', - # } - address = {} - # ShipToCompany is required. ShipToAttention which is a person is not. - if partner.name and not partner.parent_id: - address['ShipToCompany'] = partner.name - if partner.name and partner.parent_id: - address['ShipToCompany'] = partner.parent_id.name # or partner.parent_id.id.name ?? - address['ShipToAttention'] = partner.name - - if partner.phone: - address['ShipToPhone'] = partner.phone - if partner.email: - address['ShipToEmail'] = partner.email - if partner.street: - address['DeliveryAddress1'] = partner.street - if partner.street2: - address['DeliveryAddress2'] = partner.street2 - if partner.city: - address['DeliveryCity'] = partner.city - if partner.state_id: - address['DeliveryState'] = partner.state_id.code - if partner.zip: - address['DeliveryZip'] = partner.zip - - return address - - def _gso_make_shipper_address(self, warehouse, company): - # Addresses look like - # { - # 'ShipperCompany': '', - # 'ShipperContact': '', - # 'ShipperPhone': '', - # 'ShipperEmail': '', - # 'PickupAddress1': '', - # 'PickupAddress2': '', - # 'PickupCity': '', - # 'PickupState': '', - # 'PickupZip': '', - # } - address = {} - if company.name and not company.parent_id: - address['ShipperCompany'] = company.name - if company.name and company.parent_id: - address['ShipperCompany'] = company.parent_id.name - address['ShipperContact'] = company.name - - if warehouse.phone: - address['ShipperPhone'] = warehouse.phone - if warehouse.email: - address['ShipperEmail'] = warehouse.email - if warehouse.street: - address['PickupAddress1'] = warehouse.street - if warehouse.street2: - address['PickupAddress2'] = warehouse.street2 - if warehouse.city: - address['PickupCity'] = warehouse.city - if warehouse.state_id: - address['PickupState'] = warehouse.state_id.code - if warehouse.zip: - address['PickupZip'] = warehouse.zip - - return address - - def _gso_create_tracking_number(self, identifier): - # Override for a more 'customized' tracking number - # Expects a self.sudo() - if not identifier: - identifier = fields.Datetime.now() # string in Odoo 11 - salt = self.env['ir.config_parameter'].sudo().get_param('database.secret') - sha = sha1((identifier + salt).encode()).hexdigest() - return sha[:20] - - def _gso_get_package_dimensions(self, package=None): - if not package: - package_type = self.gso_default_packaging_id - else: - package_type = package.package_type_id - length_uom = self.env['product.template']._get_length_uom_id_from_ir_config_parameter() - if length_uom.name == 'ft': - return {'Length': round(package_type.packaging_length / 12.0), 'Width': round(package_type.width / 12.0), 'Height': round(package_type.height / 12.0)} - elif length_uom.name == 'mm': - return {'Length': round(package_type.packaging_length * 0.0393701), 'Width': round(package_type.width * 0.0393701), 'Height': round(package_type.height * 0.0393701)} - return {'Length': package_type.packaging_length, 'Width': package_type.width, 'Height': package_type.height} - - def _gso_convert_weight(self, weight_in_db): - weight_uom = self.env['product.template']._get_weight_uom_id_from_ir_config_parameter() - if weight_uom.name == 'kg': - weight_in_lb = weight_in_db / 0.45359237 - else: - # assume lbs - weight_in_lb = weight_in_db - # If less than 8 oz... - if weight_in_lb < 0.5: - return 0 - else: - # Round up to nearest lb - return int(ceil(weight_in_lb)) - - def gso_send_shipping(self, pickings): - res = [] - sudoself = self.sudo() - service = sudoself._get_gso_service() - - for picking in pickings: - company = self.get_shipper_company(picking=picking) - from_ = self.get_shipper_warehouse(picking=picking) - to = self.get_recipient(picking=picking) - address_type = 'B' if "company" in (to.company_type, to.parent_id.company_type) else 'R' - - request_body = { - 'AccountNumber': sudoself.gso_account_number, - 'Shipment': { - 'ServiceCode': sudoself.gso_service_type, - 'ShipmentLabelType': sudoself.gso_image_type, - 'SignatureCode': 'SIG_NOT_REQD', - 'DeliveryAddressType': address_type, - # 'ShipDate': fields.Date.today(), # safer not to send in case you want to ship on a weekend - }, - } - request_body['Shipment'].update(self._gso_make_shipper_address(from_, company)) - request_body['Shipment'].update(self._gso_make_ship_address(to)) - - cost = 0.0 - labels = { - 'thermal': [], - 'paper': [], - } - picking_packages = picking.package_ids - package_carriers = picking_packages.mapped('carrier_id') - if package_carriers: - # only ship ours - picking_packages = picking_packages.filtered(lambda p: p.carrier_id == self and not p.carrier_tracking_ref) - - if picking_packages: - # Every package will be a transaction - for package in picking_packages: - # Use Sale Order Number or fall back to Picking - shipment_ref = (picking.sale_id.name if picking.sale_id else picking.name) + '-' + package.name - insurance_value = sudoself.get_insurance_value(picking=picking, package=package) - if insurance_value > 100.0: - # Documentation says to set DeclaredValue ONLY if over $100.00 - request_body['Shipment']['DeclaredValue'] = insurance_value - elif 'DeclaredValue' in request_body['Shipment']: - del request_body['Shipment']['DeclaredValue'] - - if sudoself.get_signature_required(picking=picking, package=package): - request_body['Shipment']['SignatureCode'] = 'SIG_REQD' - else: - request_body['Shipment']['SignatureCode'] = 'SIG_NOT_REQD' - - request_body['Shipment']['Weight'] = self._gso_convert_weight(package.shipping_weight) - request_body['Shipment'].update(self._gso_get_package_dimensions(package)) - request_body['Shipment']['ShipmentReference'] = package.name - request_body['Shipment']['TrackingNumber'] = self._gso_create_tracking_number(package.name) - try: - response = service.post_shipment(request_body) - - if response.get('ThermalLabel'): - labels['thermal'].append((response['TrackingNumber'], response['ThermalLabel'])) - elif response.get('PaperLabel'): - labels['paper'].append((response['TrackingNumber'], response['PaperLabel'])) - - if response.get('ShipmentCharges', {}).get('TotalCharge'): - cost += response['ShipmentCharges']['TotalCharge'] - except HTTPError as e: - raise ValidationError(e) - elif not package_carriers: - # ship the whole picking - shipment_ref = picking.sale_id.name if picking.sale_id else picking.name - request_body['Shipment']['Weight'] = self._gso_convert_weight(picking.shipping_weight) - request_body['Shipment'].update(self._gso_get_package_dimensions()) - request_body['Shipment']['ShipmentReference'] = shipment_ref - request_body['Shipment']['TrackingNumber'] = self._gso_create_tracking_number(picking.name) - try: - response = service.post_shipment(request_body) - - if response.get('ThermalLabel'): - labels['thermal'].append((response['TrackingNumber'], response['ThermalLabel'])) - elif response.get('PaperLabel'): - labels['paper'].append((response['TrackingNumber'], response['PaperLabel'])) - - if response.get('ShipmentCharges', {}).get('TotalCharge'): - cost += response['ShipmentCharges']['TotalCharge'] - except HTTPError as e: - raise ValidationError(e) - else: - continue - - # Handle results - trackings = [l[0] for l in labels['thermal']] + [l[0] for l in labels['paper']] - carrier_tracking_ref = ','.join(trackings) - - logmessage = _("Shipment created into GSO
" - "Tracking Numbers: %s") % (carrier_tracking_ref, ) - attachments = [] - if labels['thermal']: - attachments += [('LabelGSO-%s.zpl' % (l[0], ), l[1]) for l in labels['thermal']] - if labels['paper']: - # paper labels re-encoded base64 - attachments += [('LabelGSO-%s.png' % (l[0], ), inline_b64decode(l[1])) for l in labels['paper']] - picking.message_post(body=logmessage, attachments=attachments) - shipping_data = {'exact_price': cost, - 'tracking_number': carrier_tracking_ref} - res.append(shipping_data) - return res - - def gso_cancel_shipment(self, picking): - sudoself = self.sudo() - service = sudoself._get_gso_service() - try: - request_body = { - 'AccountNumber': sudoself.gso_account_number, - } - for tracking in picking.carrier_tracking_ref.split(','): - request_body['TrackingNumber'] = tracking - __ = service.delete_shipment(request_body) - except HTTPError as e: - raise ValidationError(e) - picking.message_post(body=_('Shipment N° %s has been cancelled') % (picking.carrier_tracking_ref, )) - picking.write({'carrier_tracking_ref': '', 'carrier_price': 0.0}) - - def gso_rate_shipment(self, order): - sudoself = self.sudo() - service = sudoself._get_gso_service() - from_ = sudoself.get_shipper_warehouse(order=order) - to = sudoself.get_recipient(order=order) - address_type = 'B' if "company" in (to.company_type, to.parent_id.company_type) else 'R' - - est_weight_value = self._gso_convert_weight( - sum([(line.product_id.weight * line.product_uom_qty) for line in order.order_line]) or 0.0) - - date_planned = None - if self.env.context.get('date_planned'): - date_planned = self.env.context.get('date_planned') - - ship_date_utc = fields.Datetime.from_string(date_planned if date_planned else fields.Datetime.now()) - ship_date_utc = ship_date_utc.replace(tzinfo=pytz.utc) - ship_date_gso = ship_date_utc.astimezone(pytz.timezone(GSO_TZ)) - ship_date_gso = fields.Datetime.to_string(ship_date_gso) - - request_body = { - 'AccountNumber': sudoself.gso_account_number, - 'OriginZip': from_.zip, - 'DestinationZip': to.zip, - 'ShipDate': ship_date_gso, - 'PackageDimension': self._gso_get_package_dimensions(), - 'PackageWeight': est_weight_value, - 'DeliveryAddressType': address_type, - } - - result = service.get_rates_and_transit_time(request_body) - - delivery = list(filter(lambda d: d['ServiceCode'] == sudoself.gso_service_type, result['DeliveryServiceTypes'])) - if delivery: - delivery = delivery[0] - delivery_date_gso = delivery['DeliveryDate'].replace('T', ' ') - delivery_date_gso = fields.Datetime.from_string(delivery_date_gso) - delivery_date_gso = delivery_date_gso.replace(tzinfo=pytz.timezone(GSO_TZ)) - delivery_date_utc = delivery_date_gso.astimezone(pytz.utc) - delivery_date_utc = fields.Datetime.to_string(delivery_date_utc) - price = delivery.get('ShipmentCharges', {}).get('TotalCharge', 0.0) - return { - 'success': True, - 'price': price, - 'error_message': False, - 'date_delivered': delivery_date_utc, - 'warning_message': _('TotalCharge not found.') if price == 0.0 else False, - } - - raise Exception() - return { - 'success': False, - 'price': 0.0, - 'error_message': _('Delivery Method not found in result'), - 'warning_message': False, - } - - def gso_get_tracking_link(self, pickings): - # No way to get a link specifically as their site only allows POST into tracking form. - res = [] - for _ in pickings: - res.append('https://www.gso.com/Tracking') - return res - - def gso_rate_shipment_multi(self, order=None, picking=None, packages=None): - if not packages: - return self._gso_rate_shipment_multi_package(order=order, picking=picking) - else: - rates = [] - for package in packages: - rates += self._gso_rate_shipment_multi_package(order=order, picking=picking, package=package) - return rates - - def _gso_rate_shipment_multi_package(self, order=None, picking=None, package=None): - sudoself = self.sudo() - try: - service = sudoself._get_gso_service() - except HTTPError as e: - _logger.error(e) - return [{ - 'success': False, - 'price': 0.0, - 'error_message': _('GSO web service returned an error. ' + str(e)), - 'warning_message': False, - }] - - from_ = sudoself.get_shipper_warehouse(order=order, picking=picking) - to = sudoself.get_recipient(order=order, picking=picking) - address_type = 'B' if bool(to.is_company or to.parent_id.is_company) else 'R' - package_dimensions = self._gso_get_package_dimensions(package=package) - - date_planned = fields.Datetime.now() - if self.env.context.get('date_planned'): - date_planned = self.env.context.get('date_planned') - - ship_date_utc = fields.Datetime.from_string(date_planned if date_planned else fields.Datetime.now()) - ship_date_utc = ship_date_utc.replace(tzinfo=pytz.utc) - ship_date_gso = ship_date_utc.astimezone(pytz.timezone(GSO_TZ)) - ship_date_gso = fields.Datetime.to_string(ship_date_gso) - - if order: - est_weight_value = self._gso_convert_weight( - sum([(line.product_id.weight * line.product_uom_qty) for line in order.order_line]) or 0.0) - elif not package: - est_weight_value = self._gso_convert_weight(picking.shipping_weight) - else: - est_weight_value = self._gso_convert_weight(package.shipping_weight or package.weight) - - request_body = { - 'AccountNumber': sudoself.gso_account_number, - 'OriginZip': from_.zip, - 'DestinationZip': to.zip, - 'ShipDate': ship_date_gso, - 'PackageDimension': package_dimensions, - 'PackageWeight': est_weight_value, - 'DeliveryAddressType': address_type, - } - - try: - result = service.get_rates_and_transit_time(request_body) - # _logger.warning('GSO result:\n%s' % result) - except HTTPError as e: - # _logger.error(e) - return [{ - 'success': False, - 'price': 0.0, - 'error_message': _('GSO web service returned an error.'), - 'warning_message': False, - }] - - # delivery = list(filter(lambda d: d['ServiceCode'] == sudoself.gso_service_type, result['DeliveryServiceTypes'])) - # if delivery: - rates = [] - for delivery in result['DeliveryServiceTypes']: - delivery_date_gso = delivery['DeliveryDate'].replace('T', ' ') - delivery_date_gso = fields.Datetime.from_string(delivery_date_gso) - delivery_date_gso = delivery_date_gso.replace(tzinfo=pytz.timezone(GSO_TZ)) - delivery_date_utc = delivery_date_gso.astimezone(pytz.utc) - delivery_date_utc = fields.Datetime.to_string(delivery_date_utc) - price = delivery.get('ShipmentCharges', {}).get('TotalCharge', 0.0) - - carrier = self.gso_find_delivery_carrier_for_service(delivery['ServiceCode']) - if carrier: - rates.append({ - 'carrier': carrier, - 'package': package or self.env['stock.quant.package'].browse(), - 'success': True, - 'price': price, - 'error_message': False, - 'warning_message': _('TotalCharge not found.') if price == 0.0 else False, - 'date_planned': date_planned, - 'date_delivered': delivery_date_utc, - 'transit_days': False, - 'service_code': delivery['ServiceCode'], - }) - - return rates - - def gso_find_delivery_carrier_for_service(self, service_code): - if self.gso_service_type == service_code: - return self - # arbitrary decision, lets find the same account number - carrier = self.search([('gso_account_number', '=', self.gso_account_number), - ('gso_service_type', '=', service_code) - ], limit=1) - return carrier diff --git a/delivery_gso/models/requests_gso.py b/delivery_gso/models/requests_gso.py deleted file mode 100644 index 4e512661..00000000 --- a/delivery_gso/models/requests_gso.py +++ /dev/null @@ -1,49 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -import requests -from json import dumps - - -class GSORequest: - - BASE_URL = 'https://api.gso.com/Rest/v1' - - def __init__(self, production, username, password, account_number): - self.username = username - self.password = password - self.account_number = account_number - self.headers = self.make_headers() - self._get_token() - - def make_headers(self): - return { - 'Content-Type': 'application/json', - 'Accept-Encoding': 'gzip', - 'UserName': self.username, - 'PassWord': self.password, - 'AccountNumber': self.account_number, - } - - # Token Lasts 12 hours and should be refreshed accordingly. - # Might need to change to prevent too many calls to the API - def _get_token(self): - endpoint_url = self.BASE_URL + '/token' - response = requests.get(endpoint_url, headers=self.headers) - response.raise_for_status() - self.headers.update({'Token': response.headers['Token']}) - - def call(self, http_method, endpoint_url, payload): - url = self.BASE_URL + endpoint_url - result = requests.request(http_method, url, data=dumps(payload), headers=self.headers) - if result.status_code != 200: - raise requests.exceptions.HTTPError(result.text) - return result.json() - - def post_shipment(self, request_body): - return self.call('POST', '/Shipment', request_body) - - def delete_shipment(self, request_body): - return self.call('DELETE', '/Shipment', request_body) - - def get_rates_and_transit_time(self, request_body): - return self.call('POST', '/RatesAndTransitTimes', request_body) diff --git a/delivery_gso/views/delivery_gso_view.xml b/delivery_gso/views/delivery_gso_view.xml deleted file mode 100644 index ec57d2fe..00000000 --- a/delivery_gso/views/delivery_gso_view.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - delivery.carrier.form.provider.gso - delivery.carrier - - - - - - - - - - - - - - - - - - - - - -