Перейти к содержимому


Распределение суммы счета


Сообщений в теме: 11

#1 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 22 Июль 2013 - 12:23

На данный момент сумма в счете распределяется на одного менеджера. Но,бывает,что менеджер работает над проектом не один, и поэтому необходимо распределение суммы между ними.
Я так понимаю,это распределение прописывается в "Отчеты по продажам" в "Подготовка данных"?
Можете хоть примерно показать в каком месте мне необходимо менять, или вдруг кто-то уже сталкивался с такой проблемой?


  if ($_REQUEST['date1']) $date1 = date("d.m.Y",strtotime(form_eng_time($_REQUEST['date1'])));
  else $date1 = date("d.m.Y", mktime(0,0,0,date("m"),date("d")-7,date("Y")));
  if ($_REQUEST['date2']) $date2 = date("d.m.Y",strtotime(form_eng_time($_REQUEST['date2'])));
  else $date2 = date("d.m.Y");
  $date1_fet = form_eng_time($date1.' 00:00:00');
  $date2_fet = form_eng_time($date2.' 23:59:59');

if ($_REQUEST['manager']) $manager = intval($_REQUEST['manager']); elseif ($user['group_id']==2) $manager = $user['id'];

  if ($_REQUEST['_type']||$_REQUEST['_manager']||$_REQUEST['_dates'])
	{
	  reset_filters(43);
	  if ($_REQUEST['_type'] || $_REQUEST['_manager']) $temp_add = ' and ';
	  else $temp_add = '';
	  if ($_REQUEST['_dates']=='1') set_filter(457, "period", $date1, $date2, $temp_add);
	  elseif ($_REQUEST['_dates']=='2') set_filter(436, "period", $date1, $date2, $temp_add);
	  if ($_REQUEST['_manager']) $temp_add = ' and ';
	  else $temp_add = '';
	  if ($_REQUEST['_type'] && $_REQUEST['_type']!='0.00') set_filter(456, "=", form_input($_REQUEST['_type']), '', $temp_add);
	  if ($_REQUEST['_manager']) set_filter(448, "=", form_input($_REQUEST['_manager']), '', '');
	
	  header("Location: ".$config["site_root"]."/fields.php?table=43");
	}

  if ($manager){
	$sqlCond = "`user`.`id`='".$manager."'";
	$sqlGroups = "";
  }else{
	//else else $sqlCond = "`user`.`group_id`=`group`.`id` AND `user`.`arc`=0";
	// $sqlGroups = ", `".GROUPS_TABLE."` AS `group`";
	/*$sqlCond = "`user`.`arc`=0 AND `group_id`!='777'";*/
	$sqlCond = "`group_id`!='777'";
	$sqlGroups = "";
  }
  $sqlQuery = "SELECT `user`.`id`, `user`.`fio` FROM ".USERS_TABLE." AS `user`$sqlGroups WHERE $sqlCond";
  $result = sql_query($sqlQuery);
  while ($row = sql_fetch_assoc($result))
	{
	  $data['fio'] = $row['fio'];
	  $data['fio_id'] = $row['id'];
	
	  $result2 = sql_select_field(DATA_TABLE."43","SUM(f2791) as sum","f448='",$data['fio_id'],"' AND f436>='",$date1_fet,"' AND f436<='",$date2_fet,"' AND status=0 ORDER BY f436");
	  $result2 = sql_select_field("`".DATA_TABLE."43`","SUM(f2791) AS `sum`","`f448`='",$data['fio_id'],"' AND `f436`>='",$date1_fet,"' AND `f436`<='",$date2_fet,"' AND `status`<>'2'");
	  $row2 = sql_fetch_assoc($result2);
	  $data['invoice'] = $row2['sum'];
	  //$result2 = sql_select_field(DATA_TABLE."43","SUM(f2791) as sum"," f448='",$data['fio_id'],"' AND f457>='",$date1_fet,"' AND f457<='",$date2_fet,"' AND status=0 ORDER BY f457");
	  $result2 = sql_select_field("`".DATA_TABLE."43`","SUM(f455) AS `sum`","`f448`='",$data['fio_id'],"' AND `f457`>='",$date1_fet,"' AND `f457`<='",$date2_fet,"' AND `status`=0");
	  $row2 = sql_fetch_assoc($result2);
	  $data['paid'] = $row2['sum'];
	  if($data['fio_id']!=1) $result2 = sql_select_field(DATA_TABLE."46","f1550","f1400='",$data['fio_id'],"'");
	  else $result2 = sql_select_field(DATA_TABLE."46","f1550","id='",$data['fio_id'],"'");
	  $row2 = sql_fetch_assoc($result2);
	  $data['bonus_percent'] = ($row2['f1550'])?$row2['f1550']:0;
	
	  $result2 = sql_select_field(DATA_TABLE."43","sum(f455) as sum,f457 as dates"," f448='",$data['fio_id'],"' AND f457>='",$date1_fet,"' AND f457<='",$date2_fet,"' AND status=0 ORDER BY f457");
	  $row2 = sql_fetch_assoc($result2);
	  $data['bonus_sum'] = $row2['sum'];
	  $data['bonus'] = $data['bonus_sum'] * $data['bonus_percent'] * 0.01;
	
	  if($row2['dates']){
		$data_date['Бонус'][date('Y-m-d',strtotime($row2['dates']))]=$data['bonus_sum'] * $data['bonus_percent'] * 0.01;
	  }
	
	  $sum_invoice+=$data['invoice'];
	  $sum_paid+=$data['paid'];
	  $sum_bonus+=$data['bonus'];
	
	  $data['invoice'] = form_local_number($data['invoice'],'/2');
	  $data['paid'] = form_local_number($data['paid'],'/2');
	  $data['bonus'] = form_local_number($data['bonus'], '/2');
	
	  $lines[] = $data;
	}
  if(is_array($data_date['Бонус']))ksort($data_date['Бонус']);
  //foreach($data_date['Бонус'] as $k=>$v){
   // $full;
  //  $data_date['Бонус'][$k]+=$v;
  //}

  $sum_invoice = form_local_number($sum_invoice,'/2');
  $sum_paid = form_local_number($sum_paid,'/2');
  $sum_bonus = form_local_number($sum_bonus,'/2');
  
  $result = sql_select_field(SCHEMES_TABLE,"`color3`","`active`='1'");
  $row = sql_fetch_assoc($result);

  $sqlQuery = "SELECT `id` FROM ".USERS_TABLE." WHERE `group_id`!='777'";
  $result = sql_query($sqlQuery);
  while($row=sql_fetch_assoc($result)){
	$userArray[]=$row['id'];
  }
  $userString=implode(',',$userArray);
  if($userString) $userString="AND f448 in (".$userString.")";

  // для графика
  $y_min = 0;
  $y_max = 0;
  $data_date ['Выставлено'] = array();
  $data_date ['Оплачено'] = array();
  //$date1_fet=date('d.m',strtotime($date1_fet)).".".(date('Y',strtotime($date1_fet))-2);
  $full=0;
  $result = sql_select_field(DATA_TABLE."43","DATE_FORMAT(`f436`,'%Y-%m-%d') AS date_act,f2791","`f448`!='0' AND `f448`!='10' AND `f436`>='",$date1_fet,"' AND status<>2 AND f436<='",$date2_fet,"' $userString ORDER BY date_act");
  while($d = sql_fetch_assoc($result))
	{
	  //$full+=$d['f2791'];
	  $data_date ['Выставлено'] [$d['date_act']]+=$d['f2791'];
	}
  $full=0;
  $result = sql_select_field(DATA_TABLE."43","DATE_FORMAT(`f457`,'%Y-%m-%d') AS date_act,f455,f2791","`f448`!='0' AND `f448`!='10' AND `f457`>='",$date1_fet,"' AND status=0 AND f457<='",$date2_fet,"' $userString ORDER BY date_act");
  while($d = sql_fetch_assoc($result))
	{
	 // $full += ($d['f455']!=0.00)?$d['f2791']:0;
	  $data_date ['Оплачено'] [$d['date_act']]+= ($d['f455']!=0.00)?$d['f455']:0;
	  if($data_date ['Оплачено'] [$d['date_act']]){
		$result2 = sql_select_field(DATA_TABLE."46","SUM(f1550) as `sum`");
		$row2 = sql_fetch_assoc($result2);
		$bonus_percent = ($row2['sum'])?$row2['sum']:0;
	  }
	}

  $types = array('Бонус','Выставлено','Оплачено');

  if(!$data_date ['Бонус'] && !$data_date ['Выставлено'] && !$data_date ['Оплачено']) $data_date ['Бонус'][date('Y-m-d',strtotime($date1))] = 0;

  $start=date('d',strtotime($date1));
  $days=floor((strtotime($date2)-strtotime($date1))/86400);
  $mo=date('m',strtotime($date1));
  $ye=date('Y',strtotime($date1));
		for($i=$start;count($dateArray)<=$days;$i++,$start++){
		  $dateArray[]=$ye.'-'.$mo.'-'.$start;
		  if($i==30){$mo++;$start=1;}
		  if($mo==12&&$start==30) {$ye++;$mo=1;$start=1;}
		}
		if(is_array($dateArray))
		foreach($dateArray as $k=>$v){
		  $dateArray2[]=date('Y-m-d',strtotime($v));
		}
		$dateArray=$dateArray2;

  if($days<16) $ticks_x_interval = '1 days';
  else $ticks_x_interval='';
  if(is_array($data_date))
  foreach($data_date as $k=>$v){
		for($i=0;$i<count($dateArray);$i++){
		  if(!$data_date [$k] [$dateArray[$i]]){
			$data_date [$k] [$dateArray[$i]]='0';
		  }
		  if(strtotime(date('Y-m-d'))==strtotime($dateArray[$i]))break;
		}
	  }

  $d1 = substr(form_eng_time($date1),0,10);
  $d2 = substr(form_eng_time(date('d.m.Y',strtotime($date2)+24*60*60)),0,10);
  $date_cur = $d1;
  $data_for_gr = array();
  
  //$y_max = 0;
  foreach($types as $val) {
	$data_for_gr[$val] = array();
	if ($data_date[$val]) {
	  foreach($data_date[$val] as $k=>$v) {
		//$data_for_gr[$val][date('Y-m-d',strtotime($k)-24*60*60)] = 0;
		//$data_for_gr[$val][date('Y-m-d',strtotime($k)+24*60*60)] = 0;
	  }
	  foreach($data_date[$val] as $k=>$v) {
		$data_for_gr[$val][$k] = $v;
		if ($y_max < $v) $y_max = $v;
	  }
	  ksort($data_for_gr[$val]);
	}
  }
  //$y_max++;

  if($y_max>0)$y_max=$y_max+($y_max*0.1);
  elseif($y_min>0)$y_max=$y_max+($y_min*0.1);
  else $y_max=$y_max-($y_min*0.1);
  
  if($y_max < 4) $y_max = 4;

  // заполняем серии
  $is_graph = false;
  $graph_data = array();
  foreach($types as $val) {
	if ($data_for_gr[$val]) {
	  $is_graph = true or $is_graph;
	}
	$graph_data[] = $data_for_gr[$val];
  }

  $d1 = substr(form_eng_time($date1),0,10);
  $d2 = substr(form_eng_time($date2),0,10);

  $graph_settings = array('type_graph' => 'LineDate'
			  ,'div_id' => 'chart1'
			  ,'series_names' => "'".implode("','",$types)."'"
			  ,'x_max' => $d2
			  ,'x_min' => $d1
			  ,'ticks_x_interval' => $ticks_x_interval
			  ,'y_max' => $y_max
			  ,'zoom' => true
			  ,'y_min' => $y_min
			);
  $graph = draw_graph($graph_data, $graph_settings);

  if ($_REQUEST['xsl'] == 1)
	{
	  $xsl = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head><body>\r\n";
	  $xsl .= "<table cellspacing=\"0\" cellpadding=\"3\" border=\"1\">\r\n<tr><td colspan=\"5\"><h1>По продажам</h1></td></tr>\r\n";
	  $xsl .= "<tr><td width=\"150\" style=\"text-align: center\" align=\"center\"></td>\r\n";
	  $xsl .= "<td width=\"100\" style=\"text-align: center\" align=\"center\"><b>Бонус</b></td>\r\n";
	  $xsl .= "<td width=\"100\" style=\"text-align: center\" align=\"center\"><b>Выставлено счетов</b></td>\r\n";
	  $xsl .= "<td width=\"100\" style=\"text-align: center\" align=\"center\"><b>Оплачено счетов</b></td></tr>\r\n";
	  $pos = 1;
	  foreach ($lines AS $data)
		{
		  if ($pos % 2)
			{
			  $xsl .= "<tr><td style=\"background-color: #d0d0d0; text-align: center\" bgcolor=\"#d0d0d0\" align=\"center\">".$data['fio']."</td>\r\n";
			  $xsl .= "<td style=\"background-color: #d0d0d0; text-align: center\" bgcolor=\"#d0d0d0\" align=\"center\">".$data['bonus']."</td>\r\n";
			  $xsl .= "<td style=\"background-color: #d0d0d0; text-align: center\" bgcolor=\"#d0d0d0\" align=\"center\">".$data['invoice']."</td>\r\n";
			  $xsl .= "<td style=\"background-color: #d0d0d0; text-align: center\" bgcolor=\"#d0d0d0\" align=\"center\">".$data['paid']."</td></tr>\r\n";
			}
		  else
			{
			  $xsl .= "<tr><td style=\"text-align: center\" align=\"center\">".$data['fio']."</td>\r\n";
			  $xsl .= "<td style=\"text-align: center\" align=\"center\">".$data['bonus']."</td>\r\n";
			  $xsl .= "<td style=\"text-align: center\" align=\"center\">".$data['invoice']."</td>\r\n";
			  $xsl .= "<td style=\"text-align: center\" align=\"center\">".$data['paid']."</td></tr>\r\n";
			}
		  $pos += 1;
		}
	  $xsl .= "</table></body></html>";
	  $name = 'income_by_companies.xls';
	  header("Content-type: application/vnd.ms-excel; charset=utf-8");
	  header("Content-Disposition: attachment; filename=".$name);
	  echo $xsl;
	  exit;
	}
  else
	{
	  #if ($user['group_id'] == 1) $smarty->assign("adm_rules", 1);
  
	  $smarty->assign("color3", $row['color3']);
	  $smarty->assign("date1", $date1);
	  $smarty->assign("date2", $date2);
	  $smarty->assign("lines", $lines);
	  $smarty->assign("sum_bonus", $sum_bonus);
	  $smarty->assign("sum_invoice", $sum_invoice);
	  $smarty->assign("sum_paid", $sum_paid);
	  $smarty->assign("graph", $graph);		
	  $smarty->assign("is_graph", $is_graph);  
	}

Сообщение отредактировал Dinara: 22 Июль 2013 - 12:24


#2 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 22 Июль 2013 - 12:51

Номер таблицы счета=43

#3 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Июль 2013 - 12:59

Не совсем понял, что значит "распределение суммы между ними". В отчете "По продажам" суммы уже распределены по менеджерам, в зависимости от того, кто выставлял счет.

#4 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 22 Июль 2013 - 13:03

Нет, смотрите,я сейчас создаю дополнительную таблицу, где есть 2 менеджера, при этом там проставляю сколько процентов от итоговой суммы пойдет каждому, например 30/70.
Соответственно, необходимо,чтобы у первого было 0,3*сумма итого, у второго 0,7*сумма итого..

#5 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 22 Июль 2013 - 13:03

В самом счете я не нашла в вычислениях, куда все это идет..так поняла-в отчете по продажам все базируется?

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Июль 2013 - 13:20

Отчет по продажам позиционируется сейчас на данных оплаченных счетов, как я уже выше написал. Т.е. в счетах есть поле, в котором прописывается, кто его выписал. Считаем сумму счетов по каждому менеджеру - получаем итог. Каким образом вы хотите изменить отчет? Прописывать в счете не одного выписывавшего, а нескольких? Или вообще считать его по другой таблице? Боюсь, это уже выходит за рамки техподдержки, т.к. требует пере-разработки отчета (т.е. платной услуги).

#7 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 22 Июль 2013 - 14:33

http://take.ms/aDkEgx

Вот,получается у меня есть 2 менеджера и 2 суммы. Если я отсюда создам счет,там тоже пропишу двух менеджеров (выписал1, выписал2), две суммы итого.

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

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Июль 2013 - 15:12

Чтобы разбираться в отчете по продажам, тем более изменить там что-то, нужно во-первых, потратить время на разбор существующего отчета (даже если бы я его сам писал, т.к. это могло быть давно), во-вторых, знать вашу конфигурацию, чтобы понимать где и на что именно заменить. Это в любом случае разработка уже нового отчета. Не так просто это, как кажется (не "пару строк" подправить). Могу подсказать только общий алгоритм - смотрите на запросы, какие таблицы и поля там задействованы (по их id), и заменяете на свои.

#9 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 23 Июль 2013 - 08:25

if ($_REQUEST['_manager']) set_filter(3381, "=", form_input($_REQUEST['_manager']), '', '');

Я так понимаю,в этой строчке указывается фильтр того,кто выписал счет. А можно ли тут как-нибудь двух прописать?

#10 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Июль 2013 - 10:01

Да, добавляете еще одну команду set_filter со вторым условием.

#11 Dinara

    Активный участник

  • Пользователи
  • PipPipPip
  • 527 сообщений
  • Пол:Женщина
  • Город:Уфа

Отправлено 23 Июль 2013 - 10:17

ок, а вот эти строчки
  $result2 = sql_select_field(DATA_TABLE."43","SUM(f2791) as sum","f448='",$data['fio_id'],"' AND f436>='",$date1_fet,"' AND f436<='",$date2_fet,"' AND status=0 ORDER BY f436");
		  $result2 = sql_select_field("`".DATA_TABLE."43`","SUM(f2791) AS `sum`","`f448`='",$data['fio_id'],"' AND `f436`>='",$date1_fet,"' AND `f436`<='",$date2_fet,"' AND `status`<>'2'");
		  $row2 = sql_fetch_assoc($result2);
		  $data['invoice'] = $row2['sum'];
		  //$result2 = sql_select_field(DATA_TABLE."43","SUM(f2791) as sum"," f448='",$data['fio_id'],"' AND f457>='",$date1_fet,"' AND f457<='",$date2_fet,"' AND status=0 ORDER BY f457");
		  $result2 = sql_select_field("`".DATA_TABLE."43`","SUM(f455) AS `sum`","`f448`='",$data['fio_id'],"' AND `f457`>='",$date1_fet,"' AND `f457`<='",$date2_fet,"' AND `status`=0");
		  $row2 = sql_fetch_assoc($result2);
		  $data['paid'] = $row2['sum'];

Здесь выборка данных происходит, как можно записать вторые значения? Такие же строчки добавить, только со своими полями рядом?

#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Июль 2013 - 11:59

Цитата

Здесь выборка данных происходит, как можно записать вторые значения? Такие же строчки добавить, только со своими полями рядом?

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





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных