drupal commerce 2.x drupalcamp london 2015

65
DRUPAL COMMERCE 2.X DRUPAL CAMP LONDON 2015 Presented by David Kitchen / @dwkitchen

Upload: david-kitchen

Post on 16-Jul-2015

92 views

Category:

Internet


2 download

TRANSCRIPT

Page 1: Drupal Commerce 2.x DrupalCamp London 2015

DRUPAL COMMERCE 2.XDRUPAL CAMP LONDON 2015

Presented by David Kitchen / @dwkitchen

Page 2: Drupal Commerce 2.x DrupalCamp London 2015

INTRODUCTIONS

Page 3: Drupal Commerce 2.x DrupalCamp London 2015

DAVID KITCHEN

Page 4: Drupal Commerce 2.x DrupalCamp London 2015

Technical Lead for Commerce Guys UKTax specialist and Commerce Contributor

Page 5: Drupal Commerce 2.x DrupalCamp London 2015

DRUPAL COMMERCE 2.X CO-MAINTAINERS

Page 6: Drupal Commerce 2.x DrupalCamp London 2015

Bojan Zivanovic (bojanz) and Ryan Szrama (rszrama)

Page 7: Drupal Commerce 2.x DrupalCamp London 2015

Our vision is for Drupal Commerce to be the number oneopen source e-commerce platform in the world...

Powering truly flexible e-commerce.

Page 8: Drupal Commerce 2.x DrupalCamp London 2015

DRUPAL COMMERCE 1.XA brief history.

Page 9: Drupal Commerce 2.x DrupalCamp London 2015

BUILT FROM SCRATCH ON DRUPAL 7

Page 10: Drupal Commerce 2.x DrupalCamp London 2015

MINIMALISTIC AND FLEXIBLE

Page 11: Drupal Commerce 2.x DrupalCamp London 2015

USES VIEWS FOR ALL LISTINGS

Page 12: Drupal Commerce 2.x DrupalCamp London 2015

USES RULES FOR BUSINESS LOGIC

Page 13: Drupal Commerce 2.x DrupalCamp London 2015

RELIES ON "ESSENTIAL CONTRIBS" AND DISTRIBUTIONS TOCOMPLETE THE EXPERIENCE

Page 14: Drupal Commerce 2.x DrupalCamp London 2015

WE'RE DOING SOMETHING RIGHT...

Page 15: Drupal Commerce 2.x DrupalCamp London 2015

SYMFONY PHP LIBRARIES

Page 16: Drupal Commerce 2.x DrupalCamp London 2015

WE* STARTED WITH RESEARCH*Led by Bojan Zivanovic.

Define the deficiencies in our own softwareExisting */money librariesSonata / Sylius e-commerce bundlesNon-Symfony PHP applicationsNon-PHP applications

Page 17: Drupal Commerce 2.x DrupalCamp London 2015

IDENTIFYING OUR WEAKNESSESAge old tax management issuesIncomplete price management APIIncomplete currency formatting rulesAddress implementation stretched to the limitLimited ability to collaborate outside of Drupal

Page 18: Drupal Commerce 2.x DrupalCamp London 2015

PROPOSING STANDALONE SOLUTIONSInternationalization (esp. currency formatting)Address formatting / validationTerritory grouping (to support taxing)Tax rate management (at least for VAT)Price calculation and manipulation

Page 19: Drupal Commerce 2.x DrupalCamp London 2015

Not just interfaces / classes but unprecedented data.also

Page 20: Drupal Commerce 2.x DrupalCamp London 2015

Minimal dependencies.

Page 21: Drupal Commerce 2.x DrupalCamp London 2015

Simple APIs with clear documentation and examples.

Page 22: Drupal Commerce 2.x DrupalCamp London 2015

Full test coverage.

Page 23: Drupal Commerce 2.x DrupalCamp London 2015

Reusable by any PHP based e-commerce application.

Page 24: Drupal Commerce 2.x DrupalCamp London 2015

INTLNumber Formatter, inspired by intl.CurrenciesCountriesLanguages

COMING SOON

Date Formatting

Drupal Commerce blog.

Page 25: Drupal Commerce 2.x DrupalCamp London 2015

CURRENCY HANDLING

$ ¢ £ p ¥ ₤ ₧ € ₹ ₩ ₴ ₯ ₮ ₲ ₳ ₵ ₭ ₪ ₫

Page 26: Drupal Commerce 2.x DrupalCamp London 2015

CURRENCY FORMATTING

€12,345.99

12 345,99 €

12.345,99 €

د.إ. ۹۹۹٫۹۹

Page 27: Drupal Commerce 2.x DrupalCamp London 2015

PRICINGA price is a value object. Each operation (add, subtract,

multiply, divide, round) produces a new price instance. Allamounts are passed as strings, and manipulated using

bcmath.

Page 28: Drupal Commerce 2.x DrupalCamp London 2015

CREATING PRICES

use CommerceGuys\Intl\Currency\CurrencyRepository;use CommerceGuys\Pricing\Price;

$currencyRepository = new CurrencyRepository;$currency = $currencyRepository­>get('EUR');

$firstPrice = new Price('99.99', $currency);$secondPrice = new Price('100', $currency);$thirdPrice = new Price('20.307', $currency);

Page 29: Drupal Commerce 2.x DrupalCamp London 2015

PRICE OPERATIONS

// Every operation produces a new Price instance.$total = $firstPrice­>add($secondPrice)­>subtract($thirdPrice)­>multiply('4')­>divide('2');echo $total; // 359.366 EURecho $total­>round(); // 359.37 EURecho $total­>round(Price::ROUND_HALF_UP, 1); // 359.4 EURecho $total­>greaterThan($firstPrice); // true

Page 30: Drupal Commerce 2.x DrupalCamp London 2015

CURRENCY CONVERSION

use CommerceGuys\Intl\Currency\CurrencyRepository;use CommerceGuys\Pricing\Price;

$currencyRepository = new CurrencyRepository;$eur = $currencyRepository­>get('EUR');$usd = $currencyRepository­>get('USD');

// Use an external library to get an actual exchange rate.$rate = 1;$eurPrice = new Price('100', $eur);$usdPrice = $eurPrice­>convert($usd, $rate);echo $usdPrice;

Page 31: Drupal Commerce 2.x DrupalCamp London 2015

CURRENCY FORMATTING

use CommerceGuys\Intl\Currency\CurrencyRepository;use CommerceGuys\Intl\NumberFormat\NumberFormatRepository;use CommerceGuys\Intl\Formatter\NumberFormatter;use CommerceGuys\Pricing\Price;

$currencyRepository = new CurrencyRepository;$currency = $currencyRepository­>get('USD');$price = new Price('99.99', $currency);

$numberFormatRepository = new NumberFormatRepository;$numberFormat = $numberFormatRepository­>get('en­US');

$currencyFormatter = new NumberFormatter($numberFormat, NumberFormatter::CURRENCY);echo $currencyFormatter­>formatCurrency($price­>getAmount(), $price­>getCurrency());

Page 32: Drupal Commerce 2.x DrupalCamp London 2015

ADDRESSINGAddress formats for 200 countriesSubdivisions (administrative areas, localities, dependentlocalities) for 40 countriesSubdivision translations for all of the parent country's (i.eCanada, Switzerland) official languages.Validation (via Symfony Validator)Form generation (via Symfony Form)Postal formatting

Featured on the Drupal Commerce blog.

Page 33: Drupal Commerce 2.x DrupalCamp London 2015

ADDRESS DATA

use CommerceGuys\Addressing\Repository\AddressFormatRepository;use CommerceGuys\Addressing\Repository\SubdivisionRepository;

$addressFormatRepository = new AddressFormatRepository();$subdivisionRepository = new SubdivisionRepository();

// Get the address format for Canada.$addressFormat = $addressFormatRepository­>get('CA');

// Get the subdivisions for Canada, in French.$states = $subdivisionRepository­>getAll('CA', 0, 'fr');foreach ($states as $state) echo $state­>getName();

Page 34: Drupal Commerce 2.x DrupalCamp London 2015

WHAT FIELDS?

Page 35: Drupal Commerce 2.x DrupalCamp London 2015

SOMEWHERE ELSE

Page 36: Drupal Commerce 2.x DrupalCamp London 2015

ADDRESS FORMAT

Which fields are used, and in which orderWhich fields are requiredWhich fields need to be uppercasedField labelsRegular expression for validating postal codes

Page 37: Drupal Commerce 2.x DrupalCamp London 2015

ADDRESS FORMATTING

use CommerceGuys\Addressing\Formatter\PostalFormatter;use CommerceGuys\Addressing\Provider\DataProvider;

$dataProvider = new DataProvider();$formatter = new PostalFormatter($dataProvider);

// Format an address for sending from Switzerland, in French.// If the address destination is not Switzerland, the country name will be// appended in French, uppercase.echo $formatter­>format($address, 'CH', 'fr');

Page 38: Drupal Commerce 2.x DrupalCamp London 2015

ZONEZones are territorial groupings mostly used for shipping or

tax purposes. For example, a set of shipping rates associatedwith a zone where the rates become available only if the

customer's address matches the zone.

A zone can match other zones, countries, subdivisions(states/provinces/municipalities), postal codes. Postal codes

can also be expressed using ranges or regular expressions.

Page 39: Drupal Commerce 2.x DrupalCamp London 2015

Create the German VAT zone

use CommerceGuys\Addressing\Model\Address;use CommerceGuys\Zone\Model\Zone;use CommerceGuys\Zone\Model\ZoneMemberCountry;

$zone = new Zone();$zone­>setId('german_vat');$zone­>setName('German VAT');$zone­>setScope('tax');

Page 40: Drupal Commerce 2.x DrupalCamp London 2015

Add Germany to the zone,

$germanyZoneMember = new ZoneMemberCountry();$germanyZoneMember­>setCountryCode('DE');$zone­>addMember($germanyZoneMember);

add the 4 Austrian postal codes that are in Germany for VAT.

$austriaZoneMember = new ZoneMemberCountry();$austriaZoneMember­>setCountryCode('AT');$austriaZoneMember­>setIncludedPostalCodes('6691, 6991:6993');$zone­>addMember($austriaZoneMember);

Page 41: Drupal Commerce 2.x DrupalCamp London 2015

Initialising a zone matcher.

use CommerceGuys\Addressing\Model\Address;use CommerceGuys\Zone\Matcher\ZoneMatcher;use CommerceGuys\Zone\Repository\ZoneRepository;

$repository = new ZoneRepository('resources/zone');$matcher = new ZoneMatcher($repository);

Page 42: Drupal Commerce 2.x DrupalCamp London 2015

Create an address.

$austrianAddress = new Address();$austrianAddress­>setCountryCode('AT');$austrianAddress­>setPostalCode('6692');

Get the matching tax zones.

$zones = $matcher­>matchAll($austrianAddress, 'tax');

Is in Germany for VAT.

Page 43: Drupal Commerce 2.x DrupalCamp London 2015

TAXSmart data model designed for fluctuating tax rateamounts ("19% -> 21% on January 1st").Predefined tax rates and zones for EU countries, Iceland,Norway, South Africa and Switzerland. More to come.Tax resolvers with logic for all major use cases.

Page 44: Drupal Commerce 2.x DrupalCamp London 2015

EU TAX RESOLVER

use CommerceGuys\Tax\Repository\TaxTypeRepository;use CommerceGuys\Tax\Resolver\Engine\TaxTypeResolverEngine;use CommerceGuys\Tax\Resolver\Engine\TaxRateResolverEngine;use CommerceGuys\Tax\Resolver\TaxType\EuTaxTypeResolver;use CommerceGuys\Tax\Resolver\TaxRate\DefaultTaxRateResolver;use CommerceGuys\Tax\Resolver\TaxResolver;

$taxTypeRepository = new TaxTypeRepository();$taxTypeResolverEngine = new TaxTypeResolverEngine();$taxTypeResolverEngine­>add(new EuTaxTypeResolver($taxTypeRepository));$taxRateResolverEngine = new TaxRateResolverEngine();$taxRateResolverEngine­>add(new DefaultTaxRateResolver());$resolver = new TaxResolver($taxTypeResolverEngine, $taxRateResolverEngine);

Page 45: Drupal Commerce 2.x DrupalCamp London 2015

CALCULATES THE VAT RATE BASED ON

Goods or ServicesType of service, digital, educationB2C or B2BSupplier locationCustomer Location

Page 46: Drupal Commerce 2.x DrupalCamp London 2015

FULL DATA INC. HISTORIC RATES

"name": "British VAT","zone": "gb_vat","tag": "EU","rates": [ "id": "gb_vat_standard", "name": "Standard", "display_name": "% VAT", "default": true, "amounts": [ "id": "gb_vat_standard_1991", "amount": 0.175, "start_date": "1991­03­19", "end_date": "2008­11­30" ,

Page 47: Drupal Commerce 2.x DrupalCamp London 2015

WE'RE DOING SOMETHING RIGHT...

Page 48: Drupal Commerce 2.x DrupalCamp London 2015

DRUPAL COMMERCE 2.X

Page 49: Drupal Commerce 2.x DrupalCamp London 2015

DRUPAL COMMERCE 2.X SPRINT

Validated the architecture with members of SensioLabs,Smile, Publicis Modem, OSInet, i-KOS, Adyax, Ekino, and

others.

Page 50: Drupal Commerce 2.x DrupalCamp London 2015

ONCE AGAIN, WE START FROM SCRATCH<?php

namespace Drupal\commerce\Entity

Page 51: Drupal Commerce 2.x DrupalCamp London 2015
Page 52: Drupal Commerce 2.x DrupalCamp London 2015
Page 53: Drupal Commerce 2.x DrupalCamp London 2015

2.X ENTITY RELATIONSHIP MODEL

Page 54: Drupal Commerce 2.x DrupalCamp London 2015
Page 55: Drupal Commerce 2.x DrupalCamp London 2015

MULTI-STORE / MULTI-VENDOR

Page 56: Drupal Commerce 2.x DrupalCamp London 2015

HIERARCHICAL PRODUCT MODEL

Page 57: Drupal Commerce 2.x DrupalCamp London 2015

IMPROVED ORDER WORKFLOWS

Page 58: Drupal Commerce 2.x DrupalCamp London 2015
Page 59: Drupal Commerce 2.x DrupalCamp London 2015

IMPROVED PAYMENT PROCESSINGCreate a "mini" ledger for payments with double entry like

accounting features.

Page 60: Drupal Commerce 2.x DrupalCamp London 2015
Page 61: Drupal Commerce 2.x DrupalCamp London 2015
Page 62: Drupal Commerce 2.x DrupalCamp London 2015
Page 63: Drupal Commerce 2.x DrupalCamp London 2015

TRY IT OUT

Page 64: Drupal Commerce 2.x DrupalCamp London 2015

CONTRIBUTE ON GITHUB

Page 65: Drupal Commerce 2.x DrupalCamp London 2015

QUESTIONS?Office hours: Wednesdays at 1PM GMT

Find us in #drupal-commerce.