Формирование списка платежных шлюзов для конкретных методов доставки

Платежный шлюзВ одной из статей мы уже рассматривали, как предоставить на выбор только определенные системы оплат для разных магазинов вместо всех доступных. Рекомендуется прочесть ее, перед  тем как приступать к этой, так как тут мы будем ссылаться на некоторые решения, которые уже были описаны.

Проблема

Мы уже установили, что иногда нам необходимы уникальные платежные шлюзы для разных магазинов. Теперь рассмотрим такой случай когда нам необходимо отображать типы оплат не только в зависимости от того какой магазин, а и того какой метод доставки выбран. Давайте рассмотрим конфигурацию наших платежных шлюзов из предыдущей статьи и представим, что у нас есть два метода доставки: POST (Доставка почтовой службой) и STOREDELIVERTY (Самовывоз из магазина). При выборе метода POST мы ожидаем от клиента полной оплаты, после чего отправляем ему товар. При выборе метода доставки STOREDELIVERTY клиент платит за товар в магазине при самовывозе. Следовательно, мы сталкиваемся с похожей проблемой, когда не все типы оплат должны быть доступны для различных методов доставки.  Например, если выбран метод доставки POST, то способ оплаты STORECOLLECT (Оплата в магазине) не должен предлагаться.

Следовательно, для метода доставки POST мы предоставляем только платежные шлюзы PGFR или PGUS, для  STOREDELIVERTY – только STORECOLLECT.

Чтобы это реализовать мы будем использовать пользовательские атрибуты для объекта Shop и установим некую псевдо связь между типами оплат и методами доставок.

Настройка методов доставок

Для начала создадим два «перевозчика» (carrier), у которых буду свои методы доставки (carrierSLA):

  1. Создадим carrier Post
  2. Создадим Post carrier SLA для магазина в США (US) и установим поле GUID — POST_USD
  3. Создадим Post carrier SLA для магазина во Франции (FR) и установим поле GUID — POST_EUR
  4. Создадим carrier Store delivery
  5. Создадим Store delivery carrier SLA для магазина в США (US) и установим поле GUID  — STOREDELIVERTY_USD
  6. Создадим Store delivery carrier SLA для магазина во Франции (FR) и установим поле GUID  — STOREDELIVERTY_USD

Все эти значения могут быть добавлены через редактор YUM (или импортированы из csv) без написания дополнительного кода.

Добавление новых атрибутов для объектов Shop

Теперь, когда все методы доставок введены, мы применим к ним тот же механизм, что и для платежных шлюзов из предыдущей статьи. Однако сейчас мы хотим установить связь между методами доставок (SLA) и способами оплат, поэтому нам понадобится атрибут для каждого SLA.

Мы создадим новые атрибуты для объекта Shop со следующими названиями: PAYMENTGATEWAYS_POST_USD, PAYMENTGATEWAYS_POST_EUR, PAYMENTGATEWAYS_STOREDELIVERY_USD и PAYMENTGATEWAYS_STOREDELIVERY_EUR.  Теперь мы можем добавить лейбы платежных шлюзов в эти атрибуты через редактор YUM. Как и в случае с PAYMENTGATEWAYS, атрибуты для SLA будут принимать значения в виде списка разделенного запятыми (comma separated list). Для магазина SHOPFR значение атрибута PAYMENTGATEWAYS_POST_EUR будет:  «PGFR» (Нет необходимости отображать при выборе доставки методом POST другие типы оплат,  например, STORECOLLECT), для PAYMENTGATEWAYS_STOREDELIVERY_EUR – «STORECOLLECT». По такому же принципу мы заполняем атрибуты для SHOPUS: PAYMENTGATEWAYS_POST_USD – «PGUS», PAYMENTGATEWAYS_STOREDELIVERY_USD – «STORECOLLECT».

Пример кода

Теперь для каждого объекта Shop мы можем запросить наши атрибуты для методов доставок (SLA) и получить список доступных платежных шлюзов. Для этого мы внесем следующие изменения в метод CheckoutPage.createPaymentFragment() для дополнительной обработки списка доступных оплат:

...
finalAttrValueShop aymentGatewaysLabels = ApplicationDirector.getCurrentShop().getAttributeByCode("PAYMENTGATEWAYS");
finalCarrierSla sla = carrierSlaService.findById(orderInfo.getCarrierSlaId());
finalAttrValueShop shippingMethodPaymentGatewaysLabels =ApplicationDirector.getCurrentShop().getAttributeByCode("PAYMENTGATEWAYS_"+ sla.getGuid());

finalList<PaymentGatewayDescriptor> allowedPaymentGateways = paymentModulesManager.getPaymentGatewaysDescriptors(false);
finalString shippingMethodAllowed = shippingMethodPaymentGatewaysLabels !=null&& shippingMethodPaymentGatewaysLabels.getVal()!=null&& shippingMethodPaymentGatewaysLabels.getVal().length()>0? shippingMethodPaymentGatewaysLabels.getVal():null;
finalString shopAllowed = paymentGatewaysLabels !=null&& paymentGatewaysLabels.getVal()!=null&&
paymentGatewaysLabels.getVal().length()>0? paymentGatewaysLabels.getVal():null;

finalIterator<PaymentGatewayDescriptor> itPayments = allowedPaymentGateways.iterator();
while(itPayments.hasNext()){
finalPaymentGatewayDescriptor current = itPayments.next();
finalboolean isShopAllowed =(shopAllowed ==null)||(shopAllowed !=null&& shopAllowed.contains(current.getLabel()));
finalboolean isShippingMethodAllowed =(shippingMethodAllowed ==null)||(shippingMethodAllowed !=null&& shippingMethodAllowed.contains(current.getLabel()));
if(!isShopAllowed ||!isShippingMethodAllowed){
itPayments.remove();
}
}

finalAbstractChoice<PaymentGatewayDescriptor,PaymentGatewayDescriptor> gatewayDescriptorDropDownChoice =
newDropDownChoice<PaymentGatewayDescriptor>(
PAYMENT_FRAGMENT_GATEWAY_CHECKBOX,
newPaymentGatewayDescriptorModel(
newPropertyModel<String>(orderInfo,»paymentGatewayLabel»),
allowedPaymentGateways
),
allowedPaymentGateways){

Как и в случае с типами оплат в предыдущей статье, мы сравниваем типы оплат доступные для конкретного магазина и конкретно выбранного метода доставки с общим списком оплат и убираем из последнего те, которые отсутствуют в нашем списке.

Данное изменение позволяет нам добавлять новые платежные шлюзы, новые методы доставок и с легкостью устанавливать между ними связь используя редактором YUM без написания дополнительного кода.

Реклама

Фильтр платежных шлюзов доступных только для конкретного магазина

Платежный шлюзВ платформе YC все платежные шлюзы общие для всех магазинов (объектов Shop). Это архитектурное решение было принято исходя из того, что, в основном,  все магазины будут иметь стандартный выбор платежных шлюзов. Тем самым, мы также упрощаем весь модуль системы оплат, чтобы он был отделен от других  основных модулей YC, насколько это возможно.

В этой статье мы покажем, как можно с помощью пользовательских атрибутов для объектов Shop указать, какие платежные шлюзы будут доступны для различных магазинов.

Проблема

Рассмотрим такой пример. В платформе YC мы добавили несколько магазинов, каждый из которых направлен на работу с конкретной страной.  Скажем, один магазин на США, другой на Францию. Скорей всего, при выборе оплаты кредитными карточками будет выполняться перенаправление на платежные системы для дальнейшей работы с клиентом по месту жительства. Тогда как способ оплаты в магазине может быть общим.

Итак, кратко о поставленной задаче:

  • 2 магазина: SHOPFR и SHOPUS
  • 3 платежных шлюза: PGFR, PGUS и STORECOLLECT
  • SHOPFR должен предлагать на выбор только: PGFR, STORECOLLECT
  • SHOPUS должен предлагать на выбор только: PGUS, STORECOLLECT

Настройка платежных шлюзов

Первым шагом будет настройках 3-х платежных шлюзов, которые, как было сказано ранее, будут доступны по умолчанию для всех магазинов.

  1. Создайте класс, наследуясь от подходящего класса PaymentGateway, указывая поддерживаемые фичи.
  2. Создайте конфигурационный бин в Spring xml в модуле payment.
  3. Введите необходимые записи параметров TPAYMENTGATEWAYPARAMETER в базе данных yespay.
  4. Добавьте лейбы платежных шлюзов через запятую в атрибут YC_SYSTEM_ACTIVE_PAYMENT_GATEWAYS (или отметьте их в панели оплат в YUM).

Добавление нового атрибута для объектов Shop

Итак, все наши типы оплат доступны для выбора по всем магазинам. Теперь нам нужно указать, какие типы оплат будут доступны для каждого магазина отдельно.

Для этого мы добавим новый атрибут для объектов Shop – PAYMENTGATEWAYS. Атрибут будет принимать значение в виде списка разделенного запятыми (comma separated list). После чего мы можем использовать его через редактор YUM. Для магазина SHOPFR мы внесем значение – «PGFR,STORECOLLECT», для SHOPUS –  «PGUS,STORECOLLECT».

Пример кода

Теперь мы можем запросить наш дополнительный атрибут PAYMENTGATEWAYS и получить список платежных шлюзов для конкретного магазина. Далее внесем изменения в метод CheckoutPage.createPaymentFragment(), где мы добавим дополнительный фильтр для обработки списка оплат.

...
finalAttrValueShop paymentGatewaysLabels =ApplicationDirector.getCurrentShop().getAttributeByCode("PAYMENTGATEWAYS");

finalList<PaymentGatewayDescriptor> allowedPaymentGateways = paymentModulesManager.getPaymentGatewaysDescriptors(false);
finalString shopAllowed = paymentGatewaysLabels !=null&& paymentGatewaysLabels.getVal()!=null&&
paymentGatewaysLabels.getVal().length()>0? paymentGatewaysLabels.getVal():null;

finalIterator<PaymentGatewayDescriptor> itPayments = allowedPaymentGateways.iterator();
while(itPayments.hasNext()){
finalPaymentGatewayDescriptor current = itPayments.next();
finalboolean isShopAllowed =(shopAllowed ==null)||(shopAllowed !=null&&
shopAllowed.contains(current.getLabel()));
if(!isShopAllowed){
itPayments.remove();
}
}

finalAbstractChoice<PaymentGatewayDescriptor,PaymentGatewayDescriptor> gatewayDescriptorDropDownChoice =

newDropDownChoice<PaymentGatewayDescriptor>(
PAYMENT_FRAGMENT_GATEWAY_CHECKBOX,
newPaymentGatewayDescriptorModel(
newPropertyModel<String>(orderInfo,»paymentGatewayLabel»),
allowedPaymentGateways
),
allowedPaymentGateways){

Данный фрагмент кода сравнивает наш список оплат для конкретного магазина с общим списком и убирает из последнего те, которые отсутствуют в нашем списке.

Это все необходимые изменения, остальная часть кода работает корректно.

В этой статье мы рассмотрели некий механизм настройки YC платформы для правильного распределения платежных шлюзов.

Добавление статического контента на сайт

В этой статье мы рассмотрим некоторые варианты обработки контента коммерческой платформы YC.

YC имеет широкий набор функциональных возможностей, которые помогут Вам управлять статическим и динамическим содержанием Вашего сайта. Управление контентом YCне является полноценной CMS – скорее это упрощенная система, чтобы сделать платформу YCмаксимально простой в использовании.

Основы

Контент – это, фактически тоже, что и категория в каталоге.  Для отображения содержимого, контент использует тот же системный объект, что и категория – CategoryEntity. Однако есть несколько важных различий, которые дают возможность управлять этими специальными типами категорий.

Первое отличие, это то, что для каждого экземпляра объекта Shopесть корневой каталог контента, который определяется через Category.guid,  который в свою очередь должен соответствовать Shop.code.  Таким образом, каждый отдельный магазин имеет свою собственную иерархию контента. Структура контента очень схожа со структурой каталога категорий, однако в отличие от категории при редактировании контента будет доступна специальная вкладка для управления содержимым страницы. Содержимое контента это текст, который может быть чем угодно: простой текст, HTML, Groovyкод или другие данные, которые могут быть представлены в виде текста.

Содержимое контента хранится в виде списка атрибутов добавляемых пользователем. Названия атрибутов (коды) должны создаваться в соответствии с правилом: CONTENT_BODY_локаль_порядковый номер (например: CONTENT_BODY_ru_1, CONTENT_BODY_ru_2, CONTENT_BODY_en_1, CONTENT_BODY_en_2 и т.д.).  В YCпо умолчанию добавлены два атрибута для русского и английского языков, каждый из которых может хранить по 4000 символов. Примечательно то, что наполняя эти атрибуты текстом в редакторе YUMпользователю нет необходимости делить текст на куски и разбрасывать его по атрибутам CONTENT_BODY_en_1,  CONTENT_BODY_en_2  и т.д. Весь текст может быть добавлен в первый атрибут, после чего сервис управления контентом определит количество созданных атрибутов и разделит текст контента, если это будет необходимо.  Возможно, Вам потребуется создать еще несколько AttributeEntity объектов, если содержание контента больше 8000 символов, что может быть сделано в системе YUM в разделе управления контентом.

Итак, у нас есть представление об управлении контентом, теперь мы рассмотрим, как мы может это использовать.

Так как контент тоже, что и категория мы можем использовать SEO, название, описание и другие атрибуты, доступные для категорий каталога.  В дополнение к этому ContentService.getContentBody(contentId,locale) вернет содержание конкретного контента в виде строки. По умолчанию YCпредполагает, что содержание контента это HTML и ContentCentralView просто делает его частью страницы.  Однако это наиболее упрощенное использование.

Поскольку объекты контента наследуют переменную uitemplate можно реализовывать более сложные типы страниц.

Галерея изображений

Предположим мы бы хотели создать раздел на сайте, который будет отображать галерею изображений. Для этого мы будем использовать объект Content,  а для uitemplateукажем – imagegallery. Теперь наша категория контента будет представлена в виде галереи изображений. Все подкатегории нашей галереи будут представлены в виде отдельных изображений. Теперь, все что необходимо, это создать новый класс для отображения контента, например ImageGalleryCentralViewи добавить его на HomePage, привязав параметр imagegallery к этому классу. Внутри класса ImageGalleryCentralView мы создадим компоненту Wicketlist, где каждый элемент списка будет представлен в виде кликабельной миниатюры изображения для отдельно взятой подкатегории нашего контента, с использованием, например, lightboxили prettyphoto.

Теперь мы можем создавать объекты контента с uitemplateуказанным как – imagegallery, и добавлять подкатегории с изображениями. В итоге,  у нас есть шаблон для контента – галерея изображений, который мы можем использовать, где пожелаем.

Пример кода реализации галереи изображений

Регистрация класса ImageGalleryCentralView на HomePage:

...
/**
* Registered main panel renderers
*/
private static final Map<String, Class<? extends AbstractCentralView>> rendererPanelMap =
new HashMap<String, Class<? extends AbstractCentralView>>() {{
put(CentralViewLabel.SUBCATEGORIES_LIST, SubCategoriesCentralView.class);
put(CentralViewLabel.PRODUCTS_LIST, ProductsCentralView.class);
put(CentralViewLabel.PRODUCT, SkuCentralView.class);
put(CentralViewLabel.SKU, SkuCentralView.class);
put(CentralViewLabel.SEARCH_LIST, ProductsCentralView.class);
put(CentralViewLabel.CONTENT, ContentCentralView.class);
put(CentralViewLabel.CATEGORY, EmptyCentralView.class);
put(CentralViewLabel.DEFAULT, EmptyCentralView.class);
put("imagegallery", ImageGalleryCentralView.class);
}};
...

Содержимое ImageGalleryCentralView:

import org.apache.lucene.search.BooleanQuery;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.yes.cart.constants.ServiceSpringKeys;
import org.yes.cart.domain.entity.Category;
import org.yes.cart.domain.i18n.I18NModel;
import org.yes.cart.service.domain.ContentService;
import org.yes.cart.web.page.component.AbstractCentralView;
import org.yes.cart.web.support.constants.WebParametersKeys;
import org.yes.cart.web.support.entity.decorator.CategoryDecorator;
import org.yes.cart.web.util.WicketUtil;
import org.yes.cart.web.page.HomePage;
import java.util.ArrayList;
import java.util.List;
public class ImageGalleryCentralView extends AbstractCentralView {

// ----------------------------------- MARKUP IDs BEGIN --------------------------- //
private final static String GALLERY_LIST = "galleryList";
private final static String GALLERY_IMAGE_ZOOM = "galleryImageZoom";
private final static String GALLERY_IMAGE = "galleryImage";
private final static String GALLERY_NAME = "galleryName";
private final static String GALLERY_DESC = "galleryDesc";
private final static String MAIN_IMAGE = "mainImage";
private final static String MAIN_NAME = "mainName";
private final static String MAIN_DESC = "mainDesc";
// ----------------------------------- MARKUP IDs BEGIN --------------------------- //
@SpringBean(name = ServiceSpringKeys.CONTENT_SERVICE)
protected ContentService contentService;
/**
* This is an internal constructor used by HomePage class. It disregards the
* categoryId value.
*
* @param id panel id
* @param categoryId ignored
* @param booleanQuery     boolean query.
*/
public GalleryCentralView(String id, long categoryId, BooleanQuery booleanQuery, List<Long> shopCategories) {
super(id, categoryId, booleanQuery);
final String ctxPath = WicketUtil.getHttpServletRequest().getContextPath();
final String selectedLocale = getLocale().getLanguage();
final String lang = getLocale().getLanguage();
final CategoryDecorator categoryDecorator = getDecoratorFacade().decorate(
getCategory(), WicketUtil.getHttpServletRequest().getContextPath(), getI18NSupport());
final Category parentCategory = contentService.getById(categoryDecorator.getParentId());
final CategoryDecorator categoryParentDecorator = getDecoratorFacade().decorate(
parentCategory, WicketUtil.getHttpServletRequest().getContextPath(), getI18NSupport());
final String i18nName = categoryDecorator.getName(lang);
final String i18nParentName = categoryParentDecorator.getName(lang);
add(new Label("heading", i18nName));
add(new Label("breadcrumb", i18nName));
add(new Label("body", categoryDecorator.getDescription(lang)).setEscapeModelStrings(false));
add(new BookmarkablePageLink<HomePage>("homeLink", HomePage.class));
final PageParameters pageParameters = new PageParameters().add(WebParametersKeys.CONTENT_ID, categoryParentDecorator.getCategoryId());
add(new BookmarkablePageLink<HomePage>("categoryLink", HomePage.class, pageParameters).add(
new Label("breadcrumbParent", i18nParentName)));
// All child content - use this one as it is cached and includes availability!
final List<Category> categories = contentService.getChildContent(categoryId);
CategoryDecorator main = null;
final List<CategoryDecorator> cats = new ArrayList<CategoryDecorator>();
if (categories.size() > 1) {
main = getDecoratorFacade().decorate(categories.get(0), ctxPath, getI18NSupport());
for (final Category category : categories.subList(1, categories.size())) {
cats.add(getDecoratorFacade().decorate(category, ctxPath, getI18NSupport()));
}
} else if (categories.size() == 1) {
main = getDecoratorFacade().decorate(categories.get(0), ctxPath, getI18NSupport());
}
final String contentBody;
if (getCategoryId() > 0l) {
contentBody = contentService.getContentBody(main.getCategoryId(), lang);
} else {
contentBody = "";
}
setVisible(cats.size() > 0);
add(
new ListView<CategoryDecorator>(GALLERY_LIST, cats) {
@Override
protected void populateItem(final ListItem<CategoryDecorator> categoryListItem) {
final CategoryDecorator category = categoryListItem.getModelObject();
final I18NModel nameModel = getI18NSupport().getFailoverModel(category.getDisplayName(), "");
categoryListItem.add(
new ExternalLink(GALLERY_IMAGE_ZOOM, category.getDefaultImage("as", "is")).add(
new ContextImage(GALLERY_IMAGE, category.getDefaultImage("344", "231")).add(
new AttributeModifier("alt", nameModel.getValue(selectedLocale)))
).add(new AttributeModifier("data-rel", "prettyPhoto")
).add(new AttributeModifier("class", "thumb")
).add(new AttributeModifier("title", nameModel.getValue(selectedLocale))));
categoryListItem.add(new Label(GALLERY_NAME, nameModel.getValue(selectedLocale)));
categoryListItem.add(new Label(GALLERY_DESC, category.getDescription(selectedLocale)).setEscapeModelStrings(false));
}
}
);
add(new ContextImage(MAIN_IMAGE, main != null ? main.getDefaultImage("160", "208") : "")
.add(new AttributeModifier("alt", main != null ? main.getName(selectedLocale) : "")));
add(new Label(MAIN_NAME, main != null ? main.getName(selectedLocale) : ""));
add(new Label(MAIN_DESC, main != null ? contentBody : "").setEscapeModelStrings(false));
}
}

Страница Wicket HTML:

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<!-- masthead -->
<div id="masthead">
<span class="head">
<wicket:container wicket:id="heading">[Content name]</wicket:container>
</span>
<ul class="breadcrumbs">
<li><a wicket:id="homeLink"><wicket:message key="home">[Home page]</wicket:message></a></li>
<li>/ <a wicket:id="categoryLink"><wicket:container wicket:id="breadcrumbParent">[Content name]</wicket:container></a></li>
<li>/ <wicket:container wicket:id="breadcrumb">[Content name]</wicket:container></li>
</ul>
</div>
<!-- ENDS masthead -->

<!-- page content -->
<div id="gallery-content">
<div class="featured portfolio-list">
<figure wicket:id="galleryList">
<a wicket:id="galleryImageZoom"><img wicket:id="galleryImage"/></a>
<div class="product-grid">
<h5>
<wicket:container wicket:id="galleryName">
[Name]
</wicket:container>
</h5>
<div class="description"><wicket:container wicket:id="galleryDesc">[Description]</wicket:container></div>
</div>
</figure>
</div>
</div>
<!-- ENDS page content -->
<!-- sidebar -->
<aside id="gallery-sidebar">
<div class="block">
<h4><wicket:container wicket:id="mainName">[Name]</wicket:container></h4>
<ul>
<li>
<img wicket:id="mainImage"/>
</li>
</ul>
</div>
<div class="block justify">
<wicket:container wicket:id="mainDesc">[Description]</wicket:container>
</div>
</aside>
<div class="clearfix"></div>
<!-- ENDS sidebar -->
</wicket:panel>
</body>
</html>

Динамические данные

Предположим, мы хотим использовать некоторые динамические данные. Мы можем вставить Groovyкод в содержимое нашего контента. Создать еще одну страницу отображения контента, которая использует GStringTemplateEngine для разбора содержимого контента как groovyкод, и рендерить HTMLкоторый будет содержать динамические данные, такие как товары, категории и другие.

Пример разбора Groovy кода:

...
final GStringTemplateEngine templateEngine = new GStringTemplateEngine(classLoader);
...
final String contentBody = contentService.getContentBody(contentId,locale);
// Map contain all object that are rendered within template
final Map<String, Object> model = ... ;
...
final Writable writable = templateEngine.createTemplate(contentBody).make(model);
final StringWriter stringWriter = new StringWriter();
writable.writeTo(stringWriter);
stringWriter.close();
final String htmlToRender = stringWriter.toString();
...

Другие решения

Создание новых страниц отображения контента довольно простое и позволяет создавать конкретные шаблоны. Как было показано на примере, если мы знаем GUIDконтента,  мы можем получить его содержимое с помощью ContentService.getContentBody(). Также возможно создание специализированного контента с конкретно определенными GUID для использования в шаблонах страниц (например «Контакты»). Эти элементы контента могут быть использованы в шаблонах как коллаж, что позволит изменять отдельные части страницы, либо для добавления дополнительных разделов к существующим страницам (Поиск, Страницы категорий и товаров).

Заключение

YC предлагает Вам простой подход, где Вы принимаете решения. Расширяйте функциональность платформы по мере необходимости и затрачивайте минимум времени на разработку. После того как все необходимые шаблоны будут созданы, Вы можете использовать их при работе с контентом в менеджере YUM, просто указав параметр для uitemplate для нужных контент категорий, что не требует никакой дополнительно разработки.

Надеемся, эта статься дала Вам общее представление, о том, как управлять контентом в Вашей YCплатформе.

 

Yes-Cart официальный информационный бюллетень.

Yes-Cart официальный информационный бюллетень


1.  Yes-Cart платформа электронной коммерции и ее основные цели

 

В последнее десятилетие электронная коммерция значительно выросла и начала занимать серьезную нишу в качестве одного из каналов продаж. Хорошим примером могут служить Amazon и EBay.

Онлайновые покупки стали частью повседневной жизни для множества людей, поэтому компании, которые стремятся приобрести новых покупателей, улучшить обслуживание существующих и увеличить свои продажи, должны достаточно серьезно относиться к онлайн бизнесу.

Yes-Cart – это идеальная платформа для бизнеса, желающего увеличить свои продажи и прибыль через каналы интернет и мобильной связи. Yes-Cart предоставляет функциональность для:

  • Управления информации о продуктах
  • Поисковой оптимизации
  • Организации многоканальных продаж
  • Управления заказами
  • Управления складами и товарными остатками
  • Управления доставкой
  • Интеграции с платежными системами

Все это создано с использованием платформы Java и SOA подхода, что дает возможность использовать платформу целиком, либо ее отдельные компоненты.

Конечно Вы можете найти множество альтернатив, которые имеют аналогичные обещания. Так что—же действительно делает Yes-Cart продуктом отличным от других, как Yes-Cart выполняет свои обещания и как охватывает требования бизнеса? Ответы – ниже.

Потребности/проблемы бизнеса Yes-Cart функциональность 
Разрозненная информационная инфраструктура 
    Существующие разрозненные сайты для продаж, или отсутствие таковых.Плохая интеграция продаж с отделами маркетинга, бухгалтерией, доставки.Эти два фактора создают некоторые трудности для организации эффективных продаж     Yes-Cart предоставляет возможность управления несколькими магазинами одновременно при помощи административного приложения с учетом маркетинговых потребностей и тесного взаимодействия между функциями продаж, оплаты, выполнения заказа и отгрузки товара.
Брендирование
    Брендирование множества магазинов требует серьезных усилий. С учетом многоканальных продаж может привести к рассогласованию информации.     Предоставляется возможность организации мультибрендовости (multitenancy) на бизнес и технологическом уровне с возможностью совместного использования необходимых данных: покупатели, товары и т.д.
Управление сайтом и контентом
    Для управление сайтом и контентом приходится нанимать профессионалов со специальными навыками?     Yes-Cart административная панель предоставляет дружественный пользовательский интерфейс для полноценного управления контентом, с учетом потребностей поисковой оптимизации — CEO
Поддержка многоканальных продаж
    Растущий сегмент мобильных устройств требует адаптации существующих сайтов для учета специфики отображения и навигации.     Yes-Cart легко адаптируется для поддержки мобильных устройств.
Поиск и навигация товаров
    Около 95% процентов покупок создаются поисковыми запросами. Большинство e-commerce платформ предлагают просмотр категорий и простой поиск по точному поисковому критерию.     Yes-Cart платформа использует функциональность полнотекстового поиска Lucene для навигации по товарам, что включает в себя следующие возможности поиска и фильтрации:

  • По атрибутам продукта
  • Производителям
  • Ценам
  • Категориям
  • и т.д.

Поиск производится с применением нечеткой логики с дальнейшим упорядочиванием по релевантности, что дает возможность показывать сходные продукты, для увеличения конверсии просмотров в заказы.

Поисковые оптимизации CEO 
     В некоторых платформах возможности CEO ограничены, т.к. необходимо содержат обязательные параметры для навигации в адресной строке (URL)     Yes-Cart дает возможность полноценно конфигурировать URL и генерировать поисковые тэги внутри страниц. Yes-Cart так-же предоставляет механизм CEO оптимизаций для изображений.
Гибкая структура каталога
    Множество систем предлагают всего один каталог, что является ограничением.     Yes-Cart предлагает механизм, при котором структура каталога с товарами не является жесткой. Можно присоединять к магазину категории каталога в любом порядке. С учетом мультибрендовости это является неоспоримым преимуществом.
 
Создание заказа 
    Достаточно сложная задача, которая включает в себя резервирование товара, оплату, работу с различными типами доступности товара.      Yes-Cart предоставляет событийный механизм для управления циклом создания заказа, который позволяет контролировать все стадии заказа.
Платежные шлюзы
     Множество систем предлагают интеграцию с различными платежными шлюзами и процессорами.     В Yes-Cart интеграция с платежными шлюзами и процессорами реализована в виде отдельного модуля и позволяет добавлять новые платежные системы независимо от платформы. Yes-Cart поддерживает основные платежные шлюзы с учетом рынка СНГ: PayPal, PayFlow, Cybersource, Authorize.Net, LiqPay и многие другие.
Интернационализация
    В большинстве случаев интернационализация сайтом поддерживается только на презентационном уровне.     Yes-Cart поддерживает интернационализацию данных – наименование и описание продуктов, категорий, атрибуты продуктов и т.п. Презентационный уровень позволяет не только локализировать текстовые сообщения, но и полностью иметь собственное оформление для каждого языка.
Авторизация и аутентификация
    Обычный уровень авторизации предлагаемый другими системами это администрирование со всеми правами.     Yes-Cart предлагает ролевую авторизацию, что дает возможность ограничивать функциональность для определенных ролей, так например маркетолог никогда не сможет управлять заказами или платежными системами.
Стоимость
    Стоимость продукта и стоимость владения продуктом могут серьезно варьироваться для различных платформ. Некоторые платформы стартовали как простые магазинчики на PHP и обросли по ходу своей эволюции наследием, которое тяжело понять, поддерживать и модифицировать.     При разработке Yes-Cart мы старались делать все просто, понятно и эффективно.  Были использованы проверенные библиотеки, которые стали стандартом, такие как Spring, Hibernate, Lucene, EhCache, Flex, Wicket.Использование широко известных библиотек и распространение Java, гарантирует наличие специалистов, которые смогут произвести необходимые модификации для Yes-Cart. Yes-Cart распространяется бесплатно с лицензией Apache 2.0, которая позволяет использовать и модифицировать продукт в соответствии с требованиями бизнеса.
Интеграция
    Интеграция достаточно сложный процесс, который подразумевает совместное использование данных различными бизнес процессами.     Yes-Cart построен с использованием Spring, что позволяет легко представить Yes-Cart как набор web сервисов, для использования в качество одного из SOA компонентов. Также Yes-Cart предоставляет возможность импорта данных, представленных в табличной форме.

Это всего лишь несколько преимуществ Yes-Cart, которые помогут Вашему бизнесу для достижения успешных продаж.

Одна из главных целей Yes-Cart делать все просто и эффективно, что достигается использованием индустриальных стандартов и лучших практик из e-commerce.

Мы знаем, что каждый бизнес является уникальным, по этой причине команда, разработчиков намеревается добавлять только тот функционал, который действительно нужен и не перегружать продукт ненужными конфигурациями и возможностями.

2.  Аспекты функционирования

Аспект функционирования — это определенная функциональность или составная части Yes-Cart платформы которые предназначены для организации продаж в соответствии с бизнес требованиями.

Каждый аспект интегрирует процессы, поведение системы, пользовательские интерфейсы для покупателей и внутренних бизнес пользователей. Yes-Cart учитывает наиболее востребованные конфигурации и позволяет легко добавить новую функциональность для учета специфики того или иного бизнеса.

 

2.1.       Функциональность для осуществления продаж

 

Основная функциональность заключается в предложения товаров и сервисов в интернете, принятия оплаты за заказы и оформлении з    аказов. Может быть представлен одним или несколькими магазинами, в зависимости от требований бизнеса. Все магазины управляются единым административным приложением Yes-Cart Update Manager (YUM).

Электронный магазин

Электронный магазин, представляет собой веб приложение, которое позволяет продавать товары и услуги непосредственно покупателю. Процесс продаж вовлекает сразу несколько функциональных аспектов.

Поиск и показ продуктов.

Поиск продуктов наиболее востребованной функционал для покупателей, Yes-Cart предоставляет широкие возможности для поиска. Продукт может быть найден путем просмотра каталога, поиска по словам, поиск по меткам продукта, по атрибутам продукта, производителю, цене. Поиск по словам производится с учетом неправильного описания и возможных ошибок покупателя при вводе поисковой фразы.

Так-как Yes-Cart использует полнотекстный поиск от Lucene, то имеется возможность влиять на порядок выдачи результатов поиска с учетом бизнес интересов и релевантности.

Рекомендации продуктов и ассоциации.

Yes-Cart предоставляет возможность для связывания продуктов между собой. Ассоциации могут быть различного типа:

  • Аксессуары
  • Расходные материалы
  • Перекрестные продажи (Cross sell)
  • Сходные продукты с более высокими ценами (Up sell)
  • Похожие продукты

Связанные продукты могут быть показаны в любом месте магазина покупателю для альтернативы выбора и максимизации продаж.

Информация о покупателе

Покупатель имеет возможность регистрации, управления персональной информацией просмотра истории заказов, состояние заказа и т.п. Такая информация может быть легко расширена для организации программы лояльности или персонализированных промо акций.

Создание заказа

Процесс создания заказа включает в себя несколько шагов для сбора информации о продукте, его модификации, адресов для выставления счета и доставки продукта, форме и методах оплаты заказа. Жизненный цикл заказа легко контролируется и может быть изменен для отображения специфики бизнеса.

 

Административное приложение (YUM)

Управление информацией о продуктах и каталогом продуктов.

YUM даёт возможность управлять структурой каталога, его содержимым, информацией о продуктах, ассоциациями продуктов и т.п. Это может быть осуществлено через интерфейс пользователя (GUI) или через процедуру импорта. Каждая категория может быть сконфигурирована для отображения продуктов в наиболее удобном виде. Продукты могут быть показаны в одной или нескольких категориях, например телевизор может находится в категории новые поступления и телевизоры.

Управление покупателями.

YUM позволяет управлять информацией о покупателе, просматривать историю заказов. Возможно совместное использование базе данных о покупателях из нескольких магазинов, это дает возможность убрать двойную регистрацию, ускорить процесс создания заказа в случаях управления множеством магазинов.

Управление поисковой конфигурацией.

Управление поисковой конфигурацией осуществляется через GUI и дает возможность определять список атрибутов, по которым осуществлять поиск, наряду с поиском по наименованию и описанию продукта. Также возможно указать список атрибутов типа продукта, по которым осуществлять поиск похожих продуктов.

Управление платежными шлюзами.

Все платежные шлюзы могут быть сконфигурированы через GUI. Типы платежных шлюзов могут влиять на жизненный цикл заказа, например оплата через курьера или оплата по банковской карточке.

Управление заказами.

YUM дает возможность полностью контролировать жизненный цикл заказа, начиная от создания и заканчивая доставкой. YC предоставляет возможность корректирования заказа из YUM службой поддержки.

Маркетинг

На данный момент YUM дает возможность определять различные цены для распродаж и оптовых покупок. В последующих версиях маркетинговый функционал будет значительно расширен.

2.2.       Бизнес функциональность

 

Бизнес функциональность представляет пользователям управлять данными о продуктах, покупателях и их заказах и т.д.

YUM центральный компонент для создания, конфигурирования и осуществления всех бизнес активностей. Доступ к определенной функциональности административного приложения осуществляется согласно выданных пользователю ролей, например служба поддержки сможет просматривать пользовательские заказы, но не сможет управлять остатками продуктов на складах.

Ключевые возможности YUM.

Управление бизнес пользователями и безопасностью

            Данная функциональность позволяет управлять учетными записями бизнес пользователями и их правами, через добавление определенных ролей. Yes-Cart предлагает «из коробки» несколько ролей. Набор ролей может быть расширен, каждой роли можно предоставить доступ только к определенной функциональности административного приложения.

Управление каталогом и продуктами

YUM предоставляет полный доступ к каталогу и продуктовой информации.

Управление складскими остатками

Управление складскими остатками осуществляется через соответствующий интерфейс пользователя. Каждый магазин может работать с одним или несколькими складами. Для обычных товаров их доступность товара в магазине будет определяться наявностью на складе.

Для быстрой синхронизации товарных остатков можно использовать механизм импорта, если одновременно осуществляются онлайн и офлайн продажи одновременно.

Маркетинговые активности

Маркетинговая секция в YUM предоставляет доступ к прайс листам, управлению скидками и маркетинговыми компаниями.

Скидки для распродаж реализуются через механизм временных прайс листов, каждый из которых может иметь даты действия. Yes-Cart магазин автоматически вычисляет актуальные цены. Цена в каждом магазине рассчитывается исходя из действующего прайс листа и кол-ва покупаемых товаров.

Прайс листы являются эффективным механизмом для предоставления B2B функциональности.

Управление доставкой

YUM позволяет конфигурировать доступные методы доставки товара и их цены в зависимости от дальности, региона, веса, объема и других показателей.

Управление платежными шлюзами

Все платежные шлюзы могут быть сконфигурированы через GUI. Типы платежных шлюзов могут влиять на жизненный цикл заказа, например оплата через курьера или оплата по банковской карточке. На данный момент поддерживаются основные платежные шлюзы и платежные системы: Authorize.Net, CyberSource, PayPal, Pay Flow, LiqPay и оплата через курьера. Полноценный API делает интеграцию новых платежных шлюзов быстрой и эффективной.

Покупатели и их заказы.

YUM дает полную возможность      д для управления покупателями, их персональной информацией, просмотр истории заказов. Вся информация по заказам покупателя доступна для просмотра. Управление текущими заказами дает полный контроль на ними, начиная от простого выполнения заказа и его отгрузки, заканчивая такими не тривиальными задачами как отмена заказа с возвратом денежных средств, редактирование уже созданного заказа, разбиение заказа на несколько заказов и доставок.

2.3.       Наполнение и оформление

Наполнение и оформление магазинов можно разделить на две части – бизнес данные и визуальное оформление.

Бизнес данные

К основным бизнес данным следует отнести описание продуктов, описание их атрибутов и характеристик, принадлежность к тому или иному типу продуктов, доступность товара. Расположение продукта в той или иной категории. Атрибуты и группы атрибутов весьма важны для организации удобной навигации по продуктам.

Важным аспектом является локализация всех вышеперечисленных характеристик в случае, если необходимо поддерживать несколько языков одновременно. Yes-Cart поддерживает локализацию на уровне базы данных и презентационном уровне.

Оформление

Оформление или темы магазина являются важным фактором для создания имиджа магазина, правильной подачи товара и родуктам.ны для организации удома важны для организации удабной навигации по ко языков одновременно. контроль на ними, начиная удобства покупателя при навигации и оформлении заказа.

Тема представляет собой набор html компонент, которые представляют целую страницу или ее часть. Для удобства темы могут быть унаследованы от существующей, что дает уникальную возможность изменять всего небольшую часть компонент, пример создание специальное темы для — Нового Года.

3.   Технические детали

3.1.       Обозрение

Эффективность и новизна.

Технологии не стоят на месте и постоянно развиваются, делая решение сложных задач проще. Yes-Cart включает в себя новые версии продуктов и библиотек, которые прошли проверку временем. Отсутствие предыдущих версий продукта, делает его простым и эффективным.

Ядро системы построено с использованием библиотеки Spring 3.1, которая является стандартом де-факто для построения приложений на Java. Yes-Cart так-же использует Spring Security модуль, для построения системы безопасности.

Доступ к базе данных осуществляется с при помощи Hibernate 4.1. Интеграция с Hibernate Search, который эффективно использует полнотекстный поиск Lucene 3.6 дает уникальные возможности для организации поиска товаров и навигации по атрибутам.

Веб часть сделана при помощи Apache Wicket 1.5. Административное приложение (YUM) построена с использованием Apache Flex & Blaze DS.

Активно используется EhCache для увеличения производительности системы.

Все утилитарные необходимости покрываются использованием Apache Commons библиотеками.

Широко используемые и проверенные технологии.

Команда разработчиков выбрала Spring, Hibernate, Lucene, Ehcache, Wicket & Flex по нескольким критериями – технологии проверенные годами, хорошо поддерживаются сообществом программистов, широко используются. Популярность этих библиотек, делает Yes-Cart легким для модификации и поддержки.

Простота изменения.

Yes-Cart позволяет с уверенностью вносить в нее изменения, т.к. была разработана с использованием методологии разработки TDD, при которой производится максимальное покрытие кода юнит тестами.

Производительность.

Yes-Cart была разработана с учетом высокой нагрузки на сайты электронной коммерции. Команда разработчиков использовала SOA подходы и активно применяла технологии кеширования данных и страниц.

3.2.       SOA подход

SOA подход применялся при разработке Yes-Cart, что позволило выделить бизнес сервисы и в дальнейшем их активно переиспользовать во всех частях системы. Сервисный уровень содержит бизнес логику, которая применяется для работы с доменными и DTO объектами. DTO объекты предназначены для более удобной работы с доменными объектами на стороне YUM и магазина.

Факт использования SOA очень важен, так как позволяет построить модульную систему, которую легко модифицировать, сопровождать и развивать. Каждый бизнес сервис предоставляет логическую законченную функциональность по обработке данных с поддержкой транзакций, безопасности и четко определенными границами ответственности. Эти сервисы могут быть легко собраны в композицию для работы в приложениях YUM и магазин. Так же это дает возможность легко строить свои собственные сервисы на базе уже существующих, для отображения той или иной специфики бизнеса, например построение B2B магазинов, которые несколько отличаются от B2C.

3.3.       Использование MCV архитектуры для построения магазина.

Веб часть магазина наиболее подвержена изменениям. Эти изменения предназначены для представления товаров и услуг в соответствии с требованиями бизнеса. Использование MVC подходя позволяет изменять только необходимый уровень – презентационный, не затрагивая логику обработки и/или данные.

Презентационный уровень построен с использованием Apache Wicket, который предоставляет гибкий механизм html шаблонов, без включения в них специфических скриптов. Yes-Cart расширил функциональность библиотеки Wicket для предоставления гибких тем для оформления магазина. Тема, это не только набор Wicket компонентов, html и css файлов, но и динамическое определение правильного шаблона и его места расположения.

Механизм тем позволяет быстро создавать новые магазины и/или изменять существующие без особых затрат.

3.4.       Интеграция.

Команда разработчиков Yes-Cart прекрасно понимает, что каждый бизнес уникален и у каждого бизнеса существует потребность в интеграции платформы электронной коммерции с уже существующими процессами и программным обеспечением.

SOA подход гарантирует, что каждая бизнес функция или сервис могут быть расширены, изменены, интегрированы для участия в сложных бизнес процессах. Четкое и простое определение бизнес функциональность, позволяет легко представить Yes-Cart функциональности как набор веб сервисов, что позволяет легко интегрироваться.

4.   Что делать? С чего начать? К кому обратиться?

Если Вы заинтересованы более детальной информации о Yes-Cart, то обратитесь к полноценному руководству. Там Вы сможете найти идеи и подсказки как Вы можете использовать нашу платформу.

Команда ответит на Ваши вопросы. Не стесняйтесь их задавать.

Мы настоятельно рекомендуем для начала установить демонстрационный сайт для Windows & Linux. После установки демонстрационного сайта Вы сможете быстро ознакомиться с существующей функциональностью.

Для более полноценного использования Yes-Cart, Вы можете скачать исходные тексты, модифицировать согласно собственных нужд и использовать.

Не забывайте, что новая версия Yes-Cart будет содержать огромное количество новой функциональности. Дайте нам знать, что является важным для Вас. Задавайте вопросы, мы всегда ответим.

5.   Ссылки и ресурсы.


YC-v-1-0-0-White-Paper-ru

Yes-Cart обозрение часть 1

yes-logo64x64

Yes-Cart обозрение часть 1

Yes-Cart  платформа для электронной коммерции, которая включает в себя следующую функциональность:

  • Управление продуктами
  • Управление каталогами
  • Складской учет, в минимальном объеме
  • Управление ценами и ценообразованием
  • Электронный магазин с поддержкой множества представлений
  • Интеграция с платежными системами начиная от широко известных PayPal и заканчивая LiqPay
  • Импорт/экспорт
  • Управление списком покупателей.
  • Заказы
  • И т.д.

Распространяется абсолютно  бесплатно под лицензией Apache 2.0.  , все исходные коды доступны здесь — https://code.google.com/p/yes-cart/

Стек используемых технологий достаточно стандартен — Java, Spring, Hibernate, Lucene, Apache Wicket , Flex, Blaze DS.  Легко интегрируется с существующими системами.

Статус проекта — активная разработка и подготовка к первому релизу.  Полноценную установку можно скачать здесь https://code.google.com/p/yes-cart/downloads/list . Выбирайте наиболее свежую.