Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

[Доработка] Отчет по продажам (оптовая цена, прибыль)


Recommended Posts

В общем не долго думая, решил банальным способом просматривать прибыль.

Соответственно когда мы смотрим отчет/по продажам мы видим ИТОГ, но итог цена по которой мы продали.

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

Как я представляю всю эту систему:

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

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

Кто-бы мог подсказать, какой мне код дописать? я совсем запутался в запросах к базе... :) надеюсь Вы поняли что я имею ввиду :)

Link to post
Share on other sites

могу помочь.

интересуют только конкретные места (URL`ы) в которых надо выводить эти данные

  • +1 1
Link to post
Share on other sites

могу помочь.

интересуют только конкретные места (URL`ы) в которых надо выводить эти данные

буду рад твоей помощи! выводить всё можно прямо на страничке index.php?route=report/sale, там в пследней колонки итог идёт, первый итог будет у нас цена по которой мы продали, а второй итог будет, общая оптовая цена (которую мы указали при добавлении товара). Тоесть пусть он считает две суммы при оформлении, но клиенту соотвественно выводит только цену продажи, а уже админу цену продажи и оптовую =) во, по сути всё просто, но я не до конца разобрался, так что если поможешь и будет всё работать - буду благодарен!
Link to post
Share on other sites

буду рад твоей помощи! выводить всё можно прямо на страничке index.php?route=report/sale, там в пследней колонки итог идёт, первый итог будет у нас цена по которой мы продали, а второй итог будет, общая оптовая цена (которую мы указали при добавлении товара). Тоесть пусть он считает две суммы при оформлении, но клиенту соотвественно выводит только цену продажи, а уже админу цену продажи и оптовую =) во, по сути всё просто, но я не до конца разобрался, так что если поможешь и будет всё работать - буду благодарен!

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

Короче там просто колонки добавить надо.

  • +1 1
Link to post
Share on other sites

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

Короче там просто колонки добавить надо.

Либо так, будет даже красивее смотреться :) вот наверное Ваше расположении красивее будет :)

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

это был-бы вообще супер идеал :) В общем afwollis, вся надежда на твою помощь!

Link to post
Share on other sites

товарищи, там не "оптовая", а "закупочная" цена =)

занялся дописанием кода.

думаю через пару часов будет готово.

  • +1 1
Link to post
Share on other sites

загрузку файлов не починили, поэтому вместо скрина:

admin/index.php?route=report/sale

Date Start  	Date End  	No. Orders  	Total  	Total Purchase  	Profit Diff
08/01/2011 	08/01/2011 	2 	£3,076.37 	£2,368.00 	£708.37
09/01/2011 	09/01/2011 	9 	£35,366.79 	£27,772.15 	£7,594.64
26/12/2010 	26/12/2010 	1 	£4,674.37 	£3,889.00 	£785.37

кроме "привычных мест", изменения коснулись структуры таблиц базы данных и "system/library/cart.php"

некоторые "шаги" записывал в файл, по мере написания кода.

однако далеко не все.

поэтому прямо сейчас выложить HOWTO возможности нет.

Link to post
Share on other sites

.

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

скопировал текст из файла и попрятал код в CODE.

скрин внизу

Набираемся терпения, ибо правок много...

Обновление от 2011.01.15:

- добавлен текст "ВАШ_ПРЕФИКС_" в местах, где должны быть "префиксы" ваших таблиц базы данных.

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

======= ДЕЛАЕМ РЕЗЕРВНЫЕ КОПИИ ФАЙЛОВ МАГАЗИНА И БАЗЫ ДАННЫХ =======

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

ЗАХОДИМ В === PHPMYADMIN ===

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Выполняем такие запросы:

ALTER TABLE `ВАШ_ПРЕФИКС_order` ADD `total_purchase` decimal( 15, 4 ) NOT NULL default '0.0000' AFTER `total`;


ALTER TABLE `ВАШ_ПРЕФИКС_order_product` ADD `price_purchase` decimal( 15, 4 ) NOT NULL default '0.0000' AFTER `total` ;
ALTER TABLE `ВАШ_ПРЕФИКС_order_product` ADD `total_purchase` decimal( 15, 4 ) NOT NULL default '0.0000' AFTER `price_purchase` ;


UPDATE `ВАШ_ПРЕФИКС_order_product` op SET op.price_purchase = (SELECT `cost` FROM `ВАШ_ПРЕФИКС_product` p WHERE p.product_id=op.product_id);
UPDATE `ВАШ_ПРЕФИКС_order_product` op SET op.total_purchase = ((SELECT `cost` FROM `ВАШ_ПРЕФИКС_product` p WHERE p.product_id=op.product_id)*op.quantity);


UPDATE `ВАШ_ПРЕФИКС_order` o SET o.`total_purchase` = (SELECT SUM(op.`total_purchase`) as o_tp FROM `ВАШ_ПРЕФИКС_order_product` op WHERE op.`order_id`=o.`order_id`);

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

ЗАХОДИМ В ПАПКУ ADMIN

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ admin/language/LANG/report/sale.php ] ================

add

$_['column_total_purchase']      = 'Total Purchase';
$_['column_profit_diff']      = 'Profit Diff';

after

$_['column_total']      = 'Total';

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ admin/view/template/report/sale.tpl ] ================

После

<td class="right"><?php echo $column_total; ?></td>

Добавляем

<td class="right"><?php echo $column_total_purchase; ?></td>
	<td class="right"><?php echo $column_profit_diff; ?></td>

После

<td class="right"><?php echo $order['total']; ?></td>

Добавляем

<td class="right"><?php echo $order['total_purchase']; ?></td>
	<td class="right"><?php echo $order['profit']; ?></td>

Ниже в коде

<td class="center" colspan="4"><?php echo $text_no_results; ?></td>

Меняем 4 на 6.

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ admin/controller/report/sale.php ] ================

Находим

$results = $this->model_report_sale->getSaleReport($data);
		
		foreach ($results as $result) {
			$this->data['orders'][] = array(

После

'total'      => $this->currency->format($result['total'], $this->config->get('config_currency'))

Добавляем

,
	'total_purchase'      => $this->currency->format($result['total_purchase'], $this->config->get('config_currency')),
	'profit'      => $this->currency->format($result['profit'], $this->config->get('config_currency'))

*****************************

После

$this->data['column_total'] = $this->language->get('column_total');

Добавляем

$this->data['column_total_purchase'] = $this->language->get('column_total_purchase');
	$this->data['column_profit_diff'] = $this->language->get('column_profit_diff');

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ admin/model/report/sale.php ] ================

public function getSaleReport($data = array()) {

в переменную $sql

После

SUM(total) AS total

Добавляем

, SUM(total_purchase) AS total_purchase, (SUM( total ) - SUM( total_purchase )) AS profit

Должно получиться так:

$sql = "SELECT MIN(date_added) AS date_start, MAX(date_added) AS date_end, COUNT(*) AS orders, SUM(total) AS total, SUM(total_purchase) AS total_purchase, (SUM( total ) - SUM( total_purchase )) AS profit FROM `" . DB_PREFIX . "order`";

*****************************

public function getSaleReportTotal($data = array()) {

в переменную $sql

После

SUM(total) AS total

Добавляем

, SUM(total_purchase) AS total_purchase, (SUM( total ) - SUM( total_purchase )) AS profit

Должно получиться так:

$sql = "SELECT MIN(date_added) AS date_start, MAX(date_added) AS date_end, COUNT(*) AS orders, SUM(total) AS total, SUM(total_purchase) AS total_purchase, (SUM( total ) - SUM( total_purchase )) AS profit FROM `" . DB_PREFIX . "order` WHERE order_status_id > '0'";

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

ПЕРЕХОДИМ В CATALOG

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ catalog/model/checkout/order.php ] ================

public function create($data) {

После

foreach ($query->rows as $result) {
			$this->db->query("DELETE FROM `" . DB_PREFIX . "order` WHERE order_id = '" . (int)$result['order_id'] . "'");
			$this->db->query("DELETE FROM " . DB_PREFIX . "order_history WHERE order_id = '" . (int)$result['order_id'] . "'");
			$this->db->query("DELETE FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$result['order_id'] . "'");
			$this->db->query("DELETE FROM " . DB_PREFIX . "order_option WHERE order_id = '" . (int)$result['order_id'] . "'");
			$this->db->query("DELETE FROM " . DB_PREFIX . "order_download WHERE order_id = '" . (int)$result['order_id'] . "'");
			$this->db->query("DELETE FROM " . DB_PREFIX . "order_total WHERE order_id = '" . (int)$result['order_id'] . "'");
		}

Находим запрос, который начинается

$this->db->query("INSERT INTO `" . DB_PREFIX . "order`

Находим в нем

total = '" . (float)$data['total'] . "',

Добавляем

total_purchase = '" . (float)$data['total_purchase'] . "',

******************

Находим такой участок кода

$order_id = $this->db->getLastId();
	
	foreach ($data['products'] as $product) {
			$this->db->query("INSERT INTO " . DB_PREFIX . "order_product

В запрос

$this->db->query("INSERT INTO " . DB_PREFIX . "order_product

После

total = '" . (float)$product['total'] . "',

Добавляем

price_purchase = '" . (float)$product['price_purchase'] . "', total_purchase = '" . (float)$product['total_purchase'] . "',

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ catalog/controller/checkout/confirm.php ] ================

После

$total_data = array();
	$total = 0;

Добавляем

$total_purchase = 0;

Находим такой участок кода (примерно 160-ая строка)

$product_data = array();
	
		foreach ($this->cart->getProducts() as $product) {
			$option_data = array();
			
			foreach ($product['option'] as $option) {
				$option_data[] = array(
					'product_option_value_id' => $option['product_option_value_id'],
					'name'                    => $option['name'],
					'value'                   => $option['value'],
					'prefix'                  => $option['prefix']
				);
			}
			
			$product_data[] = array(
				'product_id' => $product['product_id'],

После

'price'      => $product['price'],
				'total'      => $product['total'],

Добавляем

'price_purchase'      => $product['price_purchase'],
				'total_purchase'      => $product['total_purchase'],

Ниже, после

$data['total'] = $total;

Добавляем

		foreach($product_data as $pos => $prod) {
			$total_purchase += $prod['total_purchase'];
		}
		
		$data['total_purchase'] = $total_purchase;

***********************************

Идем ниже.

Ищем такой участок кода:

$this->data['products'] = array();
		
		foreach ($this->cart->getProducts() as $product) {
			$option_data = array();
			
			foreach ($product['option'] as $option) {
				$option_data[] = array(
					'name'  => $option['name'],
					'value' => $option['value']
				);
			}
			
			$this->data['products'][] = array(
				'product_id' => $product['product_id'],

В

$this->data['products'][] = array(

После

'total'      => $this->currency->format($product['total']),

Добавляем

'price_purchase'      => $product['price_purchase'],
				'total_purchase'      => $product['total_purchase'],

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ catalog/controller/checkout/guest_step_3.php ] ================

После

$total_data = array();
	$total = 0;

Добавляем

$total_purchase = 0;

Находим такой участок кода (примерно 160-ая строка)

$product_data = array();
	
		foreach ($this->cart->getProducts() as $product) {
			$option_data = array();
			
			foreach ($product['option'] as $option) {
				$option_data[] = array(
					'product_option_value_id' => $option['product_option_value_id'],
					'name'                    => $option['name'],
					'value'                   => $option['value'],
					'prefix'                  => $option['prefix']
				);
			}
			
			$product_data[] = array(
				'product_id' => $product['product_id'],

После

'price'      => $product['price'],
				'total'      => $product['total'],

Добавляем

'price_purchase'      => $product['price_purchase'],
				'total_purchase'      => $product['total_purchase'],

Ниже, после

$data['total'] = $total;

Добавляем

		foreach($product_data as $pos => $prod) {
			$total_purchase += $prod['total_purchase'];
		}
		
		$data['total_purchase'] = $total_purchase;

***********************************

Идем ниже.

Ищем такой участок кода:

$this->data['products'] = array();
		
		foreach ($this->cart->getProducts() as $product) {
			$option_data = array();
			
			foreach ($product['option'] as $option) {
				$option_data[] = array(
					'name'  => $option['name'],
					'value' => $option['value']
				);
			}
			
			$this->data['products'][] = array(
				'product_id' => $product['product_id'],

В

$this->data['products'][] = array(

После

'total'      => $this->currency->format($product['total']),

Добавляем

'price_purchase'      => $product['price_purchase'],
				'total_purchase'      => $product['total_purchase'],

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

ПЕРЕХОДИМ В ========= SYSTEM / LIBRARY

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

================ [ system/library/cart.php ] ================

public function getProducts() {

ищем такой участок кода (примерно со 105-ой строки)

if (!$product_query->row['quantity'] || ($product_query->row['quantity'] < $quantity)) {
					$stock = FALSE;
				}
				
				$product_data[$key] = array(

В

$product_data[$key] = array(

После

'price'        => ($price + $option_price),
					'total'        => ($price + $option_price) * $quantity,

Добавляем

'price_purchase'        => ($product_query->row['cost']),
					'total_purchase'        => ($product_query->row['cost']) * $quantity,

Результат:

post-3682-0-32273100-1294856022_thumb.png

если будут вопросы - обращайтесь

Edited by afwollis
  • +1 4
Link to post
Share on other sites
  • 1 month later...

afwollis Спасибо огромно! :)

Это обязательно должно (по дефолту) войти в следующую сборку!

Link to post
Share on other sites

.

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

скопировал текст из файла и попрятал код в CODE.

скрин внизу

Набираемся терпения, ибо правок много...

Обновление от 2011.01.15:

- добавлен текст "ВАШ_ПРЕФИКС_" в местах, где должны быть "префиксы" ваших таблиц базы данных.

Результат:

post-3682-0-32273100-1294856022_thumb.png

если будут вопросы - обращайтесь

Большое спасибо afwollis, все работает прекрасно, но моя оптимизация админки на этом не закончилась, очень удобно добавлять заказ просто из админки(многие делают заказ по телефону и потом вручную приходится по сайту лазить за них), для этих целей нашол и установил new_order_v2_open - работает тоже прекрасно, исправно добавляет заказы, НО В ПРОДАЖАХ НЕ ДОБАВЛЯЕТСЯ ЗАКУПКА. Архив прилагается. Пытался править сам, по аналогии с Вашим примером, но кроме ошибок ничего не получил... Если есть возможность посмотрите, буду очень благодарен, вешь нужная да и сборку включить можно!

new_order_v2_open.zip

Link to post
Share on other sites

1. Модуль оформления заказов из админки уже есть в разделе Дополнений.

2. "интегрировать" эту доработку в тот модуль в ближайшем, и не очень, будущем не планирую.

Можете попросить других разработчиков, или таки докрутить это все своими силами.

Link to post
Share on other sites

... "интегрировать" эту доработку в тот модуль в ближайшем, и не очень, будущем не планирую.

А зря... :mellow:

...или таки докрутить это все своими силами.

Так это и понятно, что и приходится делать.

Другое дело, если это уже идёт по дефолту. Ведь это скрипт МАГАЗИНА, и хорошо бы видеть свои доходы - не прибегая к помощи кУлькулятора... ;)

Link to post
Share on other sites

ну что могу сказать...

я тем модулем не пользуюсь и мне он, в общем-то, не очень интересен.

а потому садится и разбирать его я не намерен Изображение

Link to post
Share on other sites

ну что могу сказать...

я тем модулем не пользуюсь и мне он, в общем-то, не очень интересен.

а потому садится и разбирать его я не намерен Изображение

Да нет, я не призываю Вас писать что то подобное... И уж тем более, создавать мод. )))

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

Даже странно, что этого нет по дефолту - ведь изначально, скрипт расчитан на торговлю.

Link to post
Share on other sites
  • 2 weeks later...

ну что могу сказать...

я тем модулем не пользуюсь и мне он, в общем-то, не очень интересен.

а потому садится и разбирать его я не намерен Изображение

А как быть если используются опции, например, товар имеет несколько цен в зависимости от его опций (цвет, размер)???

Закупочная стоимость(cost) то разная...

Link to post
Share on other sites

Так ведь по-умолчанию в движке нет возможности указать в "опциях/атрибутах/параметрах" товара закупочную стоимость (cost)...

Link to post
Share on other sites

Так ведь по-умолчанию в движке нет возможности указать в "опциях/атрибутах/параметрах" товара закупочную стоимость (cost)...

Как нет? У каждого отчета есть поле "Стоимость (Cтоимость товара для отчета по прибыли)" Я даже удивился, что поле есть, а самого отчета нет!
Link to post
Share on other sites

ergil, не путайте разные вещи.

разговор идет о закупочной стоимости разных вариаций товаров (открываем товар и переходим на вкладку "опции/атрибуты/параметры"). по-умолчанию в движке нет возможности указать ее.

а так да - в каждом товаре можно указать закупочную стоимость.

Link to post
Share on other sites

Так ведь по-умолчанию в движке нет возможности указать в "опциях/атрибутах/параметрах" товара закупочную стоимость (cost)...

Да я уже понял... - плохо, нормальный учёт не получится, уж очень часто у товаров есть несколько вариаций по комплектации или размеру который имеет различную стоимость.
Link to post
Share on other sites

  • 5 months later...

некоторые "шаги" записывал в файл, по мере написания кода.

однако далеко не все.

поэтому прямо сейчас выложить HOWTO возможности нет.

Git/SVN без проблем выдают стандартный diff со всеми изменениями. В котором и обычному человеку всё понятно после минутного рассматривания - можно перенести руками все изменения (имена файлов есть, что найти, на что заменить - видно, есть даже номера строк для ориентира). А необычному (тому, кто знает про patch -pNUM <diff) вдобавок очень-очень облегчается жизнь.

Так что и тебе экономия времени приличная, и всем остальным сплошная выгода. Особенно при большом количестве правок.

Link to post
Share on other sites

  • 6 months later...

.

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

скопировал текст из файла и попрятал код в CODE.

скрин внизу

Набираемся терпения, ибо правок много...

Обновление от 2011.01.15:

- добавлен текст "ВАШ_ПРЕФИКС_" в местах, где должны быть "префиксы" ваших таблиц базы данных.

Результат:

post-3682-0-32273100-1294856022_thumb.png

если будут вопросы - обращайтесь

Здравствуйте. Что-то выдает ошибку, хотя все сделал по образцу..

Вот текст" Notice: Undefined index: total_purchase in /var/www/u1418804/public_html/1catalog1.ru/admin/controller/report/sale.php on line 97Notice: Undefined index: profit in /var/www/u1418804/public_html/1catalog1.ru/admin/controller/report/sale.php on line 98Notice: Undefined index: total_purchase in /var/www/u1418804/public_html/1catalog1.ru/admin/controller/report/sale.php on line 97Notice: Undefined index: profit in /var/www/u1418804/public_html/1catalog1.ru/admin/controller/report/sale.php on line 98"

Вот код " линия 96 'total' => $this->currency->format($result['total'], $this->config->get('config_currency')),

линия 97 'total_purchase' => $this->currency->format($result['total_purchase'], $this->config->get('config_currency')),

лиия 98 'profit' => $this->currency->format($result['profit'], $this->config->get('config_currency'))"

Где я ошибся????

Link to post
Share on other sites

Никто не поможет?

Link to post
Share on other sites

Еще в базе "ос_order" не может найти колонку "total_purchase", хотя я запросы в БД выполнил и такая колонка есть

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.