Browse Source

Pokaz oferty - rozlicz: add stats, fix bug in rezygnacje zysk total

Piotr Labudda 11 years ago
parent
commit
36a5a2c944
1 changed files with 162 additions and 20 deletions
  1. 162 20
      SE/superedit-POKAZ_OFERTY_AKTUALNE_FUNC.php

+ 162 - 20
SE/superedit-POKAZ_OFERTY_AKTUALNE_FUNC.php

@@ -3325,6 +3325,10 @@ class Column_Base {
 		}
 	}
 
+	function setForce($field, $value) {
+		$this->_data[$field] = $value;
+	}
+
 	function get_cols() {
 		return array_keys($this->_data);
 	}
@@ -6442,6 +6446,11 @@ class Column_users2_offers_groups extends Column_Base {
 		return $zysk * $months - $this->suma_P_OFFER_COSTS_START;
 	}
 
+	function get_srednia_netto() {
+		$this->recount_costs();
+		return $this->suma_P_OFFER_SREDNIA_NETTO;
+	}
+
 	function has_service($p_service) {
 		foreach ($this->_group_external_offers_id as $k_external_id => $v_p_service) {
 			if ($v_p_service == $p_service) {
@@ -7090,6 +7099,7 @@ function POKAZ_OFERTY_AKTUALNE_FUNC__rozlicz_month($month) {
 	$months = array();
 	$cur_y = date('Y');
 	$cur_m = date('m');
+	$DBG = ('rozlicz' == V::get('DBG', '', $_GET));
 
 	for ($i = $cur_m; $i > 0; $i--) {
 		$months []= sprintf("%d-%02d", $cur_y, $i);
@@ -7134,7 +7144,9 @@ function POKAZ_OFERTY_AKTUALNE_FUNC__rozlicz_month($month) {
 .tbl-view-small {font-size:small}
 .tbl-view-small th {font-size:small}
 .tbl-view thead th {background-color:#eee;}
+.tbl-view tfoot td {background-color:#eee;}
 .tbl-view tr:nth-child(even) td {background-color:#eee;}
+.tbl-view-small td {padding:0 2px;}
 
 .tbl_deals { table-layout:fixed; width:100%; }
  .tbl_deals td,
@@ -7231,8 +7243,10 @@ function POKAZ_OFERTY_AKTUALNE_FUNC__rozlicz_month($month) {
 							$v_deal_row->check_errors[] = "Error: REZYGNACJA - brak pakietu (ID_OFFERS_GROUP={$id_offers_group}) w starej umowie (P_DEALNUMBER_OLD={$deal_old_id})";
 						} else {
 							$group->fetch_offers();
+							$group->recount_costs();
 							$v_deal_row->zysk = $group->get_zysk_netto();
-							$v_deal_row->zysk_total = -1 * $v_deal_row->zysk;
+							$v_deal_row->zysk_total = $v_deal_row->zysk * -1;
+							$v_deal_row->abonament_srednia_netto = $group->get_srednia_netto();
 						}
 					}
 				}
@@ -7245,6 +7259,7 @@ function POKAZ_OFERTY_AKTUALNE_FUNC__rozlicz_month($month) {
 				if ($group) {
 					$group->fetch_offers();
 					$v_deal_row->zysk = $group->get_zysk_netto();
+					$v_deal_row->abonament_srednia_netto = $group->get_srednia_netto();
 				}
 			}
 
@@ -7300,18 +7315,18 @@ function POKAZ_OFERTY_AKTUALNE_FUNC__rozlicz_month($month) {
 					}
 				}
 			}
-		}
 
-		if ($v_deal_row->ID_OFFERS_GROUP <= 0) {
-			if ($v_deal_row->deal_type == 'NEW_DEAL') {
-				$out_html_attr['ID_OFFERS_GROUP'] = ' style="background-color:red" title="' . "Nowa umowa musi mieć wypełnione pole ID_OFFERS_GROUP" . '"';
+			if ($v_deal_row->ID_OFFERS_GROUP <= 0) {
+				if ($v_deal_row->deal_type == 'NEW_DEAL') {
+					$out_html_attr['ID_OFFERS_GROUP'] = ' style="background-color:red" title="' . "Nowa umowa musi mieć wypełnione pole ID_OFFERS_GROUP" . '"';
+				}
 			}
-		}
 
-		$v_deal_row->zysk_total = $group->get_zysk_netto_by_months($v_deal_row->miesiecy);//$v_deal_row->zysk * $v_deal_row->miesiecy;
-		if ($v_deal_row->deal_type == 'ANEKS') {
-			if ($v_deal_row->aneks_diff > 0 && $v_deal_row->aneks_loss) {
-				$v_deal_row->zysk_total -= $v_deal_row->aneks_loss;
+			$v_deal_row->zysk_total = $group->get_zysk_netto_by_months($v_deal_row->miesiecy);//$v_deal_row->zysk * $v_deal_row->miesiecy;
+			if ($v_deal_row->deal_type == 'ANEKS') {
+				if ($v_deal_row->aneks_diff > 0 && $v_deal_row->aneks_loss) {
+					$v_deal_row->zysk_total -= $v_deal_row->aneks_loss;
+				}
 			}
 		}
 
@@ -7386,20 +7401,147 @@ function POKAZ_OFERTY_AKTUALNE_FUNC__rozlicz_month($month) {
 		}
 	}
 
+	if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($dealsOut);echo'</pre>';}
+	$statsByFoundType = array();
+	/** @2014-08-20
+	 * [13245] KOMORKA bok_nowa_umowa_wartosc_sprzed_kontrakt bok nowa um. wart.sprzed.kontr. Jaka wartość wynika ze sprzedanych kontraktów z tytułu nowych umów. Czyli kwota abonamentu razy długość kontraktu.
+	 * 
+	 * [13246] KOMORKA bok_nowa_umowa_zysk_kontrakt bok nowa um. zysk kontakt Jaki jest zysk wynikły ze sprzedanych kontraktów z tytułu nowej umowy.
+	 * 
+	 * [13247] KOMORKA bok_aneks_wartosc_sprzed_kontrakt bok aneks wart.sprzed. Jaka jest wartość sprzedaży wynikła z podpisania aneksu. Czyli jeżeli klient przeszedł z umowy na czas nieokreślony, będzie to okres umowy razy ilość abonamentów. Jeżeli zmienił umowę z innej umowy na czas określony, to z zysku należy odjąć wartość, jaka wynikała z jego poprzedniej umowy i terminu obowiązywania.
+	 * 
+	 * [13248] KOMORKA bok_aneks_zysk_kontrakt bok aneks zysk kontrakt Jaki jest zysk z tytułu kontraktów jakie zamówił klient w wyniku podpisania aneksu. Należy odjąć zysk od usług które były wcześniej zamówione na okres pokrywający się. Czyli jeżeli klient miał umowę na rok za usługę z zyskiem 50zł, to jeżeli podpisał umowę na 2 lata na usługę z takim samym zyskiem, to należy od zysku 24m-c x 50 PLN odjąć pozostały okres umowy 12m-c x 50 PLN = 1200-600 = 600 PLN.
+	 * 
+	 * [13249] KOMORKA bok_rezygnacja_strata_zysk_1_mies bok rez.wart.strac.zysk 1mies. Należy zsumować wartość zysku jaka przestanie wpływać do firmy z tytułu zakupywanych usług przez klientów.
+	 * 
+	 * [13250] KOMORKA bok_rezygnacja_strata_wartosc_sprzed bok rez.wart.straty 1mies Należy tutaj zsumować wartość abonamentów jakie przestaną wpływać do firmy z tytułu zakupywanych usług przez klientów, którzy złożyli rezygnacje.
+	 * 
+	 * $statsByFoundType:
+	 *   zysk_total - KPI: [13246], [13248]
+	 *   abonament_srednia_netto
+	 */
+	$errosNoGroupIDInOldDeal = array();
+	foreach ($dealsOut as $kId => $r) {
+		$vStat = V::get($r->deal_type, null, $statsByFoundType);
+		if (!$vStat) {
+			$vStat = new stdClass();
+			$vStat->ilosc = 0;
+			$vStat->zysk_total = 0;
+			$vStat->abonament_srednia_netto = 0;
+		}
+
+		$vStat->ilosc += 1;
+		$vStat->zysk_total += $r->zysk_total;
+		if (!$r->abonament_srednia_netto) {
+			$errosNoGroupIDInOldDeal[$r->ID] = $r;
+		} else {
+			$vStat->abonament_srednia_netto += $r->abonament_srednia_netto;
+		}
+
+		$statsByFoundType[$r->deal_type] = $vStat;
+	}
+
+	$sumaSrAboZoff = 0;
+	$sumaSrZyskZoff = 0;
+	foreach ($errosNoGroupIDInOldDeal as $k => $r) {
+		if ('REZYGNACJA' == $r->deal_type && !empty($r->ID_OFFERS_OFF)) {
+			$group = new Column_users2_offers_groups();
+			$group->setForce('P_DEALTERM_MONTHS', 24);
+			$group->fetch_offers_by_ids(explode(',', $r->ID_OFFERS_OFF));
+			$group->recount_costs();
+			if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">group for deal('.$r->ID.') ID_OFFERS_OFF('.$r->ID_OFFERS_OFF.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($group);echo'</pre>';}
+			$errosNoGroupIDInOldDeal[$k]->abonament_srednia_netto_prze_1mies = $group->get_srednia_netto();
+			$errosNoGroupIDInOldDeal[$k]->zysk_total = -1 * $group->get_zysk_netto();
+
+			$sumaSrAboZoff += $errosNoGroupIDInOldDeal[$k]->abonament_srednia_netto_prze_1mies;
+			$sumaSrZyskZoff += $errosNoGroupIDInOldDeal[$k]->zysk_total;
+		}
+	}
+
 	?>
 	<h3>Podsumowanie:</h3>
-	<table cellspacing="0" cellpadding="0" border="1" class="tbl-view tbl-view-small">
-	<thead>
-		<th>RODZAJ_DZIALANIA_HANDLOWEGO</th>
-		<th>ilość</th>
-	</thead>
-	<tbody>
-		<?php foreach ($statsType as $type => $vStat) : ?>
+	<table cellspacing="0" cellpadding="0" border="0">
 		<tr>
-			<td><?php echo $type; ?></td><td><?php echo $vStat->ilosc; ?></td>
+			<td style="vertical-align:top">
+				<table cellspacing="0" cellpadding="0" border="1" class="tbl-view tbl-view-small">
+				<thead>
+					<th>RODZAJ_DZIALANIA_HANDLOWEGO</th>
+					<th>ilość</th>
+				</thead>
+				<tbody>
+					<?php foreach ($statsType as $type => $vStat) : ?>
+					<tr>
+						<td><?php echo $type; ?></td><td><?php echo $vStat->ilosc; ?></td>
+					</tr>
+					<?php endforeach; ?>
+				</tbody>
+				</table>
+			</td>
+			<td style="vertical-align:top;padding-left:20px;">
+				<table cellspacing="0" cellpadding="0" border="1" class="tbl-view tbl-view-small">
+				<thead>
+					<th>Wykryty rodzaj umowy</th>
+					<th>ilość</th>
+					<th class="tbl_deals-col_num" title="Zysk całkowity: Zysk * Mies. - Aneks Strata">Zysk</th>
+					<th class="tbl_deals-col_num" title="Średni miesięczny abonament netto">Śr. abonament</th>
+				</thead>
+				<tbody>
+					<?php foreach ($statsByFoundType as $type => $vStat) : ?>
+					<tr>
+						<td><?php echo $type; ?></td>
+						<td><?php echo $vStat->ilosc; ?></td>
+						<td><?php echo number_format($vStat->zysk_total, 2, ',', ''); ?></td>
+						<td><?php echo number_format($vStat->abonament_srednia_netto, 2, ',', ''); ?></td>
+					</tr>
+					<?php endforeach; ?>
+				</tbody>
+				</table>
+				<?php if (!empty($errosNoGroupIDInOldDeal)) : ?>
+					<h4 style="color:red">Błędy w umowach (<?php echo count($errosNoGroupIDInOldDeal); ?>):</h4>
+					<table cellspacing="0" cellpadding="0" border="1" class="tbl-view tbl-view-small">
+						<thead>
+							<th title="Numer umowy">Nr</th>
+							<th title="Numer klienta">Klient</th>
+							<th title="Wykryty rodzaj umowy">Typ</th>
+							<th title="Numery ofert do wyłączenia">ID_OFFERS_OFF</th>
+							<th title="Średni miesięczny zysk netto na podstawie numerów ofert do wyłączenia">Śr. zysk</th>
+							<th title="Średni miesięczny abonament netto na podstawie numerów ofert do wyłączenia">Śr. abonament</th>
+						</thead>
+						<tfoot>
+							<td style="text-align:right" colspan="4">Suma:</td>
+							<td><?php echo $sumaSrZyskZoff; ?></td>
+							<td><?php echo $sumaSrAboZoff; ?></td>
+						</tfoot>
+						<tbody>
+						<?php foreach ($errosNoGroupIDInOldDeal as $deal) : ?>
+							<tr>
+								<td style="padding:0 3px;"><?php echo $deal->ID; ?></td>
+								<td style="padding:0 3px;"><?php echo $deal->ID_BILLING_USERS; ?></td>
+								<td style="padding:0 3px;"><?php echo $deal->deal_type; ?></td>
+								<td style="padding:0 3px;"><?php echo $deal->ID_OFFERS_OFF; ?></td>
+								<td style="padding:0 3px;">
+									<?php if (!$deal->zysk_total) : ?>
+										<b style="color:red">Brak</b>
+									<?php else : ?>
+										<?php echo number_format($deal->zysk_total, 2, ',', ''); ?>
+									<?php endif; ?>
+								</td>
+								<td style="padding:0 3px;">
+									<?php if (!$deal->abonament_srednia_netto_prze_1mies) : ?>
+										<b style="color:red">Brak</b>
+									<?php else : ?>
+										<?php echo number_format($deal->abonament_srednia_netto_prze_1mies, 2, ',', ''); ?>
+									<?php endif; ?>
+								</td>
+							</tr>
+						<?php endforeach; ?>
+						</tbody>
+					</table>
+				<?php endif; ?>
+				
+				<?php if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($errosNoGroupIDInOldDeal);echo'</pre>';} ?>
+			</td>
 		</tr>
-		<?php endforeach; ?>
-	</tbody>
 	</table>
 	<?php
 }