<?php
namespace WAM\Bundle\EcommerceBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\NodeInterface;
use WAM\Bundle\EcommerceBundle\Form\Type\CheckoutType;
use WAM\Bundle\EcommerceBundle\Validator\PromocodeValidator;
/**
* Class Configuration.
*
* @author Germán Figna <gfigna@wearemarketing.com>
*/
class Configuration implements ConfigurationInterface
{
const ECOMMERCE_MAILING_TEMPLATE_NEW_CUSTOMER = 'WAMEcommerceBundle:Mailing:newCustomer.email.twig';
const ECOMMERCE_MAILING_TEMPLATE_ORDER_PAID = 'WAMEcommerceBundle:Mailing:order_paid.email.twig';
const ECOMMERCE_CART_SESSION_FIELD_NAME = 'cart_id';
const ECOMMERCE_MODEL_MANAGER_NAME = 'default';
const ECOMMERCE_ORM_ENABLED = true;
const ECOMMERCE_PAYMENT_METHODS_FILTER = 'wam_ecommerce.payment_methods_filter.service';
const ECOMMERCE_CHECKOUT_FORM = CheckoutType::class;
const ECOMMERCE_PRICE_INCLUDE_TAXES_PARAM_NAME = 'store.price_include_taxes';
const ECOMMERCE_PRICE_INCLUDES_TAXES = true;
const ECOMMERCE_DEFAULT_TAX_PERCENT_PARAM_NAME = 'store.default_tax_percent';
const ECOMMERCE_DEFAULT_TAX_PERCENT = 21;
const ECOMMERCE_CURRENCY_PARAM_NAME = 'store.currency';
const ECOMMERCE_CURRENCY = 'EUR';
const ECOMMERCE_ORDER_NUMBER_DEFAULT = 'ecommerce_order';
const WAM_PROMOCODE_VALIDATOR_CLASS = PromocodeValidator::class;
/**
* Generates the configuration tree.
*
* @return NodeInterface
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder('wam_ecommerce');
$treeBuilder->getRootNode()
->children()
->scalarNode('order_number_sequence_name')
->cannotBeEmpty()
->defaultValue(self::ECOMMERCE_ORDER_NUMBER_DEFAULT)
->end()
->arrayNode('class')
->isRequired()
->children()
->scalarNode('customer')->isRequired()->cannotBeEmpty()->end()
->scalarNode('cart')->isRequired()->cannotBeEmpty()->end()
->scalarNode('cart_line')->isRequired()->cannotBeEmpty()->end()
->scalarNode('order')->isRequired()->cannotBeEmpty()->end()
->scalarNode('order_line')->isRequired()->cannotBeEmpty()->end()
->scalarNode('invoice')->isRequired()->cannotBeEmpty()->end()
->scalarNode('voucher')->isRequired()->cannotBeEmpty()->end()
->scalarNode('voucher_rule')->isRequired()->cannotBeEmpty()->end()
->scalarNode('address_billable')->isRequired()->cannotBeEmpty()->end()
->scalarNode('address_shippable')->isRequired()->cannotBeEmpty()->end()
->scalarNode('shipping_cost_rule')->isRequired()->cannotBeEmpty()->end()
->scalarNode('promocode')->isRequired()->cannotBeEmpty()->end()
->scalarNode('purchasable')->isRequired()->cannotBeEmpty()->end()
->end()
->end()
->append($this->addExtraFieldsNode())
->arrayNode('validator')
->addDefaultsIfNotSet()
->children()
->scalarNode('promocode')->cannotBeEmpty()->defaultValue(static::WAM_PROMOCODE_VALIDATOR_CLASS)->end()
->end()
->end()
->arrayNode('voucher_rules')
->prototype('array')
->children()
->scalarNode('key')->end()
->scalarNode('name')->end()
->scalarNode('class')->end()
->end()
->end()
->end()
->arrayNode('mailing')
->addDefaultsIfNotSet()
->children()
->scalarNode('from')
->defaultValue('develop@wearemarketing.com')
->end()
->arrayNode('notify')
->addDefaultsIfNotSet()
->children()
->scalarNode('order_paid')->cannotBeEmpty()->defaultValue(false)->end()
->scalarNode('new_customer')->cannotBeEmpty()->defaultValue(false)->end()
->end()
->end()
->arrayNode('template')
->addDefaultsIfNotSet()
->children()
->scalarNode('order_paid')->cannotBeEmpty()->defaultValue(self::ECOMMERCE_MAILING_TEMPLATE_ORDER_PAID)->end()
->scalarNode('new_customer')->cannotBeEmpty()->defaultValue(self::ECOMMERCE_MAILING_TEMPLATE_NEW_CUSTOMER)->end()
->end()
->end()
->end()
->end()
->scalarNode('model_manager_name')->cannotBeEmpty()->defaultValue(self::ECOMMERCE_MODEL_MANAGER_NAME)->end()
->scalarNode('payment_methods_filter')->cannotBeEmpty()->defaultValue(self::ECOMMERCE_PAYMENT_METHODS_FILTER)->end()
->arrayNode('excluded_cart_calculators')
->defaultValue([])
->prototype('scalar')->end()
->end()
->booleanNode('orm_enabled')->defaultValue(self::ECOMMERCE_ORM_ENABLED)->end()
->arrayNode('checkout')
->addDefaultsIfNotSet()
->children()
->scalarNode('form_type')->cannotBeEmpty()->defaultValue(self::ECOMMERCE_CHECKOUT_FORM)->end()
->end()
->end()
->end()
->children()
->arrayNode('cart')
->addDefaultsIfNotSet()
->children()
->scalarNode('save_in_session')
->defaultTrue()
->end()
->scalarNode('session_field_name')
->defaultValue(self::ECOMMERCE_CART_SESSION_FIELD_NAME)
->end()
->end()
->end()
->end()
->children()
->arrayNode('order_state_machine')
->addDefaultsIfNotSet()
->children()
->arrayNode('states')
->defaultValue(['pending_payment', 'paid', 'refunded'])
->prototype('scalar')->end()
->end()
->end()
->children()
->scalarNode('class')->end()
->arrayNode('transitions')
->useAttributeAsKey('name')
->prototype('array')
->children()
->arrayNode('from')
->prototype('scalar')->end()
->end()
->scalarNode('to')->end()
->end()
->end()
->end()
->end()
->children()
->arrayNode('callbacks')
->addDefaultsIfNotSet()
->children()
->arrayNode('before')
->useAttributeAsKey('name')
->prototype('array')
->children()
->variableNode('on')->end()
->variableNode('from')->end()
->variableNode('to')->end()
->variableNode('excluded_on')->end()
->variableNode('excluded_from')->end()
->variableNode('excluded_to')->end()
->variableNode('do')->end()
->scalarNode('disabled')->defaultValue(false)->end()
->scalarNode('priority')->defaultValue(0)->end()
->arrayNode('args')->performNoDeepMerging()->prototype('scalar')->end()
->end()
->end()
->end()
->end()
->arrayNode('after')
->useAttributeAsKey('name')
->prototype('array')
->children()
->variableNode('on')->end()
->variableNode('from')->end()
->variableNode('to')->end()
->variableNode('excluded_on')->end()
->variableNode('excluded_from')->end()
->variableNode('excluded_to')->end()
->variableNode('do')->end()
->scalarNode('disabled')->defaultValue(false)->end()
->scalarNode('priority')->defaultValue(0)->end()
->arrayNode('args')->performNoDeepMerging()->prototype('scalar')->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end();
return $treeBuilder;
}
/**
* Returns extra fields cofiguration's definition.
*
* @return \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
*/
private function addExtraFieldsNode()
{
$builder = new TreeBuilder();
$node = $builder->root('extra_fields');
$node
->useAttributeAsKey('name')
->prototype('array')
->prototype('scalar')->end()
->end()
->end();
return $node;
}
}