@ -1,42 +0,0 @@ |
|||||
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>`__ |
|
||||
|
|
@ -1,23 +0,0 @@ |
|||||
# -*- 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 |
|
@ -1,53 +0,0 @@ |
|||||
# -*- 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, |
|
||||
} |
|
@ -1,7 +0,0 @@ |
|||||
## Module <shipstation_odoo_connector> |
|
||||
|
|
||||
#### 04.11.2022 |
|
||||
#### Version 15.0.1.0.0 |
|
||||
##### ADD |
|
||||
|
|
||||
- Initial Commit for shipstation_odoo_connector |
|
@ -1,28 +0,0 @@ |
|||||
# -*- 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 |
|
@ -1,38 +0,0 @@ |
|||||
# -*- 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") |
|
@ -1,34 +0,0 @@ |
|||||
# -*- 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) |
|
@ -1,39 +0,0 @@ |
|||||
# -*- 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") |
|
@ -1,439 +0,0 @@ |
|||||
# -*- 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) |
|
@ -1,224 +0,0 @@ |
|||||
# -*- 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) |
|
@ -1,40 +0,0 @@ |
|||||
# -*- 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") |
|
|
@ -1,12 +0,0 @@ |
|||||
<?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> |
|
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 576 B |
Before Width: | Height: | Size: 733 B |
Before Width: | Height: | Size: 911 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 673 B |
Before Width: | Height: | Size: 878 B |
Before Width: | Height: | Size: 653 B |
Before Width: | Height: | Size: 905 B |
Before Width: | Height: | Size: 839 B |
Before Width: | Height: | Size: 427 B |
Before Width: | Height: | Size: 627 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 988 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 589 B |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 967 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 435 KiB |
Before Width: | Height: | Size: 564 KiB |
Before Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 159 KiB |
Before Width: | Height: | Size: 121 KiB |
Before Width: | Height: | Size: 159 KiB |
Before Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 17 KiB |
@ -1,669 +0,0 @@ |
|||||
<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 --> |
|
@ -1,56 +0,0 @@ |
|||||
<?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> |
|
@ -1,31 +0,0 @@ |
|||||
<?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> |
|
@ -1,55 +0,0 @@ |
|||||
<?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> |
|
@ -1,52 +0,0 @@ |
|||||
<?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> |
|
@ -1,19 +0,0 @@ |
|||||
<?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> |
|
@ -1,51 +0,0 @@ |
|||||
<?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> |
|
@ -1,21 +0,0 @@ |
|||||
<?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> |
|
@ -1,62 +0,0 @@ |
|||||
<?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> |
|
@ -1,58 +0,0 @@ |
|||||
<?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> |
|