diff --git a/tailbone_corepos/templates/corepos-util.mako b/tailbone_corepos/templates/corepos-util.mako
new file mode 100644
index 0000000..b258751
--- /dev/null
+++ b/tailbone_corepos/templates/corepos-util.mako
@@ -0,0 +1,18 @@
+## -*- coding: utf-8; -*-
+
+<%def name="render_xref_helper()">
+
+
Cross-Reference
+
+
+ View in CORE Office
+
+
+
+%def>
diff --git a/tailbone_corepos/templates/products/view.mako b/tailbone_corepos/templates/products/view.mako
new file mode 100644
index 0000000..3cae920
--- /dev/null
+++ b/tailbone_corepos/templates/products/view.mako
@@ -0,0 +1,11 @@
+## -*- coding: utf-8; -*-
+<%inherit file="tailbone:templates/products/view.mako" />
+<%namespace file="/corepos-util.mako" import="render_xref_helper" />
+
+<%def name="object_helpers()">
+ ${parent.object_helpers()}
+ ${render_xref_helper()}
+%def>
+
+
+${parent.body()}
diff --git a/tailbone_corepos/templates/vendors/view.mako b/tailbone_corepos/templates/vendors/view.mako
new file mode 100644
index 0000000..1602fb1
--- /dev/null
+++ b/tailbone_corepos/templates/vendors/view.mako
@@ -0,0 +1,11 @@
+## -*- coding: utf-8; -*-
+<%inherit file="/master/view.mako" />
+<%namespace file="/corepos-util.mako" import="render_xref_helper" />
+
+<%def name="object_helpers()">
+ ${parent.object_helpers()}
+ ${render_xref_helper()}
+%def>
+
+
+${parent.body()}
diff --git a/tailbone_corepos/views/products.py b/tailbone_corepos/views/products.py
new file mode 100644
index 0000000..a3a40a8
--- /dev/null
+++ b/tailbone_corepos/views/products.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8; -*-
+################################################################################
+#
+# Rattail -- Retail Software Framework
+# Copyright © 2010-2020 Lance Edgar
+#
+# This file is part of Rattail.
+#
+# Rattail is free software: you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Rattail. If not, see .
+#
+################################################################################
+"""
+Product Views
+"""
+
+from rattail_corepos.config import core_office_url
+
+from tailbone.views import products as base
+
+
+class ProductView(base.ProductsView):
+ """
+ Master view for the Product class.
+ """
+
+ def template_kwargs_view(self, **kwargs):
+ """
+ Supplements the default logic as follows:
+
+ Adds the URL for viewing the product within CORE Office, or else the
+ reason for lack of such a URL.
+ """
+ kwargs = super(ProductView, self).template_kwargs_view(**kwargs)
+ product = kwargs['instance']
+
+ # CORE Office URL
+ kwargs['core_office_url'] = None
+ office_url = core_office_url(self.rattail_config)
+ if not office_url:
+ kwargs['core_office_why_no_url'] = "CORE Office URL is not configured"
+ else:
+ kwargs['core_office_url'] = '{}/item/ItemEditorPage.php?searchupc={}'.format(
+ office_url, product.item_id)
+
+ return kwargs
diff --git a/tailbone_corepos/views/vendors.py b/tailbone_corepos/views/vendors.py
index d75ad5a..ea28dc7 100644
--- a/tailbone_corepos/views/vendors.py
+++ b/tailbone_corepos/views/vendors.py
@@ -1,8 +1,30 @@
# -*- coding: utf-8; -*-
+################################################################################
+#
+# Rattail -- Retail Software Framework
+# Copyright © 2010-2019 Lance Edgar
+#
+# This file is part of Rattail.
+#
+# Rattail is free software: you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Rattail. If not, see .
+#
+################################################################################
"""
Vendor views
"""
+from rattail_corepos.config import core_office_url
from rattail_corepos.corepos.util import get_max_existing_vendor_id
from tailbone.views import vendors as base
@@ -56,3 +78,30 @@ class VendorView(base.VendorsView):
vendor.special_discount = 0
return vendor
+
+ def template_kwargs_view(self, **kwargs):
+ """
+ Supplements the default logic as follows:
+
+ Adds the URL for viewing the vendor within CORE Office, or else the
+ reason for lack of such a URL.
+ """
+ # invoke default/parent logic, if it exists
+ parent = super(VendorView, self)
+ if hasattr(parent, 'template_kwargs_view'):
+ kwargs = parent.template_kwargs_view(**kwargs)
+
+ vendor = kwargs['instance']
+
+ # CORE Office URL
+ kwargs['core_office_url'] = None
+ office_url = core_office_url(self.rattail_config)
+ if not office_url:
+ kwargs['core_office_why_no_url'] = "CORE Office URL is not configured"
+ elif not vendor.corepos_id:
+ kwargs['core_office_why_no_url'] = "Vendor has no CORE-POS ID"
+ else:
+ kwargs['core_office_url'] = '{}/item/vendors/VendorIndexPage.php?vid={}'.format(
+ office_url, vendor.corepos_id)
+
+ return kwargs