Zend certified PHP/Magento developer

Magento 2.4 Custom Field in Shipping Address Not Saving in database

I am trying to add a custom field in shipping information however the field is not stored in address_quote table where I have created the column. Can someone guide me through?

di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="MagentoCheckoutBlockCheckoutLayoutProcessor">
        <plugin name="address_type" type="DemoCustomAddressFieldPluginBlockCheckoutLayoutProcessor" sortOrder="100"/>
    </type>
    <type name="MagentoCheckoutModelShippingInformationManagement">
        <plugin name="save_to_quote_table" type="DemoCustomAddressFieldPluginCheckoutModelShippingInformationManagement" sortOrder="10" />
    </type>
</config>

extension_attributes.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="MagentoQuoteApiDataAddressInterface">
        <attribute code="address_location_type" type="string" />
    </extension_attributes>
    <extension_attributes for="MagentoSalesApiDataOrderAddressInterface">
        <attribute code="address_location_type" type="string" />
    </extension_attributes>
    <extension_attributes for="MagentoCustomerApiDataAddressInterfacee">
        <attribute code="address_location_type" type="string" />
    </extension_attributes>
    <extension_attributes for="MagentoCheckoutApiDataShippingInformationInterface">
        <attribute code="address_location_type" type="string" />
    </extension_attributes>
</config>

fieldset.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:DataObject/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="sales_convert_quote_address">
            <field name="address_location_type">
                <aspect name="to_order_address" />
                <aspect name="to_customer_address" />
            </field>
        </fieldset>
    </scope>
</config>

DemoCustomAddressFieldPluginBlockCheckoutLayoutProcessor.php

<?php

namespace DemoCustomAddressFieldPluginBlockCheckout;

use MagentoCheckoutBlockCheckoutLayoutProcessor as CheckoutLayoutProcessor;

class LayoutProcessor{
    
    public function afterProcess(CheckoutLayoutProcessor $subject, array $jsLayout)
    {

        $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
        ['shippingAddress']['children']['shipping-address-fieldset']['children']['address_location_type'] = [
            'component' => 'Magento_Ui/js/form/element/select',
            'config' => [
                'customScope' => 'shippingAddress.custom_attributes',
                'template' => 'ui/form/field',
                'elementTmpl' => 'ui/form/element/select',
                'id' => 'address_location_type',
                'tooltip' => [
                    'description' => 'Select the type of address',
                ],
            ],
            'dataScope' => 'shippingAddress.custom_attributes.address_location_type',
            'value' => "Please Select Address Type",
            'options' =>  [
                '1' => [
                    'value' => 'home',
                    'label' => 'Home'
                ],
                '2' => [
                    'value' => 'office',
                    'label' => 'Office'
                ]
            ],
            'label' => 'Address Type',
            'provider' => 'checkoutProvider',
            'visible' => true,
            'validation' => [
                'required-entry' => false
            ],
            'sortOrder' => 252,
            'id' => 'address_location_type'
        ];
        return $jsLayout;
    }

}

DemoCustomAddressFieldPluginCheckoutModelShippingInformationManagement.php

<?php

namespace DemoCustomAddressFieldPluginCheckoutModel;

use MagentoQuoteModelQuoteRepository;
use PsrLogLoggerInterface;

class ShippingInformationManagement{
    
    protected $quoteRepository;
    protected $logger;

    public function __construct(QuoteRepository $quoteRepository,  LoggerInterface $logger) {
        $this->quoteRepository = $quoteRepository;
        $this->logger = $logger;
    }

    public function beforeSaveAddressInformation(
        MagentoCheckoutModelShippingInformationManagement $subject,
        $cartId,
        MagentoCheckoutApiDataShippingInformationInterface $addressInformation
    ) {
        if(!$extAttributes = $addressInformation->getExtensionAttributes())
        {
            return;
        }

        $quote = $this->quoteRepository->getActive($cartId);

        $quote->setAddressLocationType($extAttributes->getAddressLocationType());
    }
}

UpgradeSchema.php

<?php

namespace DemoCustomAddressFieldSetup;

use MagentoFrameworkSetupUpgradeSchemaInterface;
use MagentoFrameworkSetupModuleContextInterface;
use MagentoFrameworkSetupSchemaSetupInterface;
use MagentoFrameworkDBDdlTable;

class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        if(version_compare($context->getVersion(), '1.0.0', '<')){
            $connection = $setup->getConnection();

            $connection->addColumn(
                $setup->getTable('quote_address'),
                'address_location_type',
                [
                    'type' => Table::TYPE_TEXT,
                    'length' => 255,
                    'nullable' => true,
                    'default' => '',
                    'comment' => 'Address Location Type'
                ]
            );
            
            $connection->addColumn(
                $setup->getTable('sales_order_address'),
                'address_location_type',
                [
                    'type' => Table::TYPE_TEXT,
                    'length' => 255,
                    'nullable' => true,
                    'default' => '',
                    'comment' => 'Address Location Type'
                ]
            );
        }
        
        $setup->endSetup();
    }
}

view/frontend/web/js/set-shipping-information-mixin.js

/*jshint browser:true jquery:true*/
/*global alert*/
define([
    'jquery',
    'mage/utils/wrapper',
    'Magento_Checkout/js/model/quote'
], function ($, wrapper, quote) {
    'use strict';

    return function (setShippingInformationAction) {

        return wrapper.wrap(setShippingInformationAction, function (originalAction) {
            var shippingAddress = quote.shippingAddress();
            if (shippingAddress['extension_attributes'] === undefined) {
                shippingAddress['extension_attributes'] = {};
            }

            var attribute = shippingAddress.customAttributes.find(
                function (element) {
                    return element.attribute_code === 'address_location_type';
                }
            );
            
            shippingAddress['extension_attributes']['address_location_type'] = attribute.value;
            // pass execution to original action ('Magento_Checkout/js/action/set-shipping-information')
            return originalAction();
        });
    };
});

payload-extender-mixin.js

define([
    'jquery',
    'mage/utils/wrapper'
], function (
    jQuery,
    wrapper
) {
    'use strict';

    return function (processor) {
        return wrapper.wrap(processor, function (proceed, payload) {
            payload = proceed(payload);

            var shippingAddress =  payload.addressInformation.shipping_address;
            var addressLocationType = jQuery('[name="custom_attributes[address_location_type]"]').val();

            if(addressLocationType == "" || addressLocationType == null){
                if(shippingAddress.customAttributes == "undefined" || shippingAddress.customAttributes == null){
                    addressLocationType = null;
                } else {
                    if(shippingAddress.customAttributes.address_location_type == "undefined" || shippingAddress.customAttributes.address_location_type == null) {
                        addressLocationType = null;
                    } else {
                        addressLocationType = shippingAddress.customAttributes.address_location_type.value;
                    }
                }
            }

            console.log(addressLocationType);

            var goneExtentionAttributes = {
                'address_location_type': addressLocationType
            };
    
            payload.addressInformation.extension_attributes = _.extend(
                payload.addressInformation.extension_attributes,
                goneExtentionAttributes
            );

            return payload;
        });
    };
});

requirejs-config.js

var config = {
    config: {
        mixins: {
            'Magento_Checkout/js/action/set-shipping-information': {
                'Demo_CustomAddressField/js/action/set-shipping-information-mixin': true
            },
            'Magento_Checkout/js/model/shipping-save-processor/payload-extender': {
                'Demo_CustomAddressField/js/model/shipping-save-processor/payload-extender-mixin': true
            }
        }
    }
};

The field is rendered at checkout and the values are flowing well. However, the value is not stored in quote_address table. It stores NULL over there. Can someone guide me what I am doing wrong?