--upgrade scripts from nopCommerce 3.80 to 3.90
--new locale resources
declare @resources xml
--a resource will be deleted if its value is empty
set @resources='
You haven''t written any reviews yet
Force entering email twice during registration.
Sets a maximum number of products per vendor.
Shipping methods used by offline shipping rate computation methods (e.g. "Fixed Rate Shipping" or "Shipping by weight").
The price of the product. You can manage currency by selecting Configuration > Currencies.
Choose customer roles of this user.
Check if products should be exported/imported with product attributes.
Check to display "ship to the same address" option during checkout ("billing address" step). In this case "shipping address" with appropriate options (e.g. pick up in store) will be skipped. Also note that all billing countries should support shipping ("Allow shipping" checkbox ticked).
Task period should not exceed 24 days.
Payment restrictions
Choose a vendor associated with this product. This can be useful when running a multi-vendor store to keep track of goods associated with vendor.
You can download a CSV file with a list of states for other countries on the following page:
Enter tags ...
[None]
Hide shipping total if shipping is not required
Check if you want to hide ''Shipping total'' label when shipping is not required.
Client ID
Specify client ID.
Client secret
Specify secret key.
Webhook ID
Specify webhook ID.
Get webhook ID
Webhook was not created (see details in the log)
[None]
Default tax category
Select default tax category for products.
Added a new address attribute (ID = {0})
Added a new address attribute value (ID = {0})
Added a new affiliate (ID = {0})
Added a new blog post (ID = {0})
Added a new campaign (ID = {0})
Added a new country (ID = {0})
Added a new currency (ID = {0})
Added a new customer attribute (ID = {0})
Added a new customer attribute value (ID = {0})
Added a new email account (ID = {0})
Added a new language (ID = {0})
Added a new measure dimension (ID = {0})
Added a new measure weight (ID = {0})
Added a new news (ID = {0})
Installed a new plugin (FriendlyName: ''{0}'')
Added a new state province (ID = {0})
Added a new store (ID = {0})
Added a new vendor (ID = {0})
Added a new warehouse (ID = {0})
Deleted an address attribute (ID = {0})
Deleted an address attribute value (ID = {0})
Deleted an affiliate (ID = {0})
Deleted a blog post (ID = {0})
Deleted a blog post comment (ID = {0})
Deleted a campaign (ID = {0})
Deleted a country (ID = {0})
Deleted a currency (ID = {0})
Deleted a customer attribute (ID = {0})
Deleted a customer attribute value (ID = {0})
Deleted an email account (ID = {0})
Deleted a language (ID = {0})
Deleted a measure dimension (ID = {0})
Deleted a measure weight (ID = {0})
Deleted a message template (ID = {0})
Deleted a news (ID = {0})
Deleted a news comment (ID = {0})
Uninstalled a plugin (FriendlyName: ''{0}'')
Deleted a product revie (ID = {0})
Deleted a state or province (ID = {0})
Deleted a store (ID = {0})
Deleted a vendor (ID = {0})
Deleted a warehouse (ID = {0})
Edited an address attribute (ID = {0})
Edited an address attribute value (ID = {0})
Edited an affiliate (ID = {0})
Edited a blog post (ID = {0})
Edited a campaign (ID = {0})
Edited a country (ID = {0})
Edited a currency (ID = {0})
Edited a customer attribute (ID = {0})
Edited a customer attribute value (ID = {0})
Edited an email account (ID = {0})
Edited a language (ID = {0})
Edited a measure dimension (ID = {0})
Edited a measure weight (ID = {0})
Edited a message template (ID = {0})
Edited a news (ID = {0})
Edited a plugin (FriendlyName: ''{0}'')
Edited a product revie (ID = {0})
Edited a state or province (ID = {0})
Edited a store (ID = {0})
Edited a task (ID = {0})
Edited a vendor (ID = {0})
Edited a warehouse (ID = {0})
Product review possible only after purchasing product
Check if product can be reviewed only by customer who have already ordered it.
Product can be reviewed only after purchasing it
You can use ECB (European central bank) exchange rate provider only when the primary exchange rate currency is supported by ECB
Attached static file
The attached static file that will be sent in this email.
Contract ID
Specify contract identifier.
Product review possible only after product purchasing
Page size should have a positive value.
Page size should have a positive value.
Page size should have a positive value.
Enter tags ...
Show SKU on catalog pages
Check to show product SKU on catalog pages in public store.
Show SKU on product details page
Check to show product SKU on the product details page in public store.
Customer enters quantity
Allow customers enter the quantity of associated product.
- quantity {0}
{0} [{1}{2}]
per item
Enter quantity:
Email account
The email account that will be used to send this campaign.
Limited to customer roles
Choose one or several customer roles i.e. administrators, vendors, guests, who will be able to use this plugin. If you don''t need this option just leave this field empty.
Activate points immediately
Activates bonus points immediately after their calculation
Reward points activation
Specify how many days (hours) must elapse before earned points become active. Points earned by purchase cannot be redeemed until activated. For example, you may set the days before the points become available to 7. In this case, the points earned will be available for spending only 7 days after the purchase.
The points will be activated on {0}
Days
Hours
The points will be activated on {0}
At least one published currency is required
The customer cannot be in both ''Guests'' and ''Registered'' customer roles
Add the customer to ''Guests'' or ''Registered'' customer role
Valid Email is required for customer to be in ''Registered'' role
A non-admin user cannot impersonate as an administrator
At least one published language is required
This order item has an associated gift card record. Please delete it first
Order item is deleted
Captcha is enabled but the appropriate keys are not entered
The message template has been copied successfully
The product has been copied successfully
Entered page name already exists, so it will be replaced by ''{0}''
Choose a delivery date which will be displayed in the public store. You can manage delivery dates by selecting Configuration > Shipping > Dates and ranges.
Product availability range
Choose the product availability range that indicates when the product is expected to be available when out of stock (e.g. Available in 10-14 days). You can manage availability ranges by selecting Configuration > Shipping > Dates and ranges.
None
Product availability range
Dates and ranges
List of delivery dates which will be available on the product details page.
Product availability ranges
The new product availability range has been added successfully.
Add a new product availability range
back to product availability range list
The product availability range has been deleted successfully.
Edit product availability range details
Display order
The display order of this product availability range. 1 represents the top of the list.
Name
Enter product availability range name.
Please provide a name.
List of availability range options which will be available in product details.
The product availability range has been updated successfully.
Available in {0}
Out of stock - on backorder and will be dispatched once in stock ({0}).
Available in {0}
Pay by cheque or money order
Pay by credit / debit card
Pay by credit / debit card
You will be redirected to PayPal site to complete the payment
Pay by purchase order (PO) number
Your account already has been activated
Your password already has been changed. For changing it once more, you need to again recover the password.
Your subscription already has been deactivated.
By Weight
Fixed Rate
Rate
Store
If an asterisk is selected, then this shipping rate will apply to all stores.
Warehouse
If an asterisk is selected, then this shipping rate will apply to all warehouses.
Country
If an asterisk is selected, then this shipping rate will apply to all customers, regardless of the country.
State / province
If an asterisk is selected, then this shipping rate will apply to all customers from the given country, regardless of the state.
Zip
Zip / postal code. If zip is empty, then this shipping rate will apply to all customers from the given country or state, regardless of the zip code.
Shipping method
Choose shipping method
Order weight from
Order weight from.
Order weight to
Order weight to.
Additional fixed cost
Specify an additional fixed cost per shopping cart for this option. Set to 0 if you don''t want an additional fixed cost to be applied.
Lower weight limit
Lower weight limit. This field can be used for \"per extra weight unit\" scenarios.
Charge percentage (of subtotal)
Charge percentage (of subtotal).
Rate per weight unit
Rate per weight unit.
Limit shipping methods to configured ones
If you check this option, then your customers will be limited to shipping options configured here. Otherwise, they''ll be able to choose any existing shipping options even they''ve not configured here (zero shipping fee in this case).
Data
Add record
Formula to calculate rates
[additional fixed cost] + ([order total weight] - [lower weight limit]) * [rate per weight unit] + [order subtotal] * [charge percentage]
Allow vendors to import products
Check if vendors are allowed to import products.
You save: {0}
Discounted qty: {0}
Add new tier price
Edit tier price details
Select customer role for which the tier price will be available.
End date
The end date of the tier price in Coordinated Universal Time (UTC).
Specify the price.
Specify quantity for which this tier price will be available.
Start date
The start date of the tier price in Coordinated Universal Time (UTC).
Option to limit this tier price to a certain store. If you have multiple stores, choose one from the list.
Deactivate gift cards after deleting of an order
Check to deactivate related gift cards when an order is deleted.
Complete order when delivered
Check if an order status should be set to "Complete" only when its shipping status is "Delivered". Otherwise, "Shipped" status will be enough.
order #{1}]]>
Edited a news comment (ID = {0})
News comments must be approved
Check if news comments must be approved by administrator.
Is approved
News comment is successfully added. You will see it after approving by a store administrator.
Edited a blog comment (ID = {0})
Blog comments must be approved
Check if blog comments must be approved by administrator.
Is approved
Blog comment is successfully added. You will see it after approving by a store administrator.
Stock quantity history
Here you can see a history of the product stock quantity changes.
Attribute combination
Created On
Message
Stock quantity
Quantity adjustment
Warehouse
Stock quantity history
The stock quantity has been increased by canceling the order #{0}
The stock quantity of combination has been edited
The stock quantity has been edited by copying the product #{0}
The stock quantity has been increased by deleting the order #{0}
The stock quantity has been increased by deleting an order item from the order #{0}
The stock quantity has been increased by deleting a shipment from the order #{0}
The stock quantity has been edited
Multiple warehouses.
The stock quantity has been changed by editing the order #{0}
The stock quantity has been changed by importing product
Products have been moved {0} {1} by importing product
Products have been moved {0} {1}
to the {0}
from the {0}
The stock quantity has been reduced by placing the order #{0}
The stock quantity has been reduced when an order item of the order #{0} was shipped
{0} - copy
{0}-copy
Deactivate gift cards after cancelling of an order
Check to deactivate related gift cards when an order is cancelled.
Activate gift cards after completing of an order
Check to activate related gift cards when an order is completed.
Do not forget to restart the application once a task has been modified.
- or -
Choose an associated product
Store
Load products only from a specific store (available in this store).
Vendor
Load products only by a specific vendor (owned by this vendor).
Category
Load products only from a specific category.
Manufacturer
Load products only from a specific manufacturer.
Carts shared between stores
Determines whether shopping carts (and wishlists) are shared between stores (in multi-store environment).
Email validation
Your email already has been validated
Your email has been validated
Email validation
Email validation
New email
(not validated yet)
Shipping methods used by offline shipping providers. For example, "Manual (Fixed or By Weight)".
Ignored product type IDs (advanced)
Allow file uploads
Check if you want to allow customers to upload files when submitting return requests.
Upload (any additional document, scan, etc)
Uploaded file:
Download
Uploaded file
File uploaded by customer
Download
Reply text
The reply text (by a store owner). If specified, then it''ll be visible to a customer. Leave empty to ignore this functionality.
A manager responded to this review
Blog comments per store
Check to display blog comments written in the current store only.
News comments per store
Check to display news comments written in the current store only.
Store name
Store name
The associated product has attributes, keep in mind that customers can not select them in the product details page.
The associated product has required product attributes, so customers won''t be able to choose this product attribute value.
The associated product is downloadable, keep in mind that won''t be able to download it.
The associated product is a gift card, keep in mind that customers can not specify its details in the product details page.
All
{0} - {1} of {2} items
No items to display
Go to the first page
items per page
Go to the last page
More pages
Go to the next page
of {0}
Page
Go to the previous page
Refresh
Address (optional)
Maximum login failures
Maximum login failures to lockout account. Set 0 to disable this feature.
Lockout time (login failures)
Enter number of minutes to lockout users (for login failures).
Customer is locked out
Imported manufacturers are distinguished by ID. If the ID already exists, then its corresponding manufacturer will be updated. You should not specify ID (leave 0) for new manufacturers.
Imported categories are distinguished by ID. If the ID already exists, then its corresponding category will be updated. You should not specify ID (leave 0) for new categories.
For conditional expressions use the token %if (your conditions ) ... endif%
Fixed rate
By Country
Tax category
Rate
Store
If an asterisk is selected, then this shipping rate will apply to all stores.
Country
The country.
State / province
If an asterisk is selected, then this tax rate will apply to all customers from the given country, regardless of the state.
Zip
Zip / postal code. If zip is empty, then this tax rate will apply to all customers from the given country or state, regardless of the zip code.
Tax category
The tax category.
Percentage
The tax rate.
Add tax rate
New tax rate
ID
Search by a specific return request identifier.
End date
The end date for the search.
Return status
All
Search by a specific return request status e.g. Received.
Start date
The start date for the search.
Product attributes are quantifiable or descriptive aspects of a product (such as, color). For example, if you were to create an attribute for color, with the values of blue, green, yellow, and so on, you may want to apply this attribute to shirts, which you sell in various colors (you can adjust a price or weight for any of existing attribute values).
You can add attribute for your product using existing list of attributes, or if you need to create a new one go to Catalog > Attributes > Product attributes. Please notice that if you want to manage inventory by product attributes (e.g. 5 green shirts and 3 blue ones), then ensure that "Inventory method" is set to "Track inventory by product attributes".
Approve selected
Approve selected
Disapprove selected
Disapprove selected
Registered in the store
Indicating in which store the customer is registered
Consider associated products dimensions and weight
Check to consider associated products dimensions and weight on shipping, uncheck for example, if the main product already includes them.
Created from
The creation from date for the search.
Created to
The creation to date for the search.
Message
Search in title and comment text.
Created from
The creation from date for the search.
Created to
The creation to date for the search.
Message
Search in comment text.
Retry last payment
Last payment failed
Approved
Search by a "Approved" property.
All
Approved only
Disapproved only
Approved
Search by a "Approved" property.
All
Approved only
Disapproved only
Approved
Search by a "Approved" property.
All
Approved only
Disapproved only
It looks like you have "ShoppingCartSettings.RoundPricesDuringCalculation" setting disabled. Keep in mind that this can lead to a discrepancy of the order total amount, as PayPal only rounds to two decimals.
Order ID
Order #
Order #
Order ID
Order #
Order ID
Order #
Order #
The unique number of this order.
Created order ID
Created order
Order ID
Order #
Order ID
Order #
The order associated to this shipment.
Order number mask
Order number mask, for creating custom order number. For example, RE-{YYYY}-{MM}. Leave this field empty if you don''t want to use custom order numbers.
{DD} - day of order creation date
{ID} - Order identifier
{MM} - month of order creation date
{YYYY} - year of order creation date
{YY} - last two digits of year of order creation date
Order
The gift card was purchased with this order.
Order
The gift card was purchased with this order.
Edited an order (Order number = {0}). See order notes for details
View order (Order number - {0})
The unique number of the order.
Pass purchased items
Check to pass information about purchased items to PayPal.
Unduplicated passwords number
Specify the number of customer passwords that mustn''t be the same as the previous one, enter 0 if the customer can use the same password time after time.
You entered the password that is the same as one of the last passwords you used. Please create a new password.
Your password has expired, please create a new one
Password lifetime
Specify number of days for password expiration. Don''t forget to check "EnablePasswordLifetime" property on customer role edit page for those roles, who will have to change passwords.
Enable password lifetime
Check to force customers to change their passwords after a specified time.
ID
ID
This order is cancelled
Notify about new blog comments in Configuration - Settings - Blog settings.]]>
Allow back in stock subscriptions in Product info tab - Inventory section.]]>
This message template is used when a customer changes an email address in his account. The customer receives a message to confirm an email address used when changing email address.
This message template is used the option Email notification from Registration method dropdown list in Configuration - Settings - Customer settings is selected. The customer receives a message to confirm an email address used when registering.
This message template is used when the customer gets a notification about a new order being placed from this account.
Show alert for PM in Configuration - Settings - Forum settings.]]>
This message template is used when a customer forgets a password needed to log in the account. The customer receives a message with a link for entering a new password.
This message template is used to welcome a new customer after registration.
This message template is used when a new forum post in certain forum topic is created. The message is received by a store owner.
This message template is used when a new forum topic is created. The message is received by a store owner.
This message template is used to send a notification to a customer about getting a gift card.
Notify about new customer registration in Configuration - Settings - Customer settings.]]>
This message template is used to notify a customer about a new return request submitted from his/her account.
This message template is used when a new return request is created. The message is received by a store owner.
Notify about new news comments in Configuration - Settings - News settings.]]>
This message template is used when a customer subscribes to the newsletter to confirm the subscription.
Newsletter box. Allow to unsubscribe in Configuration - Settings - Customer settings.]]>
Notify admin when a new VAT number is submitted in Configuration - Settings - Tax settings.]]>
This message template is used to notify a customer that the certain order was canceled. The order can ba canceled by a customer on the account page or by store owner in Customers - Customers in Orders tab or in Sales - Orders.
This message template is used to notify a customer that the certain order was completed. The order gets the order status Complete when it''s paid and delivered, or it can be changed manually to Complete in Sales - Orders.
This message template is used to notify a customer that the certain order was paid. The order gets the payment status Paid when the amount was charged, or it can be changed manually Sales - Orders by clicking Mark as paid button in Payment status.
This message template is used to notify a store owner that the certain order was paid. The order gets the status Paid when the amount was charged, or it can be changed manually Sales - Orders by clicking Mark as paid button in Payment status.
This message template is used to notify a vendor that the certain order was paid. The order gets the status Paid when the amount was charged.
This message template is used to notify a customer that the certain order was placed. Orders can be viewed by a customer on the account page.
This message template is used to notify a store owner that the certain order was placed. Orders can be viewed by a store owner in Sales - Orders or in Customers menu.
This message template is used to notify a vendor that the certain order was placed. Orders can be viewed by a vendor in Sales - Orders. You can allow them to access this part of Admin Area in Configuration - Access control list.
This message template is used to notify a customer that the certain order was refunded. The customer can submit to refund the order when the payment status is paid on the account page, or it can be done by a store owner in Sales - Orders by clicking "Refund" button.
This message template is used to notify a store owner that the certain order was refunded. The customer can submit to refund the order when the payment status is paid on the account page, or it can be done by a store owner in Sales - Orders by clicking "Refund" button.
Notify about new product reviews in Configuration - Settings - Catalog settings.]]>
This message template is used to notify a store owner that the certain product attribute combination is getting low stock. You can set up the combination minimum quantity when creating or editing the product in Product attribute tab - Attributes combinations tab in Notify admin for quantity below field.
Minimum stock qty field.]]>
This message template is used to notify a customer that the certain recurring payment is canceled. Payment can be canceled by a customer in the account page or by a store owner in Sales - Recurring payments in History tab by clicking "Cancel recurring payment" button.
This message template is used to notify a store owner that the certain recurring payment is canceled. Payment can be canceled by a customer in the account page or by a store owner in Sales - Recurring payments in History tab by clicking "Cancel recurring payment" button.
This message template is used to notify a customer that the certain recurring payment is failed. For example, the amount can''t be charged from the provided credit card.
This message template is used to notify a customer that the request status to the certain order is changed. You can set up this option in Sales - Return requests by clicking "Notify customer about status change" button.
This message template is used to notify a store owner about a message sent through the contact form.
This message template is used to notify a vendor about a message sent through the contact form.
This message template is used to send "email a friend" message.
Display shipment events (customers).]]>
Display shipment events (customers).]]>
Allow customers to apply for vendor account.]]>
Allow vendors to edit info.]]>
This message template is used when a customer wants to share some product from the wishlist with a friend by sending an email. You can set up this option by ticking the checkbox Allow customers to email their wishlists in Configuration - Settings - Shopping cart settings.
Tax based on pickup point address
A value indicating whether to use pickup point address (when pickup point is chosen) for tax calculation.
It seems that you use Redis server for caching, keep in mind that enabling this setting create a lot of traffic between the Redis server and the application because of the large number of locales.
Export orders with products
Check if orders should be exported with products.
Requirement group is a useful feature for creating discount requirement templates. You can create a requirement group just once and then use it every time you want this limitation to be applied. You can include one requirement group into another one if needed.]]>
Add requirement group
You can choose one of the following requirement types, or add a requirement group to use several requirement types simultaneously.
Group name
Specify name of the requirement group (e.g. "Permitted customer roles").
Add to group
Choose the group you want the requirement group you’re creating to be assigned to
Group
AND
OR
Requirement
Default requirement group
Interaction type in this group is
The group is empty
Remove requirement
Remove group
Blog comments
Common
Additional sections
Catalog pages
Compare products
Export/Import
Performance
Product fields
Product page
Product sorting
Product reviews
Search
Share
Tax
Tags
Account
Common
Default fields
External authentication
Password and security
Profile
Time zone
Common
Feeds
Page sizes
Permissions
Full-Text
CAPTCHA
Common
Localization
Pdf
Security
SEO
Sitemap
Social media
Common
Other pages
Product
News comments
Common
Checkout
Common
Gift cards
Order totals
Pdf invoice
Common
Checkout
Common
Notifications
Common
Mini shopping cart
Wishlist
Common
Payment
Shipping
Tax dispaying
VAT
Catalog
Common
In order to use this functionality you have to disable the following setting: Configuration > Catalog settings > Ignore discounts (sitewide).
- At least two unique product identifiers are required. So each of your product shouldhave manufacturer (brand) and MPN (manufacturer part number) specified
- Specify default tax values in your Google Merchant Center account settings
- Specify default shipping values in your Google Merchant Center account settings
- In order to get more info about required fields look at the following article http://www.google.com/support/merchants/bin/answer.py?answer=188494
]]>
You can download the list of allowed Google product category attributes here]]>
If you''re using this gateway ensure that your primary store currency is supported by Paypal.
To configure plugin follow these steps:
1. Log into your Developer PayPal account (click here to create your account).
2. Click on My Apps & Credentials from the Dashboard.
3. Create new REST API app.
4. Copy your Client ID and Secret key below.
5. To be able to use recurring payments you need to set the webhook ID. You can get it manually in your PayPal account (enter the URL https://www.yourStore.com/Plugins/PaymentPayPalDirect/Webhook below REST API application credentials), or automatically by pressing "@T("Plugins.Payments.PayPalDirect.WebhookCreate")" button (not visible when running the site locally).
]]>
If you''re using this gateway ensure that your primary store currency is supported by Paypal.
To use PDT, you must activate PDT and Auto Return in your PayPal account profile. You must also acquire a PDT identity token, which is used in all PDT communication you send to PayPal. Follow these steps to configure your account for PDT:
1. Log in to your PayPal account (click here to create your account).
2. Click the Profile subtab.
3. Click Website Payment Preferences in the Seller Preferences column.
4. Under Auto Return for Website Payments, click the On radio button.
5. For the Return URL, enter the URL on your site that will receive the transaction ID posted by PayPal after a customer payment (http://www.yourStore.com/Plugins/PaymentPayPalStandard/PDTHandler).
6. Under Payment Data Transfer, click the On radio button.
7. Click Save.
8. Click Website Payment Preferences in the Seller Preferences column.
9. Scroll down to the Payment Data Transfer section of the page to view your PDT identity token.
Two ways to be able to receive IPN messages (optional):
The first way is to check ''Enable IPN'' below. It will include in the request the url of you IPN handler
The second way is to confugure your paypal account to activate this service; follow these steps:
1. Log in to your Premier or Business account.
2. Click the Profile subtab.
3. Click Instant Payment Notification in the Selling Preferences column.
4. Click the ''Edit IPN Settings'' button to update your settings.
5. Select ''Receive IPN messages'' (Enabled) and enter the URL of your IPN handler (http://www.yourStore.com/Plugins/PaymentPayPalStandard/IPNHandler).
6. Click Save, and you should get a message that you have successfully activated IPN.]]>
To configure plugin follow one of these steps:
1. If you are a Canada Post commercial customer, fill Customer number, Contract ID and API key below.
2. If you are a Solutions for Small Business customer, specify your Customer number and API key below.
3. If you are a non-contracted customer or you want to use the regular price of shipping paid by customers, fill the API key field only.
Note: Canada Post gateway returns shipping price in the CAD currency, ensure that you have correctly configured exchange rate from PrimaryStoreCurrency to CAD.]]>
Google Analytics is a free website stats tool from Google. It keeps track of statisticsabout the visitors and ecommerce conversion on your website.
Follow the next steps to enable Google Analytics integration:
- Create a Google Analyticsaccount and follow the wizard to add your website
- Copy the Tracking ID into the ''ID'' box below
- Click the ''Save'' button below and Google Analytics will be integrated into your store
If you would like to switch between Google Analytics (used by default) and Universal Analytics, then please use the buttons below:]]>
Please note that {ECOMMERCE} line works only when you have "Disable order completed page" order setting unticked.]]>
Here you can find third-party extensions and themes which are developed by our community and partners.They are also available in our marketplace]]>
A CAPTCHA is a program that can tell whether its user is a human or a computer.You''ve probably seen them — colorful images with distorted text at the bottom ofWeb registration forms. CAPTCHAs are used by many websites to prevent abuse from"bots," or automated programs usually written to generate spam. No computer programcan read distorted text as well as humans can, so bots cannot navigate sites protectedby CAPTCHAs. nopCommerce uses reCAPTCHA.]]>
You can download more nopCommerce plugins in our marketplace]]>
Edit values
Edit condition
Edit rules
{0} categories were imported
{0} manufacturers were imported
{0} products were imported
{0} states and provinces were imported
Add to wishlist
Update
Store
Search by a specific store.
Rounding type
The rounding type.
Default rounding
Rounding up with 0.05 intervals (0.06 round to 0.10)
Rounding down with 0.05 intervals (0.06 round to 0.05)
Rounding up with 0.10 intervals (1.05 round to 1.10)
Rounding down with 0.10 intervals (1.05 round to 1.00)
Rounding with 0.50 intervals
Rounding with 1.00 intervals (1.01-1.49 round to 1.00, 1.50-1.99 round to 2.00)
Rounding up with 1.00 intervals (1.01–1.99 round to 2.00)
Picture zoom
Check to enable picture zoom on product details page.
Display "Blog"
Check if "Blog" menu item should be displayed in the top menu.
Display "Forums"
Check if "Forums" menu item should be displayed in the top menu.
Display "Contact us"
Check if "Contact us" menu item should be displayed in the top menu.
Display "My account"
Check if "My account" menu item should be displayed in the top menu.
Display "Home page"
Check if "Home page" menu item should be displayed in the top menu.
Display "New products"
Check if "New products" menu item should be displayed in the top menu.
Display "Search"
Check if "Search" menu item should be displayed in the top menu.
Top menu items
The value is out of range. Maximum value is {0}.99
Check to enable free shipping for all orders over ''X''. Set the value to X below.
Display cart after adding a product
If checked, a customer will be taken to the shopping cart page immediately after adding a product to their cart. If unchecked, a customer will stay on the same page from which the product was added to the cart.
Display wishlist after adding a product
If checked, a customer will be taken to the wishlist page immediately after adding a product to their wishlist. If unchecked, a customer will stay on the same page from which the product was added to the cart.
Determines whether product images should be displayed in customer wishlists.
Brief overview of this blog post. If specified, then it will be used instead of full body on the main blog page. HTML is supported.
A delay before sending the message.
Check if you want to show poll on the home page.
Determines whether this attribute value is pre-selected for the customer.
Determines whether this attribute value is pre-selected for the customer.
Determines whether this attribute value is pre-selected for the address.
Determines whether this attribute value is pre-selected for the customer.
Determines whether this attribute value is pre-selected for the customer.
Choose a product
Enter the message.
The type of a card used in the transaction.
Customer IP address from where an order has been placed.
Choose a customer role to which this email will be sent.
Enter send attempts.
Only load emails into queue that have not been sent yet.
Topic subject can not be empty
'
CREATE TABLE #LocaleStringResourceTmp
(
[ResourceName] [nvarchar](200) NOT NULL,
[ResourceValue] [nvarchar](max) NOT NULL
)
INSERT INTO #LocaleStringResourceTmp (ResourceName, ResourceValue)
SELECT nref.value('@Name', 'nvarchar(200)'), nref.value('Value[1]', 'nvarchar(MAX)')
FROM @resources.nodes('//Language/LocaleResource') AS R(nref)
--do it for each existing language
DECLARE @ExistingLanguageId int
DECLARE cur_existinglanguage CURSOR FOR
SELECT [Id]
FROM [Language]
OPEN cur_existinglanguage
FETCH NEXT FROM cur_existinglanguage INTO @ExistingLanguageId
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @ResourceName nvarchar(200)
DECLARE @ResourceValue nvarchar(MAX)
DECLARE cur_localeresource CURSOR FOR
SELECT ResourceName, ResourceValue
FROM #LocaleStringResourceTmp
OPEN cur_localeresource
FETCH NEXT FROM cur_localeresource INTO @ResourceName, @ResourceValue
WHILE @@FETCH_STATUS = 0
BEGIN
IF (EXISTS (SELECT 1 FROM [LocaleStringResource] WHERE LanguageId=@ExistingLanguageId AND ResourceName=@ResourceName))
BEGIN
UPDATE [LocaleStringResource]
SET [ResourceValue]=@ResourceValue
WHERE LanguageId=@ExistingLanguageId AND ResourceName=@ResourceName
END
ELSE
BEGIN
INSERT INTO [LocaleStringResource]
(
[LanguageId],
[ResourceName],
[ResourceValue]
)
VALUES
(
@ExistingLanguageId,
@ResourceName,
@ResourceValue
)
END
IF (@ResourceValue is null or @ResourceValue = '')
BEGIN
DELETE [LocaleStringResource]
WHERE LanguageId=@ExistingLanguageId AND ResourceName=@ResourceName
END
FETCH NEXT FROM cur_localeresource INTO @ResourceName, @ResourceValue
END
CLOSE cur_localeresource
DEALLOCATE cur_localeresource
--fetch next language identifier
FETCH NEXT FROM cur_existinglanguage INTO @ExistingLanguageId
END
CLOSE cur_existinglanguage
DEALLOCATE cur_existinglanguage
DROP TABLE #LocaleStringResourceTmp
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'shippingsettings.hideshippingtotal')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'shippingsettings.hideshippingtotal', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'taxsettings.defaulttaxcategoryid')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'taxsettings.defaulttaxcategoryid', N'0', 0)
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewAddressAttribute')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewAddressAttribute', N'Add a new address attribute', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewAffiliate')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewAffiliate', N'Add a new affiliate', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewBlogPost')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewBlogPost', N'Add a new blog post', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewCampaign')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewCampaign', N'Add a new campaign', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewCountry')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewCountry', N'Add a new country', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewCurrency')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewCurrency', N'Add a new currency', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewCustomerAttribute')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewCustomerAttribute', N'Add a new customer attribute', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewCustomerAttributeValue')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewCustomerAttributeValue', N'Add a new customer attribute value', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewEmailAccount')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewEmailAccount', N'Add a new email account', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewLanguage')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewLanguage', N'Add a new language', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewMeasureDimension')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewMeasureDimension', N'Add a new measure dimension', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewMeasureWeight')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewMeasureWeight', N'Add a new measure weight', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewNews')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewNews', N'Add a new news', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'InstallNewPlugin')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'InstallNewPlugin', N'Install a new plugin', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewStateProvince')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewStateProvince', N'Add a new state or province', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewStore')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewStore', N'Add a new store', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewVendor')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewVendor', N'Add a new vendor', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewWarehouse')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewWarehouse', N'Add a new warehouse', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteAddressAttribute')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteAddressAttribute', N'Delete an address attribute', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteAffiliate')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteAffiliate', N'Delete an affiliate', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteBlogPost')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteBlogPost', N'Delete a blog post', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteCampaign')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteCampaign', N'Delete a campaign', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteCountry')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteCountry', N'Delete a country', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteCurrency')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteCurrency', N'Delete a currency', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteCustomerAttribute')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteCustomerAttribute', N'Delete a customer attribute', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteCustomerAttributeValue')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteCustomerAttributeValue', N'Delete a customer attribute value', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteEmailAccount')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteEmailAccount', N'Delete an email account', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteLanguage')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteLanguage', N'Delete a language', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteMeasureDimension')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteMeasureDimension', N'Delete a measure dimension', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteMeasureWeight')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteMeasureWeight', N'Delete a measure weight', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteMessageTemplate')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteMessageTemplate', N'Delete a message template', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteNews')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteNews', N'Delete a news', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'UninstallPlugin')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'UninstallPlugin', N'Uninstall a plugin', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteProductReview')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteProductReview', N'Delete a product review', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteStateProvince')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteStateProvince', N'Delete a state or province', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteStore')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteStore', N'Delete a store', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteVendor')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteVendor', N'Delete a vendor', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteWarehouse')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteWarehouse', N'Delete a warehouse', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditAddressAttribute')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditAddressAttribute', N'Edit an address attribute', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditAffiliate')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditAffiliate', N'Edit an affiliate', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditBlogPost')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditBlogPost', N'Edit a blog post', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditCampaign')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditCampaign', N'Edit a campaign', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditCountry')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditCountry', N'Edit a country', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditCurrency')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditCurrency', N'Edit a currency', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditCustomerAttribute')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditCustomerAttribute', N'Edit a customer attribute', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditCustomerAttributeValue')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditCustomerAttributeValue', N'Edit a customer attribute value', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditEmailAccount')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditEmailAccount', N'Edit an email account', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditLanguage')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditLanguage', N'Edit a language', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditMeasureDimension')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditMeasureDimension', N'Edit a measure dimension', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditMeasureWeight')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditMeasureWeight', N'Edit a measure weight', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditMessageTemplate')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditMessageTemplate', N'Edit a message template', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditNews')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditNews', N'Edit a news', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditPlugin')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditPlugin', N'Edit a plugin', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditProductReview')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditProductReview', N'Edit a product review', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditStateProvince')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditStateProvince', N'Edit a state or province', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditStore')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditStore', N'Edit a store', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditTask')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditTask', N'Edit a task', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditVendor')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditVendor', N'Edit a vendor', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditWarehouse')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditWarehouse', N'Edit a warehouse', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteBlogPostComment')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteBlogPostComment', N'Delete a blog post comment', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteNewsComment')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteNewsComment', N'Delete a news comment', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'AddNewAddressAttributeValue')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'AddNewAddressAttributeValue', N'Add a new address attribute value', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditAddressAttributeValue')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditAddressAttributeValue', N'Edit an address attribute value', N'true')
END
GO
--new activity types
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'DeleteAddressAttributeValue')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'DeleteAddressAttributeValue', N'Delete an address attribute value', N'true')
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'catalogsettings.productreviewpossibleonlyafterpurchasing')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'catalogsettings.productreviewpossibleonlyafterpurchasing', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'catalogsettings.exportimportusedropdownlistsforassociatedentities')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'catalogsettings.exportimportusedropdownlistsforassociatedentities', N'True', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'catalogsettings.showskuoncatalogpages')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'catalogsettings.showskuoncatalogpages', N'False', 0)
END
GO
--rename settings
UPDATE [Setting]
SET [Name] = N'catalogsettings.showskuonproductdetailspage'
WHERE [Name] = N'catalogsettings.showproductsku'
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[ProductAttributeValue]') and NAME='CustomerEntersQty')
BEGIN
ALTER TABLE [ProductAttributeValue]
ADD [CustomerEntersQty] bit NULL
END
GO
UPDATE [ProductAttributeValue]
SET [CustomerEntersQty] = 0
WHERE [CustomerEntersQty] IS NULL
GO
ALTER TABLE [ProductAttributeValue] ALTER COLUMN [CustomerEntersQty] bit NOT NULL
GO
--new or update setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'shoppingcartsettings.renderassociatedattributevaluequantity')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'shoppingcartsettings.renderassociatedattributevaluequantity', N'True', 0);
END
ELSE
BEGIN
UPDATE [Setting]
SET [Value] = N'True'
WHERE [Name] = N'shoppingcartsettings.renderassociatedattributevaluequantity'
END
GO
--update column
ALTER TABLE [RewardPointsHistory] ALTER COLUMN [PointsBalance] int NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'rewardpointssettings.activationdelay')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'rewardpointssettings.activationdelay', N'0', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'rewardpointssettings.activationdelayperiodid')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'rewardpointssettings.activationdelayperiodid', N'0', 0)
END
GO
--new discount coupon code logic
DELETE FROM [GenericAttribute]
WHERE [KeyGroup] = 'Customer' and [Key] = 'DiscountCouponCode'
GO
--new table
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[ProductAvailabilityRange]') and OBJECTPROPERTY(object_id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[ProductAvailabilityRange](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] nvarchar(400) NOT NULL,
[DisplayOrder] int NOT NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
END
GO
--add a new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Product]') and NAME='ProductAvailabilityRangeId')
BEGIN
ALTER TABLE [Product]
ADD [ProductAvailabilityRangeId] int NULL
END
GO
UPDATE [Product]
SET [ProductAvailabilityRangeId] = 0
WHERE [ProductAvailabilityRangeId] IS NULL
GO
ALTER TABLE [Product] ALTER COLUMN [ProductAvailabilityRangeId] int NOT NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'paymentsettings.showpaymentmethoddescriptions')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'paymentsettings.showpaymentmethoddescriptions', N'True', 0)
END
GO
--ensure that dbo is added to existing stored procedures
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[FullText_IsSupported]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [FullText_IsSupported]
GO
CREATE PROCEDURE [dbo].[FullText_IsSupported]
AS
BEGIN
EXEC('
SELECT CASE SERVERPROPERTY(''IsFullTextInstalled'')
WHEN 1 THEN
CASE DatabaseProperty (DB_NAME(DB_ID()), ''IsFulltextEnabled'')
WHEN 1 THEN 1
ELSE 0
END
ELSE 0
END')
END
GO
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[FullText_Enable]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [FullText_Enable]
GO
CREATE PROCEDURE [dbo].[FullText_Enable]
AS
BEGIN
--create catalog
EXEC('
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_catalogs WHERE [name] = ''nopCommerceFullTextCatalog'')
CREATE FULLTEXT CATALOG [nopCommerceFullTextCatalog] AS DEFAULT')
--create indexes
DECLARE @create_index_text nvarchar(4000)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Product]''))
CREATE FULLTEXT INDEX ON [Product]([Name], [ShortDescription], [FullDescription])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Product') + '] ON [nopCommerceFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[LocalizedProperty]''))
CREATE FULLTEXT INDEX ON [LocalizedProperty]([LocaleValue])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('LocalizedProperty') + '] ON [nopCommerceFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[ProductTag]''))
CREATE FULLTEXT INDEX ON [ProductTag]([Name])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('ProductTag') + '] ON [nopCommerceFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
END
GO
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[FullText_Disable]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [FullText_Disable]
GO
CREATE PROCEDURE [dbo].[FullText_Disable]
AS
BEGIN
EXEC('
--drop indexes
IF EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Product]''))
DROP FULLTEXT INDEX ON [Product]
')
EXEC('
IF EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[LocalizedProperty]''))
DROP FULLTEXT INDEX ON [LocalizedProperty]
')
EXEC('
IF EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[ProductTag]''))
DROP FULLTEXT INDEX ON [ProductTag]
')
--drop catalog
EXEC('
IF EXISTS (SELECT 1 FROM sys.fulltext_catalogs WHERE [name] = ''nopCommerceFullTextCatalog'')
DROP FULLTEXT CATALOG [nopCommerceFullTextCatalog]
')
END
GO
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[LanguagePackImport]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [LanguagePackImport]
GO
CREATE PROCEDURE [dbo].[LanguagePackImport]
(
@LanguageId int,
@XmlPackage xml
)
AS
BEGIN
IF EXISTS(SELECT * FROM [Language] WHERE [Id] = @LanguageId)
BEGIN
CREATE TABLE #LocaleStringResourceTmp
(
[LanguageId] [int] NOT NULL,
[ResourceName] [nvarchar](200) NOT NULL,
[ResourceValue] [nvarchar](MAX) NOT NULL
)
INSERT INTO #LocaleStringResourceTmp (LanguageID, ResourceName, ResourceValue)
SELECT @LanguageId, nref.value('@Name', 'nvarchar(200)'), nref.value('Value[1]', 'nvarchar(MAX)')
FROM @XmlPackage.nodes('//Language/LocaleResource') AS R(nref)
DECLARE @ResourceName nvarchar(200)
DECLARE @ResourceValue nvarchar(MAX)
DECLARE cur_localeresource CURSOR FOR
SELECT LanguageID, ResourceName, ResourceValue
FROM #LocaleStringResourceTmp
OPEN cur_localeresource
FETCH NEXT FROM cur_localeresource INTO @LanguageId, @ResourceName, @ResourceValue
WHILE @@FETCH_STATUS = 0
BEGIN
IF (EXISTS (SELECT 1 FROM [LocaleStringResource] WHERE LanguageID=@LanguageId AND ResourceName=@ResourceName))
BEGIN
UPDATE [LocaleStringResource]
SET [ResourceValue]=@ResourceValue
WHERE LanguageID=@LanguageId AND ResourceName=@ResourceName
END
ELSE
BEGIN
INSERT INTO [LocaleStringResource]
(
[LanguageId],
[ResourceName],
[ResourceValue]
)
VALUES
(
@LanguageId,
@ResourceName,
@ResourceValue
)
END
FETCH NEXT FROM cur_localeresource INTO @LanguageId, @ResourceName, @ResourceValue
END
CLOSE cur_localeresource
DEALLOCATE cur_localeresource
DROP TABLE #LocaleStringResourceTmp
END
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'fixedorbyweightsettings.shippingbyweightenabled')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'fixedorbyweightsettings.shippingbyweightenabled', N'False', 0)
END
GO
IF EXISTS (SELECT 1 FROM [Setting] WHERE [Name] = N'shippingsettings.activeshippingratecomputationmethodsystemnames' AND [Value] LIKE N'%Shipping.ByWeight%')
BEGIN
UPDATE [Setting]
SET [Value] = N'True'
WHERE [Name] = N'fixedorbyweightsettings.shippingbyweightenabled'
END
GO
--rename settings
UPDATE [Setting]
SET [Name] = N'fixedorbyweightsettings.limitmethodstocreated'
WHERE [Name] = N'shippingbyweightsettings.limitmethodstocreated'
GO
--rename settings
UPDATE [Setting]
SET [Name] = N'shippingratecomputationmethod.fixedorbyweight.rate.shippingmethodid' + SUBSTRING(name, 62, len(name))
WHERE [Name] like N'shippingratecomputationmethod.fixedrate.rate.shippingmethodid%'
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'vendorsettings.allowvendorstoimportproducts')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'vendorsettings.allowvendorstoimportproducts', N'True', 0)
END
GO
--add a new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[TierPrice]') and NAME='StartDateTimeUtc')
BEGIN
ALTER TABLE [TierPrice]
ADD [StartDateTimeUtc] datetime NULL
END
GO
--add a new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[TierPrice]') and NAME='EndDateTimeUtc')
BEGIN
ALTER TABLE [TierPrice]
ADD [EndDateTimeUtc] datetime NULL
END
GO
--add a tier prices instead of product special prices
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Product]') and NAME='SpecialPrice')
BEGIN
EXEC('
INSERT INTO [dbo].[TierPrice]([ProductId], [StoreId], [CustomerRoleId], [Quantity], [Price], [StartDateTimeUtc], [EndDateTimeUtc])
SELECT [Id], 0, NULL, 1, [SpecialPrice], [SpecialPriceStartDateTimeUtc], [SpecialPriceEndDateTimeUtc]
FROM [dbo].[Product]
WHERE [SpecialPrice] <> 0')
END
GO
UPDATE [Product]
SET [HasTierPrices] = 1
WHERE [Id] IN (SELECT [ProductId] FROM [dbo].[TierPrice])
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Product]') and NAME='SpecialPrice')
BEGIN
ALTER TABLE [Product] DROP COLUMN [SpecialPrice]
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Product]') and NAME='SpecialPriceStartDateTimeUtc')
BEGIN
ALTER TABLE [Product] DROP COLUMN [SpecialPriceStartDateTimeUtc]
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Product]') and NAME='SpecialPriceEndDateTimeUtc')
BEGIN
ALTER TABLE [Product] DROP COLUMN [SpecialPriceEndDateTimeUtc]
END
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'producteditordettings.specialprice'
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'producteditordettings.specialpricestartdate'
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'producteditordettings.specialpriceenddate'
GO
--a stored procedure update
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[ProductLoadAllPaged]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [ProductLoadAllPaged]
GO
CREATE PROCEDURE [dbo].[ProductLoadAllPaged]
(
@CategoryIds nvarchar(MAX) = null, --a list of category IDs (comma-separated list). e.g. 1,2,3
@ManufacturerId int = 0,
@StoreId int = 0,
@VendorId int = 0,
@WarehouseId int = 0,
@ProductTypeId int = null, --product type identifier, null - load all products
@VisibleIndividuallyOnly bit = 0, --0 - load all products , 1 - "visible indivially" only
@MarkedAsNewOnly bit = 0, --0 - load all products , 1 - "marked as new" only
@ProductTagId int = 0,
@FeaturedProducts bit = null, --0 featured only , 1 not featured only, null - load all products
@PriceMin decimal(18, 4) = null,
@PriceMax decimal(18, 4) = null,
@Keywords nvarchar(4000) = null,
@SearchDescriptions bit = 0, --a value indicating whether to search by a specified "keyword" in product descriptions
@SearchManufacturerPartNumber bit = 0, -- a value indicating whether to search by a specified "keyword" in manufacturer part number
@SearchSku bit = 0, --a value indicating whether to search by a specified "keyword" in product SKU
@SearchProductTags bit = 0, --a value indicating whether to search by a specified "keyword" in product tags
@UseFullTextSearch bit = 0,
@FullTextMode int = 0, --0 - using CONTAINS with , 5 - using CONTAINS and OR with , 10 - using CONTAINS and AND with
@FilteredSpecs nvarchar(MAX) = null, --filter by specification attribute options (comma-separated list of IDs). e.g. 14,15,16
@LanguageId int = 0,
@OrderBy int = 0, --0 - position, 5 - Name: A to Z, 6 - Name: Z to A, 10 - Price: Low to High, 11 - Price: High to Low, 15 - creation date
@AllowedCustomerRoleIds nvarchar(MAX) = null, --a list of customer role IDs (comma-separated list) for which a product should be shown (if a subjet to ACL)
@PageIndex int = 0,
@PageSize int = 2147483644,
@ShowHidden bit = 0,
@OverridePublished bit = null, --null - process "Published" property according to "showHidden" parameter, true - load only "Published" products, false - load only "Unpublished" products
@LoadFilterableSpecificationAttributeOptionIds bit = 0, --a value indicating whether we should load the specification attribute option identifiers applied to loaded products (all pages)
@FilterableSpecificationAttributeOptionIds nvarchar(MAX) = null OUTPUT, --the specification attribute option identifiers applied to loaded products (all pages). returned as a comma separated list of identifiers
@TotalRecords int = null OUTPUT
)
AS
BEGIN
/* Products that filtered by keywords */
CREATE TABLE #KeywordProducts
(
[ProductId] int NOT NULL
)
DECLARE
@SearchKeywords bit,
@OriginalKeywords nvarchar(4000),
@sql nvarchar(max),
@sql_orderby nvarchar(max)
SET NOCOUNT ON
--filter by keywords
SET @Keywords = isnull(@Keywords, '')
SET @Keywords = rtrim(ltrim(@Keywords))
SET @OriginalKeywords = @Keywords
IF ISNULL(@Keywords, '') != ''
BEGIN
SET @SearchKeywords = 1
IF @UseFullTextSearch = 1
BEGIN
--remove wrong chars (' ")
SET @Keywords = REPLACE(@Keywords, '''', '')
SET @Keywords = REPLACE(@Keywords, '"', '')
--full-text search
IF @FullTextMode = 0
BEGIN
--0 - using CONTAINS with
SET @Keywords = ' "' + @Keywords + '*" '
END
ELSE
BEGIN
--5 - using CONTAINS and OR with
--10 - using CONTAINS and AND with
--clean multiple spaces
WHILE CHARINDEX(' ', @Keywords) > 0
SET @Keywords = REPLACE(@Keywords, ' ', ' ')
DECLARE @concat_term nvarchar(100)
IF @FullTextMode = 5 --5 - using CONTAINS and OR with
BEGIN
SET @concat_term = 'OR'
END
IF @FullTextMode = 10 --10 - using CONTAINS and AND with
BEGIN
SET @concat_term = 'AND'
END
--now let's build search string
declare @fulltext_keywords nvarchar(4000)
set @fulltext_keywords = N''
declare @index int
set @index = CHARINDEX(' ', @Keywords, 0)
-- if index = 0, then only one field was passed
IF(@index = 0)
set @fulltext_keywords = ' "' + @Keywords + '*" '
ELSE
BEGIN
DECLARE @first BIT
SET @first = 1
WHILE @index > 0
BEGIN
IF (@first = 0)
SET @fulltext_keywords = @fulltext_keywords + ' ' + @concat_term + ' '
ELSE
SET @first = 0
SET @fulltext_keywords = @fulltext_keywords + '"' + SUBSTRING(@Keywords, 1, @index - 1) + '*"'
SET @Keywords = SUBSTRING(@Keywords, @index + 1, LEN(@Keywords) - @index)
SET @index = CHARINDEX(' ', @Keywords, 0)
end
-- add the last field
IF LEN(@fulltext_keywords) > 0
SET @fulltext_keywords = @fulltext_keywords + ' ' + @concat_term + ' ' + '"' + SUBSTRING(@Keywords, 1, LEN(@Keywords)) + '*"'
END
SET @Keywords = @fulltext_keywords
END
END
ELSE
BEGIN
--usual search by PATINDEX
SET @Keywords = '%' + @Keywords + '%'
END
--PRINT @Keywords
--product name
SET @sql = '
INSERT INTO #KeywordProducts ([ProductId])
SELECT p.Id
FROM Product p with (NOLOCK)
WHERE '
IF @UseFullTextSearch = 1
SET @sql = @sql + 'CONTAINS(p.[Name], @Keywords) '
ELSE
SET @sql = @sql + 'PATINDEX(@Keywords, p.[Name]) > 0 '
--localized product name
SET @sql = @sql + '
UNION
SELECT lp.EntityId
FROM LocalizedProperty lp with (NOLOCK)
WHERE
lp.LocaleKeyGroup = N''Product''
AND lp.LanguageId = ' + ISNULL(CAST(@LanguageId AS nvarchar(max)), '0') + '
AND lp.LocaleKey = N''Name'''
IF @UseFullTextSearch = 1
SET @sql = @sql + ' AND CONTAINS(lp.[LocaleValue], @Keywords) '
ELSE
SET @sql = @sql + ' AND PATINDEX(@Keywords, lp.[LocaleValue]) > 0 '
IF @SearchDescriptions = 1
BEGIN
--product short description
SET @sql = @sql + '
UNION
SELECT p.Id
FROM Product p with (NOLOCK)
WHERE '
IF @UseFullTextSearch = 1
SET @sql = @sql + 'CONTAINS(p.[ShortDescription], @Keywords) '
ELSE
SET @sql = @sql + 'PATINDEX(@Keywords, p.[ShortDescription]) > 0 '
--product full description
SET @sql = @sql + '
UNION
SELECT p.Id
FROM Product p with (NOLOCK)
WHERE '
IF @UseFullTextSearch = 1
SET @sql = @sql + 'CONTAINS(p.[FullDescription], @Keywords) '
ELSE
SET @sql = @sql + 'PATINDEX(@Keywords, p.[FullDescription]) > 0 '
--localized product short description
SET @sql = @sql + '
UNION
SELECT lp.EntityId
FROM LocalizedProperty lp with (NOLOCK)
WHERE
lp.LocaleKeyGroup = N''Product''
AND lp.LanguageId = ' + ISNULL(CAST(@LanguageId AS nvarchar(max)), '0') + '
AND lp.LocaleKey = N''ShortDescription'''
IF @UseFullTextSearch = 1
SET @sql = @sql + ' AND CONTAINS(lp.[LocaleValue], @Keywords) '
ELSE
SET @sql = @sql + ' AND PATINDEX(@Keywords, lp.[LocaleValue]) > 0 '
--localized product full description
SET @sql = @sql + '
UNION
SELECT lp.EntityId
FROM LocalizedProperty lp with (NOLOCK)
WHERE
lp.LocaleKeyGroup = N''Product''
AND lp.LanguageId = ' + ISNULL(CAST(@LanguageId AS nvarchar(max)), '0') + '
AND lp.LocaleKey = N''FullDescription'''
IF @UseFullTextSearch = 1
SET @sql = @sql + ' AND CONTAINS(lp.[LocaleValue], @Keywords) '
ELSE
SET @sql = @sql + ' AND PATINDEX(@Keywords, lp.[LocaleValue]) > 0 '
END
--manufacturer part number (exact match)
IF @SearchManufacturerPartNumber = 1
BEGIN
SET @sql = @sql + '
UNION
SELECT p.Id
FROM Product p with (NOLOCK)
WHERE p.[ManufacturerPartNumber] = @OriginalKeywords '
END
--SKU (exact match)
IF @SearchSku = 1
BEGIN
SET @sql = @sql + '
UNION
SELECT p.Id
FROM Product p with (NOLOCK)
WHERE p.[Sku] = @OriginalKeywords '
END
IF @SearchProductTags = 1
BEGIN
--product tags (exact match)
SET @sql = @sql + '
UNION
SELECT pptm.Product_Id
FROM Product_ProductTag_Mapping pptm with(NOLOCK) INNER JOIN ProductTag pt with(NOLOCK) ON pt.Id = pptm.ProductTag_Id
WHERE pt.[Name] = @OriginalKeywords '
--localized product tags
SET @sql = @sql + '
UNION
SELECT pptm.Product_Id
FROM LocalizedProperty lp with (NOLOCK) INNER JOIN Product_ProductTag_Mapping pptm with(NOLOCK) ON lp.EntityId = pptm.ProductTag_Id
WHERE
lp.LocaleKeyGroup = N''ProductTag''
AND lp.LanguageId = ' + ISNULL(CAST(@LanguageId AS nvarchar(max)), '0') + '
AND lp.LocaleKey = N''Name''
AND lp.[LocaleValue] = @OriginalKeywords '
END
--PRINT (@sql)
EXEC sp_executesql @sql, N'@Keywords nvarchar(4000), @OriginalKeywords nvarchar(4000)', @Keywords, @OriginalKeywords
END
ELSE
BEGIN
SET @SearchKeywords = 0
END
--filter by category IDs
SET @CategoryIds = isnull(@CategoryIds, '')
CREATE TABLE #FilteredCategoryIds
(
CategoryId int not null
)
INSERT INTO #FilteredCategoryIds (CategoryId)
SELECT CAST(data as int) FROM [nop_splitstring_to_table](@CategoryIds, ',')
DECLARE @CategoryIdsCount int
SET @CategoryIdsCount = (SELECT COUNT(1) FROM #FilteredCategoryIds)
--filter by customer role IDs (access control list)
SET @AllowedCustomerRoleIds = isnull(@AllowedCustomerRoleIds, '')
CREATE TABLE #FilteredCustomerRoleIds
(
CustomerRoleId int not null
)
INSERT INTO #FilteredCustomerRoleIds (CustomerRoleId)
SELECT CAST(data as int) FROM [nop_splitstring_to_table](@AllowedCustomerRoleIds, ',')
DECLARE @FilteredCustomerRoleIdsCount int
SET @FilteredCustomerRoleIdsCount = (SELECT COUNT(1) FROM #FilteredCustomerRoleIds)
--paging
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int
SET @RowsToReturn = @PageSize * (@PageIndex + 1)
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1
CREATE TABLE #DisplayOrderTmp
(
[Id] int IDENTITY (1, 1) NOT NULL,
[ProductId] int NOT NULL
)
SET @sql = '
SELECT p.Id
FROM
Product p with (NOLOCK)'
IF @CategoryIdsCount > 0
BEGIN
SET @sql = @sql + '
LEFT JOIN Product_Category_Mapping pcm with (NOLOCK)
ON p.Id = pcm.ProductId'
END
IF @ManufacturerId > 0
BEGIN
SET @sql = @sql + '
LEFT JOIN Product_Manufacturer_Mapping pmm with (NOLOCK)
ON p.Id = pmm.ProductId'
END
IF ISNULL(@ProductTagId, 0) != 0
BEGIN
SET @sql = @sql + '
LEFT JOIN Product_ProductTag_Mapping pptm with (NOLOCK)
ON p.Id = pptm.Product_Id'
END
--searching by keywords
IF @SearchKeywords = 1
BEGIN
SET @sql = @sql + '
JOIN #KeywordProducts kp
ON p.Id = kp.ProductId'
END
SET @sql = @sql + '
WHERE
p.Deleted = 0'
--filter by category
IF @CategoryIdsCount > 0
BEGIN
SET @sql = @sql + '
AND pcm.CategoryId IN (SELECT CategoryId FROM #FilteredCategoryIds)'
IF @FeaturedProducts IS NOT NULL
BEGIN
SET @sql = @sql + '
AND pcm.IsFeaturedProduct = ' + CAST(@FeaturedProducts AS nvarchar(max))
END
END
--filter by manufacturer
IF @ManufacturerId > 0
BEGIN
SET @sql = @sql + '
AND pmm.ManufacturerId = ' + CAST(@ManufacturerId AS nvarchar(max))
IF @FeaturedProducts IS NOT NULL
BEGIN
SET @sql = @sql + '
AND pmm.IsFeaturedProduct = ' + CAST(@FeaturedProducts AS nvarchar(max))
END
END
--filter by vendor
IF @VendorId > 0
BEGIN
SET @sql = @sql + '
AND p.VendorId = ' + CAST(@VendorId AS nvarchar(max))
END
--filter by warehouse
IF @WarehouseId > 0
BEGIN
--we should also ensure that 'ManageInventoryMethodId' is set to 'ManageStock' (1)
--but we skip it in order to prevent hard-coded values (e.g. 1) and for better performance
SET @sql = @sql + '
AND
(
(p.UseMultipleWarehouses = 0 AND
p.WarehouseId = ' + CAST(@WarehouseId AS nvarchar(max)) + ')
OR
(p.UseMultipleWarehouses > 0 AND
EXISTS (SELECT 1 FROM ProductWarehouseInventory [pwi]
WHERE [pwi].WarehouseId = ' + CAST(@WarehouseId AS nvarchar(max)) + ' AND [pwi].ProductId = p.Id))
)'
END
--filter by product type
IF @ProductTypeId is not null
BEGIN
SET @sql = @sql + '
AND p.ProductTypeId = ' + CAST(@ProductTypeId AS nvarchar(max))
END
--filter by "visible individually"
IF @VisibleIndividuallyOnly = 1
BEGIN
SET @sql = @sql + '
AND p.VisibleIndividually = 1'
END
--filter by "marked as new"
IF @MarkedAsNewOnly = 1
BEGIN
SET @sql = @sql + '
AND p.MarkAsNew = 1
AND (getutcdate() BETWEEN ISNULL(p.MarkAsNewStartDateTimeUtc, ''1/1/1900'') and ISNULL(p.MarkAsNewEndDateTimeUtc, ''1/1/2999''))'
END
--filter by product tag
IF ISNULL(@ProductTagId, 0) != 0
BEGIN
SET @sql = @sql + '
AND pptm.ProductTag_Id = ' + CAST(@ProductTagId AS nvarchar(max))
END
--"Published" property
IF (@OverridePublished is null)
BEGIN
--process according to "showHidden"
IF @ShowHidden = 0
BEGIN
SET @sql = @sql + '
AND p.Published = 1'
END
END
ELSE IF (@OverridePublished = 1)
BEGIN
--published only
SET @sql = @sql + '
AND p.Published = 1'
END
ELSE IF (@OverridePublished = 0)
BEGIN
--unpublished only
SET @sql = @sql + '
AND p.Published = 0'
END
--show hidden
IF @ShowHidden = 0
BEGIN
SET @sql = @sql + '
AND p.Deleted = 0
AND (getutcdate() BETWEEN ISNULL(p.AvailableStartDateTimeUtc, ''1/1/1900'') and ISNULL(p.AvailableEndDateTimeUtc, ''1/1/2999''))'
END
--min price
IF @PriceMin is not null
BEGIN
SET @sql = @sql + '
AND (p.Price >= ' + CAST(@PriceMin AS nvarchar(max)) + ')'
END
--max price
IF @PriceMax is not null
BEGIN
SET @sql = @sql + '
AND (p.Price <= ' + CAST(@PriceMax AS nvarchar(max)) + ')'
END
--show hidden and ACL
IF @ShowHidden = 0 and @FilteredCustomerRoleIdsCount > 0
BEGIN
SET @sql = @sql + '
AND (p.SubjectToAcl = 0 OR EXISTS (
SELECT 1 FROM #FilteredCustomerRoleIds [fcr]
WHERE
[fcr].CustomerRoleId IN (
SELECT [acl].CustomerRoleId
FROM [AclRecord] acl with (NOLOCK)
WHERE [acl].EntityId = p.Id AND [acl].EntityName = ''Product''
)
))'
END
--filter by store
IF @StoreId > 0
BEGIN
SET @sql = @sql + '
AND (p.LimitedToStores = 0 OR EXISTS (
SELECT 1 FROM [StoreMapping] sm with (NOLOCK)
WHERE [sm].EntityId = p.Id AND [sm].EntityName = ''Product'' and [sm].StoreId=' + CAST(@StoreId AS nvarchar(max)) + '
))'
END
--prepare filterable specification attribute option identifier (if requested)
IF @LoadFilterableSpecificationAttributeOptionIds = 1
BEGIN
CREATE TABLE #FilterableSpecs
(
[SpecificationAttributeOptionId] int NOT NULL
)
DECLARE @sql_filterableSpecs nvarchar(max)
SET @sql_filterableSpecs = '
INSERT INTO #FilterableSpecs ([SpecificationAttributeOptionId])
SELECT DISTINCT [psam].SpecificationAttributeOptionId
FROM [Product_SpecificationAttribute_Mapping] [psam] WITH (NOLOCK)
WHERE [psam].[AllowFiltering] = 1
AND [psam].[ProductId] IN (' + @sql + ')'
EXEC sp_executesql @sql_filterableSpecs
--build comma separated list of filterable identifiers
SELECT @FilterableSpecificationAttributeOptionIds = COALESCE(@FilterableSpecificationAttributeOptionIds + ',' , '') + CAST(SpecificationAttributeOptionId as nvarchar(4000))
FROM #FilterableSpecs
DROP TABLE #FilterableSpecs
END
--filter by specification attribution options
SET @FilteredSpecs = isnull(@FilteredSpecs, '')
CREATE TABLE #FilteredSpecs
(
SpecificationAttributeOptionId int not null
)
INSERT INTO #FilteredSpecs (SpecificationAttributeOptionId)
SELECT CAST(data as int) FROM [nop_splitstring_to_table](@FilteredSpecs, ',')
CREATE TABLE #FilteredSpecsWithAttributes
(
SpecificationAttributeId int not null,
SpecificationAttributeOptionId int not null
)
INSERT INTO #FilteredSpecsWithAttributes (SpecificationAttributeId, SpecificationAttributeOptionId)
SELECT sao.SpecificationAttributeId, fs.SpecificationAttributeOptionId
FROM #FilteredSpecs fs INNER JOIN SpecificationAttributeOption sao ON sao.Id = fs.SpecificationAttributeOptionId
ORDER BY sao.SpecificationAttributeId
DECLARE @SpecAttributesCount int
SET @SpecAttributesCount = (SELECT COUNT(1) FROM #FilteredSpecsWithAttributes)
IF @SpecAttributesCount > 0
BEGIN
--do it for each specified specification option
DECLARE @SpecificationAttributeOptionId int
DECLARE @SpecificationAttributeId int
DECLARE @LastSpecificationAttributeId int
SET @LastSpecificationAttributeId = 0
DECLARE cur_SpecificationAttributeOption CURSOR FOR
SELECT SpecificationAttributeId, SpecificationAttributeOptionId
FROM #FilteredSpecsWithAttributes
OPEN cur_SpecificationAttributeOption
FOREACH:
FETCH NEXT FROM cur_SpecificationAttributeOption INTO @SpecificationAttributeId, @SpecificationAttributeOptionId
IF (@LastSpecificationAttributeId <> 0 AND @SpecificationAttributeId <> @LastSpecificationAttributeId OR @@FETCH_STATUS <> 0)
SET @sql = @sql + '
AND p.Id in (select psam.ProductId from [Product_SpecificationAttribute_Mapping] psam with (NOLOCK) where psam.AllowFiltering = 1 and psam.SpecificationAttributeOptionId IN (SELECT SpecificationAttributeOptionId FROM #FilteredSpecsWithAttributes WHERE SpecificationAttributeId = ' + CAST(@LastSpecificationAttributeId AS nvarchar(max)) + '))'
SET @LastSpecificationAttributeId = @SpecificationAttributeId
IF @@FETCH_STATUS = 0 GOTO FOREACH
CLOSE cur_SpecificationAttributeOption
DEALLOCATE cur_SpecificationAttributeOption
END
--sorting
SET @sql_orderby = ''
IF @OrderBy = 5 /* Name: A to Z */
SET @sql_orderby = ' p.[Name] ASC'
ELSE IF @OrderBy = 6 /* Name: Z to A */
SET @sql_orderby = ' p.[Name] DESC'
ELSE IF @OrderBy = 10 /* Price: Low to High */
SET @sql_orderby = ' p.[Price] ASC'
ELSE IF @OrderBy = 11 /* Price: High to Low */
SET @sql_orderby = ' p.[Price] DESC'
ELSE IF @OrderBy = 15 /* creation date */
SET @sql_orderby = ' p.[CreatedOnUtc] DESC'
ELSE /* default sorting, 0 (position) */
BEGIN
--category position (display order)
IF @CategoryIdsCount > 0 SET @sql_orderby = ' pcm.DisplayOrder ASC'
--manufacturer position (display order)
IF @ManufacturerId > 0
BEGIN
IF LEN(@sql_orderby) > 0 SET @sql_orderby = @sql_orderby + ', '
SET @sql_orderby = @sql_orderby + ' pmm.DisplayOrder ASC'
END
--name
IF LEN(@sql_orderby) > 0 SET @sql_orderby = @sql_orderby + ', '
SET @sql_orderby = @sql_orderby + ' p.[Name] ASC'
END
SET @sql = @sql + '
ORDER BY' + @sql_orderby
SET @sql = '
INSERT INTO #DisplayOrderTmp ([ProductId])' + @sql
--PRINT (@sql)
EXEC sp_executesql @sql
DROP TABLE #FilteredCategoryIds
DROP TABLE #FilteredSpecs
DROP TABLE #FilteredSpecsWithAttributes
DROP TABLE #FilteredCustomerRoleIds
DROP TABLE #KeywordProducts
CREATE TABLE #PageIndex
(
[IndexId] int IDENTITY (1, 1) NOT NULL,
[ProductId] int NOT NULL
)
INSERT INTO #PageIndex ([ProductId])
SELECT ProductId
FROM #DisplayOrderTmp
GROUP BY ProductId
ORDER BY min([Id])
--total records
SET @TotalRecords = @@rowcount
DROP TABLE #DisplayOrderTmp
--return products
SELECT TOP (@RowsToReturn)
p.*
FROM
#PageIndex [pi]
INNER JOIN Product p with (NOLOCK) on p.Id = [pi].[ProductId]
WHERE
[pi].IndexId > @PageLowerBound AND
[pi].IndexId < @PageUpperBound
ORDER BY
[pi].IndexId
DROP TABLE #PageIndex
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.deactivategiftcardsafterdeletingorder')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.deactivategiftcardsafterdeletingorder', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.completeorderwhendelivered')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.completeorderwhendelivered', N'True', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[NewsComment]') and NAME='IsApproved')
BEGIN
ALTER TABLE [NewsComment]
ADD [IsApproved] bit NULL
END
GO
UPDATE [NewsComment]
SET [IsApproved] = 1
WHERE [IsApproved] IS NULL
GO
ALTER TABLE [NewsComment] ALTER COLUMN [IsApproved] bit NOT NULL
GO
--new activity type
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditNewsComment')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditNewsComment', N'Edited a news comment', N'true')
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'newssettings.newscommentsmustbeapproved')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'newssettings.newscommentsmustbeapproved', N'False', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[BlogComment]') and NAME='IsApproved')
BEGIN
ALTER TABLE [BlogComment]
ADD [IsApproved] bit NULL
END
GO
UPDATE [BlogComment]
SET [IsApproved] = 1
WHERE [IsApproved] IS NULL
GO
ALTER TABLE [BlogComment] ALTER COLUMN [IsApproved] bit NOT NULL
GO
--new activity type
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'EditBlogComment')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'EditBlogComment', N'Edited a blog comment', N'true')
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'blogsettings.blogcommentsmustbeapproved')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'blogsettings.blogcommentsmustbeapproved', N'False', 0)
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[News]') and NAME='CommentCount')
BEGIN
ALTER TABLE [News] DROP COLUMN [CommentCount]
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[BlogPost]') and NAME='CommentCount')
BEGIN
ALTER TABLE [BlogPost] DROP COLUMN [CommentCount]
END
GO
-- new message template
IF NOT EXISTS (SELECT 1 FROM [dbo].[MessageTemplate] WHERE [Name] = N'NewReturnRequest.CustomerNotification')
BEGIN
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
INSERT [dbo].[MessageTemplate] ([Name], [BccEmailAddresses], [Subject], [Body], [IsActive], [AttachedDownloadId], [EmailAccountId], [LimitedToStores], [DelayPeriodId])
VALUES (N'NewReturnRequest.CustomerNotification', NULL, N'%Store.Name%. New return request.', N'' + @NewLine + '%Store.Name%' + @NewLine + '
' + @NewLine + '
' + @NewLine + 'Hello %Customer.FullName%!' + @NewLine + '
' + @NewLine + 'You have just submitted a new return request. Details are below:' + @NewLine + '
' + @NewLine + 'Request ID: %ReturnRequest.CustomNumber%' + @NewLine + '
' + @NewLine + 'Product: %ReturnRequest.Product.Quantity% x Product: %ReturnRequest.Product.Name%' + @NewLine + '
' + @NewLine + 'Reason for return: %ReturnRequest.Reason%' + @NewLine + '
' + @NewLine + 'Requested action: %ReturnRequest.RequestedAction%' + @NewLine + '
' + @NewLine + 'Customer comments:' + @NewLine + '
' + @NewLine + '%ReturnRequest.CustomerComment%' + @NewLine + '
' + @NewLine, 1, 0, 0, 0, 0)
END
GO
--new table
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[StockQuantityHistory]') and OBJECTPROPERTY(object_id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[StockQuantityHistory]
(
[Id] int IDENTITY(1,1) NOT NULL,
[ProductId] int NOT NULL,
[CombinationId] int NULL,
[WarehouseId] int NULL,
[QuantityAdjustment] int NOT NULL,
[StockQuantity] int NOT NULL,
[Message] NVARCHAR (MAX) NULL,
[CreatedOnUtc] datetime NOT NULL
PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
END
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'StockQuantityHistory_Product' AND parent_object_id = Object_id('StockQuantityHistory') AND Objectproperty(object_id, N'IsForeignKey') = 1)
BEGIN
ALTER TABLE [dbo].StockQuantityHistory
DROP CONSTRAINT StockQuantityHistory_Product
END
GO
ALTER TABLE [dbo].[StockQuantityHistory] WITH CHECK ADD CONSTRAINT [StockQuantityHistory_Product] FOREIGN KEY([ProductId])
REFERENCES [dbo].[Product] ([Id])
ON DELETE CASCADE
GO
--initial stock quantity history
DECLARE cur_initialhistory CURSOR FOR
SELECT [Product].Id, NULL, [Product].WarehouseId, [Product].StockQuantity, NULL
FROM [Product]
UNION ALL
SELECT [ProductAttributeCombination].ProductId, [ProductAttributeCombination].Id, NULL, [ProductAttributeCombination].StockQuantity, NULL
FROM [ProductAttributeCombination]
UNION ALL
SELECT [ProductWarehouseInventory].ProductId, NULL, [ProductWarehouseInventory].WarehouseId, [ProductWarehouseInventory].StockQuantity, [ProductWarehouseInventory].Id
FROM [ProductWarehouseInventory]
DECLARE @productId int
DECLARE @combinationId int
DECLARE @warehouseId int
DECLARE @quantity int
DECLARE @warehouseInventoryId int
OPEN cur_initialhistory
FETCH NEXT FROM cur_initialhistory INTO @productId, @combinationId, @warehouseId, @quantity, @warehouseInventoryId
WHILE @@FETCH_STATUS = 0
BEGIN
IF @warehouseId = 0
BEGIN
SET @warehouseId = NULL;
END
DECLARE @message nvarchar(200)
SET @message = 'Initialization of history table (original quantity set) during upgrade from a previous version'
IF @warehouseInventoryId IS NOT NULL
BEGIN
SET @message = 'Multiple warehouses. ' + @message;
END
IF (@quantity IS NOT NULL AND @quantity <> 0 AND
NOT EXISTS (SELECT 1 FROM [StockQuantityHistory] WHERE ProductId = @productId AND
(CombinationId = @combinationId OR (CombinationId IS NULL AND @combinationId IS NULL)) AND (WarehouseId = @warehouseId OR (WarehouseId IS NULL AND @warehouseId IS NULL))))
BEGIN
INSERT INTO [StockQuantityHistory]
([ProductId], [CombinationId], [WarehouseId], [QuantityAdjustment], [StockQuantity], [Message], [CreatedOnUtc])
VALUES
(@productId, @combinationId, @warehouseId, @quantity, @quantity, @message, GETUTCDATE())
END
FETCH NEXT FROM cur_initialhistory INTO @productId, @combinationId, @warehouseId, @quantity, @warehouseInventoryId
END
CLOSE cur_initialhistory
DEALLOCATE cur_initialhistory
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'producteditorsettings.stockquantityhistory')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'producteditorsettings.stockquantityhistory', N'False', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='RequireReLogin')
BEGIN
ALTER TABLE [Customer]
ADD [RequireReLogin] bit NULL
END
GO
UPDATE [Customer]
SET [RequireReLogin] = 0
WHERE [RequireReLogin] IS NULL
GO
ALTER TABLE [Customer] ALTER COLUMN [RequireReLogin] bit NOT NULL
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'rewardpointssettings.PointsForPurchases_Awarded'
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'rewardpointssettings.PointsForPurchases_Canceled'
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'ordersettings.GiftCards_Activated_OrderStatusId'
GO
--delete setting
DELETE FROM [Setting]
WHERE [name] = N'ordersettings.GiftCards_Deactivated_OrderStatusId'
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.activategiftcardsaftercompletingorder')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.activategiftcardsaftercompletingorder', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.deactivategiftcardsaftercancellingorder')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.deactivategiftcardsaftercancellingorder', N'False', 0)
END
GO
--update a stored procedure
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[LanguagePackImport]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [LanguagePackImport]
GO
CREATE PROCEDURE [dbo].[LanguagePackImport]
(
@LanguageId int,
@XmlPackage xml,
@UpdateExistingResources bit
)
AS
BEGIN
IF EXISTS(SELECT * FROM [Language] WHERE [Id] = @LanguageId)
BEGIN
CREATE TABLE #LocaleStringResourceTmp
(
[LanguageId] [int] NOT NULL,
[ResourceName] [nvarchar](200) NOT NULL,
[ResourceValue] [nvarchar](MAX) NOT NULL
)
INSERT INTO #LocaleStringResourceTmp (LanguageId, ResourceName, ResourceValue)
SELECT @LanguageId, nref.value('@Name', 'nvarchar(200)'), nref.value('Value[1]', 'nvarchar(MAX)')
FROM @XmlPackage.nodes('//Language/LocaleResource') AS R(nref)
DECLARE @ResourceName nvarchar(200)
DECLARE @ResourceValue nvarchar(MAX)
DECLARE cur_localeresource CURSOR FOR
SELECT LanguageId, ResourceName, ResourceValue
FROM #LocaleStringResourceTmp
OPEN cur_localeresource
FETCH NEXT FROM cur_localeresource INTO @LanguageId, @ResourceName, @ResourceValue
WHILE @@FETCH_STATUS = 0
BEGIN
IF (EXISTS (SELECT 1 FROM [LocaleStringResource] WHERE LanguageId=@LanguageId AND ResourceName=@ResourceName))
BEGIN
IF (@UpdateExistingResources = 1)
BEGIN
UPDATE [LocaleStringResource]
SET [ResourceValue]=@ResourceValue
WHERE LanguageId=@LanguageId AND ResourceName=@ResourceName
END
END
ELSE
BEGIN
INSERT INTO [LocaleStringResource]
(
[LanguageId],
[ResourceName],
[ResourceValue]
)
VALUES
(
@LanguageId,
@ResourceName,
@ResourceValue
)
END
FETCH NEXT FROM cur_localeresource INTO @LanguageId, @ResourceName, @ResourceValue
END
CLOSE cur_localeresource
DEALLOCATE cur_localeresource
DROP TABLE #LocaleStringResourceTmp
END
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'paymentsettings.skippaymentInfostepforredirectionpaymentmethods')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'paymentsettings.skippaymentInfostepforredirectionpaymentmethods', N'False', 0)
END
GO
--updated some indexes (required for case sensitive SQL Server collations)
IF EXISTS (SELECT 1 from sys.indexes WHERE [NAME]=N'IX_NewsletterSubscription_Email_StoreId' and object_id=object_id(N'[dbo].[NewsLetterSubscription]'))
BEGIN
DROP INDEX [IX_NewsletterSubscription_Email_StoreId] ON [NewsLetterSubscription]
END
GO
CREATE NONCLUSTERED INDEX [IX_NewsletterSubscription_Email_StoreId] ON [NewsLetterSubscription] ([Email] ASC, [StoreId] ASC)
GO
IF EXISTS (SELECT 1 from sys.indexes WHERE [NAME]=N'IX_Product_ShowOnHomepage' and object_id=object_id(N'[dbo].[Product]'))
BEGIN
DROP INDEX [IX_Product_ShowOnHomepage] ON [Product]
END
GO
CREATE NONCLUSTERED INDEX [IX_Product_ShowOnHomepage] ON [Product] ([ShowOnHomePage] ASC)
GO
--update a stored procedure
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[DeleteGuests]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [DeleteGuests]
GO
CREATE PROCEDURE [dbo].[DeleteGuests]
(
@OnlyWithoutShoppingCart bit = 1,
@CreatedFromUtc datetime,
@CreatedToUtc datetime,
@TotalRecordsDeleted int = null OUTPUT
)
AS
BEGIN
CREATE TABLE #tmp_guests (CustomerId int)
INSERT #tmp_guests (CustomerId)
SELECT [Id] FROM [Customer] c with (NOLOCK)
WHERE
--created from
((@CreatedFromUtc is null) OR (c.[CreatedOnUtc] > @CreatedFromUtc))
AND
--created to
((@CreatedToUtc is null) OR (c.[CreatedOnUtc] < @CreatedToUtc))
AND
--shopping cart items
((@OnlyWithoutShoppingCart=0) OR (NOT EXISTS(SELECT 1 FROM [ShoppingCartItem] sci with (NOLOCK) inner join [Customer] with (NOLOCK) on sci.[CustomerId]=c.[Id])))
AND
--guests only
(EXISTS(SELECT 1 FROM [Customer_CustomerRole_Mapping] ccrm with (NOLOCK) inner join [Customer] with (NOLOCK) on ccrm.[Customer_Id]=c.[Id] inner join [CustomerRole] cr with (NOLOCK) on cr.[Id]=ccrm.[CustomerRole_Id] WHERE cr.[SystemName] = N'Guests'))
AND
--no orders
(NOT EXISTS(SELECT 1 FROM [Order] o with (NOLOCK) inner join [Customer] with (NOLOCK) on o.[CustomerId]=c.[Id]))
AND
--no blog comments
(NOT EXISTS(SELECT 1 FROM [BlogComment] bc with (NOLOCK) inner join [Customer] with (NOLOCK) on bc.[CustomerId]=c.[Id]))
AND
--no news comments
(NOT EXISTS(SELECT 1 FROM [NewsComment] nc with (NOLOCK)inner join [Customer] with (NOLOCK) on nc.[CustomerId]=c.[Id]))
AND
--no product reviews
(NOT EXISTS(SELECT 1 FROM [ProductReview] pr with (NOLOCK) inner join [Customer] with (NOLOCK) on pr.[CustomerId]=c.[Id]))
AND
--no product reviews helpfulness
(NOT EXISTS(SELECT 1 FROM [ProductReviewHelpfulness] prh with (NOLOCK) inner join [Customer] with (NOLOCK) on prh.[CustomerId]=c.[Id]))
AND
--no poll voting
(NOT EXISTS(SELECT 1 FROM [PollVotingRecord] pvr with (NOLOCK) inner join [Customer] with (NOLOCK) on pvr.[CustomerId]=c.[Id]))
AND
--no forum topics
(NOT EXISTS(SELECT 1 FROM [Forums_Topic] ft with (NOLOCK) inner join [Customer] with (NOLOCK) on ft.[CustomerId]=c.[Id]))
AND
--no forum posts
(NOT EXISTS(SELECT 1 FROM [Forums_Post] fp with (NOLOCK) inner join [Customer] with (NOLOCK) on fp.[CustomerId]=c.[Id]))
AND
--no system accounts
(c.IsSystemAccount = 0)
--delete guests
DELETE [Customer]
WHERE [Id] IN (SELECT [CustomerId] FROM #tmp_guests)
--delete attributes
DELETE [GenericAttribute]
WHERE ([EntityId] IN (SELECT [CustomerId] FROM #tmp_guests))
AND
([KeyGroup] = N'Customer')
--total records
SELECT @TotalRecordsDeleted = COUNT(1) FROM #tmp_guests
DROP TABLE #tmp_guests
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'commonsettings.sitemapcustomurls')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'commonsettings.sitemapcustomurls', N'', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'shoppingcartsettings.cartssharedbetweenstores')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'shoppingcartsettings.cartssharedbetweenstores', N'False', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='EmailToRevalidate')
BEGIN
ALTER TABLE [Customer]
ADD [EmailToRevalidate] nvarchar(1000) NULL
END
GO
-- new message template
IF NOT EXISTS (SELECT 1 FROM [dbo].[MessageTemplate] WHERE [Name] = N'Customer.EmailRevalidationMessage')
BEGIN
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
INSERT [dbo].[MessageTemplate] ([Name], [BccEmailAddresses], [Subject], [Body], [IsActive], [AttachedDownloadId], [EmailAccountId], [LimitedToStores], [DelayPeriodId])
VALUES (N'Customer.EmailRevalidationMessage', NULL, N'%Store.Name%. Email validation.', N'' + @NewLine + '%Store.Name%' + @NewLine + '
' + @NewLine + '
' + @NewLine + 'Hello %Customer.FullName%!' + @NewLine + '
' + @NewLine + 'To validate your new email address click here .' + @NewLine + '
' + @NewLine + '
' + @NewLine + '%Store.Name%' + @NewLine + '
' + @NewLine, 1, 0, 0, 0, 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Order]') and NAME='RewardPointsHistoryEntryId')
BEGIN
ALTER TABLE [Order]
ADD [RewardPointsHistoryEntryId] int NULL
END
GO
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Order]') and NAME='RewardPointsWereAdded')
BEGIN
--column RewardPointsWereAdded was replaced with RewardPointsHistoryEntryId
--ensure that the new column value is not null to specify that reward points were added (earned) to an order
EXEC('
UPDATE [Order]
SET [RewardPointsHistoryEntryId] = 0
WHERE [RewardPointsWereAdded] = 1')
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Order]') and NAME='RewardPointsWereAdded')
BEGIN
ALTER TABLE [Order] DROP COLUMN [RewardPointsWereAdded]
END
GO
--update plugin locales (renamed)
UPDATE [LocaleStringResource]
SET [ResourceName] = REPLACE([ResourceName], 'Plugins.Feed.Froogle.','Plugins.Feed.GoogleShopping.')
WHERE [ResourceName] like 'Plugins.Feed.Froogle.%'
GO
--update settings
UPDATE [Setting]
SET [Name] = REPLACE([Name], 'frooglesettings.','googlesShoppingsettings.')
WHERE [Name] like 'frooglesettings.%'
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[ProductTemplate]') and NAME='IgnoredProductTypes')
BEGIN
ALTER TABLE [ProductTemplate]
ADD [IgnoredProductTypes] nvarchar(MAX) NULL
END
GO
UPDATE [ProductTemplate]
SET [IgnoredProductTypes] = '10'
WHERE [ViewPath] = N'ProductTemplate.Simple'
GO
UPDATE [ProductTemplate]
SET [IgnoredProductTypes] = '5'
WHERE [ViewPath] = N'ProductTemplate.Grouped'
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[ReturnRequest]') and NAME='UploadedFileId')
BEGIN
ALTER TABLE [ReturnRequest]
ADD [UploadedFileId] int NULL
END
GO
UPDATE [ReturnRequest]
SET [UploadedFileId] = 0
WHERE [UploadedFileId] IS NULL
GO
ALTER TABLE [ReturnRequest] ALTER COLUMN [UploadedFileId] int NOT NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.returnrequestsallowfiles')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.returnrequestsallowfiles', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.returnrequestsfilemaximumsize')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.returnrequestsfilemaximumsize', N'2048', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[ProductReview]') and NAME='ReplyText')
BEGIN
ALTER TABLE [ProductReview]
ADD [ReplyText] nvarchar(MAX) NULL
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[BlogComment]') and NAME='StoreId')
BEGIN
ALTER TABLE [dbo].[BlogComment]
ADD [StoreId] int NULL
END
GO
DECLARE @DefaultStoreId int
SET @DefaultStoreId = (SELECT TOP (1) Id FROM [dbo].[Store]);
--set default value to store column
UPDATE [dbo].[BlogComment]
SET StoreId = @DefaultStoreId
WHERE StoreId IS NULL
GO
ALTER TABLE [dbo].[BlogComment] ALTER COLUMN [StoreId] int NOT NULL
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'BlogComment_Store' AND parent_object_id = Object_id('BlogComment') AND Objectproperty(object_id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[BlogComment]
DROP CONSTRAINT BlogComment_Store
GO
ALTER TABLE [dbo].[BlogComment] WITH CHECK ADD CONSTRAINT [BlogComment_Store] FOREIGN KEY([StoreId])
REFERENCES [dbo].[Store] ([Id])
ON DELETE CASCADE
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'blogsettings.showblogcommentsperstore')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'blogsettings.showblogcommentsperstore', N'False', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[NewsComment]') and NAME='StoreId')
BEGIN
ALTER TABLE [dbo].[NewsComment]
ADD [StoreId] int NULL
END
GO
DECLARE @DefaultStoreId int
SET @DefaultStoreId = (SELECT TOP (1) Id FROM [dbo].[Store]);
--set default value to store column
UPDATE [dbo].[NewsComment]
SET StoreId = @DefaultStoreId
WHERE StoreId IS NULL
GO
ALTER TABLE [dbo].[NewsComment] ALTER COLUMN [StoreId] int NOT NULL
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'NewsComment_Store' AND parent_object_id = Object_id('NewsComment') AND Objectproperty(object_id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[NewsComment]
DROP CONSTRAINT NewsComment_Store
GO
ALTER TABLE [dbo].[NewsComment] WITH CHECK ADD CONSTRAINT [NewsComment_Store] FOREIGN KEY([StoreId])
REFERENCES [dbo].[Store] ([Id])
ON DELETE CASCADE
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'newssettings.shownewscommentsperstore')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'newssettings.shownewscommentsperstore', N'False', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Vendor]') and NAME='AddressId')
BEGIN
ALTER TABLE [Vendor]
ADD [AddressId] int NULL
END
GO
UPDATE [Vendor]
SET [AddressId] = 0
WHERE [AddressId] IS NULL
GO
ALTER TABLE [Vendor] ALTER COLUMN [AddressId] int NOT NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'customersettings.failedpasswordallowedattempts')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'customersettings.failedpasswordallowedattempts', N'0', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'customersettings.failedpasswordlockoutminutes')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'customersettings.failedpasswordlockoutminutes', N'30', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='FailedLoginAttempts')
BEGIN
ALTER TABLE [Customer]
ADD [FailedLoginAttempts] int NULL
END
GO
UPDATE [Customer]
SET [FailedLoginAttempts] = 0
WHERE [FailedLoginAttempts] IS NULL
GO
ALTER TABLE [Customer] ALTER COLUMN [FailedLoginAttempts] int NOT NULL
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='CannotLoginUntilDateUtc')
BEGIN
ALTER TABLE [Customer]
ADD [CannotLoginUntilDateUtc] datetime NULL
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'fixedorbycountrystateziptaxsettings.countrystatezipenabled')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'fixedorbycountrystateziptaxsettings.countrystatezipenabled', N'False', 0)
END
GO
--rename settings
UPDATE [Setting]
SET [Name] = N'tax.taxprovider.fixedorbycountrystatezip.taxcategoryid' + SUBSTRING(name, 40, len(name))
WHERE [Name] like N'tax.taxprovider.fixedrate.taxcategoryid%'
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='RegisteredInStoreId')
BEGIN
ALTER TABLE [dbo].[Customer]
ADD [RegisteredInStoreId] int NULL
END
GO
declare @DefaultStoreId int;
if ((select count(id) from [dbo].[Store]) = 1)
set @DefaultStoreId = (select top(1) id from [dbo].[Store])
else
set @DefaultStoreId = 0;
--set default value to store column
UPDATE [dbo].[Customer] set [RegisteredInStoreId] = @DefaultStoreId where [RegisteredInStoreId] is NULL
ALTER TABLE [dbo].[Customer] ALTER COLUMN [RegisteredInStoreId] int NOT NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'shippingsettings.considerassociatedproductsdimensions')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'shippingsettings.considerassociatedproductsdimensions', N'True', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'commonsettings.bbcodeeditoropenlinksinnewwindow')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'commonsettings.bbcodeeditoropenlinksinnewwindow', N'false', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'paymentsettings.cancelrecurringpaymentsafterfailedpayment')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'paymentsettings.cancelrecurringpaymentsafterfailedpayment', N'False', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[RecurringPayment]') and NAME='LastPaymentFailed')
BEGIN
ALTER TABLE [RecurringPayment]
ADD [LastPaymentFailed] bit NULL
END
GO
UPDATE [RecurringPayment]
SET [LastPaymentFailed] = 0
WHERE [LastPaymentFailed] IS NULL
GO
ALTER TABLE [RecurringPayment] ALTER COLUMN [LastPaymentFailed] bit NOT NULL
GO
-- new message template
IF NOT EXISTS (SELECT 1 FROM [dbo].[MessageTemplate] WHERE [Name] = N'RecurringPaymentCancelled.CustomerNotification')
BEGIN
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
INSERT [dbo].[MessageTemplate] ([Name], [BccEmailAddresses], [Subject], [Body], [IsActive], [AttachedDownloadId], [EmailAccountId], [LimitedToStores], [DelayPeriodId])
VALUES (N'RecurringPaymentCancelled.CustomerNotification', NULL, N'%Store.Name%. Recurring payment cancelled', N'' + @NewLine + '%Store.Name%' + @NewLine + '
' + @NewLine + '
' + @NewLine + 'Hello %Customer.FullName%,' + @NewLine + '
' + @NewLine + '%if (%RecurringPayment.CancelAfterFailedPayment%) It appears your credit card didn''t go through for this recurring payment (%Order.OrderURLForCustomer%)' + @NewLine + '
' + @NewLine + 'So your subscription has been canceled. endif% %if (!%RecurringPayment.CancelAfterFailedPayment%) The recurring payment ID=%RecurringPayment.ID% was cancelled. endif%' + @NewLine + '
' + @NewLine, 1, 0, 0, 0, 0)
END
GO
-- new message template
IF NOT EXISTS (SELECT 1 FROM [dbo].[MessageTemplate] WHERE [Name] = N'RecurringPaymentFailed.CustomerNotification')
BEGIN
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
INSERT [dbo].[MessageTemplate] ([Name], [BccEmailAddresses], [Subject], [Body], [IsActive], [AttachedDownloadId], [EmailAccountId], [LimitedToStores], [DelayPeriodId])
VALUES (N'RecurringPaymentFailed.CustomerNotification', NULL, N'%Store.Name%. Last recurring payment failed', N'' + @NewLine + '%Store.Name%' + @NewLine + '
' + @NewLine + '
' + @NewLine + 'Hello %Customer.FullName%,' + @NewLine + '
' + @NewLine + 'It appears your credit card didn''t go through for this recurring payment (%Order.OrderURLForCustomer%)' + @NewLine + '
%if (%RecurringPayment.RecurringPaymentType% == "Manual") ' + @NewLine + 'You can recharge balance and manually retry payment or cancel it on the order history page. endif% %if (%RecurringPayment.RecurringPaymentType% == "Automatic") ' + @NewLine + 'You can recharge balance and wait, we will try to make the payment again, or you can cancel it on the order history page. endif%' + @NewLine + '
' + @NewLine, 1, 0, 0, 0, 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Order]') and NAME='CustomOrderNumber')
BEGIN
ALTER TABLE [Order]
ADD [CustomOrderNumber] nvarchar(MAX) NULL
END
GO
UPDATE [Order]
SET [CustomOrderNumber] = [id]
WHERE [CustomOrderNumber] IS NULL
GO
ALTER TABLE [Order] ALTER COLUMN [CustomOrderNumber] nvarchar(MAX) NOT NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.customordernumbermask')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.customordernumbermask', N'{ID}', 0)
END
GO
--new table
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CustomerPassword]') and OBJECTPROPERTY(object_id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[CustomerPassword]
(
[Id] int IDENTITY(1,1) NOT NULL,
[CustomerId] int NOT NULL,
[Password] NVARCHAR (MAX) NULL,
[PasswordFormatId] INT NOT NULL,
[PasswordSalt] NVARCHAR (MAX) NULL,
[CreatedOnUtc] datetime NOT NULL
PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
END
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'CustomerPassword_Customer' AND parent_object_id = Object_id('CustomerPassword') AND Objectproperty(object_id, N'IsForeignKey') = 1)
BEGIN
ALTER TABLE [dbo].CustomerPassword
DROP CONSTRAINT CustomerPassword_Customer
END
GO
ALTER TABLE [dbo].[CustomerPassword] WITH CHECK ADD CONSTRAINT [CustomerPassword_Customer] FOREIGN KEY([CustomerId])
REFERENCES [dbo].[Customer] ([Id])
ON DELETE CASCADE
GO
--move customer passwords into a new table
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and (NAME='Password' or NAME='PasswordFormatId' or NAME='PasswordSalt'))
BEGIN
EXEC('
INSERT INTO [dbo].[CustomerPassword]([CustomerId], [Password], [PasswordFormatId], [PasswordSalt], [CreatedOnUtc])
SELECT [Id], [Password], [PasswordFormatId], [PasswordSalt], [CreatedOnUtc]
FROM [dbo].[Customer]')
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='Password')
BEGIN
ALTER TABLE [Customer] DROP COLUMN [Password]
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='PasswordFormatId')
BEGIN
ALTER TABLE [Customer] DROP COLUMN [PasswordFormatId]
END
GO
--drop column
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Customer]') and NAME='PasswordSalt')
BEGIN
ALTER TABLE [Customer] DROP COLUMN [PasswordSalt]
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'customersettings.unduplicatedpasswordsnumber')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'customersettings.unduplicatedpasswordsnumber', N'4', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'customersettings.passwordlifetime')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'customersettings.passwordlifetime', N'90', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[CustomerRole]') and NAME='EnablePasswordLifetime')
BEGIN
ALTER TABLE [CustomerRole]
ADD [EnablePasswordLifetime] bit NULL
END
GO
UPDATE [CustomerRole]
SET [EnablePasswordLifetime] = 0
WHERE [EnablePasswordLifetime] IS NULL
GO
ALTER TABLE [CustomerRole] ALTER COLUMN [EnablePasswordLifetime] bit NOT NULL
GO
-- new message template
IF NOT EXISTS (SELECT 1 FROM [dbo].[MessageTemplate] WHERE [Name] = N'Service.ContactUs')
BEGIN
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
INSERT [dbo].[MessageTemplate] ([Name], [BccEmailAddresses], [Subject], [Body], [IsActive], [AttachedDownloadId], [EmailAccountId], [LimitedToStores], [DelayPeriodId])
VALUES (N'Service.ContactUs', NULL, N'%Store.Name%. Contact us', N'' + @NewLine + '%ContactUs.Body%' + @NewLine + '
' + @NewLine, 1, 0, 0, 0, 0)
END
GO
-- new message template
IF NOT EXISTS (SELECT 1 FROM [dbo].[MessageTemplate] WHERE [Name] = N'Service.ContactVendor')
BEGIN
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
INSERT [dbo].[MessageTemplate] ([Name], [BccEmailAddresses], [Subject], [Body], [IsActive], [AttachedDownloadId], [EmailAccountId], [LimitedToStores], [DelayPeriodId])
VALUES (N'Service.ContactVendor', NULL, N'%Store.Name%. Contact us', N'' + @NewLine + '%ContactUs.Body%' + @NewLine + '
' + @NewLine, 1, 0, 0, 0, 0)
END
GO
--now vendors have "Manage product reviews" permission
IF EXISTS (
SELECT 1
FROM [dbo].[PermissionRecord]
WHERE [SystemName] = N'ManageProductReviews')
BEGIN
DECLARE @PermissionRecordId INT
SET @PermissionRecordId = (SELECT [Id] FROM [dbo].[PermissionRecord] WHERE [SystemName] = N'ManageProductReviews')
--add it to vendor role by default
DECLARE @VendorCustomerRoleId int
SELECT @VendorCustomerRoleId = Id
FROM [CustomerRole]
WHERE IsSystemRole=1 and [SystemName] = N'Vendors'
IF NOT EXISTS (
SELECT 1
FROM [dbo].[PermissionRecord_Role_Mapping]
WHERE [PermissionRecord_Id] = @PermissionRecordId AND [CustomerRole_Id] = @VendorCustomerRoleId)
BEGIN
INSERT [dbo].[PermissionRecord_Role_Mapping] ([PermissionRecord_Id], [CustomerRole_Id])
VALUES (@PermissionRecordId, @VendorCustomerRoleId)
END
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'taxsettings.taxbasedonpickuppointaddress')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'taxsettings.taxbasedonpickuppointaddress', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'ordersettings.exportwithproducts')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'ordersettings.exportwithproducts', N'True', 0)
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[DiscountRequirement]') and NAME='InteractionTypeId')
BEGIN
ALTER TABLE [DiscountRequirement]
ADD [InteractionTypeId] int NULL
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[DiscountRequirement]') and NAME='ParentId')
BEGIN
ALTER TABLE [DiscountRequirement]
ADD [ParentId] int NULL
END
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[DiscountRequirement]') and NAME='IsGroup')
BEGIN
ALTER TABLE [DiscountRequirement]
ADD [IsGroup] bit NULL
END
GO
UPDATE [DiscountRequirement]
SET [IsGroup] = 0
WHERE [IsGroup] IS NULL
GO
ALTER TABLE [DiscountRequirement] ALTER COLUMN [IsGroup] bit NOT NULL
GO
--add default requirement group for existing requirements
DECLARE cursor_defaultGroup CURSOR FOR SELECT [DiscountId] FROM [DiscountRequirement]
DECLARE @discountId int
OPEN cursor_defaultGroup
FETCH NEXT FROM cursor_defaultGroup INTO @discountId
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (SELECT 1 FROM [DiscountRequirement] WHERE [DiscountId] = @discountId AND [ParentId] IS NULL AND [IsGroup] = 1)
BEGIN
INSERT INTO [DiscountRequirement]
([DiscountId], [DiscountRequirementRuleSystemName], [InteractionTypeId], [ParentId], [IsGroup])
VALUES
(@discountId, 'Default requirement group', 0, NULL, 1);
DECLARE @requirementId int = (SELECT SCOPE_IDENTITY());
UPDATE [DiscountRequirement]
SET [ParentId] = @requirementId, [InteractionTypeId] = NULL
WHERE [DiscountId] = @discountId AND [Id] <> @requirementId
END
FETCH NEXT FROM cursor_defaultGroup INTO @discountId
END
CLOSE cursor_defaultGroup
DEALLOCATE cursor_defaultGroup
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'adminareasettings.useisodatetimeconverterinjson')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'adminareasettings.useisodatetimeconverterinjson', N'True', 0)
END
GO
--new activity type
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'ImportCategories')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'ImportCategories', N'Categories were imported', N'True')
END
GO
--new activity type
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'ImportManufacturers')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'ImportManufacturers', N'Manufacturers were imported', N'True')
END
GO
--new activity type
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'ImportProducts')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'ImportProducts', N'Products were imported', N'True')
END
GO
--new activity type
IF NOT EXISTS (SELECT 1 FROM [ActivityLogType] WHERE [SystemKeyword] = N'ImportStates')
BEGIN
INSERT [ActivityLogType] ([SystemKeyword], [Name], [Enabled])
VALUES (N'ImportStates', N'States and provinces were imported', N'True')
END
GO
--update DownloadActivationType according to the new enum value
UPDATE [Product]
SET [DownloadActivationTypeId] = 0
WHERE [DownloadActivationTypeId] = 1
GO
--new column
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id=object_id('[Currency]') and NAME='RoundingTypeId')
BEGIN
ALTER TABLE [Currency]
ADD [RoundingTypeId] INT NULL
END
GO
UPDATE [Currency]
SET [RoundingTypeId] = 0
WHERE [RoundingTypeId] IS NULL
GO
-- Rounding with 1.00 intervals (The system used in Sweden since 30 September 2010. https://en.wikipedia.org/wiki/Cash_rounding#Rounding_with_1.00_intervals)
UPDATE [Currency]
SET [RoundingTypeId] = 60
WHERE [CurrencyCode] = 'SEK'
GO
ALTER TABLE [Currency] ALTER COLUMN [RoundingTypeId] INT NOT NULL
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'adminareasettings.usericheditorinmessagetemplates')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'adminareasettings.usericheditorinmessagetemplates', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'mediasettings.azurecachecontrolheader')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'mediasettings.azurecachecontrolheader', N'', 0)
END
GO
--add stored procedure for getting category tree
IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[nop_padright]') AND xtype IN (N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[nop_padright]
GO
CREATE FUNCTION [dbo].[nop_padright]
(
@source INT,
@symbol NVARCHAR(MAX),
@length INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
RETURN RIGHT(REPLICATE(@symbol, @length)+ RTRIM(CAST(@source AS NVARCHAR(MAX))), @length)
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[CategoryLoadAllPaged]') AND OBJECTPROPERTY(object_id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[CategoryLoadAllPaged]
GO
CREATE PROCEDURE [dbo].[CategoryLoadAllPaged]
(
@ShowHidden BIT = 0,
@Name NVARCHAR(MAX) = NULL,
@StoreId INT = 0,
@CustomerRoleIds NVARCHAR(MAX) = NULL,
@PageIndex INT = 0,
@PageSize INT = 2147483644,
@TotalRecords INT = NULL OUTPUT
)
AS
BEGIN
SET NOCOUNT ON
--filter by customer role IDs (access control list)
SET @CustomerRoleIds = ISNULL(@CustomerRoleIds, '')
CREATE TABLE #FilteredCustomerRoleIds
(
CustomerRoleId INT NOT NULL
)
INSERT INTO #FilteredCustomerRoleIds (CustomerRoleId)
SELECT CAST(data AS INT) FROM [nop_splitstring_to_table](@CustomerRoleIds, ',')
DECLARE @FilteredCustomerRoleIdsCount INT = (SELECT COUNT(1) FROM #FilteredCustomerRoleIds)
--ordered categories
CREATE TABLE #OrderedCategoryIds
(
[Id] int IDENTITY (1, 1) NOT NULL,
[CategoryId] int NOT NULL
)
--get max length of DisplayOrder and Id columns (used for padding Order column)
DECLARE @lengthId INT = (SELECT LEN(MAX(Id)) FROM [Category])
DECLARE @lengthOrder INT = (SELECT LEN(MAX(DisplayOrder)) FROM [Category])
--get category tree
;WITH [CategoryTree]
AS (SELECT [Category].[Id] AS [Id], dbo.[nop_padright] ([Category].[DisplayOrder], '0', @lengthOrder) + '-' + dbo.[nop_padright] ([Category].[Id], '0', @lengthId) AS [Order]
FROM [Category] WHERE [Category].[ParentCategoryId] = 0
UNION ALL
SELECT [Category].[Id] AS [Id], [CategoryTree].[Order] + '|' + dbo.[nop_padright] ([Category].[DisplayOrder], '0', @lengthOrder) + '-' + dbo.[nop_padright] ([Category].[Id], '0', @lengthId) AS [Order]
FROM [Category]
INNER JOIN [CategoryTree] ON [CategoryTree].[Id] = [Category].[ParentCategoryId])
INSERT INTO #OrderedCategoryIds ([CategoryId])
SELECT [Category].[Id]
FROM [CategoryTree]
RIGHT JOIN [Category] ON [CategoryTree].[Id] = [Category].[Id]
--filter results
WHERE [Category].[Deleted] = 0
AND (@ShowHidden = 1 OR [Category].[Published] = 1)
AND (@Name IS NULL OR @Name = '' OR [Category].[Name] LIKE ('%' + @Name + '%'))
AND (@ShowHidden = 1 OR @FilteredCustomerRoleIdsCount = 0 OR [Category].[SubjectToAcl] = 0
OR EXISTS (SELECT 1 FROM #FilteredCustomerRoleIds [roles] WHERE [roles].[CustomerRoleId] IN
(SELECT [acl].[CustomerRoleId] FROM [AclRecord] acl WITH (NOLOCK) WHERE [acl].[EntityId] = [Category].[Id] AND [acl].[EntityName] = 'Category')
)
)
AND (@StoreId = 0 OR [Category].[LimitedToStores] = 0
OR EXISTS (SELECT 1 FROM [StoreMapping] sm WITH (NOLOCK)
WHERE [sm].[EntityId] = [Category].[Id] AND [sm].[EntityName] = 'Category' AND [sm].[StoreId] = @StoreId
)
)
ORDER BY ISNULL([CategoryTree].[Order], 1)
--total records
SET @TotalRecords = @@ROWCOUNT
--paging
SELECT [Category].* FROM #OrderedCategoryIds AS [Result] INNER JOIN [Category] ON [Result].[CategoryId] = [Category].[Id]
WHERE ([Result].[Id] > @PageSize * @PageIndex AND [Result].[Id] <= @PageSize * (@PageIndex + 1))
ORDER BY [Result].[Id]
DROP TABLE #FilteredCustomerRoleIds
DROP TABLE #OrderedCategoryIds
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'commonsettings.usestoredprocedureforloadingcategories')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'commonsettings.usestoredprocedureforloadingcategories', N'False', 0)
END
GO
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'storeinformationsettings.displayminiprofilerforadminonly')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'storeinformationsettings.displayminiprofilerforadminonly', N'False', 0)
END
GO
--indicating whether to display default menu items
DECLARE @displayMenuItems bit
IF NOT EXISTS (SELECT 1 FROM [Category] where ParentCategoryId=0 and Deleted=0 and Published=1)
set @displayMenuItems = N'True'
ELSE
set @displayMenuItems = N'False'
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displayhomepagemenuitem')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displayhomepagemenuitem', @displayMenuItems, 0)
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displaynewproductsmenuitem')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displaynewproductsmenuitem', @displayMenuItems, 0)
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displayproductsearchmenuitem')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displayproductsearchmenuitem', @displayMenuItems, 0)
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displaycustomerinfomenuitem')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displaycustomerinfomenuitem', @displayMenuItems, 0)
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displayblogmenuitem')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displayblogmenuitem', @displayMenuItems, 0)
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displayforumsmenuitem')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displayforumsmenuitem', @displayMenuItems, 0)
END
--new setting
IF NOT EXISTS (SELECT 1 FROM [Setting] WHERE [name] = N'displaydefaultmenuitemsettings.displaycontactusmenuitem ')
BEGIN
INSERT [Setting] ([Name], [Value], [StoreId])
VALUES (N'displaydefaultmenuitemsettings.displaycontactusmenuitem ', @displayMenuItems, 0)
END
GO