menu

SiteGenesis / Server-side JS / Source: app_storefront_controllers/cartridge/scripts/models/TransientAddressModel.js

'use strict';

/**
 * Model for transient address information.
 * @module models/TransientAddressModel */
var Class = require('~/cartridge/scripts/util/Class').Class;
var CustomerAddress = require('dw/customer/CustomerAddress');

/*
 * All system address fields
 * @type {Array}
 */
var ADDRESS_FIELDS = require('~/cartridge/scripts/config').address.fields;

/*
 * Internal helper to copy all address fields from "from" to "to".
 * @param  {Object} from The object providing the address fields to copy.
 * @param  {Object} to   The object the fields are copied to.
 */
function copyFields(from, to) {
    // Copies system fields.
    ADDRESS_FIELDS.forEach(function (fieldName) {
        to[fieldName] = from[fieldName];
    });
    // Copies custom fields.
    if ('custom' in from && 'custom' in to) {
        for (var i in from.custom) {
            to.custom[i] = from.custom[i];
        }
    }
}

/**
 * Transient representation of an address.
 *
 * @class module:models/TransientAddressModel~TransientAddressModel
 * @extends module:util/Class
 */
var TransientAddressModel = Class.extend({
    UUID: null,
    ID: null,
    firstName: null,
    lastName: null,
    address1: null,
    address2: null,
    city: null,
    postalCode: null,
    stateCode: null,
    countryCode: null,
    phone: null,
    custom: {},

    /**
     * The UUID of the reference address. It is set when the attributes
     * are copied from a given customer or order address and is used
     * to preselect addresses on a per product line item base.
     */
    referenceAddressUUID: null,

    /**
     * Copies the attributes of this address to the given order address.
     */
    copyTo: function (toAddress) {
        copyFields(this, toAddress);
    },

    /**
     * Copies the attributes of a store's address to the given order address.
     */
    storeAddressTo: function (toAddress, storeObject) {
        toAddress.setFirstName('');
        toAddress.setLastName(storeObject.name);
        toAddress.setAddress1(storeObject.address1);
        toAddress.setAddress2(storeObject.address2);
        toAddress.setCity(storeObject.city);
        toAddress.setPostalCode(storeObject.postalCode);
        toAddress.setStateCode(storeObject.stateCode);
        toAddress.setCountryCode(storeObject.custom.countryCodeValue);
        toAddress.setPhone(storeObject.phone);
    },

    /**
     * Copies the attributes from the given customer address or
     * order address to this address. The function supports both
     * copying from CustomerAddress and from OrderAddress.
     */
    copyFrom: function (fromAddress) {
        // Sets the address ID if copying from a customer address.
        if (fromAddress instanceof CustomerAddress) {
            this.ID = fromAddress.ID;
        }

        copyFields(fromAddress, this);

        if (fromAddress.countryCode.value !== null && typeof fromAddress.countryCode.value !== 'undefined') {
            this.countryCode = fromAddress.countryCode.value;
        } else {
            this.countryCode = fromAddress.countryCode;
        }

        // Sets the address ID and UUID, if copying from a customer address.
        if (('ID' in fromAddress) && (fromAddress instanceof CustomerAddress || (fromAddress.ID !== null && fromAddress.UUID !== null))) {
            this.ID = fromAddress.ID;
            this.referenceAddressUUID = fromAddress.UUID;
        }

        if ('referenceAddressUUID' in fromAddress && fromAddress.referenceAddressUUID !== null) {
            this.referenceAddressUUID = fromAddress.referenceAddressUUID;
        }
    },

    /**
     * Checks if the address already exists in an array of addresses
     * for multishipping checkout.
     */
    addressExists: function (addresses) {

        for (var i = 0; i < addresses.length; i++) {
            var address = addresses[i];
            if (this.referenceAddressUUID !== null && (address.referenceAddressUUID !== null)) {
                if (this.referenceAddressUUID.equals(address.referenceAddressUUID)) {
                    return true;
                }
            } else {
                if (this.equals(address)) {
                    return true;
                }
            }
        }
    },

    /**
     * Returns true if the relevant fields of the addresses are all equal.
     * @param  {Object} address - The address to compare the transient address to
     * @return {boolean} true if both addresses are equal, false otherwise.
     */
    equals: function (address) {
        var that = this;
        return ADDRESS_FIELDS.every(function (fieldName) {
            return that[fieldName] === address[fieldName];
        });
    }
});

/** The TransientAddress class */
module.exports = TransientAddressModel;

X Privacy Update: We use cookies to make interactions with our websites and services easy and meaningful, to better understand how they are used. By continuing to use this site you are giving us your consent to do this. Privacy Policy.