@ -0,0 +1,42 @@ |
|||||
|
Shipstation Odoo connector |
||||
|
========================== |
||||
|
* Shipstation odoo connector module for Odoo 14 community editions |
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
- www.odoo.com/documentation/14.0/setup/install.html |
||||
|
- Install our custom addon |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
General Public License, Version 3 (LGPL v3). |
||||
|
(https://www.odoo.com/documentation/user/14.0/legal/licenses/licenses.html) |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
* Developer: |
||||
|
(v14) Dino @ Cybrosys |
||||
|
(v15) Viswanth @ Cybrosys |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit https://www.cybrosys.com |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
||||
|
|
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from . import models |
@ -0,0 +1,53 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
{ |
||||
|
'name': 'ShipStation Odoo Connector', |
||||
|
'version': '15.0.1.0.0', |
||||
|
'summary': 'Integrate and Manage ShipStation Operations with Odoo', |
||||
|
'description': 'Integrate and Manage ShipStation Operations with Odoo', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': 'https://www.cybrosys.com', |
||||
|
'depends': ['sale', 'account', 'stock', 'delivery'], |
||||
|
'data': [ |
||||
|
'security/security.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
'views/api_credential.xml', |
||||
|
'views/store.xml', |
||||
|
'views/services.xml', |
||||
|
'views/delivery_shipstation.xml', |
||||
|
'views/packages_shipstation.xml', |
||||
|
'views/delivery_carrier_view.xml', |
||||
|
'views/sale_orders.xml', |
||||
|
'views/shipstation_actions.xml', |
||||
|
'views/stock_picking.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.png'], |
||||
|
'license': 'OPL-1', |
||||
|
'price': 49, |
||||
|
'currency': 'EUR', |
||||
|
'installable': True, |
||||
|
'application': False, |
||||
|
'auto_install': False, |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
## Module <shipstation_odoo_connector> |
||||
|
|
||||
|
#### 04.11.2022 |
||||
|
#### Version 15.0.1.0.0 |
||||
|
##### ADD |
||||
|
|
||||
|
- Initial Commit for shipstation_odoo_connector |
@ -0,0 +1,28 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from . import shipstation_api |
||||
|
from . import store |
||||
|
from . import services |
||||
|
from . import delivery_method |
||||
|
from . import packages_shipstation |
||||
|
from . import stock_picking |
@ -0,0 +1,38 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from odoo import fields, models, api, _ |
||||
|
|
||||
|
|
||||
|
class DeliveryMethod(models.Model): |
||||
|
_name = 'shipstation.delivery' |
||||
|
_description = "Shipstation Delivery" |
||||
|
|
||||
|
name = fields.Char(string="Name") |
||||
|
code = fields.Char(string="Code") |
||||
|
account_number = fields.Char(string="Account Number") |
||||
|
requires_funded_account = fields.Boolean(string="Requires Funded Account") |
||||
|
balance = fields.Char(string="Balance") |
||||
|
nick_name = fields.Char(string="Nickname") |
||||
|
shipping_providerid = fields.Char(string="Shipping Provider") |
||||
|
primary = fields.Boolean(default=False, string="Primary") |
||||
|
company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company,string="Company id") |
@ -0,0 +1,34 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from odoo import fields, models, api, _ |
||||
|
|
||||
|
|
||||
|
class ShipstationPackages(models.Model): |
||||
|
_name = 'shipstation.packages' |
||||
|
_description = "Shipstation Packages" |
||||
|
|
||||
|
carrier_code = fields.Char(string='Carrier Code') |
||||
|
code = fields.Char(string='Code') |
||||
|
name = fields.Char(string='Name') |
||||
|
domestic = fields.Boolean(string="Domestic", default=False) |
||||
|
international = fields.Boolean(string="International", default=False) |
@ -0,0 +1,39 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from odoo import fields, models, api, _ |
||||
|
|
||||
|
try: |
||||
|
from base64 import encodestring |
||||
|
except ImportError: |
||||
|
from base64 import encodebytes as encodestring |
||||
|
|
||||
|
|
||||
|
class ShipstationService(models.Model): |
||||
|
_name = 'shipstation.service' |
||||
|
_description = "Shipstation Service" |
||||
|
|
||||
|
carrier_code = fields.Char(string="CarrierCode") |
||||
|
code = fields.Char(string="Code") |
||||
|
name = fields.Char(string="Name") |
||||
|
domestic = fields.Boolean(default=False, string="Domestic") |
||||
|
international = fields.Boolean(default=False, string="International") |
@ -0,0 +1,439 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2020-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
import json |
||||
|
from odoo import fields, models, api, _ |
||||
|
from odoo.http import request |
||||
|
from odoo.exceptions import UserError |
||||
|
import requests |
||||
|
import base64 |
||||
|
|
||||
|
try: |
||||
|
from base64 import encodestring |
||||
|
except ImportError: |
||||
|
from base64 import encodebytes as encodestring |
||||
|
|
||||
|
|
||||
|
class DeliveryCarrier(models.Model): |
||||
|
_inherit = 'delivery.carrier' |
||||
|
|
||||
|
delivery_type = fields.Selection( |
||||
|
selection_add=[('shipstation', 'ShipStation')], |
||||
|
ondelete={'shipstation': 'set ' |
||||
|
'default'}) |
||||
|
|
||||
|
@api.onchange('shipstation_carrier') |
||||
|
def _onchange_shipstaion_carrier(self): |
||||
|
service_object = self.env['shipstation.service'].search( |
||||
|
[('carrier_code', '=', self. |
||||
|
shipstation_carrier.code)]) |
||||
|
service_list = [] |
||||
|
for data in service_object: |
||||
|
service_list.append(data.id) |
||||
|
package_object = self.env['shipstation.packages'].search( |
||||
|
[('carrier_code', '=', self. |
||||
|
shipstation_carrier.code)]) |
||||
|
package_list = [] |
||||
|
for data in package_object: |
||||
|
package_list.append(data.id) |
||||
|
res = {} |
||||
|
res['domain'] = {'shipstation_service': [('id', 'in', service_list)], |
||||
|
'shipstation_package': [('id', 'in', package_list)]} |
||||
|
return res |
||||
|
|
||||
|
store = fields.Many2one('shipstation.store', string='Store',) |
||||
|
shipstation_carrier = fields.Many2one('shipstation.delivery', |
||||
|
string='Shipstation Carrier') |
||||
|
shipstation_service = fields.Many2one('shipstation.service', |
||||
|
string='Shipstation Delivery ' |
||||
|
'Carrier Service') |
||||
|
shipstation_package = fields.Many2one('shipstation.packages', |
||||
|
string='Shipstation Package') |
||||
|
|
||||
|
|
||||
|
class ShipStationApi(models.Model): |
||||
|
_name = 'shipstation.api' |
||||
|
_description = "Shipstation Api" |
||||
|
_rec_name = 'host' |
||||
|
|
||||
|
host = fields.Char(string="Host", help="Provide the api url",required=True) |
||||
|
username = fields.Char(string="Username", help="Provide the Shipstation API Key",required=True) |
||||
|
password = fields.Char(string="Password", help="Provide the Shipstation API Secret",required=True) |
||||
|
activate = fields.Boolean(string="Activate", default=False, |
||||
|
help="Make this credential active.Please activate only one credential ata time") |
||||
|
|
||||
|
def get_carriers_service(self): |
||||
|
"""This function will create shipstation store,packages and other |
||||
|
information form shipstation""" |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
self.username, self.password)).encode()).decode().replace('\n', '') |
||||
|
url = self.host + '/carriers' |
||||
|
headers = { |
||||
|
'Authorization': "Basic " + base64string |
||||
|
} |
||||
|
carriers = requests.get(url, headers=headers) |
||||
|
for rec in carriers.json(): |
||||
|
# print (rec) |
||||
|
product = self.env['product.product'].search( |
||||
|
[('name', '=', 'ShipstationShipping')]) |
||||
|
if not product: |
||||
|
product = self.env['product.product'].create({ |
||||
|
'name': 'ShipstationShipping', |
||||
|
'type': 'service', |
||||
|
'lst_price': 0.0, |
||||
|
}) |
||||
|
add_carriers = self.env['shipstation.delivery'].search([ |
||||
|
('shipping_providerid', '=', rec.get('shippingProviderId'))]) |
||||
|
if not add_carriers: |
||||
|
add_carriers = self.env['shipstation.delivery'].create({ |
||||
|
'name': rec.get('name'), |
||||
|
'code': rec.get('code'), |
||||
|
'account_number': rec.get('accountNumber') or False, |
||||
|
'requires_funded_account': rec.get( |
||||
|
'requiresFundedAccount') or False, |
||||
|
'balance': rec.get('balance'), |
||||
|
'nick_name': rec.get('nickname'), |
||||
|
'shipping_providerid': rec.get('shippingProviderId'), |
||||
|
'primary': rec.get('primary') |
||||
|
}) |
||||
|
|
||||
|
url = self.host + '/carriers/listservices?carrierCode=' \ |
||||
|
+ add_carriers.code |
||||
|
headers = { |
||||
|
'Authorization': "Basic " + base64string |
||||
|
} |
||||
|
services = requests.get(url, headers=headers) |
||||
|
for i in services.json(): |
||||
|
services = self.env['shipstation.service'].search \ |
||||
|
([('carrier_code', '=', i.get('carrier_code')) |
||||
|
and ('code', '=', i.get('code'))]) |
||||
|
if not services: |
||||
|
services = self.env['shipstation.service'].create({ |
||||
|
'carrier_code': i.get('carrierCode'), |
||||
|
'code': i.get('code'), |
||||
|
'name': i.get('name'), |
||||
|
'domestic': i.get('domestic'), |
||||
|
'international': i.get('international') |
||||
|
}) |
||||
|
url = self.host + '/carriers/listpackages?carrierCode=' \ |
||||
|
+ add_carriers.code |
||||
|
headers = { |
||||
|
'Authorization': "Basic " + base64string |
||||
|
} |
||||
|
packages = requests.get(url, headers=headers) |
||||
|
for p in packages.json(): |
||||
|
package = self.env['shipstation.packages'].search \ |
||||
|
([('carrier_code', '=', p.get('carrierCode')) |
||||
|
and ('code', '=', p.get('code') |
||||
|
and ('name', '=', p.get('name')))]) |
||||
|
if not package: |
||||
|
package = self.env['shipstation.packages'].create({ |
||||
|
'carrier_code': p.get('carrierCode'), |
||||
|
'code': p.get('code'), |
||||
|
'name': p.get('name'), |
||||
|
'domestic': p.get('domestic'), |
||||
|
'international': p.get('international') |
||||
|
}) |
||||
|
|
||||
|
url = self.host + '/stores' |
||||
|
headers = { |
||||
|
'Authorization': "Basic " + base64string |
||||
|
} |
||||
|
stores = requests.get(url, headers=headers) |
||||
|
for rec in stores.json(): |
||||
|
store = self.env['shipstation.store'].search \ |
||||
|
([('store_id', '=', rec.get('storeId')) and |
||||
|
('store_name', '=', rec.get('storeName'))]) |
||||
|
if not store: |
||||
|
store = self.env['shipstation.store'].create({ |
||||
|
'store_id': rec.get('storeId'), |
||||
|
'store_name': rec.get('storeName'), |
||||
|
'marketplace_name': rec.get('marketplaceName'), |
||||
|
'account_number': rec.get('accountName'), |
||||
|
'email': rec.get('email'), |
||||
|
'company_name': rec.get('companyName'), |
||||
|
'phone': rec.get('phone'), |
||||
|
'website': rec.get('website'), |
||||
|
'create_date': rec.get('createDate'), |
||||
|
'modified_date': rec.get('modifyDate') |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
class ChooseDeliveryCarrier(models.TransientModel): |
||||
|
_inherit = 'choose.delivery.carrier' |
||||
|
|
||||
|
def _get_shipment_rate(self): |
||||
|
"""Calculating the shipping rate""" |
||||
|
vals = self.carrier_id.rate_shipment(self.order_id) |
||||
|
if vals.get('success'): |
||||
|
self.delivery_message = vals.get('warning_message', False) |
||||
|
self.delivery_price = vals['price'] |
||||
|
self.display_price = vals['price'] |
||||
|
return {} |
||||
|
return {'error_message': vals['error_message']} |
||||
|
|
||||
|
|
||||
|
class DeliveryCarrier(models.Model): |
||||
|
_inherit = ['delivery.carrier'] |
||||
|
_primary_email = ['email_from'] |
||||
|
|
||||
|
code = fields.Char(string="Code") |
||||
|
|
||||
|
def send_shipping(self, pickings): |
||||
|
self.ensure_one() |
||||
|
if hasattr(self, '%s_send_shipping' % self.delivery_type): |
||||
|
return getattr(self, '%s_send_shipping' % self.delivery_type)( |
||||
|
pickings) |
||||
|
|
||||
|
@api.model |
||||
|
def create_oredr(self, pickings): |
||||
|
"""Creating order to shipstation""" |
||||
|
credential = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
for rec in credential: |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
rec.username, rec.password)).encode()).decode().replace('\n', |
||||
|
'') |
||||
|
if not pickings.shipstation_order_id or pickings.shipstation_shipping_cancel: |
||||
|
|
||||
|
url = rec.host + '/orders/createorder' |
||||
|
else: |
||||
|
url = rec.host + '/orders/' + str(pickings.shipstation_order_id) |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
'Content-Type': 'application/json' |
||||
|
} |
||||
|
oredrNumber = pickings.origin |
||||
|
sale_oredr = self.env['sale.order'].search( |
||||
|
[('name', '=', pickings.origin)]) |
||||
|
oredrDate = sale_oredr.date_order |
||||
|
paymentDate = sale_oredr.date_order |
||||
|
shipByDate = pickings.scheduled_date |
||||
|
if pickings.shipstation_shipping_cancel: |
||||
|
oredrStatus = 'cancelled' |
||||
|
|
||||
|
else: |
||||
|
oredrStatus = 'awaiting_shipment' |
||||
|
customer_id = sale_oredr.partner_id.id |
||||
|
customerUsername = sale_oredr.partner_id.name |
||||
|
billname = sale_oredr.partner_id.name |
||||
|
bill_street1 = sale_oredr.partner_invoice_id.street |
||||
|
bill_street2 = sale_oredr.partner_invoice_id.street2 or "" |
||||
|
bill_city = sale_oredr.partner_invoice_id.city |
||||
|
bill_state = sale_oredr.partner_invoice_id.state_id.name |
||||
|
bill_postal = sale_oredr.partner_invoice_id.zip |
||||
|
bil_contry = sale_oredr.partner_invoice_id.country_id.code |
||||
|
bill_phone = sale_oredr.partner_invoice_id.phone |
||||
|
shipTo_name = sale_oredr.partner_id.name |
||||
|
shipTo_street1 = sale_oredr.partner_invoice_id.street |
||||
|
shipTo_street2 = sale_oredr.partner_invoice_id.street2 or " " |
||||
|
shipTo_city = sale_oredr.partner_invoice_id.city |
||||
|
shipTo_state = sale_oredr.partner_invoice_id.state_id.name |
||||
|
shipTo_postal = sale_oredr.partner_invoice_id.zip |
||||
|
shipTo_contry = sale_oredr.partner_invoice_id.country_id.code |
||||
|
|
||||
|
shipTo_phone = sale_oredr.partner_invoice_id.phone |
||||
|
items = [] |
||||
|
for rec in sale_oredr.order_line: |
||||
|
each = {"sku": rec.product_id.default_code or "null", |
||||
|
"name": rec.product_id.name, |
||||
|
"imageUrl": f'{request.httprequest.host_url}' |
||||
|
f'web/image?model=product.template&id=' |
||||
|
f'{rec.product_id.id}&field=image_128', |
||||
|
"weight": { |
||||
|
"value": (rec.product_id.weight * 2.2046), |
||||
|
"units": "pounds" |
||||
|
}, |
||||
|
"quantity": int(rec.product_uom_qty), |
||||
|
"unitPrice": rec.price_unit, |
||||
|
"taxAmount": rec.tax_id.amount, |
||||
|
"shippingAmount": (rec.price_unit * int( |
||||
|
rec.product_uom_qty)) + rec.tax_id.amount, |
||||
|
"productId": rec.product_id.id |
||||
|
} |
||||
|
items.append(each) |
||||
|
items = str(items) |
||||
|
|
||||
|
amountPaid = sale_oredr.amount_untaxed |
||||
|
taxAmount = sale_oredr.amount_tax |
||||
|
shippingAmount = 0.0 |
||||
|
customerNotes = sale_oredr.note |
||||
|
internalNotes = " " |
||||
|
paymentMethod = "Credit Card" |
||||
|
dc = self.env['delivery.carrier'].search([('name', '=', |
||||
|
pickings.carrier_id.name)]) |
||||
|
requestedShippingService = dc.shipstation_service.name |
||||
|
carrierCode = dc.shipstation_carrier.code |
||||
|
serviceCode = dc.shipstation_service.code |
||||
|
packageCode = dc.shipstation_package.code |
||||
|
confirmation = "delivery" |
||||
|
shipDate = pickings.date_done |
||||
|
weight = "{\n\"value\": %s,\n\"units\":\"%s\"\n }" % ( |
||||
|
(pickings.shipping_weight * 2.2046), "pounds") |
||||
|
tag_ids = sale_oredr.tag_ids |
||||
|
if pickings.shipstation_shipping_cancel and pickings.shipstation_shipping_orderKey: |
||||
|
|
||||
|
payload = "{\n \"orderNumber\": \"%s\",\n \"orderKey\":\"%s\",\n \"orderDate\": \"%s\",\n \"paymentDate\": \"%s\",\n \"shipByDate\": \"%s\",\n \"orderStatus\": \"%s\",\n \"customerId\": \"%s\",\n \"customerUsername\": \"%s\",\n \"billTo\": {\n \"name\": \"%s\",\n \"street1\": \"%s\",\n \"street2\": \"%s\",\n \"city\": \"%s\",\n \"state\": \"%s\",\n \"postalCode\": \"%s\",\n \"country\": \"%s\",\n \"phone\": \"%s\" },\n \"shipTo\": {\n \"name\": \"%s\",\n \"street1\": \"%s\",\n \"street2\": \"%s\",\n \"city\": \"%s\",\n \"state\": \"%s\",\n \"postalCode\": \"%s\",\n \"country\":\"%s\",\n \"phone\": \"%s\" },\n \"items\":%s,\n \"amountPaid\": \"%s\",\n \"taxAmount\": \"%s\",\n \"shippingAmount\": \"%s\",\n \"customerNotes\": \"%s\",\n \"internalNotes\": \"%s\",\n \"paymentMethod\": \"%s\",\n \"requestedShippingService\": \"%s\",\n \"carrierCode\": \"%s\",\n \"serviceCode\":\"%s\",\n \"packageCode\": \"%s\",\n \"confirmation\": \"%s\",\n \"shipDate\": \"%s\",\n \"weight\":%s }" % ( |
||||
|
oredrNumber, pickings.shipstation_shipping_orderKey, |
||||
|
oredrDate, paymentDate, shipByDate, |
||||
|
oredrStatus, |
||||
|
customer_id, customerUsername, billname, bill_street1, |
||||
|
bill_street2, |
||||
|
bill_city, bill_state, bill_postal, bil_contry, bill_phone, |
||||
|
shipTo_name, |
||||
|
shipTo_street1, shipTo_street2, shipTo_city, shipTo_state, |
||||
|
shipTo_postal, shipTo_contry, shipTo_phone, items, |
||||
|
amountPaid, |
||||
|
taxAmount, |
||||
|
shippingAmount, customerNotes, internalNotes, paymentMethod, |
||||
|
requestedShippingService, carrierCode, serviceCode, |
||||
|
packageCode, |
||||
|
confirmation, shipDate, weight) |
||||
|
else: |
||||
|
payload = "{\n \"orderNumber\": \"%s\",\n \"orderDate\": \"%s\",\n \"paymentDate\": \"%s\",\n \"shipByDate\": \"%s\",\n \"orderStatus\": \"%s\",\n \"customerId\": \"%s\",\n \"customerUsername\": \"%s\",\n \"billTo\": {\n \"name\": \"%s\",\n \"street1\": \"%s\",\n \"street2\": \"%s\",\n \"city\": \"%s\",\n \"state\": \"%s\",\n \"postalCode\": \"%s\",\n \"country\": \"%s\",\n \"phone\": \"%s\" },\n \"shipTo\": {\n \"name\": \"%s\",\n \"street1\": \"%s\",\n \"street2\": \"%s\",\n \"city\": \"%s\",\n \"state\": \"%s\",\n \"postalCode\": \"%s\",\n \"country\":\"%s\",\n \"phone\": \"%s\" },\n \"items\":%s,\n \"amountPaid\": \"%s\",\n \"taxAmount\": \"%s\",\n \"shippingAmount\": \"%s\",\n \"customerNotes\": \"%s\",\n \"internalNotes\": \"%s\",\n \"paymentMethod\": \"%s\",\n \"requestedShippingService\": \"%s\",\n \"carrierCode\": \"%s\",\n \"serviceCode\":\"%s\",\n \"packageCode\": \"%s\",\n \"confirmation\": \"%s\",\n \"shipDate\": \"%s\",\n \"weight\":%s }" % ( |
||||
|
oredrNumber, oredrDate, paymentDate, shipByDate, |
||||
|
oredrStatus, |
||||
|
customer_id, customerUsername, billname, bill_street1, |
||||
|
bill_street2, |
||||
|
bill_city, bill_state, bill_postal, bil_contry, bill_phone, |
||||
|
shipTo_name, |
||||
|
shipTo_street1, shipTo_street2, shipTo_city, shipTo_state, |
||||
|
shipTo_postal, shipTo_contry, shipTo_phone, items, |
||||
|
amountPaid, |
||||
|
taxAmount, |
||||
|
shippingAmount, customerNotes, internalNotes, paymentMethod, |
||||
|
requestedShippingService, carrierCode, serviceCode, |
||||
|
packageCode, |
||||
|
confirmation, shipDate, weight) |
||||
|
|
||||
|
create_order = requests.request("POST", url, headers=headers, |
||||
|
data=payload) |
||||
|
result = create_order.json() |
||||
|
|
||||
|
if not pickings.shipstation_order_id and result.get('orderId'): |
||||
|
pickings.shipstation_order_id = result.get('orderId') |
||||
|
pickings.carrier_tracking_ref = result.get('orderId') |
||||
|
pickings.shipstation_shipping_orderKey = result.get('orderKey') |
||||
|
attachment_64 = pickings.get_label() |
||||
|
|
||||
|
so_attachment = self.env['ir.attachment'].sudo().create({ |
||||
|
'name': 'Shipstation Shipping Label - %s.pdf' % attachment_64.get('trackingNumber'), |
||||
|
'type': 'binary', |
||||
|
'mimetype': 'application/pdf', |
||||
|
'datas': attachment_64.get('data') |
||||
|
}) |
||||
|
pickings.message_post( |
||||
|
body=(_("Order created into Shipstation for %s<br/>" % self.name)), |
||||
|
attachment_ids=[so_attachment.id] |
||||
|
) |
||||
|
|
||||
|
def shipstation_cancel_shipment(self, pickings): |
||||
|
"""Function to cancel shipstaion order""" |
||||
|
pickings.shipstation_shipping_cancel = True |
||||
|
pickings.send_to_shipper() |
||||
|
|
||||
|
def shipstation_send_shipping(self, pickings): |
||||
|
res = [] |
||||
|
self.create_oredr(pickings) |
||||
|
for p in pickings: |
||||
|
res = res + [{'exact_price': p.carrier_id.fixed_price, |
||||
|
'tracking_number': False}] |
||||
|
return res |
||||
|
|
||||
|
def shipstation_rate_shipment(self, order): |
||||
|
"""Calculating shipping rate""" |
||||
|
|
||||
|
shipstation = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)], limit=1) |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
shipstation.username, |
||||
|
shipstation.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
url = shipstation.host + "/shipments/getrates" |
||||
|
company_postal = order.company_id.zip |
||||
|
to_state = order.partner_shipping_id.state_id.name |
||||
|
to_country = order.partner_shipping_id.country_id.code |
||||
|
to_postal = order.partner_shipping_id.zip |
||||
|
to_city = order.partner_shipping_id.city |
||||
|
weight_value = 0 |
||||
|
for rec in order.order_line: |
||||
|
weight_value = weight_value + ( |
||||
|
rec.product_id.weight * rec.product_uom_qty) |
||||
|
payload = "{\n \"carrierCode\": \"%s\",\n \"serviceCode\": \"%s\",\n \"packageCode\": \"%s\",\n \"fromPostalCode\": \"%s\",\n \"toState\": \"%s\",\n \"toCountry\": \"%s\",\n \"toPostalCode\": \"%s\",\n \"toCity\": \"%s\",\n \"weight\": {\n \"value\": %s,\n \"units\": \"pounds\"\n }\n}" % ( |
||||
|
self.shipstation_carrier.code, self.shipstation_service.code, |
||||
|
self.shipstation_package.code, company_postal, to_state, to_country, |
||||
|
to_postal, to_city, (weight_value * 2.2046)) |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
'Content-Type': 'application/json' |
||||
|
} |
||||
|
response = requests.request("POST", url, headers=headers, data=payload) |
||||
|
result = response.json() |
||||
|
# print("result", result) |
||||
|
if not result: |
||||
|
|
||||
|
final = {'success': True, |
||||
|
'price': 0.0, |
||||
|
'error_message': True, |
||||
|
'warning_message': "Something went wrong"} |
||||
|
else: |
||||
|
if 'shipmentCost' in result[0]: |
||||
|
price = result[0].get('shipmentCost') |
||||
|
final = {'success': True, |
||||
|
'price': price, |
||||
|
'error_message': False, |
||||
|
'warning_message': False} |
||||
|
else: |
||||
|
final = {'success': True, |
||||
|
'price': 0, |
||||
|
'error_message': True, |
||||
|
'warning_message': result.get('ExceptionMessage')} |
||||
|
return final |
||||
|
|
||||
|
def rate_shipment(self, order): |
||||
|
self.ensure_one() |
||||
|
if hasattr(self, '%s_rate_shipment' % self.delivery_type): |
||||
|
res = getattr(self, '%s_rate_shipment' % self.delivery_type)(order) |
||||
|
# apply margin on computed price |
||||
|
res['price'] = float(res['price']) * ( |
||||
|
1.0 + (float(self.margin) / 100.0)) |
||||
|
# free when order is large enough |
||||
|
if res['success'] and self.free_over and \ |
||||
|
order._compute_amount_total_without_delivery() >= self.amount: |
||||
|
res['warning_message'] = _( |
||||
|
'Info:\nThe shipping is free because the order amount ' |
||||
|
'exceeds %.2f.\n(The actual shipping cost is: %.2f)') % ( |
||||
|
self.amount, res['price']) |
||||
|
res['price'] = 0.0 |
||||
|
return res |
||||
|
|
||||
|
def cancel_shipment(self, pickings): |
||||
|
|
||||
|
self.ensure_one() |
||||
|
if hasattr(self, '%s_cancel_shipment' % self.delivery_type): |
||||
|
return getattr(self, '%s_cancel_shipment' % self.delivery_type)( |
||||
|
pickings) |
@ -0,0 +1,224 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from odoo import fields, models, api, _ |
||||
|
import requests |
||||
|
import base64 |
||||
|
|
||||
|
try: |
||||
|
from base64 import encodestring |
||||
|
except ImportError: |
||||
|
from base64 import encodebytes as encodestring |
||||
|
|
||||
|
|
||||
|
class StockPicking(models.Model): |
||||
|
_inherit = 'stock.picking' |
||||
|
|
||||
|
shipstation_order_id = fields.Integer(string="Shipstaion Order Id ", readonly=True) |
||||
|
shipstation_shipping_status = fields.Char(string="Shipping Status", |
||||
|
compute='_compute_shipstation_shipping_status') |
||||
|
shipstation_shipping_cancel = fields.Boolean(string="Is Cancel", default=False) |
||||
|
shipstation_shipping_orderKey = fields.Char(string="Order Key") |
||||
|
shipstation_shipping_hold_date = fields.Date(string="Hold Until") |
||||
|
|
||||
|
@api.depends('shipstation_order_id') |
||||
|
def _compute_shipstation_shipping_status(self): |
||||
|
|
||||
|
if self.shipstation_order_id: |
||||
|
|
||||
|
shipstation = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
shipstation.username, |
||||
|
shipstation.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
url = shipstation.host + '/orders/' + str(self.shipstation_order_id) |
||||
|
payload = {} |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string |
||||
|
} |
||||
|
response = requests.request("GET", url, headers=headers, |
||||
|
data=payload) |
||||
|
# print("compute", response.json()) |
||||
|
|
||||
|
self.shipstation_shipping_status = response.json().get( |
||||
|
'orderStatus') |
||||
|
else: |
||||
|
self.shipstation_shipping_status = "None" |
||||
|
|
||||
|
def get_label(self): |
||||
|
shipstation = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
dc = self.env['delivery.carrier'].search([('name', '=', |
||||
|
self.carrier_id.name)]) |
||||
|
sale_oredr = self.env['sale.order'].search( |
||||
|
[('name', '=', self.origin)]) |
||||
|
total_weight = self.shipping_weight |
||||
|
|
||||
|
self.get_shipping_info() |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
shipstation.username, |
||||
|
shipstation.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
url = shipstation.host + '/orders/createlabelfororder' |
||||
|
# str(self.shipstation_order_id) |
||||
|
payload = "{\n \"orderId\": %s,\n \"carrierCode\": \"%s\",\n \"serviceCode\": \"%s\",\n \"packageCode\": \"%s\",\n \"shipDate\": \"%s\",\n \"weight\": {\n \"value\": %s,\n \"units\": \"pounds\"\n },\n \"internationalOptions\": null,\n \"advancedOptions\": null,\n \"testLabel\": false\n}" % ( |
||||
|
self.shipstation_order_id, dc.shipstation_carrier.code, |
||||
|
dc.shipstation_service.code, dc.shipstation_package.code, |
||||
|
sale_oredr.date_order, (total_weight * 2.2046)) |
||||
|
|
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
'Content-Type': 'application/json' |
||||
|
|
||||
|
} |
||||
|
|
||||
|
response = requests.request("POST", url, headers=headers, |
||||
|
data=str(payload)) |
||||
|
|
||||
|
value = {'trackingNumber': response.json().get('trackingNumber'), 'data': response.json().get('labelData')} |
||||
|
return value |
||||
|
|
||||
|
def send_to_shipper(self): |
||||
|
self.ensure_one() |
||||
|
|
||||
|
res = self.carrier_id.send_shipping(self)[0] |
||||
|
if self.carrier_id.free_over and self.sale_id and self.sale_id._compute_amount_total_without_delivery() >= self.carrier_id.amount: |
||||
|
res['exact_price'] = 0.0 |
||||
|
self.carrier_price = res['exact_price'] * ( |
||||
|
1.0 + (self.carrier_id.margin / 100.0)) |
||||
|
if res['tracking_number']: |
||||
|
self.carrier_tracking_ref = res['tracking_number'] |
||||
|
order_currency = self.sale_id.currency_id or self.company_id.currency_id |
||||
|
msg = _( |
||||
|
"Shipment sent to carrier %(carrier_name)s for shipping with " |
||||
|
"tracking number %(ref)s<br/>Cost: %(price).2f %(currency)s", |
||||
|
carrier_name=self.carrier_id.name, |
||||
|
ref=self.carrier_tracking_ref, |
||||
|
price=self.carrier_price, |
||||
|
currency=order_currency.name |
||||
|
) |
||||
|
self.message_post(body=msg) |
||||
|
self._add_delivery_cost_to_so() |
||||
|
|
||||
|
def action_onhold_order(self): |
||||
|
shipstation = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
shipstation.username, |
||||
|
shipstation.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
url = shipstation.host + '/orders/holduntil' |
||||
|
if self.shipstation_shipping_hold_date: |
||||
|
hold_date = self.shipstation_shipping_hold_date |
||||
|
else: |
||||
|
hold_date = fields.date.today() |
||||
|
payload = "{\n \"orderId\": %s,\n \"holdUntilDate\": \"%s\"\n}" % ( |
||||
|
self.shipstation_order_id, hold_date) |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
'Content-Type': 'application/json' |
||||
|
} |
||||
|
response = requests.request("POST", url, headers=headers, data=payload) |
||||
|
|
||||
|
def action_shipped_order(self): |
||||
|
shipstation = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
shipstation.username, |
||||
|
shipstation.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
carrier_code = self.env['delivery.carrier'].search( |
||||
|
[('id', '=', self.carrier_id.id)]) |
||||
|
|
||||
|
carier = carrier_code.shipstation_carrier.code |
||||
|
url = shipstation.host + 'orders/markasshipped' |
||||
|
payload = "{\n \"orderId\": %s,\n \"carrierCode\": \"%s\",\n \"trackingNumber\": \"%s\",\n \"notifyCustomer\": true}" % ( |
||||
|
int(self.shipstation_order_id), |
||||
|
carier, self.shipstation_order_id) |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
'Content-Type': 'application/json' |
||||
|
} |
||||
|
response = requests.request("POST", url, headers=headers, data=payload) |
||||
|
|
||||
|
def action_restore_hold_order(self): |
||||
|
shipstation = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
|
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
shipstation.username, |
||||
|
shipstation.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
url = shipstation.host + 'orders/restorefromhold' |
||||
|
if self.shipstation_shipping_hold_date: |
||||
|
hold_date = self.shipstation_shipping_hold_date |
||||
|
else: |
||||
|
hold_date = fields.date.today() |
||||
|
payload = "{\n \"orderId\": %s}" % ( |
||||
|
self.shipstation_order_id) |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
'Content-Type': 'application/json' |
||||
|
} |
||||
|
response = requests.request("POST", url, headers=headers, data=payload) |
||||
|
|
||||
|
def open_website_url(self): |
||||
|
if self.shipstation_order_id: |
||||
|
if self.shipstation_shipping_status == 'awaiting_shipment': |
||||
|
url = 'https://ship13.shipstation.com/orders/awaiting-shipment' |
||||
|
elif self.shipstation_shipping_status == 'shipped': |
||||
|
url = 'https://ship13.shipstation.com/shipments/shipped?' |
||||
|
# url ='https://ship13.shipstation.com/orders/shipped' |
||||
|
elif self.shipstation_shipping_status == 'on_hold': |
||||
|
url = 'https://ship13.shipstation.com/orders/on-hold' |
||||
|
elif self.shipstation_shipping_status == 'cancelled': |
||||
|
url = 'https://ship13.shipstation.com/orders/cancelled' |
||||
|
return { |
||||
|
"type": "ir.actions.act_url", |
||||
|
"url": url + '/%s' % self.origin, |
||||
|
"target": "new" |
||||
|
} |
||||
|
|
||||
|
def get_shipping_info(self, ): |
||||
|
credential = self.env['shipstation.api'].search( |
||||
|
[('activate', '=', True)]) |
||||
|
base64string = base64.encodebytes(('%s:%s' % ( |
||||
|
credential.username, |
||||
|
credential.password)).encode()).decode().replace('\n', '') |
||||
|
|
||||
|
url = credential.host + 'shipments?orderNumber=%s&orderId=%s' % ( |
||||
|
self.origin, self.shipstation_order_id) |
||||
|
headers = { |
||||
|
'Host': 'ssapi.shipstation.com', |
||||
|
'Authorization': "Basic " + base64string, |
||||
|
} |
||||
|
ship = requests.get(url, headers=headers) |
@ -0,0 +1,40 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
###################################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1) |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software |
||||
|
# or modified copies of the Software. |
||||
|
# |
||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
|
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
|
# DEALINGS IN THE SOFTWARE. |
||||
|
# |
||||
|
######################################################################################## |
||||
|
|
||||
|
from odoo import fields, models, api |
||||
|
|
||||
|
|
||||
|
class ShipstationStore(models.Model): |
||||
|
_name = 'shipstation.store' |
||||
|
_description = "ShipStation Store" |
||||
|
_rec_name = 'store_name' |
||||
|
|
||||
|
store_id = fields.Integer(string="Store id", required=True) |
||||
|
store_name = fields.Char(string="Store Name", required=True) |
||||
|
marketplace_name = fields.Char(string="Marketplace Name", required=True) |
||||
|
account_number = fields.Char(string="Account Number") |
||||
|
email = fields.Char(string="Email") |
||||
|
company_name = fields.Char(string="Company Name") |
||||
|
phone = fields.Char(string="Phone") |
||||
|
website = fields.Char(string="Website") |
||||
|
create_date = fields.Date(string="Create Date") |
||||
|
modified_date = fields.Date(string="Modified Date") |
|
@ -0,0 +1,12 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<odoo> |
||||
|
<record model="ir.module.category" id="category_shipstation"> |
||||
|
<field name="name">Shipstaion</field> |
||||
|
<field name="description">Category for Shipstation</field> |
||||
|
</record> |
||||
|
<record id="group_shipstation_manager" model="res.groups"> |
||||
|
<field name="name">Manager</field> |
||||
|
<field name="category_id" ref="category_shipstation"/> |
||||
|
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> |
||||
|
</record> |
||||
|
</odoo> |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 1.8 MiB |
After Width: | Height: | Size: 57 KiB |
After Width: | Height: | Size: 435 KiB |
After Width: | Height: | Size: 564 KiB |
After Width: | Height: | Size: 228 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 145 KiB |
After Width: | Height: | Size: 164 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 180 KiB |
After Width: | Height: | Size: 159 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 159 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,669 @@ |
|||||
|
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;"> |
||||
|
<!-- TITLE BAR --> |
||||
|
<div |
||||
|
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> |
||||
|
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;" /> |
||||
|
<div> |
||||
|
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
||||
|
class="mr-2"> |
||||
|
<i class="fa fa-check mr-1"></i>Community |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF TITLE BAR --> |
||||
|
|
||||
|
<!-- APP HERO --> |
||||
|
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">ShipStation Odoo Connector</h1> |
||||
|
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Integrate and Manage ShipStation Operations with Odoo</p> |
||||
|
<!-- END OF APP HERO --> |
||||
|
<img src="assets/screenshots/hero.gif" |
||||
|
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;" /> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
<!-- NAVIGATION SECTION --> |
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/compass.png" /> |
||||
|
</div> |
||||
|
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This |
||||
|
Module</h2> |
||||
|
</div> |
||||
|
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> |
||||
|
<div class="col-md-6"> |
||||
|
<a href="#overview" style="text-decoration: none !important;"> |
||||
|
<div class="row" |
||||
|
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> |
||||
|
<div class="col-8"> |
||||
|
<h3 |
||||
|
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> |
||||
|
Overview</h3> |
||||
|
<p |
||||
|
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> |
||||
|
Learn more about this module</p> |
||||
|
</div> |
||||
|
<div class="col-4 text-right d-flex justify-content-end align-items-center"> |
||||
|
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-md-6"> |
||||
|
<a href="#configuration" style="text-decoration: none !important;"> |
||||
|
<div class="row" |
||||
|
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> |
||||
|
<div class="col-8"> |
||||
|
<h3 |
||||
|
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> |
||||
|
Configuration</h3> |
||||
|
<p |
||||
|
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> |
||||
|
View configurations for this module</p> |
||||
|
</div> |
||||
|
<div class="col-4 text-right d-flex justify-content-end align-items-center"> |
||||
|
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-md-6"> |
||||
|
<a href="#features" style="text-decoration: none !important;"> |
||||
|
<div class="row" |
||||
|
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> |
||||
|
<div class="col-8"> |
||||
|
<h3 |
||||
|
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> |
||||
|
Features</h3> |
||||
|
<p |
||||
|
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> |
||||
|
View features of this module</p> |
||||
|
</div> |
||||
|
<div class="col-4 text-right d-flex justify-content-end align-items-center"> |
||||
|
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-md-6"> |
||||
|
<a href="#screenshots" style="text-decoration: none !important;"> |
||||
|
<div class="row" |
||||
|
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> |
||||
|
<div class="col-8"> |
||||
|
<h3 |
||||
|
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> |
||||
|
Screenshots</h3> |
||||
|
<p |
||||
|
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> |
||||
|
See key screenshots of this module</p> |
||||
|
</div> |
||||
|
<div class="col-4 text-right d-flex justify-content-end align-items-center"> |
||||
|
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF NAVIGATION SECTION --> |
||||
|
|
||||
|
<!-- OVERVIEW SECTION --> |
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/pie-chart.png" /> |
||||
|
</div> |
||||
|
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview |
||||
|
</h2> |
||||
|
</div> |
||||
|
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
||||
|
<div class="col-sm-12 py-4"> |
||||
|
This connector will help to integrate and manage your shipstation orders with Odoo. |
||||
|
Furthermore, It Synchronizes Orders, Products, and Customers. |
||||
|
You can easily integrate with various shipping companies. |
||||
|
In addition, the connector will automatically transfer order details such as Order Tracking number and Shipping Cost from Odoo to shipstation |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF OVERVIEW SECTION --> |
||||
|
|
||||
|
<div class="row" id="configuration"> |
||||
|
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important"> |
||||
|
<h2 |
||||
|
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> |
||||
|
<i class="fa fa-pie-chart mr-2"></i>Configuration |
||||
|
</h2> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12"> |
||||
|
|
||||
|
<div style="display: block; margin: 30px auto;"><h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Steps to setup account in Shipstation</h3></div> |
||||
|
<div style="display: block; margin: 30px auto;"><p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">1. Open Shipstation website and click on the Try Shipstation Now option</p> |
||||
|
<img src="assets/screenshots/shipstation_1.png" class="img-thumbnail"></div> |
||||
|
<div style="display: block; margin: 30px auto;"><p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">2. Provide the details and agree to the terms and condition and click on Get started</p> |
||||
|
<img src="assets/screenshots/shipstation_3.png" class="img-thumbnail"></div> |
||||
|
<div style="display: block; margin: 30px auto;"> <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">3. In the shipstation dashboard click on the settings icon</p> |
||||
|
<img src="assets/screenshots/shipstation_4.png" class="img-thumbnail"></div> |
||||
|
<div style="display: block; margin: 30px auto;"><p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">4. Expand the Account section and click on ApiSettings</p> |
||||
|
<img src="assets/screenshots/shipstation_5.png" class="img-thumbnail"></div> |
||||
|
<div style="display: block; margin: 30px auto;"><p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">5. Here we can see the API KEY(username) and API Secret(Password)</p> |
||||
|
<img src="assets/screenshots/shipstation_6.png" class="img-thumbnail"></div> |
||||
|
<div style="display: block; margin: 30px auto;"><p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">6. We need to set up a shipping carrier, for that click on the Add a Carrier Account</p> |
||||
|
<img src="assets/screenshots/shipstation_7.png" class="img-thumbnail"></div> |
||||
|
<div style="display: block; margin: 30px auto;"><p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">7. Finally, click on the carrier and set up the account</p> |
||||
|
<img src="assets/screenshots/shipstation_8.png" class="img-thumbnail"></div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
<!-- </div>--> |
||||
|
|
||||
|
<!-- FEATURES SECTION --> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" |
||||
|
id="features"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/features.png"/> |
||||
|
</div> |
||||
|
<h2 class="mt-2" |
||||
|
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
||||
|
Features |
||||
|
</h2> |
||||
|
</div> |
||||
|
<div class="row" |
||||
|
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
||||
|
<div class="col-sm-12 col-md-6"> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 40px; margin-bottom: 40px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Easily integrate more than 25 shipping companies with Shipstation.</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">One platform for all carriers</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can also import Packages</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Get Tracking number and obtain Tracking status.</span><br/> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">One Click integrates shipping rate with sale order.</span><br/> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Option to import Carriers</span><br/> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
You can import Services</span><br/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF FEATURES SECTION --> |
||||
|
|
||||
|
<!-- SCREENSHOTS SECTION --> |
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/pictures.png" /> |
||||
|
</div> |
||||
|
<h2 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> |
||||
|
Screenshots |
||||
|
</h2> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12"> |
||||
|
|
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Easily integrate more than 25 shipping companies with Shipstation.</h3> |
||||
|
<img src="assets/screenshots/brands.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
|
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Get Tracking number and obtain Tracking status.</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Automatically fetch tracking number and tracking status from shipstation when you open the record</p> |
||||
|
<img src="assets/screenshots/shipping_number&_shipping_status.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
|
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Option to import records from shipstation</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">You can simply import carrier, service, store and packages with one click</p> |
||||
|
<img src="assets/screenshots/grid.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Steps to setup account in Shipstation</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">1. Synchronize Store, Services, Delivery and Package operations.</p> |
||||
|
<img src="assets/screenshots/support_1.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">2. After the installation, you can configure the shipstation by adding the details such as name, URL, API and many more.</p> |
||||
|
<img src="assets/screenshots/support_2.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">3. Separate shipstation Services menu</p> |
||||
|
<img src="assets/screenshots/support_3.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">4. Dedicated shipstation Packages menu</p> |
||||
|
<img src="assets/screenshots/support_4.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">5. Get Shipping cost based on the shipping method</p> |
||||
|
<img src="assets/screenshots/support_5.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">6. Automatically shipstation status and Tracking Reference</p> |
||||
|
<img src="assets/screenshots/support_6.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">7. Get Shipping label.</p> |
||||
|
<img src="assets/screenshots/support_8.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">8. Purchase Product From Website.</p> |
||||
|
<img src="assets/screenshots/support_9.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
|
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">9. Get Rate of shipping From Shipstation.</p> |
||||
|
<img src="assets/screenshots/support_7.png" class="img-thumbnail"> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF SCREENSHOTS SECTION --> |
||||
|
|
||||
|
<!-- RELATED PRODUCTS --> |
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/categories.png" /> |
||||
|
</div> |
||||
|
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related |
||||
|
Products |
||||
|
</h2> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12"> |
||||
|
<div id="demo1" class="row carousel slide" data-ride="carousel"> |
||||
|
<!-- The slideshow --> |
||||
|
<div class="carousel-inner" style="padding: 30px;"> |
||||
|
<div class="carousel-item" style="min-height: 198.656px;"> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/" target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" style="border-radius: 0px;" |
||||
|
src="assets/modules/1.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" style="border-radius: 0px;" |
||||
|
src="assets/modules/2.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/" target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" style="border-radius: 0px;" |
||||
|
src="assets/modules/3.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="carousel-item active" style="min-height: 198.656px;"> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/" target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" style="border-radius: 0px;" |
||||
|
src="assets/modules/4.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/" target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" style="border-radius: 0px;" |
||||
|
src="assets/modules/5.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/" target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" style="border-radius: 0px;" |
||||
|
src="assets/modules/6.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Left and right controls --> |
||||
|
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span |
||||
|
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> |
||||
|
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000"> |
||||
|
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" |
||||
|
style="font-size:24px"></i></span> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF RELATED PRODUCTS --> |
||||
|
|
||||
|
<!-- OUR SERVICES --> |
||||
|
|
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/star.png" /> |
||||
|
</div> |
||||
|
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services |
||||
|
</h2> |
||||
|
</div> |
||||
|
|
||||
|
<div class="container my-5"> |
||||
|
<div class="row"> |
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Customization</h6> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Implementation</h6> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Support</h6> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Hire |
||||
|
Odoo |
||||
|
Developer</h6> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Integration</h6> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Migration</h6> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Consultancy</h6> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Implementation</h6> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
||||
|
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
||||
|
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
||||
|
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px"> |
||||
|
</div> |
||||
|
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
||||
|
Odoo |
||||
|
Licensing Consultancy</h6> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
<!-- END OF END OF OUR SERVICES --> |
||||
|
|
||||
|
<!-- OUR INDUSTRIES --> |
||||
|
|
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/corporate.png" /> |
||||
|
</div> |
||||
|
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our |
||||
|
Industries |
||||
|
</h2> |
||||
|
</div> |
||||
|
|
||||
|
<div class="container my-5"> |
||||
|
<div class="row"> |
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
Trading |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
Easily procure |
||||
|
and |
||||
|
sell your products</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
POS |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
Easy |
||||
|
configuration |
||||
|
and convivial experience</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
Education |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
A platform for |
||||
|
educational management</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" |
||||
|
width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
Manufacturing |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
Plan, track and |
||||
|
schedule your operations</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
E-commerce & Website |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
Mobile |
||||
|
friendly, |
||||
|
awe-inspiring product pages</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
Service Management |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
Keep track of |
||||
|
services and invoice</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
Restaurant |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
Run your bar or |
||||
|
restaurant methodically</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-lg-3"> |
||||
|
<div class="my-4 d-flex flex-column justify-content-center" |
||||
|
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
||||
|
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
||||
|
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
||||
|
Hotel Management |
||||
|
</h5> |
||||
|
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
||||
|
An |
||||
|
all-inclusive |
||||
|
hotel management application</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<!-- END OF END OF OUR INDUSTRIES --> |
||||
|
|
||||
|
<!-- SUPPORT --> |
||||
|
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
||||
|
<div class="d-flex justify-content-center align-items-center mr-2" |
||||
|
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
||||
|
<img src="assets/misc/customer-support.png" /> |
||||
|
</div> |
||||
|
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support |
||||
|
</h2> |
||||
|
</div> |
||||
|
<div class="container mt-5"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 col-md-6"> |
||||
|
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
||||
|
<div class="mr-4" |
||||
|
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
||||
|
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;" /> |
||||
|
</div> |
||||
|
<div> |
||||
|
<h4>Need Help?</h4> |
||||
|
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p> |
||||
|
<a href="mailto:odoo@cybrosys.com"> |
||||
|
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
||||
|
odoo@cybrosys.com</p> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-sm-12 col-md-6"> |
||||
|
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
||||
|
<div class="mr-4" |
||||
|
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
||||
|
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;" /> |
||||
|
</div> |
||||
|
<div> |
||||
|
<h4>WhatsApp</h4> |
||||
|
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p> |
||||
|
<a href="https://api.whatsapp.com/send?phone=918606827707"> |
||||
|
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068 |
||||
|
27707</p> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> |
||||
|
<img src="assets/misc/logo.png" width="144" height="31" |
||||
|
style="width:144px; height: 31px; margin-top: 40px;" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF SUPPORT --> |
@ -0,0 +1,56 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Api form view--> |
||||
|
<record id="shipstation_api_form" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.api.form</field> |
||||
|
<field name="model">shipstation.api</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
|
||||
|
<form string="Api credential"> |
||||
|
<header> |
||||
|
<button |
||||
|
name="get_carriers_service" |
||||
|
string="Get Carrier and services" |
||||
|
class="oe_highlight" |
||||
|
type="object"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="host"/> |
||||
|
<field name="username"/> |
||||
|
<field name="password"/> |
||||
|
<field name="activate" widget="toggle_button"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Api tree view--> |
||||
|
<record id="shipstation_api_tree" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.api.credential</field> |
||||
|
<field name="model">shipstation.api</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Shipstation Credential"> |
||||
|
<field name="host"/> |
||||
|
<field name="username"/> |
||||
|
<field name="password"/> |
||||
|
<field name="activate" widget="toggle_button"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_shipstation_api_form" model="ir.actions.act_window"> |
||||
|
<field name="name">Shipstation Credential</field> |
||||
|
<field name="res_model">shipstation.api</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="o_view_nocontent_smiling_face"> |
||||
|
Create Api credential |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,31 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
|
||||
|
<record id="view_delivery_carrier_provider_shipstation" model="ir.ui.view"> |
||||
|
<field name="name">delivery.carrier.form.provider.shipstaion</field> |
||||
|
<field name="model">delivery.carrier</field> |
||||
|
<field name="inherit_id" ref="delivery.view_delivery_carrier_form"/> |
||||
|
<field name="arch" type="xml" > |
||||
|
<xpath expr="//page[@name='destination']" position='before'> |
||||
|
<page string="Shipstation Configuration" |
||||
|
attrs="{'invisible': [('delivery_type', '!=', 'shipstation')]}"> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="store" |
||||
|
attrs="{'required': [('delivery_type', '=', 'shipstation')]}"/> |
||||
|
<field name="shipstation_carrier" |
||||
|
attrs="{'required': [('delivery_type', '=', 'shipstation')]}"/> |
||||
|
<field name="shipstation_service" |
||||
|
attrs="{'required': [('delivery_type', '=', 'shipstation')]}"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="shipstation_package" |
||||
|
attrs="{'required': [('delivery_type', '=', 'shipstation')]}"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</page> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
</odoo> |
@ -0,0 +1,55 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Store form view--> |
||||
|
<record id="shipstation_delivery_form" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.delivery.form</field> |
||||
|
<field name="model">shipstation.delivery</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
|
||||
|
<form string="Store Details" create="false" edit="false"> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
<field name="code"/> |
||||
|
<field name="account_number"/> |
||||
|
<field name="requires_funded_account"/> |
||||
|
<field name="balance"/> |
||||
|
<field name="nick_name"/> |
||||
|
<field name="shipping_providerid"/> |
||||
|
<field name="primary"/> |
||||
|
|
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- store tree view--> |
||||
|
<record id="shipstation_delivery_tree" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.delivery</field> |
||||
|
<field name="model">shipstation.delivery</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Shipstation Store" create="false"> |
||||
|
<field name="name"/> |
||||
|
<field name="code"/> |
||||
|
<field name="account_number"/> |
||||
|
<field name="primary"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_shipstation_delivery_form" |
||||
|
model="ir.actions.act_window"> |
||||
|
<field name="name">Shipstation Delivery</field> |
||||
|
<field name="res_model">shipstation.delivery</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="o_view_nocontent_smiling_face"> |
||||
|
Create Shipstation delivery |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,52 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Packages form view--> |
||||
|
<record id="shipstation_packages_form" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.packages.form</field> |
||||
|
<field name="model">shipstation.packages</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
|
||||
|
<form string="Packages Details" edit='false' create='false'> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="carrier_code"/> |
||||
|
<field name="code"/> |
||||
|
<field name="name"/> |
||||
|
<field name="domestic"/> |
||||
|
<field name="international"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Packages tree view--> |
||||
|
<record id="shipstation_packages_tree" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.packages.details</field> |
||||
|
<field name="model">shipstation.packages</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Shipstation Store" create="false"> |
||||
|
<field name="carrier_code"/> |
||||
|
<field name="code"/> |
||||
|
<field name="name"/> |
||||
|
<field name="domestic"/> |
||||
|
<field name="international"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_shipstation_packages_form" |
||||
|
model="ir.actions.act_window"> |
||||
|
<field name="name">Shipstation Packages</field> |
||||
|
<field name="res_model">shipstation.packages</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="o_view_nocontent_smiling_face"> |
||||
|
Create Shipstation packages |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,19 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Sale Orders form view--> |
||||
|
|
||||
|
<record id="action_shipstation_orders_form" |
||||
|
model="ir.actions.act_window"> |
||||
|
<field name="name">Shipstation Orders</field> |
||||
|
<field name="res_model">sale.order</field> |
||||
|
<field name="domain" >[('carrier_id.delivery_type', '=', 'shipstation')]</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="o_view_nocontent_smiling_face"> |
||||
|
Create Shipstation Orders |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,51 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Store form view--> |
||||
|
<record id="shipstation_service_form" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.service.form</field> |
||||
|
<field name="model">shipstation.service</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="service Details" create="false" edit="false"> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="carrier_code"/> |
||||
|
<field name="code"/> |
||||
|
<field name="name"/> |
||||
|
<field name="domestic"/> |
||||
|
<field name="international"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- store tree view--> |
||||
|
<record id="shipstation_service_tree" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.service.tree</field> |
||||
|
<field name="model">shipstation.service</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Shipstation Store" create="false"> |
||||
|
<field name="carrier_code"/> |
||||
|
<field name="code"/> |
||||
|
<field name="name"/> |
||||
|
<field name="domestic"/> |
||||
|
<field name="international"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_shipstation_services_form" |
||||
|
model="ir.actions.act_window"> |
||||
|
<field name="name">Shipstation Services</field> |
||||
|
<field name="res_model">shipstation.service</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="o_view_nocontent_smiling_face"> |
||||
|
Create Shipstation Store |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,21 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Shipstation api configuration--> |
||||
|
<menuitem id="menu_shipstaion_config" name="Shipstation Configuration" |
||||
|
parent="stock.menu_stock_config_settings" sequence="90"/> |
||||
|
<menuitem id="api_credential_action_menu" |
||||
|
parent="menu_shipstaion_config" |
||||
|
action="action_shipstation_api_form" sequence="1"/> |
||||
|
<menuitem id="shipstation_store" parent="menu_shipstaion_config" |
||||
|
action="action_shipstation_store_form" sequence="2"/> |
||||
|
<menuitem id="shipstation_service" parent="menu_shipstaion_config" |
||||
|
action="action_shipstation_services_form" sequence="3"/> |
||||
|
<menuitem id="shipstation_delivery" parent="menu_shipstaion_config" |
||||
|
action="action_shipstation_delivery_form" sequence="4"/> |
||||
|
<menuitem id="shipstation_packages" parent="menu_shipstaion_config" |
||||
|
action="action_shipstation_packages_form" sequence="5"/> |
||||
|
<menuitem id="shipstation_orders" parent="menu_shipstaion_config" |
||||
|
action="action_shipstation_orders_form" sequence="6"/> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,62 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
|
||||
|
<record id="stock_picking_add_fields" model="ir.ui.view"> |
||||
|
<field name="name">Add.stock.picking.form</field> |
||||
|
<field name="model">stock.picking</field> |
||||
|
<field name="inherit_id" ref="stock.view_picking_form"/> |
||||
|
<field name="priority" eval="8"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//form/header" position="inside"> |
||||
|
|
||||
|
<button |
||||
|
name="action_shipped_order" |
||||
|
string="Mark as Shipped" |
||||
|
class="oe_light" |
||||
|
sequance="50" |
||||
|
type="object" |
||||
|
attrs="{'invisible': ['|',('shipstation_order_id', '=', 0),('shipstation_shipping_status','in',['cancelled','shipped','on_hold'])]}" |
||||
|
/> |
||||
|
<button |
||||
|
name="action_restore_hold_order" |
||||
|
string="Restore Order" |
||||
|
class="oe_light" |
||||
|
sequance="50" |
||||
|
type="object" |
||||
|
attrs="{'invisible': [('shipstation_shipping_status','!=','on_hold')]}" |
||||
|
/> |
||||
|
|
||||
|
</xpath> |
||||
|
<xpath expr="//form/sheet/notebook/page[@name='extra']/group" |
||||
|
position="inside"> |
||||
|
<group name="shipstation_info"> |
||||
|
<group> |
||||
|
<field name="shipstation_order_id" invisible="True"/> |
||||
|
<field name="shipstation_shipping_status"/> |
||||
|
<field name="shipstation_shipping_orderKey" |
||||
|
invisible="1"/> |
||||
|
<field name="shipstation_shipping_cancel" |
||||
|
redonly="True" |
||||
|
invisible="1"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="shipstation_shipping_hold_date" |
||||
|
attrs="{'invisible': ['|',('shipstation_order_id', '=', 0),('shipstation_shipping_status','in',['cancelled','shipped','on_hold'])]}"/> |
||||
|
|
||||
|
<button |
||||
|
name="action_onhold_order" |
||||
|
string="Hold Order" |
||||
|
class="oe_highlight" |
||||
|
sequance="50" |
||||
|
type="object" |
||||
|
attrs="{'invisible': ['|',('shipstation_order_id', '=', 0),('shipstation_shipping_status','in',['cancelled','shipped','on_hold'])]}" |
||||
|
/> |
||||
|
</group> |
||||
|
</group> |
||||
|
|
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,58 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- Store form view--> |
||||
|
<record id="shipstation_store_form" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.store.form</field> |
||||
|
<field name="model">shipstation.store</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
|
||||
|
<form string="Store Details" create="false" edit="false"> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="store_id"/> |
||||
|
<field name="store_name"/> |
||||
|
<field name="marketplace_name"/> |
||||
|
<field name="email"/> |
||||
|
<field name="phone"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="account_number"/> |
||||
|
<field name="company_name"/> |
||||
|
<field name="website"/> |
||||
|
<field name="create_date"/> |
||||
|
<field name="modified_date"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- store tree view--> |
||||
|
<record id="shipstation_store_tree" model="ir.ui.view"> |
||||
|
<field name="name">shipstation.stores</field> |
||||
|
<field name="model">shipstation.store</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Shipstation Store" create="false"> |
||||
|
<field name="store_id"/> |
||||
|
<field name="store_name"/> |
||||
|
<field name="marketplace_name"/> |
||||
|
<field name="account_number"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_shipstation_store_form" |
||||
|
model="ir.actions.act_window"> |
||||
|
<field name="name">Shipstation Store</field> |
||||
|
<field name="res_model">shipstation.store</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="o_view_nocontent_smiling_face"> |
||||
|
Create Shipstation Store |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |