Initial commit

This commit is contained in:
shopkeeperdev
2025-10-07 18:31:07 -04:00
commit 20786161b7
11 changed files with 272 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

View File

@@ -0,0 +1,57 @@
<?php
namespace Shopkeeper\VendorNotes\Block\Adminhtml\Order\View;
use Magento\Backend\Block\Template;
use Magento\Sales\Model\Order;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;
class VendorNotes extends Template
{
protected $_order;
protected $_scopeConfig;
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Sales\Model\Order $order,
ScopeConfigInterface $scopeConfig,
array $data = []
) {
$this->_order = $order;
$this->_scopeConfig = $scopeConfig;
parent::__construct($context, $data);
}
public function getOrder()
{
return $this->_order->load($this->getRequest()->getParam('order_id'));
}
public function getVendorNotes()
{
$order = $this->getOrder();
$notes = [];
$vendorConfigPaths = [
'Thermo Fisher' => 'vendor_notes/general/thermo_fisher_note',
'Orion' => 'vendor_notes/general/orion_note',
'Nalgene' => 'vendor_notes/general/nalgene_note',
'Thermo Fisher Parts' => 'vendor_notes/general/thermo_fisher_parts_note'
];
foreach ($order->getAllItems() as $item) {
$product = $item->getProduct();
$vendorId = $product->getData('vendor');
if ($vendorId) {
$vendorLabel = $product->getAttributeText('vendor');
if (isset($vendorConfigPaths[$vendorLabel])) {
$note = $this->_scopeConfig->getValue($vendorConfigPaths[$vendorLabel], ScopeInterface::SCOPE_STORE);
if ($note && !in_array($note, $notes)) {
$notes[] = $note;
}
}
}
}
return $notes;
}
}

74
Setup/InstallData.php Normal file
View File

@@ -0,0 +1,74 @@
<?php
namespace Shopkeeper\VendorNotes\Setup;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Catalog\Model\Product;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory as AttributeSetCollectionFactory;
class InstallData implements InstallDataInterface
{
private $eavSetupFactory;
private $attributeSetCollectionFactory;
private $attributeSetFactory;
public function __construct(
EavSetupFactory $eavSetupFactory,
AttributeSetCollectionFactory $attributeSetCollectionFactory,
AttributeSetFactory $attributeSetFactory
) {
$this->eavSetupFactory = $eavSetupFactory;
$this->attributeSetCollectionFactory = $attributeSetCollectionFactory;
$this->attributeSetFactory = $attributeSetFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
// Create the attribute
$eavSetup->addAttribute(
Product::ENTITY,
'vendor',
[
'type' => 'int',
'label' => 'Vendor',
'input' => 'select',
'source' => \Magento\Eav\Model\Entity\Attribute\Source\Table::class,
'required' => false,
'sort_order' => 50,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
'group' => 'General',
'used_in_product_listing' => true,
'visible_on_front' => false,
'option' => [
'values' => [
'Thermo Fisher',
'Orion',
'Nalgene',
'Thermo Fisher Parts'
]
]
]
);
// Assign the attribute to all existing attribute sets
$attributeId = $eavSetup->getAttributeId(Product::ENTITY, 'vendor');
$entityTypeId = $eavSetup->getEntityTypeId(Product::ENTITY);
$attributeSetCollection = $this->attributeSetCollectionFactory->create();
$attributeSetCollection->addFieldToFilter('entity_type_id', $entityTypeId);
foreach ($attributeSetCollection as $attributeSet) {
$groupId = $eavSetup->getAttributeGroupId($entityTypeId, $attributeSet->getId(), 'General');
$eavSetup->addAttributeToGroup($entityTypeId, $attributeSet->getId(), $groupId, $attributeId, null);
}
$setup->endSetup();
}
}

16
etc/acl.xml Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<resource id="Shopkeeper_VendorNotes::config_vendor_notes" title="Vendor Notes" sortOrder="50" />
</resource>
</resource>
</resource>
</resource>
</resources>
</acl>
</config>

48
etc/adminhtml/system.xml Normal file
View File

@@ -0,0 +1,48 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<tab id="shopkeeper" translate="label" sortOrder="999">
<label>Shopkeeper</label>
</tab>
<section id="vendor_notes" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Vendor Notes</label>
<tab>shopkeeper</tab>
<resource>Shopkeeper_VendorNotes::config_vendor_notes</resource>
<group id="general" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>General</label>
<comment><![CDATA[
<div style="padding: 10px; background: #f0f0f0; border-left: 3px solid #1979c3; margin-bottom: 20px;">
<strong>How to use Vendor Notes:</strong>
<ul style="margin: 10px 0; padding-left: 20px;">
<li>These notes will automatically appear on order pages when products with the corresponding vendor are in the order.</li>
<li>You can use HTML formatting: <code>&lt;br&gt;</code> for line breaks, <code>&lt;a href="mailto:email@example.com"&gt;link text&lt;/a&gt;</code> for email links.</li>
<li>Leave a field blank if you don't need notes for that vendor.</li>
</ul>
<strong>Need to add a new vendor?</strong>
<ol style="margin: 10px 0; padding-left: 20px;">
<li>Go to <strong>Stores > Attributes > Product</strong> and edit the <strong>Vendor</strong> attribute (attribute code: <code>vendor</code>)</li>
<li>Add your new vendor option in the <strong>Manage Options</strong> section</li>
<li>Contact your developer to add the configuration field for the new vendor note</li>
</ol>
</div>
]]></comment>
<field id="thermo_fisher_note" translate="label" type="textarea" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Thermo Fisher Note</label>
<comment>Enter notes here. Supports HTML for links and emails (e.g., &lt;a href="mailto:support@thermofisher.com"&gt;support@thermofisher.com&lt;/a&gt;).</comment>
</field>
<field id="orion_note" translate="label" type="textarea" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Orion Note</label>
<comment>Enter notes here. Supports HTML for links and emails.</comment>
</field>
<field id="nalgene_note" translate="label" type="textarea" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Nalgene Note</label>
<comment>Enter notes here. Supports HTML for links and emails.</comment>
</field>
<field id="thermo_fisher_parts_note" translate="label" type="textarea" sortOrder="40" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Thermo Fisher Parts Note</label>
<comment>Enter notes here. Supports HTML for links and emails.</comment>
</field>
</group>
</section>
</system>
</config>

13
etc/config.xml Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<vendor_notes>
<general>
<thermo_fisher_note>Example multi-line note for Thermo Fisher.&lt;br&gt;Contact: &lt;a href="mailto:support@thermofisher.com"&gt;support@thermofisher.com&lt;/a&gt;&lt;br&gt;More info: &lt;a href="https://thermofisher.com/support"&gt;Support Page&lt;/a&gt;</thermo_fisher_note>
<orion_note>Example note for Orion.&lt;br&gt;Email: &lt;a href="mailto:info@orion.com"&gt;info@orion.com&lt;/a&gt;</orion_note>
<nalgene_note>Example note for Nalgene.&lt;br&gt;Link: &lt;a href="https://nalgene.com/help"&gt;Help Center&lt;/a&gt;</nalgene_note>
<thermo_fisher_parts_note>Example note for Thermo Fisher Parts.&lt;br&gt;Support: &lt;a href="mailto:parts@thermofisher.com"&gt;parts@thermofisher.com&lt;/a&gt;</thermo_fisher_parts_note>
</general>
</vendor_notes>
</default>
</config>

4
etc/module.xml Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Shopkeeper_VendorNotes" setup_version="1.0.0"/>
</config>

6
registration.php Normal file
View File

@@ -0,0 +1,6 @@
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Shopkeeper_VendorNotes',
__DIR__
);

View File

@@ -0,0 +1,8 @@
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="order_additional_info">
<block class="Shopkeeper\VendorNotes\Block\Adminhtml\Order\View\VendorNotes" name="vendor_notes" template="Shopkeeper_VendorNotes::order/view/vendor_notes.phtml" />
</referenceBlock>
</body>
</page>

View File

@@ -0,0 +1,28 @@
<?php
/** @var \Shopkeeper\VendorNotes\Block\Adminhtml\Order\View\VendorNotes $block */
$notes = $block->getVendorNotes();
?>
<?php if (!empty($notes)): ?>
<section class="admin__page-section">
<div class="admin__page-section-title">
<span class="title"><?php echo __('Vendor Notes'); ?></span>
</div>
<div class="admin__page-section-content">
<div class="admin__page-section-item order-information">
<?php foreach ($notes as $index => $note): ?>
<div class="admin__page-section-item-content">
<div class="admin__page-section-item-title">
<span class="title"><?php echo __('Vendor Note %1', $index + 1); ?></span>
</div>
<div class="vendor-note-content" style="padding: 10px 0; line-height: 1.6;">
<?php echo $note; // Output as HTML for links and multi-lines ?>
</div>
</div>
<?php if ($index < count($notes) - 1): ?>
<div style="border-top: 1px solid #e3e3e3; margin: 15px 0;"></div>
<?php endif; ?>
<?php endforeach; ?>
</div>
</div>
</section>
<?php endif; ?>

View File

@@ -0,0 +1,16 @@
<?php
/** @var \Shopkeeper\VendorNotes\Block\Adminhtml\Order\View\VendorNotes $block */
$notes = $block->getVendorNotes();
?>
<?php if (!empty($notes)): ?>
<div class="admin__field">
<label class="label"><?php echo __('Vendor Notes'); ?>:</label>
<div class="control">
<ul>
<?php foreach ($notes as $note): ?>
<?php echo $note; // Output as HTML for links and multi-lines ?>
<?php endforeach; ?>
</ul>
</div>
</div>
<?php endif; ?>