Merge branch 'customers'

This commit is contained in:
Manuel Raynaud
2013-09-09 16:09:18 +02:00
7 changed files with 231 additions and 4 deletions

View File

@@ -31,6 +31,14 @@
<default key="_controller">Thelia\Controller\Admin\CategoryController::defaultAction</default>
</route>
<!-- Customer rule management -->
<route id="admin.customers" path="/admin/customers">
<default key="_controller">Thelia\Controller\Admin\CustomerController::indexAction</default>
</route>
<!-- end Customer rule management -->
<!-- Categories management -->
<route id="admin.categories.default" path="/admin/categories">

View File

@@ -0,0 +1,40 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace Thelia\Controller\Admin;
/**
* Class CustomerController
* @package Thelia\Controller\Admin
* @author Manuel Raynaud <mraynaud@openstudio.fr>
*/
class CustomerController extends BaseAdminController
{
public function indexAction()
{
if (null !== $response = $this->checkAuth("admin.customers.view")) return $response;
return $this->render("customers", array("display_customer" => 20));
}
}

View File

@@ -64,6 +64,7 @@ class Customer extends BaseLoop
)
),
Argument::createBooleanTypeArgument('reseller'),
Argument::createBooleanTypeArgument('last_order'),
Argument::createIntTypeArgument('sponsor')
);
}
@@ -130,6 +131,20 @@ class Customer extends BaseLoop
$loopResultRow->set("SPONSOR", $customer->getSponsor());
$loopResultRow->set("DISCOUNT", $customer->getDiscount());
$lastOrderDate = "";
$lastOrderAmount = "";
if ($this->getLastOrder()) {
$order = $customer->getOrders()->getFirst();
if ($order) {
$lastOrderDate = $order->getCreatedAt();
$lastOrderAmount = $order->getTotalAmount();
}
}
$loopResultRow->set("LASTORDER_DATE", $lastOrderDate);
$loopResultRow->set("LASTORDER_AMOUNT", $lastOrderAmount);
$loopResult->addRow($loopResultRow);
}

View File

@@ -113,9 +113,15 @@ class Format extends AbstractSmartyPlugin
throw new SmartyPluginException("number is a mandatory parameter in format_number function");
}
$number = $params["number"];
if(empty($number)) {
return "";
}
$lang = $this->request->getSession()->getLang();
$number = $params["number"];
$decimals = array_key_exists("decimals", $params) ? $params["decimals"] : $lang->getDecimals();
$decPoint = array_key_exists("dec_point", $params) ? $params["dec_point"] : $lang->getDecimalSeparator();
$thousandsSep = array_key_exists("thousands_sep", $params) ? $params["thousands_sep"] : $lang->getThousandsSeparator();

View File

@@ -65,9 +65,7 @@ class SmartyParser extends Smarty implements ParserInterface
$this->setTemplate($template ?: ConfigQuery::read('active-template', 'default'));
$this->debugging = $debug;
$this->escape_html = true;
// Prevent smarty ErrorException: Notice: Undefined index bla bla bla...
$this->error_reporting = E_ALL ^ E_NOTICE;
@@ -86,6 +84,7 @@ class SmartyParser extends Smarty implements ParserInterface
$this->registerFilter('pre', array($this, "preThelia"));
$this->registerFilter('output', array($this, "removeBlankLines"));
$this->registerFilter('variable', array(__CLASS__, "theliaEscape"));
}
public function preThelia($tpl_source, \Smarty_Internal_Template $template)
@@ -101,6 +100,15 @@ class SmartyParser extends Smarty implements ParserInterface
return preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $tpl_source);
}
public static function theliaEscape($content, $smarty)
{
if(!is_object($content)) {
return htmlspecialchars($content ,ENT_QUOTES, Smarty::$_CHARSET);
} else {
return $content;
}
}
public function setTemplate($template_path_from_template_base)
{
$this->template = $template_path_from_template_base;

View File

@@ -6,4 +6,15 @@ use Thelia\Model\Base\Order as BaseOrder;
class Order extends BaseOrder {
/**
* calculate the total amount
*
* @TODO create body method
*
* @return int
*/
public function getTotalAmount()
{
return 2;
}
}

View File

@@ -0,0 +1,139 @@
{extends file="admin-layout.tpl"}
{block name="page-title"}{intl l='Customer'}{/block}
{block name="check-permissions"}admin.customer.view{/block}
{block name="main-content"}
{assign var=customer_page value={$smarty.get.page|default:1}}
<div class="catalog">
<div id="wrapper" class="container">
{module_include location='customer_top'}
<div class="row">
<div class="col-md-12">
<div class="general-block-decorator">
<table class="table table-striped table-condensed" id="customer_list">
<caption>
{intl l="Customers list"}
{module_include location='customer_list_caption'}
{loop type="auth" name="can_create" roles="ADMIN" permissions="admin.customers.create"}
<a class="btn btn-default btn-primary action-btn" title="{intl l='Add a new Customer'}" href="#add_customer_dialog" data-toggle="modal">
<span class="glyphicon glyphicon-plus-sign"></span>
</a>
{/loop}
</caption>
{ifloop rel="customer_list"}
<thead>
<tr>
<th class="object-title">
{intl l="customer ref"}
</th>
<th class="object-title">
{intl l="company"}
</th>
{module_include location='category_list_header'}
<th>
{intl l="firstname & lastname"}
</th>
<th>
{intl l="last order"}
</th>
<th>{intl l='order amount'}</th>
<th>{intl l='Actions'}</th>
</tr>
</thead>
<tbody>
{loop name="customer_list" type="customer" visible="*" last_order="1" backend_context="1" page={$customer_page} limit={$display_customer}}
<tr>
<td>{#REF}</td>
<td>
{#COMPANY}
</td>
<td class="object-title">
{#FIRSTNAME} {#LASTNAME}
</td>
{module_include location='customer_list_row'}
<td>
{format_date date=$LASTORDER_DATE}
</td>
<td>
{format_number number=$LASTORDER_AMOUNT}
</td>
<td>
<div class="btn-group">
{loop type="auth" name="can_change" roles="ADMIN" permissions="admin.customer.edit"}
<a class="btn btn-default btn-xs" title="{intl l='Edit this customer'}" href="{url path="/admin/customer/update/{$ID}" }"><i class="glyphicon glyphicon-edit"></i></a>
{/loop}
{loop type="auth" name="can_send_mail" roles="ADMIN" permissions="admin.customer.sendMail"}
<a class="btn btn-default btn-xs" title="{intl l="Send a mail to this customer"}" href="mailto:{#EMAIL}"><span class="glyphicon glyphicon-envelope"></span></a>
{/loop}
{loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.customer.delete"}
<a class="btn btn-default btn-xs customer-delete" title="{intl l='Delete this customer and all his orders'}" href="#delete_customer_dialog" data-id="{$ID}" data-toggle="modal"><i class="glyphicon glyphicon-trash"></i></a>
{/loop}
</div>
</td>
</tr>
{/loop}
</tbody>
{/ifloop}
</table>
</div>
</div>
</div>
{module_include location='customer_bottom'}
<div class="row">
<div class="col-md-12 text-center">
<ul class="pagination pagination-centered">
{if #customer_page != 1}
<li><a href="{url path="/admin/customers" page="1"}">&laquo;</a></li>
{else}
<li class="disabled"><a href="#">&laquo;</a></li>
{/if}
{pageloop rel="customer_list"}
{if #PAGE != #CURRENT}
<li><a href="{url path="/admin/customers" page="#PAGE"}">#PAGE</a></li>
{else}
<li class="active"><a href="#">#PAGE</a></li>
{/if}
{if #PAGE == #LAST && #LAST != #CURRENT}
<li><a href="{url path="/admin/customers" page="#PAGE"}">&raquo;</a></li>
{else}
<li class="disabled"><a href="#">&raquo;</a></li>
{/if}
{/pageloop}
</ul>
</div>
</div>
</div>
</div>
{/block}