From 541da9b395c74930629161dfdfc51c6c331f924f Mon Sep 17 00:00:00 2001 From: ffctcc Date: Fri, 15 Aug 2014 16:35:15 +0300 Subject: [PATCH 001/121] Revert currency-related changes to the Balance model --- upload/admin/controller/multiseller/transaction.php | 3 +-- upload/system/library/msbalance.php | 9 +++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/upload/admin/controller/multiseller/transaction.php b/upload/admin/controller/multiseller/transaction.php index b9316056..d30b0d45 100644 --- a/upload/admin/controller/multiseller/transaction.php +++ b/upload/admin/controller/multiseller/transaction.php @@ -35,8 +35,7 @@ public function getTableData() { array( 'id' => $result['balance_id'], 'seller' => $result['nickname'], - //'amount' => $this->currency->format($result['amount'], $this->config->get('config_currency')), - 'amount' => $this->currency->format($result['amount'], $result['currency_code']), + 'amount' => $this->currency->format($result['amount'], $this->config->get('config_currency')), 'description' => (mb_strlen($result['mb.description']) > 80 ? mb_substr($result['mb.description'], 0, 80) . '...' : $result['mb.description']), 'date_created' => date($this->language->get('date_format_short'), strtotime($result['mb.date_created'])), ) diff --git a/upload/system/library/msbalance.php b/upload/system/library/msbalance.php index b4cdc68f..504d1226 100644 --- a/upload/system/library/msbalance.php +++ b/upload/system/library/msbalance.php @@ -42,10 +42,11 @@ public function getBalanceEntries($data = array(), $sort = array()) { SQL_CALC_FOUND_ROWS *, mb.description as 'mb.description', - mb.date_created as 'mb.date_created', - o.currency_code - FROM " . DB_PREFIX . "ms_balance AS mb, " . DB_PREFIX . "ms_seller AS ms, `" . DB_PREFIX . "order` AS o - WHERE mb.seller_id = ms.seller_id AND o.order_id = mb.order_id" + mb.date_created as 'mb.date_created' + FROM " . DB_PREFIX . "ms_balance mb + INNER JOIN " . DB_PREFIX . "ms_seller ms + ON (mb.seller_id = ms.seller_id) + WHERE 1 = 1" . (isset($data['order_id']) ? " AND mb.order_id = " . (int)$data['order_id'] : '') . (isset($data['product_id']) ? " AND mb.product_id = " . (int)$data['product_id'] : '') . (isset($data['seller_id']) ? " AND mb.seller_id = " . (int)$data['seller_id'] : '') From 3723e7d850c939c6340557c1436225ab5d04f9cc Mon Sep 17 00:00:00 2001 From: Martin Boze Date: Wed, 20 Aug 2014 22:47:31 +0300 Subject: [PATCH 002/121] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index ad572e88..440a1d05 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,12 @@ MultiMerch Marketplace for OpenCart [MultiMerch Digital Marketplace for OpenCart](http://multimerch.com/) is now available on GitHub! We'll be updating the readme and the docs shortly, meanwhile feel free to check it out and start fiddling with the code. + +Social Media contest +========== + +Now when the first official open source release of MultiMerch is out, we'd like to popularize it as much as possible to get people to use it. + +Therefore, we're running the [MultiMerch Social Media contest](http://multimerch.com/blog/multimerch-6-core-free-social-contest/) with a prize pool worth $1000+. Take part and win one of our MultiMerch addon bundles! + +Meanwhile, we'll be updating the documentation and setting up support forums :) From 3665476b315f9f451152b01fd222f17e05b0e283 Mon Sep 17 00:00:00 2001 From: NITROjkee Date: Thu, 11 Sep 2014 15:09:55 +0300 Subject: [PATCH 003/121] ordercomments fix --- .../xml/multimerch_core_ordercomments.xml | 76 +++++++++++-------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/upload/vqmod/xml/multimerch_core_ordercomments.xml b/upload/vqmod/xml/multimerch_core_ordercomments.xml index 4e5598dc..a454c033 100644 --- a/upload/vqmod/xml/multimerch_core_ordercomments.xml +++ b/upload/vqmod/xml/multimerch_core_ordercomments.xml @@ -32,41 +32,18 @@ $this->session->data['comment'] = strip_tags($this->request->post['comment']); ]]> request->post['comment'] as $key => $value) - $comment[$key] = strip_tags($value); + if(is_array($this->request->post['comment'])) { + foreach($this->request->post['comment'] as $key => $value) { + $comment[$key] = strip_tags($value); + } + } else { + $comment = strip_tags($this->request->post['comment']); + } $this->session->data['comment'] = $comment; ]]> - - - session->data['comment']; - ]]> - session->data['comment']); - ]]> - - - - cart->getProducts() as $product) { - ]]> - MsLoader->MsProduct->getSellerId($product['product_id']); - $this->MsLoader->MsOrderData->addOrderComment( - $this->session->data['order_id'], - $product['product_id'], - array( - 'seller_id' => $seller_id, - 'comment' => $this->session->data['comment'][$seller_id], - ) - ); - ]]> - - - session->data['comment']); + if(is_array($this->session->data['comment'])) { + $data['comment'] = end($this->session->data['comment']); + } + ]]> + + + + session->data['comment']; + ]]> + session->data['comment'])) { + $data['comment'] = implode('\n',$this->session->data['comment']); + } else { + $data['comment'] = $this->session->data['comment']; + } + ]]> + + + + cart->getProducts() as $product) { + ]]> + MsLoader->MsProduct->getSellerId($product['product_id']); + if($seller_id != 0) { + $this->MsLoader->MsOrderData->addOrderComment( + $this->session->data['order_id'], + $product['product_id'], + array( + 'seller_id' => $seller_id, + 'comment' => isset($this->session->data['comment'][$seller_id]) ? $this->session->data['comment'][$seller_id] : $this->session->data['comment'], + ) + ); + } ]]> - + + \ No newline at end of file From 3410b9071492451a15c16abe0d3d62e8aa4092ab Mon Sep 17 00:00:00 2001 From: Stan Date: Thu, 25 Sep 2014 10:32:37 +0300 Subject: [PATCH 004/121] fix with thousand_point product price --- upload/catalog/controller/seller/account-product.php | 4 ++-- upload/system/library/mshelper.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/upload/catalog/controller/seller/account-product.php b/upload/catalog/controller/seller/account-product.php index 300f0b71..6686455a 100644 --- a/upload/catalog/controller/seller/account-product.php +++ b/upload/catalog/controller/seller/account-product.php @@ -1318,8 +1318,8 @@ public function update() { $decimal_point = $this->language->get('decimal_point'); $thousand_point = $this->language->get('thousand_point'); //$product['price'] = number_format(round($this->currency->convert($product['price'], $this->MsLoader->MsProduct->getDefaultCurrency(), $_SESSION['currency'] ), (int)$decimal_place), (int)$decimal_place, $decimal_point, ''); - $product['price'] = number_format(round($product['price'], (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); - + $product['price'] = round($product['price'], (int)$decimal_place); + if(isset($product['manufacturer_id'])){ $product['manufacturer_id'] = (int)$product['manufacturer_id']; $this->load->model('catalog/manufacturer'); diff --git a/upload/system/library/mshelper.php b/upload/system/library/mshelper.php index 559b2c9a..827e97f3 100644 --- a/upload/system/library/mshelper.php +++ b/upload/system/library/mshelper.php @@ -84,7 +84,7 @@ public function admSetBreadcrumbs($data) { } public function loadTemplate($templateName, $children = FALSE) { - // ugly + // ugly if(strpos($templateName, '/') == false) { $templateName = 'multiseller/' . $templateName; } @@ -233,7 +233,7 @@ public function isUnsignedFloat($val) { } public function uniformDecimalPoint($number) { - return (float)(str_replace(',', '.', $number)); + return (float)(str_replace($this->language->get('thousand_point'), '', $number)); } public function trueCurrencyFormat($number) { @@ -246,7 +246,7 @@ public function trueCurrencyFormat($number) { } public function isInstalled() { - $this->load->model('setting/extension'); + $this->load->model('setting/extension'); $installed_extensions = $this->model_setting_extension->getInstalled('module'); return array_search('multiseller', $installed_extensions) !== FALSE; } From 99a52cb499f9354374293ac111b1283dc5b65221 Mon Sep 17 00:00:00 2001 From: Stan Date: Thu, 25 Sep 2014 14:23:49 +0300 Subject: [PATCH 005/121] fix with thousand_point product price for france --- upload/system/library/mshelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upload/system/library/mshelper.php b/upload/system/library/mshelper.php index 827e97f3..a7c53008 100644 --- a/upload/system/library/mshelper.php +++ b/upload/system/library/mshelper.php @@ -233,7 +233,7 @@ public function isUnsignedFloat($val) { } public function uniformDecimalPoint($number) { - return (float)(str_replace($this->language->get('thousand_point'), '', $number)); + return (float)(str_replace($this->language->get('thousand_point'), '', str_replace($this->language->get('decimal_point'), '.', $number))); } public function trueCurrencyFormat($number) { From fd2c34e1a8eb5e999629bd8c24c5781384261107 Mon Sep 17 00:00:00 2001 From: ffctcc Date: Mon, 20 Oct 2014 11:02:13 +0300 Subject: [PATCH 006/121] Multiple order comments fix --- upload/vqmod/xml/multimerch_core_ordercomments.xml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/upload/vqmod/xml/multimerch_core_ordercomments.xml b/upload/vqmod/xml/multimerch_core_ordercomments.xml index a454c033..3d9095cf 100644 --- a/upload/vqmod/xml/multimerch_core_ordercomments.xml +++ b/upload/vqmod/xml/multimerch_core_ordercomments.xml @@ -87,17 +87,6 @@ - - - session->data['comment'])) { - $data['comment'] = end($this->session->data['comment']); - } - ]]> - - session->data['comment']; @@ -131,4 +120,4 @@ - \ No newline at end of file + From 6f5c855b19b4836c7a52b669d23dabec3b04e683 Mon Sep 17 00:00:00 2001 From: Martin Boze Date: Wed, 22 Oct 2014 10:39:23 +0300 Subject: [PATCH 007/121] One more fix to multiple comments --- upload/vqmod/xml/multimerch_core_ordercomments.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upload/vqmod/xml/multimerch_core_ordercomments.xml b/upload/vqmod/xml/multimerch_core_ordercomments.xml index 3d9095cf..ca8946a2 100644 --- a/upload/vqmod/xml/multimerch_core_ordercomments.xml +++ b/upload/vqmod/xml/multimerch_core_ordercomments.xml @@ -53,7 +53,7 @@

session->data['sellers'] as $seller) { ?>
language->get('ms_seller_forseller'); ?>:
- +

]]> From 393b34af1e78b55a0bf503251b121e0037038946 Mon Sep 17 00:00:00 2001 From: ffctcc Date: Wed, 5 Nov 2014 15:04:22 +0200 Subject: [PATCH 008/121] Admin xml modifications for OC2 - menus, transactions, temp loader hotfix --- upload/vqmod/xml/multimerch_core_admin.xml | 96 ++++++------- .../xml/multimerch_core_oc2_loader_magic.xml | 22 +++ .../vqmod/xml/multimerch_core_sellerinfos.xml | 4 +- .../xml/multimerch_core_transactions.xml | 136 ------------------ 4 files changed, 71 insertions(+), 187 deletions(-) create mode 100644 upload/vqmod/xml/multimerch_core_oc2_loader_magic.xml diff --git a/upload/vqmod/xml/multimerch_core_admin.xml b/upload/vqmod/xml/multimerch_core_admin.xml index 343cf858..f5392cea 100644 --- a/upload/vqmod/xml/multimerch_core_admin.xml +++ b/upload/vqmod/xml/multimerch_core_admin.xml @@ -72,27 +72,28 @@ - - + + db->query("DELETE FROM `" . DB_PREFIX . "ms_order_product_data` WHERE order_id = '" . (int)$order_id . "'"); + $data = array_merge(isset($data) ? $data : array(), $this->load->language('multiseller/multiseller')); + $lang = "view/javascript/multimerch/datatables/lang/" . $this->config->get('config_admin_language') . ".txt"; + $data['dt_language'] = file_exists(DIR_APPLICATION . $lang) ? "'$lang'" : "undefined"; ]]> - - + ]]> load->model('multiseller/upgrade'); ?> - + MsLoader->MsHelper->isInstalled() && !$this->model_multiseller_upgrade->isDbLatest()) { ?>
language->get('ms_db_upgrade'), $this->url->link('module/multiseller/upgradeDb', 'token=' . $this->session->data['token'], 'SSL')); ?>
@@ -109,64 +110,49 @@ ]]>
config = $config; ?> ]]>
- - - - -
  • -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
  • - - ]]>
    -
    - + + data = array_merge($this->data, $this->load->language('multiseller/multiseller')); - $lang = "view/javascript/multimerch/datatables/lang/" . $this->config->get('config_admin_language') . ".txt"; - $this->data['dt_language'] = file_exists(DIR_APPLICATION . $lang) ? "'$lang'" : "undefined"; + $data = array_merge(isset($data) ? $data : array(), $this->load->language('multiseller/multiseller')); ]]> - + + + - data['stores'] = array(); + ]]> data['ms_link_sellers'] = $this->url->link('multiseller/seller', 'token=' . $this->session->data['token'], 'SSL'); - $this->data['ms_link_seller_groups'] = $this->url->link('multiseller/seller-group', 'token=' . $this->session->data['token'], 'SSL'); - $this->data['ms_link_attributes'] = $this->url->link('multiseller/attribute', 'token=' . $this->session->data['token'], 'SSL'); - $this->data['ms_link_products'] = $this->url->link('multiseller/product', 'token=' . $this->session->data['token'], 'SSL'); - $this->data['ms_link_payment'] = $this->url->link('multiseller/payment', 'token=' . $this->session->data['token'], 'SSL'); - $this->data['ms_link_transactions'] = $this->url->link('multiseller/transaction', 'token=' . $this->session->data['token'], 'SSL'); - $this->data['ms_link_settings'] = $this->url->link('module/multiseller', 'token=' . $this->session->data['token'], 'SSL'); +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • ]]>
    -
    +
    data['products'][] = array( + $product_data = array( ]]> language->load('multiseller/multiseller'); @@ -183,7 +169,19 @@ data['products'][] = array( + $data['products'][] = array( + ]]> + array( + 'seller_id' => isset($seller['seller_id']) ? $seller['seller_id'] : '', + 'nickname' => isset($seller['ms.nickname']) ? $seller['ms.nickname'] : '' + ), + ]]> + + + + $product['product_id'], ]]> array( @@ -224,7 +222,7 @@ - + @@ -235,7 +233,7 @@ - + data['cancel'] = $this->url->link('sale/contact', 'token=' . $this->session->data['token'], 'SSL'); diff --git a/upload/vqmod/xml/multimerch_core_oc2_loader_magic.xml b/upload/vqmod/xml/multimerch_core_oc2_loader_magic.xml new file mode 100644 index 00000000..8d69fd6d --- /dev/null +++ b/upload/vqmod/xml/multimerch_core_oc2_loader_magic.xml @@ -0,0 +1,22 @@ + + +> + + + + + registry->get($key); + } + + public function __set($key, $value) { + $this->registry->set($key, $value); + } + ]]> + + + diff --git a/upload/vqmod/xml/multimerch_core_sellerinfos.xml b/upload/vqmod/xml/multimerch_core_sellerinfos.xml index 41509a02..7b6202e0 100644 --- a/upload/vqmod/xml/multimerch_core_sellerinfos.xml +++ b/upload/vqmod/xml/multimerch_core_sellerinfos.xml @@ -55,7 +55,7 @@ - + data['products'][] = array( @@ -66,7 +66,7 @@ - + "> diff --git a/upload/vqmod/xml/multimerch_core_transactions.xml b/upload/vqmod/xml/multimerch_core_transactions.xml index bc2d139c..03028945 100644 --- a/upload/vqmod/xml/multimerch_core_transactions.xml +++ b/upload/vqmod/xml/multimerch_core_transactions.xml @@ -152,140 +152,4 @@ ]]> - - - - db->query("UPDATE `" . DB_PREFIX . "order` SET order_status_id = '" . (int)$data['order_status_id'] . "', date_modified = NOW() WHERE order_id = '" . (int)$order_id . "'"); - ]]> - db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'"); - ]]> - - - - db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'"); - ]]> - language->load('multiseller/multiseller'); - if (in_array($data['order_status_id'], $this->config->get('msconf_credit_order_statuses'))) { - $sendmail = false; - foreach ($ms_order_product_query->rows as $order_product) { - // increment sold counter - $this->db->query("UPDATE " . DB_PREFIX . "ms_product SET number_sold = (number_sold + " . (int)$order_product['quantity'] . ") WHERE product_id = '" . (int)$order_product['product_id'] . "'"); - - $seller_id = $this->MsLoader->MsProduct->getSellerId($order_product['product_id']); - if (!$seller_id) continue; - - $balance_entry = $this->MsLoader->MsBalance->getBalanceEntry( - array( - 'seller_id' => $seller_id, - 'product_id' => $order_product['product_id'], - 'order_id' => $order_id, - 'balance_type' => MsBalance::MS_BALANCE_TYPE_SALE - ) - ); - - if (!$balance_entry) { - $commissions = $this->MsLoader->MsCommission->calculateCommission(array('seller_id' => $seller_id)); - - if ($order_product['total'] > 0) { - $store_commission_flat = $commissions[MsCommission::RATE_SALE]['flat']; - $store_commission_pct = $order_product['total'] * $commissions[MsCommission::RATE_SALE]['percent'] / 100; - $seller_net_amt = $order_product['total'] - ($store_commission_flat + $store_commission_pct); - } else { - $store_commission_flat = $store_commission_pct = $seller_net_amt = 0; - } - - // Add order data if doesn't exist yet - $order_data = $this->MsLoader->MsOrderData->getOrderData( - array( - 'product_id' => $order_product['product_id'], - 'order_id' => $order_product['order_id'], - ) - ); - if (!$order_data) { - $this->MsLoader->MsOrderData->addOrderProductData( - $order_product['order_id'], - $order_product['product_id'], - array( - 'seller_id' => $seller_id, - 'store_commission_flat' => $store_commission_flat, - 'store_commission_pct' => $store_commission_pct, - 'seller_net_amt' => $seller_net_amt - ) - ); - } - - $this->MsLoader->MsBalance->addBalanceEntry( - $seller_id, - array( - 'order_id' => $order_product['order_id'], - 'product_id' => $order_product['product_id'], - 'balance_type' => MsBalance::MS_BALANCE_TYPE_SALE, - 'amount' => $seller_net_amt, - 'description' => sprintf($this->language->get('ms_transaction_sale'), ($order_product['quantity'] > 1 ? $order_product['quantity'] . ' x ' : '') . $order_product['name'], $this->currency->format($store_commission_flat + $store_commission_pct, $this->config->get('config_currency'))) - ) - ); - - $sendmail = true; - } else { - // send order status change mails - } - } - if ($sendmail) $this->MsLoader->MsMail->sendOrderMails($order_id); - } else if (in_array($data['order_status_id'], $this->config->get('msconf_debit_order_statuses'))) { - $sendmail = false; - foreach ($ms_order_product_query->rows as $order_product) { - // decrement sold counter - $this->db->query("UPDATE " . DB_PREFIX . "ms_product SET number_sold = (number_sold - " . (int)$order_product['quantity'] . ") WHERE product_id = '" . (int)$order_product['product_id'] . "'"); - - $seller_id = $this->MsLoader->MsProduct->getSellerId($order_product['product_id']); - if (!$seller_id) continue; - - $refund_balance_entry = $this->MsLoader->MsBalance->getBalanceEntry( - array( - 'seller_id' => $seller_id, - 'product_id' => $order_product['product_id'], - 'order_id' => $order_id, - 'balance_type' => MsBalance::MS_BALANCE_TYPE_REFUND - ) - ); - - if (!$refund_balance_entry) { - $balance_entry = $this->MsLoader->MsBalance->getBalanceEntry( - array( - 'seller_id' => $seller_id, - 'product_id' => $order_product['product_id'], - 'order_id' => $order_id, - 'balance_type' => MsBalance::MS_BALANCE_TYPE_SALE - ) - ); - - if ($balance_entry) { - $this->MsLoader->MsBalance->addBalanceEntry( - $balance_entry['seller_id'], - array( - 'order_id' => $balance_entry['order_id'], - 'product_id' => $balance_entry['product_id'], - 'balance_type' => MsBalance::MS_BALANCE_TYPE_REFUND, - 'amount' => -1 * $balance_entry['amount'], - 'description' => sprintf($this->language->get('ms_transaction_refund'), ($order_product['quantity'] > 1 ? $order_product['quantity'] . ' x ' : '') . $order_product['name']) - ) - ); - - // send refund mails - // $this->MsLoader->MsMail->sendOrderMails($order_id); - } else { - // send order status change mails - } - } - } - } - ]]> - - From acf133afcc4646d8ee72e6884c2751a99054be55 Mon Sep 17 00:00:00 2001 From: ffctcc Date: Fri, 7 Nov 2014 17:07:15 +0200 Subject: [PATCH 009/121] Admin base controller/seller list modifications --- upload/admin/controller/multiseller/base.php | 2 + .../admin/controller/multiseller/seller.php | 12 +- .../view/template/multiseller/seller.tpl | 109 ++++++++++-------- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/upload/admin/controller/multiseller/base.php b/upload/admin/controller/multiseller/base.php index 74963138..50141b4c 100644 --- a/upload/admin/controller/multiseller/base.php +++ b/upload/admin/controller/multiseller/base.php @@ -2,6 +2,7 @@ class ControllerMultisellerBase extends Controller { private $error = array(); + public $data = array(); public function __construct($registry) { parent::__construct($registry); @@ -10,6 +11,7 @@ public function __construct($registry) { if (!isset($parts[2]) || !in_array($parts[2], array('install','uninstall'))) { } + //$data = array(); $this->data = array_merge($this->data, $this->load->language('multiseller/multiseller')); $this->data['token'] = $this->session->data['token']; $this->document->addStyle('view/stylesheet/multimerch/multiseller.css'); diff --git a/upload/admin/controller/multiseller/seller.php b/upload/admin/controller/multiseller/seller.php index 02d53749..c8de5013 100644 --- a/upload/admin/controller/multiseller/seller.php +++ b/upload/admin/controller/multiseller/seller.php @@ -352,8 +352,10 @@ public function index() { ) )); - list($this->template, $this->children) = $this->MsLoader->MsHelper->admLoadTemplate('seller'); - $this->response->setOutput($this->render()); + $this->data['column_left'] = $this->load->controller('common/column_left'); + $this->data['footer'] = $this->load->controller('common/footer'); + $this->data['header'] = $this->load->controller('common/header'); + $this->response->setOutput($this->load->view('multiseller/seller.tpl', $this->data)); } public function create() { @@ -385,8 +387,10 @@ public function create() { ) )); - list($this->template, $this->children) = $this->MsLoader->MsHelper->admLoadTemplate('seller-form'); - $this->response->setOutput($this->render()); + $this->data['column_left'] = $this->load->controller('common/column_left'); + $this->data['footer'] = $this->load->controller('common/footer'); + $this->data['header'] = $this->load->controller('common/header'); + $this->response->setOutput($this->load->view('multiseller/seller-form.tpl', $this->data)); } public function update() { diff --git a/upload/admin/view/template/multiseller/seller.tpl b/upload/admin/view/template/multiseller/seller.tpl index 8d4af8e3..fad0b462 100644 --- a/upload/admin/view/template/multiseller/seller.tpl +++ b/upload/admin/view/template/multiseller/seller.tpl @@ -1,56 +1,67 @@ - +
    -