Преглед на файлове

+ windykacja status tool for table and @selected

Piotr Labudda преди 6 години
родител
ревизия
b3895777d8

+ 269 - 0
SE/se-lib/Route/UrlAction/WindykacjaUpdateStatus.php

@@ -0,0 +1,269 @@
+<?php
+
+Lib::loadClass('RouteBase');
+Lib::loadClass('FeatureAttrSelected');
+Lib::loadClass('Response');
+Lib::loadClass('Windykacja_StatsModel');
+Lib::loadClass('Windykacja_StatsHelper');
+
+// Tool with Lock actions on primary key
+class Route_UrlAction_WindykacjaUpdateStatus extends RouteBase {
+
+	function defaultAction() {
+		$postTask = V::get('_postTask', '', $_POST);
+		switch ($postTask) { // PostTask outputs html; TODO: move to WPS functions
+			case 'updateSelected': return $this->updateSelectedPostTask();
+			case 'updateAll': return $this->updateAllPostTask();
+		}
+
+		UI::layout([ $this, 'defaultView' ]);
+	}
+
+	function viewTop() {
+		echo UI::h('h3', [], "Aktualizacja statusu windykacji klientów");
+	}
+
+	function defaultView() {
+		$totalSelected = FeatureAttrSelected::getTotalSelected($typeName = "default_db/USERS2_WINDYKACJA_STATUS");
+		$totalClients = (int)DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+		");
+		$totalToUpdateClients = (int)DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+			where t.A_STATUS_UPDATE_DATE < :today
+		", [
+			':today' => date("Y-m-d"),
+		]);
+
+		// UI::h('div', [ 'class' => "alert alert-success" ], "Wszystkie wybrane rekordy są aktualne");
+
+		$this->viewTop();
+		echo UI::h('div', [ 'style' => "font-size:14px" ], [
+			($totalSelected)
+			?	UI::h('div', [ 'style' => "margin: 32px 0" ], [
+					UI::h('p', [], "Wybrano <b>{$totalSelected}</b> rekordów"),
+					UI::hButtonPost("aktualizuj", [
+						'class' => "btn-primary",
+						'data' => [
+							'_route' => "UrlAction_WindykacjaUpdateStatus",
+							'_postTask' => "updateSelected",
+						]
+					]),
+				])
+			:	'',
+
+			($totalToUpdateClients)
+			?	UI::h('div', [ 'style' => "margin: 32px 0" ], [
+					UI::h('p', [], "Rekordów wymagających aktualizacji jest <b>{$totalToUpdateClients}</b>"),
+					UI::hButtonPost("aktualizuj wszystkie", [
+						'class' => "btn-primary",
+						'data' => [
+							'_route' => "UrlAction_WindykacjaUpdateStatus",
+							'_postTask' => "updateAll",
+						]
+					]),
+				])
+			:	'',
+		]);
+
+		// $selected = FeatureAttrSelected::getAllSelected($typeName = "default_db/USERS2_WINDYKACJA_STATUS");
+		// DBG::nicePrint($selected, '$selected');
+
+		if(0){ // text create tasks
+			$taskUrl = $this->getLink('testSleep', [ 'sleep' => 10 ]);
+			echo UI::h('script', [], "
+				var DBG = 0;
+				var DBG1 = 1;
+				var xhr = new XMLHttpRequest();
+	
+				xhr.onreadystatechange = function () {
+					if (xhr.readyState == 4) {
+						DBG1 && console.log('ready state = 4');
+					}
+				};
+	
+				xhr.open('GET', '{$taskUrl}', true);
+				// xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
+				xhr.timeout = 1000;
+				xhr.ontimeout = function () {
+					DBG1 && console.log('Timed out!!!');
+				}
+				xhr.send();
+			");
+		}
+	}
+	function testSleepAction() {
+		$totalSleep = V::get('sleep', 2, $_REQUEST);
+		while ($totalSleep-- > 0) {
+			DBG::log("DBG:testSleep[{$totalSleep}]");
+			sleep(1);
+		}
+		DBG::log("DBG:testSleep::END");
+	}
+
+	function updateSelectedPostTask() { UI::layout([ $this, 'updateSelectedPostTaskView' ]); }
+	function updateSelectedPostTaskView() {
+		$totalSelected = FeatureAttrSelected::getTotalSelected($typeName = "default_db/USERS2_WINDYKACJA_STATUS");
+
+		// - `A_STATUS_UPDATE_DATE`: "Data ostatniej aktualizacji danych"
+		// 	- synchronizacja (ręczna, codziennie)
+		// 		- [ ] sync on client view (btn just reload): "?MENU_INIT=USERS2_WINDYKACJA_STATUS&q={$q}&_p={$p}&_f={$f}&_user_id={$idUser}"
+		// 		- [ ] sync all (partial) ""?MENU_INIT=USERS2_WINDYKACJA_STATUS&task=stats_update"
+		// - `LAST_PAY_DATE`: "data ostatniej wpłaty"
+		// - `PAY_DATE`: "data wymagalności ostatniej faktury"
+		// - `LAST_SMS_MSG_ID`, `LAST_SMS_STATUS`
+		// - `LAST_MAIL_MSG_ID`, `LAST_MAIL_STATUS`
+		$sqlSelected = FeatureAttrSelected::getAllSelectedAsSqlSubQuery($typeName = "default_db/USERS2_WINDYKACJA_STATUS");
+		$todoSelectedToUpdate = DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+			where t.ID in ( {$sqlSelected} )
+				and t.A_STATUS_UPDATE_DATE < :today
+		", [
+			':today' => date("Y-m-d"),
+		]);
+
+		$this->viewTop();
+		echo UI::h('div', [ 'class' => "alert alert-info" ], [
+			"Zaznaczono {$totalSelected}",
+			($todoSelectedToUpdate == 0) ? " ale wszystkie są aktualne" : "",
+			($todoSelectedToUpdate > 0 && $todoSelectedToUpdate < $totalSelected) ? " z czego do aktualizacji {$todoSelectedToUpdate}." : "",
+			($todoSelectedToUpdate == $totalSelected) ? ", wszystkie do aktualizacji." : "",
+		]);
+
+		// $todoRows = DB::getPDO()->fetchAll("
+		// 	select t.ID, t.ID_BILLING_USERS
+		// 		, t.A_STATUS_UPDATE_DATE
+		// 		, t.LAST_PAY_DATE
+		// 		, t.PAY_DATE
+		// 		, t.LAST_SMS_MSG_ID
+		// 		, t.LAST_MAIL_MSG_ID
+		// 	from USERS2_WINDYKACJA_STATUS t
+		// 	where t.ID in ( {$sqlSelected} )
+		// ");
+		// UI::table([ 'caption' => "DBG: Wszystkie zaznaczone rekordy", 'rows' => $todoRows ]);
+
+		echo UI::h('script', ['src'=>"static/vendor.js", 'type'=>"text/javascript"]);
+		echo UI::h('div', [ 'id' => "p5-widget-windykacja-status-update" ]);
+		UI::inlineJS(__FILE__ . '.view.js', [
+			'HTML_ID' => "p5-widget-windykacja-status-update",
+			'TOTAL' => $totalSelected,
+			'EXECUTE_SINGLE_TASK_URL' => $this->getLink("updateOneFromSelectedAjaxTask"),
+		]);
+	}
+
+	function updateAllPostTask() { UI::layout([ $this, 'updateAllPostTaskView' ]); }
+	function updateAllPostTaskView() {
+		$totalClients = (int)DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+		");
+
+		$this->viewTop();
+		echo UI::h('script', ['src'=>"static/vendor.js", 'type'=>"text/javascript"]);
+		echo UI::h('div', [ 'id' => "p5-widget-windykacja-status-update" ]);
+		UI::inlineJS(__FILE__ . '.view.js', [
+			'HTML_ID' => "p5-widget-windykacja-status-update",
+			'TOTAL' => $totalClients,
+			'EXECUTE_SINGLE_TASK_URL' => $this->getLink("updateOneFromAllAjaxTask"),
+		]);
+	}
+
+	function updateOneFromSelectedAjaxTaskAction() { Response::sendTryCatchJson([ $this, 'updateOneFromSelectedAjaxTask' ]); }
+	function updateOneFromSelectedAjaxTask($args) {
+		$total = (int)FeatureAttrSelected::getTotalSelected($typeName = "default_db/USERS2_WINDYKACJA_STATUS");
+		$sqlSelected = FeatureAttrSelected::getAllSelectedAsSqlSubQuery($typeName = "default_db/USERS2_WINDYKACJA_STATUS");
+		$totalToUpdate = (int)DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+			where t.ID in ( {$sqlSelected} )
+				and t.A_STATUS_UPDATE_DATE < :today
+		", [
+			':today' => date("Y-m-d"),
+		]);
+		$totalDone = $total - $totalToUpdate;
+		$percentDone = ($totalDone / $total) * 100;
+
+		{
+			$toUpdateClientID = (int)DB::getPDO()->fetchValue("
+				select t.ID_BILLING_USERS
+				from USERS2_WINDYKACJA_STATUS t
+				where t.ID in ( {$sqlSelected} )
+					and t.A_STATUS_UPDATE_DATE < :today
+				order by ID DESC
+				limit 1
+			", [
+				':today' => date("Y-m-d"),
+			]);
+			$user = Windykacja_StatsModel::get_user_by_id($toUpdateClientID);
+			if ($user) {
+				$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user);
+				Windykacja_StatsHelper::update_stats($user, $billing_docs);
+			}
+		}
+
+		return [
+			'type' => "success",
+			'msg' => "ok",
+			'body' => [
+				'total' => $total,
+				'totalDone' => $totalDone,
+				'totalToUpdate' => $totalToUpdate,
+				'percentDone' => $percentDone,
+			],
+		];
+	}
+	function updateOneFromAllAjaxTaskAction() { Response::sendTryCatchJson([ $this, 'updateOneFromAllAjaxTask' ]); }
+	function updateOneFromAllAjaxTask($args) {
+		$total = (int)DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+		");
+		$totalToUpdate = (int)DB::getPDO()->fetchValue("
+			select count(*) as total
+			from USERS2_WINDYKACJA_STATUS t
+			where t.A_STATUS_UPDATE_DATE < :today
+		", [
+			':today' => date("Y-m-d"),
+		]);
+		$totalDone = $total - $totalToUpdate;
+		$percentDone = ($totalDone / $total) * 100;
+
+		{
+			$toUpdateClientListIds = DB::getPDO()->fetchValuesList("
+				select t.ID_BILLING_USERS
+				from USERS2_WINDYKACJA_STATUS t
+				where t.A_STATUS_UPDATE_DATE < :today
+				order by ID DESC
+				limit 10
+			", [
+				':today' => date("Y-m-d"),
+			]);
+			foreach ($toUpdateClientListIds as $toUpdateClientID) {
+				$user = Windykacja_StatsModel::get_user_by_id($toUpdateClientID);
+				if ($user) {
+					$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user);
+					Windykacja_StatsHelper::update_stats($user, $billing_docs);
+				} else {
+					DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $toUpdateClientID, [
+						'A_STATUS_UPDATE_DATE' => date("Y-m-d"),
+					]);
+				}
+			}
+		}
+
+		return [
+			'type' => "success",
+			'msg' => "ok",
+			'body' => [
+				'total' => $total,
+				'totalDone' => $totalDone,
+				'totalToUpdate' => $totalToUpdate,
+				'percentDone' => $percentDone,
+			],
+		];
+	}
+
+}

+ 180 - 0
SE/se-lib/Route/UrlAction/WindykacjaUpdateStatus.php.view.js

@@ -0,0 +1,180 @@
+var DBG = DBG || 0;
+var DBG1 = true;
+var EXECUTE_NEXT_ACTION_LIMIT = 1000;
+var EXECUTE_NEXT_ACTION_INTERVAL = 100;
+
+if (!HTML_ID) throw "Missing HTML_ID";
+if (!TOTAL) throw "Missing TOTAL";
+if (!EXECUTE_SINGLE_TASK_URL) throw "Missing EXECUTE_SINGLE_TASK_URL";
+if (!global.p5VendorJs) throw "Missing vendor.js";
+
+var createReactClass = global.p5VendorJs.createReactClass;
+var h = global.p5VendorJs.React.createElement;
+var ReactDOM = global.p5VendorJs.ReactDOM;
+// var AsyncTypeahead = window.p5VendorJs.AsyncTypeahead;
+
+// responseBody:
+// - percentDone
+// - totalToUpdate
+// - total
+// - totalDone
+var sendRequest = (function () { // uses: EXECUTE_SINGLE_TASK_URL
+	var _versionSent = 1;
+	var _versionReceived = 0;
+
+	return function () {// return function (limit, page, sorted, filtered) {
+		// var filterTableProps = {
+		// 	limit: limit || REQUEST_DATA_LIMIT,
+		// 	page: page || 0,
+		// 	sorted: sorted || [],
+		// 	filtered: filtered || [],
+		// };
+		_versionSent++;
+		var this_version = _versionSent;
+
+		return global.fetch(EXECUTE_SINGLE_TASK_URL, {
+			header: { 'contentType': 'applications/json' },
+			credentials: 'same-origin',
+			method: 'GET',
+			// body: JSON.stringify(filterTableProps), // POST
+		}).then(function (result) {
+			if (this_version < _versionReceived) throw "Skipped response: already received newer version.";
+			return result.json()
+		}).then(function (data) {
+			DBG && console.log("DBG:EXECUTE_SINGLE_TASK_URL:Data", { data })
+			_versionReceived = this_version;
+			// DBG && console.log("DBG:sendRequest:afterReceived", { _versionSent, _versionReceived, _lastPropsJson, this_version, this_lastPropsJson });
+			return data.body;  // body: { rows: [], total: int }
+		})
+	}
+})();
+
+
+var P5UI__WindykacjaStatusUpdate = createReactClass({
+	getInitialState: function () {
+		return {
+			errorMsg: '',
+			loading: false,
+			version: 0,
+			responseBody: null,
+			execLimit: EXECUTE_NEXT_ACTION_LIMIT,
+			execCounter: 0,
+			execAgain: true,
+		}
+	},
+	componentDidMount: function () {
+		this.runUpdateStatus();
+	},
+
+	runAgainIfNotDone: function () {
+		if (!this.state.execAgain) return;
+		if (this.state.responseBody && 100 === this.state.responseBody.percentDone) {
+			return;
+		}
+		if (this.state.execCounter > this.state.execLimit) {
+			this.setState({
+				errorMsg: "Osiągnięto limit wywołań funkcji",
+			})
+			return;
+		}
+
+		var _runUpdateStatus = this.runUpdateStatus.bind(this);
+		setTimeout(_runUpdateStatus, EXECUTE_NEXT_ACTION_INTERVAL)
+	},
+
+	runUpdateStatus: function () {
+		DBG && console.log('DBG:runUpdateStatus', {});
+		this.setState({ loading: true });
+		var _runAgainIfNotDone = this.runAgainIfNotDone.bind(this);
+		var _setState = this.setState.bind(this);
+		var _version = this.state.version + 1; // TODO: handle race condition
+		sendRequest().then(responseBody => {
+			_setState({
+				responseBody: responseBody,
+				version: _version,
+				loading: false,
+				execCounter: this.state.execCounter + 1,
+			}, _runAgainIfNotDone);
+		}).catch(function (e) {
+			if ("Skipped request" === ('' + e).substr(0, "Skipped request".length)) {
+				console.log("DBG:sendRequest:Skipped", e)
+				_setState({
+					loading: false,
+				}, );
+				return;
+			}
+			console.log("Error:sendRequest", e)
+			_setState({
+				loading: false,
+				errorMsg: '' + e,
+			});
+		});
+	},
+
+	handleClickRestart: function (event) {
+		event.preventDefault()
+		location.reload()
+	},
+	handleClickPause: function (event) {
+		event.preventDefault()
+		this.setState({ execAgain: false })
+	},
+	handleClickPlay: function (event) {
+		event.preventDefault()
+		this.setState({ execAgain: true })
+		this.runUpdateStatus();
+	},
+
+	render: function () {
+		DBG && console.log('DBG:render', { state: this.state });
+		var percent = (this.state.responseBody) ? Math.round(this.state.responseBody.percentDone, 2) : 0;
+		var panelClass = (percent < 100) ? "warning" : "success";
+		if (this.state.errorMsg) panelClass = "danger";
+		var iconPause = h('i', { className: "glyphicon glyphicon-pause" });
+		var iconPlay = h('i', { className: "glyphicon glyphicon-play" });
+
+		return h('div', { p5_node_id: 'p5-windykacja-status-update-widget' }, [
+			h('div', { className: "panel panel-" + panelClass }, [
+				h('div', { className: "panel-heading" }, [
+				]),
+				h('div', { className: "panel-body", style: { paddingBottom: "0" } }, [
+					h('p', {}, [
+						"Aktaulizacja statusu " + this.props.total + " rekordów ",
+						" ",
+						(this.state.execAgain)
+						? h('button', { className: "btn btn-xs btn-default", onClick: this.handleClickPause }, [ iconPause, "Zatrzymaj" ])
+						: h('button', { className: "btn btn-xs btn-default", onClick: this.handleClickPlay }, [ iconPlay, "Uruchom ponownie" ]),
+					]),
+					h('div', { className: "progress" }, [
+						h('div', { className: "progress-bar",
+							role: "progressbar",
+							ariaValuenow: percent,
+							ariaValuemin: "0", ariaValuemax: "100",
+							style: { width: "" + percent + "%" },
+						}, [
+							"" + percent + "%"
+						]),
+					]),
+
+					(this.state.responseBody)
+					? h('p', {}, "Wykonano " + this.state.responseBody.totalDone + " z " + this.state.responseBody.total)
+					: '',
+
+					(this.state.errorMsg) ? h('div', { className: "alert alert-danger" }, [
+						this.state.errorMsg,
+						" ",
+						h('button', { className: "btn btn-primary", onClick: this.handleClickRestart }, "Uruchom ponownie")
+					]) : "",
+
+				]),
+			]),
+		]);
+	}
+});
+
+ReactDOM.render(
+	h(P5UI__WindykacjaStatusUpdate, {
+		total: TOTAL,
+	}),
+	document.getElementById(HTML_ID)
+)

+ 279 - 0
SE/se-lib/Windykacja/BillingListDocs.php

@@ -0,0 +1,279 @@
+<?php
+
+
+class Windykacja_BillingListDocs {
+
+	var $_docs;
+	var $_saldo;
+
+	public function __construct() {
+		$this->_docs = array();
+		$this->_saldo = 0;
+	}
+
+	public function add_bill_doc($data, $type, $h) {
+		$bill_doc = new Windykacja_BillingDoc($type, $h);
+		if ('FVAT' == $type && '0000-00-00' == $data) {
+			$data = $h['BILL_DATE'];
+		}
+		$this->_docs[$data][] = $bill_doc;
+		if ($data <= date("Y-m-d")) {
+			$this->_saldo += $bill_doc->get_saldo();
+		}
+	}
+
+	public function add_event($data, $type, $h) {
+		$event = new Windykacja_EventDoc($type, $h);
+		$this->_docs[$data][] = $event;
+	}
+
+	public function get_saldo() {
+		if (round($this->_saldo, 2) === 0.0) {// float point bug round('-6.821210263297E-13', 2) = -0
+			$this->_saldo = 0.0;
+		}
+		return round($this->_saldo, 2);
+	}
+
+	public function get_saldo_30_dni() {
+		// `PAY_SALDO_30_DNI` bez fv z terminem płatności < 30 dni
+		$saldo_30_dni = 0;
+		$dateMinus30dni = date('Y-m-d', mktime(0,0,0, date('n'), date('j') - 30, date('Y')));
+		foreach ($this->_docs as $kData => $vDocs) {
+			foreach ($vDocs as $vDoc) {
+				if ($vDoc instanceof Windykacja_BillingDoc) {
+					if ('FVAT' == $vDoc->get_type()) {// TODO: if FVAT then use only date PAYMENT_TERM >= 30 dni
+						if ($vDoc->get('PAYMENT_TERM') > $dateMinus30dni) {
+							//echo'<pre>POMIŃ! $vDoc pay_term('.$vDoc->get('PAYMENT_TERM').') ';print_r($vDoc);echo'</pre>';
+						} else {
+							//echo'<pre>$vDoc pay_term('.$vDoc->get('PAYMENT_TERM').'/'.($vDoc->get('PAYMENT_TERM') > $dateMinus30dni).') ';print_r($vDoc);echo'</pre>';
+							$saldo_30_dni += $vDoc->get_saldo();
+						}
+					} else {
+						$saldo_30_dni += $vDoc->get_saldo();
+					}
+				}
+			}
+		}
+		$saldo_30_dni = round($saldo_30_dni, 2);
+		if ($saldo_30_dni === 0.0) {// float point bug round('-6.821210263297E-13', 2) = -0
+			$saldo_30_dni = 0.0;
+		}
+		return $saldo_30_dni;
+	}
+
+	public function get_saldo_issued() {
+		// `PAY_SALDO_ISSUED` fv wg daty wystawienia
+		$saldo_issued = 0;
+		foreach ($this->_docs as $kData => $vDocs) {
+			foreach ($vDocs as $vDoc) {
+				if ($vDoc instanceof Windykacja_BillingDoc) {
+					if (1) {// TODO: if FVAT then use SELL_DATE instead of PAYMENT_TERM
+						$saldo_issued += $vDoc->get_saldo();
+					} else {
+						$saldo_issued += $vDoc->get_saldo();
+					}
+				}
+			}
+		}
+		$saldo_issued = round($saldo_issued, 2);
+		if ($saldo_issued === 0.0) {// float point bug round('-6.821210263297E-13', 2) = -0
+			$saldo_issued = 0.0;
+		}
+		return $saldo_issued;
+	}
+
+	public function get_docs() {
+		return $this->_docs;
+	}
+
+	public function sort_docs() {
+		ksort($this->_docs);
+	}
+
+	public function get_unpaid_fvat() {
+		$today_date = date("Y-m-d");
+		$fvat_arr = array();
+		$saldo_curr = $this->get_saldo();
+		if ($saldo_curr >= 0) {
+			return $fvat_arr;
+		}
+		$break = false;
+		$saldo_dates_keys = array_keys($this->_docs);
+		$saldo_dates_keys = array_reverse($saldo_dates_keys);
+		foreach ($saldo_dates_keys as $k_data) {
+			if ($k_data > $today_date) continue;
+			$v_saldo_arr = $this->_docs[$k_data];
+			foreach ($v_saldo_arr as $k_ind => $v_doc) {
+				if ($v_doc->get_type() == 'FVAT') {
+					$h = $v_doc->get_data();
+					$h['WINIEN_POZOSTALO'] = round($h['WINIEN'], 2);
+					$saldo_curr += round($h['WINIEN'], 2);
+					if ($saldo_curr >= 0) {
+						$h['WINIEN_POZOSTALO'] -= $saldo_curr;
+						$break = true;
+					}
+					$fvat_arr[] = $h;
+				}
+				if ($break) break;
+			}
+			if ($break) break;
+		}
+		return $fvat_arr;
+	}
+
+	public function getLastIncomeDocsForSaldo($saldoLimit) {
+		$today_date = date("Y-m-d");
+		$incomeDocs = array();
+		$break = false;
+		$saldo_dates_keys = array_keys($this->_docs);
+		$saldo_dates_keys = array_reverse($saldo_dates_keys);
+		$saldo_curr = 0;
+		foreach ($saldo_dates_keys as $k_data) {
+			if ($k_data > $today_date) continue;
+			$v_saldo_arr = $this->_docs[$k_data];
+			foreach ($v_saldo_arr as $k_ind => $v_doc) {
+				if (in_array($v_doc->get_type(), array('WB_MASS','KP'))) {
+					$h = $v_doc->get_data();
+					$h['MA_POZOSTALO'] = round($h['MA'], 2);
+					$saldo_curr += round($h['MA'], 2);
+					if ($saldo_curr >= $saldoLimit) {
+						$h['MA_POZOSTALO'] -= $saldo_curr - $saldoLimit;
+						$break = true;
+					}
+					$incomeDocs[] = $h;
+				}
+				if ($break) break;
+			}
+			if ($break) break;
+		}
+		return $incomeDocs;
+	}
+
+	public function get_last_pay_doc() {
+		$last_pay_doc = null;
+		$today_date = date("Y-m-d");
+		$break = false;
+		foreach ($this->_docs as $k_data => $v_saldo_arr) {
+			if ($k_data > $today_date) continue;
+			foreach ($v_saldo_arr as $k_ind => $v_doc) {
+				if (in_array($v_doc->get_type(), array('WB_MASS','KP'))) {
+					$last_pay_doc = $v_doc;
+					break;
+				}
+			}
+			if ($break) break;
+		}
+		return $last_pay_doc;
+	}
+
+	public function get_last_fvat_doc() {
+		$last_fvat_doc = null;
+		$today_date = date("Y-m-d");
+		$break = false;
+		foreach ($this->_docs as $k_data => $v_saldo_arr) {
+			if ($k_data > $today_date) continue;
+			foreach ($v_saldo_arr as $k_ind => $v_doc) {
+				if (in_array($v_doc->get_type(), array('FVAT'))) {
+					$last_fvat_doc = $v_doc;
+					break;
+				}
+			}
+			if ($break) break;
+		}
+		return $last_fvat_doc;
+	}
+
+}
+
+
+class Windykacja_TimelineDoc {
+
+	var $_type;
+	var $_data;
+	var $_class;
+
+	public function get_type() { return $this->_type; }
+	public function get_data() { return $this->_data; }
+	public function get_class() { return $this->_class; }
+	public function get($key) {
+		return $this->_data[$key];
+	}
+
+}
+
+
+class Windykacja_EventDoc extends Windykacja_TimelineDoc {
+
+	public function __construct($type, &$data) {
+		$this->_data = $data;
+		$this->_class = 'EVENT';
+		$this->_type = $type;
+	}
+
+}
+
+
+class Windykacja_BillingDoc extends Windykacja_TimelineDoc {
+
+	public function __construct($type, &$data) {
+		$this->_data = $data;
+		$this->_class = 'BILLING';
+		$this->_convert_type($type);
+		$this->_count_saldo();
+	}
+
+	public function get_saldo() {
+		return $this->_saldo;
+	}
+
+	public function get($key) {
+		return $this->_data[$key];
+	}
+
+	public function _convert_type($type) {
+		$this->_type = $type;
+		switch ($this->_type) {
+			case 'FVAT':
+				$this->_data['nr'] = $this->_data['ID_BILLING_NUMBERS'];
+				$this->_data['WINIEN'] = $this->_data['WARTOSC'];
+				$this->_data['MA'] = 0;
+				break;
+
+			case 'KP':
+			case 'KW':
+			case 'WB':
+			case 'WB_MASS':
+			case 'KORV':
+				$this->_data['nr'] = $this->_data['NUMBER'];
+				break;
+
+			default:
+
+		}
+	}
+
+	public function _count_saldo() {
+		$this->_saldo = 0;
+		switch ($this->_type) {
+			case 'FVAT':
+				$this->_saldo -= round($this->_data['WARTOSC'], 2);
+				break;
+
+			case 'KORV':
+				$this->_saldo -= round($this->_data['MA'], 2);
+				break;
+
+			case 'KP':
+			case 'KW':
+			case 'WB':
+			case 'WB_MASS':
+				$this->_saldo += round($this->_data['MA'], 2);
+				$this->_saldo -= round($this->_data['WINIEN'], 2);
+				break;
+
+			default:
+
+		}
+	}
+
+}

+ 408 - 0
SE/se-lib/Windykacja/FunkcjeL1.php

@@ -0,0 +1,408 @@
+<?php
+
+Lib::loadClass('Windykacja_StatsModel');
+
+class Windykacja_FunkcjeL1 {
+
+	public static function bankowy_make_nrach($NR_RACH_MASS_PAY, $ID_BILLING_USERS, $ID_BILLING_NUMBERS) {
+		//echo "TTUTAJ <hr> AASDADS f. bankowy_make_nrach($NR_RACH_MASS_PAY,$ID_BILLING_USERS,$ID_BILLING_NUMBERS) <br>";
+		$ID_BILLING_USERS = str_pad($ID_BILLING_USERS, 10, 0, STR_PAD_LEFT);
+		$ID_BILLING_NUMBERS = str_pad($ID_BILLING_NUMBERS, 2, 0, STR_PAD_LEFT);
+		$ID_BILLING_NUMBERS = substr($ID_BILLING_NUMBERS, -2);
+		$NN = self::bankowy_make($NR_RACH_MASS_PAY . $ID_BILLING_NUMBERS . $ID_BILLING_USERS);
+		if ($NN) return $NN . $NR_RACH_MASS_PAY . $ID_BILLING_NUMBERS . $ID_BILLING_USERS;
+	}
+
+	public static function bankowy_make($nrb) {
+		$nrb = preg_replace("/[^0-9]/", "", $nrb);
+		if (strlen($nrb) <> 24) return 0;
+		$nrb .= "252100";
+		$modulo = self::my_bcmod($nrb, 97);
+		$modulo = 98 - $modulo;
+		if (strlen($modulo) == 1) {
+			$modulo = "0" . $modulo;
+		}
+		return $modulo;
+	}
+
+	public static function my_bcmod($x, $y) {
+		// how many numbers to take at once? carefull not to exceed (int)
+		$take = 5;    
+		$mod = '';
+		do {
+			$a = (int)$mod . substr($x, 0, $take);
+			$x = substr($x, $take);
+			$mod = $a % $y;
+		} while (strlen($x));
+		return (int)$mod;
+	}
+
+	public static function bankowy_formatuj_nrach($NR_RACH_MASS_PAY) {
+		$NR_RACH_MASS_PAY_FORMATTED = '';
+		if ($NR_RACH_MASS_PAY) {
+			for ($i = 4; $i < strlen($NR_RACH_MASS_PAY); $i += 4) {
+				$NR_RACH_MASS_PAY_FORMATTED = " " . substr($NR_RACH_MASS_PAY, -$i, 4) . $NR_RACH_MASS_PAY_FORMATTED;
+			}
+			$NR_RACH_MASS_PAY_FORMATTED = substr($NR_RACH_MASS_PAY, 0, $i - strlen($NR_RACH_MASS_PAY)) . " " . $NR_RACH_MASS_PAY_FORMATTED;
+		}
+		return $NR_RACH_MASS_PAY_FORMATTED;
+	}
+
+	public static function policz($l,$t1,$t2,$t3) {
+		$j = array("", "jeden ", "dwa ", "trzy ", "cztery ", "pięć ", "sześć ",
+		"siedem ", "osiem ", "dziewięć ", "dziesięć ", "jedenaście ", 
+		"dwanaście ", "trzynaście ", "czternaście ", "piętnaście ", 
+		"szesnaście ", "siedemnaście ", "osiemnaście ", "dziewiętnaście ");
+		$d = array("", "", "dwadzieścia ", "trzydzieści ", "czterdzieści ",
+		"pięćdziesiąt ", "sześćdziesiąt ", "siedemdziesiąt ", 
+		"osiemdziesiąt ", "dziewięćdziesiąt ");
+		$s = array("","sto ", "dwieście ", "trzysta ", "czterysta ", "pięćset ",
+		"sześćset ", "siedemset ", "osiemset ", "dziewięćset ");
+
+		$txt = $s[0+substr($l,0,1)];
+		if (substr($l,1,2)<20) {
+			$txt .= $j[0+substr($l,1,2)];
+		}
+		else {
+			$txt .= $d[0+substr($l, 1,1)].$j[0+substr($l, 2,1)];
+		}
+		if ($l<>0) {
+			if ($l==1) {
+				$txt .= "$t1 ";
+			} else {
+				if ((substr($l,2,1)==2 or substr($l,2,1)==3 or substr($l,2,1)==4) and (substr($l,1,2)>20 or substr($l,1,2)<10)) {
+					$txt .= "$t2 ";
+				} else {
+					$txt .= "$t3 ";
+				}
+			}
+		}
+		return $txt;
+	}
+
+	public static function slownie($liczba) {
+		$txt = '';
+		$kwota = explode(".", $liczba);
+		if (strlen($kwota[1])==1) $kwota[1] = $kwota[1]."0";
+		$kwotazl = sprintf("%012d",$kwota[0]);
+		$kwotagr = sprintf("%03d",$kwota[1]);
+		$txt .= self::policz(substr($kwotazl, 0,3),"miliard","miliardy","miliardów");
+		$txt .= self::policz(substr($kwotazl, 3,3),"milion","miliony","milionów");
+		$txt .= self::policz(substr($kwotazl, 6,3),"tysiąc","tysiące","tysięcy");
+		$txt .= self::policz(substr($kwotazl, 9,3),"złoty","złote","złotych");
+		if ($kwotazl==0) $txt .= "zero złotych ";
+		$txt .= " i ";
+		$txt .= self::policz($kwotagr,"grosz","grosze","groszy");
+		if ($kwotagr==0) $txt .= "zero groszy";
+		return $txt;
+	}
+
+	public static function formatuj_grosze($kwota) {
+		$kwota = round($kwota, 2);
+		$liczba = explode(".", $kwota);
+		if (!$liczba[1]) {
+			$liczba = explode(",", $kwota);
+			if (!$liczba[1]) $liczba[1] = "00";
+		}
+		if (strlen($liczba[1]) == 1) $liczba[1] = $liczba[1] . "0";
+		$liczba_out = $liczba[0] . "." . "$liczba[1]";
+		return $liczba_out;
+	}
+
+	public static function billing_billwiev_przeterminowania($ID_BILLING_USERS_PARAM, $IF_PRINT_PARAM, $ECHO_PARAM) {
+		global $vdb
+			, $STOPA_ODSETEK // from billing-l1/www/config.php
+			, $form_mail_sender // billing-l1/www/config.php:24:$form_mail_sender="/usr/bin/mutt";
+			, $form_send_from_param // billing-l1/www/config.php:19:$form_send_from_param="biall-net@biall.net.pl";
+		;
+
+		//NAGLOWKI DO HTML MAILA
+		$naglowki  = "From: ".$form_send_from_param."\r\n";
+		$naglowki .= "MIME-Version: 1.0\r\n";
+		$naglowki .= "Content-type: text/html; charset=iso-8859-1\r\n";
+
+		//PODRECZNE_ZAPYTANIE_SLOWNIKOWE_DO_TYPOW_DOKUMENTOW
+		$BNT = array();
+		$bnt_types = Windykacja_StatsModel::get_billing_types();
+		foreach ($bnt_types as $k_type_id => $h_type) {
+			$BNT[$h_type['ID']] = $h_type['TYPE'];
+		}
+
+	echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">bnt_types: ';print_r($bnt_types);echo'</pre>';
+	echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">BNT: ';print_r($BNT);echo'</pre>';
+
+		if ($_GET['ID_BILLING_USERS_PARAM']) $ID_BILLING_USERS_PARAM = $_GET['ID_BILLING_USERS_PARAM'];
+
+		if (!$IF_PRINT_PARAM && !$ECHO_PARAM) {
+			echo'<p style="text-align:right">';
+			echo"<a href=\"javascript:openWindow('/modules/make_billing/edit.php?op=zadluzenia&print=1&FIRMA=1&uid=$ID_BILLING_USERS_PARAM','print','scrollbars,resizable=yes,width=750,height=550')\">";
+			echo"<img border=\"0\" src=\"$xpath/ico/kw.gif\" width=\"16\" height=\"16\" alt=\"Zadłużenia\">";
+			echo"Druki wezwania do zaplaty";
+			echo"</a>";
+			echo'</p>';
+		}
+
+		$user_id = $ID_BILLING_USERS_PARAM;
+		$billing_account_files = Windykacja_StatsModel::get_billing_account_files($user_id);
+		echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billing_account_files: ';print_r($billing_account_files);echo'</pre>';
+	die('F.' . __FUNCTION__ . ' ...');
+
+		$NAGLOWEK = "<table border=\"1\" width=\"100%\"><tr><td>Płatnik</td><td>WINIEN</td><td>MA</td><td>DOK</td><td>Numer</td><td>(T)ermin pł./(D)ata ksiegowania </td><td>Dni przeterminowania</td><td>Kwota przeterminowana</td><td>Odsetki</td></tr>";
+		//while ($BAF = $vdb->sql_fetchrow($result)) {
+		foreach ($billing_account_files as $BAF) {
+			//RESETUJEMY FORM - jak nie chcemy pojedynczego odczytu:
+			if (!$ID_BILLING_USERS_PARAM) unset($FORM);
+			if (!$LAST_PLATNIK) $LAST_PLATNIK = $BAF[1];
+			if (!$LPD) $LPD = $BAF;
+			if (($BAF[0] <> $LAST_ID)) {// ID
+				//DRUKUJEMY_STARE_PODSUMOWANIE (DLA_FAKTURY POJEDYNCZEJ)
+				if ($LAST_ID) {
+					$FORM_2.="<tr><td></td><td><b>".self::formatuj_grosze($LTOTAL[WINIEN])."</b></td><td><b>".self::formatuj_grosze($LTOTAL[MA])."</b></td><td colspan=\"3\"></td>";
+					$FORM_S.= "<tr><td></td><td><b>".self::formatuj_grosze($LTOTAL[WINIEN])."</b></td><td><b>".self::formatuj_grosze($LTOTAL[MA])."</b></td><td colspan=\"3\"></td>";
+					$LDNI = floor((date("U") - $DOC_TERM) / 86400) ; 
+					if(($LDNI>0) && ($DOC_TERM) && ($LTOTAL['WINIEN_MA'] == "WINIEN")) {
+						$LODSETKI= self::formatuj_grosze($LTOTAL[$LTOTAL[WINIEN_MA]] * $STOPA_ODSETEK  * $LDNI / 365);
+						$POD_ODSETEK=$LTOTAL[$LTOTAL['WINIEN_MA']];
+						$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI;
+						$PLATNIK_DATA['PRZETER']['WINIEN'] += $LTOTAL[$LTOTAL['WINIEN_MA']];
+					} else {
+						unset($LODSETKI);
+						unset($LDNI);
+						unset($POD_ODSETEK);
+					}
+					$FORM_2.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
+					$FORM_2.= "<td>$LODSETKI</td>";
+					$FORM_S.= "<td>---</td><td>---</td><td>---</td>";
+					//  if(!$PLATNIK_DATA[TOTAL][WINIEN]) 
+					$PLATNIK_DATA[TOTAL][WINIEN]+=self::formatuj_grosze($LTOTAL[WINIEN]) ;
+					//  if(!$PLATNIK_DATA[TOTAL][MA])
+					$PLATNIK_DATA[TOTAL][MA]+=self::formatuj_grosze($LTOTAL[MA]) ;
+					$FORM_2.= "</tr>";
+					$FORM_2.= "<tr><td colspan=\"6\"><hr></td></tr>";
+					$FORM_S.="</tr><tr><td colspan=\"6\"><hr></td></tr>";
+					$TOTAL[WINIEN]+=$LTOTAL[WINIEN] ; $TOTAL[MA]+=$LTOTAL[MA] ;
+					if ($LAST_PLATNIK <> $BAF[1]) {//PODSUMOWANIE_DLA_PLATNIKA
+						$TOTAL[PRZETER]+=$PLATNIK_DATA[PRZETER][WINIEN];
+						$TOTAL[ODSETKI]+=$PLATNIK_DATA[PRZETER][ODSETKI];
+						$FORM_2.= "<tr><td colspan=\"9\">Podsumowanie salda niezbilansowanych zobowiązań dla platnika $LAST_PLATNIK 
+						$LPD[P_NAME] $LPD[P_NAME_SECOND] $LPD[P_ADDRESS_CITY] $LPD[P_ADDRESS_STREET] $LPD[P_ADDRESS_HOUSE] $LPD[P_ADDRESS_HOME]
+						<br> WINIEN: <b>".$PLATNIK_DATA[TOTAL][WINIEN]."</b> - MA: <b>".$PLATNIK_DATA[TOTAL][MA]."</b>  DO ZAPŁATY: <b>".self::formatuj_grosze($PLATNIK_DATA[TOTAL][WINIEN]-$PLATNIK_DATA[TOTAL][MA])."</b> " ;
+						if($PLATNIK_DATA[PRZETER][WINIEN]) $FORM_2.=", z czego przeterminowane <font color=\"red\"><b> ".self::formatuj_grosze($PLATNIK_DATA[PRZETER][WINIEN])." </b></font> ";
+						if($PLATNIK_DATA[PRZETER][ODSETKI]) $FORM_2.= " ( aktualnie nalezne odsetki to ".$PLATNIK_DATA[PRZETER][ODSETKI]." PLN , które mogą zostać naliczone ) " ;
+						if($LPD[BA_TIMESTAMP]) $FORM_2.=" <br> Stan wzajemnych rozrachunków:  WINIEN: <b>$LPD[BA_WINIEN]</b> -  MA: <b>$LPD[BA_MA]</b>    SALDO(DO ZAPŁATY): <b>".self::formatuj_grosze($LPD[BA_WINIEN]-$LPD[BA_MA])."</b> , i jest to stan na dzień ".date("Y-m-d",$LPD['BA_TIMESTAMP'])." ";
+						$RETURN_ARR="";
+						$FORM_S.="<tr><td colspan=\"9\"></td></tr></table>";
+						$FORM_2.="<br>W razie problemów prosimy o kontakt z biurem obsługi. <br><font size=\"1\" color=\"#CCCCCC\">webone billing system &copy;2004 by Arkadiusz Binder & www.grafnet.pl | finance module by A.Binder </font>";
+						$FORM_2.= "  </tr></table>";
+						$FORM_2 = "{$NAGLOWEK} \n {$FORM_2}";
+						$FORM_S= "{$NAGLOWEK} \n {$FORM_S}";
+						if ($IF_PRINT_PARAM) {
+							$delivery_subject="Stan rozrachunków dla  {$LPD[P_NAME]} {$LPD[P_NAME_SECOND]}"	;
+							$sql2="insert into HIST_CONTACTS (ID_BILLING_USERS,ID_BILLING_NUMBERS,SUBJECT,BODY_HTML,REQUEST_STATUS_MAIL) values
+							('".$LAST_PLATNIK."','','{$delivery_subject}','{$FORM_2}','CONFIRM_SENT_MAIL') ";
+							$res = $vdb->sql_query($sql2) ;
+							echo "<hr> $sql2 <hr>****"; 
+						} else if (!$ECHO_PARAM) {
+							echo $FORM_2;
+						}
+						$LAST_PLATNIK=$BAF[1];
+						unset($PLATNIK_DATA);
+						$FORM.=$FORM_2 ;
+						unset($FORM_2);
+						$FORM_SS.=$FORM_S ;
+						unset($FORM_S);
+					} else {
+					}
+					//$PLATNIK_DATA[TOTAL][WINIEN]+=$BAF[2];
+					//$PLATNIK_DATA[TOTAL][MA]+=$BAF[3];
+					$LPD = $BAF;
+					$LAST_PLATNIK = $BAF[1];
+				}
+				else {
+				}
+				//DODAJEMY_NOWY_REKORD_OD_SAMEJ_PLATNOSCI
+				unset($LTOTAL);
+				$FORM_2.= "<tr><td>$BAF[1]</td><td>$BAF[2]</td><td>$BAF[3]</td><td>".$BNT[$BAF[4]]."</td><td>$BAF[5]/$BAF[6]</td>   <td colspan=\"1\">";
+				if ($BAF[19]) $FORM_2.="T: ".date("Y-m-d",$BAF[19])." "; else  $FORM_2.="D: ".date("Y-m-d",$BAF['BAF_TIMESTAMP'])." "; 
+				$FORM_2.="</td></tr>";
+				$FORM_S.= "<tr><td>$BAF[1]</td><td>$BAF[2]</td><td>$BAF[3]</td><td>".$BNT[$BAF[4]]."</td><td>$BAF[5]/$BAF[6]</td>   <td colspan=\"1\">";
+				if($BAF[19])$FORM_S.="T: ".date("Y-m-d",$BAF[19])." "; else  $FORM_2.="D: ".date("Y-m-d",$BAF['BAF_TIMESTAMP'])." "; 
+				$FORM_S.="</td></tr>";
+				$DOC_TERM = $BAF[19];
+				if ($BAF[2] > 0) $LTOTAL['WINIEN_MA'] = "WINIEN"; else $LTOTAL['WINIEN_MA'] = "MA";
+				$LTOTAL[$LTOTAL['WINIEN_MA']] = $BAF[2] + $BAF[3];
+			} else {
+				//DRUKUJEMY_PODSTUMOWANIE_STAREGO i ZAPODAJEMY NOWY_REKORD
+			}
+
+			if ($BAF[12]) {// ID_FIN_WINIEN_VAL
+				$FORM_2.= "<tr><td colspan=\"1\"></td>";
+				$FORM_S.= "<tr><td colspan=\"1\"></td>";
+				if($LTOTAL['WINIEN_MA']=="MA") { 
+				$FORM_2.= "<td><font color=\"green\"><b> $BAF[12] </b> </font></td>";
+				$FORM_2.= "<td></td>";
+				$FORM_S.="<td><font color=\"green\"><b> $BAF[12] </b> </font></td><td></td>";
+				} else {
+				$FORM_2.= "<td></td>";
+				$FORM_2.= "<td><font color=\"green\"><b> $BAF[12] </b> </font></td>";
+				$FORM_S.="<td></td><td><font color=\"green\"><b> $BAF[12] </b> </font></td>";
+				} 
+				$FORM_2.= "<td>".$BNT[$BAF[8]]."</td>";
+				$FORM_2.= "<td> $BAF[9]/$BAF[10] </td><td>D: ".date("Y-m-d",$BAF[11])."</td> ";
+
+				$FORM_S.= "<td>".$BNT[$BAF[8]]."</td>";
+				$FORM_S.= "<td> $BAF[9]/$BAF[10] </td><td>D: ".date("Y-m-d",$BAF[11])."</td> ";
+
+				$LDNI = floor(($BAF[11] - $DOC_TERM) / 86400);
+				if (($LDNI > 0) && ($DOC_TERM) && ($LTOTAL['WINIEN_MA'] == "WINIEN")) {
+					$DOC_TERM = $BAF[11];
+					$LODSETKI = self::formatuj_grosze($LTOTAL[$LTOTAL['WINIEN_MA']] * $STOPA_ODSETEK  * $LDNI / 365);
+					$POD_ODSETEK = $LTOTAL[$LTOTAL['WINIEN_MA']];
+					$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI;
+				} else {
+					unset($LODSETKI);
+					unset($LDNI);
+					unset($POD_ODSETEK);
+				}
+				$FORM_2.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
+				$FORM_2.= "<td>$LODSETKI</td>";
+				$FORM_2.= "</tr>";
+				$FORM_S.="<td>---</td><td>---</td><td>---</td></tr>";
+				$LTOTAL[$LTOTAL['WINIEN_MA']] -= $BAF[12];
+			}
+
+			if ($BAF[18]) {// ID_FIN_MA_VAL
+				$FORM_2.= "<tr><td colspan=\"1\"></td>";
+				$FORM_S.= "<tr><td colspan=\"1\"></td>";
+				if ($LTOTAL['WINIEN_MA'] == "MA") {
+					$FORM_2.= "<td><font color=\"red\"><b> $BAF[18] </b> </font></td>";
+					$FORM_2.= "<td></td>";
+					$FORM_S.= "<td><font color=\"red\"><b> $BAF[18] </b> </font></td><td></td>";
+				} else {
+					$FORM_2.= "<td></td>";
+					$FORM_2.= "<td><font color=\"red\"><b> $BAF[18] </b> </font></td>";
+					$FORM_S.="<td></td><td><font color=\"red\"><b> $BAF[18] </b> </font></td>";
+				} 
+				$FORM_2.= "<td>".$BNT[$BAF[14]]."</td>";
+				$FORM_2.= "<td> $BAF[15]/$BAF[16] </td> <td>D: ".date("Y-m-d",$BAF[17])."</td> ";
+				$FORM_S.="<td>".$BNT[$BAF[14]]."</td> <td> $BAF[15]/$BAF[16] </td> <td>D: ".date("Y-m-d",$BAF[17])."</td> ";
+
+				$LDNI=floor(($BAF[17] - $DOC_TERM) / 86400) ; 
+				//				$LDNI=10;
+				if (($LDNI > 0) && ($DOC_TERM) && ($LTOTAL['WINIEN_MA'] == "WINIEN")) {
+					$LODSETKI = self::formatuj_grosze($LTOTAL[$LTOTAL[WINIEN_MA]] * $STOPA_ODSETEK  * $LDNI / 365);
+					$POD_ODSETEK = $LTOTAL[$LTOTAL['WINIEN_MA']];
+					$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI;
+				} else {
+					unset($LODSETKI);
+					unset($LDNI);
+					unset($POD_ODSETEK);
+				}
+				$FORM_2.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
+				$FORM_S.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
+				$FORM_2.= "<td>$LODSETKI</td>";
+				$FORM_S.= "<td>$LODSETKI</td>";
+				$FORM_2.= "</tr>";
+				$FORM_S.= "</tr>";
+				$LTOTAL[$LTOTAL['WINIEN_MA']]-=$BAF[18] ;
+			}
+
+			$LAST_ID = $BAF[0];
+			$L_BAF = $BAF;
+		}//eof SQL while($BAF=$vdb->sql_fetchrow($result)) {
+
+		//DODANIE_ZESTAWIENIA KOPIA_Z_GORY
+
+		//DRUKUJEMY_STARE_PODSUMOWANIE (DLA_FAKTURY POJEDYNCZEJ)
+		if ($LAST_ID) {
+			$FORM_2.="<tr><td></td><td><b>".self::formatuj_grosze($LTOTAL['WINIEN'])."</b></td><td><b>".self::formatuj_grosze($LTOTAL['MA'])."</b></td><td colspan=\"3\"></td>";
+			$FORM_S.="<tr><td></td><td><b>".self::formatuj_grosze($LTOTAL['WINIEN'])."</b></td><td><b>".self::formatuj_grosze($LTOTAL['MA'])."</b></td><td colspan=\"3\"></td>";
+
+			$LDNI = round((date("U") - $DOC_TERM) / 86400, 0);
+			if (($LDNI > 0) && ($DOC_TERM)) {
+				$LODSETKI = self::formatuj_grosze($LTOTAL[$LTOTAL['WINIEN_MA']] * $STOPA_ODSETEK  * $LDNI / 365);
+				$POD_ODSETEK = $LTOTAL[$LTOTAL['WINIEN_MA']];
+				$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI ;
+				$PLATNIK_DATA['PRZETER']['WINIEN'] += $LTOTAL[$LTOTAL['WINIEN_MA']];
+			} else {
+				unset($LODSETKI);
+				unset($LDNI);
+				unset($POD_ODSETEK);
+			}
+			$FORM_2.= "<td>$LDNI</td><td>".self::formatuj_grosze($POD_ODSETEK)."</td>";
+			$FORM_2.= "<td>$LODSETKI</td>";
+			$FORM_S.="<td>---</td><td>---</td><td>---</td>";
+
+			//  if(!$PLATNIK_DATA[TOTAL]['WINIEN'])
+			$PLATNIK_DATA['TOTAL']['WINIEN']+=self::formatuj_grosze($LTOTAL['WINIEN']) ;
+			//  if(!$PLATNIK_DATA[TOTAL][MA])
+			$PLATNIK_DATA['TOTAL']['MA']+=self::formatuj_grosze($LTOTAL['MA']) ;
+
+			$FORM_2.= "</tr>";
+			$FORM_2.= "<tr><td colspan=\"6\"><hr></td></tr>";
+			$FORM_S.="</tr><tr><td colspan=\"6\"><hr></td></tr>";
+			$TOTAL['WINIEN']+=$LTOTAL['WINIEN'] ; $TOTAL['MA']+=$LTOTAL['MA'] ;
+
+			if ($LAST_PLATNIK <> $BAF[1]) {//PODSUMOWANIE_DLA_PLATNIKA
+
+				$TOTAL['PRZETER'] += $PLATNIK_DATA['PRZETER']['WINIEN'];
+				$TOTAL['ODSETKI'] += $PLATNIK_DATA['PRZETER']['ODSETKI'];
+				if (!$LPD) $LPD = $L_BAF ;
+				$FORM_2.= "<tr><td colspan=\"9\">Podsumowanie salda niezbilansowanych zobowiązań dla platnika $LAST_PLATNIK 
+				$LPD[P_NAME] $LPD[P_NAME_SECOND] $LPD[P_ADDRESS_CITY] $LPD[P_ADDRESS_STREET] $LPD[P_ADDRESS_HOUSE] $LPD[P_ADDRESS_HOME]
+				<br> WINIEN: <b>".$PLATNIK_DATA['TOTAL']['WINIEN']."</b> - MA: <b>".$PLATNIK_DATA['TOTAL']['MA']."</b> 
+				DO ZAPŁATY: <b>".self::formatuj_grosze($PLATNIK_DATA['TOTAL']['WINIEN']-$PLATNIK_DATA['TOTAL']['MA'])."</b> " ;
+				if ($PLATNIK_DATA['PRZETER']['WINIEN']) $FORM_2.=", z czego przeterminowane <font color=\"red\"><b> ".self::formatuj_grosze($PLATNIK_DATA['PRZETER']['WINIEN'])." </b></font> ";
+				if ($PLATNIK_DATA['PRZETER']['ODSETKI']) $FORM_2.= " ( aktualnie nalezne odsetki to ".$PLATNIK_DATA['PRZETER']['ODSETKI']." PLN , które mogą zostać naliczone ) " ;
+				if ($LPD['BA_TIMESTAMP']) $FORM_2.=" <br> Stan wzajemnych rozrachunków:  WINIEN: <b>".$LPD['BA_WINIEN']."</b> -  MA: <b>".$LPD['BA_MA']."</b>    SALDO(DO ZAPŁATY): <b>".self::formatuj_grosze($LPD['BA_WINIEN']-$LPD['BA_MA'])."</b> , i jest to stan na dzień ".date("Y-m-d",$LPD['BA_TIMESTAMP'])." ";
+				$RETURN_ARR="";
+				$FORM_S.="<tr><td colspan=\"9\"></td></tr></table>";
+
+				$FORM_2.="<br>W razie problemów prosimy o kontakt z biurem obsługi. <br><font size=\"1\" color=\"#CCCCCC\">webone billing system &copy;2004 by Arkadiusz Binder & www.grafnet.pl | finance module by A.Binder </font>";
+				$FORM_2.= "  </tr></table>";
+
+
+				$FORM_2 = "{$NAGLOWEK} \n {$FORM_2}";
+				$FORM_S = "{$NAGLOWEK}{$FORM_S}";
+
+				//DRUKOWANIE ZESTAWIENIA
+				if ($IF_PRINT_PARAM) {
+					$delivery_subject="Stan rozrachunków dla  {$LPD['P_NAME']} {$LPD['P_NAME_SECOND']}"	;
+					//         exec("echo  \"Pliki zostały dołączone do załącznika\" | $form_mail_sender -n -a \"$filename\" $delivery_mail -s ".$delivery_subject."" );
+					$sql2="insert into HIST_CONTACTS (ID_BILLING_USERS,ID_BILLING_NUMBERS,SUBJECT,BODY_HTML,REQUEST_STATUS_MAIL) values
+						('".$LAST_PLATNIK."','','{$delivery_subject}','{$FORM_2}','CONFIRM_SENT_MAIL') ";
+					$res = $vdb->sql_query($sql2);
+					echo "<hr> {$sql2} <hr>***"; 
+				} else if (!$ECHO_PARAM) {
+					echo $FORM_2;
+				}
+				//EOF DRUKOWANIE ZESTAWIENIA itp
+
+				$LAST_PLATNIK = $BAF[1];
+				$ECHO_DATA=$PLATNIK_DATA;
+				unset($PLATNIK_DATA);
+
+				$FORM .= "{$FORM_2}</table>";
+				$FORM_SS .= "{$FORM_S}</table>";
+				unset($FORM_2);
+				unset($FORM_S);
+			}
+		}
+
+		$FORM_2.= $NAGLOWEK;
+		$FORM_2.= "<tr><td>TOT</td><td><b>{$TOTAL['WINIEN']}</b></td><td><b>{$TOTAL['MA']}</b></td><td colspan=\"4\"></td>
+			<td><b>{$TOTAL['PRZETER']}</b></td><td><b>{$TOTAL['ODSETKI']}</b></td></tr>";
+		$FORM_2 .= "</table>";
+		if (!$ECHO_PARAM)	echo "{$FORM_2}";
+		$FORM_S.=  "</table> ";
+		if ($ECHO_PARAM == "zadluzenie") return self::formatuj_grosze($ECHO_DATA['PRZETER']['WINIEN']);
+		if ($ECHO_PARAM == "saldo") return self::formatuj_grosze($LPD['BA_WINIEN']-$LPD['BA_MA']);
+		if ($ECHO_PARAM == "zadluzenie_lista") return $FORM;
+		if ($ECHO_PARAM == "saldo_rok") {
+			$L_BAF['FORM'] = $FORM;
+			$L_BAF['FORM_SALDO'] = $FORM_SS;
+			return $L_BAF;
+		}
+	}
+
+}

+ 1133 - 0
SE/se-lib/Windykacja/StatsHelper.php

@@ -0,0 +1,1133 @@
+<?php
+
+Lib::loadClass('Windykacja_StatsModel');
+Lib::loadClass('Windykacja_FunkcjeL1');
+
+class Windykacja_StatsHelper {
+
+	// TODO: `A_RECORD_UPDATE_DATE` aktualizowane tylko wraz ze statusem
+	// TODO: statusy:
+		// 1. Automatyczne wysłanie powiadomień do Abonentów o niezapłaconych fakturach drogą e-mailową
+		//    5 dni roboczych po 10-go na okolo 5 dni przed blokadami
+		// - blokada: ??? dni po ostatniej dacie platnosci - odczytac czy zablokowany z l2?
+		// - 1 list - wezwanie - jesli min. 2 faktury - czyli 2 m-ce od 1 daty platnosci
+		// - 2 list - wezwanie ostateczne - min. 300 zł
+
+	public static function get_filter_selected() {
+		$filter_selected = V::get('_f', '', $_GET);
+		$filter_arr = self::get_filters();
+		$filter_selected = (array_key_exists($filter_selected, $filter_arr))? $filter_selected : '';
+		return $filter_selected;
+	}
+
+	public static function get_filter_selected_label() {
+		$fltrLabel = '';
+		$fltrSelected = self::get_filter_selected();
+		if (!empty($fltrSelected)) {
+			$fltrs = self::get_filters();
+			$fltrLabel = V::get($fltrSelected, '', $fltrs);
+			$fltrLabel = V::get(0, '', $fltrLabel);
+		}
+		return $fltrLabel;
+	}
+
+	public static function get_filters() {
+		$filter_arr['stan_zero'] = array("stan zerowy");
+		$filter_arr['10-ego'] = array("termin płatności faktur, saldo na -", 'desc'=>array("10-ego", "10-ego każdego miesiąca - termin płatnosci faktur oraz saldo na minusie"));
+		$filter_arr['WAITING'] = array("termin płatności faktur", 'desc'=>array("10-ego", "10-ego każdego miesiąca - termin płatnosci faktur"));// z regulaminu
+		$filter_arr['15'] = array("mail ponaglenie", 'desc'=>array("10-ego + 5", "10-ego + 5 dni roboczych"));
+		$filter_arr['blokada'] = array("blokada", 'desc'=>array("pn, wt, śr około 25", "najbliższy pn, wt, śr do 25"));// najbliższy pn, wt, śr do 25-ego danego miesiąca
+		$filter_arr['tel1'] = array("kontakt tel.", 'desc'=>array("", "Ostatni kontakt tel. ponad 3 m-ce temu"));
+		$filter_arr['bad_address'] = array("błędny adres");
+		$filter_arr['wezwanie1'] = array("wezwanie do zapłaty", 'desc'=>array("2 x FVat", "2 faktury"));
+		$filter_arr['waiting-wezwanie2'] = array("oczekiwanie 7 dni od terminu płatności");
+		$filter_arr['wezwanie2'] = array("ostateczne wezwanie do zapłaty, rozwiązanie umowy", 'desc'=>array("wezwanie + 14", "wezwanie + 14 dni"));
+		$filter_arr['waiting-krd'] = array("min. 30 dni od ostatecznego wezwania");
+		$filter_arr['krd'] = array("do przekazania do KRD", 'desc'=>array("wezwanie ost. + 60", "wezwanie ost. + 60 dni"));
+		$filter_arr['waiting-sad'] = array("przekazano do KRD");
+		$filter_arr['docs-in-sad'] = array("przekazać sprawę do sądu");// waiting-sad = 30 dni
+		$filter_arr['sad'] = array("przekazano sprawę do sądu");
+		$filter_arr['3 m-ce przed'] = array("3 m-ce przed przedawnieniem");// 3 m-ce przed przedawnieniem
+		$filter_arr['po-terminie'] = array("po terminie");// 3 lata po dacie platnosci faktur
+		$filter_arr['has_nr_sad'] = array("nr sprawy sąd");
+		$filter_arr['has_nr_komornik'] = array("nr sprawy komornik");
+		$filter_arr['has_ustalenia'] = array("ustalenia z klientem");
+		$filter_arr['sad_and_komornik'] = array("sąd z komornik");
+		$filter_arr['sad_bez_komornik'] = array("sąd bez komornik");
+		$filter_arr['isMovedToVectra'] = array("przeniesieni do Vectra");
+		return $filter_arr;
+	}
+
+	public static function get_by_user(&$user) {
+		$db = DB::getDB();
+		$sql = "select * from `USERS2_WINDYKACJA_STATUS` as w where w.`ID_BILLING_USERS`='{$user->ID}' ";
+		$res = $db->query($sql);
+		$ret = $db->fetch($res);
+		return $ret;
+	}
+
+	/**
+	 * Auto update user stats.
+	 * 
+	 * @returns boolean - status changed or not
+	 * @param $user - object return from function Windykacja_StatsModel::get_user_by_id
+	 * @param $billing_docs - user billing docs
+	 * 
+	 * @used in task_update_stats - for all users
+	 * @used in Windykacja_View::user_historia_platnosci after view billing docs
+	 * 
+	 * save HIST at status change to WAITING
+	 */
+	public static function update_stats(&$user, &$billing_docs) {
+		$data_arr = array();
+		if (!V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)) {
+			if ($user->A_STATUS_UPDATE_DATE >= date("Y-m-d")) {
+				return;
+			}
+		}
+		self::updateUserKoresp($user);
+
+		$saldo = $billing_docs->get_saldo();
+		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = "stat-update";
+
+		$company = Windykacja_StatsModel::get_company($user);
+		$nr_konta = Windykacja_FunkcjeL1::bankowy_make_nrach($company->NR_RACH_MASS_PAY, $user->ID_BILLING_USERS, 0);
+		$data_arr["ACCOUNT_NUMBER"] = $nr_konta;
+		$data_arr["SERVICES_STREETS"] = Windykacja_StatsModel::getAllServicesStreetsCSV($user);
+		// set default values
+		//$data_arr["A_STATUS"] = "WAITING";
+		//$data_arr["PAY_FVAT"] = 0;
+		//$data_arr["PAY_DATE"] = "0000-00-00";
+		// update values
+		{// LAST_PAY_DATE
+			$lastPayDoc = $billing_docs->get_last_pay_doc();
+			if ($lastPayDoc) {
+				$data_arr["LAST_PAY_DATE"] = $lastPayDoc->get('BILL_DATE');
+				$data_arr["LAST_PAY_VALUE"] = $lastPayDoc->get('MA');
+				if(V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)){echo'<pre>lastPayDoc: ';print_r($lastPayDoc);echo'</pre>';}
+			}
+		}
+		$data_arr["PAY_SALDO"] = $saldo;
+		$data_arr["PAY_SALDO_30_DNI"] = $billing_docs->get_saldo_30_dni();
+		$data_arr["PAY_SALDO_ISSUED"] = $billing_docs->get_saldo_issued();
+		$data_arr["PAY_FVAT"] = 0;
+		$data_arr["PAY_DATE_FIRST_FVAT"] = '0000-00-00';
+		$lastFvatDoc = $billing_docs->get_last_fvat_doc();
+		if(V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)){echo'<pre>lastFvatDoc: ';print_r($lastFvatDoc);echo'</pre>';}
+		if ($lastFvatDoc) {
+			$data_arr["LAST_FVAT_PAY_TERM"] = $lastFvatDoc->get('PAYMENT_TERM');
+			$data_arr["LAST_FVAT_SELL_DATE"] = $lastFvatDoc->get('SELL_DATE');
+			$data_arr["LAST_FVAT_VALUE"] = $lastFvatDoc->get('WINIEN');
+		}
+		if ($saldo <= -0.05) {
+			$fvat_arr = $billing_docs->get_unpaid_fvat();
+			$data_arr["PAY_FVAT"] = count($fvat_arr);
+			if (count($fvat_arr) > 0) {
+				foreach ($fvat_arr as $v_fvat) {
+					if (!isset($data_arr["PAY_DATE"]) || $v_fvat['PAYMENT_TERM'] > $data_arr["PAY_DATE"]) {
+						$data_arr["PAY_DATE"] = $v_fvat['PAYMENT_TERM'];
+					}
+					if ('0000-00-00' == $data_arr["PAY_DATE_FIRST_FVAT"] || $v_fvat['PAYMENT_TERM'] < $data_arr["PAY_DATE_FIRST_FVAT"]) {
+						$data_arr["PAY_DATE_FIRST_FVAT"] = $v_fvat['PAYMENT_TERM'];
+					}
+				}
+			}
+		}
+
+		// zmiana statusu na kolejny wg. salda
+		switch ($user->A_STATUS) {
+			case 'WAITING':// auto
+				if ($user->wezwanie1_DATE == '0000-00-00') {
+					if ($saldo <= -0.05) {
+						$fvat_arr = $billing_docs->get_unpaid_fvat();
+						if (count($fvat_arr) > 1) {
+							$data_arr["A_STATUS"] = "wezwanie1";
+						}
+					}
+				}
+				else if ($user->wezwanie2_DATE == '0000-00-00') {
+					$data_arr["A_STATUS"] = "waiting-wezwanie2";
+				}
+				else {
+					$data_arr["A_STATUS"] = "wezwanie2";
+				}
+				break;
+
+			case 'wezwanie1':// wymaga `PAY_TERM`, `wezwanie1_DATE`, `ID_KORESP`
+				break;
+
+			case 'waiting-wezwanie2':// auto -> wezwanie2
+				if ($user->wezwanie2_DATE == '0000-00-00') {
+					$payTermArr = explode('-', $user->PAY_TERM);// Y-m-d
+					$payTermPlus7dni = date("Y-m-d", mktime(0,0,0, intval($payTermArr[1]), intval($payTermArr[2]) + 7, intval($payTermArr[0])));
+					// TODO: data +7 dni od terminu płatności (PAY_TERM) / mktime ($user->PAY_TERM + 7 dni)
+					if ($user->PAY_TERM != '0000-00-00' && $payTermPlus7dni < date('Y-m-d')) {
+						$data_arr["A_STATUS"] = "wezwanie2";
+					}
+				}
+				break;
+
+			case 'wezwanie2':// wymaga `PAY_TERM`, `wezwanie2_DATE`, `ID_KORESP`
+				break;
+
+			case 'waiting-krd':// auto -> krd jesli minelo 30 dni od wystawienia wezwanie2
+				if ($user->wezwanie2_DATE != '0000-00-00') {
+					$wzw2 = new stdClass();
+					$wzw2->Y = intval(substr($user->wezwanie2_DATE, 0, 4));
+					$wzw2->m = intval(substr($user->wezwanie2_DATE, 5, 2));
+					$wzw2->d = intval(substr($user->wezwanie2_DATE, 8, 2));
+					$wzw2->plus_30 = date("Y-m-d", mktime(0,0,0, $wzw2->m, $wzw2->d + 30, $wzw2->Y));
+					if ($wzw2->plus_30 < date("Y-m-d")) {
+						$data_arr["A_STATUS"] = "krd";
+					}
+				}
+				break;
+
+			case 'waiting-sad':// auto -> sad jesli minelo 30 dni od wpisania do krd (wpis_w_krd_DATE)
+				if ($user->wpis_w_krd_DATE != '0000-00-00') {
+					$krdDate = new stdClass();
+					$krdDate->Y = intval(substr($user->wpis_w_krd_DATE, 0, 4));
+					$krdDate->m = intval(substr($user->wpis_w_krd_DATE, 5, 2));
+					$krdDate->d = intval(substr($user->wpis_w_krd_DATE, 8, 2));
+					$krdDate->plus_30 = date("Y-m-d", mktime(0,0,0, $krdDate->m, $krdDate->d + 30, $krdDate->Y));
+					if ($krdDate->plus_30 < date("Y-m-d")) {
+						$data_arr["A_STATUS"] = "docs-in-sad";
+					}
+				}
+				break;
+
+			default:
+				
+		}
+
+		// zmiana statusu na czysty - WAITING
+		if ($saldo > -0.05 || $data_arr["PAY_FVAT"] < 2) {
+			if (!in_array($user->A_STATUS, array('waiting-sad', 'docs-in-sad', 'sad'))) {
+				$data_arr["A_STATUS"] = "WAITING";
+				$data_arr["wezwanie2_DATE"] = '0000-00-00';
+				$data_arr["wezwanie1_DATE"] = '0000-00-00';
+				//$data_arr["PAY_DATE"] = '0000-00-00';// TODO: ?
+			}
+		}
+
+		{
+			$hasActiveNET = 0;
+			$hasActiveTV = 0;
+			$isMovedToVectra = 0;
+			$db = DB::getDB();
+			$idUser = $user->ID;
+			$sql = "
+				select
+					IF(1 = (
+							select 1 as hasActiveNET
+							from `SERVICES` srv
+							where srv.`ID_BILLING_USERS`='{$idUser}'
+								and srv.`NAME_LIST_SERVICES`='USERS2'
+								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
+							limit 1
+						), 1, 0) as hasActiveNET
+					,
+					IF(1 = (
+							select 1 as hasActiveTV
+							from `SERVICES` srv
+							where srv.`ID_BILLING_USERS`='{$idUser}'
+								and srv.`NAME_LIST_SERVICES`='TV'
+								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
+							limit 1
+						), 1, 0) as hasActiveTV
+					,
+					IF(1 = ('REZYGNACJA_Z_PRZEJSCIEM_DO_VECTRA'=(select `RODZAJ_DZIALANIA_HANDLOWEGO`
+						from `DEALS_TABLE`
+						where `A_STATUS`='NORMAL'
+							and `ID_BILLING_USERS`='{$user->ID}'
+						order by `ID` DESC
+						limit 1)
+						), 1, 0) as IS_MOVED_TO_VECTRA
+			";
+			DBG::_('DBG_ACTIVE_SRV', '>2', "DBG_ACTIVE_SRV sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
+			$res = $db->query($sql);
+			if ($r = $db->fetch($res)) {
+				DBG::_('DBG_ACTIVE_SRV', '>2', "r", $r, __CLASS__, __FUNCTION__, __LINE__);
+				$hasActiveNET = V::get('hasActiveNET', '', $r);
+				$hasActiveTV  = V::get('hasActiveTV', '', $r);
+				$isMovedToVectra = V::get('IS_MOVED_TO_VECTRA', '', $r);
+			}
+			$data_arr['HAS_ACTIVE_NET'] = $hasActiveNET;
+			$data_arr['HAS_ACTIVE_TV']  = $hasActiveTV;
+			$data_arr['IS_MOVED_TO_VECTRA'] = $isMovedToVectra;
+			DBG::_('DBG_ACTIVE_SRV', '>2', "data_arr", $data_arr, __CLASS__, __FUNCTION__, __LINE__);
+		}
+		if(V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)){echo'<pre>data_arr #' . __LINE__ . ': ';print_r($data_arr);echo'</pre>';}
+
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$db = DB::getDB();
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
+		$db->query($sql);
+
+		// update HIST - tylko zmiana na WAITING - powrót do oczekujących
+		if (isset($data_arr["A_STATUS"]) && $data_arr["A_STATUS"] == "WAITING" && $user->A_STATUS != "WAITING") {
+			$sql_arr = array();
+			foreach ($data_arr as $k => $v) {
+				$sql_arr["`{$k}`"] = "'{$v}'";
+			}
+			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+			$db->query($sql);
+		}
+	}
+
+	public static function updateUserKoresp($user) {
+		//echo'<pre>TODO: updateUserKoresp: ';print_r($user);echo'</pre>';
+		$sql = <<<SQL
+			insert into `USERS2_WINDYKACJA_STATUS_HIST` (
+					`A_RECORD_UPDATE_DATE`
+					, `A_RECORD_UPDATE_AUTHOR`
+					, `ID_USERS2`
+					, `ID_KORESP`
+					, `A_STATUS_UPDATE_DATE`
+				)
+				select
+					NOW() as `A_RECORD_UPDATE_DATE`
+					, 'auto-update-koresp-hist' as `A_RECORD_UPDATE_AUTHOR`
+					, w.`ID` as `ID_USERS2`
+					, k.`ID` as `ID_KORESP`
+					, k.`K_DATA_OTRZYM_KORESP` as `A_STATUS_UPDATE_DATE`
+				from `USERS2_WINDYKACJA_STATUS` w
+					join `IN7_DZIENNIK_KORESP` k on (k.`ID_BILLING_USERS`=w.`ID_BILLING_USERS`)
+					left join `USERS2_WINDYKACJA_STATUS_HIST` h on (h.`ID_USERS2`=w.`ID` and h.`ID_KORESP`=k.`ID`)
+				where 1=1
+					and h.ID is null
+					and w.`ID_BILLING_USERS`={$user->ID_BILLING_USERS}
+SQL;
+		$db = DB::getDB();
+		$db->query($sql);
+		//echo'<pre>TODO: updateUserKoresp: last insert_id: ';print_r($db->insert_id());echo'</pre>';
+	}
+
+	public static function &get_phone_status_array(&$user) {
+		$ret = array();
+		$status_info = self::get_phone_status_info($user);
+		foreach ($status_info as $k => $v) {
+			$ret[$k] = $v['label'];
+		}
+		return $ret;
+	}
+
+	/**
+	 * @param $user
+	 * 
+	 * @returns array of 'label', 'date' -> nowy PAY_TERM ustalony wg. aktualnego stanu
+	 */
+	public static function get_phone_status_info($user) {
+		$ret = array();
+		$ret['nie_zaplaci'] = array('label'=>"nie zapłaci", 'date'=>'');
+		$today = date("Y-m-d");
+		$date = date("Y-m-d");
+		{// PAY_TERM jesli jest ustalony np. z wewaznie1 lub wezwanie2
+			if ($user->PAY_TERM != '0000-00-00') {
+				if ($user->PAY_TERM > $today) {
+					// jest już ustalona data platnosci na przyszłość
+					$date = $user->PAY_TERM;
+				}
+			}
+		}
+
+		if ($date > $today) {// data platnosci w przyszlosci -> ok
+			{// zapłaci w terminie today +14 dni lub PAY_TERM jesli jest ustalony np. z wewaznie1 lub wezwanie2
+				$ret['zaplaci_w_terminie'] = array('label'=>"zapłaci w terminie", 'date'=>$date);
+			}
+		}
+		else {// data platnosci w przeszlosci - przeterminowana -> ustalic nowa (+14,+1mc,+2mc,+3mc)
+			{// zapłaci w terminie today +14 dni lub PAY_TERM jesli jest ustalony np. z wewaznie1 lub wezwanie2
+				$date = date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
+				$ret['zaplaci_w_terminie'] = array('label'=>"zapłaci w terminie", 'date'=>$date);
+			}
+			{// zaplaci za 1-mc pozniej
+				$date = date("Y-m-d", mktime(0,0,0,date('m') + 1, date('d'), date('Y')));
+				$ret['zaplaci_za_1mc'] = array('label'=>"zapłaci miesiąc później", 'date'=>$date);
+			}
+			{// zaplaci za 2-mce pozniej
+				$date = date("Y-m-d", mktime(0,0,0,date('m') + 2, date('d'), date('Y')));
+				$ret['zaplaci_za_2mc'] = array('label'=>"zapłaci 2 miesiące później", 'date'=>$date);
+			}
+			{// zaplaci za 3-mce pozniej
+				$date = date("Y-m-d", mktime(0,0,0,date('m') + 3, date('d'), date('Y')));
+				$ret['zaplaci_za_3mc'] = array('label'=>"zapłaci 3 miesiące później", 'date'=>$date);
+			}
+		}
+
+		$ret['nie_odbiera'] = array('label'=>"nie obiera lub wyłączony telefon", 'date'=>'');
+		$ret['zly_numer'] = array('label'=>"zły numer telefonu", 'date'=>'');
+		return $ret;
+	}
+
+	public static function get_sms_status_info($user, $terminPlatnosci = '') {
+		$ret = array();
+		$today = date("Y-m-d");
+		$due_date = $user->PAY_TERM;// ustalowny pay term
+		$zaleglosc = number_format($user->PAY_SALDO, 2, ',', '');
+		if ($user->PAY_SALDO <= -0.05) {
+			$msg = "Twoje saldo na dzien {$today} wynosi {$zaleglosc} zl.\n";
+			if (strlen($terminPlatnosci) == 10 && $terminPlatnosci > date("Y-m-d")) {
+				$msg .= "Prosimy o uregulowanie w/w zaleglosci w terminie do {$terminPlatnosci}.";
+			} else {
+				$msg .= "Prosimy o niezwloczne uregulowanie zaleglosci.";
+			}
+			if ($due_date > $today) {
+			//	$msg .= "Prosimy o uregulowanie zaleglosci do dnia {$due_date} r.";
+			} else {
+			}
+			$ret['Powiadomienie SMS o zaleglosciach'] = array('label'=>"Windykacja: Powiadomienie SMS o zaleglosciach", 'msg'=>$msg);
+			// Z powodu niedotrzymania terminu płatności nastąpi blokada usług. Dowód wpłaty w kwocie #Saldo# zł prosimy przesłać na  bok@biall.net.pl. Szczegóły 587277777.
+			$doZaplaty = number_format(-1 * $user->PAY_SALDO, 2, ',', '');
+			$msgBlokada = "Z powodu niedotrzymania terminu platnosci nastapi blokada uslug. Dowod wplaty w kwocie {$doZaplaty} zl prosimy przeslac na bok@biall.net.pl. Szczegoly 587277777.";
+			$ret['Powiadomienie SMS o blokadzie'] = array('label'=>"Windykacja: Powiadomienie SMS o blokadzie", 'msg'=>$msgBlokada);
+		}
+		return $ret;
+	}
+
+	/*
+<html><body>Informujemy Pana/Pania o zalegosci w platnosciach w wysokosci 109.16 zl. Prosimy o uregulowanie w/w zaleglosci w terminie do 31.03.2015 r.<br>W przypadku watpliwosci prosimy o kontakt z Biurem Obslugi Klienta. <p>BIALL-NET Sp. z o.o. <br><br>Biuro Obslugi Klienta:<br>tel. 58 741 84 10<br>fax 58 741 84 30</body></html>
+	*/
+	public static function get_mail_status_info($user, $terminPlatnosci = '') {
+		$ret = array();
+		$today = date("Y-m-d");
+		$due_date = $user->PAY_TERM;// ustalowny pay term
+		$zaleglosc = number_format(abs($user->PAY_SALDO), 2, ',', '');
+		if ($user->PAY_SALDO <= -0.05) {
+			$msg = "Informujemy Pana/Pania o zalegosci w platnosciach w wysokosci {$zaleglosc} zl.\n";
+			if (strlen($terminPlatnosci) == 10 && $terminPlatnosci > date("Y-m-d")) {
+				$msg .= "Prosimy o uregulowanie w/w zaleglosci w terminie do {$terminPlatnosci}.";
+			} else {
+				$msg .= "Prosimy o niezwloczne uregulowanie zaleglosci.";
+			}
+			$msg .= "<br>W przypadku watpliwosci prosimy o kontakt z Biurem Obslugi Klienta.";
+			$msg .= "<p>BIALL-NET Sp. z o.o.</p>";
+			if ($due_date > $today) {
+			//	$msg .= "Prosimy o uregulowanie zaleglosci do dnia {$due_date} r.";
+			} else {
+			}
+			$ret['Powiadomienie o zaleglosciach'] = array('label'=>"Windykacja: Powiadomienie o zaleglosciach", 'msg'=>$msg);
+		}
+		return $ret;
+	}
+
+	/**
+	 * Update user phone status.
+	 * 
+	 * @returns boolean - status changed or not
+	 * @param $user - object return from function Windykacja_StatsModel::get_user_by_id
+	 * @param $phone_status - phone status
+	 * 
+	 */
+	public static function update_phone_status($user, $phone_status) {
+		$data_arr = array();
+
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["LAST_PHONE_STATUS"] = $phone_status;
+		$data_arr["LAST_PHONE_STATUS_DATE"] = date("Y-m-d");
+		$status_info = self::get_phone_status_info($user);
+		if (array_key_exists($phone_status, $status_info)) {
+			$date = V::get('date', '', $status_info[$phone_status]);
+			if ($date != '' && $date != '0000-00-00') {
+				$data_arr["PAY_TERM"] = $date;
+			}
+		}
+
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
+		DB::query($sql);
+
+		// update HIST
+		//if (DB::affected()) {
+			$sql_arr = array();
+			foreach ($data_arr as $k => $v) {
+				$sql_arr["`{$k}`"] = "'{$v}'";
+			}
+			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+			DB::query($sql);
+		//}
+		return true;
+	}
+
+	public static function update_sms_status($user, $sms_status) {
+		$data_arr = array();
+		$status_info = self::get_sms_status_info($user);
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$sms_status ';print_r($sms_status);echo'</pre>';
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$status_info ';print_r($status_info);echo'</pre>';
+
+		if (!array_key_exists($sms_status, $status_info)) {
+			echo '<div class="alert alert-danger">Nieznany status!</div>';
+			return false;
+		}
+		$db_webone = DB::getDB('931');
+		if (!$db_webone) {
+			echo '<div class="alert alert-danger">Brak połączenia do bazy billing!</div>';
+			return false;
+		}
+		$sqlArr = array();
+		$sqlArr["`ID_BILLING_USERS`"] = $user->ID;
+		$sqlArr["`SUBJECT`"] = "'{$status_info[$sms_status]['label']}'";
+		$sqlArr["`BODY_HTML`"] = "'{$status_info[$sms_status]['msg']}'";
+		$sqlArr["`REQUEST_STATUS_SMS`"] = "'SENT_SMS'";
+		$sql = "insert into `HIST_CONTACTS` (" . implode(",", array_keys($sqlArr)) . ")
+																 values (" . implode(",", array_values($sqlArr)) . ");";
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">sql ';print_r($sql);echo'</pre>';
+		//echo'TODO: TEST...';return true;
+		$db_webone->query($sql);
+		$msgId = $db_webone->insert_id();
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$msgId ';print_r($msgId);echo'</pre>';
+
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["LAST_SMS_MSG_ID"] = $msgId;
+		$data_arr["LAST_SMS_STATUS"] = $sms_status;
+		$data_arr["LAST_PHONE_STATUS_DATE"] = date("Y-m-d");
+		if (array_key_exists($sms_status, $status_info)) {
+			$date = V::get('date', '', $status_info[$sms_status]);
+			if ($date != '' && $date != '0000-00-00') {
+				$data_arr["PAY_TERM"] = $date;
+			}
+		}
+
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
+		DB::query($sql);
+
+		// update HIST
+		//if (DB::affected()) {
+			$sql_arr = array();
+			foreach ($data_arr as $k => $v) {
+				$sql_arr["`{$k}`"] = "'{$v}'";
+			}
+			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+			DB::query($sql);
+		//}
+		return true;
+	}
+
+	public static function update_mail_status($user, $mail_status) {
+		$data_arr = array();
+		$status_info = self::get_mail_status_info($user);
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$mail_status ';print_r($mail_status);echo'</pre>';
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$status_info ';print_r($status_info);echo'</pre>';
+
+		if (!array_key_exists($mail_status, $status_info)) {
+			echo '<div class="alert alert-danger">Nieznany status!</div>';
+			return false;
+		}
+		$db_webone = DB::getDB('931');
+		if (!$db_webone) {
+			echo '<div class="alert alert-danger">Brak połączenia do bazy billing!</div>';
+			return false;
+		}
+		$sqlArr = array();
+		$sqlArr["`ID_BILLING_USERS`"] = $user->ID;
+		$sqlArr["`SUBJECT`"] = "'{$status_info[$mail_status]['label']}'";
+		$sqlArr["`BODY_HTML`"] = "'<html><body>{$status_info[$mail_status]['msg']}</body></html>'";
+		$sqlArr["`REQUEST_STATUS_MAIL`"] = "'CONFIRM_SENT_MAIL'";
+		$sql = "insert into `HIST_CONTACTS` (" . implode(",", array_keys($sqlArr)) . ")
+																 values (" . implode(",", array_values($sqlArr)) . ");";
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">sql ';print_r($sql);echo'</pre>';
+		//echo'TODO: TEST...';return true;
+		$db_webone->query($sql);
+		$msgId = $db_webone->insert_id();
+		echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$msgId ';print_r($msgId);echo'</pre>';
+
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["LAST_MAIL_MSG_ID"] = $msgId;
+		$data_arr["LAST_MAIL_STATUS"] = $mail_status;
+		$data_arr["LAST_PHONE_STATUS_DATE"] = date("Y-m-d");
+		if (array_key_exists($mail_status, $status_info)) {
+			$date = V::get('date', '', $status_info[$mail_status]);
+			if ($date != '' && $date != '0000-00-00') {
+				$data_arr["PAY_TERM"] = $date;
+			}
+		}
+
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
+		DB::query($sql);
+
+		// update HIST
+		//if (DB::affected()) {
+			$sql_arr = array();
+			foreach ($data_arr as $k => $v) {
+				$sql_arr["`{$k}`"] = "'{$v}'";
+			}
+			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+			DB::query($sql);
+		//}
+		return true;
+	}
+
+	public static function update_old_id_koresp(&$user, $id_koresp, $koresp_type) {
+		$db = DB::getDB();
+		$koresp = DB::get_by_id('IN7_DZIENNIK_KORESP', $id_koresp);
+		if (!$koresp) {
+			return false;
+		}
+
+		// check if ID koresp already exists in HIST table!
+		$sql = "select wh.`ID`,wh.``,wh.`` from `USERS2_WINDYKACJA_STATUS_HIST` as wh where ";
+
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["ID_USERS2"] = $user->WINDYKACJA_ID;
+		$data_arr["ID_KORESP"] = $id_koresp;
+		//$data_arr["A_STATUS_UPDATE_DATE"] = $koresp->K_DATA_OTRZYMANEJ_KORESP;// data utworzenia
+		$data_arr["A_STATUS_UPDATE_DATE"] = $koresp->K_DATA_OTRZYM_KORESP;// data wyslania
+		// $koresp_type ?
+
+		// update HIST
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr["`{$k}`"] = "'{$v}'";
+		}
+		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+		$db->query($sql);
+		return true;
+	}
+
+	/**
+	 * @returns int - ID Koresp or null if error
+	 */
+	public static function update_bok_rozwiazanie_umowy(&$user, $id_proj, $nr_umowy, $powod, $powod_desc, $termin_odlaczenia, &$msg_log) {
+		$data_arr = array();
+		if ($id_proj > 0 && $nr_umowy > 0 && $powod != '') {
+			$new_id_deals = Windykacja_StatsModel::create_deals_rozwiazanie($user->ID, $nr_umowy, $termin_odlaczenia, $powod_desc);
+			if (!$new_id_deals) {
+				$msg_log[] = "Nie udało się utworzyć rekordu w DEALS_TABLE";
+				return null;
+			}
+			$msg_log[] = "Utworzonno rekord w DEALS_TABLE ID={$new_id_deals}";
+
+			$new_id_koresp = Windykacja_StatsModel::create_koresp($user, 'rozwiazanie umowy', $id_proj, array('nr_umowy'=>$nr_umowy, 'powod'=>$powod, 'powod_desc'=>$powod_desc));
+			if (!$new_id_koresp) {
+				$msg_log[] = "Nie udało się utworzyć rekordu KORESP";
+				return null;
+			}
+			$msg_log[] = "Utworzonno rekord KORESP ID={$new_id_koresp}";
+			$data_arr["ID_KORESP"] = $new_id_koresp;
+		} else {
+			return null;
+		}
+		$data_arr["params"] = "rozwiazanie umowy,{$nr_umowy},{$powod},{$termin_odlaczenia},{$new_id_deals}";
+		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");// zawsze podana jesli jest zmiana A_STATUS
+
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ";
+		DB::query($sql);
+
+		//if (DB::affected()) {
+		// update $user data
+		foreach ($data_arr as $k => $v) {
+			$user->$k = $v;
+		}
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr["`{$k}`"] = "'{$v}'";
+		}
+		$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+		DB::query($sql);
+		//}
+		return $new_id_koresp;
+	}
+
+	public static function update_users_table() {
+		if (!isset($_SESSION['USERS2_WINDYKACJA_PANEL'])) $_SESSION['USERS2_WINDYKACJA_PANEL'] = array();
+		$_SESSION['USERS2_WINDYKACJA_PANEL']['_initialized'] = 0;// always actualize
+		if (0 == V::get('_initialized', 0, $_SESSION['USERS2_WINDYKACJA_PANEL'], 'int')) {
+			$sql = "insert ignore into `USERS2_WINDYKACJA_STATUS` (`ID_BILLING_USERS`, `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
+				select `id_users`, '" . date("Y-m-d-H:i") . "', 'sync-users' from `BILLING_USERS_ADD`
+			";
+			$res = DB::query($sql);
+
+			$_SESSION['USERS2_WINDYKACJA_PANEL']['_initialized'] = 1;
+		}
+	}
+
+	public static function _to_update_where() {
+		$sql_where = "";
+		$sql_where_and_arr = array();
+		//$sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
+		$sql_where_and_arr[] = "w.`A_STATUS_UPDATE_DATE`<CURDATE()";
+		$sql_where = implode(" and ", $sql_where_and_arr);
+		return $sql_where;
+	}
+
+	public static function get_to_update_total() {
+		$ret = array();
+		$sql_where = self::_to_update_where();
+		$db = DB::getDB();
+		$sql = "select count(1) as cnt
+			from `USERS2_WINDYKACJA_STATUS` as w
+			where {$sql_where}
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret = $r->cnt;
+		}
+		return $ret;
+	}
+
+	public static function get_to_update_list($limit) {
+		$ret = array();
+		$db = DB::getDB();
+		$sql_where = self::_to_update_where();
+		$sql_limit = ($limit > 0)? "limit {$limit}" : "";
+		$sql = "select w.*
+			from `USERS2_WINDYKACJA_STATUS` as w
+			where {$sql_where}
+			order by ID desc
+			{$sql_limit}
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[] = $r;
+		}
+		return $ret;
+	}
+
+	/**
+	 * @returns boolean - status changed or not
+	 * @param $user - object return from function Windykacja_StatsModel::get_user_by_id
+	 * @param $data - array of new user data
+	 *   1. wysłanie 1 wezwania do zapłaty ($user->A_STATUS='wezwanie1'; `PAY_TERM`, `wezwanie1_DATE`, `ID_PROJ`)
+	 *   2. wysłanie 2 wezwania do zapłaty ($user->A_STATUS='wezwanie2'; `PAY_TERM`, `wezwanie2_DATE`, `ID_KORESP`)
+	 *   3. klient spłacił wszystkie zobowiązania (`PAY_SALDO` >= -0.05)
+	 * TODO: 4. bledny adres klienta - ponowne wyslanie wezwania - niezaleznie od statusu?
+	 * 
+	 * if $user->A_STATUS == 'wezwanie1' @param $data:
+	 *   $data['wezwanie1_DATE'] - user data
+	 *   $data['PAY_TERM'] - user data
+	 *   $data['ID_PROJ'] - do Windykacja_StatsModel::create_koresp
+	 */
+	public static function update_user($user, $data) {
+		if (empty($data)) {
+			return $user;
+		}
+		$data_arr = array();
+		// set up status by current status and $data
+		switch ($user->A_STATUS) {
+			case 'WAITING':// auto
+				break;
+
+			case 'wezwanie1':// wymaga `PAY_TERM`, `wezwanie1_DATE`, `ID_KORESP` - wysłanie wezwanie1 (z podaniem ID_KORESP, i PAY_TERM=NOW()+14dni)
+				// TODO: ID_KORESP z utworzonego rekordu KORESP (wymaga ID_PROJ)
+				if ("" != V::get('wezwanie1_DATE' ,'', $data) && "" != V::get('PAY_TERM' ,'', $data) && V::get('ID_PROJ' ,'', $data, 'int') > 0) {
+					$new_id_koresp = Windykacja_StatsModel::create_koresp($user, 'wezwanie1', V::get('ID_PROJ' ,'', $data, 'int'));
+					if (!$new_id_koresp) {
+						// TODO: revert changes - DB error
+						return $user;
+					}
+					$data_arr["ID_KORESP"] = $new_id_koresp;
+					$data_arr["LAST_ID_KORESP_WEZWANIE1"] = $new_id_koresp;
+					$data_arr["A_STATUS"] = "waiting-wezwanie2";
+					$data_arr["wezwanie1_DATE"] = V::get('wezwanie1_DATE' ,'', $data);
+					$data_arr["PAY_TERM"] = V::get('PAY_TERM' ,'', $data);
+					unset($data['ID_PROJ']);// TODO: RM after mv $data to $data_arr
+				}
+				break;
+
+			case 'waiting-wezwanie2':// auto
+				break;
+
+			case 'wezwanie2':// wymaga `PAY_TERM`, `wezwanie2_DATE`, `ID_KORESP` - wysłanie wezwanie2 (z podaniem ID_KORESP, i PAY_TERM=NOW()+14dni)
+				if ("" != V::get('wezwanie2_DATE' ,'', $data) && "" != V::get('PAY_TERM' ,'', $data) && V::get('ID_PROJ' ,'', $data, 'int') > 0) {
+					$new_id_koresp = Windykacja_StatsModel::create_koresp($user, 'wezwanie2', V::get('ID_PROJ' ,'', $data, 'int'));
+					if (!$new_id_koresp) {
+						// TODO: revert changes - DB error
+						return $user;
+					}
+					$data_arr["ID_KORESP"] = $new_id_koresp;
+					$data_arr["LAST_ID_KORESP_WEZWANIE2"] = $new_id_koresp;
+					$data_arr["A_STATUS"] = "waiting-krd";
+					$data_arr["wezwanie2_DATE"] = V::get('wezwanie2_DATE' ,'', $data);
+					$data_arr["PAY_TERM"] = V::get('PAY_TERM' ,'', $data);
+				}
+				break;
+
+			default:
+				
+		}
+
+		// if status not set, check id user saldo is ok
+		if (!isset($data_arr["A_STATUS"])) {
+			if (isset($data['PAY_SALDO']) && $data['PAY_SALDO'] >= -0.05) {
+				$data_arr["A_STATUS"] = "WAITING";
+			}
+		}
+
+		// error jesli nie ustalono statusu
+		if (!isset($data_arr["A_STATUS"])) {
+			return false;
+		}
+
+		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");// zawsze podana jesli jest zmiana A_STATUS
+
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ";
+		DB::query($sql);
+
+		//if (DB::affected()) {
+		// update $user data
+		foreach ($data_arr as $k => $v) {
+			$user->$k = $v;
+		}
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr["`{$k}`"] = "'{$v}'";
+		}
+		$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+		DB::query($sql);
+		//}
+		return true;
+	}
+
+	public static function bad_address_save($user, $id_koresp) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["BAD_ADDRESS"] = 1;
+		$data_arr["ID_KORESP"] = $id_koresp;
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function bad_address_confirm($user, $id_koresp) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["BAD_ADDRESS"] = 0;
+		$data_arr["ID_KORESP"] = $id_koresp;
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function _sql_update($user, $data_arr) {
+		// update values
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr[] = "`{$k}`='{$v}'";
+		}
+		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ";
+		DB::query($sql);
+		// update $user data
+		foreach ($data_arr as $k => $v) {
+			$user->$k = $v;
+		}
+		$sql_arr = array();
+		foreach ($data_arr as $k => $v) {
+			$sql_arr["`{$k}`"] = "'{$v}'";
+		}
+		$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
+		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
+		DB::query($sql);
+		return true;
+	}
+
+	public static function change_status_save($user, $new_status) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");
+		$data_arr["A_STATUS"] = $new_status;
+		if ($user->A_STATUS == 'krd' && $new_status == 'waiting-sad') {
+			$data_arr["wpis_w_krd_DATE"] = date('Y-m-d');
+		}
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function nr_sprawy_krd_save($user, $nr_sprawy_krd) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["NR_SPRAWY_KRD"] = $nr_sprawy_krd;
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function nr_sprawy_sad_save($user, $nr_sprawy_sad) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["NR_SPRAWY_SAD"] = $nr_sprawy_sad;
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function nr_sprawy_komornik_save($user, $nr_sprawy_komornik) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["NR_SPRAWY_KOMORNIK"] = $nr_sprawy_komornik;
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function ustalenia_info_save($user, $ustalenia_date, $ustalenia_info) {
+		$data_arr = array();
+		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
+		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
+		$data_arr["L_APPOITMENT_DATE"] = $ustalenia_date;
+		$data_arr["L_APPOITMENT_INFO"] = $ustalenia_info;
+		$data_arr["L_APPOITMENT_USER"] = $_SESSION['ADM_ACCOUNT'];
+
+		if (empty($ustalenia_info) && (empty($ustalenia_date) || $ustalenia_date == '0000-00-00')) {
+			$data_arr["L_APPOITMENT_USER"] = '';
+		}
+		return self::_sql_update($user, $data_arr);
+	}
+
+	public static function get_user_hist_events(&$user) {
+		$db = DB::getDB();
+		$ret = array();
+		$sql = "select wh.*
+			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
+			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[] = $r;
+		}
+		return $ret;
+	}
+
+	public static function get_user_hist_status_events(&$user) {
+		$db = DB::getDB();
+		$ret = array();
+		$sql = "select wh.*, kor.`K_ZAWARTOS`
+			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
+				left join `IN7_DZIENNIK_KORESP` as kor on(wh.`ID_KORESP`!='N/S;' and kor.`ID`=wh.`ID_KORESP`)
+			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
+				and wh.`A_STATUS_UPDATE_DATE`!='N/S;'
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[] = $r;
+		}
+		return $ret;
+	}
+
+	public static function get_user_hist_phone_events(&$user) {
+		$ret = array();
+		$db = DB::getDB();
+		$sql = "select wh.*
+			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
+			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
+				and wh.`LAST_PHONE_STATUS_DATE`!='N/S;'
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[] = $r;
+		}
+		return $ret;
+	}
+
+	public static function get_user_bad_address_events(&$user) {
+		$ret = array();
+		$db = DB::getDB();
+		$sql = "select wh.*
+			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
+			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
+				and wh.`BAD_ADDRESS`!='N/S;'
+			order by wh.`ID` ASC
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[] = $r;
+		}
+		return $ret;
+	}
+
+	public static function get_status_count() {
+		$sql_where_and_arr = array();
+		$usrAclGroups = User::getLdapGroupsNames();
+		$usrAclGroups[] = '';
+		$sqlUsrAclGroups = "'" . implode("','", $usrAclGroups) . "'";
+		$sql_where_and_arr[] = "a.`A_ADM_COMPANY` in({$sqlUsrAclGroups})";
+		$sql_where_and_arr[] = "a.`A_CLASSIFIED` in({$sqlUsrAclGroups})";
+		$sqlWhereAdd = " and " . implode(" and ", $sql_where_and_arr);
+
+		$ret = array();
+		$db = DB::getDB();
+		$sql = " select w.`A_STATUS`, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where 1=1 {$sqlWhereAdd}
+			group by w.`A_STATUS` 
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[$r->A_STATUS] = $r;
+		}
+		// filter: 'po-terminie'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`PAY_SALDO`<=-0.05
+				and w.`PAY_DATE`!='0000-00-00'
+				and w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 36 MONTH)
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['po-terminie'] = $r;
+		}
+		// filter: '3 m-ce przed'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`PAY_SALDO`<=-0.05
+				and w.`PAY_DATE`!='0000-00-00'
+				and w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 33 MONTH)
+				and w.`PAY_DATE`>DATE_SUB(NOW(), INTERVAL 36 MONTH)
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['3 m-ce przed'] = $r;
+		}
+		// filter: 'tel1'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`PAY_SALDO`<=-0.05
+				and w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')
+				and ( w.`LAST_PHONE_STATUS_DATE`='0000-00-00'
+					or w.`LAST_PHONE_STATUS_DATE`<DATE_SUB(NOW(), INTERVAL 14 DAY) )
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['tel1'] = $r;
+		}
+		// filter: 'bad_address'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`PAY_SALDO`<=-0.05
+				-- and w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')
+				and w.`BAD_ADDRESS`>0
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['bad_address'] = $r;
+		}
+		// filter: 'stan_zero', '10-ego'
+		$stanZeroLimit = -0.05;
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`>{$stanZeroLimit}, 1, 0)) as cnt_stan_zero
+				, sum(IF(w.`PAY_SALDO`<={$stanZeroLimit}, 1, 0)) as cnt_stan_minus
+				, sum(IF(w.`PAY_SALDO`<={$stanZeroLimit}, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`A_STATUS`='WAITING'
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['stan_zero'] = (object)array('A_STATUS'=>'stan_zero', 'cnt'=>$r->cnt_stan_zero, 'suma_zaleglosci'=>0);
+			$ret['10-ego'] = (object)array('A_STATUS'=>'10-ego', 'cnt'=>$r->cnt_stan_minus, 'suma_zaleglosci'=>$r->suma_zaleglosci);
+		}
+		// filter: 'has_nr_sad', 'has_nr_komornik', 'has_ustalenia'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`NR_SPRAWY_SAD`!='', 1, 0)) as cnt_sad
+				, sum(IF(w.`NR_SPRAWY_KOMORNIK`!='', 1, 0)) as cnt_komornik
+				, sum(IF(w.`L_APPOITMENT_INFO`!='', 1, 0)) as cnt_ustalenia
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				(w.`NR_SPRAWY_SAD`!=''
+					or w.`NR_SPRAWY_KOMORNIK`!=''
+					or w.`L_APPOITMENT_INFO`!=''
+				)
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['has_nr_sad'] = (object)array('A_STATUS'=>'has_nr_sad', 'cnt'=>$r->cnt_sad, 'suma_zaleglosci'=>null);
+			$ret['has_nr_komornik'] = (object)array('A_STATUS'=>'has_nr_komornik', 'cnt'=>$r->cnt_komornik, 'suma_zaleglosci'=>null);
+			$ret['has_ustalenia'] = (object)array('A_STATUS'=>'has_ustalenia', 'cnt'=>$r->cnt_ustalenia, 'suma_zaleglosci'=>null);
+		}
+		// filter: 'sad_and_komornik', 'sad_bez_komornik'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`NR_SPRAWY_KOMORNIK`!='', 1, 0)) as cnt_komornik
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`A_STATUS`='sad'
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['sad_and_komornik'] = (object)array('A_STATUS'=>'sad_and_komornik', 'cnt'=>$r->cnt_komornik, 'suma_zaleglosci'=>null);
+			$ret['sad_bez_komornik'] = (object)array('A_STATUS'=>'sad_bez_komornik', 'cnt'=>($r->cnt - $r->cnt_komornik), 'suma_zaleglosci'=>null);
+		}
+		// filter: 'isMovedToVectra'
+		$sql = "select w.`A_STATUS`
+				, count(1) as cnt
+				, sum(IF(w.`PAY_SALDO`<={$stanZeroLimit}, w.`PAY_SALDO`, 0)) as suma_zaleglosci
+			from  `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where
+				w.`IS_MOVED_TO_VECTRA`=1
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$ret['isMovedToVectra'] = (object)array('cnt'=>$r->cnt, 'suma_zaleglosci'=>$r->suma_zaleglosci);
+		}
+		return $ret;
+	}
+
+}

+ 1142 - 0
SE/se-lib/Windykacja/StatsModel.php

@@ -0,0 +1,1142 @@
+<?php
+
+Lib::loadClass('Windykacja_BillingListDocs');
+Lib::loadClass('Windykacja_StatsHelper');
+
+class Windykacja_StatsModel {
+
+	public static function _parse_query($q) {
+		$sql_where = '';
+		$sql_where_and_arr = array();
+
+		$usrAclGroups = User::getLdapGroupsNames();
+		$usrAclGroups[] = '';
+		$sqlUsrAclGroups = "'" . implode("','", $usrAclGroups) . "'";
+		$sql_where_and_arr[] = "a.`A_ADM_COMPANY` in({$sqlUsrAclGroups})";
+		$sql_where_and_arr[] = "a.`A_CLASSIFIED` in({$sqlUsrAclGroups})";
+
+		$filter_selected = Windykacja_StatsHelper::get_filter_selected();
+		if ($filter_selected) {
+			if ($filter_selected == 'po-terminie') {
+				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
+				$sql_where_and_arr[] = "w.`PAY_DATE`!='0000-00-00'";
+				$sql_where_and_arr[] = "w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 36 MONTH)";
+			}
+			else if ($filter_selected == '3 m-ce przed') {
+				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
+				$sql_where_and_arr[] = "w.`PAY_DATE`!='0000-00-00'";
+				$sql_where_and_arr[] = "w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 33 MONTH)";
+				$sql_where_and_arr[] = "w.`PAY_DATE`>DATE_SUB(NOW(), INTERVAL 36 MONTH)";
+			}
+			else if ($filter_selected == 'tel1') {
+				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
+				$sql_where_and_arr[] = "w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')";
+				$sql_where_and_arr[] = "( w.`LAST_PHONE_STATUS_DATE`='0000-00-00'
+					or w.`LAST_PHONE_STATUS_DATE`<DATE_SUB(NOW(), INTERVAL 3 MONTH) )";
+			}
+			else if ($filter_selected == 'bad_address') {
+				$sql_where_and_arr[] = "w.`BAD_ADDRESS`>0";
+				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
+			}
+			else if ($filter_selected == 'stan_zero') {
+				$sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
+				$sql_where_and_arr[] = "w.`PAY_SALDO`>-0.05";
+			}
+			else if ($filter_selected == '10-ego') {
+				$sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
+				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
+			}
+			else if ($filter_selected == 'has_nr_sad') {
+				$sql_where_and_arr[] = "w.`NR_SPRAWY_SAD`!=''";
+			}
+			else if ($filter_selected == 'has_nr_komornik') {
+				$sql_where_and_arr[] = "w.`NR_SPRAWY_KOMORNIK`!=''";
+			}
+			else if ($filter_selected == 'has_ustalenia') {
+				$sql_where_and_arr[] = "w.`L_APPOITMENT_INFO`!=''";
+			}
+			else if ($filter_selected == 'sad_and_komornik') {
+				$sql_where_and_arr[] = "w.`A_STATUS`='sad' and w.`NR_SPRAWY_KOMORNIK`!=''";
+			}
+			else if ($filter_selected == 'sad_bez_komornik') {
+				$sql_where_and_arr[] = "w.`A_STATUS`='sad' and w.`NR_SPRAWY_KOMORNIK`=''";
+			}
+			else if ($filter_selected == 'isMovedToVectra') {
+				$sql_where_and_arr[] = "w.`IS_MOVED_TO_VECTRA`=1";
+			}
+			else {
+				$sql_where_and_arr[] = "w.`A_STATUS`='{$filter_selected}'";
+			}
+		}
+		if (!empty($q)) {
+			$q = trim($q);
+			if (is_numeric($q)) {// billing number
+				$sqlIdUsr = DB::_($q);
+				$sql_where_and_arr[] = "a.`id_users`='{$sqlIdUsr}'";
+			}
+			else {// string - name, second name
+				$q_arr_values = array();
+				$q_exp = explode(' ', $q);
+				foreach ($q_exp as $v_q) {
+					$v_q = trim($v_q);
+					if (strlen($v_q) > 2) {// min. 3 znaki
+						$q_arr_values[] = strtolower($v_q);
+					}
+				}
+
+				foreach ($q_arr_values as $q_value) {
+					$sql_filter_q = array();
+					$q_arr = array();// uniq array
+					$q_arr_pl = array();// loop array
+
+					$pl_letters = array('ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż');
+					$en_letters = array('a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z');
+
+					$sqlQValue = DB::_($q_value);
+					$sql_filter_q[] = "a.`P_NAME` like '{$sqlQValue}%'";
+					$sql_filter_q[] = "a.`P_NAME_SECOND` like '{$sqlQValue}%'";
+
+					$q_value_clean_en = str_replace($pl_letters, $en_letters, $q_value);
+					$q_value_clean_pl = str_replace($en_letters, $pl_letters, $q_value_clean_en);
+					$q_value_clean_pr = str_replace($en_letters, '_', $q_value_clean_en);
+					if ($q_value_clean_en != $q_value) $q_arr[$q_value_clean_en] = true;
+					if ($q_value_clean_pl != $q_value) $q_arr[$q_value_clean_pl] = true;
+					if ($q_value_clean_pr != $q_value) $q_arr[$q_value_clean_pr] = true;
+
+					foreach ($q_arr as $v_q => $v_val) {
+						$sqlQValue = DB::_($v_q);
+						$sql_filter_q[] = "a.`P_NAME` like '{$sqlQValue}'";
+						$sql_filter_q[] = "a.`P_NAME_SECOND` like '{$sqlQValue}'";
+						// $sql_filter_q[] = "a.`P_ADDRESS_STREET` like '{$sqlQValue}'";
+					}
+
+					$sql_field_1 = "a.`P_NAME`";
+					$sql_field_2 = "a.`P_NAME_SECOND`";
+					foreach ($pl_letters as $k_ind => $v_char_pl) {
+						$sql_field_1 = "REPLACE({$sql_field_1}, '{$v_char_pl}', '{$en_letters[$k_ind]}')";
+						$sql_field_2 = "REPLACE({$sql_field_2}, '{$v_char_pl}', '{$en_letters[$k_ind]}')";
+					}
+					$q_value_clean_en = DB::_($q_value_clean_en);
+					$sql_filter_q[] = $sql_field_1 . " like '%{$q_value_clean_en}%'";
+					$sql_filter_q[] = $sql_field_2 . " like '%{$q_value_clean_en}%'";
+
+					$sql_where_and_arr[] = "(" . implode(" or ", $sql_filter_q) . ")";
+				}
+			}
+		}
+
+		$special_filter_active = V::get('_special_filter_active', '', $_GET);
+		if ('today' == $special_filter_active) {
+			$today = date("Y-m-d");
+			$sql_where_and_arr[] = "w.`A_STATUS_UPDATE_DATE`='{$today}'";
+		}
+		$special_filter_msg_mail = V::get('_special_filter_msg_mail', '', $_GET);
+		if ('not_today' == $special_filter_msg_mail) {
+			$sql_where_and_arr[] = "w.`LAST_PHONE_STATUS_DATE`<'{$today}'";
+		}
+		$special_filter_msg_sms = V::get('_special_filter_msg_sms', '', $_GET);
+		if ('not_today' == $special_filter_msg_sms) {
+			$sql_where_and_arr[] = "w.`LAST_PHONE_STATUS_DATE`<'{$today}'";
+		}
+
+		if (!empty($sql_where_and_arr)) {
+			$sql_where = implode(" and ", $sql_where_and_arr);
+		} else {
+			$sql_where = "1=1";
+		}
+		return $sql_where;
+	}
+
+	public static function get_order_by_fields() {
+		$order_by_fields = array();
+		$order_by_fields[] = 'ID';
+		$order_by_fields[] = 'is_firma';
+		$order_by_fields[] = 'BILLING_OWNER';
+		$order_by_fields[] = 'STATUS';
+		$order_by_fields[] = 'BLOKADA';
+		$order_by_fields[] = 'ID_BILLING_USERS';
+		$order_by_fields[] = 'P_NAME';
+		$order_by_fields[] = 'PAY_SALDO';
+		$order_by_fields[] = 'PAY_FVAT';
+		$order_by_fields[] = 'PAY_DATE';
+		$order_by_fields[] = 'PAY_TERM';
+		$order_by_fields[] = 'HAS_ACTIVE_NET';
+		$order_by_fields[] = 'HAS_ACTIVE_TV';
+		$order_by_fields[] = 'IS_MOVED_TO_VECTRA';
+		return $order_by_fields;
+	}
+
+	public static function get_users_total($q = '') {
+		$total = 0;
+		$sql_where = self::_parse_query($q);
+		$db = DB::getDB();
+		$sql = "select count(1) as cnt
+			from `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where {$sql_where}
+		";
+		//echo'<pre>sqlTotal:';print_r($sql);echo'</pre>';
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			$total = $r->cnt;
+		}
+		return $total;
+	}
+
+	public static function get_sql_users_select() {
+		$sql_select = "
+				a.`id_users` as ID
+				, a.`id_users`
+				, a.`P_NAME`
+				, a.`P_NAME_SECOND`
+				, a.`P_ADDRESS_STREET`
+				, a.`P_ADDRESS_HOME`
+				, a.`P_ADDRESS_HOUSE`
+				, a.`P_ADDRESS_CITY`
+				, a.`P_ADDRESS_POST_CODE`
+				, a.`P_ADDRESS_REGION`
+				, a.`P_PESEL`
+				, a.`P_PHONE`
+				, a.`P_OTHER_DOC`
+				, a.`user_mail_contact`
+				, a.`is_firma`
+				, a.`P_ADRESS_KORESP_1282`
+				, w.`ID` as WINDYKACJA_ID
+				, w.`ID_BILLING_USERS`
+				, w.`A_STATUS`
+				, w.`A_STATUS_UPDATE_DATE`
+				, w.`USER_PAY_TERM_ADD`
+				, w.`L_APPOITMENT_DATE`
+				, w.`L_APPOITMENT_USER`
+				, w.`L_APPOITMENT_INFO`
+				, w.`PAY_DATE`
+				, w.`PAY_DATE_FIRST_FVAT`
+				, w.`PAY_TERM`
+				, w.`PAY_SALDO`
+				, w.`PAY_FVAT`
+				, w.`wezwanie1_DATE`
+				, w.`wezwanie2_DATE`
+				, w.`wpis_w_krd_DATE`
+				, w.`ID_KORESP`
+				, w.`LAST_ID_KORESP_WEZWANIE1`
+				, w.`LAST_ID_KORESP_WEZWANIE2`
+				, w.`LAST_PAY_DATE`
+				, w.`LAST_PAY_VALUE`
+				, w.`LAST_FVAT_PAY_TERM`
+				, w.`LAST_FVAT_VALUE`
+				, w.`PAY_SALDO_30_DNI`
+				, w.`PAY_SALDO_ISSUED`
+				, w.`BAD_ADDRESS`
+				-- , (select bu.`BILLING_OWNER` from `BILLING_USERS` as bu where bu.`ID`=w.`ID_BILLING_USERS` limit 1) as BILLING_OWNER
+				-- , (select bu.`STATUS` from `BILLING_USERS` as bu where bu.`ID`=w.`ID_BILLING_USERS` limit 1) as STATUS
+				, bu.`STATUS`
+				, bu.`BILLING_OWNER`
+				, w.`NR_SPRAWY_KRD`
+				, w.`NR_SPRAWY_SAD`
+				, w.`NR_SPRAWY_KOMORNIK`
+				, w.`ACCOUNT_NUMBER`
+				, w.`SERVICES_STREETS`
+				, w.`IS_MOVED_TO_VECTRA` as IS_MOVED_TO_VECTRA
+--				, ('REZYGNACJA_Z_PRZEJSCIEM_DO_VECTRA'=(select `RODZAJ_DZIALANIA_HANDLOWEGO`
+--						from `DEALS_TABLE`
+--						where `A_STATUS`='NORMAL'
+--							and `ID_BILLING_USERS`=w.`ID_BILLING_USERS`
+--						order by `ID` DESC
+--						limit 1)
+--					) as IS_MOVED_TO_VECTRA
+				, w.`HAS_ACTIVE_NET`
+				, w.`HAS_ACTIVE_TV`
+		";
+		return $sql_select;
+	}
+
+	public static function get_users($q = '', $limit = 10, $limit_start = 0, $order_by = '', $order_dir = '') {
+		$ret = array();
+
+		$sql_select = self::get_sql_users_select();
+		$sql_where = self::_parse_query($q);
+		$sql_limit = "limit " . (($limit > 0)? $limit : "10");
+		if ($limit_start > 0) $sql_limit .= " offset {$limit_start}";
+		$sql_order_by = "";
+		$order_by_allowed = self::get_order_by_fields();
+		if (in_array($order_by, $order_by_allowed)) {
+			if (in_array($order_by, array('P_NAME','is_firma'))) {
+				$order_by = "a.{$order_by}";
+			} else if (in_array($order_by, array('BILLING_OWNER','STATUS'))) {
+				$order_by = "bu.{$order_by}";
+			} else if ($order_by == 'BLOKADA') {
+				$order_by = "bu.`STATUS`";
+			} else {
+				$order_by = "w.{$order_by}";
+			}
+			$sql_order_by .= " order by {$order_by}";
+			if (in_array($order_dir, array('DESC','ASC'))) {
+				$sql_order_by .= " {$order_dir}";
+			}
+		}
+		$db = DB::getDB();
+		$sql = "select {$sql_select}
+			from `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS` as bu on(bu.`ID`=w.`ID_BILLING_USERS`)
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where {$sql_where}
+			{$sql_order_by}
+			{$sql_limit}
+		";
+		DBG::_('DBG_SQL', '>1', "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
+		//echo'<pre>';print_r($sql);echo'</pre>';
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$ret[$r->id_users] = $r;
+		}
+		return $ret;
+	}
+
+	public static function get_user_by_id($id) {
+		$ret = null;
+		if ($id <= 0) return $ret;
+
+		$sql_where_and_arr = array();
+		$usrAclGroups = User::getLdapGroupsNames();
+		$usrAclGroups[] = '';
+		$sqlUsrAclGroups = "'" . implode("','", $usrAclGroups) . "'";
+		$sql_where_and_arr[] = "a.`A_ADM_COMPANY` in({$sqlUsrAclGroups})";
+		$sql_where_and_arr[] = "a.`A_CLASSIFIED` in({$sqlUsrAclGroups})";
+		$sqlWhereAdd = " and " . implode(" and ", $sql_where_and_arr);
+
+		$sql_select = self::get_sql_users_select();
+		$sql_where = "a.`id_users`='{$id}'";
+		$db = DB::getDB();
+		$sql = "select {$sql_select}
+			from `USERS2_WINDYKACJA_STATUS` as w
+				left join `BILLING_USERS` as bu on(bu.`ID`=w.`ID_BILLING_USERS`)
+				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
+			where {$sql_where}
+				{$sqlWhereAdd}
+		";
+		$res = $db->query($sql);
+		if ($r = $db->fetch($res)) {
+			if(0){
+				$r->BA_WINIEN = "";
+				$r->BA_MA = "";
+				$r->BA_TIMESTAMP = "";
+				$sql = "select BA.`WINIEN` as BA_WINIEN
+						, BA.`MA` as BA_MA
+						, unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP
+					from `BILLING_ACCOUNTS` as BA
+					where BA.`ID_BILLING_USERS`='" . $r->ID . "'
+				";
+				$db_webone = DB::getDB('931');
+				if ($db_webone) {
+					$res_fin = $db_webone->query($sql);
+					if ($r_fin = $db_webone->fetch($res_fin)) {
+						$r->BA_WINIEN = $r_fin->BA_WINIEN;
+						$r->BA_MA = $r_fin->BA_MA;
+						$r->BA_TIMESTAMP = $r_fin->BA_TIMESTAMP;
+					}
+				}
+			}
+			$ret = $r;
+		}
+		return $ret;
+	}
+
+	public static function get_company(&$user) {
+		if (!isset($user->_company)) {
+			$db = DB::getDB();
+			/*
+				id					1 / 2
+				name1				"BIALL-NET" Sp. z o.o. / "NET-DAY" s.c.
+				name2				--- / Adrian i Ewa Wieczorkowscy
+				kod     		80-174 / 80-809
+				miasto			Gdańsk, Otomin / Gdańsk
+				ulica				Słoneczna / Cieszyńskiego
+				numer_dom		43 / 38
+				numer_pos		NULL / NULL
+				uwagi				--- / ---
+				tel					0-58 320-72-92 / 0-58 741 84 54
+				fax					0-58 320-72-96 / 0-58 741 84 56
+				nip					593-22-68-672 / 583-27-54-031
+				regon				192120212 / 192578721
+				bank				Bank Zachodni WBK SA I O/Gdansk / ---
+				nr_rach			46 1090 1098 0000 0001 0253 7156 / 84 1500 1171 1211 7002 9997 0000
+				NR_RACH_MASS_PAY		109000049887 / 109000049669
+				BILLING_OWNER_EMAIL	biall-net@biall.net.pl / netday@netday.pl
+			 */
+			$sql = "select
+					bo.`id`
+					, bo.`name1`
+					, bo.`name2`
+					, bo.`kod`
+					, bo.`miasto`
+					, bo.`ulica`
+					, bo.`numer_dom`
+					, bo.`tel`
+					, bo.`fax`
+					, bo.`nip`
+					, bo.`regon`
+					, bo.`bank`
+					, bo.`nr_rach`
+					, bo.`NR_RACH_MASS_PAY`
+					, bo.`BILLING_OWNER_EMAIL`
+				from `BILLING_USERS` as bu
+					left join `BILLING_OWNER` as bo on (bo.`ID`=bu.`BILLING_OWNER`)
+				where
+					bu.`ID`='{$user->ID_BILLING_USERS}'
+			";
+			//$db_webone = DB::getDB('931');
+			//if ($db_webone) {
+				//$res = $db_webone->query($sql);
+				//if ($r = $db_webone->fetch($res)) {
+				//	$user->_company = $r;
+				//}
+			//}
+			$res = $db->query($sql);
+			if ($r = $db->fetch($res)) {
+				$user->_company = $r;
+			}
+		}
+		return $user->_company;
+	}
+
+	public static function get_billing_type($type_id) {
+		$ret = null;
+		$types = self::get_billing_types();
+		if (array_key_exists($type_id, $types)) {
+			$ret = $types[$type_id];
+		}
+		return $ret;
+	}
+
+	public static function get_billing_type_desc($type) {
+		$ret = '';
+		if ($type == 'FVAT') {
+			return "Faktura Vat";
+		}
+		$types = self::get_billing_types();
+		foreach ($types as $h) {
+			if ($h['TYPE'] == $type) {
+				return $h['DESC'];
+			}
+		}
+		return $ret;
+	}
+
+	public static function get_billing_types($ids = array()) {
+		static $_cache;
+		if (empty($_cache)) $_cache = array();
+		$cache_key = implode(".", $ids);
+		if (!array_key_exists($cache_key, $_cache)) {
+			$billing_types = array();
+			$db_webone = DB::getDB('931');
+			if ($db_webone) {
+				$sql_where = "1=1";
+				if (!empty($ids)) {
+					$sql_where = "`ID` in ('".implode("','", $ids)."')";
+				}
+				$sql = "select *
+					from `BILLING_NUMBERS_TYPE`
+					where
+						{$sql_where}
+				";
+				$res = $db_webone->query($sql);
+				while ($h = $db_webone->fetch_assoc($res)) {
+					$billing_types[$h['ID']] = $h;
+				}
+			}
+			$_cache[$cache_key] = $billing_types;
+		}
+		return $_cache[$cache_key];
+	}
+
+	public static function getAllServicesStreetsCSV($user) {
+		$streets = array();
+		$db = DB::getDB();
+		$sql = "
+			select s.`S_ADDRESS_STREET`
+			from `COMPANIES` c
+				join `DEALS_TABLE` d on(d.`ID_BILLING_USERS`=c.`ID`)
+				join `SERVICES` s on(s.`ID_BILLING_USERS`=c.`ID` and s.`ID_DEALS_TABLE`=d.`ID`)
+			where c.`ID`='{$user->ID}'
+		--		and c.`A_ADM_COMPANY`='19994_PODMIOT_Vectra_wlasciciel'
+				and s.`NAME_LIST_SERVICES` in ('TV','USERS2','VOIP')
+				and s.`A_STATUS` not in ('DELETED')
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$streets[$r->S_ADDRESS_STREET] = true;
+		}
+		$streets = (!empty($streets))? implode(',', array_keys($streets)) : '';
+		return $streets;
+	}
+
+	public static function get_umowy_from_l2($user) {
+		$ret = array();
+		$db_webone = DB::getDB();
+		if (!$db_webone) {
+			return -1;
+		}
+
+		$sql = "select
+				d.`ID`, d.`P_DEALPREFIX`, d.`P_DEALNUMBER`, d.`P_DEALNUMBER_OLD`, d.`P_DEALDATE`, d.`P_DEALDATE_TERM`, d.`DEALDESC`, d.`ANEX_NEEDED`, d.`ANEX_CONFIRM_DATE`
+			from `DEALS_TABLE` as d
+			where d.`ID_BILLING_USERS`='{$user->ID}'
+			order by d.`ID` DESC
+		";
+		$res = $db_webone->query($sql);
+		while ($h = $db_webone->fetch_assoc($res)) {
+			$ret[$h['ID']] = $h;
+		}
+		return $ret;
+	}
+
+	public static function get_uslugi_from_l2(&$user) {
+		// l2: www/modules/webone/form/edit_user_status.php
+		// Aktualne: Usługa[Status] => list_services2($user->ID);
+		$uID = $user->ID;
+
+		$ret = array();
+		$db_webone = DB::getDB();
+		if (!$db_webone) {
+			return -1;
+		}
+
+		if(0){//	SERVICES table struct example:
+			//[ID_BILLING_USERS] => 11363
+			//[active] => 1
+			//[TAB_UPDATE_STAT] => 1
+			//[TAB_UPDATE_DATE] => 2012-02-03 17:43:44
+			//[TAB_UPDATE_INFO] => OK-PREUPDATE-DELETED---UPDATED-OK-:195.117.2.79
+			//[SERVICE_TYPE] => ABONAMENT
+			//[ID_BILLING_NUMBERS_TYPE] => 1
+			//[ABONAMENT_PERIOD] => 1
+			//[ABONAMENT_VALUE] => 26.01
+			//[VAT] => 23
+			//[ID_CURRENCY] => 0
+			//[ABONAMENT_PAYMENT] => UP
+			//[ABONAMENT_START] => 1
+			//[MINIMUM_BILLING_VALUE] => 0.00
+			//[BILLED_TILL] => 2012-06-01 00:00:00
+			//[HANGUP_FROM] => 
+			//[HANGUP_TILL] => 
+			//[HANGUP_STATUS] => 
+			//[HANGUP_RATIO] => 1.00
+			//[TIMESTAMP] => 20120504125053
+			//[P_ID_SERVICES] => 0
+			//[uwagi] => 
+			//[ID_DEALS_TABLE] => 9373
+			//[VAT_NAME] => 23
+			//[id_list_sww] => 1
+			//[SERV_ID_BILLING_PREFIXES] => 0
+			//[ID_OFFERS] => 833
+			//[A_RECORD_CREATE_DATE] => 
+			//[A_RECORD_CREATE_AUTHOR] => 
+			//[A_RECORD_UPDATE_DATE] => 
+			//[A_RECORD_UPDATE_AUTHOR] => 
+		}
+		$sql = "select
+				s.`ID`, s.`NAME_LIST_SERVICES`, s.`A_STATUS`
+				, s.`ID_OFFERS`
+				, s.`ID_DEALS_TABLE`
+				, s.`P_ID_SERVICES`
+				, s.`P_ID_SERVICES` as P_ID
+				, s.`HANGUP_STATUS`
+				, s.`HANGUP_FROM`
+				, s.`HANGUP_TILL`
+				, ls.`description` as description
+				, lst.`name` as A_STATUS_DESC
+			from `SERVICES` as s
+				left join `LIST_SERVICES` as ls on(ls.`name`=s.`NAME_LIST_SERVICES`)
+				left join `LIST_status` as lst on(lst.`ses_users2`=s.`HANGUP_STATUS` and lst.`ID`>2)
+			where `ID_BILLING_USERS`='{$user->ID}'
+		";
+		$res = $db_webone->query($sql);
+		while ($h = $db_webone->fetch_assoc($res)) {
+			$ret[$h['ID']] = $h;
+		}
+		return $ret;
+	}
+
+	public static function get_umowy_from_l3(&$user) {
+		$ret = array();
+		$db = DB::getDB();
+		$sql = "select d.*
+			from `USERS2_DEALS` as d
+			where
+				(d.`ID_BILLING_USERS_OLD`='{$user->ID}' or d.`ID_BILLING_USERS_NEW`='{$user->ID}')
+			order by d.`ID` DESC
+		";
+		$res = $db->query($sql);
+		while ($h = $db->fetch_assoc($res)) {
+			$ret[] = $h;
+		}
+		return $ret;
+	}
+
+	public static function get_bill_dosc_by_date(&$user, $date_limit = null) {
+		// fetch finanse data from remote DB
+		$billing_docs = new Windykacja_BillingListDocs();
+		$db_webone = DB::getDB('931');
+		if (!$db_webone) {
+			echo'<p style="color:red">'."Blad polaczenia do bazy dancyh webone_billing - Zasob [931]".'</p>';
+			return;
+		}
+		$sql_where = " BILLS_FVAT.OPEN='N' and  BILLS_FVAT.ID_BILLING_USERS ='{$user->ID}' ";
+		// blad w zaokragleniach
+		//		, sum((BILLS_FVAT_POS.AMMOUNT * BILLS_FVAT_POS.PRICE)*(1 + BILLS_FVAT_POS.VAT/100)) as WARTOSC
+		if ($date_limit) {
+			$sql_where .= " and BILLS_FVAT.PAYMENT_TERM <= '{$date_limit}' ";
+		}
+		$sql = "select
+				BILLS_FVAT.*
+				, count(BILLS_FVAT_POS.ID) as ILOSC_POZYCJI
+				, BILLS_FVAT_POS.ID_BILLS_FVAT
+				, sum(round((round(BILLS_FVAT_POS.AMMOUNT * BILLS_FVAT_POS.PRICE, 2)) * (1 + BILLS_FVAT_POS.VAT / 100), 2)) as WARTOSC
+				-- , count(BILLS_FVAT_POS.PRICE) as ILOSC_POZYCJI
+				, `BILLING_NUMBERS`.`NUMBER` as `NUMBER`
+				, `BILLING_NUMBERS`.`ID_BILLING_PREFIXES` as `ID_BILLING_PREFIXES`
+			from `BILLS_FVAT`
+				left join `BILLING_NUMBERS` on(`BILLING_NUMBERS`.`ID`=`BILLS_FVAT`.`ID_BILLING_NUMBERS`)
+				left join `BILLS_FVAT_POS` on(`BILLS_FVAT_POS`.`ID_BILLS_FVAT`=`BILLS_FVAT`.`ID`)
+			where {$sql_where}
+			group by BILLS_FVAT.ID
+			order by BILLS_FVAT.ID_BILLING_NUMBERS ASC
+		";
+		//echo'<pre>sql1: L.' . __LINE__ . "\n";print_r($sql);echo'</pre>';
+//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
+		$res = $db_webone->query($sql);
+		while ($h = $db_webone->fetch_assoc($res)) {
+			if (0){// ? dla kazdej faktury ?
+			$sql = "select t1.ID_BILLING_NUMBERS AS NR_DOK
+					, t1.ID_BILLING_USERS as PLATNIK
+					, t1.WINIEN,t1.MA
+					, t1.ID_FIN_WINIEN as ID_F_W
+					, t1.ID_FIN_WINIEN_VAL as F_WINIEN_V
+					, t1.ID_FIN_MA as ID_F_M
+					, t1.ID_FIN_MA_VAL as F_MA_V
+					, max(t2.ID)
+					, sum(t2.ID_FIN_WINIEN_VAL) as ROZ_WINIEN
+					, max(t3.ID)
+					, sum(t3.ID_FIN_MA_VAL) as ROZ_MA
+					, t1.WINIEN - sum(t2.ID_FIN_WINIEN_VAL) - sum(t3.ID_FIN_MA_VAL) as POZ_WINIEN
+					, t1.MA - sum(t3.ID_FIN_MA_VAL) - sum(t2.ID_FIN_WINIEN_VAL) as POZ_MA
+				from `BILLING_ACCOUNTS_FILES` as t1
+					left join `BILLING_ACCOUNTS_FILES` as t2 on (t1.ID_BILLING_NUMBERS=t2.ID_FIN_WINIEN)
+					left join `BILLING_ACCOUNTS_FILES` as t3 on (t1.ID_BILLING_NUMBERS=t3.ID_FIN_MA)
+				where
+					t1.ID_FIN_WINIEN is NULL and t1.ID_FIN_MA is NULL and t1.MA = 0 and  t1.WINIEN > 0
+					and t1.ID_BILLING_NUMBERS={$user->ID}
+				group by t1.ID_BILLING_NUMBERS
+				limit 0,1
+			";
+			}
+			//$h['type'] = 'FVAT';
+			//$h['nr'] = $h['ID_BILLING_NUMBERS'];
+			//$h['WINIEN'] = $h['WARTOSC'];
+			//$h['MA'] = 0;
+			$billing_docs->add_bill_doc($h['PAYMENT_TERM'], 'FVAT', $h);
+		}
+
+		$faktury_cols = array();
+		//$faktury_cols['ID_BILLING_USERS'] = "id klienta";// 
+		$faktury_cols['ID_BILLING_NUMBERS'] = "numer";// numer faktury
+		$faktury_cols['BILL_DATE'] = "";// data('Y-m-d')
+		$faktury_cols['SELL_DATE'] = "";// data('Y-m-d')
+		$faktury_cols['PAYMENT_TERM'] = "";// data('Y-m-d')
+
+		//$billing_types = self::get_billing_types(array(3, 4, 5, 7, 8));
+		$billing_types = self::get_billing_types();
+		//echo'<pre>$billing_types:';print_r($billing_types);echo'</pre>';
+
+		foreach ($billing_types as $bill_type) {
+			if ($bill_type['CLASS'] == 'FINANCE') {
+				$sql_where = ($date_limit)? " and {$bill_type['TABLE']}.BILL_DATE <= '{$date_limit}' " : "";
+				$sql = "select {$bill_type['TABLE']}.ID
+						, {$bill_type['TABLE']}.ID_BILLING_NUMBERS
+						, {$bill_type['TABLE']}.BILL_DATE
+						, round({$bill_type['TABLE']}.WINIEN, 2) as WINIEN
+						, round({$bill_type['TABLE']}.MA, 2) as MA
+						, {$bill_type['TABLE']}.ID_FK_DEKRET
+						, {$bill_type['TABLE']}.OPEN
+						, {$bill_type['TABLE']}.FK_ZAKSIEG
+						, {$bill_type['TABLE']}.do_dokumentu
+						, {$bill_type['BILLING_NUMBERS_TABLE']}.NUMBER
+						, {$bill_type['BILLING_NUMBERS_TABLE']}.ID_BILLING_PREFIXES
+						, {$bill_type['BILLING_NUMBERS_TABLE']}.ID_BILLING_NUMBERS_TYPE
+					from {$bill_type['TABLE']}
+						left join {$bill_type['BILLING_NUMBERS_TABLE']} on ({$bill_type['BILLING_NUMBERS_TABLE']}.ID={$bill_type['TABLE']}.ID_BILLING_NUMBERS)
+					where {$bill_type['TABLE']}.ID_BILLING_USERS='{$user->ID}'
+						{$sql_where}
+				";
+				//echo'<pre>sql2: L.' . __LINE__ . "\n";print_r($sql);echo'</pre>';
+				$res = $db_webone->query($sql);
+				while ($h = $db_webone->fetch_assoc($res)) {
+					$billing_docs->add_bill_doc($h['BILL_DATE'], $bill_type['TYPE'], $h);
+				}
+			}
+			else if ($bill_type['CLASS'] == 'SELL_MA') {
+				$sql_where = ($date_limit)? " and t.BILL_DATE <= '{$date_limit}' " : "";
+				$sql = "select t.ID
+						, count(t_pos.ID) as cnt
+						, t_pos.ID_BILLS_FVAT
+						, t.ID_CURRENCY
+						, round(sum((t_pos.N_AMMOUNT * t_pos.N_PRICE) * ( 1 + t_pos.N_VAT / 100)),2) as WINIEN
+						, round(sum( 
+								((t_pos.AMMOUNT * t_pos.PRICE) * ( 1 + t_pos.VAT / 100))
+								- (t_pos.N_AMMOUNT * t_pos.N_PRICE * t_pos.N_VAT / 100)
+								+ (t_pos.N_AMMOUNT * t_pos.N_PRICE * t_pos.VAT / 100)
+							),2) as MA
+						, t.ID_BILLING_NUMBERS
+						, t.OPEN
+						, t.FK_ZAKSIEG
+						, t.IF_KORV , t.BILL_DATE
+						, t_num.`NUMBER`
+						, t_num.`ID_BILLING_PREFIXES`
+						, fv_num.`NUMBER` as FV_NUMBER
+					from `{$bill_type['TABLE']}` t
+						left join `{$bill_type['BILLING_NUMBERS_TABLE']}` t_num on (t_num.`ID`=t.`ID_BILLING_NUMBERS`)
+						left join `{$bill_type['BILLING_NUMBERS_TABLE']}` fv_num on (fv_num.`ID`=t.`REMOTE_ID_BILLING_NUMBERS`)
+						left join `{$bill_type['TABLE']}_POS` t_pos on (t_pos.`ID_BILLS_FVAT`=t.`ID`)
+					where t.`ID_BILLING_USERS`='{$user->ID}'
+						{$sql_where}
+					group by t.`ID`
+					order by t.`ID`
+				";
+				//echo'<pre>sql3: L.' . __LINE__ . "\n";print_r($sql);echo'</pre>';
+				$res = $db_webone->query($sql);
+				while ($h = $db_webone->fetch_assoc($res)) {
+					$billing_docs->add_bill_doc($h['BILL_DATE'], $bill_type['TYPE'], $h);
+				}
+			}
+		}
+
+		return $billing_docs;
+	}
+
+	/**
+	 * @used in Windykacja_FunkcjeL1::billing_billwiev_przeterminowania
+	 */
+	public static function get_billing_account_files($user_id) {
+		$baf = array();
+		$ECHO_PARAM = '';
+		$ID_BILLING_USERS_PARAM = $user_id;
+
+		$db_webone = DB::getDB('931');
+		if (!$db_webone) {
+			echo'<p style="color:red">'."Blad polaczenia do bazy dancyh webone_billing - Zasob [931]".'</p>';
+			return $baf;
+		}
+
+		$WHERE = "";
+		if ($ID_BILLING_USERS_PARAM) $WHERE .= " and BAF.ID_BILLING_USERS='{$ID_BILLING_USERS_PARAM}' ";
+		//UZGODNIENIE_SALD
+		if (strstr($ECHO_PARAM, 'saldo_rok')) {
+			global $base_path ;
+			include_once($base_path."/modules/billing/bill/modules/billing_financefunc.inc");
+			if ($ID_BILLING_USERS_PARAM) {
+				if ($vdb->sql_numrows($vdb->sql_query("select ID from BILLING_ACCOUNTS_TILL where ID_BILLING_USERS='{$ID_BILLING_USERS_PARAM}' and TILL=YEAR(NOW())-1 ;")) != 1) {
+					UAKTUALNIJ_KONTA($ID_BILLING_USERS_PARAM);
+				}
+			}
+			$WHERE .= " AND YEAR(BN.TIMESTAMP)<YEAR(NOW()) ";
+		}
+		$WHERE_FIRMA = "";
+		if ($_GET['FIRMA']) $WHERE_FIRMA = "and BILLING_USERS.BILLING_OWNER='{$_GET['FIRMA']}'" ;
+		//$billing_account_files = self::
+		$sql = "create temporary table TEMP_BILLING_ACCOUNTS_FILES
+			select BAF.ID
+				, BAF.ID_BILLING_USERS
+				, BAF.WINIEN
+				, BAF.MA
+				, BAF.ID_BILLING_NUMBERS_TYPE
+				, BN.NUMBER
+				, BN.ID_BILLING_PREFIXES
+				, BAF_WINIEN.ID_FIN_WINIEN
+				, BAF_WINIEN.ID_BILLING_NUMBERS_TYPE as ID_BILLING_NUMBERS_TYPE_W
+				, BAF_BN_WINIEN.NUMBER as NUMBER_W
+				, BAF_BN_WINIEN.ID_BILLING_PREFIXES as ID_BILLING_PREFIXES_W
+				, unix_timestamp(BAF_BN_WINIEN.TIMESTAMP) as TIMESTAMP_W
+				, BAF_WINIEN.ID_FIN_WINIEN_VAL
+				, NULL as ID_FIN_MA
+				, NULL as	ID_BILLING_NUMBERS_TYPE_M
+				, NULL as	NUMBER_M
+				, NULL as ID_BILLING_PREFIXES_M
+				, NULL as TIMESTAMP_M
+				, NULL as	ID_FIN_MA_VAL
+				, unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM, BILLS_KORV.PAYMENT_TERM)) as TERMIN_PL
+				, BUA.P_NAME
+				, BUA.P_NAME_SECOND
+				, BUA.P_ADDRESS_CITY
+				, BUA.P_ADDRESS_STREET
+				, BUA.P_ADDRESS_HOUSE
+				, BUA.P_ADDRESS_HOME
+				, BUA.user_mail_contact
+				, BA.WINIEN as BA_WINIEN
+				, BA.MA as BA_MA
+				, unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP
+				, unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP
+			from BILLING_ACCOUNTS_FILES as BAF
+				left join BILLING_USERS on BILLING_USERS.ID=BAF.ID_BILLING_USERS 
+				left join BILLING_USERS_ADD  as BUA on BUA.id_users=BAF.ID_BILLING_USERS
+				left join BILLING_NUMBERS as BN on BN.ID=BAF.ID_BILLING_NUMBERS 
+				left join BILLING_ACCOUNTS as BA on BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS
+				left join BILLS_FVAT on BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
+				left join BILLS_KORV on BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
+				left join BILLING_ACCOUNTS_FILES as BAF_WINIEN on BAF_WINIEN.ID_FIN_WINIEN=BAF.ID_BILLING_NUMBERS 
+				left join BILLING_NUMBERS as BAF_BN_WINIEN on BAF_BN_WINIEN.ID=BAF_WINIEN.ID_BILLING_NUMBERS
+			where BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL and BAF.ID_FIN_WINIEN is NULL
+				{$WHERE}
+				{$WHERE_FIRMA}
+		";
+
+		$sql2 = "insert into TEMP_BILLING_ACCOUNTS_FILES
+			select BAF.ID
+				, BAF.ID_BILLING_USERS
+				, BAF.WINIEN
+				, BAF.MA
+				, BAF.ID_BILLING_NUMBERS_TYPE
+				, BN.NUMBER
+				, BN.ID_BILLING_PREFIXES
+				, NULL as ID_FIN_WINIEN
+				, NULL as ID_BILLING_NUMBERS_TYPE_W
+				, NULL as NUMBER_W
+				, NULL as ID_BILLING_PREFIXES_W
+				, NULL as TIMESTAMP_W
+				, NULL as ID_FIN_WINIEN_VAL
+				, BAF_MA.ID_FIN_MA
+				, BAF_MA.ID_BILLING_NUMBERS_TYPE as ID_BILLING_NUMBERS_TYPE_M
+				, BAF_BN_MA.NUMBER as NUMBER_M
+				, BAF_BN_MA.ID_BILLING_PREFIXES as ID_BILLING_PREFIXES_M
+				, unix_timestamp(BAF_BN_MA.TIMESTAMP) as TIMESTAMP_M
+				, BAF_MA.ID_FIN_MA_VAL
+				, unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM, BILLS_KORV.PAYMENT_TERM))
+				, BUA.P_NAME
+				, BUA.P_NAME_SECOND
+				, BUA.P_ADDRESS_CITY
+				, BUA.P_ADDRESS_STREET
+				, BUA.P_ADDRESS_HOUSE
+				, BUA.P_ADDRESS_HOME
+				, BUA.user_mail_contact
+				, BA.WINIEN as BA_WINIEN
+				, BA.MA as BA_MA
+				, unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP
+				, unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP
+			from BILLING_ACCOUNTS_FILES as BAF
+				left join BILLING_USERS on (BILLING_USERS.ID=BAF.ID_BILLING_USERS)
+				left join BILLING_USERS_ADD as BUA on (BUA.id_users=BAF.ID_BILLING_USERS)
+				left join BILLING_NUMBERS as BN on (BN.ID=BAF.ID_BILLING_NUMBERS)
+				left join BILLING_ACCOUNTS as BA on (BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS)
+				left join BILLS_FVAT on (BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS)
+				left join BILLS_KORV on (BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS)
+				left join BILLING_ACCOUNTS_FILES as BAF_MA on (BAF_MA.ID_FIN_MA=BAF.ID_BILLING_NUMBERS)
+				left join BILLING_NUMBERS as BAF_BN_MA on (BAF_BN_MA.ID=BAF_MA.ID_BILLING_NUMBERS)
+			where
+				BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL
+				{$WHERE}
+				{$WHERE_FIRMA}
+		";
+		if (strstr($ECHO_PARAM,'saldo_rok')) {
+			$sql = "create temporary table TEMP_BILLING_ACCOUNTS_FILES
+				select
+					BAF.ID, BAF.ID_BILLING_USERS , BAF.WINIEN, BAF.MA, BAF.ID_BILLING_NUMBERS_TYPE, BN.NUMBER , BN.ID_BILLING_PREFIXES,
+					BAF_WINIEN.ID_FIN_WINIEN,
+					BAF_WINIEN.ID_BILLING_NUMBERS_TYPE as  ID_BILLING_NUMBERS_TYPE_W,
+					BAF_BN_WINIEN.NUMBER as  NUMBER_W,
+					BAF_BN_WINIEN.ID_BILLING_PREFIXES as  ID_BILLING_PREFIXES_W,
+					unix_timestamp(BAF_BN_WINIEN.TIMESTAMP) as  TIMESTAMP_W,
+					BAF_WINIEN.ID_FIN_WINIEN_VAL,
+					NULL as  ID_FIN_MA, 
+					NULL as	 ID_BILLING_NUMBERS_TYPE_M,
+					NULL as	 NUMBER_M,
+					NULL as  ID_BILLING_PREFIXES_M,
+					NULL as  TIMESTAMP_M,
+					NULL as	 ID_FIN_MA_VAL,
+					unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM,ifnull( BILLS_KORV.PAYMENT_TERM,BN.TIMESTAMP ))) as TERMIN_PL ,
+					BUA.P_NAME , BUA.P_NAME_SECOND  , BUA.P_ADDRESS_CITY , BUA.P_ADDRESS_STREET ,BUA.P_ADDRESS_HOUSE  , BUA.P_ADDRESS_HOME , BUA.user_mail_contact ,
+					BA.WINIEN as BA_WINIEN , BA.MA as BA_MA , unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP,
+					unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP, 
+					BILLING_ACCOUNTS_TILL.TILL as BAT_TILL , BILLING_ACCOUNTS_TILL.WINIEN as BAT_WINIEN, BILLING_ACCOUNTS_TILL.MA as BAT_MA 
+				from BILLING_ACCOUNTS_FILES as BAF
+					left join BILLING_USERS_ADD  as BUA on BUA.id_users=BAF.ID_BILLING_USERS
+					left join BILLING_NUMBERS as BN on BN.ID=BAF.ID_BILLING_NUMBERS 
+					left join BILLING_ACCOUNTS as BA on BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS
+					left join BILLS_FVAT on BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
+					left join BILLS_KORV on BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
+					left join BILLING_ACCOUNTS_FILES as BAF_TRG on ( BAF.ID_FIN_WINIEN=BAF_TRG.ID_BILLING_NUMBERS or BAF.ID_FIN_MA=BAF_TRG.ID_BILLING_NUMBERS )
+					left join BILLING_NUMBERS as BAF_TRG_BN on ( BAF_TRG.ID_BILLING_NUMBERS=BAF_TRG_BN.ID )
+					left join BILLING_ACCOUNTS_FILES as BAF_WINIEN on ( BAF_WINIEN.ID_FIN_WINIEN=BAF.ID_BILLING_NUMBERS or BAF_WINIEN.ID_FIN_MA=BAF.ID_BILLING_NUMBERS )
+					left join BILLING_NUMBERS as BAF_BN_WINIEN on ( BAF_BN_WINIEN.ID=BAF_WINIEN.ID_BILLING_NUMBERS )
+					left join BILLING_ACCOUNTS_TILL on (BILLING_ACCOUNTS_TILL.ID_BILLING_USERS=BAF.ID_BILLING_USERS and BILLING_ACCOUNTS_TILL.TILL=year(now())-1  ) 
+				where 
+					( 	BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL or year(BAF_TRG_BN.TIMESTAMP)>year(NOW())-1   )
+					and (YEAR(BAF_BN_WINIEN.TIMESTAMP)<YEAR(NOW()) or BAF_BN_WINIEN.TIMESTAMP is NULL ) 	 
+					{$WHERE}
+				limit 2000 ;
+			";
+
+			$sql2 = " insert into TEMP_BILLING_ACCOUNTS_FILES select
+					BAF.ID, BAF.ID_BILLING_USERS , BAF.WINIEN, BAF.MA, BAF.ID_BILLING_NUMBERS_TYPE, BN.NUMBER , BN.ID_BILLING_PREFIXES,
+					NULL as ID_FIN_WINIEN,
+					NULL as ID_BILLING_NUMBERS_TYPE_W,
+					NULL as NUMBER_W ,
+					NULL as ID_BILLING_PREFIXES_W,
+					NULL as TIMESTAMP_W ,
+					NULL as ID_FIN_WINIEN_VAL ,
+					BAF_MA.ID_FIN_MA,
+					BAF_MA.ID_BILLING_NUMBERS_TYPE as ID_BILLING_NUMBERS_TYPE_M,
+					BAF_BN_MA.NUMBER as NUMBER_M,
+					BAF_BN_MA.ID_BILLING_PREFIXES as ID_BILLING_PREFIXES_M,
+					unix_timestamp(BAF_BN_MA.TIMESTAMP) as TIMESTAMP_M,
+					BAF_MA.ID_FIN_MA_VAL,
+					unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM,ifnull( BILLS_KORV.PAYMENT_TERM,BN.TIMESTAMP ))) as TERMIN_PL ,
+
+					BUA.P_NAME , BUA.P_NAME_SECOND  , BUA.P_ADDRESS_CITY , BUA.P_ADDRESS_STREET ,BUA.P_ADDRESS_HOUSE  , BUA.P_ADDRESS_HOME , BUA.user_mail_contact ,
+					BA.WINIEN as BA_WINIEN , BA.MA as BA_MA , unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP,
+					unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP,
+					BILLING_ACCOUNTS_TILL.TILL as BAT_TILL , BILLING_ACCOUNTS_TILL.WINIEN as BAT_WINIEN, BILLING_ACCOUNTS_TILL.MA as BAT_MA 
+				from BILLING_ACCOUNTS_FILES as BAF
+					left join BILLING_USERS_ADD  as BUA on BUA.id_users=BAF.ID_BILLING_USERS
+					left join BILLING_NUMBERS as BN on BN.ID=BAF.ID_BILLING_NUMBERS
+					left join BILLING_ACCOUNTS as BA on BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS
+					left join BILLS_FVAT on BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS
+					left join BILLS_KORV on BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
+					left join BILLING_ACCOUNTS_FILES as BAF_TRG on ( BAF.ID_FIN_WINIEN=BAF_TRG.ID_BILLING_NUMBERS or BAF.ID_FIN_MA=BAF_TRG.ID_BILLING_NUMBERS )
+					left join BILLING_NUMBERS as BAF_TRG_BN on ( BAF_TRG.ID_BILLING_NUMBERS=BAF_TRG_BN.ID )
+					left join BILLING_ACCOUNTS_FILES as BAF_MA on ( BAF_MA.ID_FIN_WINIEN=BAF.ID_BILLING_NUMBERS or BAF_MA.ID_FIN_MA=BAF.ID_BILLING_NUMBERS )
+					left join BILLING_NUMBERS as BAF_BN_MA on ( BAF_BN_MA.ID=BAF_MA.ID_BILLING_NUMBERS )
+					left join BILLING_ACCOUNTS_TILL on (BILLING_ACCOUNTS_TILL.ID_BILLING_USERS=BAF.ID_BILLING_USERS and BILLING_ACCOUNTS_TILL.TILL=year(now())-1  ) 
+				where
+					( 	BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL or year(BAF_TRG_BN.TIMESTAMP)>year(NOW())-1   )
+					and BAF.ID_BILLING_USERS='1047'  AND YEAR(BN.TIMESTAMP)<YEAR(NOW())  
+					and  (YEAR(BAF_BN_MA.TIMESTAMP)<YEAR(NOW())  or BAF_BN_MA.TIMESTAMP is NULL ) 	 
+					{$WHERE}
+				limit 1000,1000 ;
+			";
+		}//EOF if saldo_rok param
+
+		$sql_alter = "alter table TEMP_BILLING_ACCOUNTS_FILES
+			modify ID_FIN_MA int(11)
+			, modify ID_BILLING_NUMBERS_TYPE_M int(2)
+			, modify NUMBER_M int(10)
+			, modify ID_BILLING_PREFIXES_M int(2) default NULL NULL
+			, modify TIMESTAMP_M int(10)
+			, modify ID_FIN_MA_VAL decimal(10,2)
+			, modify ID_BILLING_PREFIXES int(2) default NULL NULL
+			, modify ID_BILLING_PREFIXES_W int(2)  default NULL NULL
+		";
+
+		$db_webone->query("drop TEMPORARY table TEMP_BILLING_ACCOUNTS_FILES");
+		$result_create = $db_webone->query($sql);
+		$result_alter = $db_webone->query($sql_alter);
+		$result_create2 = $db_webone->query($sql2);
+echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">db_webone: ';print_r($db_webone);echo'</pre>';
+
+		$sql = "select * from TEMP_BILLING_ACCOUNTS_FILES  order by ID_BILLING_USERS,ID ";
+		$sql_count = "select count(1) as cnt from TEMP_BILLING_ACCOUNTS_FILES ";
+		$count = 0;
+		$res = $db_webone->query($sql_count);
+		if ($r_count = $db_webone->fetch($res)) {
+			$count = $r_count->cnt;
+		}
+echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">count: ';print_r($count);echo'</pre>';
+		if ($count > 0 && $ID_BILLING_USERS_PARAM > 0) {
+			$result = $db_webone->query($sql);
+		} else {
+			$sql_none = "insert into TEMP_BILLING_ACCOUNTS_FILES (ID,ID_BILLING_USERS,BAT_TILL,BAT_WINIEN,BAT_MA)
+				select '0',ID_BILLING_USERS,TILL ,WINIEN ,MA from BILLING_ACCOUNTS_TILL where ID_BILLING_USERS='{$ID_BILLING_USERS_PARAM}' and TILL=YEAR(NOW())-1
+			";
+			$db_webone->query($sql_none);
+			$result = $db_webone->query($sql);
+		}
+		while ($h_baf = $db_webone->fetch_row($result)) {
+			$baf[] = $h_baf;
+		}
+		return $baf;
+	}
+
+	public static function update_doc_number(&$fvat_arr) {
+		$fetch_ids = array();
+		foreach ($fvat_arr as $k => $fvat) {
+			$fetch_ids[] = $fvat['ID_BILLING_NUMBERS'];
+		}
+		if (!empty($fetch_ids)) {
+			$db_webone = DB::getDB('931');
+			if (!$db_webone) {
+				return -1;
+			}
+
+			$sql = "select `ID`, `NUMBER`, `ID_BILLING_PREFIXES`
+				from `BILLING_NUMBERS`
+				where
+					`ID` in(".implode(",", $fetch_ids).")
+			";
+			$res = $db_webone->query($sql);
+			$bnum = array();
+			while ($h = $db_webone->fetch_assoc($res)) {
+				$bnum[$h['ID']] = $h;
+			}
+			foreach ($bnum as $k_id => $bn) {
+				foreach ($fvat_arr as $k_fvat => $fvat) {
+					if ($bn['ID'] == $fvat['ID_BILLING_NUMBERS']) {
+						$fvat_arr[$k_fvat]['NUMBER'] = $bn['NUMBER'];
+						$fvat_arr[$k_fvat]['ID_BILLING_PREFIXES'] = $bn['ID_BILLING_PREFIXES'];
+					}
+				}				
+			}
+		}
+	}
+
+	/**
+	 * @param $user - Windykacja status user
+	 * @param $taks - wezwanie1, wezwanie2
+	 * @param $id_proj - ID Projektu
+	 * @returns int - ID created record
+	 */
+	public static function create_koresp($user, $task, $id_proj, $params = array()) {
+		$sql_data = array();
+		$sql_zawartosc = '';
+		if ($task == 'wezwanie1') {
+			$sql_zawartosc = 'wezwanie do zaplaty';
+			$sql_data['K_TYP_KORESP'] = 'OUT';
+			$sql_data['K_TYP_RODZAJ'] = 'POLECONY';
+			$sql_data['K_LOKALIZACJA'] = 'PROJEKT';
+			$sql_data['K_LOKALIZACJA_NEW'] = 'PROJEKT';
+		} else if ($task == 'wezwanie2') {
+			$sql_zawartosc = 'wezwanie do zaplaty - ostateczne';
+			$sql_data['K_TYP_KORESP'] = 'OUT';
+			$sql_data['K_TYP_RODZAJ'] = 'POLECONY';
+			$sql_data['K_LOKALIZACJA'] = 'PROJEKT';
+			$sql_data['K_LOKALIZACJA_NEW'] = 'PROJEKT';
+		} else if ($task == 'rozwiazanie umowy') {
+			$sql_zawartosc = 'rozwiazanie umowy ID ' . $params['nr_umowy'] . ' - ' . $params['powod_desc'];
+			$sql_data['K_TYP_KORESP'] = 'IN';
+		}
+		if (!$sql_zawartosc) {
+			return false;
+		}
+
+/**
+ * przykładowe wezwania:
+ *   SELECT * FROM `IN7_DZIENNIK_KORESP` WHERE `K_ZAWARTOS` LIKE '%wezwanie%' ORDER BY `IN7_DZIENNIK_KORESP`.`ID` DESC;
+ * przykład:
+ *   SELECT * FROM `IN7_DZIENNIK_KORESP` WHERE `ID`=25951;
+ */
+
+		$db = DB::getDB();
+		$sql_obj = new stdClass();
+		$sql_obj->A_STATUS = 'WAITING';
+		foreach ($sql_data as $k_field => $v_value) {
+			$sql_obj->$k_field = $v_value;
+		}
+		$sql_obj->ID_BILLING_USERS = $user->ID;
+		$sql_obj->K_DATA_OTRZYM_KORESP = '';// data ?
+		$sql_obj->K_DATA_OTRZYMANEJ_KORESP = '';// data ?
+		$sql_obj->K_OD_KOGO = "{$user->P_NAME} {$user->P_NAME_SECOND}";
+		$sql_obj->OD_KOGO_ADRES = "ul. {$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}/{$user->P_ADDRESS_HOME}, {$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}";
+		$sql_obj->K_ZAWARTOS = $sql_zawartosc;
+		$sql_obj->K_ZNAK_REFERENTA = User::getFullName() . ' (' . User::getInicjaly() . ')';
+		$sql_obj->ID_PROJECT = $id_proj;
+		$ret_id = $db->ADD_NEW_OBJ('IN7_DZIENNIK_KORESP', $sql_obj);
+		return $ret_id;
+	}
+
+	/**
+	 * @param int $user_id - IS klienta
+	 * @param int $id_deals_old - ID umowy do wyłączenia
+	 * @param date 'Y-m-d' $termin_odlaczenia - Termin odłączenia
+	 * @returns int - ID created record
+	 */
+	public static function create_deals_rozwiazanie($user_id, $id_deals_old, $termin_odlaczenia, $powod_desc = '') {
+		$db = DB::getDB();
+		$old_deal = $db->get_by_id('DEALS_TABLE', $id_deals_old);
+		if (!$old_deal) {
+			return false;
+		}
+
+		$sql_obj = new stdClass();
+		$sql_obj->DEALDESC = "Rezygnacja z dniem {$termin_odlaczenia}";
+		$sql_obj->A_STATUS = 'WAITING';
+		$sql_obj->ID_BILLING_USERS = $user_id;
+		$sql_obj->P_DEALNUMBER_OLD = $old_deal->ID;
+		$sql_obj->S_ADDRESS_STREET = $old_deal->S_ADDRESS_STREET;
+		$sql_obj->P_DEALDATE = $old_deal->P_DEALDATE;
+		$sql_obj->P_DEALDATE_TERM = $old_deal->P_DEALDATE_TERM;
+		$sql_obj->L2_HANGUP_FROM = $termin_odlaczenia;
+		$sql_obj->RODZAJ_DZIALANIA_HANDLOWEGO = $powod_desc;
+		// TODO: $sql_obj->ID_OFFERS_OFF = get_active_services_id($old_deal->ID);
+/*
+		if(
+			SV.HANGUP_STATUS=SV.A_STATUS
+			, coalesce(SV.A_STATUS)
+			, if(
+				( unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
+					and  ( SV.HANGUP_TILL='0000-00-00' or SV.HANGUP_TILL is NULL )
+					and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
+				)
+				, coalesce(SV.HANGUP_STATUS)
+				, if(
+					( unix_timestamp(NOW()) < unix_timestamp(SV.HANGUP_FROM) 
+						and (SV.HANGUP_TILL='0000-00-00' or SV.HANGUP_TILL is NULL )
+						and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
+					)
+					, coalesce(SV.A_STATUS)
+					, if(
+						( unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
+							and unix_timestamp(NOW()) < unix_timestamp(SV.HANGUP_TILL)
+							and ( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
+							and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
+						)
+					, coalesce(SV.HANGUP_STATUS)
+					, if(
+							( unix_timestamp(NOW()) < unix_timestamp(SV.HANGUP_FROM) and  unix_timestamp(NOW())< unix_timestamp(SV.HANGUP_TILL) 
+			and  ( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
+			and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null ))
+							, coalesce(SV.A_STATUS)
+							, if(
+									(	( SV.HANGUP_TILL='0000-00-00' or SV.HANGUP_TILL is NULL )
+			and ( SV.HANGUP_FROM='0000-00-00' or SV.HANGUP_FROM is null ))
+									, coalesce(SV.A_STATUS)
+									, if( unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
+											and  unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_TILL)
+											and (
+												( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
+												and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
+											)
+										, coalesce(SV.A_STATUS)
+										, if(
+											unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
+											and unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_TILL)
+											and SV.HANGUP_FROM<SV.HANGUP_TILL
+											and (
+			( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
+			and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )) , 'ERROR1', 
+			'ERROR2'
+			)
+			)      
+			)    
+			)
+			)
+			)    
+			)
+		)
+ */
+/*
+		$id_offers_off = array();
+		$sql = "select
+				s.``
+				, s.`ID_OFFERS`
+			from `SERVICES` as s
+			where
+				s.`ID_DEALS_TABLE`='{$old_deal->ID}'
+				and s.`ID_BILLING_USERS`='{$user_id}'
+		";
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			$id_offers_off[] = $r;
+		}
+ */
+		$ret_id = $db->ADD_NEW_OBJ('DEALS_TABLE', $sql_obj);
+		return $ret_id;
+	}
+
+}

+ 3059 - 0
SE/se-lib/Windykacja/View.php

@@ -0,0 +1,3059 @@
+<?php
+
+Lib::loadClass('CompanyHelper');
+Lib::loadClass('PokazOfertyView');
+Lib::loadClass('ProcesHelper');
+Lib::loadClass('Windykacja_StatsHelper');
+Lib::loadClass('Windykacja_StatsModel');
+Lib::loadClass('Windykacja_FunkcjeL1');
+
+class Windykacja_View {
+
+	public static function user(&$user) {
+
+		$bad_address_task = V::get('bad_address', '', $_POST);
+		$bad_address_msg = array();
+		if ($bad_address_task) {
+			$id_koresp = V::get('ID_KORESP', 0, $_POST, 'int');
+			if ($id_koresp <= 0) {
+				$bad_address_msg['error_id_koresp'] = true;
+			} else {
+				if ($bad_address_task == 'save') {
+					if (!Windykacja_StatsHelper::bad_address_save($user, $id_koresp)) {
+						$bad_address_msg['error'] = true;
+					} else {
+						$bad_address_msg['ok'] = true;
+					}
+				}
+				else if ($bad_address_task == 'confirm') {
+					if (!Windykacja_StatsHelper::bad_address_confirm($user, $id_koresp)) {
+						$bad_address_msg['error'] = true;
+					} else {
+						$bad_address_msg['ok'] = true;
+					}
+				}
+			}
+		}
+
+		$change_status_task = V::get('change_status', '', $_POST);
+		$change_status_msg = array();
+		if ($change_status_task) {
+			if ($change_status_task == 'change') {
+				$new_status = V::get('new_status', '', $_POST);
+				$fltr_arr = Windykacja_StatsHelper::get_filters();
+				if (!array_key_exists($new_status, $fltr_arr)) {
+					$change_status_msg['error'] = true;
+				} else {
+					if (!Windykacja_StatsHelper::change_status_save($user, $new_status)) {
+						$change_status_msg['error'] = true;
+					} else {
+						$change_status_msg['ok'] = true;
+					}
+				}
+			}
+		}
+
+		$set_nr_sprawy_krd_task = V::get('set_nr_sprawy_krd', '', $_POST);
+		$set_nr_sprawy_krd_msg = array();
+		if ($set_nr_sprawy_krd_task) {
+			if ($set_nr_sprawy_krd_task == 'change') {
+				$nr_sprawy_krd = V::get('nr_sprawy_krd', '', $_POST);
+				if (!Windykacja_StatsHelper::nr_sprawy_krd_save($user, $nr_sprawy_krd)) {
+					$set_nr_sprawy_krd_msg['error'] = true;
+				} else {
+					$set_nr_sprawy_krd_msg['ok'] = true;
+				}
+			}
+		}
+
+		$set_nr_sprawy_sad_task = V::get('set_nr_sprawy_sad', '', $_POST);
+		$set_nr_sprawy_sad_msg = array();
+		if ($set_nr_sprawy_sad_task) {
+			if ($set_nr_sprawy_sad_task == 'change') {
+				$nr_sprawy_sad = V::get('nr_sprawy_sad', '', $_POST);
+				if (!Windykacja_StatsHelper::nr_sprawy_sad_save($user, $nr_sprawy_sad)) {
+					$set_nr_sprawy_sad_msg['error'] = true;
+				} else {
+					$set_nr_sprawy_sad_msg['ok'] = true;
+				}
+			}
+		}
+
+		$set_nr_sprawy_komornik_task = V::get('set_nr_sprawy_komornik', '', $_POST);
+		$set_nr_sprawy_komornik_msg = array();
+		if ($set_nr_sprawy_komornik_task) {
+			if ($set_nr_sprawy_komornik_task == 'change') {
+				$nr_sprawy_komornik = V::get('nr_sprawy_komornik', '', $_POST);
+				if (!Windykacja_StatsHelper::nr_sprawy_komornik_save($user, $nr_sprawy_komornik)) {
+					$set_nr_sprawy_komornik_msg['error'] = true;
+				} else {
+					$set_nr_sprawy_komornik_msg['ok'] = true;
+				}
+			}
+		}
+
+		$set_ustalenia_info_task = V::get('set_ustalenia_info', '', $_POST);
+		$set_ustalenia_info_msg = array();
+		if ($set_ustalenia_info_task) {
+			if ($set_ustalenia_info_task == 'change') {
+				$ustalenia_date = V::get('ustalenia_date', '', $_POST);
+				$ustalenia_info = V::get('ustalenia_info', '', $_POST);
+				if (!Windykacja_StatsHelper::ustalenia_info_save($user, $ustalenia_date, $ustalenia_info)) {
+					$set_ustalenia_info_msg['error'] = true;
+				} else {
+					$set_ustalenia_info_msg['ok'] = true;
+				}
+			}
+		}
+
+		$dataBlokady = '';
+		if ($user->STATUS == 9) {
+			$db = DB::getDB();
+			$sqlDataBlokadyTest = "
+				select c.`ID`, c.`STATUS`, h.`STATUS` as h_status, h.`A_RECORD_UPDATE_DATE`, h.`A_RECORD_CREATE_DATE`
+					from `COMPANIES` c
+						join `COMPANIES_HIST` h on(h.`ID_USERS2`=c.`ID`)
+					where (h.`STATUS`='9' or c.`STATUS`='9')
+			";
+			$sqlDataBlokadyTestHasNoDate = "
+				select c.`ID`, c.`STATUS`
+					from `COMPANIES` c
+					where c.`STATUS`='9'
+						and not exists(select h.`ID`
+							from `COMPANIES_HIST` h
+							where h.`ID_USERS2`=c.`ID`
+								and h.`STATUS`='9'
+					)
+			";
+			$sqlDataBlokady = "select h.`A_RECORD_UPDATE_DATE`
+				from `COMPANIES_HIST` h
+				where h.`ID_USERS2`='{$user->ID_BILLING_USERS}'
+					and h.`STATUS`='9'
+				order by h.`ID` desc
+				limit 1
+			";
+			$res = $db->query($sqlDataBlokady);
+			if ($r = $db->fetch($res)) {
+				$dataBlokady = $r->A_RECORD_UPDATE_DATE;
+			}
+		}
+
+		$company = Windykacja_StatsModel::get_company($user);
+		$nr_konta = Windykacja_FunkcjeL1::bankowy_formatuj_nrach(Windykacja_FunkcjeL1::bankowy_make_nrach($company->NR_RACH_MASS_PAY, $user->ID_BILLING_USERS, 0));
+
+		echo'<h3>';
+			echo' <a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&_p=".V::get('_p', '', $_REQUEST)."&_f=".V::get('_f', '', $_REQUEST)."&_oby=".V::get('_oby', '', $_REQUEST)."&_odir=".V::get('_odir', '', $_REQUEST).'">'."Klienci".'</a>';
+			echo ' &raquo; <code style="font-size:normal;color:green;">'."[".$user->id_users."]".'</code>';
+			echo ' <b>'.$user->P_NAME.' '.$user->P_NAME_SECOND.'</b>';
+		echo'</h3>';
+
+		echo '<table class="" cellspacing="0" cellpadding="0" border="0"><tr><td style="vertical-align:top">';
+		echo '<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
+		echo '<caption>';
+			echo "Dane " . (($user->is_firma)? "firmy" : "klienta") . " ";
+			if ($user->BAD_ADDRESS) {
+				echo '<form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."bad_address".'" value="'."confirm".'" />';
+					$js = "if(this.nextSibling.style.display=='none'){this.nextSibling.style.display='block'}else{this.nextSibling.style.display='none'}; return false;";
+					echo '<input type="button" value="'."popraw adres".'" onclick="'.$js.'" style="margin:1px 2px;padding:0 6px;" />';
+					echo '<div style="display:none;">';
+						echo '<label for="ID_KORESP">'."ID Koresp.".'</label>';
+						echo '<input type="text" name="' . "ID_KORESP" . '" size="5" value="' . "" . '" />';
+						echo '<input type="submit" value="'."zapisz".'" />';
+					echo '</div>';
+				echo '</form>';
+			} else {
+				echo '<form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."bad_address".'" value="'."save".'" />';
+					$js = "if(this.nextSibling.style.display=='none'){this.nextSibling.style.display='block'}else{this.nextSibling.style.display='none'}; return false;";
+					echo '<input type="button" value="'."zgłoś błędny adres".'" onclick="'.$js.'" style="margin:1px 2px;padding:0 6px;" />';
+					echo '<div style="display:none;">';
+						echo '<label for="ID_KORESP">'."ID Koresp.".'</label>';
+						echo '<input type="text" name="' . "ID_KORESP" . '" size="5" value="' . "" . '" />';
+						echo '<input type="submit" value="'."zapisz".'" />';
+					echo '</div>';
+				echo '</form>';
+			}
+			if (!empty($bad_address_msg)) {
+				if ('id_koresp' == V::get('error', '', $bad_address_msg)) {
+					echo '<div class="red">'."Podaj poprawny ID Koresp.".'</div>';
+				} else if (true == V::get('error', false, $bad_address_msg)) {
+					echo '<div class="red">'."Error!".'</div>';
+				} else if (true == V::get('ok', false, $bad_address_msg)) {
+					echo '<div style="color:green">'."Zapisano pomyślnie.".'</div>';
+				}
+			}
+		echo '</caption>';
+		echo'<tr>';
+			echo'<th>' . "Adres:" . '</th>';
+			echo'<td'.(($user->BAD_ADDRESS)? ' style="background-color:#FF7878;"' : '').'>';
+				echo "ul. ".$user->P_ADDRESS_STREET." ".$user->P_ADDRESS_HOUSE."/".$user->P_ADDRESS_HOME.", ".$user->P_ADDRESS_POST_CODE." ".$user->P_ADDRESS_CITY;
+			echo'</td>';
+		echo'</tr>';
+		?>
+		<?php if ($user->P_ADRESS_KORESP_1282) : ?>
+			<tr>
+				<th title="Adres do korespondencji">Adres koresp.</th>
+				<td><?php echo $user->P_ADRESS_KORESP_1282; ?></td>
+			</tr>
+		<?php endif; ?>
+		<?php
+		echo'<tr>';
+			echo'<th>' . "Pesel:" . '</th>';
+			echo'<td>';
+				if ($user->P_PESEL) {
+					echo $user->P_PESEL;
+				} else {
+					echo '<span style="color:#f00;">'."Brak numeru PESEL!".'</span>';
+				}
+			echo'</td>';
+		echo'</tr>';
+		echo'<tr>';
+			echo'<th>' . "Nr telefonu:" . '</th>';
+			echo'<td>';
+				if ($user->P_PHONE) {
+					echo $user->P_PHONE;
+				} else {
+					echo '<span style="color:#f00;">'."Brak!".'</span>';
+				}
+			echo'</td>';
+		echo'</tr>';
+		echo'<tr>';
+			echo'<th>' . "Nr dowodu:" . '</th>';
+			echo'<td>';
+				if ($user->P_OTHER_DOC) {
+					echo $user->P_OTHER_DOC;
+				} else {
+					echo '<span style="color:#f00;">'."Brak!".'</span>';
+				}
+			echo'</td>';
+		echo'</tr>';
+		echo'<tr>';
+			echo'<th>' . "e-mail:" . '</th>';
+			echo'<td>';
+				if ($user->user_mail_contact) {
+					echo '<a href="mailto:'.$user->user_mail_contact.'">'.$user->user_mail_contact.'</a>';
+				} else {
+					echo '<span style="color:#f00;">'."Brak!".'</span>';
+				}
+			echo'</td>';
+		echo'</tr>';
+		echo'<tr>';
+			echo'<th>' . "Klient firmy:" . '</th>';
+			echo'<td>';
+				if ($user->BILLING_OWNER == 1) {
+					echo 'BN - BIALL-NET';
+				} else if ($user->BILLING_OWNER == 2) {
+					echo 'ND - NETDAY';
+				} else {
+					echo 'nieznany';
+				}
+			echo'</td>';
+		echo'</tr>';
+		echo'<tr>';
+			echo'<th>' . "Blokada:" . '</th>';
+			echo'<td>';
+				if ($user->STATUS == 9) {
+					echo '<b style="color:red">' . "ZABLOKOWANY" . '</b>';
+					if (!empty($dataBlokady)) {
+						echo '<br>' . "od dnia " . substr($dataBlokady, 0, 10);
+					}
+				} else {
+					echo 'brak blokady';
+				}
+			echo'</td>';
+		echo'</tr>';
+		?>
+		<tr>
+			<th>Nr konta:</th>
+			<td><?php echo $nr_konta; ?></td>
+		</tr>
+		<?php
+		echo '</table>';
+
+		echo '</td><td>' . "&nbsp;" . '</td><td style="vertical-align:top">';
+
+		echo '<table class="tbl-view tbl-umowy-l2'.(($user->A_STATUS_UPDATE_DATE < date("Y-m-d"))? ' wind-status-old' : '').'" cellspacing="0" cellpadding="0" border="1">';
+		echo '<caption>';
+			echo "Status windykacji ";
+			echo '<code style="font-size:x-small; color:#ccc;">' . "(" . $user->WINDYKACJA_ID . ")" . '</code>';
+			if ($user->A_STATUS_UPDATE_DATE < date("Y-m-d")) {
+				echo " " . '<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&_p=".V::get('_p','', $_REQUEST)."&_f=".V::get('_f', '', $_REQUEST)."&_user_id=".$user->ID . '">' . "Aktualizuj status" . '</a>'; // Reload page, data updated below
+			}
+			// TODO: zmien status klienta - przypisanie do odpowiedniej grupy
+		echo '</caption>';
+		echo '<tr>';
+			echo '<th>' . "status:" . '</th>';
+			echo '<td>';
+				echo $user->A_STATUS;
+                if (V::get('DBG', '', $_GET, 'int') > 0) {// TODO: TEST
+                    if ($user->A_STATUS == 'waiting-krd') {
+                        echo '<br />' . "wezwanie2_DATE: {$user->wezwanie2_DATE}";
+                        $wzw2 = new stdClass();
+                        $wzw2->Y = intval(substr($user->wezwanie2_DATE, 0, 4));
+                        $wzw2->m = intval(substr($user->wezwanie2_DATE, 5, 2));
+                        $wzw2->d = intval(substr($user->wezwanie2_DATE, 8, 2));
+                        echo '<br />' . "wzw2: {$wzw2->Y}-{$wzw2->m}-{$wzw2->d}";
+                        $wzw2->plus_60 = date("Y-m-d", mktime(0,0,0, $wzw2->m, $wzw2->d + 60, $wzw2->Y));
+                        echo '<br />' . "wezwanie2_DATE + 60 dni: {$wzw2->plus_60}";
+                        if ($wzw2->plus_60 < date("Y-m-d")) {
+                            echo '<br />' . "TODO: przenieść do krd";
+                        }
+                    }
+                }// TODO: TEST
+				echo ' &nbsp;&nbsp; <form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."change_status".'" value="'."change".'" />';
+					$fltr_arr = Windykacja_StatsHelper::get_filters();
+					$fltr_options = array();
+					foreach ($fltr_arr as $k_status => $v_arr) {
+						$fltr_options[$k_status] = reset($v_arr);
+					}
+					echo '<select name="' . "new_status" . '">';
+					foreach ($fltr_options as $k_ind => $v_label) {
+						$sel = ($k_ind == $user->A_STATUS)? ' selected="selected"' : '';
+						echo '<option value="' . $k_ind . '"' . $sel . '>' . "{$k_ind}: {$v_label}" . '</option>';
+					}
+					echo '</select>';
+					echo '<input type="submit" value="'."zmień".'" />';
+				echo '</form>';
+
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "Nr sprawy w krd" . '</th>';
+			echo '<td>';
+				echo ' <form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."set_nr_sprawy_krd".'" value="'."change".'" />';
+					echo '<input type="text" name="'."nr_sprawy_krd".'" value="'.$user->NR_SPRAWY_KRD.'" />';
+					echo '<input type="submit" value="'."zmień".'" />';
+				echo '</form>';
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "Nr sprawy w sądzie" . '</th>';
+			echo '<td>';
+				echo ' <form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."set_nr_sprawy_sad".'" value="'."change".'" />';
+					echo '<input type="text" name="'."nr_sprawy_sad".'" value="'.$user->NR_SPRAWY_SAD.'" />';
+					echo '<input type="submit" value="'."zmień".'" />';
+				echo '</form>';
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "Nr sprawy u komornika" . '</th>';
+			echo '<td>';
+				echo ' <form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."set_nr_sprawy_komornik".'" value="'."change".'" />';
+					echo '<input type="text" name="'."nr_sprawy_komornik".'" value="'.$user->NR_SPRAWY_KOMORNIK.'" />';
+					echo '<input type="submit" value="'."zmień".'" />';
+				echo '</form>';
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "Aktualne ustalenia z klientem" . '</th>';
+			echo '<td>';
+				echo ' <form action="" method="POST" style="display:inline">';
+					echo '<input type="hidden" name="'."set_ustalenia_info".'" value="'."change".'" />';
+					echo '<textarea style="width:100%" type="text" name="'."ustalenia_info".'">' . $user->L_APPOITMENT_INFO . '</textarea>';
+					echo '<br />' . "Data: ";
+					echo '<input type="text" name="'."ustalenia_date".'" value="'.$user->L_APPOITMENT_DATE.'" />';
+					echo '<input type="submit" value="'."zmień".'" />';
+					$js = "this.form.ustalenia_info.value=''; this.form.ustalenia_date.value='0000-00-00'; return false;";
+					echo '<input type="reset" value="'."wyszyść".'" onclick="'.$js.'" />';
+				echo '</form>';
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "data ostatniej wpłaty:" . '</th>';
+			echo '<td>';
+				if ($user->LAST_PAY_DATE && $user->LAST_PAY_DATE != '0000-00-00') {
+					echo $user->LAST_PAY_DATE;
+				} else {
+					echo '---';
+				}
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "data wymagalności ostatniej faktury:" . '</th>';
+			echo '<td>';
+				if ($user->PAY_DATE != '0000-00-00') {
+					echo $user->PAY_DATE;
+				}
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "data wymagalności pierwszej faktury:" . '</th>';
+			echo '<td>';
+				if ($user->PAY_DATE_FIRST_FVAT != '0000-00-00') {
+					echo $user->PAY_DATE_FIRST_FVAT;
+				}
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "termin płatności:" . '</th>';
+			echo '<td>';
+				if ($user->PAY_TERM != '0000-00-00') {
+					echo $user->PAY_TERM;
+				}
+			echo '</td>';
+		echo '</tr>';
+		echo '<tr>';
+			echo '<th>' . "Przeniesienie do Vectra?:" . '</th>';
+			echo '<td>';
+				if ($user->IS_MOVED_TO_VECTRA) {
+					echo 'TAK';
+				} else {
+					echo '<span class="text-muted">NIE</span>';
+				}
+			echo '</td>';
+		echo '</tr>';
+		echo '</table>';
+
+		echo '</td></tr></table>';
+
+		// TODO: windykacja_status_info - grupa filtrow do ktorej nalezy klient
+		Lib::loadClass('CompanyHelper');
+		$db = DB::getDB();
+		$comHelper = new CompanyHelper($db);
+		$usr = $comHelper->getById($user->ID);
+		$dealsActive = $comHelper->getDealsFull($user->ID, false);
+
+		Lib::loadClass('PokazOfertyView');
+		$pokaz_oferty_view = new PokazOfertyView();
+		echo $pokaz_oferty_view->print_css();
+		$pokaz_oferty_view->printServices($usr, $dealsActive);
+
+		if(V::get('DBG_ACTIVE_SRV', '', $_GET) > 2){
+			$activeServicesByType = array();
+			$db = DB::getDB();
+			$idUser = $user->ID;
+			$sql = "
+				select srv.`ID` as `ID_SERVICES`
+					, srv.`NAME_LIST_SERVICES`
+					, A_STATUS_L2_SQL_L1(srv.`ID`) as A_STATUS_CURRENT
+				from `SERVICES` srv
+				where srv.`ID_BILLING_USERS`='{$idUser}'
+			";
+			DBG::_(true, true, "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
+			$res = $db->query($sql);
+			while ($r = $db->fetch($res)) {
+				$activeServicesByType[] = $r;
+			}
+			DBG::_(true, true, "activeServicesByType", $activeServicesByType, __CLASS__, __FUNCTION__, __LINE__);
+			$sql = "
+				select
+					IF(1 = (
+							select 1 as hasActiveNET
+							from `SERVICES` srv
+							where srv.`ID_BILLING_USERS`='{$idUser}'
+								and srv.`NAME_LIST_SERVICES`='USERS2'
+								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
+							limit 1
+						), 1, 0) as hasActiveNET
+					,
+					IF(1 = (
+							select 1 as hasActiveTV
+							from `SERVICES` srv
+							where srv.`ID_BILLING_USERS`='{$idUser}'
+								and srv.`NAME_LIST_SERVICES`='TV'
+								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
+							limit 1
+						), 1, 0) as hasActiveTV
+			";
+			DBG::_(true, true, "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
+			$activeServicesByType = array();
+			$res = $db->query($sql);
+			while ($r = $db->fetch($res)) {
+				$activeServicesByType = $r;
+			}
+			DBG::_(true, true, "activeServicesByType", $activeServicesByType, __CLASS__, __FUNCTION__, __LINE__);
+		}
+
+		// aktualny status klienta
+		echo'<div>';
+			if ($user->A_STATUS_UPDATE_DATE < date("Y-m-d")) {
+			}
+			else {
+				switch ($user->A_STATUS) {
+					case 'WAITING': {
+						echo'<p>' . "Status OK" . '</p>';
+					}
+					break;
+					case 'wezwanie1': {
+						$default_PAY_TERM = date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
+						$frm_errors = array();
+						$frm_msgs = array();
+						$frm = array();
+						$frm['wezwanie1_DATE'] = date("Y-m-d");
+						$frm['PAY_TERM'] = V::get('PAY_TERM', $default_PAY_TERM, $_POST);
+						$frm['ID_PROJ'] = V::get('ID_PROJ', 0, $_POST, 'int');
+						if ('set_wezwanie' == V::get('user_task', '', $_POST)) {
+							if ($frm['ID_PROJ'] == 0) {
+								$frm_errors[] = "Brak numeru ID Projketu";
+							}
+							if (empty($frm_errors)) {
+								$ret = Windykacja_StatsHelper::update_user($user, $frm);
+								if ($ret) {
+									$frm_msgs[] = "Status klienta został zaktualizowany";
+								} else {
+									$frm_errors[] = "Status klienta nie został zaktualizowany";
+								}
+							}
+						}
+						echo '<div class="box box-blue" style="margin:6px 0;">';
+							if ($user->PAY_FVAT > 0 && $user->PAY_SALDO <= -0.05) {
+								echo "Saldo klienta: " . '<b style="color:#f00">' . "{$user->PAY_SALDO} zł" . '</b>' . " ({$user->PAY_FVAT} niezapłaconych faktur)" . '<br />';
+								echo'<br />';
+							}
+							echo '<b style="color:#0B0B8E">'."Wysłać wezwanie do zapłaty".'</b>'.'<br />';
+							if (!empty($frm_errors)) {
+								echo'<p style="color:#f00">' . implode('<br />', $frm_errors) . '</p>';
+							}
+							if (!empty($frm_msgs)) {
+								echo'<p style="color:green">' . implode('<br />', $frm_msgs) . '</p>';
+							}
+							echo'<form action="" method="post">';
+								echo'<input type="hidden" name="'."user_task".'" value="'."set_wezwanie".'" />';
+								echo "Data płatności: ";
+									echo'<input type="text" name="'."PAY_TERM".'" value="'.$frm['PAY_TERM'].'" />';
+								echo " ID Projektu (np. 335 - klienci BIALL-NET lub 4956 - klienci Vectra): ";
+									echo'<input type="text" name="'."ID_PROJ".'" value="'.$frm['ID_PROJ'].'" />';
+								echo'<input type="submit" value="'."Zapisz".'" />';
+							echo'</form>';
+						if ($user->wezwanie1_DATE != '0000-00-00') {
+							echo'<br />';
+							$ico_print = '<img src="icon/print.gif" height="16" />';
+							echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie"."&user_id=".$user->ID.'" target="_blank">'.$ico_print." wezwanie do zapłaty".'</a>';
+						}
+						echo '</div>';// .box-blue
+					}
+					break;
+					case 'waiting-wezwanie2': {// TODO: only auto update ?
+						echo '<div class="box box-blue" style="margin:6px 0;">';
+							if ($user->PAY_FVAT > 0 && $user->PAY_SALDO <= -0.05) {
+								echo "Saldo klienta: " . '<b style="color:#f00">' . $user->PAY_SALDO . " zł" . '</b>' . " (" . $user->PAY_FVAT ." niezapłaconych faktur)" . '<br />';
+								echo'<br />';
+							}
+							echo '<b style="color:#0B0B8E">'."Oczekiwanie na uzbieranie kwoty 300zł (firmy 500zł)".'</b>'.'<br />';
+							if (!empty($frm_errors)) {
+								echo'<p style="color:#f00">';
+									echo implode('<br />', $frm_errors);
+								echo'</p>';
+							}
+							echo'<form action="" method="post">';
+							//	echo'<input type="hidden" name="'."user_task".'" value="'."set_".'" />';
+							//	echo'<input type="submit" value="'."Zapisz".'" />';
+							echo'</form>';
+							if ($user->wezwanie1_DATE != '0000-00-00') {
+								echo'<br />';
+								$ico_print = '<img src="icon/print.gif" height="16" />';
+								echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " wezwanie do zapłaty".'</a>'.'<em>'." (termin płatności: " . $user->PAY_TERM . ")".'</em>';
+							}
+						echo '</div>';// .box-blue
+					}
+					break;
+					case 'wezwanie2': {
+						$default_PAY_TERM = date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
+						$frm_msgs = array();
+						$frm_errors = array();
+						$frm = array();
+						$frm['wezwanie2_DATE'] = date("Y-m-d");
+						$frm['PAY_TERM'] = V::get('PAY_TERM', $default_PAY_TERM, $_POST);
+						$frm['ID_PROJ'] = V::get('ID_PROJ', 0, $_POST, 'int');
+						if ('set_wezwanie2' == V::get('user_task', '', $_POST)) {
+							if ($frm['ID_PROJ'] == 0) {
+								$frm_errors[] = "Brak numeru ID korespondencji";
+							}
+							if (empty($frm_errors)) {
+								$ret = Windykacja_StatsHelper::update_user($user, $frm);
+								if ($ret) {
+									$frm_msgs[] = "Status klienta został zaktualizowany";
+								} else {
+									$frm_errors[] = "Status klienta nie został zaktualizowany";
+								}
+							}
+						}
+						echo '<div class="box box-blue" style="margin:6px 0;border-color:#666;">';
+							if ($user->PAY_FVAT > 0 && $user->PAY_SALDO <= -0.05) {
+								echo "Saldo klienta: " . '<b style="color:#f00">' . "{$user->PAY_SALDO} zł" . '</b>' . " ({$user->PAY_FVAT} niezapłaconych faktur)" . '<br />';
+								echo'<br />';
+							}
+							echo '<b style="color:#0B0B8E">'."Wysłać ostateczne wezwanie do zapłaty".'</b>'.'<br />';
+							if (!empty($frm_errors)) {
+								echo'<p style="color:#f00">' . implode('<br />', $frm_errors) . '</p>';
+							}
+							if (!empty($frm_msgs)) {
+								echo'<p style="color:green">' . implode('<br />', $frm_msgs) . '</p>';
+							}
+							echo'<form action="" method="post">';
+								echo'<input type="hidden" name="'."user_task".'" value="'."set_wezwanie2".'" />';
+								echo "Data płatności: ";
+									echo'<input type="text" name="'."PAY_TERM".'" value="'.$frm['PAY_TERM'].'" />';
+								echo " ID Projektu: ";
+									echo'<input type="text" name="'."ID_PROJ".'" value="'.$frm['ID_PROJ'].'" />';
+								echo'<input type="submit" value="'."Zapisz".'" />';
+							echo'</form>';
+						if ($user->wezwanie2_DATE != '0000-00-00') {
+							echo'<br />';
+							$ico_print = '<img src="icon/print.gif" height="16" />';
+							echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie_ostateczne"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " ostateczne wezwanie do zapłaty".'</a>';
+						}
+						echo '</div>';// .box-blue
+					}
+					break;
+					case 'waiting-krd': {
+						if ($user->wezwanie2_DATE != '0000-00-00') {
+							echo'<br />';
+							$ico_print = '<img src="icon/print.gif" height="16" />';
+							echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie_ostateczne"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " ostateczne wezwanie do zapłaty".'</a>';
+						}
+					}
+					break;
+					default:
+						echo'<p>' . "TODO: (".$user->A_STATUS.")" . '</p>';
+				}
+			}
+			//if ($user->BA_TIMESTAMP) {
+			//	echo "Stan wzajemnych rozrachunków:";
+			//	echo " WINIEN: <b>".$user->BA_WINIEN."</b> -  MA: <b>".$user->BA_MA."</b>    SALDO(DO ZAPŁATY): <b>".($user->BA_WINIEN - $user->BA_MA)."</b>";
+			//	echo", i jest to stan na dzień ".date("Y-m-d",$user->BA_TIMESTAMP)." ";
+			//}
+			// phone contact
+			$phone_status_info = Windykacja_StatsHelper::get_phone_status_info($user);
+			$sms_status_info = Windykacja_StatsHelper::get_sms_status_info($user);
+			$mail_status_info = Windykacja_StatsHelper::get_mail_status_info($user);
+			$frm_errors = array();
+			$frm_msgs = array();
+			if (1 == V::get('phone_contact_save', 0, $_POST, 'int')) {
+				if ('' == ($phone_status = V::get('phone_status', '', $_POST))) {
+					$frm_errors[] = "Nic nie zaznaczono!";
+				} else {
+					if (!array_key_exists($phone_status, $phone_status_info)) {
+						$frm_errors[] = "Nieprawidłowa wartość!";
+					} else {
+						$ret = Windykacja_StatsHelper::update_phone_status($user, $phone_status);
+						if ($ret) {
+							$frm_msgs[] = "Dane zapisano pomyślnie";
+						} else {
+							$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
+						}
+					}
+				}
+			}
+			if (1 == V::get('sms_contact_save', 0, $_POST, 'int')) {
+				if ('' == ($sms_status = V::get('sms_status', '', $_POST))) {
+					$frm_errors[] = "Nic nie zaznaczono!";
+				} else {
+					if (!array_key_exists($sms_status, $sms_status_info)) {
+						$frm_errors[] = "Nieprawidłowa wartość!";
+					} else {
+						$ret = Windykacja_StatsHelper::update_sms_status($user, $sms_status);
+						if ($ret) {
+							$frm_msgs[] = "Dane zapisano pomyślnie";
+						} else {
+							$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
+						}
+					}
+				}
+			}
+			if (1 == V::get('mail_contact_save', 0, $_POST, 'int')) {
+				if ('' == ($mail_status = V::get('mail_status', '', $_POST))) {
+					$frm_errors[] = "Nic nie zaznaczono!";
+				} else {
+					if (!array_key_exists($mail_status, $mail_status_info)) {
+						$frm_errors[] = "Nieprawidłowa wartość!";
+					} else {
+						$ret = Windykacja_StatsHelper::update_mail_status($user, $mail_status);
+						if ($ret) {
+							$frm_msgs[] = "Dane zapisano pomyślnie";
+						} else {
+							$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
+						}
+					}
+				}
+			}
+			// add old id_koresp to hist (events)
+			if (1 == V::get('contact_add_id_koresp_save', 0, $_POST, 'int')) {
+				if (($id_koresp = V::get('id_koresp', '', $_POST, 'int')) <= 0) {
+					$frm_errors[] = "Nie podano numeru korespondencji!";
+				} else {
+					$koresp_type = V::get('koresp_type', '', $_POST);
+					$ret = Windykacja_StatsHelper::update_old_id_koresp($user, $id_koresp, $koresp_type);
+					if ($ret) {
+						$frm_msgs[] = "Dane zapisano pomyślnie";
+					} else {
+						$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
+					}
+				}
+			}
+			?>
+			<script type="text/javascript">
+				function frm_kontakt_phone_submit_callback(frm){
+					var len=frm.phone_status.length;
+					var val='';
+					for(var i=0; i < len; i++){
+						if(frm.phone_status[i].checked){
+							var val = frm.phone_status[i].value;
+						}
+					}
+					if (val!='') {
+						return true;
+					} else {
+						alert('Nic nie zaznaczono.');
+					}
+					return false;
+				}
+				function frm_kontakt_sms_submit_callback(frm){
+					var len=frm.sms_status.length;
+					var val='';
+					if (!len && frm.sms_status.type && frm.sms_status.type == 'radio') {
+						if (frm.sms_status.checked) {
+						val = frm.sms_status[i].value;
+						}
+					} else {
+						for(var i=0; i < len; i++){
+							if(frm.sms_status[i].checked){
+								var val = frm.sms_status[i].value;
+							}
+						}
+					}
+					if (val!='') {
+						return true;
+					} else {
+						alert('Nic nie zaznaczono.');
+					}
+					return false;
+				}
+				function frm_kontakt_add_id_koresp(frm){
+					var val=frm.id_koresp.value;
+					if (val!='') {
+						return true;
+					} else {
+						alert('Nie podano numeru korespondencji.');
+					}
+					return false;
+				}
+			</script>
+			<div class="box" style="margin:6px 0;border-color:#666;">
+				<?php if (!empty($frm_errors)) {
+					echo'<p style="color:#f00">' . implode('<br />', $frm_errors) . '</p>';
+				}
+				if (!empty($frm_msgs)) {
+					echo'<p style="color:green">' . implode('<br />', $frm_msgs) . '</p>';
+				}
+				?>
+				<table cellspacing="0" cellpadding="0" border="0" class="tbl-td-top"><tr>
+				<td style="padding:0 20px 0 0;color:blue;">
+					<img src="icon/phone.png" alt="tel" />
+					kontakt z klientem
+				</td>
+				<td style="padding:0 5px;text-align:right">
+					<nobr>Co ustalono:</nobr>
+				</td>
+				<td style="min-width:300px;">
+					<form action="" method="post" onsubmit="return frm_kontakt_phone_submit_callback(this);">
+					<div id="kontakt-phone">
+						<input type="hidden" name="phone_contact_save" value="1" />
+						<?php foreach ($phone_status_info as $k_type => $v_info) {
+							echo '<input type="radio" name="'."phone_status".'" value="' . $k_type . '" />'; echo " " . $v_info['label'] . " " . $v_info['date'] . '<br />';
+						} ?>
+					</div>
+					<input type="submit" value="zapisz" />
+					</form>
+				</td>
+				<td style="width:40px">
+				</td>
+				<td>
+					<?php if (!empty($sms_status_info)) : ?>
+						<form action="" method="post" onsubmit="return frm_kontakt_sms_submit_callback(this);">
+						<div id="kontakt-sms">
+							<input type="hidden" name="sms_contact_save" value="1" />
+							<?php foreach ($sms_status_info as $k_type => $v_info) {
+								echo '<input type="radio" name="'."sms_status".'" value="' . $k_type . '" />'; echo " {$v_info['label']}:<br> {$v_info['msg']}" . '<br />';
+							} ?>
+						</div>
+						<input type="submit" value="wyślij" />
+						</form>
+					<?php endif; ?>
+				</td>
+				<td style="width:40px">
+				</td>
+				<td>
+					<?php if (!empty($mail_status_info)) : ?>
+						<form action="" method="post" onsubmit="return frm_kontakt_mail_submit_callback(this);">
+						<div id="kontakt-mail">
+							<input type="hidden" name="mail_contact_save" value="1" />
+							<?php foreach ($mail_status_info as $k_type => $v_info) {
+								echo '<input type="radio" name="'."mail_status".'" value="' . $k_type . '" />'; echo " {$v_info['label']}:<br> {$v_info['msg']}" . '<br />';
+							} ?>
+						</div>
+						<input type="submit" value="wyślij" />
+						</form>
+					<?php endif; ?>
+				</td>
+				</tr></table>
+			</div>
+
+			<div class="box" style="margin:6px 0;border-color:#666;">
+			<form action="" method="post" onsubmit="return frm_kontakt_add_id_koresp(this);">
+				<input type="hidden" name="contact_add_id_koresp_save" value="1" />
+				Dodaj korespondencję z klientem - ID_KORESP:
+				<input type="text" name="id_koresp" value="" class="i" />
+				<input type="submit" value="zapisz" />
+			</form>
+			</div>
+
+			<div class="box" style="margin:6px 0;border-color:#666;">
+				<?php
+				$ico_print = '<img src="icon/print.gif" height="16" />';
+				echo '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " rozwiązanie umowy".'</a>';
+				?>
+			</div>
+		</div>
+		<?php
+	}
+
+	public static function items_filters() {
+		$filter_arr = Windykacja_StatsHelper::get_filters();
+		$filter_selected = Windykacja_StatsHelper::get_filter_selected();
+		$status_cnt = Windykacja_StatsHelper::get_status_count();// {cnt, suma_zaleglosci}
+		// pomin filtry
+		unset($filter_arr['15']);
+		unset($filter_arr['blokada']);
+		unset($filter_arr['WAITING']);
+		$sub_filters = array('tel1', 'bad_address', '3 m-ce przed', 'po-terminie', 'has_nr_sad', 'has_nr_komornik', 'has_ustalenia', 'sad_and_komornik', 'sad_bez_komornik', 'isMovedToVectra');
+		$sub_filters_arr = array();
+		foreach ($sub_filters as $v_filter_name) {
+			if (array_key_exists($v_filter_name, $filter_arr)) {
+				$sub_filters_arr[$v_filter_name] = $filter_arr[$v_filter_name];
+				unset($filter_arr[$v_filter_name]);
+			}
+		}
+		$zewn_filters = array('waiting-sad', 'docs-in-sad', 'sad');
+		$zewn_filters_arr = array();
+		foreach ($zewn_filters as $v_filter_name) {
+			if (array_key_exists($v_filter_name, $filter_arr)) {
+				$zewn_filters_arr[$v_filter_name] = $filter_arr[$v_filter_name];
+				unset($filter_arr[$v_filter_name]);
+			}
+		}
+
+		echo'<table cellspacing="0" cellpadding="0" border="1" style="background:#ddd;border-color:#666;"><tr><td style="vertical-align:top">';
+		if (!empty($filter_selected)) {
+				echo'<a href="' . "??MENU_INIT=USERS2_WINDYKACJA_STATUS" . '" title="'."Kasuj filtry".'">' . '<img src="icon/del.png" height="16" alt="'."Kasuj filtry".'" />' . '</a>';
+			echo '</td><td>';
+		}
+
+		echo'<table class="tbl-view historia-platnosci-filters" cellspacing="0" cellpadding="0" border="1">';
+		echo'<thead>';
+		echo'<tr>';
+			foreach ($filter_arr as $k => $v_arr) {
+				$cls = ($filter_selected == $k)? ' class="selected"' : '';
+				echo'<td' . $cls . '>';
+					if ($desc = V::get('desc', '', $v_arr)) {
+						echo '<span title="' . end($desc) . '">' . reset($desc) . '</span>';
+					}
+				echo'</td>';
+			}
+			if (!empty($zewn_filters_arr)) {
+				echo '<td colspan="'.count($zewn_filters_arr).'" style="background:#f00;color:#fff;font-weight:bold;">' . "Windykacja zewnętrzna" . '</td>';
+			}
+		echo'</tr>';
+		echo'<tr>';
+			foreach ($filter_arr as $k => $v_arr) {
+				$cls = ($filter_selected == $k)? ' class="selected"' : '';
+				echo'<td' . $cls . '>';
+					echo '<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&_f=" . $k . '">' . reset($v_arr) . '</a>';
+					//$stat_cnt = V::get($k, 0, $status_cnt, 'int');
+					//echo ' <span style="color:#f00;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+						$stat_cnt = 0;
+					if (array_key_exists($k, $status_cnt)) {
+						$stat_cnt = $status_cnt[$k]->cnt;
+						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+						$stat_saldo = number_format($status_cnt[$k]->suma_zaleglosci, 2, ',', ' ');
+						echo '<br />' . '<span style="color:#f00;" title="' . $stat_saldo . " zł zagdłużenia" . '">' . $stat_saldo . '</span>';
+					} else {
+						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+					}
+				echo'</td>';
+			}
+			if (!empty($zewn_filters_arr)) {
+				foreach ($zewn_filters_arr as $k => $v_arr) {
+					$cls = ($filter_selected == $k)? ' class="selected"' : '';
+					echo'<td' . $cls . '>';
+						echo '<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&_f=" . $k . '">' . reset($v_arr) . '</a>';
+						//$stat_cnt = V::get($k, 0, $status_cnt, 'int');
+						//echo ' <span style="color:#f00;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+							$stat_cnt = 0;
+						if (array_key_exists($k, $status_cnt)) {
+							$stat_cnt = $status_cnt[$k]->cnt;
+							echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+							$stat_saldo = number_format($status_cnt[$k]->suma_zaleglosci, 2, ',', ' ');
+							echo '<br />' . '<span style="color:#f00;" title="' . $stat_saldo . " zł zagdłużenia" . '">' . $stat_saldo . '</span>';
+						} else {
+							echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+						}
+					echo'</td>';
+				}
+			}
+		echo'</tr>';
+		echo'</thead>';
+		echo'</table>';
+
+		if (!empty($sub_filters_arr)) {
+			echo '<table class="tbl-view historia-platnosci-subfilters" cellspacing="0" cellpadding="0" border="1">';
+			echo '<thead><tr>';
+			foreach ($sub_filters_arr as $k => $v_arr) {
+				$cls = ($filter_selected == $k)? ' class="selected"' : '';
+				echo'<td' . $cls . '>';
+					echo '<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&_f=" . $k . '">' . reset($v_arr) . '</a>';
+					//$stat_cnt = V::get($k, 0, $status_cnt, 'int');
+					//echo ' <span style="color:#f00;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+						$stat_cnt = 0;
+					if (array_key_exists($k, $status_cnt)) {
+						$stat_cnt = $status_cnt[$k]->cnt;
+						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+						$stat_saldo = number_format($status_cnt[$k]->suma_zaleglosci, 2, ',', ' ');
+						echo '<br />' . '<span style="color:#000;" title="' . $stat_saldo . " zł zagdłużenia" . '">' . $stat_saldo . '</span>';
+					} else {
+						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
+					}
+				echo'</td>';
+			}
+			echo '</tr></thead>';
+			echo '</table>';
+		}
+
+		echo '</td></tr></table>';
+
+		echo'<br />';
+	}
+
+	public static function items($q, &$page_nav, &$items) {
+		$page_nav->links = array();
+
+		$out_link_arr = V::copy($page_nav->base_link_arr);
+		$out_link_arr['_p'] = 0;
+		$out_link = V::make_link('', $out_link_arr);
+		$page_nav->links[] = '<a href="' . $out_link . '" title="'."Pierwsza strona".'">'."|&lt;&lt;".'</a>';
+
+		if ($page_nav->page_nr > 0) {
+			$out_link_arr = V::copy($page_nav->base_link_arr);
+			$out_link_arr['_p'] = $page_nav->page_nr - 1;
+			$out_link = V::make_link('', $out_link_arr);
+			$page_nav->links[] =  '<a href="' . $out_link . '" title="'."Poprzednia strona".'">'."&lt;&lt; -{$page_nav->page_limit}".'</a>';
+		} else {
+			$page_nav->links[] =  " &lt;&lt; ";
+		}
+
+		$page_nav->links[] =  '<span>'.($page_nav->page_nr * $page_nav->page_limit).'</span>';
+		$page_nav->links[] =  '<span title="'."Znaleziono ".$page_nav->total." rekordów".'">'."({$page_nav->total}) ".'</span>';
+
+		$out_link_arr = V::copy($page_nav->base_link_arr);
+		$out_link_arr['_p'] = $page_nav->page_nr + 1;
+		$out_link = V::make_link('', $out_link_arr);
+		$page_nav->links[] =  '<a href="' . $out_link . '" title="'."Nastepna strona".'">'."+{$page_nav->page_limit} &gt;&gt;".'</a>';
+
+		$out_link_arr = V::copy($page_nav->base_link_arr);
+		$out_link_arr['_p'] = $page_nav->last_page_nr;
+		$out_link = V::make_link('', $out_link_arr);
+		$page_nav->links[] =  '<a href="' . $out_link . '" title="'."Ostatnia strona".'">'."&gt;&gt;|".'</a>';
+
+		$page_nav_out = '<div class="tbl-page-nav">' . implode(" ", $page_nav->links);
+			$out_link_arr = V::copy($page_nav->base_link_arr);
+			$out_link_arr['task'] = 'export_csv';
+			$out_link_arr['HEADER_NOT_INIT'] = 'YES';
+			$out_link = V::make_link('', $out_link_arr);
+			$page_nav_out .= ' <a style="margin:0 0 0 20px;" href="' . $out_link . '" target="_blank">export csv</a>';
+
+			$out_link_arr = V::copy($page_nav->base_link_arr);
+			$out_link_arr['task'] = 'send_mass_mail';
+			$out_link = V::make_link('', $out_link_arr);
+			$page_nav_out .= ' <a style="margin:0 0 0 20px;" href="' . $out_link . '" target="_blank">send mail</a>';
+
+			$out_link_arr = V::copy($page_nav->base_link_arr);
+			$out_link_arr['task'] = 'send_mass_sms';
+			$out_link = V::make_link('', $out_link_arr);
+			$page_nav_out .= ' <a style="margin:0 0 0 20px;" href="' . $out_link . '" target="_blank">send sms</a>';
+		$page_nav_out .= '</div>';
+
+		if (empty($items)) {
+			echo'<p style="color:red">'."Brak danych".'</p>';
+			return;
+		}
+		echo $page_nav_out;
+
+		$cols_order_by = Windykacja_StatsModel::get_order_by_fields();
+		$cols = array();
+		$cols['ID_BILLING_USERS'] = array('label'=>'Nr klienta', 'title'=>'ID_BILLING_USERS');
+		$cols['is_firma'] = array('label'=>'F', 'title'=>'is_firma: Firma 1 - tak, 0 nie');
+		$cols['BILLING_OWNER'] = array('label'=>'COM', 'title'=>'BILLING_OWNER: Klient firmy 1 - BIALL-NET, 2 - NETDAY');
+		$cols['BLOKADA'] = array('label'=>'B', 'title'=>'BLOKADA: Informacja o blokadzie');
+		$cols['P_NAME'] = array('label'=>'imie i nazwisko', 'title'=>'P_NAME');
+		$cols['P_ADDRESS_STREET'] = array('label'=>'adres', 'title'=>'P_ADDRESS_STREET');
+		$cols['P_ADDRESS_Koresp'] = array('label'=>'adres koresp.', 'title'=>'Adres do korespondencji');
+		$cols['P_PHONE'] = array('label'=>'nr telefonu', 'title'=>'P_PHONE');
+		$cols['user_mail_contact'] = array('label'=>'adres e-mail', 'title'=>'user_mail_contact');
+		$cols['A_STATUS'] = array('label'=>'status', 'title'=>'A_STATUS');
+		$cols['A_STATUS_UPDATE_DATE'] = array('label'=>'data aktualizacji', 'title'=>'A_STATUS_UPDATE_DATE');
+		$cols['PAY_SALDO'] = array('label'=>'saldo', 'title'=>'PAY_SALDO');
+		$cols['PAY_SALDO_30_DNI'] = array('label'=>'saldo 30 dni', 'title'=>'Saldo bez faktur z terminem płatności < 30 dni');
+		$cols['PAY_SALDO_ISSUED'] = array('label'=>'saldo wystawione', 'title'=>'Saldo wg daty wystawienia faktur');
+		$cols['PAY_FVAT'] = array('label'=>'zaległe faktury', 'title'=>'PAY_FVAT');
+		$cols['PAY_DATE_FIRST_FVAT'] = array('label'=>'data wymagalności<br> pierwszej faktury', 'title'=>'PAY_DATE_FIRST_FVAT');
+		$cols['PAY_DATE'] = array('label'=>'data wymagalności<br> ostatniej faktury', 'title'=>'PAY_DATE');
+		$cols['LAST_FVAT_VALUE'] = array('label'=>'kwota ostatniej faktury', 'title'=>'LAST_FVAT_VALUE');
+		$cols['LAST_PAY_DATE'] = array('label'=>'data ostatniej wpłaty', 'title'=>'LAST_PAY_DATE');
+		$cols['LAST_PAY_VALUE'] = array('label'=>'kwota ostatniej wpłaty', 'title'=>'LAST_PAY_VALUE');
+		$cols['PAY_TERM'] = array('label'=>'termin płatności', 'title'=>'PAY_TERM');
+		$cols['IS_MOVED_TO_VECTRA'] = array('label'=>'Przeniesienie do Vectra?', 'title'=>'IS_MOVED_TO_VECTRA');
+		$cols['HAS_ACTIVE_NET'] = array('label'=>'NET', 'title'=>'Aktywne usługi NET');
+		$cols['HAS_ACTIVE_TV']  = array('label'=>'TV',  'title'=>'Aktywne uslugi TV');
+
+		echo'<table class="tbl-view historia-platnosci" border="1" cellspacing="0" cellpaddin="0">';
+		echo'<thead>';
+			echo'<tr>';
+			foreach ($cols as $k_field => $v_params) {
+				echo'<th' . ((!empty($v_params['title'])) ? ' title="' . $v_params['title'] . '"' : '') . '>';
+					echo $v_params['label'];
+
+					if (in_array($k_field, $cols_order_by)) {
+						$sel_oby  = (isset($page_nav->base_link_arr['_oby']))?  $page_nav->base_link_arr['_oby']  : '';
+						$sel_odir = 'DESC';
+						if ($k_field == $sel_oby) {
+							$sel_odir = (isset($page_nav->base_link_arr['_odir']))? $page_nav->base_link_arr['_odir'] : '';
+							$sel_odir = ($sel_odir == 'ASC')? 'ASC' : 'DESC';
+						}
+
+						$out_link_arr = V::copy($page_nav->base_link_arr);
+						$out_link_arr['_p'] = 0;
+						$out_link_arr['_oby'] = $k_field;
+						$out_link_arr['_odir'] = ($sel_odir == 'DESC')? 'ASC' : 'DESC';
+						$out_link = V::make_link('', $out_link_arr);
+						echo ' <a style="' . (($k_field == $sel_oby)? 'color:red;' : '') . 'text-decoration:none" href="' . $out_link . '">' . (($sel_odir == 'DESC')? 'v' : '^') . '</a>';
+					}
+				echo '</th>';
+			}
+			echo'</tr>';
+		echo'</thead>';
+		echo'<tbody>';
+		$t = 0;
+		foreach ($items as $k_id => $user) {
+			echo'<tr class="row-'.($t = 1 - $t).'">';
+				echo'<td>';
+					echo'<nobr>';
+					$out_link_arr = V::copy($page_nav->base_link_arr);
+					$out_link_arr['_user_id'] = $k_id;
+					$out_link = V::make_link('', $out_link_arr);
+					echo '<a href="' . $out_link . '">'.'<img src="icon/edit.png" height="16" alt="Edit">'.'</a>';
+					echo " ";
+					echo '<a href="' . $out_link . '">'.$k_id.'</a>';
+					echo'</nobr>';
+				echo'</td>';
+				echo '<td>';
+					echo $user->is_firma;
+				echo '</td>';
+				echo '<td>';
+					if ($user->BILLING_OWNER == 1) {
+						echo '<span title="' . "BIALL-NET" . '">' . 'BN' . '</span>';
+					} else if ($user->BILLING_OWNER == 2) {
+						echo '<span title="' . "NETDAY" . '">' . 'ND' . '</span>';
+					} else {
+						echo '0';
+					}
+				echo '</td>';
+				echo '<td>';
+					if ($user->STATUS == 9) {
+						echo '<b style="color:red" title="' . "ZABLOKOWANY" . '">' . "Z" . '</b>';
+					} else {
+						echo '<em style="color:silver" title="' . "brak blokady" . '">' . "0" . '</em>';
+					}
+				echo '</td>';
+				echo'<td style="white-space:nowrap;">';
+					$cell_out = $user->P_NAME.' '.$user->P_NAME_SECOND;
+					echo '<b title="' . $cell_out . '">' . ((strlen($cell_out) > 30)? substr($cell_out, 0, 30) . ' ...' : $cell_out) . '</b>';
+				echo'</td>';
+				echo'<td style="white-space:nowrap;'.(($user->BAD_ADDRESS)? 'background-color:#FF7878;' : '').'">';
+					$cell_out = "ul. " . $user->P_ADDRESS_STREET . " " . $user->P_ADDRESS_HOUSE . "/" . $user->P_ADDRESS_HOME . ", " . $user->P_ADDRESS_POST_CODE . " " . $user->P_ADDRESS_CITY;
+					echo '<i title="' . (($user->BAD_ADDRESS)? "błędny adres zameldowania: " : '') . $cell_out . '">' . ((strlen($cell_out) > 30)? mb_substr($cell_out, 0, 30, "UTF-8") . ' ...' : $cell_out) . '</i>';
+				echo'</td>';
+				?>
+				<?php if ($user->P_ADRESS_KORESP_1282) : ?>
+					<td title="Adres do korespondencji: <?php echo $user->P_ADRESS_KORESP_1282; ?>">
+						<?php echo $user->P_ADRESS_KORESP_1282; ?>
+					</td>
+				<?php else: ?>
+					<td></td>
+				<?php endif; ?>
+				<?php
+				echo '<td>' . $user->P_PHONE . '</td>';
+				echo '<td>' . $user->user_mail_contact . '</td>';
+				echo'<td>';
+					echo '<nobr>';
+					switch ($user->A_STATUS) {
+						case 'WAITING':
+							echo '<span style="color:#666;">' . $user->A_STATUS . '</span>';
+							break;
+						default:
+							echo $user->A_STATUS;
+					}
+					echo '</nobr>';
+				echo'</td>';
+				echo'<td>';
+					if ($user->A_STATUS_UPDATE_DATE != '0000-00-00') {
+						echo $user->A_STATUS_UPDATE_DATE;
+					} else {
+						echo '<span style="color:#666;">' . $user->A_STATUS_UPDATE_DATE . '</span>';
+					}
+				echo'</td>';
+				echo'<td>';
+					echo '<nobr>';
+					if ($user->PAY_SALDO != 0) {
+						$col = ($user->PAY_SALDO > 0)? '#333' : '#f00';
+						echo '<span style="color:' . $col . '">' . "{$user->PAY_SALDO} zł" . '</span>';
+					} else {
+						echo'<span style="color:#666">' . "0" . '</span>';
+					}
+					echo '</nobr>';
+				echo'</td>';
+				echo'<td>';
+					echo '<nobr>';
+					if ($user->PAY_SALDO_30_DNI != 0) {
+						$col = ($user->PAY_SALDO_30_DNI > 0)? '#333' : '#f00';
+						echo '<span style="color:' . $col . '">' . "{$user->PAY_SALDO_30_DNI} zł" . '</span>';
+					} else {
+						echo'<span style="color:#666">' . "0" . '</span>';
+					}
+					echo '</nobr>';
+				echo'</td>';
+				echo'<td>';
+					echo '<nobr>';
+					if ($user->PAY_SALDO_ISSUED != 0) {
+						$col = ($user->PAY_SALDO_ISSUED > 0)? '#333' : '#f00';
+						echo '<span style="color:' . $col . '">' . "{$user->PAY_SALDO_ISSUED} zł" . '</span>';
+					} else {
+						echo'<span style="color:#666">' . "0" . '</span>';
+					}
+					echo '</nobr>';
+				echo'</td>';
+				echo'<td>';
+					if ($user->PAY_FVAT > 0) {
+						$st = ($user->PAY_FVAT > 1)? ' style="color:#f00"' : '';
+						echo' <span title="' . "{$user->PAY_FVAT} nieopłaconych faktur" . '"'.$st.'>' . $user->PAY_FVAT . '</span>';
+					} else {
+						echo $user->PAY_FVAT;
+					}
+				echo'</td>';
+				echo'<td>';
+					if ($user->PAY_DATE_FIRST_FVAT != '0000-00-00') {
+						echo $user->PAY_DATE_FIRST_FVAT;
+					}
+				echo'</td>';
+				echo'<td>';
+					if ($user->PAY_DATE != '0000-00-00') {
+						echo $user->PAY_DATE;
+					}
+				echo'</td>';
+				echo'<td>';
+					echo $user->LAST_FVAT_VALUE;
+				echo'</td>';
+				echo'<td>';
+					if ($user->LAST_PAY_DATE && $user->LAST_PAY_DATE != '0000-00-00') {
+						echo $user->LAST_PAY_DATE;
+					} else {
+						echo '---';
+					}
+				echo'</td>';
+				echo'<td>';
+					echo $user->LAST_PAY_VALUE;
+				echo'</td>';
+				echo'<td>';
+					if ($user->PAY_TERM != '0000-00-00') {
+						echo $user->PAY_TERM;
+					}
+				echo'</td>';
+				echo'<td>';
+					if ($user->IS_MOVED_TO_VECTRA) {
+						echo 'TAK';
+					} else {
+						echo '<span class="text-muted">NIE</span>';
+					}
+				echo'</td>';
+				echo'<td>' . $user->HAS_ACTIVE_NET . '</td>';
+				echo'<td>' . $user->HAS_ACTIVE_TV . '</td>';
+				//, w.`USER_PAY_TERM_ADD`
+				//, w.`L_APPOITMENT_DATE`
+				//, w.`L_APPOITMENT_USER`
+			echo'</tr>';
+		}
+		echo'</tbody>';
+		echo'</table>';
+		echo $page_nav_out;
+	}
+
+	public static function export_csv($q, &$page_nav, &$items) {
+		if (empty($items)) {
+			echo "Brak danych";
+			return;
+		}
+
+		$activeFiltr = V::get('_f', 'all', $_GET);
+		$csvFileName = "Windykacja-{$activeFiltr}";
+		header('Content-Type: text/csv; charset=utf-8');
+		header("Content-Disposition: attachment; filename={$csvFileName}.csv");
+
+		$cols_order_by = Windykacja_StatsModel::get_order_by_fields();
+		$cols = array();
+		$cols['ID_BILLING_USERS'] = array('label'=>'Nr klienta', 'title'=>'ID_BILLING_USERS');
+		$cols['is_firma'] = array('label'=>'F', 'title'=>'is_firma: Firma 1 - tak, 0 nie');
+		$cols['BILLING_OWNER'] = array('label'=>'COM', 'title'=>'BILLING_OWNER: Klient firmy 1 - BIALL-NET, 2 - NETDAY');
+		$cols['BLOKADA'] = array('label'=>'B', 'title'=>'BLOKADA: Informacja o blokadzie');
+		$cols['P_NAME'] = array('label'=>'imie i nazwisko', 'title'=>'P_NAME');
+		$cols['P_ADDRESS_STREET'] = array('label'=>'adres', 'title'=>'P_ADDRESS_STREET');
+		$cols['P_ADDRESS_Koresp'] = array('label'=>'adres koresp.', 'title'=>'Adres do korespondencji');
+		$cols['P_PHONE'] = array('label'=>'nr telefonu', 'title'=>'P_PHONE');
+		$cols['user_mail_contact'] = array('label'=>'adres e-mail', 'title'=>'user_mail_contact');
+		$cols['P_PESEL'] = array('label'=>'pesel', 'title'=>'P_PESEL');
+		$cols['A_STATUS'] = array('label'=>'status', 'title'=>'A_STATUS');
+		$cols['A_STATUS_UPDATE_DATE'] = array('label'=>'data aktualizacji', 'title'=>'A_STATUS_UPDATE_DATE');
+		$cols['PAY_SALDO'] = array('label'=>'saldo', 'title'=>'PAY_SALDO');
+		$cols['PAY_SALDO_30_DNI'] = array('label'=>'saldo 30 dni', 'title'=>'Saldo bez faktur z terminem płatności < 30 dni');
+		$cols['PAY_SALDO_ISSUED'] = array('label'=>'saldo wystawione', 'title'=>'Saldo wg daty wystawienia faktur');
+		$cols['PAY_FVAT'] = array('label'=>'zaległe faktury', 'title'=>'PAY_FVAT');
+		$cols['PAY_DATE_FIRST_FVAT'] = array('label'=>'data wymagalności pierwszej faktury', 'title'=>'PAY_DATE_FIRST_FVAT');
+		$cols['PAY_DATE'] = array('label'=>'data wymagalności ostatniej faktury', 'title'=>'PAY_DATE');
+		$cols['LAST_FVAT_VALUE'] = array('label'=>'kwota ostatniej faktury', 'title'=>'LAST_FVAT_VALUE');
+		$cols['LAST_PAY_DATE'] = array('label'=>'data ostatniej wpłaty', 'title'=>'LAST_PAY_DATE');
+		$cols['LAST_PAY_VALUE'] = array('label'=>'kwota ostatniej wpłaty', 'title'=>'LAST_PAY_VALUE');
+		$cols['PAY_TERM'] = array('label'=>'termin płatności', 'title'=>'PAY_TERM');
+		$cols['ACCOUNT_NUMBER'] = array('label'=>'nr konta', 'title'=>'ACCOUNT_NUMBER');
+		$cols['SERVICES_STREETS'] = array('label'=>'adresy usług', 'title'=>'SERVICES_STREETS');
+		$cols['IS_MOVED_TO_VECTRA'] = array('label'=>'Przeniesienie do Vectra', 'title'=>'IS_MOVED_TO_VECTRA');
+		$cols['HAS_ACTIVE_NET'] = array('label'=>'NET', 'title'=>'Aktywne usługi NET');
+		$cols['HAS_ACTIVE_TV']  = array('label'=>'TV',  'title'=>'Aktywne uslugi TV');
+
+		$out_cols = array();
+		foreach ($cols as $k_field => $v_params) {
+			$out_cols[] = '"' . $v_params['label'] . '"';
+		}
+		echo implode(";", $out_cols) . "\n";
+		foreach ($items as $k_id => $user) {
+			$out_cols = array();
+			$out_cols[] = '"' . $k_id . '"';
+			$out_cols[] = '"' . $user->is_firma . '"';
+			if ($user->BILLING_OWNER == 1) {
+				$out_cols[] = '"' . 'BN' . '"';
+			} else if ($user->BILLING_OWNER == 2) {
+				$out_cols[] = '"' . 'ND' . '"';
+			} else {
+				$out_cols[] = '"' . '0' . '"';
+			}
+			$out_cols[] = '"' . (($user->STATUS == 9)? "Z" : "0") . '"';
+			$out_cols[] = '"' . $user->P_NAME.' '.$user->P_NAME_SECOND . '"';
+			$out_cols[] = '"' . "ul. {$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}/{$user->P_ADDRESS_HOME}, {$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}" . '"';
+			if ($user->P_ADRESS_KORESP_1282) {
+				$out_cols[] = '"' . $user->P_ADRESS_KORESP_1282 . '"';
+			} else {
+				$out_cols[] = '""';
+			}
+			$out_cols[] = '"' . $user->P_PHONE . '"';
+			$out_cols[] = '"' . $user->user_mail_contact . '"';
+			$out_cols[] = '"' . $user->P_PESEL . '"';
+			$out_cols[] = '"' . $user->A_STATUS . '"';
+			$out_cols[] = '"' . $user->A_STATUS_UPDATE_DATE . '"';
+			$out_cols[] = '"' . (($user->PAY_SALDO != 0)? "{$user->PAY_SALDO} zł" : "0") . '"';
+			$out_cols[] = '"' . (($user->PAY_SALDO_30_DNI != 0)? "{$user->PAY_SALDO_30_DNI} zł" : "0") . '"';
+			$out_cols[] = '"' . (($user->PAY_SALDO_ISSUED != 0)? "{$user->PAY_SALDO_ISSUED} zł" : "0") . '"';
+			$out_cols[] = '"' . $user->PAY_FVAT . '"';
+			$out_cols[] = '"' . (($user->PAY_DATE_FIRST_FVAT != '0000-00-00')? $user->PAY_DATE_FIRST_FVAT : '') . '"';
+			$out_cols[] = '"' . (($user->PAY_DATE != '0000-00-00')? $user->PAY_DATE : '') . '"';
+			$out_cols[] = '"' . $user->LAST_FVAT_VALUE . '"';
+			$out_cols[] = '"' . (($user->LAST_PAY_DATE && $user->LAST_PAY_DATE != '0000-00-00')? $user->LAST_PAY_DATE : '---') . '"';
+			$out_cols[] = '"' . $user->LAST_PAY_VALUE . '"';
+			$out_cols[] = '"' . (($user->PAY_TERM != '0000-00-00')? $user->PAY_TERM : '') . '"';
+			$out_cols[] = '"' . $user->ACCOUNT_NUMBER . '"';
+			$out_cols[] = '"' . $user->SERVICES_STREETS . '"';
+			$out_cols[] = '"' . (($user->IS_MOVED_TO_VECTRA)? 'TAK' : 'NIE') . '"';
+			$out_cols[] = '"' . $user->HAS_ACTIVE_NET . '"';
+			$out_cols[] = '"' . $user->HAS_ACTIVE_TV . '"';
+			echo implode(";", $out_cols) . "\n";
+		}
+	}
+
+	public static function form($q = '') {
+
+		SEF("MENU");
+		MENU();
+
+		echo'<div class="box box-blue">';
+		echo'<form action="" method="get">';
+			echo'<input type="hidden" name="'."MENU_INIT".'" value="'."USERS2_WINDYKACJA_STATUS".'" />';
+			echo'<p style="margin:0;">'."Wyszukaj klienta: ";
+				echo'<input type="text" name="'."q".'" value="'.htmlspecialchars($q).'" />';
+				echo " ".'<em>'."(imie, nazwisko lub numer klineta)".'</em>';//, adres
+				echo " ".'<input type="submit" value="'."szukaj".'" />';
+			echo'</p>';
+		echo'</form>';
+		echo'</div>';// .box-blue
+	}
+
+	public static function css() {
+		echo'<style type="text/css">'."
+            body{font-family:arial;line-height:1.4;}
+            .box{border:1px solid #999;padding:5px;margin:5px;}
+            .box-center{border:1px solid #999;padding:5px;margin:5px auto;}
+            .box-silver{border-color:#999;}
+            .box-red{border-color:#f00;}
+            .box-blue{border-color:#00f;}
+            .box-green{border-color:#008000;}
+            .box-hover-active{background:#fff;border-color:#999;}
+            .box-hover-active:hover{background:#eee;border-color:#000;}
+
+            .btn-box{margin:0 2px 0 0;padding:0 3px;background:#bbb;color:#fff;text-decoration:none;border:0;font-weight:bold;}
+
+            .tbl-page-nav{font-size:small;}
+            .tbl-page-nav a{font-size:small; text-decoration:none;}
+            .tbl-page-nav a:hover{background-color:#eee;}
+
+            .tbl-view {margin:0;font-size:small;}
+            .tbl-view caption{text-align:left;font-style:italic;font-size:medium;}
+            .tbl-view caption em{padding:0 5px;font-size:13px;font-style:normal;}
+            .tbl-view th{padding:0 3px;font-size:small;}
+            .tbl-view td{padding:0 3px;}
+            .tbl-view .r{text-align:right;}
+            .tbl-view thead th {background:#F3F3F3;}
+            .tbl-view thead td {background:#F3F3F3;}
+            .historia-platnosci-filters thead td{text-align:center;}
+            .historia-platnosci-filters td.selected {background-color:#FFE6E9;}
+            .historia-platnosci-filters td:hover {background-color:#E6FFE6;}
+            .historia-platnosci-subfilters thead td{text-align:center;background:#fff;}
+            .historia-platnosci-subfilters td.selected {background-color:#FFE6E9;}
+            .historia-platnosci-subfilters td:hover {background-color:#E6FFE6;}
+
+            .tbl-td-top th,
+            .tbl-td-top td {vertical-align:top;}
+		".'</style>';
+	}
+
+	public static function user_umowy(&$user) {
+
+		Lib::loadClass('Tree');
+		Lib::loadClass('TreeHelper');
+		// build tree by P_ID - array or 0
+		function Tree_Helper__create_tree_rec($p_id, &$items) {
+			static $rec_ind;
+			$rec_ind++;
+			$ret = array();
+			if (!array_key_exists($p_id, $items)) {
+				return false;
+			} else {
+				$r = $items[$p_id];
+				if (empty($r->sub)) {
+					return false;
+				}
+				foreach ($r->sub as $k_id => $v) {
+					$ret[$k_id] = Tree_Helper__create_tree_rec($k_id, $items);
+				}
+				return $ret;
+			}
+		}
+
+		function tree_callback__show_item_from_SERVICES(&$r, &$tree) {
+			$cls = array();
+			$cls[] = 'HANGUP_STATUS-' . $r->HANGUP_STATUS;
+			$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
+
+			echo'<dl'.$cls.'>';
+			echo'<dt>';
+
+			$out_id = ($r->ID < 10)? '&nbsp;'.$r->ID.'' : $r->ID;
+			echo'<b class="item_id btn-box">'.$out_id.'</b>';
+			//echo'<a href="'."?MENU_INIT=IN7_MK_BAZA_DYSTRYBUCJI_EDIT&ARG1=EDIT&ARG1_VAL=".$r->ID.'" class="btn" title="'."Edit".'">'."E".'</a>';
+
+			$st_status_bg = '';
+			if ($r->A_STATUS == 'NORMAL') {
+				$st_status_bg = '#8F8;';
+			} else if ($r->A_STATUS == 'WAITING') {
+				$st_status_bg = '#F8F;';
+			} else if ($r->A_STATUS == 'DELETED') {
+				$st_status_bg = '#ccc;';
+			} else if ($r->A_STATUS == 'OFF_SOFT') {
+				$st_status_bg = '#F99;';
+			} else if ($r->A_STATUS == 'OFF_HARD') {
+				$st_status_bg = '#eee;';
+			}
+			$st_status_bg = ($st_status_bg)? 'background-color:'.$st_status_bg : '';
+
+			echo'<span class="desc">';
+				echo'<span class="btn-box" style="'.$st_status_bg.'">'.$r->A_STATUS.'</span>';
+				echo' <b style="color:#333;">'.$r->description.'</b>';
+				if ($r->ID_OFFERS) {
+					echo' <code>' . "(Nr oferty: {$r->ID_OFFERS})" . '</code>';
+				} else {
+					echo' <span style="color:#f00">'."Brak numeru oferty!".'</span>';
+				}
+
+				$st_status_bg = '';
+				if ($r->HANGUP_STATUS == 'NORMAL') {
+					$st_status_bg = 'background-color:#8F8;';
+				} else if ($r->HANGUP_STATUS == 'WAITING') {
+					$st_status_bg = 'background-color:#F8F;';
+				} else if ($r->HANGUP_STATUS == 'DELETED') {
+					$st_status_bg = 'background-color:#ccc;';
+				} else if ($r->HANGUP_STATUS == 'OFF_SOFT') {
+					$st_status_bg = 'background-color:#F99;';
+				} else if ($r->HANGUP_STATUS == 'OFF_HARD') {
+					$st_status_bg = 'background-color:#f00;color:#fff;';
+				}
+				echo ' <span class="btn-box" style="' . $st_status_bg . '">' . "{$r->HANGUP_STATUS} ({$r->HANGUP_FROM} - {$r->HANGUP_TILL}) - {$r->A_STATUS_DESC}" .'</span>';
+			echo'</span>';
+			echo'</dt>';
+			echo'</dl>'."\n";
+		}
+
+		$uslugi_l2 = Windykacja_StatsModel::get_uslugi_from_l2($user);
+		$umowy_l2 = Windykacja_StatsModel::get_umowy_from_l2($user);
+
+		$uslugi_l2_nieprzypisane = array();
+		foreach ($uslugi_l2 as $k_id => $h) {
+			$uslugi_l2_nieprzypisane[$k_id] = true;
+		}
+		if (is_array($umowy_l2) && !empty($umowy_l2)) {
+			if (is_array($uslugi_l2) && !empty($uslugi_l2)) {
+				foreach ($umowy_l2 as $k_umowa_ind => $h_umowa) {
+					$umowy_l2[$k_umowa_ind]['uslugi'] = array();
+					foreach ($uslugi_l2 as $k_id => $h_usluga) {
+						if ($h_usluga['ID_DEALS_TABLE'] == $h_umowa['ID']) {
+							$umowy_l2[$k_umowa_ind]['uslugi'][$k_id] = $h_usluga;
+							if (isset($uslugi_l2_nieprzypisane[$k_id])) unset($uslugi_l2_nieprzypisane[$k_id]);
+						}
+					}
+				}
+			}
+		}
+
+		echo'<style type="text/css">'."
+            .tbl-umowy-l2 .umowa-id{font-weight:bold;font-size:big;font-family:arial;}
+            .tbl-umowy-l2 .row-umowa td{border-top:2px solid #00f;}
+            .wind-status-old td,
+            .wind-status-old th {color:#666;}
+		".'</style>';
+
+		$ARGS['ZAPISZ'] = true;
+		Lay_Html_Toggle::start("Aktualne umowy i usługi ", array('open'=>(($ARGS['ZAPISZ'])? false : true)));
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l2: ';print_r($umowy_l2);echo'</pre>';
+		echo'<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
+		//echo'<caption>'."Aktualne umowy".'<em>'." (l2)".'</em>'.'</caption>';
+		if ($umowy_l2 == -1) {
+			echo'<tr><td>';
+				echo'<span style="color:red">'."Blad polaczenia do bazy dancyh webone_billing - Zasob [931]".'</span>';
+			echo'</td></tr>';
+		} else if (empty($umowy_l2)) {
+			echo'<tr><td>'."Brak umów.".'</td></tr>';
+		}
+		else {
+			$tbl_umowy_cols = 5;
+			echo'<thead>';
+				echo'<tr>';
+					echo'<th>'."Nr umowy".'</th>';
+					echo'<th>'."Prefix".'</th>';
+					echo'<th>'."Data umowy".'</th>';
+					echo'<th>'."Termin".'</th>';
+					echo'<th>'."".'</th>';
+				echo'</tr>';
+			echo'</thead>';
+			$t = 0;
+			foreach ($umowy_l2 as $h) {
+				echo'<tr class="row-umowa row-'.($t = 1 - $t).'">';
+					echo'<td class="r umowa-id">' . $h['P_DEALNUMBER'] . '</td>';
+					echo'<td>' . $h['P_DEALPREFIX'] . '</td>';
+					echo'<td class="r">' . $h['P_DEALDATE'] . '</td>';
+					echo'<td class="r">' . $h['P_DEALDATE_TERM'] . '</td>';
+					echo'<td>';
+						if ($h['Wcześniejszy Nr umowy']) echo "Wcześniejszy Nr umowy: ".$h['Wcześniejszy Nr umowy'].'<br />';// TODO: Undefined index
+						if ($h['DEALDESC']) echo "Notatki: ".$h['DEALDESC'].'<br />';
+						echo "Koniecznosc podpisania aneksu lub innego dokumentu: ".$h['ANEX_NEEDED'].'<br />';
+						echo "Data potwierdzenia podpisania aneksu/dokumentu: ".$h['ANEX_CONFIRM_DATE'].'<br />';
+					echo'</td>';
+				echo'</tr>';
+				if (!empty($h['uslugi'])) {
+					// TODO: make TREE by P_ID_SERVICES
+					$items = array();
+					foreach ($h['uslugi'] as $k_id_usluga => $h_suluga) {
+						$h_suluga['sub'] = array();
+						$items[$k_id_usluga] = (object)$h_suluga;
+					}
+					$uslugi_tree = array();// tree root
+					foreach ($items as $k_id => $r) {
+						if ($r->P_ID == 0) {
+							$uslugi_tree[$r->ID] = array();
+							if (array_key_exists($r->P_ID, $items)) {
+								$items[$r->P_ID]->sub[$r->ID] = true;
+							}
+						} else {// array
+							if (array_key_exists($r->P_ID, $items)) {
+								$items[$r->P_ID]->sub[$r->ID] = true;
+							}
+						}
+					}
+					ksort($uslugi_tree);
+
+					// set up has_childrens
+					foreach ($items as $k_id => $r) {
+						$items[$k_id]->has_childrens = !empty($r->sub);
+					}
+
+					foreach ($uslugi_tree as $k_id => $v_childrens) {
+						if (array_key_exists($k_id, $items)) {
+							$uslugi_tree[$k_id] = Tree_Helper__create_tree_rec($k_id, $items);
+						}
+					}
+
+					echo'<tr class="row-'.($t).'">';
+						echo'<td>'."&nbsp;".'</td>';
+						echo'<td colspan="'.($tbl_umowy_cols - 1).'" style="padding:0;">';
+							$tree = new Tree('SERVICES');
+							$tree->set_parent_id_col('P_ID');
+							$tree->set_param('show_item_callback', "tree_callback__show_item_from_SERVICES");
+							$tree->set_param('ajax', "NIE");
+							$tree->set_param('rozwin', true);
+							$tree->show_css();
+							$tree->show_js();
+							$_COOKIE[$tree->cookie_name] = implode(' ', array_keys($items));
+							echo "\n".'<div class="tree-wrap">'."\n";
+							$tree->show_rec_by_tree($uslugi_tree, $items);
+							echo '</div>'."\n";
+						echo'</td>';
+					echo'</tr>';
+				}
+			}
+		}
+		echo'</table>';
+
+		if (!empty($uslugi_l2_nieprzypisane)) {
+			echo'<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
+			echo'<caption>'."Nieprzypisane usługi".'<em>'." (l2)".'</em>'.'</caption>';
+			echo'<head>';
+				echo'<tr>';
+					echo'<th>'."ID".'</th>';
+					echo'<th>'."usługa".'</th>';
+					echo'<th>'."status".'</th>';
+					echo'<th>'."nr umowy".'</th>';
+					echo'<th>'."id oferty".'</th>';
+				echo'</tr>';
+			echo'</head>';
+			foreach ($uslugi_l2_nieprzypisane as $k_id => $v_bool) {
+				$h_usluga = $uslugi_l2[$k_id];
+				echo'<tr>';
+					echo'<td class="r">' . $h_usluga['ID'] . '</td>';
+					echo'<td>' . $h_usluga['description'] . '</td>';
+					echo'<td>' . $h_usluga['A_STATUS_DESC'] . '</td>';
+					echo'<td class="r">' . '<b>';
+						if (array_key_exists($h['ID_DEALS_TABLE'], $umowy_l2)) {
+							echo $umowy_l2[$h['ID_DEALS_TABLE']]['P_DEALNUMBER'];
+						} else {
+							//TODO: get P_DEALNUMBER from DEALS_TABLE where ID = $h['ID_DEALS_TABLE']
+						}
+					echo'</b>' . '</td>';
+					echo'<td class="r">';
+						if ($h_usluga['ID_OFFERS']) {
+							echo'<code>' . $h_usluga['ID_OFFERS'] . '</code>';
+						} else {
+							echo'<span style="color:#f00">'."Brak!".'</span>';
+						}
+					echo'</td>';
+				echo'</tr>';
+			}
+			echo'</table>';
+		}
+
+		Lay_Html_Toggle::end();
+
+		$umowy_l3 = Windykacja_StatsModel::get_umowy_from_l3($user);
+		$ARGS['ZAPISZ'] = true;
+		Lay_Html_Toggle::start("Aktualne usługi".'<em>'." (l3)".'</em>', array('open'=>(($ARGS['ZAPISZ'])? false : true)));
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l3: ';print_r($umowy_l3);echo'</pre>';
+		echo'<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
+		if (empty($umowy_l3)) {
+			echo'<tr><td>'."Brak usług.".'</td></tr>';
+		}
+		else {
+			echo'<thead>';
+				echo'<tr>';
+					echo'<th rowspan="2">'."ID".'</th>';
+					echo'<th rowspan="2">'."status".'</th>';
+					echo'<th rowspan="2">'."data dok".'</th>';
+					echo'<th rowspan="2">'."adres".'</th>';
+					echo'<th rowspan="2">'."usługa".'</th>';
+					echo'<th rowspan="2">'."S_OTHER_INFO".'</th>';
+					echo'<th colspan="2" title="'."ID_BILLING_USERS".'">'. "nr klienta" .'</th>';
+					echo'<th colspan="2" title="'."ID_SERVICES".'">'."nr usługi".'</th>';
+					echo'<th colspan="2" title="'."P_OFFER_ID".'">'."nr oferty".'</th>';
+					echo'<th colspan="2" title="'."P_DEAL_DATE".'">'."data umowy".'</th>';
+					echo'<th colspan="2">'."nr umowy".'</th>';
+					echo'<th colspan="2">'."termin umowy".'</th>';
+					echo'<th colspan="2" title="'."MONTH COST".'">'."abonament".'</th>';
+					echo'<th rowspan="2">'."INICJALY HANDLOWCA".'</th>';
+					echo'<th rowspan="2">'."RODZAJ DZIALANIA HANDLOWEGO".'</th>';
+				echo'</tr>';
+				echo'<tr>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+					echo'<td>'."OLD".'</td>';
+					echo'<td>'."NEW".'</td>';
+				echo'</tr>';
+			echo'</thead>';
+			foreach ($umowy_l3 as $h) {
+				echo'<tr>';
+					echo'<td>' . $h['ID'] . '</td>';
+					echo'<td>' . $h['A_STATUS'] . '</td>';
+					echo'<td>' . '<nobr>' . $h['DATA_DOK'] . '</nobr>' . '</td>';
+					echo'<td>' . $h['S_ADDRESS_STREET'] . '</td>';
+					echo'<td>' . '<b>' . $h['P_SERVICE'] . '</b>' . '</td>';
+					echo'<td>' . $h['S_OTHER_INFO'] . '</td>';
+					echo'<td>' . $h['ID_BILLING_USERS_OLD'] . '</td>';
+					echo'<td>' . $h['ID_BILLING_USERS_NEW'] . '</td>';
+					echo'<td>' . $h['ID_SERVICES_OLD'] . '</td>';
+					echo'<td>' . $h['ID_SERVICES_NEW'] . '</td>';
+					echo'<td>' . $h['P_OFFER_ID_OLD'] . '</td>';
+					echo'<td>' . $h['P_OFFER_ID_NEW'] . '</td>';
+					echo'<td>' . '<nobr>' . $h['P_DEAL_DATE_OLD'] . '</nobr>' . '</td>';
+					echo'<td>' . '<nobr>' . $h['P_DEAL_DATE_NEW'] . '</nobr>' . '</td>';
+					echo'<td>' . $h['P_DEALNUMBER_OLD'] . '</td>';
+					echo'<td>' . $h['P_DEALNUMBER_NEW'] . '</td>';
+					echo'<td>' . '<nobr>' . $h['P_DEALTERM_OLD'] . '</nobr>' . '</td>';
+					echo'<td>' . '<nobr>' . $h['P_DEALTERM_NEW'] . '</nobr>' . '</td>';
+					echo'<td>' . $h['MONTH_COST_OLD'] . '</td>';
+					echo'<td>' . $h['MONTH_COST_NEW'] . '</td>';
+					echo'<td>' . $h['INICJALY_HANDLOWCA'] . '</td>';
+					echo'<td>' . $h['RODZAJ_DZIALANIA_HANDLOWEGO'] . '</td>';
+				echo'</tr>';
+			}
+		}
+		echo'</table>';
+		Lay_Html_Toggle::end();
+	}
+
+	public static function user_historia_platnosci(&$user) {
+		?>
+		<style type="text/css">
+            .hide .to-hide{display:none;}
+            .may-hide .btn-hide{display:inline;padding:0 5px;border:1px solid #bbb;}
+            .may-hide .btn-show{display:none;padding:0 5px;border:1px solid #bbb;}
+            .hide .btn-hide{display:none;}
+            .hide .btn-show{display:inline;}
+		</style>
+		<?php
+		Lay_Html_Toggle::show_js();
+
+		$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user);
+
+		// add events
+		$umowy_l2 = Windykacja_StatsModel::get_umowy_from_l2($user);
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billing_docs ';print_r($billing_docs);echo'</pre>';
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billing_docs ';print_r(reset($billing_docs));echo'</pre>';
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l2 ';print_r($umowy_l2);echo'</pre>';
+		if (!empty($umowy_l2)) {
+			foreach ($umowy_l2 as $h) {
+				$billing_docs->add_event($h['P_DEALDATE'], 'UMOWA', $h);
+
+				if ($h['P_DEALDATE_TERM'] != '0000-00-00') {// < date('Y-m-d')) {
+					$billing_docs->add_event($h['P_DEALDATE_TERM'], 'KONIEC UMOWY', $h);
+				}
+			}
+		}
+
+		$user_hist_events = Windykacja_StatsHelper::get_user_hist_status_events($user);
+		if (!empty($user_hist_events)) {
+			foreach ($user_hist_events as $v_hist) {
+				$bill_doc = (array)$v_hist;
+				$billing_docs->add_event($v_hist->A_STATUS_UPDATE_DATE, 'HIST_STATUS', $bill_doc);
+			}
+		}
+
+		$user_hist_events = Windykacja_StatsHelper::get_user_hist_phone_events($user);
+		if (!empty($user_hist_events)) {
+			foreach ($user_hist_events as $v_hist) {
+				$bill_doc = (array)$v_hist;
+				$billing_docs->add_event(substr($v_hist->A_RECORD_UPDATE_DATE, 0, 10), 'HIST_PHONE', $bill_doc);
+			}
+		}
+
+		$user_hist_events = Windykacja_StatsHelper::get_user_bad_address_events($user);
+		if (!empty($user_hist_events)) {
+			foreach ($user_hist_events as $v_hist) {
+				$bill_doc = (array)$v_hist;
+				$billing_docs->add_event(substr($v_hist->A_RECORD_UPDATE_DATE, 0, 10), 'HIST_BAD_ADDRESS', $bill_doc);
+			}
+		}
+
+		// add today
+		$bill_doc = array();
+		$bill_doc['saldo'] = $billing_docs->get_saldo();
+		$billing_docs->add_event(date('Y-m-d'), 'TODAY', $bill_doc);
+
+		$billing_docs->sort_docs();
+		//$billing_docs = array_reverse($billing_docs, true);
+		//echo'<pre style="max-height:300px;overflow:auto;border:1px solid red;">billing_docs: ';print_r($billing_docs);echo'</pre>';
+
+		$billing_docs_arr = $billing_docs->get_docs();
+
+		$types_finanse = array();
+		$types_finanse[] = 'KW';
+		$types_finanse[] = 'KP';
+		$types_finanse[] = 'WB_MASS';
+		$types_finanse[] = 'WB';
+		$types_finanse[] = 'KORV';
+		$types_finanse[] = 'FVAT';
+
+		$saldo_all = 0;
+		$out_tbl = array();
+		//echo'<pre>';print_r($billing_docs_arr);echo'</pre>';
+		foreach ($billing_docs_arr as $k_data => $v_docs_arr) {
+			foreach ($v_docs_arr as $k_ind => $v_doc) {
+				$out_tr = array();
+				$out_tr['data'] = $k_data;
+				if ($k_data == date("Y-m-d")) $out_tr['class'] = 'today';
+				$out_tr['ID'] = '';
+				$out_tr['nr'] = '';
+				$out_tr['winien'] = '';
+				$out_tr['ma'] = '';
+				$out_tr['saldo'] = '';
+				$out_tr['saldo_all'] = '';
+				if ($v_doc->get_class() == 'BILLING') {
+					$saldo_all += $v_doc->get_saldo();
+					$out_tr['ID'] = $v_doc->get_type();
+					$type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
+					if ($type_desc) {
+						if ($v_doc->get_type() == 'FVAT') $type_desc .= "\n Wystawiona: ".$v_doc->get('BILL_DATE')."\n Termin płatności: ".$v_doc->get('PAYMENT_TERM');
+						$out_tr['ID'] = '<span title="'.$type_desc.'">'.$out_tr['ID'].'</span>';
+						// TODO: podglad faktury
+						//if ($h['type'] == 'FVAT') $out_tr['ID'] .= ' <a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&_user_id=".$user->ID."&task=view_faktura&id=".$h['ID'].'" target="_blank">'.'<img src="'."icon/search.png".'" alt="'."U".'" title="'."Podgląd faktury".'" />'.'</a>';
+					}
+					$docNr = $v_doc->get('nr');
+					$docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
+					/* links fomr l1:
+					 *   FV: https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura&adm=edit&uid=4014&fpos=&dz=&close=0&doc=799413&doctype=1
+					 *   KOR: https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura_korekta&adm=edit&uid=4014&fpos=&dz=&close=0&doc=809557&doctype=3
+					 */
+					if ('FVAT' == $v_doc->get_type()) {
+						$out_tr['ID'] .= ' <a href="index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=' . $docNr . '" target="_blank">'."({$docNrLabel})".'</a>';
+					}
+					else if ('KORV' == $v_doc->get_type()) {
+						// https://biuro.biall-net.pl/dev-pl/se-master/index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=809557
+						$remoteFvNum = $v_doc->get('FV_NUMBER');
+						$korNr = $v_doc->get('ID_BILLING_NUMBERS');
+						$korTitle = "Korekta dotycząca faktury nr: {$remoteFvNum}";
+						$out_tr['ID'] .= ' <a href="index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=' . $korNr . '" target="_blank" title="'.$korTitle.'">'."({$docNrLabel})".'</a>';
+					}
+					$out_tr['nr'] = $docNrLabel;
+					$out_tr['winien'] = number_format($v_doc->get('WINIEN'), 2, ',', ' ');
+					$out_tr['ma'] = number_format($v_doc->get('MA'), 2, ',', ' ');
+					$out_tr['saldo'] = number_format($v_doc->get_saldo(), 2, ',', ' ');
+					$out_tr['saldo_all'] = number_format($saldo_all, 2, ',', ' ');
+
+					// style
+					if ($out_tr['winien'] == '0,00') $out_tr['winien'] = '<span style="color:#666;">' . $out_tr['winien'] . '</span>';
+					if ($out_tr['ma'] == '0,00') $out_tr['ma'] = '<span style="color:#666;">' . $out_tr['ma'] . '</span>';
+				}
+				else if ($v_doc->get_class() == 'EVENT') {
+					if ($v_doc->get_type() == 'TODAY') {
+						$out_tr['class'] = 'today';
+						$vDocSaldoData = $v_doc->get_data();
+						$v_doc_saldo = V::get('saldo', '', $vDocSaldoData);
+						$out_tr['saldo_all'] = number_format($v_doc_saldo, 2, ',', ' ');
+					}
+					else if ($v_doc->get_type() == 'HIST_STATUS') {
+						// search for koresp files
+						// TODO: mv to ::get_koresp_file($id_koresp);
+						$id_koresp = intval($v_doc->get('ID_KORESP'));
+						$found_files = array();
+						if(0){// turn off - old server
+							$CNF = new stdClass();
+							$CNF->koresp_dir = '/home/samba/BIALL-NET/PISMA/OUT';
+							$CNF->koresp_www_path = '/se-dev/PISMA/OUT';
+							if ($id_koresp > 0) {
+								$pattern = $CNF->koresp_dir . '/' . '*.' . $id_koresp . '.pdf';
+								$file_tmp_list = glob($pattern);//, GLOB_NOSORT);
+								if (!empty($file_tmp_list)) {
+									foreach ($file_tmp_list as $v_file) {
+										$test_file = explode('/', $v_file);
+										$test_file = end($test_file);
+										$found_files[] = $CNF->koresp_www_path . '/' . $test_file;
+									}
+								}
+							}
+						//	return $found_files;
+						}
+						switch ($v_doc->get('A_STATUS')) {
+							case 'WAITING':
+								$out_tr['add'] = "powrót do oczekujących";
+								break;
+
+							case 'waiting-wezwanie2':
+								// TODO: get('LAST_ID_KORESP_WEZWANIE1')
+								$out_tr['add'] = "wezwanie do zapłaty - ID_KORESP: <b>".$v_doc->get('ID_KORESP')."</b> <em>(termin: ".$v_doc->get('PAY_TERM').")</em> ";
+								break;
+
+							case 'waiting-krd':
+								$out_tr['add'] = "wezwanie do zapłaty ost. - ID_KORESP: <b>".$v_doc->get('ID_KORESP')."</b> <em>(termin: ".$v_doc->get('PAY_TERM').")</em> ";
+								break;
+
+							case 'N/S;':
+								$out_tr['add'] = "ID_KORESP: <b>".$v_doc->get('ID_KORESP')."</b> <em>(" . $v_doc->get('K_ZAWARTOS') . ")</em>";// TODO: get opis from koresp
+								//echo '('.$v_doc->get('ID_KORESP').', '.$v_doc->get('K_ZAWARTOS').'='.substr($v_doc->get('K_ZAWARTOS'), 0, strlen('rozwiazanie umowy')).')';
+								if ($v_doc->get('ID_KORESP') > 0 && substr($v_doc->get('params'), 0, strlen('rozwiazanie umowy')) == 'rozwiazanie umowy') {
+									$out_tr['add'] .= " " . '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy_print"."&user_id={$user->ID}&id_koresp=".$v_doc->get('ID_KORESP').'" target="_blank" title="' . "Generuj druk rozwiązania umowy" . '">' . "druk" . '</a>';
+								}
+								break;
+
+							default:
+								$out_tr['add'] = "zmiana statusu na: ".$v_doc->get('A_STATUS')." ";
+						}
+						if ($id_koresp > 0) {
+							if (!empty($out_tr['add']) && !empty($found_files)) {
+								$add_link_koresp = reset($found_files);// first file from koresp
+								$out_tr['add'] .= " " . '<a href="' . $add_link_koresp . '" target="_blank">' . "P" . '</a>';
+							}
+							//$koresp_edit_link = "?MENU_INIT=IN7_DZIENNIK_KORESP_EDIT&ARG1=EDIT&ARG1_VAL=" . $id_koresp;
+							Lib::loadClass('ProcesHelper');
+							$zasobKorespID = ProcesHelper::getZasobTableID('IN7_DZIENNIK_KORESP');
+							$koresp_edit_link = "index.php?MENU_INIT=VIEWTABLE_AJAX&ZASOB_ID={$zasobKorespID}#EDIT/{$id_koresp}";
+							$out_tr['add'] .= " " . '<a href="' . $koresp_edit_link . '" title="' . "Edycja KORESP. ({$id_koresp})" . '" target="_blank">' . "KOR" . '</a>';
+						}
+					}
+					else if ($v_doc->get_type() == 'HIST_PHONE') {
+						$date = $v_doc->get('PAY_TERM');
+						if ($date == 'N/S;') $date = '';
+						$lastPhoneStatus = $v_doc->get('LAST_PHONE_STATUS');
+						if ($lastPhoneStatus == 'N/S;') $lastPhoneStatus = '';
+						$lastSmsStatus = $v_doc->get('LAST_SMS_STATUS');
+						if ($lastSmsStatus == 'N/S;') $lastSmsStatus = '';
+						$lastMailStatus = $v_doc->get('LAST_MAIL_STATUS');
+						if ($lastMailStatus == 'N/S;') $lastMailStatus = '';
+						$lastUpdateDate = $v_doc->get('A_RECORD_UPDATE_DATE');
+						if (!empty($lastPhoneStatus)) {
+							switch ($lastPhoneStatus) {
+								case 'nie_zaplaci':
+									$out_tr['add'] = "nie zapłaci";
+									break;
+
+								case 'zaplaci_w_terminie':
+									$out_tr['add'] = "zapłaci w terminie {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
+									break;
+
+								case 'zaplaci_za_1mc':
+									$out_tr['add'] = "zapłaci miesiąc później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
+									break;
+
+								case 'zaplaci_za_2mc':
+									$out_tr['add'] = "zapłaci 2 miesiące później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
+									break;
+
+								case 'zaplaci_za_3mc':
+									$out_tr['add'] = "zapłaci 3 miesiące później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
+									break;
+
+								default:
+									$out_tr['add'] = "kontakt z klientem: {$lastPhoneStatus} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
+							}
+						} else if (!empty($lastSmsStatus)) {
+							$lastSmsId = $v_doc->get('LAST_SMS_MSG_ID');
+							$out_tr['add'] = "SMS: {$lastSmsStatus} " . '<em style="font-size:small;" title="' . "(wysłano {$lastUpdateDate}, {$lastSmsId})" . '">' . "(wysłano {$lastUpdateDate})" . '</em>';
+						} else if (!empty($lastMailStatus)) {
+							$lastMailId = $v_doc->get('LAST_MAIL_MSG_ID');
+							$out_tr['add'] = "MAIL: {$lastMailStatus} " . '<em style="font-size:small;" title="' . "(wysłano {$lastUpdateDate}, {$lastMailId})" . '">' . "(wysłano {$lastUpdateDate})" . '</em>';
+						}
+					} else if ($v_doc->get_type() == 'HIST_BAD_ADDRESS') {
+						if ($v_doc->get('BAD_ADDRESS')) {
+							$out_tr['add'] = "błędny adres zameldowania ";
+						} else {
+							$out_tr['add'] = "poprawa adresu zameldowania ";
+						}
+						if ($v_doc->get('ID_KORESP') > 0) {
+							$out_tr['add'] .= " - ID Koresp. (" . '<a href="' . "index.php?MENU_INIT=IN7_DZIENNIK_KORESP_EDIT&ARG1=EDIT&ARG1_VAL=" . $v_doc->get('ID_KORESP') . '" target="_blank">' . $v_doc->get('ID_KORESP') . '</a>' . ")";
+						}
+					} else {
+						$out_tr['ID'] = $v_doc->get_type().' <code style="font-size:10px">'."(".$v_doc->get('ID').")".'</code>';// TODO: dla KP,KW: ID_BILLING_NUMBERS zamiast ID
+						if ($v_doc->get_type() == 'UMOWA') {
+							$out_tr['add'] = "umowa nr <b>".$v_doc->get('P_DEALNUMBER')."</b> <em>(termin ".$v_doc->get('P_DEALDATE_TERM').")</em>";
+						} else if ($v_doc->get_type() == 'KONIEC UMOWY') {
+							$out_tr['add'] = "zakończenie umowy nr <b>".$v_doc->get('P_DEALNUMBER')."</b> <em>(z dnia ".$v_doc->get('P_DEALDATE').")</em>";
+						}
+					}
+				}
+				//$out_tbl[] = $out_tr;// add to the end
+				array_unshift($out_tbl, $out_tr);// add to the begining
+			}
+		}
+
+		echo'<style type="text/css">'."
+            .tbl-windykacja td{padding:0 5px;}
+            .tbl-windykacja .cell-data{white-space:nowrap;}
+            .tbl-windykacja .cell-winien{text-align:right;}
+            .tbl-windykacja .cell-ma{text-align:right;}
+            .tbl-windykacja .cell-saldo{text-align:right;}
+            .tbl-windykacja .cell-saldo_all{text-align:right; white-space:nowrap; background-color:#E5E5E5;}
+            .tbl-windykacja .cell-nr{font-family:monospace;text-align:right;}
+            .tbl-windykacja .change-year td{border-top:3px solid #00f;}
+            .tbl-windykacja .today td{background:#FFFF98;}
+            .tbl-windykacja .cell-add em{color:#666;}
+		".'</style>';
+		$last_year = '';
+		$cols = array();
+		$cols['data'] = "data";
+		$cols['ID'] = "ID";
+		$cols['nr'] = "nr";
+		$cols['winien'] = "winien";
+		$cols['ma'] = "ma";
+		//$cols['saldo'] = "saldo";
+		$cols['saldo_all'] = "saldo";
+		$cols['add'] = "uwagi";
+		?>
+		<h4>Historia klienta <small>(l1)</small></h4>
+		<table border="1" class="tbl-view tbl-windykacja" cellspacing="0" cellpadding="0">
+		<thead>
+			<tr>
+			<th>rok</th>
+			<?php foreach ($cols as $colName => $colLabel) : ?>
+				<th><?php echo $colLabel; ?></th>
+			<?php endforeach; ?>
+			</tr>
+		</thead>
+		<?php
+		foreach ($out_tbl as $out_tr) {
+			$change_year = false;
+			$k_data = $out_tr['data'];
+			$rok = substr($k_data, 0, 4);
+			if ($rok != $last_year) {
+				$change_year = true;
+			}
+			$cls = array();
+			if ($change_year) $cls[] = 'change-year';
+			if ($add_cls = V::get('class', '', $out_tr)) $cls[] = $add_cls;
+			$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
+			echo'<tr'.$cls.'>';
+			echo'<td>';
+			echo ($change_year)? $rok : "&nbsp;";
+			echo'</td>';
+			$last_year = $rok;
+			foreach ($cols as $col_name => $col_label) {
+			//foreach ($out_tr as $k_col_name => $v_val) {
+				if (array_key_exists($col_name, $out_tr)) {
+					echo'<td class="'."cell-".$col_name.'">' . $out_tr[$col_name] . '</td>';
+				} else {
+					echo'<td>'."&nbsp;".'</td>';
+				}
+			}
+			echo'</tr>';
+		}
+		echo'</table>';
+		echo'<br />';
+		echo'<br />';
+		Windykacja_StatsHelper::update_stats($user, $billing_docs);
+
+		{// srv hist
+			$srvHist = array();
+			$db = DB::getDB();
+			$sql = "
+                select fvPos.`ID` as fvPos__ID
+                    , fvPos.`DATE_FROM` as fvPos__DATE_FROM
+                    , fvPos.`DATE_TO` as fvPos__DATE_TO
+                    , fvPos.`ID_SERVICES` as fvPos__ID_SERVICES
+                    , ( select srv.`NAME_LIST_SERVICES` from `billing2013`.`SERVICES` srv where srv.`ID` = fvPos.`ID_SERVICES` limit 1 ) as srv__NAME_LIST_SERVICES
+                    , fvPos.`AMMOUNT` as fvPos__AMMOUNT
+                    , fvPos.`PRICE` as fvPos__PRICE
+                    , fvPos.`VAT` as fvPos__VAT
+            --		, fvPos.`ID_BILLS_FVAT` as fvPos__ID_BILLS_FVAT
+                    , fvPos.`DESCR` as fvPos__DESCR
+            --		, fvPos.`id_list_services` as fvPos__id_list_services
+            --		, fvPos.`id_list_sww` as fvPos__id_list_sww
+            --		, fvPos.`VAT_NAME` as fvPos__VAT_NAME
+            --		, fvPos.`ID_OFFERS` as fvPos__ID_OFFERS
+            --		, 'fv', fv.*
+            --		, fv.`ID` as fv__ID
+                    , fv.`ID_BILLING_NUMBERS` as fv__ID_BILLING_NUMBERS
+            --		, fv.`ID_BILLING_USERS` as fv__ID_BILLING_USERS
+            --		, fv.`id_owner` as fv__id_owner
+                    , fv.`BILL_DATE` as fv__BILL_DATE
+                    , fv.`SELL_DATE` as fv__SELL_DATE
+            --		, fv.`TIMESTAMP` as fv__TIMESTAMP
+                    , fv.`PAYMENT_TERM` as fv__PAYMENT_TERM
+            --		, fv.`PAYMENT_TYPE` as fv__PAYMENT_TYPE
+            --		, fv.`ID_CURRENCY` as fv__ID_CURRENCY
+            --		, fv.`ID_FK_DEKRET` as fv__ID_FK_DEKRET
+            --		, fv.`ID_FK_ROZRACH` as fv__ID_FK_ROZRACH
+            --		, fv.`OPEN` as fv__OPEN
+            --		, fv.`FK_ZAKSIEG` as fv__FK_ZAKSIEG
+                    , fv.`IF_KORV` as fv__IF_KORV
+            --		, 'fvNum', fvNum.*
+            --		, fvNum.`ID` as fvNum__ID
+            --		, fvNum.`TIMESTAMP` as fvNum__TIMESTAMP
+            --		, fvNum.`ID_BILLING_NUMBERS_TYPE` as fvNum__ID_BILLING_NUMBERS_TYPE
+            --		, fvNum.`ID_BILLING_PREFIXES` as fvNum__ID_BILLING_PREFIXES
+                    , fvNum.`NUMBER` as fvNum__NUMBER
+            --		, fvNum.`ID_BILLING_USERS` as fvNum__ID_BILLING_USERS
+                    , fvNum.`FOREIGN_ID_BILLING_NUMBERS` as fvNum__FOREIGN_ID_BILLING_NUMBERS
+            --		, fvNum.`U_ID` as fvNum__U_ID
+            --		, fvNum.`BILLING_OWNER` as fvNum__BILLING_OWNER
+            --		, 'korPos', korPos.*
+                    , korPos.`ID` as korPos__ID
+            --		, korPos.`ID_BILLS_FVAT` as korPos__ID_BILLS_FVAT
+                    , korPos.`DESCR` as korPos__DESCR
+                    , korPos.`ID_SERVICES` as korPos__ID_SERVICES
+                    , korPos.`DATE_FROM` as korPos__DATE_FROM
+                    , korPos.`DATE_TO` as korPos__DATE_TO
+                    , korPos.`AMMOUNT` as korPos__AMMOUNT
+                    , korPos.`PRICE` as korPos__PRICE
+                    , korPos.`VAT` as korPos__VAT
+            --		, korPos.`id_list_services` as korPos__id_list_services
+            --		, korPos.`id_list_sww` as korPos__id_list_sww
+            --		, korPos.`VAT_NAME` as korPos__VAT_NAME
+            --		, korPos.`N_DESCR` as korPos__N_DESCR
+            --		, korPos.`N_ID_SERVICES` as korPos__N_ID_SERVICES
+            --		, korPos.`N_DATE_FROM` as korPos__N_DATE_FROM
+            --		, korPos.`N_DATE_TO` as korPos__N_DATE_TO
+            --		, korPos.`N_AMMOUNT` as korPos__N_AMMOUNT
+            --		, korPos.`N_PRICE` as korPos__N_PRICE
+            --		, korPos.`N_VAT` as korPos__N_VAT
+            --		, korPos.`N_id_list_services` as korPos__N_id_list_services
+            --		, korPos.`N_id_list_sww` as korPos__N_id_list_sww
+            --		, korPos.`N_VAT_NAME` as korPos__N_VAT_NAME
+                    , korPos.`TYP_KOREKTY` as korPos__TYP_KOREKTY
+                from `billing2013`.`BILLS_FVAT_POS` fvPos
+                    join `billing2013`.`BILLS_FVAT` fv on ( fv.`ID` = fvPos.`ID_BILLS_FVAT` )
+                    join `billing2013`.`BILLING_NUMBERS` fvNum on ( fvNum.`ID` = fv.`ID_BILLING_NUMBERS` )
+                    left join `billing2013`.`BILLS_KORV_POS` korPos on (
+                        korPos.`ID_BILLS_FVAT` = (
+                            select kor.`ID`
+                            from `billing2013`.`BILLS_KORV` kor
+                            where kor.`REMOTE_ID_BILLING_NUMBERS` = fvNum.`ID`
+                        )
+                        and korPos.`ID_SERVICES` = fvPos.`ID_SERVICES`
+                    )
+                where fv.`ID_BILLING_USERS` = '{$user->ID}'
+                order by fv.`ID` DESC
+			";
+			//echo'<pre>srvHist:sql: ';print_r($sql);echo'</pre>';
+			$idxDates = array();
+			$idxSrv = array();
+			$idxHasKor = array();
+			$res = $db->query($sql);
+			while ($r = $db->fetch($res)) {
+				$srvHist[$r->fvPos__ID] = $r;
+				$month = substr($r->fv__BILL_DATE, 0, 7);
+				$idSrv = $r->fvPos__ID_SERVICES;
+				if (!empty($r->fv__BILL_DATE)) {
+					if (!array_key_exists($month, $idxDates)) $idxDates[$month] = array();
+					$idxDates[$month][$r->fvPos__ID] = $idSrv;
+				}
+				if (!empty($idSrv)) {
+					$idxSrv[$idSrv] = $r->srv__NAME_LIST_SERVICES;
+				}
+				if ($r->korPos__ID > 0) {
+					$isKorZero = ($r->korPos__AMMOUNT * $r->korPos__PRICE == -1 * $r->fvPos__AMMOUNT * $r->fvPos__PRICE);
+					$idxHasKor[$month][$idSrv][] = $isKorZero;
+				}
+			}
+			krsort($idxDates);
+			?>
+		<div class="container">
+			<script>
+				function showHideSrvHist() {
+					jQuery('#srvHist').toggle();
+					return false;
+				}
+			</script>
+			<h3>Historia usług <button class="btn btn-xs btn-danger" onclick="return showHideSrvHist()">+/-</button></h3>
+			<table class="table table-bordered" id="srvHist" style="display:none">
+				<thead>
+					<tr>
+						<th style="padding:2px"><nobr class="pull-right">Usługi</nobr></th>
+						<?php foreach ($idxSrv as $idSrv => $srvType) : ?>
+							<th style="padding:2px"><?php echo $idSrv; ?></th>
+						<?php endforeach; ?>
+					</tr>
+					<tr>
+						<th style="padding:2px"><nobr>Data</nobr></th>
+						<?php foreach ($idxSrv as $idSrv => $srvType) : ?>
+							<th style="padding:2px"><?php echo $srvType; ?></th>
+						<?php endforeach; ?>
+					</tr>
+				</thead>
+				<tbody>
+					<?php foreach ($idxDates as $month => $posIds) : ?>
+						<tr>
+							<td style="padding:2px"><?php echo $month; ?></td>
+							<?php foreach ($idxSrv as $idSrv => $srvType) : ?>
+							<?php if (in_array($idSrv, $posIds)) : ?>
+								<?php if (!empty($idxHasKor[$month][$idSrv])) : ?>
+									<?php if (count($idxHasKor[$month][$idSrv]) > 1) : ?>
+										<td style="padding:2px" class="danger"><b title="Faktury i Korekty w tym na 0"><?php echo count($idxHasKor[$month][$idSrv]); ?> * FV (FV - KOR = 0)</b></td>
+									<?php elseif (true == $idxHasKor[$month][$idSrv][0]) : ?>
+										<td style="padding:2px" class="danger"><b title="Faktura i Korekta na 0">FV - KOR = 0</b></td>
+									<?php else : ?>
+										<td style="padding:2px" class="warning"><b title="Faktura i Korekta">FV - KOR &gt; 0</b></td>
+									<?php endif; ?>
+								<?php else : ?>
+									<td style="padding:2px" class="success"><b title="brak korekty">FV</b></td>
+								<?php endif; ?>
+							<?php else : ?>
+								<td style="padding:2px"><i class="muted">---</i></td>
+							<?php endif; ?>
+						<?php endforeach; ?>
+						</tr>
+					<?php endforeach; ?>
+				</tbody>
+			</table>
+		</div>
+			<?php
+			//echo'<pre>idxHasKor: ';print_r($idxHasKor);echo'</pre>';
+			//echo'<pre>idxDates: ';print_r($idxDates);echo'</pre>';
+			//echo'<pre>idxSrv: ';print_r($idxSrv);echo'</pre>';
+			//echo'<pre>srvHist: ';print_r($srvHist);echo'</pre>';
+		}// srv hist
+	}
+
+	public static function view_faktura($faktura_id) {
+		// https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=make_faktura&adm=edit&uid=11381&fpos=&dz=
+		// https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura&adm=edit&uid=11381&fpos=&dz=&close=0&doc=483930&doctype=1
+		echo'{'.$faktura_id.'}';
+	}
+
+	public static function zadluzenia(&$user) {
+		$THIS_DATA_DO = null;// TODO: pobierac z PAY_TERM z tabeli USERS2_WINDYKACJA_STATUS
+		$post_sent = (!empty($_POST['sbmt']));
+		$post_DATA_DO = (isset($_POST['DATA_DO']))? $_POST['DATA_DO'] : date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
+		if (!$post_sent) {
+			echo'<table style="margin:10px 50px;padding:20px;border:1px solid blue;"><tr><td>';
+			echo'<form action="" method="post">';
+				$post_DATA_DO = (isset($_POST['DATA_DO']) && strlen($_POST['DATA_DO']) == 10)? $_POST['DATA_DO'] : date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
+				echo'<p>'."Termin płatności: ".'</p>';
+				echo'<input type="text" name="'."DATA_DO".'" value="'.$post_DATA_DO.'" />';
+				echo'<input type="submit" name="sbmt" value="'."Wyslij".'" />';
+			echo'</form>';
+			echo'</td></tr></table>';
+			return;
+		} else {
+			$THIS_DATA_DO = $post_DATA_DO;
+		}
+		self::wezwanie($user, $THIS_DATA_DO);
+	}
+
+	public static function wezwanie_ostateczne(&$user, $wezwanie_termin) {
+		self::wezwanie($user, $wezwanie_termin, true);
+	}
+
+	public static function zestawienie_vectra_nadplaty() {
+		$usersList = array();
+		$db = DB::getDB();
+		$sql_select = "
+				c.`ID` as ID
+				, c.`ID` as id_users
+				, c.`P_NAME`
+				, c.`P_NAME_SECOND`
+				, c.`P_ADDRESS_STREET`
+				, c.`P_ADDRESS_HOME`
+				, c.`P_ADDRESS_HOUSE`
+				, c.`P_ADDRESS_CITY`
+				, c.`P_ADDRESS_POST_CODE`
+				, c.`P_ADDRESS_REGION`
+				, c.`P_PESEL`
+				, c.`P_PHONE`
+				, c.`P_OTHER_DOC`
+				, c.`user_mail_contact`
+				, c.`is_firma`
+				, w.`ID` as WINDYKACJA_ID
+				, w.`ID_BILLING_USERS`
+				, w.`A_STATUS`
+				, w.`A_STATUS_UPDATE_DATE`
+				, w.`USER_PAY_TERM_ADD`
+				, w.`L_APPOITMENT_DATE`
+				, w.`L_APPOITMENT_USER`
+				, w.`L_APPOITMENT_INFO`
+				, w.`PAY_DATE`
+				, w.`PAY_DATE_FIRST_FVAT`
+				, w.`PAY_TERM`
+				, w.`PAY_SALDO`
+				, w.`PAY_FVAT`
+				, w.`wezwanie1_DATE`
+				, w.`wezwanie2_DATE`
+				, w.`ID_KORESP`
+				, w.`LAST_PAY_DATE`
+				, w.`BAD_ADDRESS`
+				, c.`STATUS`
+				, c.`BILLING_OWNER`
+				, w.`NR_SPRAWY_KRD`
+				, w.`NR_SPRAWY_SAD`
+				, w.`NR_SPRAWY_KOMORNIK`
+				, w.`LAST_FVAT_PAY_TERM`
+		";
+		$sqlWhereAdd = "
+			and (w.`LAST_FVAT_PAY_TERM`>='2014-12-01'
+				or (	w.`LAST_FVAT_PAY_TERM`='0000-00-00'
+					and w.`LAST_FVAT_SELL_DATE`>='2014-12-01'
+				)
+			)
+			and c.`ID_BILLING_PREFIXES` in('0','1')
+			and c.`BILLING_OWNER` in('1')
+		";
+		$sql = "select {$sql_select}
+			from `USERS2_WINDYKACJA_STATUS` as w
+				join `COMPANIES` as c on(c.`ID`=w.`ID_BILLING_USERS`)
+			where c.`A_ADM_COMPANY`='19994_PODMIOT_Vectra_wlasciciel'
+				{$sqlWhereAdd}
+		";
+		if (V::get('DBG_SQL', '', $_GET)) {
+			header('Content-Type: text/plain; charset=utf-8');
+			echo $sql;
+			exit;
+		}
+		$res = $db->query($sql);
+		if ($db->has_errors()) {
+			print_r($db->get_errors());
+			die('die L.' . __LINE__);
+		}
+		while ($r = $db->fetch($res)) {
+			$usersList[$r->ID_BILLING_USERS] = $r;
+		}
+		if (V::get('DBG_ILE', '', $_GET)) {
+			echo '<p>ilosc: ' . count($usersList) . '</p>' . '<pre style="max-height:200px;overflow:auto">';
+				print_r($usersList);
+			echo '</pre>';
+			exit;
+		}
+		if (V::get('DBG_IDS', '', $_GET)) {
+			header('Content-Type: text/plain; charset=utf-8');
+			echo 'ilosc: ' . count($usersList) . "\n";
+			echo implode("\n", array_keys($usersList));
+			exit;
+		}
+		$limit = V::get('DBG_LOOP_LIMIT', 100000, $_GET, 'int');
+		if(V::get('DBG_LOOP_LIMIT', 0, $_GET, 'int')){echo "Loimit: {$limit}\n";}
+		$date_limit = V::get('DATE_LIMIT', date("Y-m-d"), $_GET);
+		$date_limit_from = '2014-12-01';
+		$csvFileName = "Zestawienie-nadplaty-do-{$date_limit}";
+		header('Content-Type: text/csv; charset=utf-8');
+		header("Content-Disposition: attachment; filename={$csvFileName}.csv");
+		$showCsvHeader = true;
+		foreach ($usersList as $userId => $user) {
+			$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user, $date_limit);
+			$billing_docs->sort_docs();
+			$saldo = $billing_docs->get_saldo();
+			if ($saldo <= 0) {
+				continue;
+			}
+			if(V::get('DBG_LOOP', '', $_GET)){echo "{$userId}:{$saldo}\n";}
+			$incomeDocs = $billing_docs->getLastIncomeDocsForSaldo($saldo);
+			if(V::get('DBG_LOOP', '', $_GET)){print_r($incomeDocs);echo "\n";}
+			//Windykacja_StatsModel::update_doc_number($incomeDocs);
+
+			$out_tbl = array();
+			foreach ($incomeDocs as $v_fvat) {
+				$out_tr = array();
+				$out_tr['ID'] = $v_fvat['ID'];
+				$out_tr['nr'] = $v_fvat['NUMBER'] . '/' . $v_fvat['ID_BILLING_PREFIXES'];
+				$out_tr['wplata'] = number_format($v_fvat['MA'], 2, '.', '');
+				$out_tr['data'] = $v_fvat['BILL_DATE'];
+				$out_tr['pozostalo'] = number_format($v_fvat['MA_POZOSTALO'], 2, '.', '');
+				array_push($out_tbl, $out_tr);// add to the begining
+			}
+
+			{// csv
+				$csvLine = array();
+				$csvLine[] = '"id klienta"';
+				$csvLine[] = '"nr dokumentu"';
+				$csvLine[] = '"kwota brutto"';
+				$csvLine[] = '"data wpłaty"';
+				$csvLine[] = '"pozostało"';
+				if ($showCsvHeader) {
+					echo implode(';', $csvLine) . ";\n";
+					$showCsvHeader = false;
+				}
+				foreach ($out_tbl as $tr) {
+					$csvLine = array();
+					$csvLine[] = '"' . $userId . '"';
+					$csvLine[] = '"' . $tr['nr'] . '"';
+					$csvLine[] = '"' . $tr['wplata'] . '"';
+					$csvLine[] = '"' . $tr['data'] . '"';
+					$csvLine[] = '"' . $tr['pozostalo'] . '"';
+					echo implode(';', $csvLine) . ";\n";
+				}
+			}
+			//echo '<pre style="max-height:200px;overflow:auto">incomeDocs: ';print_r($incomeDocs);echo'</pre>';
+			//echo '<pre style="max-height:200px;overflow:auto">ilosc('.count($out_tbl).') ' . "client({$userId}): ";print_r($out_tbl);echo'</pre>';
+			if (--$limit < 0) {
+				echo '<br>BREAK';
+				break;
+			}
+		}
+		exit;
+	}
+
+	public static function zestawienie_vectra_zadluzenia() {
+		$usersList = array();
+		$db = DB::getDB();
+		$sql_select = "
+				c.`ID` as ID
+				, c.`ID` as id_users
+				, c.`P_NAME`
+				, c.`P_NAME_SECOND`
+				, c.`P_ADDRESS_STREET`
+				, c.`P_ADDRESS_HOME`
+				, c.`P_ADDRESS_HOUSE`
+				, c.`P_ADDRESS_CITY`
+				, c.`P_ADDRESS_POST_CODE`
+				, c.`P_ADDRESS_REGION`
+				, c.`P_PESEL`
+				, c.`P_PHONE`
+				, c.`P_OTHER_DOC`
+				, c.`user_mail_contact`
+				, c.`is_firma`
+				, w.`ID` as WINDYKACJA_ID
+				, w.`ID_BILLING_USERS`
+				, w.`A_STATUS`
+				, w.`A_STATUS_UPDATE_DATE`
+				, w.`USER_PAY_TERM_ADD`
+				, w.`L_APPOITMENT_DATE`
+				, w.`L_APPOITMENT_USER`
+				, w.`L_APPOITMENT_INFO`
+				, w.`PAY_DATE`
+				, w.`PAY_DATE_FIRST_FVAT`
+				, w.`PAY_TERM`
+				, w.`PAY_SALDO`
+				, w.`PAY_FVAT`
+				, w.`wezwanie1_DATE`
+				, w.`wezwanie2_DATE`
+				, w.`ID_KORESP`
+				, w.`LAST_PAY_DATE`
+				, w.`BAD_ADDRESS`
+				, c.`STATUS`
+				, c.`BILLING_OWNER`
+				, w.`NR_SPRAWY_KRD`
+				, w.`NR_SPRAWY_SAD`
+				, w.`NR_SPRAWY_KOMORNIK`
+				, w.`LAST_FVAT_PAY_TERM`
+		";
+		$sqlWhereAdd = "
+			and (w.`LAST_FVAT_PAY_TERM`>='2014-12-01'
+				or (	w.`LAST_FVAT_PAY_TERM`='0000-00-00'
+					and w.`LAST_FVAT_SELL_DATE`>='2014-12-01'
+				)
+			)
+			and c.`ID_BILLING_PREFIXES` in('0','1')
+			and c.`BILLING_OWNER` in('1')
+		";
+		if (V::get('DBG_NUM', '', $_GET)) {// number of clients with fvat after 2014-12-01
+			$sqlWhereAdd = "
+				and (w.`LAST_FVAT_PAY_TERM`>='2014-12-01'
+					or (	w.`LAST_FVAT_PAY_TERM`='0000-00-00'
+						and w.`LAST_FVAT_SELL_DATE`>='2014-12-01'
+					)
+				)
+				and c.`ID_BILLING_PREFIXES` in('0','1')
+				and c.`BILLING_OWNER` in('1')
+			";
+		}
+		$sql = "select {$sql_select}
+			from `USERS2_WINDYKACJA_STATUS` as w
+				join `COMPANIES` as c on(c.`ID`=w.`ID_BILLING_USERS`)
+			where c.`A_ADM_COMPANY`='19994_PODMIOT_Vectra_wlasciciel'
+				{$sqlWhereAdd}
+		";
+		if (V::get('DBG_SQL', '', $_GET)) {
+			header('Content-Type: text/plain; charset=utf-8');
+			echo $sql;
+			exit;
+		}
+		$res = $db->query($sql);
+		if ($db->has_errors()) {
+			print_r($db->get_errors());
+			die();
+		}
+		while ($r = $db->fetch($res)) {
+			$usersList[$r->ID_BILLING_USERS] = $r;
+		}
+		if (V::get('DBG_ILE', '', $_GET)) {
+			echo '<p>ilosc: ' . count($usersList) . '</p>' . '<pre style="max-height:200px;overflow:auto">';
+				print_r($usersList);
+			echo '</pre>';
+			exit;
+		}
+		if (V::get('DBG_IDS', '', $_GET)) {
+			header('Content-Type: text/plain; charset=utf-8');
+			echo 'ilosc: ' . count($usersList) . "\n";
+			echo implode("\n", array_keys($usersList));
+			exit;
+		}
+		$limit = 10000;
+		$date_limit = V::get('DATE_LIMIT', date("Y-m-d"), $_GET);
+		$date_limit_from = '2014-12-01';
+		$csvFileName = "Zestawienie-zadluzenia-do-{$date_limit}";
+		header('Content-Type: text/csv; charset=utf-8');
+		header("Content-Disposition: attachment; filename={$csvFileName}.csv");
+		$showCsvHeader = true;
+		foreach ($usersList as $userId => $user) {
+			$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user, $date_limit);
+			$billing_docs->sort_docs();
+			$fvat_arr = $billing_docs->get_unpaid_fvat();
+			Windykacja_StatsModel::update_doc_number($fvat_arr);
+
+			if (V::get('DBG_LAST_FVAT_TERM', '', $_GET)) {
+				$lastFvatDoc = $billing_docs->get_last_fvat_doc();
+				if ($lastFvatDoc) {
+					echo '<p>lastFvatDoc:</p><pre style="max-height:200px;overflow:auto">';
+						print_r($lastFvatDoc);
+					echo '</pre>';
+					exit;
+				}
+			}
+
+			$user->hasActiveDeal = 0;
+			$sql = "select sum(t.`DEALS_ACTIVE`) as activeDeals
+				from `temp_DEALS_STATUS` as t
+				where t.`DEALS_ACTIVE`=1
+					and t.`ID_BILLING_USERS`='{$userId}'
+			";
+			$res = $db->query($sql);
+			if ($db->num_rows($res) > 0) {
+				$user->hasActiveDeal = 1;
+			}
+
+			$out_tbl = array();
+			foreach ($fvat_arr as $v_fvat) {
+				if ($v_fvat['BILL_DATE'] < $date_limit_from || $v_fvat['BILL_DATE'] > $date_limit) {
+					//echo 'pomin fvat:'."\n";print_r($v_fvat);
+					continue;
+				}
+				$out_tr = array();
+				$out_tr['ID'] = $v_fvat['ID'];
+				$out_tr['nr'] = $v_fvat['NUMBER'] . '/' . $v_fvat['ID_BILLING_PREFIXES'];
+				$out_tr['winien'] = number_format($v_fvat['WINIEN'], 2, '.', '');
+				$out_tr['data'] = $v_fvat['BILL_DATE'];
+				$out_tr['termin'] = $v_fvat['PAYMENT_TERM'];
+				$out_tr['pozostalo'] = number_format($v_fvat['WINIEN_POZOSTALO'], 2, '.', '');
+				array_unshift($out_tbl, $out_tr);// add to the begining
+			}
+
+			{// csv
+				$csvLine = array();
+				$csvLine[] = '"id klienta"';
+				$csvLine[] = '"nr dokumentu"';
+				$csvLine[] = '"kwota brutto"';
+				$csvLine[] = '"data faktury"';
+				$csvLine[] = '"termin płatności"';
+				$csvLine[] = '"pozostało do zapłaty"';
+				$csvLine[] = '"status klienta (9=blokada)"';
+				$csvLine[] = '"aktywne uslugi"';
+				if ($showCsvHeader) {
+					echo implode(';', $csvLine) . ";\n";
+					$showCsvHeader = false;
+				}
+				foreach ($out_tbl as $tr) {
+					$csvLine = array();
+					$csvLine[] = '"' . $userId . '"';
+					$csvLine[] = '"' . $tr['nr'] . '"';
+					$csvLine[] = '"' . $tr['winien'] . '"';
+					$csvLine[] = '"' . $tr['data'] . '"';
+					$csvLine[] = '"' . $tr['termin'] . '"';
+					$csvLine[] = '"' . $tr['pozostalo'] . '"';
+					$csvLine[] = '"' . $user->STATUS . '"';
+					$csvLine[] = '"' . $user->hasActiveDeal . '"';
+					echo implode(';', $csvLine) . ";\n";
+				}
+			}
+			//echo '<pre style="max-height:200px;overflow:auto">fvat_arr: ';print_r($fvat_arr);echo'</pre>';
+			//echo '<pre style="max-height:200px;overflow:auto">ilosc('.count($out_tbl).') ' . "client({$userId}): ";print_r($out_tbl);echo'</pre>';
+			if (--$limit < 0) {
+				echo '<br>BREAK';
+				break;
+			}
+		}
+		exit;
+	}
+
+	public static function wezwanie(&$user, $wezwanie_termin, $wezwanie_ostateczne = false) {
+		$date_limit = date("Y-m-d");
+		$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user, $date_limit);
+
+		$billing_docs->sort_docs();
+
+		// sprawdz zadluzenie
+		if ($billing_docs->get_saldo() >= 0) {
+			echo'<p class="green">' . "Brak zadluzenia" . '</p>';
+			return;
+		}
+		else {
+			$fvat_arr = $billing_docs->get_unpaid_fvat();
+			//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">saldo('.$billing_docs->get_saldo().') fvat_arr: ';print_r($fvat_arr);echo'</pre>';
+			//foreach ($fvat_arr as $key => $v) {
+			//	echo'<br />'.number_format($v['WINIEN_POZOSTALO'], 4, ',', ' ');
+			//}
+
+			if (empty($fvat_arr)) {
+				echo'<p>'."Brak nieoplaconych faktur".'</p>';
+				return;
+			}
+
+			Windykacja_StatsModel::update_doc_number($fvat_arr);
+
+			$cols = array();
+			$cols['ID'] = "ID";
+			$cols['nr'] = "nr";
+			$cols['winien'] = "winien";
+			$cols['ma'] = "ma";
+			//$cols['saldo'] = "saldo";
+			$cols['saldo_all'] = "saldo";
+			$cols['add'] = "&nbsp;";
+
+			$saldo_all = 0;
+			foreach ($fvat_arr as $f) {
+				$saldo_all += round($f['WINIEN_POZOSTALO'], 2);
+			}
+
+			$out_tbl = array();
+			foreach ($fvat_arr as $v_fvat) {
+				$out_tr = array();
+				$out_tr['ID'] = ' <code style="font-size:10px">'."(".$v_fvat['ID'].")".'</code>';// TODO: dla KP,KW: ID_BILLING_NUMBERS zamiast ID
+				$out_tr['nr'] = $v_fvat['NUMBER'] . '/' . $v_fvat['ID_BILLING_PREFIXES'];
+				$out_tr['winien'] = number_format($v_fvat['WINIEN'], 2, ',', ' ');
+				$out_tr['data'] = $v_fvat['BILL_DATE'];
+				$out_tr['termin'] = $v_fvat['PAYMENT_TERM'];
+				$out_tr['pozostalo'] = number_format($v_fvat['WINIEN_POZOSTALO'], 2, ',', ' ');
+				array_unshift($out_tbl, $out_tr);// add to the begining
+			}
+
+			$razem = $saldo_all;
+
+			$company = Windykacja_StatsModel::get_company($user);
+
+			$nr_konta = Windykacja_FunkcjeL1::bankowy_formatuj_nrach(Windykacja_FunkcjeL1::bankowy_make_nrach($company->NR_RACH_MASS_PAY, $user->ID_BILLING_USERS, 0));
+
+		?>
+			<style type="text/css">
+                body{font-family:serif; font-size:10px;line-height:14px;}
+                td{font-family:verdana; font-size:10px; color:#333;}
+                table {border-style:none;}
+                table td, table th {padding:0 2px;border-style:solid;border-collapse:collapse;}
+                table th {border-width:1px;border-color:#333;}
+                table td {border-width:1px;border-color:#333;}
+			</style>
+		<?php
+
+		echo'<div style="background:#fff;border:none;margin:5px;padding:20px 40px 10px 40px;page-break-after:always;font-size:small;">';
+		$id_koresp = 0;
+		if ($user->ID_KORESP) {
+			$id_koresp = $user->ID_KORESP;
+			if ($user->LAST_ID_KORESP_WEZWANIE1 && !$wezwanie_ostateczne) {
+				$id_koresp = $user->LAST_ID_KORESP_WEZWANIE1;
+			} else if ($user->LAST_ID_KORESP_WEZWANIE2 && $wezwanie_ostateczne) {
+				$id_koresp = $user->LAST_ID_KORESP_WEZWANIE2;
+			}
+		}
+		if ($id_koresp > 0) {//$user->ID_KORESP) {// TODO: if $user->LAST_ID_KORESP_WEZWANIE1 or LAST_ID_KORESP_WEZWANIE2
+			$koresp = DB::get_by_id('IN7_DZIENNIK_KORESP', $id_koresp);
+			if ($koresp) {
+				echo '<div style="text-align:right;font-weight:bold;">';
+					echo $koresp->ID_PROJECT . '-' .$koresp->ID . "/" . substr(date("Y"), 2);
+				echo '</div>';
+			}
+		}
+
+		//echo "&bdquo;BIALL-NET&rdquo; Sp. z o.o.<br />Otomin, ul. Słoneczna 43<br />80-174 Gdańsk";
+		?>
+			<table border=0 cellspacing=0 cellpadding=0 style="width:100%;">
+				<tr>
+					<td style="width:60%;border:none;">
+						<?php echo $company->name1; ?>
+						<br /><?php echo "ul. " . $company->ulica . " " . $company->numer_dom; ?>
+						<br /><?php echo $company->kod . " " . $company->miasto; ?>
+					</td>
+					<td style="border:none;text-align:left;vertical-align:top;">
+						Gdańsk, dnia <?php echo date("Y-m-d"); ?>
+					</td>
+				</tr>
+				<tr>
+					<td style="border:none;">&nbsp;</td>
+					<td style="border:none;">
+						<p style="margin:50px 0;">
+							Numer klienta: <?php echo $user->ID; ?>
+							<br /><?php echo "{$user->P_NAME} {$user->P_NAME_SECOND}"; ?>
+                            <?php // TODO: P_ADRESS_KORESP_1282 ?>
+							<br /><?php echo "ul. {$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}"; ?>
+							<?php if ($user->P_ADDRESS_HOME) { echo "/{$user->P_ADDRESS_HOME}"; } ?>
+							<br /><?php echo "{$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}"; ?>
+						</p>
+					</td>
+				</tr>
+			</table>
+
+			<h1 style="text-align:center;margin:20px 10px 10px 10px;font-size:28px;">
+				<?php
+				if ($wezwanie_ostateczne) {
+					echo "OSTATECZNE WEZWANIE DO ZAPŁATY";
+				} else {
+					echo "WEZWANIE DO ZAPŁATY";
+				}
+				?>
+			</h1>
+			<p style="margin:10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Na podstawie art. 476 Kodeksu cywilnego (Dz. U. z 1964 r. nr 16, poz. 93, z późn. zmianami) wzywamy do natychmiastowego uregulowania należnej sumy, zgodnie z poniższym zestawieniem.</p>
+
+			<table border=0 cellspacing=0 cellpadding=2 style="width:100%;margin:10px;font-size:small;">
+			<thead style="background:#F3F3F3;">
+				<tr>
+					<th>Podstawa zobowiązania*</th>
+					<th>Nr dokumentu</th>
+					<?php //<th>Kwota netto</th> ?>
+					<th>Kwota brutto</th>
+					<th>Data faktury</th>
+					<th>Termin płatności</th>
+					<th>Pozostało do zapłaty</th>
+				</tr>
+			</thead>
+			<tfoot>
+				<tr>
+					<td colspan="4" style="border:none;"></td>
+					<th style="border-width:2px;border-color:#333;text-align:right;background:#F3F3F3;">Razem:</th>
+					<td style="border-width:2px;border-color:#333;font-weight:bold;"><?php echo Windykacja_FunkcjeL1::formatuj_grosze($razem); ?></td>
+				</tr>
+			</tfoot>
+				<?php foreach ($out_tbl as $out_tr) {
+					$k_data = $out_tr['data'];
+					$rok = substr($k_data, 0, 4);
+					$cls = array();
+					if ($add_cls = V::get('class', '', $out_tr)) $cls[] = $add_cls;
+					$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
+					//$file_total['PODSTAWA_NUMBER'] = $r['NUMBER']."/".$r['ID_BILLING_PREFIXES'];
+					//$file_total['PODSTAWA_DATA'] = date("Y-m-d",$r['BAF_TIMESTAMP']);
+					//$file_total['PAYMENT_TERM'] = date("Y-m-d",$r['TERMIN_PL']);
+					?>
+					<tr<?php echo $cls; ?>>
+					<td>
+						<?php echo "Faktura Vat"; ?>
+					</td>
+					<td>
+						<?php echo $out_tr['nr']; ?>
+					</td>
+					<td>
+						<?php echo $out_tr['winien']; ?>
+					</td>
+					<td>
+						<nobr><?php echo $out_tr['data']; ?></nobr>
+					</td>
+					<td>
+						<nobr><?php echo $out_tr['termin']; ?></nobr>
+					</td>
+					<td>
+						<?php echo $out_tr['pozostalo']; ?>
+					</td>
+					</tr>
+				<?php } ?>
+			</table>
+			<p style="margin:10px;">Słownie do zapłaty: <span style="border-bottom:1px dotted #000;padding:0 50px;">&nbsp;&nbsp;<b><?php echo Windykacja_FunkcjeL1::slownie($razem); ?></b>&nbsp;&nbsp;</span></p>
+			<p style="margin:10px;background:#eee;text-align:center;">Wymienioną sumę prosimy przekazać na nasz rachunek bankowy <br /><?php echo $nr_konta; ?> w terminie do dnia <span style="border-bottom:1px dotted #000;padding:0 50px;">&nbsp;&nbsp;<b><?php echo $wezwanie_termin; ?></b>&nbsp;&nbsp;</span></p>
+			<ul style="margin:10px;font-size:small;padding:0 0 0 40px;">
+				<li style="line-height:16px;">Od nieterminowych płatności mogą zostać naliczone odsetki ustawowe (art.481 § 1 KC).</li>
+				<li style="line-height:16px;">W przypadku nieterminowej zapłaty nabywca zostanie obciążony wszelkimi kosztami windykacji oraz postępowania sądowego, które zostaną poniesione przez sprzedawcę w celu odzyskania należności.</li>
+				<li style="line-height:16px;">W przypadku uregulowania należności przed otrzymaniem niniejszego wezwania, proszę potraktować je za bezprzedmiotowe.</li>
+			</ul>
+
+			<table style="width:100%;border:none">
+			<tr>
+				<td colspan="2" style="border:none;">
+					<p style="margin:5px 0;font-size:10px;">W razie problemów prosimy o kontakt z Biurem Obsługi Klienta tel. (58) 741-84-10 wew. 2,
+                        <br> e-mail: bok@biall.net.pl lub z Windykatorem: tel. (58) 741-84-78</p>
+				</td>
+			</tr>
+			</table>
+
+			<table style="width:100%;border:none">
+			<tr>
+				<td style="width:50%;border:none;">&nbsp;</td>
+				<td style="width:50%;border:2px solid #999"><br /><br /><br /><br /></td>
+			</tr>
+			<tr>
+				<td style="border:none;">&nbsp;</td>
+				<td style="text-align:center;border:none;">(pieczęć i podpis wierzyciela)</td>
+			</tr>
+			<tr>
+				<td colspan="2" style="border:none;">
+					<p style="margin:10px 0;font-size:xx-small;">* Podstawa zobowiązania: Faktura VAT, Rachunek, Umowa, Nota odsetkowa, Nota księgowa, Weksel, Uznanie długu, Ugoda, Kara umowna, Faktura zbiorowa, Wyrok sądowy, Nakaz zapłaty, Pożyczka, inne.</p>
+				</td>
+			</tr>
+			<tr>
+				<td colspan="2" style="border:none">
+					<p style="margin:8px 0;font-size:x-small;text-align:center">W przypadku nieuregulowania płatności we wskazanym terminie, zgodnie z &bdquo;Ustawą o udostępnianiu informacji gospodarczych z dnia 14 lutego 2003 r. (Dz. U. Nr 50)&rdquo; , informacje o zadłużeniu zostaną przekazane do:</p>
+					<p style="margin:8px 0 0 0;font-size:small;text-align:center"><b>Krajowego Rejestru Długów<br />
+                        Biura Informacji Gospodarczej S.A.<br />
+                        ul. Armii Ludowej 21, 51-214 Wrocław<br />
+                        www.krd.pl</b>
+                        <br />
+                        <br />
+                        Informacja o zadłużeniu upubliczniona będzie w systemie KRD do dnia zapłaty  lub 10 lat od daty dokonania wpisu.</p>
+				</td>
+			</tr>
+			</table>
+		</div>
+        </body>
+        </html>
+			<?php
+			die();
+		}
+	}
+
+	public static function task_update_stats() {
+		self::css();
+		$to_update_step = 1000;
+		$q = V::get('q', '', $_GET);
+		$_p = V::get('_p', 0, $_GET, 'int');
+		echo'<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".$q."&_p=".$_p . '">' . "Cofnij" . '<img src=icon/back.gif border=0 alt=POWROT>' . '</a>';
+
+		$to_update_total = Windykacja_StatsHelper::get_to_update_total();
+		if ($to_update_total <= 0) {
+			echo'<p style="color:green">' . "Wszystkie rekordy zaktualizowane" . '</p>';
+			return;
+		}
+
+		if ($to_update_total > $to_update_step) {
+			echo'<br />';
+			echo'<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&task=stats_update&q=".$q."&_p=".$_p . '">' . "Aktualizuj statusy (" . ($to_update_total - $to_update_step) . ")" . '</a>';
+			echo'<br />';
+		}
+
+		$to_update_list = Windykacja_StatsHelper::get_to_update_list($to_update_step);
+		if (empty($to_update_list)) {
+			echo'<p style="color:green">' . "Wszystkie rekordy zaktualizowane" . '</p>';
+			return;
+		}
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">to_update_list: ';print_r($to_update_list);echo'</pre>';
+		foreach ($to_update_list as $w) {
+			//echo'<div class="box box-blue">';
+				echo "Nr. klienta: <b>".$w->ID_BILLING_USERS . "</b> ...";
+				//echo $w->A_STATUS . ' (' . $w->A_STATUS_UPDATE_DATE . ')';
+				$user = Windykacja_StatsModel::get_user_by_id($w->ID_BILLING_USERS);
+				if ($user) {
+					$billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user);
+					Windykacja_StatsHelper::update_stats($user, $billing_docs);
+				}
+			//echo'</div>';// .box-blue
+				echo'<br />';
+		}
+
+		if ($to_update_total > $to_update_step) {
+			echo'<br /><br />';
+			echo'<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&task=stats_update&q=".$q."&_p=".$_p . '">' . "Aktualizuj statusy (" . ($to_update_total - $to_update_step) . ")" . '</a>';
+		}
+	}
+
+	public static function getPowodyRezygnacji() {
+		// [895].[3888] - DEALS_TABLE.RODZAJ_DZIALANIA_HANDLOWEGO
+		$powody = array();
+		//	$powody['3226'] = "REZYGNACJA FINANSE";
+		//	$powody['3227'] = "REZYGNACJA SLABA OFERTA";
+		//	$powody['3121'] = "REZYGNACJA WYPROWADZKA";
+		//	$powody['3228'] = "REZYGNACJA PROBLEMY TECHNICZNE";
+		//	$powody['3230'] = "REZYGNACJA WYJAZD";
+		//	$powody['3229'] = "REZYGNACJA ZLA OBSLUGA BOK";
+		//	$powody['3123'] = "REZYGNACJA CESJA";
+		//	$powody['3119'] = "BRAK-BOK (Inne)";
+		//	$powody['4188'] = "UMOWA_BEZPOSREDNIA";
+		//	$powody['4189'] = "UMOWA_POSREDNIA";
+		//	$powody['4190'] = "TELEMARKETING";
+		$powody['4192'] = "REZYGNACJA ZMIANA OPERATORA";
+		$powody['4193'] = "REZYGNACJA WYPROWADZKA";
+		$powody['4194'] = "REZYGNACJA NIEZADOWOLENIE";
+		$powody['4195'] = "REZYGNACJA CESJA";
+		//$powody['4196'] = "REZYGNACJA FINANSE";
+		$powody['4197'] = "REZYGNACJA SLABA OFERTA";
+		$powody['4198'] = "REZYGNACJA PROBLEMY TECHNICZNE";
+		$powody['4199'] = "REZYGNACJA ZLA OBSLUGA BOK";
+		$powody['4200'] = "WYPOWIEDZENIE PRZEZ OPERATORA ZA DLUGI";
+		//	$powody['4201'] = "UMOWA W BOK ZWYCZAJNA";
+		//	$powody['4202'] = "REZYGNACJA WYJAZD";
+		//	$powody['4191'] = "BRAK-BOK (Inne)";
+		$powody['19803'] = "REZYGNACJA_Z_PRZEJSCIEM_DO_VECTRA";
+		$powody['22511'] = "WYPOWIEDZENIE PRZEZ OPERATORA";
+		$powody['4213'] = "REZYGNACJA INNE";
+		return $powody;
+	}
+
+	/**
+	 * @params $user
+	 * @params $id_koresp
+	 */
+	public static function task_bok_rozwiazanie_umowy_print($user, $id_koresp) {
+		$user_hist_events = Windykacja_StatsHelper::get_user_hist_status_events($user);
+		if (empty($user_hist_events)) {
+			echo '<p style="color:red">' . "Brak danych HIST" . '</p>';
+			return;
+		}
+		$v_doc = null;
+		foreach ($user_hist_events as $v_hist) {
+			if ($v_hist->ID_KORESP == $id_koresp) {
+				$v_doc = $v_hist;
+				break;
+			}
+		}
+		if (!$v_doc) {
+			echo '<p style="color:red">' . "Brak danych HIST dla kodresp(".$v_doc->ID_KORESP.")" . '</p>';
+			return;
+		}
+
+		// params(255): rozwiazanie umowy,9872,3121
+		$params = explode(',', $v_doc->params);
+		if (count($params) < 3 && $params[0] != 'rozwiazanie umowy') {
+			echo '<p style="color:red">' . "Bad params" . '</p>';
+			return;
+		}
+
+		$koresp = DB::get_by_id('IN7_DZIENNIK_KORESP', $id_koresp);
+		if (!$koresp) {
+			echo '<p style="color:red">' . "Koresp not exists!" . '</p>';
+			return;
+		}
+
+		$nr_umowy = $params[1];
+		$powod = $params[2];
+
+		$deal_id = '..........................................................';
+		$termin_odlaczenia = '.....................';
+		if (count($params) > 4) {
+			// $data_arr["params"] = "rozwiazanie umowy,{$nr_umowy},{$powod},{$termin_odlaczenia},{$new_id_deals}";
+			$termin_odlaczenia = $params[3];
+			$deal_id = $params[4];
+		}
+
+		$arg_values = array();
+		$arg_values['powod'] = self::getPowodyRezygnacji();
+
+		$com = new stdClass();
+		if ($user->BILLING_OWNER == 2) {
+			$com->name = 'NET-DAY';
+			$com->fullName = 'NET-DAY s.c.';
+			$com->address_street = 'ul. Kopeckiego 9/24';
+			$com->address_city = '80-809 Gdańsk';
+		} else {
+			$com->name = 'BIALL-NET';
+			$com->fullName = 'BIALL-NET Sp. z o.o.';
+			$com->address_street = 'Otomin ul. Słoneczna 43';
+			$com->address_city = '80-174 Gdańsk';
+		}
+
+		?>
+		<style type="text/css">
+            body{margin:12px;font-family:serif;font-size:11px;line-height:14px;}
+            td{font-family:verdana; font-size:10px; color:#333;}
+            table {border-style:none;}
+            table td, table th {padding:0 2px;border-collapse:collapse;}
+            table.tbl-bordered {border-style:none;}
+            table.tbl-bordered td, table.tbl-bordered th {padding:0 2px;border-style:solid;border-collapse:collapse;}
+            table.tbl-bordered th {border-width:1px;border-color:#333;}
+            table.tbl-bordered td {border-width:1px;border-color:#333;}
+		</style>
+
+		<table cellspacing="0" cellpadding="0" border="0" style="width:100%;"><tr>
+			<td>[1612][v3]</td>
+			<td style="text-align:right">Nr dziennika przyjęcia pisma <?php echo $com->fullName; ?> <?php echo $koresp->ID_PROJECT; ?>-<?php echo $koresp->ID; ?>/<?php echo substr(date("Y"), 2); ?>
+				<br />Gdańsk, dnia: .......................
+			</td>
+		</tr></table>
+		<br /><b>Dane Abonenta</b>
+		<br />Imię i Nazwisko / Nazwa firmy: <?php echo "{$user->P_NAME} {$user->P_NAME_SECOND}";?>
+		<br />Pesel / nr dowodu osoby reprezentującej firmę: <?php echo $user->P_PESEL; ?>
+		<br />Adres zameldowania: ul. <?php echo "{$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}/{$user->P_ADDRESS_HOME}, {$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}"; ?>
+
+		<br />Nr ID klienta: <?php echo $user->ID; ?>
+		<br />Nr ID Umowy: <?php echo $deal_id; ?>
+		<?php
+			// <br />ID_SERVICES_OLD: .......................................................... 
+		?>
+		<table cellspacing="0" cellpadding="0" border="0" style="width:100%;margin:40px 0;"><tr>
+			<td>&nbsp;</td>
+			<td style="width:260px;text-align:left">
+				<?php echo $com->fullName; ?><br /><?php echo $com->address_street; ?><br /><?php echo $com->address_city; ?>
+			</td>
+		</tr></table>
+		<p style="margin:50px 0; text-align:center;">ROZWIĄZANIE UMOWY ABONENCKIEJ O ŚWIADCZENIE USŁUG TELEKOMUNIKACYJNYCH NR <sup>[794]</sup></p>
+		<p style="margin:0 0 50px 0;text-indent:50px">Proszę o rozwiązanie umowy abonenckiej o świadczeniu Usług Telekomunikacyjnych i odłączenie sygnału <?php echo $com->fullName; ?>. Jednocześnie jestem świadomy/a tego, że jeżeli okres trwania wypowiadanej umowy jeszcze nie uległ zakończeniu to firma <?php echo $com->name; ?> może naliczyć karę za wcześniejsze zerwanie umowy zgodnie z obowiązującym regulaminem i cennikiem.</p>
+		<p>Termin odłączenia: <?php echo $termin_odlaczenia; ?>
+		<br />(poinformowano o miesięcznym terminie wypowiedzenia, jak również przedstawiono nowe propozycje oferty)</p>
+		<p style="margin:30px 0;font-weight:bold;"><sup>[1061]</sup>Powody rezygnacji z Usług (wybierz tylko 1 najważniejszy powód)</p>
+		<table cellspacing="0" cellpadding="0" border="1" style="width:100%" class="tbl-bordered">
+			<?php foreach ($arg_values['powod'] as $k_powod => $v_label) : ?>
+				<?php $sel = ($powod == $k_powod)? "X" : "&nbsp;"; ?>
+				<tr><td style="width:26%;"><?php echo $v_label; ?></td><td style="width:5%;text-align:center;"> <?php echo $sel; ?> </td><td></td></tr>
+			<?php endforeach; ?>
+		</table>
+		<table cellspacing="0" cellpadding="0" border="0" style="margin:60px 0;width:100%;">
+			<tr>
+				<td style="width:15%;">&nbsp;</td>
+				<td style="width:20%;border-top:1px dotted #000;text-align:center;">
+					Data i podpis pracownika BOK
+				</td>
+				<td>&nbsp;</td>
+				<td style="width:20%;border-top:1px dotted #000;text-align:center;">
+					Data i czytelny podpis Klienta
+				</td>
+				<td style="width:15%;">&nbsp;</td>
+			</tr>
+		</table>
+		<?php
+	}
+
+	public static function task_bok_rozwiazanie_umowy(&$user) {
+		echo'<script type="text/javascript">'."
+            function frm_bok_rozwiazanie_umowy(frm){
+                if (frm.id_proj.value=='') {
+                    alert('Nie podano numeru projektu!');
+                } else if (frm.nr_umowy.value=='') {
+                    alert('Nie podano numeru umowy!');
+                } else if (frm.temin_odlaczenia.value=='') {
+                    alert('Nie podano daty odłączenia!');
+                // TODO: powod - radio
+                } else {
+                    return true;
+                }
+                return false;
+            }
+		".'</script>';
+
+		$umowy_l2 = Windykacja_StatsModel::get_umowy_from_l2($user);
+		if (empty($umowy_l2)) {
+			echo '<p style="color:red">' . "Brak aktualnych umów z klientem" . '</p>';
+			return;
+		}
+
+		$arg_errors = array();
+		$arg_values = array();
+		$args = array();
+		$args['id_proj'] = V::get('id_proj', '', $_REQUEST, 'int');
+		$args['nr_umowy'] = V::get('nr_umowy', '', $_REQUEST, 'int');
+		$args['temin_odlaczenia'] = V::get('temin_odlaczenia', '', $_REQUEST);
+		$args['powod'] = V::get('powod', '', $_REQUEST, 'int');
+
+		$arg_values['nr_umowy'] = array();
+		foreach ($umowy_l2 as $k_id => $v_deal) {
+			$arg_values['nr_umowy'][$v_deal['ID']] = $v_deal['ID'] . ' (Nr umowy: ' . $v_deal['P_DEALNUMBER'] . ', ' . $v_deal['P_DEALDATE'] . ' - ' . $v_deal['P_DEALDATE_TERM'] . ')';
+		}
+
+		$arg_values['powod'] = self::getPowodyRezygnacji();
+
+		// validate
+		if ($args['temin_odlaczenia'] == '') {
+			$args['temin_odlaczenia'] = date("Y-m-d", mktime(0, 0, 0, date('m') + 1, date('d'), date('Y')));
+		} else {// cehck date format
+			if (strlen($args['temin_odlaczenia']) != 10) {
+				$arg_errors['temin_odlaczenia'] = "Błędny format daty";
+			} else {
+				$check_date = explode('-', $args['temin_odlaczenia']);
+				if (count($check_date) != 3 || strlen($check_date[0]) != 4 || strlen($check_date[1]) != 2 || strlen($check_date[2]) != 2) {
+					$arg_errors['temin_odlaczenia'] = "Błędny format daty";
+				} else {
+					// ok
+				}
+			}
+		}
+		if ($args['id_proj'] <= 0) {
+			$arg_errors['id_proj'] = "Nie podano numeru projektu!";
+		}
+		if ($args['nr_umowy'] <= 0) {
+			$arg_errors['nr_umowy'] = "Nie wybrano numeru umowy!";
+		}
+		if ($args['powod'] <= 0) {
+			$arg_errors['powod'] = "Nie wybrano powodu rezygnacji!";
+		}
+
+		// add rezygnacja z umowy
+		if (1 == V::get('contact_bok_rozwiazanie_umowy_save', 0, $_POST, 'int')) {
+			if (!empty($arg_errors)) {
+				echo '<p style="color:red">' . "W formularzy wystąpiły błędy:";
+					foreach ($arg_errors as $k_field => $v_err) {
+						echo '<br />' . $v_err;
+					}
+				echo '</p>';
+			} else {
+				$msg_log = array();
+				$ret = Windykacja_StatsHelper::update_bok_rozwiazanie_umowy($user, $args['id_proj'], $args['nr_umowy'], $args['powod'], $arg_values['powod'][$args['powod']], $args['temin_odlaczenia'], $msg_log);
+				if ($ret) {
+					echo '<p style="color:green">' . "Dane zapisano pomyślnie" . '</p>';
+					if (!empty($msg_log)) {
+						echo '<p style="color:silver">' . implode('<br />', $msg_log) . '</p>';
+					}
+					$ico_print = '<img src="icon/print.gif" height="16" />';
+					echo '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy_print"."&user_id=".$user->ID."&id_koresp=".$ret.'">' . $ico_print . " rozwiązanie umowy".'</a>';
+					return;
+				} else {
+					echo '<p style="color:red">' . "Wystąpił błąd podczas zapisu danych" . '</p>';
+					if (!empty($msg_log)) {
+						echo '<p style="color:silver">' . implode('<br />', $msg_log) . '</p>';
+					}
+				}
+			}
+		}
+
+		echo'<form action="" method="post" onsubmit="' . "return frm_bok_rozwiazanie_umowy(this);" . '">';
+			echo'<input type="hidden" name="'."contact_bok_rozwiazanie_umowy_save".'" value="'."1".'" />';
+			echo '<b>' . "Rozwiązanie umowy abonenckiej o świadczenie usług telekomunikacyjnych" . '</b>';
+			echo '<br />' . "ID projektu: ";
+			echo '<input type="text" name="'."id_proj".'" value="' . $args['id_proj'] . '" class="i" />';
+			echo '<br />' . "Nr umowy: ";
+				foreach ($arg_values['nr_umowy'] as $k_id => $v_label) {
+					$sel = ($k_id == $args['nr_umowy'])? ' checked="checked"' : '';
+					echo '<br />' . "&nbsp;&nbsp;&nbsp;&nbsp;" . '<input type="radio" name="'."nr_umowy".'" value="' . $k_id . '" class="i" ' . $sel . ' />' . " " . $v_label;
+				}
+			echo '<br />' . "Termin odłączenia: ";
+			echo '<input type="text" name="'."temin_odlaczenia".'" value="' . $args['temin_odlaczenia']. '" class="i" />';
+			echo '<br />' . "Powód rezygnacji z usług: ";
+				foreach ($arg_values['powod'] as $k_id => $v_label) {
+					$sel = ($k_id == $args['powod'])? ' checked="checked"' : '';
+					echo '<br />' . "&nbsp;&nbsp;&nbsp;&nbsp;" . '<input type="radio" name="'."powod".'" value="' . $k_id . '" class="i" ' . $sel . ' />' . " " . $v_label;
+				}
+			echo '<br />' . '<input type="submit" value="'."zapisz".'" />';
+		echo'</form>';
+	}
+
+}
+
+
+class Lay_Html_Toggle {
+
+	public static function start($title, $attrs = array()) {
+		$cls = array();
+		$cls[] = 'may-hide';
+		if (array_key_exists('open', $attrs) && $attrs['open'] == false) $cls[] = 'hide';
+		echo'<div class="'.implode(' ', $cls).'">';
+		$st = array();
+		$st[] = 'margin-bottom:0';
+		if (!empty($attrs['color'])) $st[] = 'color:'.$attrs['color'];
+		echo'<h4 style="'.implode(';', $st).'">'.$title;
+			echo'<a class="btn-hide" href="#" onclick="'."return hide(this);".'">'."-".'</a>';
+			echo'<a class="btn-show" href="#" onclick="'."return hide(this);".'">'."+".'</a>';
+		echo'</h4>';
+		echo'<div class="to-hide">';
+	}
+
+	public static function end() {
+			echo'</div>';// .to-hide
+		echo'</div>';// .may-hide'
+	}
+
+	public static function show_js() {
+		echo'<script type="text/javascript">'."
+		function hide(n){
+			jQuery(n).parent().parent().toggleClass('hide');
+			return false;
+		}
+		".'</script>';
+	}
+
+}

+ 51 - 6053
SE/superedit-USERS2_WINDYKACJA_STATUS.php

@@ -17,6 +17,8 @@ function USERS2_WINDYKACJA_STATUS() {
 	Lib::loadClass('V');
 	Lib::loadClass('DB');
 	Lib::loadClass('User');
+	Lib::loadClass('Windykacja_View');
+	Lib::loadClass('Windykacja_StatsModel');
 
 	// router
 	$q = V::get('q', '', $_REQUEST);
@@ -26,17 +28,17 @@ function USERS2_WINDYKACJA_STATUS() {
 	if ($task != '') {
 		if ($task == 'view_faktura') {
 			$faktura_id = V::get('id', 0, $_REQUEST, 'int');
-			WindykacjaView::view_faktura($faktura_id);
+			Windykacja_View::view_faktura($faktura_id);
 			return;
 		}
 		else if ($task == 'zadluzenia') {
 			$user_id = V::get('user_id', 0, $_REQUEST, 'int');
 			if ($user_id > 0) {
-				$user = WindykacjaStatsModel::get_user_by_id($user_id);
+				$user = Windykacja_StatsModel::get_user_by_id($user_id);
 				if (!$user) {
 					echo'<p style="color:red">'."Użytkownik nie istnieje lub brak uprawnień.".'</p>';
 				} else {
-					WindykacjaView::zadluzenia($user);
+					Windykacja_View::zadluzenia($user);
 					return;
 				}
 			} else {
@@ -44,21 +46,21 @@ function USERS2_WINDYKACJA_STATUS() {
 			}
 		}
 		else if ($task == 'zestawienie_vectra_zadluzenia') {
-			WindykacjaView::zestawienie_vectra_zadluzenia();
+			Windykacja_View::zestawienie_vectra_zadluzenia();
 			exit;
 		}
 		else if ($task == 'zestawienie_vectra_nadplaty') {
-			WindykacjaView::zestawienie_vectra_nadplaty();
+			Windykacja_View::zestawienie_vectra_nadplaty();
 			exit;
 		}
 		else if ($task == 'wezwanie') {
 			$user_id = V::get('user_id', 0, $_REQUEST, 'int');
 			if ($user_id > 0) {
-				$user = WindykacjaStatsModel::get_user_by_id($user_id);
+				$user = Windykacja_StatsModel::get_user_by_id($user_id);
 				if (!$user) {
 					echo'<p style="color:red">'."Użytkownik nie istnieje lub brak uprawnień.".'</p>';
 				} else {
-					WindykacjaView::wezwanie($user, $user->PAY_TERM);
+					Windykacja_View::wezwanie($user, $user->PAY_TERM);
 					return;
 				}
 			} else {
@@ -68,11 +70,11 @@ function USERS2_WINDYKACJA_STATUS() {
 		else if ($task == 'wezwanie_ostateczne') {
 			$user_id = V::get('user_id', 0, $_REQUEST, 'int');
 			if ($user_id > 0) {
-				$user = WindykacjaStatsModel::get_user_by_id($user_id);
+				$user = Windykacja_StatsModel::get_user_by_id($user_id);
 				if (!$user) {
 					echo'<p style="color:red">'."Użytkownik nie istnieje lub brak uprawnień.".'</p>';
 				} else {
-					WindykacjaView::wezwanie_ostateczne($user, $user->PAY_TERM);
+					Windykacja_View::wezwanie_ostateczne($user, $user->PAY_TERM);
 					return;
 				}
 			} else {
@@ -82,11 +84,11 @@ function USERS2_WINDYKACJA_STATUS() {
 		else if ($task == 'bok_rozwiazanie_umowy') {
 			$user_id = V::get('user_id', 0, $_REQUEST, 'int');
 			if ($user_id > 0) {
-				$user = WindykacjaStatsModel::get_user_by_id($user_id);
+				$user = Windykacja_StatsModel::get_user_by_id($user_id);
 				if (!$user) {
 					echo'<p style="color:red">'."Użytkownik nie istnieje lub brak uprawnień.".'</p>';
 				} else {
-					WindykacjaView::task_bok_rozwiazanie_umowy($user);
+					Windykacja_View::task_bok_rozwiazanie_umowy($user);
 					return;
 				}
 			} else {
@@ -96,11 +98,11 @@ function USERS2_WINDYKACJA_STATUS() {
 		else if ($task == 'bok_rozwiazanie_umowy_print') {
 			$user_id = V::get('user_id', 0, $_REQUEST, 'int');
 			if ($user_id > 0) {
-				$user = WindykacjaStatsModel::get_user_by_id($user_id);
+				$user = Windykacja_StatsModel::get_user_by_id($user_id);
 				if (!$user) {
 					echo'<p style="color:red">'."Użytkownik nie istnieje lub brak uprawnień.".'</p>';
 				} else {
-					WindykacjaView::task_bok_rozwiazanie_umowy_print($user, V::get('id_koresp', 0, $_REQUEST, 'int'));
+					Windykacja_View::task_bok_rozwiazanie_umowy_print($user, V::get('id_koresp', 0, $_REQUEST, 'int'));
 					return;
 				}
 			} else {
@@ -108,7 +110,7 @@ function USERS2_WINDYKACJA_STATUS() {
 			}
 		}
 		else if ($task == 'stats_update') {
-			WindykacjaView::task_update_stats();
+			Windykacja_View::task_update_stats();
 			return;
 		}
 		else if ($task == 'export_csv') {
@@ -136,22 +138,22 @@ function USERS2_WINDYKACJA_STATUS() {
 			}
 
 			if (!empty($q)) {
-				$page_nav->total = WindykacjaStatsModel::get_users_total($q);
+				$page_nav->total = Windykacja_StatsModel::get_users_total($q);
 				$page_nav->last_page_nr = floor($page_nav->total / $page_nav->page_limit);
 
-				$items = WindykacjaStatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
+				$items = Windykacja_StatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
 				$page_nav->page_total = count($items);
 			}
 			else {
-				$page_nav->total = WindykacjaStatsModel::get_users_total($q);
+				$page_nav->total = Windykacja_StatsModel::get_users_total($q);
 				$page_nav->last_page_nr = floor($page_nav->total / $page_nav->page_limit);
 
-				$items = WindykacjaStatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
+				$items = Windykacja_StatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
 				$page_nav->page_total = count($items);
 			}
 
 			if ($page_nav->total > 0) {
-				WindykacjaView::export_csv($q, $page_nav, $items);
+				Windykacja_View::export_csv($q, $page_nav, $items);
 			} else {
 				echo'<p>' . "Brak danych" . '</p>';
 			}
@@ -170,7 +172,7 @@ function USERS2_WINDYKACJA_STATUS() {
 				echo "Błędny rodzaj wiadomości";
 				exit;
 			}
-			$filter_selected = WindykacjaStatsHelper::get_filter_selected();
+			$filter_selected = Windykacja_StatsHelper::get_filter_selected();
 			if (empty($filter_selected)) {
 				echo "Nie wybrano filtra";
 				exit;
@@ -178,16 +180,16 @@ function USERS2_WINDYKACJA_STATUS() {
 
 			$_GET['_special_filter_active'] = 'today';
 			$_GET["_special_filter_msg_{$msgType}"] = 'not_today';
-			$usersTotal = WindykacjaStatsModel::get_users_total();
+			$usersTotal = Windykacja_StatsModel::get_users_total();
 
 			if ($usersTotal > 0) {
-				$firstUser = WindykacjaStatsModel::get_users('', 1, 0);
+				$firstUser = Windykacja_StatsModel::get_users('', 1, 0);
 				$firstUser = reset($firstUser);
 				//echo'<pre>';print_r($firstUser);echo'</pre>';
 				if ('mail' == $msgType) {
-					$msgStatusList = WindykacjaStatsHelper::get_mail_status_info($firstUser);
+					$msgStatusList = Windykacja_StatsHelper::get_mail_status_info($firstUser);
 				} else if ('sms' == $msgType) {
-					$msgStatusList  = WindykacjaStatsHelper::get_sms_status_info($firstUser);
+					$msgStatusList  = Windykacja_StatsHelper::get_sms_status_info($firstUser);
 				}
 				$msgStatusFirstKey = array_keys($msgStatusList);
 				$msgStatusFirstKey = reset($msgStatusFirstKey);
@@ -201,8 +203,8 @@ function USERS2_WINDYKACJA_STATUS() {
 				if (strlen($terminPlatnosci) != 10 || $terminPlatnosci < date("Y-m-d")) $terminPlatnosci = '';
 				//echo'<pre>$selectedMsgStatus:';print_r($selectedMsgStatus);echo'</pre>';
 				if ('1' != V::get('confirm', '', $_POST) || empty($selectedMsgStatus)) {
-					WindykacjaView::css();
-					$fltrLabel = WindykacjaStatsHelper::get_filter_selected_label();
+					Windykacja_View::css();
+					$fltrLabel = Windykacja_StatsHelper::get_filter_selected_label();
 					?>
 <style type="text/css">
 body{font-size:14px;line-height:1.4;}
@@ -292,7 +294,7 @@ jQuery(document).ready(function () {
 						echo '<div class="container">';
 						echo '<h3>TEST</h3>';
 						echo '<div style="max-height:400px;overflow:auto;border:1px solid silver;">';
-						$users = WindykacjaStatsModel::get_users('', $usersLimit, 0);
+						$users = Windykacja_StatsModel::get_users('', $usersLimit, 0);
 						$cmdStats = array('sent' => 0, 'omitted' => 0, 'error' => 0);
 						foreach ($users as $user) {
 							if ($user->PAY_SALDO > -1 * $saldoLimit) {
@@ -306,9 +308,9 @@ jQuery(document).ready(function () {
 								echo '<p class="text-info">';
 									echo "wysyłanie {$msgType} do klienta {$user->ID}: ";
 									if ('mail' == $msgType) {
-										$msgStatusList = WindykacjaStatsHelper::get_mail_status_info($user, $terminPlatnosci);
+										$msgStatusList = Windykacja_StatsHelper::get_mail_status_info($user, $terminPlatnosci);
 									} else if ('sms' == $msgType) {
-										$msgStatusList  = WindykacjaStatsHelper::get_sms_status_info($user, $terminPlatnosci);
+										$msgStatusList  = Windykacja_StatsHelper::get_sms_status_info($user, $terminPlatnosci);
 									}
 									foreach ($msgStatusList as $vMsgKey => $vMsgInfo) {
 										if ($vMsgKey == $selectedMsgStatus) {
@@ -327,8 +329,8 @@ jQuery(document).ready(function () {
 						echo '</div>';
 					}
 				} else {
-					$fltrSelected = WindykacjaStatsHelper::get_filter_selected();
-					$users = WindykacjaStatsModel::get_users('', $usersLimit, 0);
+					$fltrSelected = Windykacja_StatsHelper::get_filter_selected();
+					$users = Windykacja_StatsModel::get_users('', $usersLimit, 0);
 					$cmdStats = array('sent' => 0, 'omitted' => 0, 'error' => 0);
 					$usersCount = count($users);
 					@error_log(date('Y-m-d H:i:s') . "\tuser(" . User::getLogin() . ") send mass '{$msgType}' to {$usersCount}/{$usersTotal} users with fltr '{$fltrSelected}' ...\n", 3, '/tmp/se-windykacja.log');
@@ -347,14 +349,14 @@ jQuery(document).ready(function () {
 						}
 
 						if ('mail' == $msgType) {
-							$msgStatusList = WindykacjaStatsHelper::get_mail_status_info($user, $terminPlatnosci);
+							$msgStatusList = Windykacja_StatsHelper::get_mail_status_info($user, $terminPlatnosci);
 						} else if ('sms' == $msgType) {
-							$msgStatusList  = WindykacjaStatsHelper::get_sms_status_info($user, $terminPlatnosci);
+							$msgStatusList  = Windykacja_StatsHelper::get_sms_status_info($user, $terminPlatnosci);
 						}
 						if ('mail' == $msgType) {
-							$ret = WindykacjaStatsHelper::update_mail_status($user, $selectedMsgStatus);
+							$ret = Windykacja_StatsHelper::update_mail_status($user, $selectedMsgStatus);
 						} else if ('sms' == $msgType) {
-							$ret = WindykacjaStatsHelper::update_sms_status($user, $selectedMsgStatus);
+							$ret = Windykacja_StatsHelper::update_sms_status($user, $selectedMsgStatus);
 						}
 						$ret = 1;
 						if ($ret) {
@@ -379,25 +381,25 @@ jQuery(document).ready(function () {
 		}
 	}
 
-	WindykacjaView::css();
+	Windykacja_View::css();
 
 	if ($user_id > 0) {
-		$user = WindykacjaStatsModel::get_user_by_id($user_id);
+		$user = Windykacja_StatsModel::get_user_by_id($user_id);
 		if (!$user) {
 			echo'<p>'."Użytkownik nie istnieje lub brak uprawnień.".'</p>';
 			return;
 		}
 
-		WindykacjaView::user($user);
+		Windykacja_View::user($user);
 
-		WindykacjaView::user_umowy($user);
+		Windykacja_View::user_umowy($user);
 
-		WindykacjaView::user_historia_platnosci($user);
+		Windykacja_View::user_historia_platnosci($user);
 
 	}
 	else {
 		// aktualiacja danych
-		WindykacjaStatsHelper::update_users_table();
+		Windykacja_StatsHelper::update_users_table();
 
 		$items = array();
 
@@ -422,32 +424,32 @@ jQuery(document).ready(function () {
 		}
 
 		if (!empty($q)) {
-			$page_nav->total = WindykacjaStatsModel::get_users_total($q);
+			$page_nav->total = Windykacja_StatsModel::get_users_total($q);
 			$page_nav->last_page_nr = floor($page_nav->total / $page_nav->page_limit);
 
-			$items = WindykacjaStatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
+			$items = Windykacja_StatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
 			$page_nav->page_total = count($items);
 		}
 		else {
-			$page_nav->total = WindykacjaStatsModel::get_users_total($q);
+			$page_nav->total = Windykacja_StatsModel::get_users_total($q);
 			$page_nav->last_page_nr = floor($page_nav->total / $page_nav->page_limit);
 
-			$items = WindykacjaStatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
+			$items = Windykacja_StatsModel::get_users($q, $page_nav->page_limit, $page_nav->page_nr * $page_nav->page_limit, $page_nav->base_link_arr['_oby'], $page_nav->base_link_arr['_odir']);
 			$page_nav->page_total = count($items);
 		}
 
-		WindykacjaView::form($q);
+		Windykacja_View::form($q);
 
-		$to_update_total = WindykacjaStatsHelper::get_to_update_total();
+		$to_update_total = Windykacja_StatsHelper::get_to_update_total();
 		if ($to_update_total > 0) {
 			echo'<p>';
 			echo'<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&task=stats_update&q=".$q."&_p=".V::get('_p', 0, $_GET, 'int') . '">' . "Aktualizuj statusy (" . $to_update_total . ")" . '</a>';
 			echo'</p>';
 		}
 
-		WindykacjaView::items_filters();
+		Windykacja_View::items_filters();
 		if ($page_nav->total > 0) {
-			WindykacjaView::items($q, $page_nav, $items);
+			Windykacja_View::items($q, $page_nav, $items);
 		} else {
 			echo'<p>' . "Brak danych" . '</p>';
 		}
@@ -456,6007 +458,3 @@ jQuery(document).ready(function () {
 }
 
 
-class WindykacjaView {
-
-	public static function user(&$user) {
-
-		$bad_address_task = V::get('bad_address', '', $_POST);
-		$bad_address_msg = array();
-		if ($bad_address_task) {
-			$id_koresp = V::get('ID_KORESP', 0, $_POST, 'int');
-			if ($id_koresp <= 0) {
-				$bad_address_msg['error_id_koresp'] = true;
-			} else {
-				if ($bad_address_task == 'save') {
-					if (!WindykacjaStatsHelper::bad_address_save($user, $id_koresp)) {
-						$bad_address_msg['error'] = true;
-					} else {
-						$bad_address_msg['ok'] = true;
-					}
-				}
-				else if ($bad_address_task == 'confirm') {
-					if (!WindykacjaStatsHelper::bad_address_confirm($user, $id_koresp)) {
-						$bad_address_msg['error'] = true;
-					} else {
-						$bad_address_msg['ok'] = true;
-					}
-				}
-			}
-		}
-
-		$change_status_task = V::get('change_status', '', $_POST);
-		$change_status_msg = array();
-		if ($change_status_task) {
-			if ($change_status_task == 'change') {
-				$new_status = V::get('new_status', '', $_POST);
-				$fltr_arr = WindykacjaStatsHelper::get_filters();
-				if (!array_key_exists($new_status, $fltr_arr)) {
-					$change_status_msg['error'] = true;
-				} else {
-					if (!WindykacjaStatsHelper::change_status_save($user, $new_status)) {
-						$change_status_msg['error'] = true;
-					} else {
-						$change_status_msg['ok'] = true;
-					}
-				}
-			}
-		}
-
-		$set_nr_sprawy_krd_task = V::get('set_nr_sprawy_krd', '', $_POST);
-		$set_nr_sprawy_krd_msg = array();
-		if ($set_nr_sprawy_krd_task) {
-			if ($set_nr_sprawy_krd_task == 'change') {
-				$nr_sprawy_krd = V::get('nr_sprawy_krd', '', $_POST);
-				if (!WindykacjaStatsHelper::nr_sprawy_krd_save($user, $nr_sprawy_krd)) {
-					$set_nr_sprawy_krd_msg['error'] = true;
-				} else {
-					$set_nr_sprawy_krd_msg['ok'] = true;
-				}
-			}
-		}
-
-		$set_nr_sprawy_sad_task = V::get('set_nr_sprawy_sad', '', $_POST);
-		$set_nr_sprawy_sad_msg = array();
-		if ($set_nr_sprawy_sad_task) {
-			if ($set_nr_sprawy_sad_task == 'change') {
-				$nr_sprawy_sad = V::get('nr_sprawy_sad', '', $_POST);
-				if (!WindykacjaStatsHelper::nr_sprawy_sad_save($user, $nr_sprawy_sad)) {
-					$set_nr_sprawy_sad_msg['error'] = true;
-				} else {
-					$set_nr_sprawy_sad_msg['ok'] = true;
-				}
-			}
-		}
-
-		$set_nr_sprawy_komornik_task = V::get('set_nr_sprawy_komornik', '', $_POST);
-		$set_nr_sprawy_komornik_msg = array();
-		if ($set_nr_sprawy_komornik_task) {
-			if ($set_nr_sprawy_komornik_task == 'change') {
-				$nr_sprawy_komornik = V::get('nr_sprawy_komornik', '', $_POST);
-				if (!WindykacjaStatsHelper::nr_sprawy_komornik_save($user, $nr_sprawy_komornik)) {
-					$set_nr_sprawy_komornik_msg['error'] = true;
-				} else {
-					$set_nr_sprawy_komornik_msg['ok'] = true;
-				}
-			}
-		}
-
-		$set_ustalenia_info_task = V::get('set_ustalenia_info', '', $_POST);
-		$set_ustalenia_info_msg = array();
-		if ($set_ustalenia_info_task) {
-			if ($set_ustalenia_info_task == 'change') {
-				$ustalenia_date = V::get('ustalenia_date', '', $_POST);
-				$ustalenia_info = V::get('ustalenia_info', '', $_POST);
-				if (!WindykacjaStatsHelper::ustalenia_info_save($user, $ustalenia_date, $ustalenia_info)) {
-					$set_ustalenia_info_msg['error'] = true;
-				} else {
-					$set_ustalenia_info_msg['ok'] = true;
-				}
-			}
-		}
-
-		$dataBlokady = '';
-		if ($user->STATUS == 9) {
-			$db = DB::getDB();
-			$sqlDataBlokadyTest = "
-				select c.`ID`, c.`STATUS`, h.`STATUS` as h_status, h.`A_RECORD_UPDATE_DATE`, h.`A_RECORD_CREATE_DATE`
-					from `COMPANIES` c
-						join `COMPANIES_HIST` h on(h.`ID_USERS2`=c.`ID`)
-					where (h.`STATUS`='9' or c.`STATUS`='9')
-			";
-			$sqlDataBlokadyTestHasNoDate = "
-				select c.`ID`, c.`STATUS`
-					from `COMPANIES` c
-					where c.`STATUS`='9'
-						and not exists(select h.`ID`
-							from `COMPANIES_HIST` h
-							where h.`ID_USERS2`=c.`ID`
-								and h.`STATUS`='9'
-					)
-			";
-			$sqlDataBlokady = "select h.`A_RECORD_UPDATE_DATE`
-				from `COMPANIES_HIST` h
-				where h.`ID_USERS2`='{$user->ID_BILLING_USERS}'
-					and h.`STATUS`='9'
-				order by h.`ID` desc
-				limit 1
-			";
-			$res = $db->query($sqlDataBlokady);
-			if ($r = $db->fetch($res)) {
-				$dataBlokady = $r->A_RECORD_UPDATE_DATE;
-			}
-		}
-
-		$company = WindykacjaStatsModel::get_company($user);
-		$nr_konta = FunkcjeL1::bankowy_formatuj_nrach(FunkcjeL1::bankowy_make_nrach($company->NR_RACH_MASS_PAY, $user->ID_BILLING_USERS, 0));
-
-		echo'<h3>';
-			echo' <a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&_p=".V::get('_p', '', $_REQUEST)."&_f=".V::get('_f', '', $_REQUEST)."&_oby=".V::get('_oby', '', $_REQUEST)."&_odir=".V::get('_odir', '', $_REQUEST).'">'."Klienci".'</a>';
-			echo ' &raquo; <code style="font-size:normal;color:green;">'."[".$user->id_users."]".'</code>';
-			echo ' <b>'.$user->P_NAME.' '.$user->P_NAME_SECOND.'</b>';
-		echo'</h3>';
-
-		echo '<table class="" cellspacing="0" cellpadding="0" border="0"><tr><td style="vertical-align:top">';
-		echo '<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
-		echo '<caption>';
-			echo "Dane " . (($user->is_firma)? "firmy" : "klienta") . " ";
-			if ($user->BAD_ADDRESS) {
-				echo '<form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."bad_address".'" value="'."confirm".'" />';
-					$js = "if(this.nextSibling.style.display=='none'){this.nextSibling.style.display='block'}else{this.nextSibling.style.display='none'}; return false;";
-					echo '<input type="button" value="'."popraw adres".'" onclick="'.$js.'" style="margin:1px 2px;padding:0 6px;" />';
-					echo '<div style="display:none;">';
-						echo '<label for="ID_KORESP">'."ID Koresp.".'</label>';
-						echo '<input type="text" name="' . "ID_KORESP" . '" size="5" value="' . "" . '" />';
-						echo '<input type="submit" value="'."zapisz".'" />';
-					echo '</div>';
-				echo '</form>';
-			} else {
-				echo '<form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."bad_address".'" value="'."save".'" />';
-					$js = "if(this.nextSibling.style.display=='none'){this.nextSibling.style.display='block'}else{this.nextSibling.style.display='none'}; return false;";
-					echo '<input type="button" value="'."zgłoś błędny adres".'" onclick="'.$js.'" style="margin:1px 2px;padding:0 6px;" />';
-					echo '<div style="display:none;">';
-						echo '<label for="ID_KORESP">'."ID Koresp.".'</label>';
-						echo '<input type="text" name="' . "ID_KORESP" . '" size="5" value="' . "" . '" />';
-						echo '<input type="submit" value="'."zapisz".'" />';
-					echo '</div>';
-				echo '</form>';
-			}
-			if (!empty($bad_address_msg)) {
-				if ('id_koresp' == V::get('error', '', $bad_address_msg)) {
-					echo '<div class="red">'."Podaj poprawny ID Koresp.".'</div>';
-				} else if (true == V::get('error', false, $bad_address_msg)) {
-					echo '<div class="red">'."Error!".'</div>';
-				} else if (true == V::get('ok', false, $bad_address_msg)) {
-					echo '<div style="color:green">'."Zapisano pomyślnie.".'</div>';
-				}
-			}
-		echo '</caption>';
-		echo'<tr>';
-			echo'<th>' . "Adres:" . '</th>';
-			echo'<td'.(($user->BAD_ADDRESS)? ' style="background-color:#FF7878;"' : '').'>';
-				echo "ul. ".$user->P_ADDRESS_STREET." ".$user->P_ADDRESS_HOUSE."/".$user->P_ADDRESS_HOME.", ".$user->P_ADDRESS_POST_CODE." ".$user->P_ADDRESS_CITY;
-			echo'</td>';
-		echo'</tr>';
-		?>
-		<?php if ($user->P_ADRESS_KORESP_1282) : ?>
-			<tr>
-				<th title="Adres do korespondencji">Adres koresp.</th>
-				<td><?php echo $user->P_ADRESS_KORESP_1282; ?></td>
-			</tr>
-		<?php endif; ?>
-		<?php
-		echo'<tr>';
-			echo'<th>' . "Pesel:" . '</th>';
-			echo'<td>';
-				if ($user->P_PESEL) {
-					echo $user->P_PESEL;
-				} else {
-					echo '<span style="color:#f00;">'."Brak numeru PESEL!".'</span>';
-				}
-			echo'</td>';
-		echo'</tr>';
-		echo'<tr>';
-			echo'<th>' . "Nr telefonu:" . '</th>';
-			echo'<td>';
-				if ($user->P_PHONE) {
-					echo $user->P_PHONE;
-				} else {
-					echo '<span style="color:#f00;">'."Brak!".'</span>';
-				}
-			echo'</td>';
-		echo'</tr>';
-		echo'<tr>';
-			echo'<th>' . "Nr dowodu:" . '</th>';
-			echo'<td>';
-				if ($user->P_OTHER_DOC) {
-					echo $user->P_OTHER_DOC;
-				} else {
-					echo '<span style="color:#f00;">'."Brak!".'</span>';
-				}
-			echo'</td>';
-		echo'</tr>';
-		echo'<tr>';
-			echo'<th>' . "e-mail:" . '</th>';
-			echo'<td>';
-				if ($user->user_mail_contact) {
-					echo '<a href="mailto:'.$user->user_mail_contact.'">'.$user->user_mail_contact.'</a>';
-				} else {
-					echo '<span style="color:#f00;">'."Brak!".'</span>';
-				}
-			echo'</td>';
-		echo'</tr>';
-		echo'<tr>';
-			echo'<th>' . "Klient firmy:" . '</th>';
-			echo'<td>';
-				if ($user->BILLING_OWNER == 1) {
-					echo 'BN - BIALL-NET';
-				} else if ($user->BILLING_OWNER == 2) {
-					echo 'ND - NETDAY';
-				} else {
-					echo 'nieznany';
-				}
-			echo'</td>';
-		echo'</tr>';
-		echo'<tr>';
-			echo'<th>' . "Blokada:" . '</th>';
-			echo'<td>';
-				if ($user->STATUS == 9) {
-					echo '<b style="color:red">' . "ZABLOKOWANY" . '</b>';
-					if (!empty($dataBlokady)) {
-						echo '<br>' . "od dnia " . substr($dataBlokady, 0, 10);
-					}
-				} else {
-					echo 'brak blokady';
-				}
-			echo'</td>';
-		echo'</tr>';
-		?>
-		<tr>
-			<th>Nr konta:</th>
-			<td><?php echo $nr_konta; ?></td>
-		</tr>
-		<?php
-		echo '</table>';
-
-		echo '</td><td>' . "&nbsp;" . '</td><td style="vertical-align:top">';
-
-		echo '<table class="tbl-view tbl-umowy-l2'.(($user->A_STATUS_UPDATE_DATE < date("Y-m-d"))? ' wind-status-old' : '').'" cellspacing="0" cellpadding="0" border="1">';
-		echo '<caption>';
-			echo "Status windykacji ";
-			echo '<code style="font-size:x-small; color:#ccc;">' . "(" . $user->WINDYKACJA_ID . ")" . '</code>';
-			if ($user->A_STATUS_UPDATE_DATE < date("Y-m-d")) {
-				echo " " . '<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&_p=".V::get('_p','', $_REQUEST)."&_f=".V::get('_f', '', $_REQUEST)."&_user_id=".$user->ID . '">' . "Aktualizuj status" . '</a>';
-			}
-			// TODO: zmien status klienta - przypisanie do odpowiedniej grupy
-		echo '</caption>';
-		echo '<tr>';
-			echo '<th>' . "status:" . '</th>';
-			echo '<td>';
-				echo $user->A_STATUS;
-if (V::get('DBG', '', $_GET, 'int') > 0) {// TODO: TEST
-	if ($user->A_STATUS == 'waiting-krd') {
-		echo '<br />' . "wezwanie2_DATE: {$user->wezwanie2_DATE}";
-		$wzw2 = new stdClass();
-		$wzw2->Y = intval(substr($user->wezwanie2_DATE, 0, 4));
-		$wzw2->m = intval(substr($user->wezwanie2_DATE, 5, 2));
-		$wzw2->d = intval(substr($user->wezwanie2_DATE, 8, 2));
-		echo '<br />' . "wzw2: {$wzw2->Y}-{$wzw2->m}-{$wzw2->d}";
-		$wzw2->plus_60 = date("Y-m-d", mktime(0,0,0, $wzw2->m, $wzw2->d + 60, $wzw2->Y));
-		echo '<br />' . "wezwanie2_DATE + 60 dni: {$wzw2->plus_60}";
-		if ($wzw2->plus_60 < date("Y-m-d")) {
-			echo '<br />' . "TODO: przenieść do krd";
-		}
-	}
-}// TODO: TEST
-				echo ' &nbsp;&nbsp; <form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."change_status".'" value="'."change".'" />';
-					$fltr_arr = WindykacjaStatsHelper::get_filters();
-					$fltr_options = array();
-					foreach ($fltr_arr as $k_status => $v_arr) {
-						$fltr_options[$k_status] = reset($v_arr);
-					}
-					echo '<select name="' . "new_status" . '">';
-					foreach ($fltr_options as $k_ind => $v_label) {
-						$sel = ($k_ind == $user->A_STATUS)? ' selected="selected"' : '';
-						echo '<option value="' . $k_ind . '"' . $sel . '>' . "{$k_ind}: {$v_label}" . '</option>';
-					}
-					echo '</select>';
-					echo '<input type="submit" value="'."zmień".'" />';
-				echo '</form>';
-
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "Nr sprawy w krd" . '</th>';
-			echo '<td>';
-				echo ' <form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."set_nr_sprawy_krd".'" value="'."change".'" />';
-					echo '<input type="text" name="'."nr_sprawy_krd".'" value="'.$user->NR_SPRAWY_KRD.'" />';
-					echo '<input type="submit" value="'."zmień".'" />';
-				echo '</form>';
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "Nr sprawy w sądzie" . '</th>';
-			echo '<td>';
-				echo ' <form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."set_nr_sprawy_sad".'" value="'."change".'" />';
-					echo '<input type="text" name="'."nr_sprawy_sad".'" value="'.$user->NR_SPRAWY_SAD.'" />';
-					echo '<input type="submit" value="'."zmień".'" />';
-				echo '</form>';
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "Nr sprawy u komornika" . '</th>';
-			echo '<td>';
-				echo ' <form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."set_nr_sprawy_komornik".'" value="'."change".'" />';
-					echo '<input type="text" name="'."nr_sprawy_komornik".'" value="'.$user->NR_SPRAWY_KOMORNIK.'" />';
-					echo '<input type="submit" value="'."zmień".'" />';
-				echo '</form>';
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "Aktualne ustalenia z klientem" . '</th>';
-			echo '<td>';
-				echo ' <form action="" method="POST" style="display:inline">';
-					echo '<input type="hidden" name="'."set_ustalenia_info".'" value="'."change".'" />';
-					echo '<textarea style="width:100%" type="text" name="'."ustalenia_info".'">' . $user->L_APPOITMENT_INFO . '</textarea>';
-					echo '<br />' . "Data: ";
-					echo '<input type="text" name="'."ustalenia_date".'" value="'.$user->L_APPOITMENT_DATE.'" />';
-					echo '<input type="submit" value="'."zmień".'" />';
-					$js = "this.form.ustalenia_info.value=''; this.form.ustalenia_date.value='0000-00-00'; return false;";
-					echo '<input type="reset" value="'."wyszyść".'" onclick="'.$js.'" />';
-				echo '</form>';
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "data ostatniej wpłaty:" . '</th>';
-			echo '<td>';
-				if ($user->LAST_PAY_DATE && $user->LAST_PAY_DATE != '0000-00-00') {
-					echo $user->LAST_PAY_DATE;
-				} else {
-					echo '---';
-				}
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "data wymagalności ostatniej faktury:" . '</th>';
-			echo '<td>';
-				if ($user->PAY_DATE != '0000-00-00') {
-					echo $user->PAY_DATE;
-				}
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "data wymagalności pierwszej faktury:" . '</th>';
-			echo '<td>';
-				if ($user->PAY_DATE_FIRST_FVAT != '0000-00-00') {
-					echo $user->PAY_DATE_FIRST_FVAT;
-				}
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "termin płatności:" . '</th>';
-			echo '<td>';
-				if ($user->PAY_TERM != '0000-00-00') {
-					echo $user->PAY_TERM;
-				}
-			echo '</td>';
-		echo '</tr>';
-		echo '<tr>';
-			echo '<th>' . "Przeniesienie do Vectra?:" . '</th>';
-			echo '<td>';
-				if ($user->IS_MOVED_TO_VECTRA) {
-					echo 'TAK';
-				} else {
-					echo '<span class="text-muted">NIE</span>';
-				}
-			echo '</td>';
-		echo '</tr>';
-		echo '</table>';
-
-		echo '</td></tr></table>';
-
-		// TODO: windykacja_status_info - grupa filtrow do ktorej nalezy klient
-		Lib::loadClass('CompanyHelper');
-		$db = DB::getDB();
-		$comHelper = new CompanyHelper($db);
-		$usr = $comHelper->getById($user->ID);
-		$dealsActive = $comHelper->getDealsFull($user->ID, false);
-
-		Lib::loadClass('PokazOfertyView');
-		$pokaz_oferty_view = new PokazOfertyView();
-		echo $pokaz_oferty_view->print_css();
-		$pokaz_oferty_view->printServices($usr, $dealsActive);
-
-		if(V::get('DBG_ACTIVE_SRV', '', $_GET) > 2){
-			$activeServicesByType = array();
-			$db = DB::getDB();
-			$idUser = $user->ID;
-			$sql = "
-				select srv.`ID` as `ID_SERVICES`
-					, srv.`NAME_LIST_SERVICES`
-					, A_STATUS_L2_SQL_L1(srv.`ID`) as A_STATUS_CURRENT
-				from `SERVICES` srv
-				where srv.`ID_BILLING_USERS`='{$idUser}'
-			";
-			DBG::_(true, true, "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
-			$res = $db->query($sql);
-			while ($r = $db->fetch($res)) {
-				$activeServicesByType[] = $r;
-			}
-			DBG::_(true, true, "activeServicesByType", $activeServicesByType, __CLASS__, __FUNCTION__, __LINE__);
-			$sql = "
-				select
-					IF(1 = (
-							select 1 as hasActiveNET
-							from `SERVICES` srv
-							where srv.`ID_BILLING_USERS`='{$idUser}'
-								and srv.`NAME_LIST_SERVICES`='USERS2'
-								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
-							limit 1
-						), 1, 0) as hasActiveNET
-					,
-					IF(1 = (
-							select 1 as hasActiveTV
-							from `SERVICES` srv
-							where srv.`ID_BILLING_USERS`='{$idUser}'
-								and srv.`NAME_LIST_SERVICES`='TV'
-								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
-							limit 1
-						), 1, 0) as hasActiveTV
-			";
-			DBG::_(true, true, "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
-			$activeServicesByType = array();
-			$res = $db->query($sql);
-			while ($r = $db->fetch($res)) {
-				$activeServicesByType = $r;
-			}
-			DBG::_(true, true, "activeServicesByType", $activeServicesByType, __CLASS__, __FUNCTION__, __LINE__);
-		}
-
-		// aktualny status klienta
-		echo'<div>';
-			if ($user->A_STATUS_UPDATE_DATE < date("Y-m-d")) {
-			}
-			else {
-				switch ($user->A_STATUS) {
-					case 'WAITING': {
-						echo'<p>' . "Status OK" . '</p>';
-					}
-					break;
-					case 'wezwanie1': {
-						$default_PAY_TERM = date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
-						$frm_errors = array();
-						$frm_msgs = array();
-						$frm = array();
-						$frm['wezwanie1_DATE'] = date("Y-m-d");
-						$frm['PAY_TERM'] = V::get('PAY_TERM', $default_PAY_TERM, $_POST);
-						$frm['ID_PROJ'] = V::get('ID_PROJ', 0, $_POST, 'int');
-						if ('set_wezwanie' == V::get('user_task', '', $_POST)) {
-							if ($frm['ID_PROJ'] == 0) {
-								$frm_errors[] = "Brak numeru ID Projketu";
-							}
-							if (empty($frm_errors)) {
-								$ret = WindykacjaStatsHelper::update_user($user, $frm);
-								if ($ret) {
-									$frm_msgs[] = "Status klienta został zaktualizowany";
-								} else {
-									$frm_errors[] = "Status klienta nie został zaktualizowany";
-								}
-							}
-						}
-						echo '<div class="box box-blue" style="margin:6px 0;">';
-							if ($user->PAY_FVAT > 0 && $user->PAY_SALDO <= -0.05) {
-								echo "Saldo klienta: " . '<b style="color:#f00">' . "{$user->PAY_SALDO} zł" . '</b>' . " ({$user->PAY_FVAT} niezapłaconych faktur)" . '<br />';
-								echo'<br />';
-							}
-							echo '<b style="color:#0B0B8E">'."Wysłać wezwanie do zapłaty".'</b>'.'<br />';
-							if (!empty($frm_errors)) {
-								echo'<p style="color:#f00">' . implode('<br />', $frm_errors) . '</p>';
-							}
-							if (!empty($frm_msgs)) {
-								echo'<p style="color:green">' . implode('<br />', $frm_msgs) . '</p>';
-							}
-							echo'<form action="" method="post">';
-								echo'<input type="hidden" name="'."user_task".'" value="'."set_wezwanie".'" />';
-								echo "Data płatności: ";
-									echo'<input type="text" name="'."PAY_TERM".'" value="'.$frm['PAY_TERM'].'" />';
-								echo " ID Projektu (np. 335 - klienci BIALL-NET lub 4956 - klienci Vectra): ";
-									echo'<input type="text" name="'."ID_PROJ".'" value="'.$frm['ID_PROJ'].'" />';
-								echo'<input type="submit" value="'."Zapisz".'" />';
-							echo'</form>';
-						if ($user->wezwanie1_DATE != '0000-00-00') {
-							echo'<br />';
-							$ico_print = '<img src="icon/print.gif" height="16" />';
-							echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie"."&user_id=".$user->ID.'" target="_blank">'.$ico_print." wezwanie do zapłaty".'</a>';
-						}
-						echo '</div>';// .box-blue
-					}
-					break;
-					case 'waiting-wezwanie2': {// TODO: only auto update ?
-						echo '<div class="box box-blue" style="margin:6px 0;">';
-							if ($user->PAY_FVAT > 0 && $user->PAY_SALDO <= -0.05) {
-								echo "Saldo klienta: " . '<b style="color:#f00">' . $user->PAY_SALDO . " zł" . '</b>' . " (" . $user->PAY_FVAT ." niezapłaconych faktur)" . '<br />';
-								echo'<br />';
-							}
-							echo '<b style="color:#0B0B8E">'."Oczekiwanie na uzbieranie kwoty 300zł (firmy 500zł)".'</b>'.'<br />';
-							if (!empty($frm_errors)) {
-								echo'<p style="color:#f00">';
-									echo implode('<br />', $frm_errors);
-								echo'</p>';
-							}
-							echo'<form action="" method="post">';
-							//	echo'<input type="hidden" name="'."user_task".'" value="'."set_".'" />';
-							//	echo'<input type="submit" value="'."Zapisz".'" />';
-							echo'</form>';
-							if ($user->wezwanie1_DATE != '0000-00-00') {
-								echo'<br />';
-								$ico_print = '<img src="icon/print.gif" height="16" />';
-								echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " wezwanie do zapłaty".'</a>'.'<em>'." (termin płatności: " . $user->PAY_TERM . ")".'</em>';
-							}
-						echo '</div>';// .box-blue
-					}
-					break;
-					case 'wezwanie2': {
-						$default_PAY_TERM = date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
-						$frm_msgs = array();
-						$frm_errors = array();
-						$frm = array();
-						$frm['wezwanie2_DATE'] = date("Y-m-d");
-						$frm['PAY_TERM'] = V::get('PAY_TERM', $default_PAY_TERM, $_POST);
-						$frm['ID_PROJ'] = V::get('ID_PROJ', 0, $_POST, 'int');
-						if ('set_wezwanie2' == V::get('user_task', '', $_POST)) {
-							if ($frm['ID_PROJ'] == 0) {
-								$frm_errors[] = "Brak numeru ID korespondencji";
-							}
-							if (empty($frm_errors)) {
-								$ret = WindykacjaStatsHelper::update_user($user, $frm);
-								if ($ret) {
-									$frm_msgs[] = "Status klienta został zaktualizowany";
-								} else {
-									$frm_errors[] = "Status klienta nie został zaktualizowany";
-								}
-							}
-						}
-						echo '<div class="box box-blue" style="margin:6px 0;border-color:#666;">';
-							if ($user->PAY_FVAT > 0 && $user->PAY_SALDO <= -0.05) {
-								echo "Saldo klienta: " . '<b style="color:#f00">' . "{$user->PAY_SALDO} zł" . '</b>' . " ({$user->PAY_FVAT} niezapłaconych faktur)" . '<br />';
-								echo'<br />';
-							}
-							echo '<b style="color:#0B0B8E">'."Wysłać ostateczne wezwanie do zapłaty".'</b>'.'<br />';
-							if (!empty($frm_errors)) {
-								echo'<p style="color:#f00">' . implode('<br />', $frm_errors) . '</p>';
-							}
-							if (!empty($frm_msgs)) {
-								echo'<p style="color:green">' . implode('<br />', $frm_msgs) . '</p>';
-							}
-							echo'<form action="" method="post">';
-								echo'<input type="hidden" name="'."user_task".'" value="'."set_wezwanie2".'" />';
-								echo "Data płatności: ";
-									echo'<input type="text" name="'."PAY_TERM".'" value="'.$frm['PAY_TERM'].'" />';
-								echo " ID Projektu: ";
-									echo'<input type="text" name="'."ID_PROJ".'" value="'.$frm['ID_PROJ'].'" />';
-								echo'<input type="submit" value="'."Zapisz".'" />';
-							echo'</form>';
-						if ($user->wezwanie2_DATE != '0000-00-00') {
-							echo'<br />';
-							$ico_print = '<img src="icon/print.gif" height="16" />';
-							echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie_ostateczne"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " ostateczne wezwanie do zapłaty".'</a>';
-						}
-						echo '</div>';// .box-blue
-					}
-					break;
-					case 'waiting-krd': {
-						if ($user->wezwanie2_DATE != '0000-00-00') {
-							echo'<br />';
-							$ico_print = '<img src="icon/print.gif" height="16" />';
-							echo'<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."wezwanie_ostateczne"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " ostateczne wezwanie do zapłaty".'</a>';
-						}
-					}
-					break;
-					default:
-						echo'<p>' . "TODO: (".$user->A_STATUS.")" . '</p>';
-				}
-			}
-			//if ($user->BA_TIMESTAMP) {
-			//	echo "Stan wzajemnych rozrachunków:";
-			//	echo " WINIEN: <b>".$user->BA_WINIEN."</b> -  MA: <b>".$user->BA_MA."</b>    SALDO(DO ZAPŁATY): <b>".($user->BA_WINIEN - $user->BA_MA)."</b>";
-			//	echo", i jest to stan na dzień ".date("Y-m-d",$user->BA_TIMESTAMP)." ";
-			//}
-			// phone contact
-			$phone_status_info = WindykacjaStatsHelper::get_phone_status_info($user);
-			$sms_status_info = WindykacjaStatsHelper::get_sms_status_info($user);
-			$mail_status_info = WindykacjaStatsHelper::get_mail_status_info($user);
-			$frm_errors = array();
-			$frm_msgs = array();
-			if (1 == V::get('phone_contact_save', 0, $_POST, 'int')) {
-				if ('' == ($phone_status = V::get('phone_status', '', $_POST))) {
-					$frm_errors[] = "Nic nie zaznaczono!";
-				} else {
-					if (!array_key_exists($phone_status, $phone_status_info)) {
-						$frm_errors[] = "Nieprawidłowa wartość!";
-					} else {
-						$ret = WindykacjaStatsHelper::update_phone_status($user, $phone_status);
-						if ($ret) {
-							$frm_msgs[] = "Dane zapisano pomyślnie";
-						} else {
-							$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
-						}
-					}
-				}
-			}
-			if (1 == V::get('sms_contact_save', 0, $_POST, 'int')) {
-				if ('' == ($sms_status = V::get('sms_status', '', $_POST))) {
-					$frm_errors[] = "Nic nie zaznaczono!";
-				} else {
-					if (!array_key_exists($sms_status, $sms_status_info)) {
-						$frm_errors[] = "Nieprawidłowa wartość!";
-					} else {
-						$ret = WindykacjaStatsHelper::update_sms_status($user, $sms_status);
-						if ($ret) {
-							$frm_msgs[] = "Dane zapisano pomyślnie";
-						} else {
-							$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
-						}
-					}
-				}
-			}
-			if (1 == V::get('mail_contact_save', 0, $_POST, 'int')) {
-				if ('' == ($mail_status = V::get('mail_status', '', $_POST))) {
-					$frm_errors[] = "Nic nie zaznaczono!";
-				} else {
-					if (!array_key_exists($mail_status, $mail_status_info)) {
-						$frm_errors[] = "Nieprawidłowa wartość!";
-					} else {
-						$ret = WindykacjaStatsHelper::update_mail_status($user, $mail_status);
-						if ($ret) {
-							$frm_msgs[] = "Dane zapisano pomyślnie";
-						} else {
-							$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
-						}
-					}
-				}
-			}
-			// add old id_koresp to hist (events)
-			if (1 == V::get('contact_add_id_koresp_save', 0, $_POST, 'int')) {
-				if (($id_koresp = V::get('id_koresp', '', $_POST, 'int')) <= 0) {
-					$frm_errors[] = "Nie podano numeru korespondencji!";
-				} else {
-					$koresp_type = V::get('koresp_type', '', $_POST);
-					$ret = WindykacjaStatsHelper::update_old_id_koresp($user, $id_koresp, $koresp_type);
-					if ($ret) {
-						$frm_msgs[] = "Dane zapisano pomyślnie";
-					} else {
-						$frm_errors[] = "Wystąpił błąd podczas zapisu danych";
-					}
-				}
-			}
-			?>
-			<script type="text/javascript">
-function frm_kontakt_phone_submit_callback(frm){
-	var len=frm.phone_status.length;
-	var val='';
-	for(var i=0; i < len; i++){
-		if(frm.phone_status[i].checked){
-			var val = frm.phone_status[i].value;
-		}
-	}
-	if (val!='') {
-		return true;
-	} else {
-		alert('Nic nie zaznaczono.');
-	}
-	return false;
-}
-function frm_kontakt_sms_submit_callback(frm){
-	var len=frm.sms_status.length;
-	var val='';
-	if (!len && frm.sms_status.type && frm.sms_status.type == 'radio') {
-		if (frm.sms_status.checked) {
-		val = frm.sms_status[i].value;
-		}
-	} else {
-		for(var i=0; i < len; i++){
-			if(frm.sms_status[i].checked){
-				var val = frm.sms_status[i].value;
-			}
-		}
-	}
-	if (val!='') {
-		return true;
-	} else {
-		alert('Nic nie zaznaczono.');
-	}
-	return false;
-}
-function frm_kontakt_add_id_koresp(frm){
-	var val=frm.id_koresp.value;
-	if (val!='') {
-		return true;
-	} else {
-		alert('Nie podano numeru korespondencji.');
-	}
-	return false;
-}
-			</script>
-			<div class="box" style="margin:6px 0;border-color:#666;">
-				<?php if (!empty($frm_errors)) {
-					echo'<p style="color:#f00">' . implode('<br />', $frm_errors) . '</p>';
-				}
-				if (!empty($frm_msgs)) {
-					echo'<p style="color:green">' . implode('<br />', $frm_msgs) . '</p>';
-				}
-				?>
-				<table cellspacing="0" cellpadding="0" border="0" class="tbl-td-top"><tr>
-				<td style="padding:0 20px 0 0;color:blue;">
-					<img src="icon/phone.png" alt="tel" />
-					kontakt z klientem
-				</td>
-				<td style="padding:0 5px;text-align:right">
-					<nobr>Co ustalono:</nobr>
-				</td>
-				<td style="min-width:300px;">
-					<form action="" method="post" onsubmit="return frm_kontakt_phone_submit_callback(this);">
-					<div id="kontakt-phone">
-						<input type="hidden" name="phone_contact_save" value="1" />
-						<?php foreach ($phone_status_info as $k_type => $v_info) {
-							echo '<input type="radio" name="'."phone_status".'" value="' . $k_type . '" />'; echo " " . $v_info['label'] . " " . $v_info['date'] . '<br />';
-						} ?>
-					</div>
-					<input type="submit" value="zapisz" />
-					</form>
-				</td>
-				<td style="width:40px">
-				</td>
-				<td>
-					<?php if (!empty($sms_status_info)) : ?>
-						<form action="" method="post" onsubmit="return frm_kontakt_sms_submit_callback(this);">
-						<div id="kontakt-sms">
-							<input type="hidden" name="sms_contact_save" value="1" />
-							<?php foreach ($sms_status_info as $k_type => $v_info) {
-								echo '<input type="radio" name="'."sms_status".'" value="' . $k_type . '" />'; echo " {$v_info['label']}:<br> {$v_info['msg']}" . '<br />';
-							} ?>
-						</div>
-						<input type="submit" value="wyślij" />
-						</form>
-					<?php endif; ?>
-				</td>
-				<td style="width:40px">
-				</td>
-				<td>
-					<?php if (!empty($mail_status_info)) : ?>
-						<form action="" method="post" onsubmit="return frm_kontakt_mail_submit_callback(this);">
-						<div id="kontakt-mail">
-							<input type="hidden" name="mail_contact_save" value="1" />
-							<?php foreach ($mail_status_info as $k_type => $v_info) {
-								echo '<input type="radio" name="'."mail_status".'" value="' . $k_type . '" />'; echo " {$v_info['label']}:<br> {$v_info['msg']}" . '<br />';
-							} ?>
-						</div>
-						<input type="submit" value="wyślij" />
-						</form>
-					<?php endif; ?>
-				</td>
-				</tr></table>
-			</div>
-
-			<div class="box" style="margin:6px 0;border-color:#666;">
-			<form action="" method="post" onsubmit="return frm_kontakt_add_id_koresp(this);">
-				<input type="hidden" name="contact_add_id_koresp_save" value="1" />
-				Dodaj korespondencję z klientem - ID_KORESP:
-				<input type="text" name="id_koresp" value="" class="i" />
-				<input type="submit" value="zapisz" />
-			</form>
-			</div>
-
-			<div class="box" style="margin:6px 0;border-color:#666;">
-				<?php
-				$ico_print = '<img src="icon/print.gif" height="16" />';
-				echo '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy"."&user_id=".$user->ID.'" target="_blank">' . $ico_print . " rozwiązanie umowy".'</a>';
-				?>
-			</div>
-		</div>
-		<?php
-	}
-
-	public static function items_filters() {
-		$filter_arr = WindykacjaStatsHelper::get_filters();
-		$filter_selected = WindykacjaStatsHelper::get_filter_selected();
-		$status_cnt = WindykacjaStatsHelper::get_status_count();// {cnt, suma_zaleglosci}
-		// pomin filtry
-		unset($filter_arr['15']);
-		unset($filter_arr['blokada']);
-		unset($filter_arr['WAITING']);
-		$sub_filters = array('tel1', 'bad_address', '3 m-ce przed', 'po-terminie', 'has_nr_sad', 'has_nr_komornik', 'has_ustalenia', 'sad_and_komornik', 'sad_bez_komornik', 'isMovedToVectra');
-		$sub_filters_arr = array();
-		foreach ($sub_filters as $v_filter_name) {
-			if (array_key_exists($v_filter_name, $filter_arr)) {
-				$sub_filters_arr[$v_filter_name] = $filter_arr[$v_filter_name];
-				unset($filter_arr[$v_filter_name]);
-			}
-		}
-		$zewn_filters = array('waiting-sad', 'docs-in-sad', 'sad');
-		$zewn_filters_arr = array();
-		foreach ($zewn_filters as $v_filter_name) {
-			if (array_key_exists($v_filter_name, $filter_arr)) {
-				$zewn_filters_arr[$v_filter_name] = $filter_arr[$v_filter_name];
-				unset($filter_arr[$v_filter_name]);
-			}
-		}
-
-		echo'<table cellspacing="0" cellpadding="0" border="1" style="background:#ddd;border-color:#666;"><tr><td style="vertical-align:top">';
-		if (!empty($filter_selected)) {
-				echo'<a href="' . "??MENU_INIT=USERS2_WINDYKACJA_STATUS" . '" title="'."Kasuj filtry".'">' . '<img src="icon/del.png" height="16" alt="'."Kasuj filtry".'" />' . '</a>';
-			echo '</td><td>';
-		}
-
-		echo'<table class="tbl-view historia-platnosci-filters" cellspacing="0" cellpadding="0" border="1">';
-		echo'<thead>';
-		echo'<tr>';
-			foreach ($filter_arr as $k => $v_arr) {
-				$cls = ($filter_selected == $k)? ' class="selected"' : '';
-				echo'<td' . $cls . '>';
-					if ($desc = V::get('desc', '', $v_arr)) {
-						echo '<span title="' . end($desc) . '">' . reset($desc) . '</span>';
-					}
-				echo'</td>';
-			}
-			if (!empty($zewn_filters_arr)) {
-				echo '<td colspan="'.count($zewn_filters_arr).'" style="background:#f00;color:#fff;font-weight:bold;">' . "Windykacja zewnętrzna" . '</td>';
-			}
-		echo'</tr>';
-		echo'<tr>';
-			foreach ($filter_arr as $k => $v_arr) {
-				$cls = ($filter_selected == $k)? ' class="selected"' : '';
-				echo'<td' . $cls . '>';
-					echo '<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&_f=" . $k . '">' . reset($v_arr) . '</a>';
-					//$stat_cnt = V::get($k, 0, $status_cnt, 'int');
-					//echo ' <span style="color:#f00;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-						$stat_cnt = 0;
-					if (array_key_exists($k, $status_cnt)) {
-						$stat_cnt = $status_cnt[$k]->cnt;
-						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-						$stat_saldo = number_format($status_cnt[$k]->suma_zaleglosci, 2, ',', ' ');
-						echo '<br />' . '<span style="color:#f00;" title="' . $stat_saldo . " zł zagdłużenia" . '">' . $stat_saldo . '</span>';
-					} else {
-						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-					}
-				echo'</td>';
-			}
-			if (!empty($zewn_filters_arr)) {
-				foreach ($zewn_filters_arr as $k => $v_arr) {
-					$cls = ($filter_selected == $k)? ' class="selected"' : '';
-					echo'<td' . $cls . '>';
-						echo '<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&_f=" . $k . '">' . reset($v_arr) . '</a>';
-						//$stat_cnt = V::get($k, 0, $status_cnt, 'int');
-						//echo ' <span style="color:#f00;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-							$stat_cnt = 0;
-						if (array_key_exists($k, $status_cnt)) {
-							$stat_cnt = $status_cnt[$k]->cnt;
-							echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-							$stat_saldo = number_format($status_cnt[$k]->suma_zaleglosci, 2, ',', ' ');
-							echo '<br />' . '<span style="color:#f00;" title="' . $stat_saldo . " zł zagdłużenia" . '">' . $stat_saldo . '</span>';
-						} else {
-							echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-						}
-					echo'</td>';
-				}
-			}
-		echo'</tr>';
-		echo'</thead>';
-		echo'</table>';
-
-		if (!empty($sub_filters_arr)) {
-			echo '<table class="tbl-view historia-platnosci-subfilters" cellspacing="0" cellpadding="0" border="1">';
-			echo '<thead><tr>';
-			foreach ($sub_filters_arr as $k => $v_arr) {
-				$cls = ($filter_selected == $k)? ' class="selected"' : '';
-				echo'<td' . $cls . '>';
-					echo '<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&_f=" . $k . '">' . reset($v_arr) . '</a>';
-					//$stat_cnt = V::get($k, 0, $status_cnt, 'int');
-					//echo ' <span style="color:#f00;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-						$stat_cnt = 0;
-					if (array_key_exists($k, $status_cnt)) {
-						$stat_cnt = $status_cnt[$k]->cnt;
-						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-						$stat_saldo = number_format($status_cnt[$k]->suma_zaleglosci, 2, ',', ' ');
-						echo '<br />' . '<span style="color:#000;" title="' . $stat_saldo . " zł zagdłużenia" . '">' . $stat_saldo . '</span>';
-					} else {
-						echo ' <span style="color:#000;" title="' . $stat_cnt . " klinetów" . '">' . "(" . $stat_cnt . ")" . '</span>';
-					}
-				echo'</td>';
-			}
-			echo '</tr></thead>';
-			echo '</table>';
-		}
-
-		echo '</td></tr></table>';
-
-		echo'<br />';
-	}
-
-	public static function items($q, &$page_nav, &$items) {
-		$page_nav->links = array();
-
-		$out_link_arr = V::copy($page_nav->base_link_arr);
-		$out_link_arr['_p'] = 0;
-		$out_link = V::make_link('', $out_link_arr);
-		$page_nav->links[] = '<a href="' . $out_link . '" title="'."Pierwsza strona".'">'."|&lt;&lt;".'</a>';
-
-		if ($page_nav->page_nr > 0) {
-			$out_link_arr = V::copy($page_nav->base_link_arr);
-			$out_link_arr['_p'] = $page_nav->page_nr - 1;
-			$out_link = V::make_link('', $out_link_arr);
-			$page_nav->links[] =  '<a href="' . $out_link . '" title="'."Poprzednia strona".'">'."&lt;&lt; -{$page_nav->page_limit}".'</a>';
-		} else {
-			$page_nav->links[] =  " &lt;&lt; ";
-		}
-
-		$page_nav->links[] =  '<span>'.($page_nav->page_nr * $page_nav->page_limit).'</span>';
-		$page_nav->links[] =  '<span title="'."Znaleziono ".$page_nav->total." rekordów".'">'."({$page_nav->total}) ".'</span>';
-
-		$out_link_arr = V::copy($page_nav->base_link_arr);
-		$out_link_arr['_p'] = $page_nav->page_nr + 1;
-		$out_link = V::make_link('', $out_link_arr);
-		$page_nav->links[] =  '<a href="' . $out_link . '" title="'."Nastepna strona".'">'."+{$page_nav->page_limit} &gt;&gt;".'</a>';
-
-		$out_link_arr = V::copy($page_nav->base_link_arr);
-		$out_link_arr['_p'] = $page_nav->last_page_nr;
-		$out_link = V::make_link('', $out_link_arr);
-		$page_nav->links[] =  '<a href="' . $out_link . '" title="'."Ostatnia strona".'">'."&gt;&gt;|".'</a>';
-
-		$page_nav_out = '<div class="tbl-page-nav">' . implode(" ", $page_nav->links);
-			$out_link_arr = V::copy($page_nav->base_link_arr);
-			$out_link_arr['task'] = 'export_csv';
-			$out_link_arr['HEADER_NOT_INIT'] = 'YES';
-			$out_link = V::make_link('', $out_link_arr);
-			$page_nav_out .= ' <a style="margin:0 0 0 20px;" href="' . $out_link . '" target="_blank">export csv</a>';
-
-			$out_link_arr = V::copy($page_nav->base_link_arr);
-			$out_link_arr['task'] = 'send_mass_mail';
-			$out_link = V::make_link('', $out_link_arr);
-			$page_nav_out .= ' <a style="margin:0 0 0 20px;" href="' . $out_link . '" target="_blank">send mail</a>';
-
-			$out_link_arr = V::copy($page_nav->base_link_arr);
-			$out_link_arr['task'] = 'send_mass_sms';
-			$out_link = V::make_link('', $out_link_arr);
-			$page_nav_out .= ' <a style="margin:0 0 0 20px;" href="' . $out_link . '" target="_blank">send sms</a>';
-		$page_nav_out .= '</div>';
-
-		if (empty($items)) {
-			echo'<p style="color:red">'."Brak danych".'</p>';
-			return;
-		}
-		echo $page_nav_out;
-
-		$cols_order_by = WindykacjaStatsModel::get_order_by_fields();
-		$cols = array();
-		$cols['ID_BILLING_USERS'] = array('label'=>'Nr klienta', 'title'=>'ID_BILLING_USERS');
-		$cols['is_firma'] = array('label'=>'F', 'title'=>'is_firma: Firma 1 - tak, 0 nie');
-		$cols['BILLING_OWNER'] = array('label'=>'COM', 'title'=>'BILLING_OWNER: Klient firmy 1 - BIALL-NET, 2 - NETDAY');
-		$cols['BLOKADA'] = array('label'=>'B', 'title'=>'BLOKADA: Informacja o blokadzie');
-		$cols['P_NAME'] = array('label'=>'imie i nazwisko', 'title'=>'P_NAME');
-		$cols['P_ADDRESS_STREET'] = array('label'=>'adres', 'title'=>'P_ADDRESS_STREET');
-		$cols['P_ADDRESS_Koresp'] = array('label'=>'adres koresp.', 'title'=>'Adres do korespondencji');
-		$cols['P_PHONE'] = array('label'=>'nr telefonu', 'title'=>'P_PHONE');
-		$cols['user_mail_contact'] = array('label'=>'adres e-mail', 'title'=>'user_mail_contact');
-		$cols['A_STATUS'] = array('label'=>'status', 'title'=>'A_STATUS');
-		$cols['A_STATUS_UPDATE_DATE'] = array('label'=>'data aktualizacji', 'title'=>'A_STATUS_UPDATE_DATE');
-		$cols['PAY_SALDO'] = array('label'=>'saldo', 'title'=>'PAY_SALDO');
-		$cols['PAY_SALDO_30_DNI'] = array('label'=>'saldo 30 dni', 'title'=>'Saldo bez faktur z terminem płatności < 30 dni');
-		$cols['PAY_SALDO_ISSUED'] = array('label'=>'saldo wystawione', 'title'=>'Saldo wg daty wystawienia faktur');
-		$cols['PAY_FVAT'] = array('label'=>'zaległe faktury', 'title'=>'PAY_FVAT');
-		$cols['PAY_DATE_FIRST_FVAT'] = array('label'=>'data wymagalności<br> pierwszej faktury', 'title'=>'PAY_DATE_FIRST_FVAT');
-		$cols['PAY_DATE'] = array('label'=>'data wymagalności<br> ostatniej faktury', 'title'=>'PAY_DATE');
-		$cols['LAST_FVAT_VALUE'] = array('label'=>'kwota ostatniej faktury', 'title'=>'LAST_FVAT_VALUE');
-		$cols['LAST_PAY_DATE'] = array('label'=>'data ostatniej wpłaty', 'title'=>'LAST_PAY_DATE');
-		$cols['LAST_PAY_VALUE'] = array('label'=>'kwota ostatniej wpłaty', 'title'=>'LAST_PAY_VALUE');
-		$cols['PAY_TERM'] = array('label'=>'termin płatności', 'title'=>'PAY_TERM');
-		$cols['IS_MOVED_TO_VECTRA'] = array('label'=>'Przeniesienie do Vectra?', 'title'=>'IS_MOVED_TO_VECTRA');
-		$cols['HAS_ACTIVE_NET'] = array('label'=>'NET', 'title'=>'Aktywne usługi NET');
-		$cols['HAS_ACTIVE_TV']  = array('label'=>'TV',  'title'=>'Aktywne uslugi TV');
-
-		echo'<table class="tbl-view historia-platnosci" border="1" cellspacing="0" cellpaddin="0">';
-		echo'<thead>';
-			echo'<tr>';
-			foreach ($cols as $k_field => $v_params) {
-				echo'<th' . ((!empty($v_params['title'])) ? ' title="' . $v_params['title'] . '"' : '') . '>';
-					echo $v_params['label'];
-
-					if (in_array($k_field, $cols_order_by)) {
-						$sel_oby  = (isset($page_nav->base_link_arr['_oby']))?  $page_nav->base_link_arr['_oby']  : '';
-						$sel_odir = 'DESC';
-						if ($k_field == $sel_oby) {
-							$sel_odir = (isset($page_nav->base_link_arr['_odir']))? $page_nav->base_link_arr['_odir'] : '';
-							$sel_odir = ($sel_odir == 'ASC')? 'ASC' : 'DESC';
-						}
-
-						$out_link_arr = V::copy($page_nav->base_link_arr);
-						$out_link_arr['_p'] = 0;
-						$out_link_arr['_oby'] = $k_field;
-						$out_link_arr['_odir'] = ($sel_odir == 'DESC')? 'ASC' : 'DESC';
-						$out_link = V::make_link('', $out_link_arr);
-						echo ' <a style="' . (($k_field == $sel_oby)? 'color:red;' : '') . 'text-decoration:none" href="' . $out_link . '">' . (($sel_odir == 'DESC')? 'v' : '^') . '</a>';
-					}
-				echo '</th>';
-			}
-			echo'</tr>';
-		echo'</thead>';
-		echo'<tbody>';
-		$t = 0;
-		foreach ($items as $k_id => $user) {
-			echo'<tr class="row-'.($t = 1 - $t).'">';
-				echo'<td>';
-					echo'<nobr>';
-					$out_link_arr = V::copy($page_nav->base_link_arr);
-					$out_link_arr['_user_id'] = $k_id;
-					$out_link = V::make_link('', $out_link_arr);
-					echo '<a href="' . $out_link . '">'.'<img src="icon/edit.png" height="16" alt="Edit">'.'</a>';
-					echo " ";
-					echo '<a href="' . $out_link . '">'.$k_id.'</a>';
-					echo'</nobr>';
-				echo'</td>';
-				echo '<td>';
-					echo $user->is_firma;
-				echo '</td>';
-				echo '<td>';
-					if ($user->BILLING_OWNER == 1) {
-						echo '<span title="' . "BIALL-NET" . '">' . 'BN' . '</span>';
-					} else if ($user->BILLING_OWNER == 2) {
-						echo '<span title="' . "NETDAY" . '">' . 'ND' . '</span>';
-					} else {
-						echo '0';
-					}
-				echo '</td>';
-				echo '<td>';
-					if ($user->STATUS == 9) {
-						echo '<b style="color:red" title="' . "ZABLOKOWANY" . '">' . "Z" . '</b>';
-					} else {
-						echo '<em style="color:silver" title="' . "brak blokady" . '">' . "0" . '</em>';
-					}
-				echo '</td>';
-				echo'<td style="white-space:nowrap;">';
-					$cell_out = $user->P_NAME.' '.$user->P_NAME_SECOND;
-					echo '<b title="' . $cell_out . '">' . ((strlen($cell_out) > 30)? substr($cell_out, 0, 30) . ' ...' : $cell_out) . '</b>';
-				echo'</td>';
-				echo'<td style="white-space:nowrap;'.(($user->BAD_ADDRESS)? 'background-color:#FF7878;' : '').'">';
-					$cell_out = "ul. " . $user->P_ADDRESS_STREET . " " . $user->P_ADDRESS_HOUSE . "/" . $user->P_ADDRESS_HOME . ", " . $user->P_ADDRESS_POST_CODE . " " . $user->P_ADDRESS_CITY;
-					echo '<i title="' . (($user->BAD_ADDRESS)? "błędny adres zameldowania: " : '') . $cell_out . '">' . ((strlen($cell_out) > 30)? mb_substr($cell_out, 0, 30, "UTF-8") . ' ...' : $cell_out) . '</i>';
-				echo'</td>';
-				?>
-				<?php if ($user->P_ADRESS_KORESP_1282) : ?>
-					<td title="Adres do korespondencji: <?php echo $user->P_ADRESS_KORESP_1282; ?>">
-						<?php echo $user->P_ADRESS_KORESP_1282; ?>
-					</td>
-				<?php else: ?>
-					<td></td>
-				<?php endif; ?>
-				<?php
-				echo '<td>' . $user->P_PHONE . '</td>';
-				echo '<td>' . $user->user_mail_contact . '</td>';
-				echo'<td>';
-					echo '<nobr>';
-					switch ($user->A_STATUS) {
-						case 'WAITING':
-							echo '<span style="color:#666;">' . $user->A_STATUS . '</span>';
-							break;
-						default:
-							echo $user->A_STATUS;
-					}
-					echo '</nobr>';
-				echo'</td>';
-				echo'<td>';
-					if ($user->A_STATUS_UPDATE_DATE != '0000-00-00') {
-						echo $user->A_STATUS_UPDATE_DATE;
-					} else {
-						echo '<span style="color:#666;">' . $user->A_STATUS_UPDATE_DATE . '</span>';
-					}
-				echo'</td>';
-				echo'<td>';
-					echo '<nobr>';
-					if ($user->PAY_SALDO != 0) {
-						$col = ($user->PAY_SALDO > 0)? '#333' : '#f00';
-						echo '<span style="color:' . $col . '">' . "{$user->PAY_SALDO} zł" . '</span>';
-					} else {
-						echo'<span style="color:#666">' . "0" . '</span>';
-					}
-					echo '</nobr>';
-				echo'</td>';
-				echo'<td>';
-					echo '<nobr>';
-					if ($user->PAY_SALDO_30_DNI != 0) {
-						$col = ($user->PAY_SALDO_30_DNI > 0)? '#333' : '#f00';
-						echo '<span style="color:' . $col . '">' . "{$user->PAY_SALDO_30_DNI} zł" . '</span>';
-					} else {
-						echo'<span style="color:#666">' . "0" . '</span>';
-					}
-					echo '</nobr>';
-				echo'</td>';
-				echo'<td>';
-					echo '<nobr>';
-					if ($user->PAY_SALDO_ISSUED != 0) {
-						$col = ($user->PAY_SALDO_ISSUED > 0)? '#333' : '#f00';
-						echo '<span style="color:' . $col . '">' . "{$user->PAY_SALDO_ISSUED} zł" . '</span>';
-					} else {
-						echo'<span style="color:#666">' . "0" . '</span>';
-					}
-					echo '</nobr>';
-				echo'</td>';
-				echo'<td>';
-					if ($user->PAY_FVAT > 0) {
-						$st = ($user->PAY_FVAT > 1)? ' style="color:#f00"' : '';
-						echo' <span title="' . "{$user->PAY_FVAT} nieopłaconych faktur" . '"'.$st.'>' . $user->PAY_FVAT . '</span>';
-					} else {
-						echo $user->PAY_FVAT;
-					}
-				echo'</td>';
-				echo'<td>';
-					if ($user->PAY_DATE_FIRST_FVAT != '0000-00-00') {
-						echo $user->PAY_DATE_FIRST_FVAT;
-					}
-				echo'</td>';
-				echo'<td>';
-					if ($user->PAY_DATE != '0000-00-00') {
-						echo $user->PAY_DATE;
-					}
-				echo'</td>';
-				echo'<td>';
-					echo $user->LAST_FVAT_VALUE;
-				echo'</td>';
-				echo'<td>';
-					if ($user->LAST_PAY_DATE && $user->LAST_PAY_DATE != '0000-00-00') {
-						echo $user->LAST_PAY_DATE;
-					} else {
-						echo '---';
-					}
-				echo'</td>';
-				echo'<td>';
-					echo $user->LAST_PAY_VALUE;
-				echo'</td>';
-				echo'<td>';
-					if ($user->PAY_TERM != '0000-00-00') {
-						echo $user->PAY_TERM;
-					}
-				echo'</td>';
-				echo'<td>';
-					if ($user->IS_MOVED_TO_VECTRA) {
-						echo 'TAK';
-					} else {
-						echo '<span class="text-muted">NIE</span>';
-					}
-				echo'</td>';
-				echo'<td>' . $user->HAS_ACTIVE_NET . '</td>';
-				echo'<td>' . $user->HAS_ACTIVE_TV . '</td>';
-				//, w.`USER_PAY_TERM_ADD`
-				//, w.`L_APPOITMENT_DATE`
-				//, w.`L_APPOITMENT_USER`
-			echo'</tr>';
-		}
-		echo'</tbody>';
-		echo'</table>';
-		echo $page_nav_out;
-	}
-
-	public static function export_csv($q, &$page_nav, &$items) {
-		if (empty($items)) {
-			echo "Brak danych";
-			return;
-		}
-
-		$activeFiltr = V::get('_f', 'all', $_GET);
-		$csvFileName = "Windykacja-{$activeFiltr}";
-		header('Content-Type: text/csv; charset=utf-8');
-		header("Content-Disposition: attachment; filename={$csvFileName}.csv");
-
-		$cols_order_by = WindykacjaStatsModel::get_order_by_fields();
-		$cols = array();
-		$cols['ID_BILLING_USERS'] = array('label'=>'Nr klienta', 'title'=>'ID_BILLING_USERS');
-		$cols['is_firma'] = array('label'=>'F', 'title'=>'is_firma: Firma 1 - tak, 0 nie');
-		$cols['BILLING_OWNER'] = array('label'=>'COM', 'title'=>'BILLING_OWNER: Klient firmy 1 - BIALL-NET, 2 - NETDAY');
-		$cols['BLOKADA'] = array('label'=>'B', 'title'=>'BLOKADA: Informacja o blokadzie');
-		$cols['P_NAME'] = array('label'=>'imie i nazwisko', 'title'=>'P_NAME');
-		$cols['P_ADDRESS_STREET'] = array('label'=>'adres', 'title'=>'P_ADDRESS_STREET');
-		$cols['P_ADDRESS_Koresp'] = array('label'=>'adres koresp.', 'title'=>'Adres do korespondencji');
-		$cols['P_PHONE'] = array('label'=>'nr telefonu', 'title'=>'P_PHONE');
-		$cols['user_mail_contact'] = array('label'=>'adres e-mail', 'title'=>'user_mail_contact');
-		$cols['P_PESEL'] = array('label'=>'pesel', 'title'=>'P_PESEL');
-		$cols['A_STATUS'] = array('label'=>'status', 'title'=>'A_STATUS');
-		$cols['A_STATUS_UPDATE_DATE'] = array('label'=>'data aktualizacji', 'title'=>'A_STATUS_UPDATE_DATE');
-		$cols['PAY_SALDO'] = array('label'=>'saldo', 'title'=>'PAY_SALDO');
-		$cols['PAY_SALDO_30_DNI'] = array('label'=>'saldo 30 dni', 'title'=>'Saldo bez faktur z terminem płatności < 30 dni');
-		$cols['PAY_SALDO_ISSUED'] = array('label'=>'saldo wystawione', 'title'=>'Saldo wg daty wystawienia faktur');
-		$cols['PAY_FVAT'] = array('label'=>'zaległe faktury', 'title'=>'PAY_FVAT');
-		$cols['PAY_DATE_FIRST_FVAT'] = array('label'=>'data wymagalności pierwszej faktury', 'title'=>'PAY_DATE_FIRST_FVAT');
-		$cols['PAY_DATE'] = array('label'=>'data wymagalności ostatniej faktury', 'title'=>'PAY_DATE');
-		$cols['LAST_FVAT_VALUE'] = array('label'=>'kwota ostatniej faktury', 'title'=>'LAST_FVAT_VALUE');
-		$cols['LAST_PAY_DATE'] = array('label'=>'data ostatniej wpłaty', 'title'=>'LAST_PAY_DATE');
-		$cols['LAST_PAY_VALUE'] = array('label'=>'kwota ostatniej wpłaty', 'title'=>'LAST_PAY_VALUE');
-		$cols['PAY_TERM'] = array('label'=>'termin płatności', 'title'=>'PAY_TERM');
-		$cols['ACCOUNT_NUMBER'] = array('label'=>'nr konta', 'title'=>'ACCOUNT_NUMBER');
-		$cols['SERVICES_STREETS'] = array('label'=>'adresy usług', 'title'=>'SERVICES_STREETS');
-		$cols['IS_MOVED_TO_VECTRA'] = array('label'=>'Przeniesienie do Vectra', 'title'=>'IS_MOVED_TO_VECTRA');
-		$cols['HAS_ACTIVE_NET'] = array('label'=>'NET', 'title'=>'Aktywne usługi NET');
-		$cols['HAS_ACTIVE_TV']  = array('label'=>'TV',  'title'=>'Aktywne uslugi TV');
-
-		$out_cols = array();
-		foreach ($cols as $k_field => $v_params) {
-			$out_cols[] = '"' . $v_params['label'] . '"';
-		}
-		echo implode(";", $out_cols) . "\n";
-		foreach ($items as $k_id => $user) {
-			$out_cols = array();
-			$out_cols[] = '"' . $k_id . '"';
-			$out_cols[] = '"' . $user->is_firma . '"';
-			if ($user->BILLING_OWNER == 1) {
-				$out_cols[] = '"' . 'BN' . '"';
-			} else if ($user->BILLING_OWNER == 2) {
-				$out_cols[] = '"' . 'ND' . '"';
-			} else {
-				$out_cols[] = '"' . '0' . '"';
-			}
-			$out_cols[] = '"' . (($user->STATUS == 9)? "Z" : "0") . '"';
-			$out_cols[] = '"' . $user->P_NAME.' '.$user->P_NAME_SECOND . '"';
-			$out_cols[] = '"' . "ul. {$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}/{$user->P_ADDRESS_HOME}, {$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}" . '"';
-			if ($user->P_ADRESS_KORESP_1282) {
-				$out_cols[] = '"' . $user->P_ADRESS_KORESP_1282 . '"';
-			} else {
-				$out_cols[] = '""';
-			}
-			$out_cols[] = '"' . $user->P_PHONE . '"';
-			$out_cols[] = '"' . $user->user_mail_contact . '"';
-			$out_cols[] = '"' . $user->P_PESEL . '"';
-			$out_cols[] = '"' . $user->A_STATUS . '"';
-			$out_cols[] = '"' . $user->A_STATUS_UPDATE_DATE . '"';
-			$out_cols[] = '"' . (($user->PAY_SALDO != 0)? "{$user->PAY_SALDO} zł" : "0") . '"';
-			$out_cols[] = '"' . (($user->PAY_SALDO_30_DNI != 0)? "{$user->PAY_SALDO_30_DNI} zł" : "0") . '"';
-			$out_cols[] = '"' . (($user->PAY_SALDO_ISSUED != 0)? "{$user->PAY_SALDO_ISSUED} zł" : "0") . '"';
-			$out_cols[] = '"' . $user->PAY_FVAT . '"';
-			$out_cols[] = '"' . (($user->PAY_DATE_FIRST_FVAT != '0000-00-00')? $user->PAY_DATE_FIRST_FVAT : '') . '"';
-			$out_cols[] = '"' . (($user->PAY_DATE != '0000-00-00')? $user->PAY_DATE : '') . '"';
-			$out_cols[] = '"' . $user->LAST_FVAT_VALUE . '"';
-			$out_cols[] = '"' . (($user->LAST_PAY_DATE && $user->LAST_PAY_DATE != '0000-00-00')? $user->LAST_PAY_DATE : '---') . '"';
-			$out_cols[] = '"' . $user->LAST_PAY_VALUE . '"';
-			$out_cols[] = '"' . (($user->PAY_TERM != '0000-00-00')? $user->PAY_TERM : '') . '"';
-			$out_cols[] = '"' . $user->ACCOUNT_NUMBER . '"';
-			$out_cols[] = '"' . $user->SERVICES_STREETS . '"';
-			$out_cols[] = '"' . (($user->IS_MOVED_TO_VECTRA)? 'TAK' : 'NIE') . '"';
-			$out_cols[] = '"' . $user->HAS_ACTIVE_NET . '"';
-			$out_cols[] = '"' . $user->HAS_ACTIVE_TV . '"';
-			echo implode(";", $out_cols) . "\n";
-		}
-	}
-
-	public static function form($q = '') {
-
-		SEF("MENU");
-		MENU();
-
-		echo'<div class="box box-blue">';
-		echo'<form action="" method="get">';
-			echo'<input type="hidden" name="'."MENU_INIT".'" value="'."USERS2_WINDYKACJA_STATUS".'" />';
-			echo'<p style="margin:0;">'."Wyszukaj klienta: ";
-				echo'<input type="text" name="'."q".'" value="'.htmlspecialchars($q).'" />';
-				echo " ".'<em>'."(imie, nazwisko lub numer klineta)".'</em>';//, adres
-				echo " ".'<input type="submit" value="'."szukaj".'" />';
-			echo'</p>';
-		echo'</form>';
-		echo'</div>';// .box-blue
-	}
-
-	public static function css() {
-		echo'<style type="text/css">'."
-body{font-family:arial;line-height:1.4;}
-.box{border:1px solid #999;padding:5px;margin:5px;}
-.box-center{border:1px solid #999;padding:5px;margin:5px auto;}
-.box-silver{border-color:#999;}
-.box-red{border-color:#f00;}
-.box-blue{border-color:#00f;}
-.box-green{border-color:#008000;}
-.box-hover-active{background:#fff;border-color:#999;}
-.box-hover-active:hover{background:#eee;border-color:#000;}
-
-.btn-box{margin:0 2px 0 0;padding:0 3px;background:#bbb;color:#fff;text-decoration:none;border:0;font-weight:bold;}
-
-.tbl-page-nav{font-size:small;}
- .tbl-page-nav a{font-size:small; text-decoration:none;}
- .tbl-page-nav a:hover{background-color:#eee;}
-
-.tbl-view {margin:0;font-size:small;}
-.tbl-view caption{text-align:left;font-style:italic;font-size:medium;}
-.tbl-view caption em{padding:0 5px;font-size:13px;font-style:normal;}
-.tbl-view th{padding:0 3px;font-size:small;}
-.tbl-view td{padding:0 3px;}
-.tbl-view .r{text-align:right;}
-.tbl-view thead th {background:#F3F3F3;}
-.tbl-view thead td {background:#F3F3F3;}
-.historia-platnosci-filters thead td{text-align:center;}
-.historia-platnosci-filters td.selected {background-color:#FFE6E9;}
-.historia-platnosci-filters td:hover {background-color:#E6FFE6;}
-.historia-platnosci-subfilters thead td{text-align:center;background:#fff;}
-.historia-platnosci-subfilters td.selected {background-color:#FFE6E9;}
-.historia-platnosci-subfilters td:hover {background-color:#E6FFE6;}
-
-.tbl-td-top th,
-.tbl-td-top td {vertical-align:top;}
-
-		".'</style>';
-	}
-
-	public static function user_umowy(&$user) {
-
-		Lib::loadClass('Tree');
-		Lib::loadClass('TreeHelper');
-		// build tree by P_ID - array or 0
-		function Tree_Helper__create_tree_rec($p_id, &$items) {
-			static $rec_ind;
-			$rec_ind++;
-			$ret = array();
-			if (!array_key_exists($p_id, $items)) {
-				return false;
-			} else {
-				$r = $items[$p_id];
-				if (empty($r->sub)) {
-					return false;
-				}
-				foreach ($r->sub as $k_id => $v) {
-					$ret[$k_id] = Tree_Helper__create_tree_rec($k_id, $items);
-				}
-				return $ret;
-			}
-		}
-
-		function tree_callback__show_item_from_SERVICES(&$r, &$tree) {
-			$cls = array();
-			$cls[] = 'HANGUP_STATUS-' . $r->HANGUP_STATUS;
-			$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
-
-			echo'<dl'.$cls.'>';
-			echo'<dt>';
-
-			$out_id = ($r->ID < 10)? '&nbsp;'.$r->ID.'' : $r->ID;
-			echo'<b class="item_id btn-box">'.$out_id.'</b>';
-			//echo'<a href="'."?MENU_INIT=IN7_MK_BAZA_DYSTRYBUCJI_EDIT&ARG1=EDIT&ARG1_VAL=".$r->ID.'" class="btn" title="'."Edit".'">'."E".'</a>';
-
-			$st_status_bg = '';
-			if ($r->A_STATUS == 'NORMAL') {
-				$st_status_bg = '#8F8;';
-			} else if ($r->A_STATUS == 'WAITING') {
-				$st_status_bg = '#F8F;';
-			} else if ($r->A_STATUS == 'DELETED') {
-				$st_status_bg = '#ccc;';
-			} else if ($r->A_STATUS == 'OFF_SOFT') {
-				$st_status_bg = '#F99;';
-			} else if ($r->A_STATUS == 'OFF_HARD') {
-				$st_status_bg = '#eee;';
-			}
-			$st_status_bg = ($st_status_bg)? 'background-color:'.$st_status_bg : '';
-
-			echo'<span class="desc">';
-				echo'<span class="btn-box" style="'.$st_status_bg.'">'.$r->A_STATUS.'</span>';
-				echo' <b style="color:#333;">'.$r->description.'</b>';
-				if ($r->ID_OFFERS) {
-					echo' <code>' . "(Nr oferty: {$r->ID_OFFERS})" . '</code>';
-				} else {
-					echo' <span style="color:#f00">'."Brak numeru oferty!".'</span>';
-				}
-
-				$st_status_bg = '';
-				if ($r->HANGUP_STATUS == 'NORMAL') {
-					$st_status_bg = 'background-color:#8F8;';
-				} else if ($r->HANGUP_STATUS == 'WAITING') {
-					$st_status_bg = 'background-color:#F8F;';
-				} else if ($r->HANGUP_STATUS == 'DELETED') {
-					$st_status_bg = 'background-color:#ccc;';
-				} else if ($r->HANGUP_STATUS == 'OFF_SOFT') {
-					$st_status_bg = 'background-color:#F99;';
-				} else if ($r->HANGUP_STATUS == 'OFF_HARD') {
-					$st_status_bg = 'background-color:#f00;color:#fff;';
-				}
-				echo ' <span class="btn-box" style="' . $st_status_bg . '">' . "{$r->HANGUP_STATUS} ({$r->HANGUP_FROM} - {$r->HANGUP_TILL}) - {$r->A_STATUS_DESC}" .'</span>';
-			echo'</span>';
-			echo'</dt>';
-			echo'</dl>'."\n";
-		}
-
-		$uslugi_l2 = WindykacjaStatsModel::get_uslugi_from_l2($user);
-		$umowy_l2 = WindykacjaStatsModel::get_umowy_from_l2($user);
-
-		$uslugi_l2_nieprzypisane = array();
-		foreach ($uslugi_l2 as $k_id => $h) {
-			$uslugi_l2_nieprzypisane[$k_id] = true;
-		}
-		if (is_array($umowy_l2) && !empty($umowy_l2)) {
-			if (is_array($uslugi_l2) && !empty($uslugi_l2)) {
-				foreach ($umowy_l2 as $k_umowa_ind => $h_umowa) {
-					$umowy_l2[$k_umowa_ind]['uslugi'] = array();
-					foreach ($uslugi_l2 as $k_id => $h_usluga) {
-						if ($h_usluga['ID_DEALS_TABLE'] == $h_umowa['ID']) {
-							$umowy_l2[$k_umowa_ind]['uslugi'][$k_id] = $h_usluga;
-							if (isset($uslugi_l2_nieprzypisane[$k_id])) unset($uslugi_l2_nieprzypisane[$k_id]);
-						}
-					}
-				}
-			}
-		}
-
-		echo'<style type="text/css">'."
-.tbl-umowy-l2 .umowa-id{font-weight:bold;font-size:big;font-family:arial;}
-.tbl-umowy-l2 .row-umowa td{border-top:2px solid #00f;}
-.wind-status-old td,
-.wind-status-old th {color:#666;}
-		".'</style>';
-
-		$ARGS['ZAPISZ'] = true;
-		Lay_Html_Toggle::start("Aktualne umowy i usługi ", array('open'=>(($ARGS['ZAPISZ'])? false : true)));
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l2: ';print_r($umowy_l2);echo'</pre>';
-		echo'<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
-		//echo'<caption>'."Aktualne umowy".'<em>'." (l2)".'</em>'.'</caption>';
-		if ($umowy_l2 == -1) {
-			echo'<tr><td>';
-				echo'<span style="color:red">'."Blad polaczenia do bazy dancyh webone_billing - Zasob [931]".'</span>';
-			echo'</td></tr>';
-		} else if (empty($umowy_l2)) {
-			echo'<tr><td>'."Brak umów.".'</td></tr>';
-		}
-		else {
-			$tbl_umowy_cols = 5;
-			echo'<thead>';
-				echo'<tr>';
-					echo'<th>'."Nr umowy".'</th>';
-					echo'<th>'."Prefix".'</th>';
-					echo'<th>'."Data umowy".'</th>';
-					echo'<th>'."Termin".'</th>';
-					echo'<th>'."".'</th>';
-				echo'</tr>';
-			echo'</thead>';
-			$t = 0;
-			foreach ($umowy_l2 as $h) {
-				echo'<tr class="row-umowa row-'.($t = 1 - $t).'">';
-					echo'<td class="r umowa-id">' . $h['P_DEALNUMBER'] . '</td>';
-					echo'<td>' . $h['P_DEALPREFIX'] . '</td>';
-					echo'<td class="r">' . $h['P_DEALDATE'] . '</td>';
-					echo'<td class="r">' . $h['P_DEALDATE_TERM'] . '</td>';
-					echo'<td>';
-						if ($h['Wcześniejszy Nr umowy']) echo "Wcześniejszy Nr umowy: ".$h['Wcześniejszy Nr umowy'].'<br />';// TODO: Undefined index
-						if ($h['DEALDESC']) echo "Notatki: ".$h['DEALDESC'].'<br />';
-						echo "Koniecznosc podpisania aneksu lub innego dokumentu: ".$h['ANEX_NEEDED'].'<br />';
-						echo "Data potwierdzenia podpisania aneksu/dokumentu: ".$h['ANEX_CONFIRM_DATE'].'<br />';
-					echo'</td>';
-				echo'</tr>';
-				if (!empty($h['uslugi'])) {
-					// TODO: make TREE by P_ID_SERVICES
-					$items = array();
-					foreach ($h['uslugi'] as $k_id_usluga => $h_suluga) {
-						$h_suluga['sub'] = array();
-						$items[$k_id_usluga] = (object)$h_suluga;
-					}
-					$uslugi_tree = array();// tree root
-					foreach ($items as $k_id => $r) {
-						if ($r->P_ID == 0) {
-							$uslugi_tree[$r->ID] = array();
-							if (array_key_exists($r->P_ID, $items)) {
-								$items[$r->P_ID]->sub[$r->ID] = true;
-							}
-						} else {// array
-							if (array_key_exists($r->P_ID, $items)) {
-								$items[$r->P_ID]->sub[$r->ID] = true;
-							}
-						}
-					}
-					ksort($uslugi_tree);
-
-					// set up has_childrens
-					foreach ($items as $k_id => $r) {
-						$items[$k_id]->has_childrens = !empty($r->sub);
-					}
-
-					foreach ($uslugi_tree as $k_id => $v_childrens) {
-						if (array_key_exists($k_id, $items)) {
-							$uslugi_tree[$k_id] = Tree_Helper__create_tree_rec($k_id, $items);
-						}
-					}
-
-					echo'<tr class="row-'.($t).'">';
-						echo'<td>'."&nbsp;".'</td>';
-						echo'<td colspan="'.($tbl_umowy_cols - 1).'" style="padding:0;">';
-							$tree = new Tree('SERVICES');
-							$tree->set_parent_id_col('P_ID');
-							$tree->set_param('show_item_callback', "tree_callback__show_item_from_SERVICES");
-							$tree->set_param('ajax', "NIE");
-							$tree->set_param('rozwin', true);
-							$tree->show_css();
-							$tree->show_js();
-							$_COOKIE[$tree->cookie_name] = implode(' ', array_keys($items));
-							echo "\n".'<div class="tree-wrap">'."\n";
-							$tree->show_rec_by_tree($uslugi_tree, $items);
-							echo '</div>'."\n";
-						echo'</td>';
-					echo'</tr>';
-				}
-			}
-		}
-		echo'</table>';
-
-		if (!empty($uslugi_l2_nieprzypisane)) {
-			echo'<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
-			echo'<caption>'."Nieprzypisane usługi".'<em>'." (l2)".'</em>'.'</caption>';
-			echo'<head>';
-				echo'<tr>';
-					echo'<th>'."ID".'</th>';
-					echo'<th>'."usługa".'</th>';
-					echo'<th>'."status".'</th>';
-					echo'<th>'."nr umowy".'</th>';
-					echo'<th>'."id oferty".'</th>';
-				echo'</tr>';
-			echo'</head>';
-			foreach ($uslugi_l2_nieprzypisane as $k_id => $v_bool) {
-				$h_usluga = $uslugi_l2[$k_id];
-				echo'<tr>';
-					echo'<td class="r">' . $h_usluga['ID'] . '</td>';
-					echo'<td>' . $h_usluga['description'] . '</td>';
-					echo'<td>' . $h_usluga['A_STATUS_DESC'] . '</td>';
-					echo'<td class="r">' . '<b>';
-						if (array_key_exists($h['ID_DEALS_TABLE'], $umowy_l2)) {
-							echo $umowy_l2[$h['ID_DEALS_TABLE']]['P_DEALNUMBER'];
-						} else {
-							//TODO: get P_DEALNUMBER from DEALS_TABLE where ID = $h['ID_DEALS_TABLE']
-						}
-					echo'</b>' . '</td>';
-					echo'<td class="r">';
-						if ($h_usluga['ID_OFFERS']) {
-							echo'<code>' . $h_usluga['ID_OFFERS'] . '</code>';
-						} else {
-							echo'<span style="color:#f00">'."Brak!".'</span>';
-						}
-					echo'</td>';
-				echo'</tr>';
-			}
-			echo'</table>';
-		}
-
-		Lay_Html_Toggle::end();
-
-		$umowy_l3 = WindykacjaStatsModel::get_umowy_from_l3($user);
-		$ARGS['ZAPISZ'] = true;
-		Lay_Html_Toggle::start("Aktualne usługi".'<em>'." (l3)".'</em>', array('open'=>(($ARGS['ZAPISZ'])? false : true)));
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l3: ';print_r($umowy_l3);echo'</pre>';
-		echo'<table class="tbl-view tbl-umowy-l2" cellspacing="0" cellpadding="0" border="1">';
-		if (empty($umowy_l3)) {
-			echo'<tr><td>'."Brak usług.".'</td></tr>';
-		}
-		else {
-			echo'<thead>';
-				echo'<tr>';
-					echo'<th rowspan="2">'."ID".'</th>';
-					echo'<th rowspan="2">'."status".'</th>';
-					echo'<th rowspan="2">'."data dok".'</th>';
-					echo'<th rowspan="2">'."adres".'</th>';
-					echo'<th rowspan="2">'."usługa".'</th>';
-					echo'<th rowspan="2">'."S_OTHER_INFO".'</th>';
-					echo'<th colspan="2" title="'."ID_BILLING_USERS".'">'. "nr klienta" .'</th>';
-					echo'<th colspan="2" title="'."ID_SERVICES".'">'."nr usługi".'</th>';
-					echo'<th colspan="2" title="'."P_OFFER_ID".'">'."nr oferty".'</th>';
-					echo'<th colspan="2" title="'."P_DEAL_DATE".'">'."data umowy".'</th>';
-					echo'<th colspan="2">'."nr umowy".'</th>';
-					echo'<th colspan="2">'."termin umowy".'</th>';
-					echo'<th colspan="2" title="'."MONTH COST".'">'."abonament".'</th>';
-					echo'<th rowspan="2">'."INICJALY HANDLOWCA".'</th>';
-					echo'<th rowspan="2">'."RODZAJ DZIALANIA HANDLOWEGO".'</th>';
-				echo'</tr>';
-				echo'<tr>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-					echo'<td>'."OLD".'</td>';
-					echo'<td>'."NEW".'</td>';
-				echo'</tr>';
-			echo'</thead>';
-			foreach ($umowy_l3 as $h) {
-				echo'<tr>';
-					echo'<td>' . $h['ID'] . '</td>';
-					echo'<td>' . $h['A_STATUS'] . '</td>';
-					echo'<td>' . '<nobr>' . $h['DATA_DOK'] . '</nobr>' . '</td>';
-					echo'<td>' . $h['S_ADDRESS_STREET'] . '</td>';
-					echo'<td>' . '<b>' . $h['P_SERVICE'] . '</b>' . '</td>';
-					echo'<td>' . $h['S_OTHER_INFO'] . '</td>';
-					echo'<td>' . $h['ID_BILLING_USERS_OLD'] . '</td>';
-					echo'<td>' . $h['ID_BILLING_USERS_NEW'] . '</td>';
-					echo'<td>' . $h['ID_SERVICES_OLD'] . '</td>';
-					echo'<td>' . $h['ID_SERVICES_NEW'] . '</td>';
-					echo'<td>' . $h['P_OFFER_ID_OLD'] . '</td>';
-					echo'<td>' . $h['P_OFFER_ID_NEW'] . '</td>';
-					echo'<td>' . '<nobr>' . $h['P_DEAL_DATE_OLD'] . '</nobr>' . '</td>';
-					echo'<td>' . '<nobr>' . $h['P_DEAL_DATE_NEW'] . '</nobr>' . '</td>';
-					echo'<td>' . $h['P_DEALNUMBER_OLD'] . '</td>';
-					echo'<td>' . $h['P_DEALNUMBER_NEW'] . '</td>';
-					echo'<td>' . '<nobr>' . $h['P_DEALTERM_OLD'] . '</nobr>' . '</td>';
-					echo'<td>' . '<nobr>' . $h['P_DEALTERM_NEW'] . '</nobr>' . '</td>';
-					echo'<td>' . $h['MONTH_COST_OLD'] . '</td>';
-					echo'<td>' . $h['MONTH_COST_NEW'] . '</td>';
-					echo'<td>' . $h['INICJALY_HANDLOWCA'] . '</td>';
-					echo'<td>' . $h['RODZAJ_DZIALANIA_HANDLOWEGO'] . '</td>';
-				echo'</tr>';
-			}
-		}
-		echo'</table>';
-		Lay_Html_Toggle::end();
-	}
-
-	public static function user_historia_platnosci(&$user) {
-		?>
-		<style type="text/css">
-.hide .to-hide{display:none;}
-.may-hide .btn-hide{display:inline;padding:0 5px;border:1px solid #bbb;}
-.may-hide .btn-show{display:none;padding:0 5px;border:1px solid #bbb;}
-.hide .btn-hide{display:none;}
-.hide .btn-show{display:inline;}
-		</style>
-		<?php
-		Lay_Html_Toggle::show_js();
-
-		$billing_docs = WindykacjaStatsModel::get_bill_dosc_by_date($user);
-
-		// add events
-		$umowy_l2 = WindykacjaStatsModel::get_umowy_from_l2($user);
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billing_docs ';print_r($billing_docs);echo'</pre>';
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billing_docs ';print_r(reset($billing_docs));echo'</pre>';
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l2 ';print_r($umowy_l2);echo'</pre>';
-		if (!empty($umowy_l2)) {
-			foreach ($umowy_l2 as $h) {
-				$billing_docs->add_event($h['P_DEALDATE'], 'UMOWA', $h);
-
-				if ($h['P_DEALDATE_TERM'] != '0000-00-00') {// < date('Y-m-d')) {
-					$billing_docs->add_event($h['P_DEALDATE_TERM'], 'KONIEC UMOWY', $h);
-				}
-			}
-		}
-
-		$user_hist_events = WindykacjaStatsHelper::get_user_hist_status_events($user);
-		if (!empty($user_hist_events)) {
-			foreach ($user_hist_events as $v_hist) {
-				$bill_doc = (array)$v_hist;
-				$billing_docs->add_event($v_hist->A_STATUS_UPDATE_DATE, 'HIST_STATUS', $bill_doc);
-			}
-		}
-
-		$user_hist_events = WindykacjaStatsHelper::get_user_hist_phone_events($user);
-		if (!empty($user_hist_events)) {
-			foreach ($user_hist_events as $v_hist) {
-				$bill_doc = (array)$v_hist;
-				$billing_docs->add_event(substr($v_hist->A_RECORD_UPDATE_DATE, 0, 10), 'HIST_PHONE', $bill_doc);
-			}
-		}
-
-		$user_hist_events = WindykacjaStatsHelper::get_user_bad_address_events($user);
-		if (!empty($user_hist_events)) {
-			foreach ($user_hist_events as $v_hist) {
-				$bill_doc = (array)$v_hist;
-				$billing_docs->add_event(substr($v_hist->A_RECORD_UPDATE_DATE, 0, 10), 'HIST_BAD_ADDRESS', $bill_doc);
-			}
-		}
-
-		// add today
-		$bill_doc = array();
-		$bill_doc['saldo'] = $billing_docs->get_saldo();
-		$billing_docs->add_event(date('Y-m-d'), 'TODAY', $bill_doc);
-
-		$billing_docs->sort_docs();
-		//$billing_docs = array_reverse($billing_docs, true);
-		//echo'<pre style="max-height:300px;overflow:auto;border:1px solid red;">billing_docs: ';print_r($billing_docs);echo'</pre>';
-
-		$billing_docs_arr = $billing_docs->get_docs();
-
-		$types_finanse = array();
-		$types_finanse[] = 'KW';
-		$types_finanse[] = 'KP';
-		$types_finanse[] = 'WB_MASS';
-		$types_finanse[] = 'WB';
-		$types_finanse[] = 'KORV';
-		$types_finanse[] = 'FVAT';
-
-		$saldo_all = 0;
-		$out_tbl = array();
-		//echo'<pre>';print_r($billing_docs_arr);echo'</pre>';
-		foreach ($billing_docs_arr as $k_data => $v_docs_arr) {
-			foreach ($v_docs_arr as $k_ind => $v_doc) {
-				$out_tr = array();
-				$out_tr['data'] = $k_data;
-				if ($k_data == date("Y-m-d")) $out_tr['class'] = 'today';
-				$out_tr['ID'] = '';
-				$out_tr['nr'] = '';
-				$out_tr['winien'] = '';
-				$out_tr['ma'] = '';
-				$out_tr['saldo'] = '';
-				$out_tr['saldo_all'] = '';
-				if ($v_doc->get_class() == 'BILLING') {
-					$saldo_all += $v_doc->get_saldo();
-					$out_tr['ID'] = $v_doc->get_type();
-					$type_desc = WindykacjaStatsModel::get_billing_type_desc($v_doc->get_type());
-					if ($type_desc) {
-						if ($v_doc->get_type() == 'FVAT') $type_desc .= "\n Wystawiona: ".$v_doc->get('BILL_DATE')."\n Termin płatności: ".$v_doc->get('PAYMENT_TERM');
-						$out_tr['ID'] = '<span title="'.$type_desc.'">'.$out_tr['ID'].'</span>';
-						// TODO: podglad faktury
-						//if ($h['type'] == 'FVAT') $out_tr['ID'] .= ' <a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&_user_id=".$user->ID."&task=view_faktura&id=".$h['ID'].'" target="_blank">'.'<img src="'."icon/search.png".'" alt="'."U".'" title="'."Podgląd faktury".'" />'.'</a>';
-					}
-					$docNr = $v_doc->get('nr');
-					$docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
-					/* links fomr l1:
-					 *   FV: https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura&adm=edit&uid=4014&fpos=&dz=&close=0&doc=799413&doctype=1
-					 *   KOR: https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura_korekta&adm=edit&uid=4014&fpos=&dz=&close=0&doc=809557&doctype=3
-					 */
-					if ('FVAT' == $v_doc->get_type()) {
-						$out_tr['ID'] .= ' <a href="index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=' . $docNr . '" target="_blank">'."({$docNrLabel})".'</a>';
-					}
-					else if ('KORV' == $v_doc->get_type()) {
-						// https://biuro.biall-net.pl/dev-pl/se-master/index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=809557
-						$remoteFvNum = $v_doc->get('FV_NUMBER');
-						$korNr = $v_doc->get('ID_BILLING_NUMBERS');
-						$korTitle = "Korekta dotycząca faktury nr: {$remoteFvNum}";
-						$out_tr['ID'] .= ' <a href="index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=' . $korNr . '" target="_blank" title="'.$korTitle.'">'."({$docNrLabel})".'</a>';
-					}
-					$out_tr['nr'] = $docNrLabel;
-					$out_tr['winien'] = number_format($v_doc->get('WINIEN'), 2, ',', ' ');
-					$out_tr['ma'] = number_format($v_doc->get('MA'), 2, ',', ' ');
-					$out_tr['saldo'] = number_format($v_doc->get_saldo(), 2, ',', ' ');
-					$out_tr['saldo_all'] = number_format($saldo_all, 2, ',', ' ');
-
-					// style
-					if ($out_tr['winien'] == '0,00') $out_tr['winien'] = '<span style="color:#666;">' . $out_tr['winien'] . '</span>';
-					if ($out_tr['ma'] == '0,00') $out_tr['ma'] = '<span style="color:#666;">' . $out_tr['ma'] . '</span>';
-				}
-				else if ($v_doc->get_class() == 'EVENT') {
-					if ($v_doc->get_type() == 'TODAY') {
-						$out_tr['class'] = 'today';
-						$vDocSaldoData = $v_doc->get_data();
-						$v_doc_saldo = V::get('saldo', '', $vDocSaldoData);
-						$out_tr['saldo_all'] = number_format($v_doc_saldo, 2, ',', ' ');
-					}
-					else if ($v_doc->get_type() == 'HIST_STATUS') {
-						// search for koresp files
-						// TODO: mv to ::get_koresp_file($id_koresp);
-						$id_koresp = intval($v_doc->get('ID_KORESP'));
-						$found_files = array();
-						if(0){// turn off - old server
-							$CNF = new stdClass();
-							$CNF->koresp_dir = '/home/samba/BIALL-NET/PISMA/OUT';
-							$CNF->koresp_www_path = '/se-dev/PISMA/OUT';
-							if ($id_koresp > 0) {
-								$pattern = $CNF->koresp_dir . '/' . '*.' . $id_koresp . '.pdf';
-								$file_tmp_list = glob($pattern);//, GLOB_NOSORT);
-								if (!empty($file_tmp_list)) {
-									foreach ($file_tmp_list as $v_file) {
-										$test_file = explode('/', $v_file);
-										$test_file = end($test_file);
-										$found_files[] = $CNF->koresp_www_path . '/' . $test_file;
-									}
-								}
-							}
-						//	return $found_files;
-						}
-						switch ($v_doc->get('A_STATUS')) {
-							case 'WAITING':
-								$out_tr['add'] = "powrót do oczekujących";
-								break;
-
-							case 'waiting-wezwanie2':
-								// TODO: get('LAST_ID_KORESP_WEZWANIE1')
-								$out_tr['add'] = "wezwanie do zapłaty - ID_KORESP: <b>".$v_doc->get('ID_KORESP')."</b> <em>(termin: ".$v_doc->get('PAY_TERM').")</em> ";
-								break;
-
-							case 'waiting-krd':
-								$out_tr['add'] = "wezwanie do zapłaty ost. - ID_KORESP: <b>".$v_doc->get('ID_KORESP')."</b> <em>(termin: ".$v_doc->get('PAY_TERM').")</em> ";
-								break;
-
-							case 'N/S;':
-								$out_tr['add'] = "ID_KORESP: <b>".$v_doc->get('ID_KORESP')."</b> <em>(" . $v_doc->get('K_ZAWARTOS') . ")</em>";// TODO: get opis from koresp
-								//echo '('.$v_doc->get('ID_KORESP').', '.$v_doc->get('K_ZAWARTOS').'='.substr($v_doc->get('K_ZAWARTOS'), 0, strlen('rozwiazanie umowy')).')';
-								if ($v_doc->get('ID_KORESP') > 0 && substr($v_doc->get('params'), 0, strlen('rozwiazanie umowy')) == 'rozwiazanie umowy') {
-									$out_tr['add'] .= " " . '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy_print"."&user_id={$user->ID}&id_koresp=".$v_doc->get('ID_KORESP').'" target="_blank" title="' . "Generuj druk rozwiązania umowy" . '">' . "druk" . '</a>';
-								}
-								break;
-
-							default:
-								$out_tr['add'] = "zmiana statusu na: ".$v_doc->get('A_STATUS')." ";
-						}
-						if ($id_koresp > 0) {
-							if (!empty($out_tr['add']) && !empty($found_files)) {
-								$add_link_koresp = reset($found_files);// first file from koresp
-								$out_tr['add'] .= " " . '<a href="' . $add_link_koresp . '" target="_blank">' . "P" . '</a>';
-							}
-							//$koresp_edit_link = "?MENU_INIT=IN7_DZIENNIK_KORESP_EDIT&ARG1=EDIT&ARG1_VAL=" . $id_koresp;
-							Lib::loadClass('ProcesHelper');
-							$zasobKorespID = ProcesHelper::getZasobTableID('IN7_DZIENNIK_KORESP');
-							$koresp_edit_link = "index.php?MENU_INIT=VIEWTABLE_AJAX&ZASOB_ID={$zasobKorespID}#EDIT/{$id_koresp}";
-							$out_tr['add'] .= " " . '<a href="' . $koresp_edit_link . '" title="' . "Edycja KORESP. ({$id_koresp})" . '" target="_blank">' . "KOR" . '</a>';
-						}
-					}
-					else if ($v_doc->get_type() == 'HIST_PHONE') {
-						$date = $v_doc->get('PAY_TERM');
-						if ($date == 'N/S;') $date = '';
-						$lastPhoneStatus = $v_doc->get('LAST_PHONE_STATUS');
-						if ($lastPhoneStatus == 'N/S;') $lastPhoneStatus = '';
-						$lastSmsStatus = $v_doc->get('LAST_SMS_STATUS');
-						if ($lastSmsStatus == 'N/S;') $lastSmsStatus = '';
-						$lastMailStatus = $v_doc->get('LAST_MAIL_STATUS');
-						if ($lastMailStatus == 'N/S;') $lastMailStatus = '';
-						$lastUpdateDate = $v_doc->get('A_RECORD_UPDATE_DATE');
-						if (!empty($lastPhoneStatus)) {
-							switch ($lastPhoneStatus) {
-								case 'nie_zaplaci':
-									$out_tr['add'] = "nie zapłaci";
-									break;
-
-								case 'zaplaci_w_terminie':
-									$out_tr['add'] = "zapłaci w terminie {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
-									break;
-
-								case 'zaplaci_za_1mc':
-									$out_tr['add'] = "zapłaci miesiąc później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
-									break;
-
-								case 'zaplaci_za_2mc':
-									$out_tr['add'] = "zapłaci 2 miesiące później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
-									break;
-
-								case 'zaplaci_za_3mc':
-									$out_tr['add'] = "zapłaci 3 miesiące później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
-									break;
-
-								default:
-									$out_tr['add'] = "kontakt z klientem: {$lastPhoneStatus} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
-							}
-						} else if (!empty($lastSmsStatus)) {
-							$lastSmsId = $v_doc->get('LAST_SMS_MSG_ID');
-							$out_tr['add'] = "SMS: {$lastSmsStatus} " . '<em style="font-size:small;" title="' . "(wysłano {$lastUpdateDate}, {$lastSmsId})" . '">' . "(wysłano {$lastUpdateDate})" . '</em>';
-						} else if (!empty($lastMailStatus)) {
-							$lastMailId = $v_doc->get('LAST_MAIL_MSG_ID');
-							$out_tr['add'] = "MAIL: {$lastMailStatus} " . '<em style="font-size:small;" title="' . "(wysłano {$lastUpdateDate}, {$lastMailId})" . '">' . "(wysłano {$lastUpdateDate})" . '</em>';
-						}
-					} else if ($v_doc->get_type() == 'HIST_BAD_ADDRESS') {
-						if ($v_doc->get('BAD_ADDRESS')) {
-							$out_tr['add'] = "błędny adres zameldowania ";
-						} else {
-							$out_tr['add'] = "poprawa adresu zameldowania ";
-						}
-						if ($v_doc->get('ID_KORESP') > 0) {
-							$out_tr['add'] .= " - ID Koresp. (" . '<a href="' . "index.php?MENU_INIT=IN7_DZIENNIK_KORESP_EDIT&ARG1=EDIT&ARG1_VAL=" . $v_doc->get('ID_KORESP') . '" target="_blank">' . $v_doc->get('ID_KORESP') . '</a>' . ")";
-						}
-					} else {
-						$out_tr['ID'] = $v_doc->get_type().' <code style="font-size:10px">'."(".$v_doc->get('ID').")".'</code>';// TODO: dla KP,KW: ID_BILLING_NUMBERS zamiast ID
-						if ($v_doc->get_type() == 'UMOWA') {
-							$out_tr['add'] = "umowa nr <b>".$v_doc->get('P_DEALNUMBER')."</b> <em>(termin ".$v_doc->get('P_DEALDATE_TERM').")</em>";
-						} else if ($v_doc->get_type() == 'KONIEC UMOWY') {
-							$out_tr['add'] = "zakończenie umowy nr <b>".$v_doc->get('P_DEALNUMBER')."</b> <em>(z dnia ".$v_doc->get('P_DEALDATE').")</em>";
-						}
-					}
-				}
-				//$out_tbl[] = $out_tr;// add to the end
-				array_unshift($out_tbl, $out_tr);// add to the begining
-			}
-		}
-
-		echo'<style type="text/css">'."
-.tbl-windykacja td{padding:0 5px;}
-.tbl-windykacja .cell-data{white-space:nowrap;}
-.tbl-windykacja .cell-winien{text-align:right;}
-.tbl-windykacja .cell-ma{text-align:right;}
-.tbl-windykacja .cell-saldo{text-align:right;}
-.tbl-windykacja .cell-saldo_all{text-align:right; white-space:nowrap; background-color:#E5E5E5;}
-.tbl-windykacja .cell-nr{font-family:monospace;text-align:right;}
-.tbl-windykacja .change-year td{border-top:3px solid #00f;}
-.tbl-windykacja .today td{background:#FFFF98;}
-.tbl-windykacja .cell-add em{color:#666;}
-		".'</style>';
-		$last_year = '';
-		$cols = array();
-		$cols['data'] = "data";
-		$cols['ID'] = "ID";
-		$cols['nr'] = "nr";
-		$cols['winien'] = "winien";
-		$cols['ma'] = "ma";
-		//$cols['saldo'] = "saldo";
-		$cols['saldo_all'] = "saldo";
-		$cols['add'] = "uwagi";
-		?>
-		<h4>Historia klienta <small>(l1)</small></h4>
-		<table border="1" class="tbl-view tbl-windykacja" cellspacing="0" cellpadding="0">
-		<thead>
-			<tr>
-			<th>rok</th>
-			<?php foreach ($cols as $colName => $colLabel) : ?>
-				<th><?php echo $colLabel; ?></th>
-			<?php endforeach; ?>
-			</tr>
-		</thead>
-		<?php
-		foreach ($out_tbl as $out_tr) {
-			$change_year = false;
-			$k_data = $out_tr['data'];
-			$rok = substr($k_data, 0, 4);
-			if ($rok != $last_year) {
-				$change_year = true;
-			}
-			$cls = array();
-			if ($change_year) $cls[] = 'change-year';
-			if ($add_cls = V::get('class', '', $out_tr)) $cls[] = $add_cls;
-			$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
-			echo'<tr'.$cls.'>';
-			echo'<td>';
-			echo ($change_year)? $rok : "&nbsp;";
-			echo'</td>';
-			$last_year = $rok;
-			foreach ($cols as $col_name => $col_label) {
-			//foreach ($out_tr as $k_col_name => $v_val) {
-				if (array_key_exists($col_name, $out_tr)) {
-					echo'<td class="'."cell-".$col_name.'">' . $out_tr[$col_name] . '</td>';
-				} else {
-					echo'<td>'."&nbsp;".'</td>';
-				}
-			}
-			echo'</tr>';
-		}
-		echo'</table>';
-		echo'<br />';
-		echo'<br />';
-		WindykacjaStatsHelper::update_stats($user, $billing_docs);
-
-		{// srv hist
-			$srvHist = array();
-			$db = DB::getDB();
-			$sql = <<<SQL
-	select fvPos.`ID` as fvPos__ID
-		, fvPos.`DATE_FROM` as fvPos__DATE_FROM
-		, fvPos.`DATE_TO` as fvPos__DATE_TO
-		, fvPos.`ID_SERVICES` as fvPos__ID_SERVICES
-		, (select srv.`NAME_LIST_SERVICES` from `billing2013`.`SERVICES` srv where srv.`ID`=fvPos.`ID_SERVICES` limit 1) as srv__NAME_LIST_SERVICES
-		, fvPos.`AMMOUNT` as fvPos__AMMOUNT
-		, fvPos.`PRICE` as fvPos__PRICE
-		, fvPos.`VAT` as fvPos__VAT
---		, fvPos.`ID_BILLS_FVAT` as fvPos__ID_BILLS_FVAT
-		, fvPos.`DESCR` as fvPos__DESCR
---		, fvPos.`id_list_services` as fvPos__id_list_services
---		, fvPos.`id_list_sww` as fvPos__id_list_sww
---		, fvPos.`VAT_NAME` as fvPos__VAT_NAME
---		, fvPos.`ID_OFFERS` as fvPos__ID_OFFERS
---		, 'fv', fv.*
---		, fv.`ID` as fv__ID
-		, fv.`ID_BILLING_NUMBERS` as fv__ID_BILLING_NUMBERS
---		, fv.`ID_BILLING_USERS` as fv__ID_BILLING_USERS
---		, fv.`id_owner` as fv__id_owner
-		, fv.`BILL_DATE` as fv__BILL_DATE
-		, fv.`SELL_DATE` as fv__SELL_DATE
---		, fv.`TIMESTAMP` as fv__TIMESTAMP
-		, fv.`PAYMENT_TERM` as fv__PAYMENT_TERM
---		, fv.`PAYMENT_TYPE` as fv__PAYMENT_TYPE
---		, fv.`ID_CURRENCY` as fv__ID_CURRENCY
---		, fv.`ID_FK_DEKRET` as fv__ID_FK_DEKRET
---		, fv.`ID_FK_ROZRACH` as fv__ID_FK_ROZRACH
---		, fv.`OPEN` as fv__OPEN
---		, fv.`FK_ZAKSIEG` as fv__FK_ZAKSIEG
-		, fv.`IF_KORV` as fv__IF_KORV
---		, 'fvNum', fvNum.*
---		, fvNum.`ID` as fvNum__ID
---		, fvNum.`TIMESTAMP` as fvNum__TIMESTAMP
---		, fvNum.`ID_BILLING_NUMBERS_TYPE` as fvNum__ID_BILLING_NUMBERS_TYPE
---		, fvNum.`ID_BILLING_PREFIXES` as fvNum__ID_BILLING_PREFIXES
-		, fvNum.`NUMBER` as fvNum__NUMBER
---		, fvNum.`ID_BILLING_USERS` as fvNum__ID_BILLING_USERS
-		, fvNum.`FOREIGN_ID_BILLING_NUMBERS` as fvNum__FOREIGN_ID_BILLING_NUMBERS
---		, fvNum.`U_ID` as fvNum__U_ID
---		, fvNum.`BILLING_OWNER` as fvNum__BILLING_OWNER
---		, 'korPos', korPos.*
-		, korPos.`ID` as korPos__ID
---		, korPos.`ID_BILLS_FVAT` as korPos__ID_BILLS_FVAT
-		, korPos.`DESCR` as korPos__DESCR
-		, korPos.`ID_SERVICES` as korPos__ID_SERVICES
-		, korPos.`DATE_FROM` as korPos__DATE_FROM
-		, korPos.`DATE_TO` as korPos__DATE_TO
-		, korPos.`AMMOUNT` as korPos__AMMOUNT
-		, korPos.`PRICE` as korPos__PRICE
-		, korPos.`VAT` as korPos__VAT
---		, korPos.`id_list_services` as korPos__id_list_services
---		, korPos.`id_list_sww` as korPos__id_list_sww
---		, korPos.`VAT_NAME` as korPos__VAT_NAME
---		, korPos.`N_DESCR` as korPos__N_DESCR
---		, korPos.`N_ID_SERVICES` as korPos__N_ID_SERVICES
---		, korPos.`N_DATE_FROM` as korPos__N_DATE_FROM
---		, korPos.`N_DATE_TO` as korPos__N_DATE_TO
---		, korPos.`N_AMMOUNT` as korPos__N_AMMOUNT
---		, korPos.`N_PRICE` as korPos__N_PRICE
---		, korPos.`N_VAT` as korPos__N_VAT
---		, korPos.`N_id_list_services` as korPos__N_id_list_services
---		, korPos.`N_id_list_sww` as korPos__N_id_list_sww
---		, korPos.`N_VAT_NAME` as korPos__N_VAT_NAME
-		, korPos.`TYP_KOREKTY` as korPos__TYP_KOREKTY
-	from `billing2013`.`BILLS_FVAT_POS` fvPos
-		join `billing2013`.`BILLS_FVAT` fv on (fv.`ID`=fvPos.`ID_BILLS_FVAT`)
-		join `billing2013`.`BILLING_NUMBERS` fvNum on(fvNum.`ID`=fv.`ID_BILLING_NUMBERS`)
-		left join `billing2013`.`BILLS_KORV_POS` korPos on(
-			korPos.`ID_BILLS_FVAT`=(
-				select kor.`ID`
-				from `billing2013`.`BILLS_KORV` kor
-				where kor.`REMOTE_ID_BILLING_NUMBERS`=fvNum.`ID`
-			)
-			and korPos.`ID_SERVICES`=fvPos.`ID_SERVICES`
-		)
-	where fv.`ID_BILLING_USERS`='{$user->ID}'
-	order by fv.`ID` DESC
-SQL;
-			//echo'<pre>srvHist:sql: ';print_r($sql);echo'</pre>';
-			$idxDates = array();
-			$idxSrv = array();
-			$idxHasKor = array();
-			$res = $db->query($sql);
-			while ($r = $db->fetch($res)) {
-				$srvHist[$r->fvPos__ID] = $r;
-				$month = substr($r->fv__BILL_DATE, 0, 7);
-				$idSrv = $r->fvPos__ID_SERVICES;
-				if (!empty($r->fv__BILL_DATE)) {
-					if (!array_key_exists($month, $idxDates)) $idxDates[$month] = array();
-					$idxDates[$month][$r->fvPos__ID] = $idSrv;
-				}
-				if (!empty($idSrv)) {
-					$idxSrv[$idSrv] = $r->srv__NAME_LIST_SERVICES;
-				}
-				if ($r->korPos__ID > 0) {
-					$isKorZero = ($r->korPos__AMMOUNT * $r->korPos__PRICE == -1 * $r->fvPos__AMMOUNT * $r->fvPos__PRICE);
-					$idxHasKor[$month][$idSrv][] = $isKorZero;
-				}
-			}
-			krsort($idxDates);
-			?>
-		<div class="container">
-			<script>
-				function showHideSrvHist() {
-					jQuery('#srvHist').toggle();
-					return false;
-				}
-			</script>
-			<h3>Historia usług <button class="btn btn-xs btn-danger" onclick="return showHideSrvHist()">+/-</button></h3>
-			<table class="table table-bordered" id="srvHist" style="display:none">
-				<thead>
-					<tr>
-						<th style="padding:2px"><nobr class="pull-right">Usługi</nobr></th>
-						<?php foreach ($idxSrv as $idSrv => $srvType) : ?>
-							<th style="padding:2px"><?php echo $idSrv; ?></th>
-						<?php endforeach; ?>
-					</tr>
-					<tr>
-						<th style="padding:2px"><nobr>Data</nobr></th>
-						<?php foreach ($idxSrv as $idSrv => $srvType) : ?>
-							<th style="padding:2px"><?php echo $srvType; ?></th>
-						<?php endforeach; ?>
-					</tr>
-				</thead>
-				<tbody>
-					<?php foreach ($idxDates as $month => $posIds) : ?>
-						<tr>
-							<td style="padding:2px"><?php echo $month; ?></td>
-							<?php foreach ($idxSrv as $idSrv => $srvType) : ?>
-							<?php if (in_array($idSrv, $posIds)) : ?>
-								<?php if (!empty($idxHasKor[$month][$idSrv])) : ?>
-									<?php if (count($idxHasKor[$month][$idSrv]) > 1) : ?>
-										<td style="padding:2px" class="danger"><b title="Faktury i Korekty w tym na 0"><?php echo count($idxHasKor[$month][$idSrv]); ?> * FV (FV - KOR = 0)</b></td>
-									<?php elseif (true == $idxHasKor[$month][$idSrv][0]) : ?>
-										<td style="padding:2px" class="danger"><b title="Faktura i Korekta na 0">FV - KOR = 0</b></td>
-									<?php else : ?>
-										<td style="padding:2px" class="warning"><b title="Faktura i Korekta">FV - KOR &gt; 0</b></td>
-									<?php endif; ?>
-								<?php else : ?>
-									<td style="padding:2px" class="success"><b title="brak korekty">FV</b></td>
-								<?php endif; ?>
-							<?php else : ?>
-								<td style="padding:2px"><i class="muted">---</i></td>
-							<?php endif; ?>
-						<?php endforeach; ?>
-						</tr>
-					<?php endforeach; ?>
-				</tbody>
-			</table>
-		</div>
-			<?php
-			//echo'<pre>idxHasKor: ';print_r($idxHasKor);echo'</pre>';
-			//echo'<pre>idxDates: ';print_r($idxDates);echo'</pre>';
-			//echo'<pre>idxSrv: ';print_r($idxSrv);echo'</pre>';
-			//echo'<pre>srvHist: ';print_r($srvHist);echo'</pre>';
-		}// srv hist
-	}
-
-	public static function view_faktura($faktura_id) {
-		// https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=make_faktura&adm=edit&uid=11381&fpos=&dz=
-		// https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura&adm=edit&uid=11381&fpos=&dz=&close=0&doc=483930&doctype=1
-		echo'{'.$faktura_id.'}';
-	}
-
-	public static function zadluzenia(&$user) {
-		$THIS_DATA_DO = null;// TODO: pobierac z PAY_TERM z tabeli USERS2_WINDYKACJA_STATUS
-		$post_sent = (!empty($_POST['sbmt']));
-		$post_DATA_DO = (isset($_POST['DATA_DO']))? $_POST['DATA_DO'] : date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
-		if (!$post_sent) {
-			echo'<table style="margin:10px 50px;padding:20px;border:1px solid blue;"><tr><td>';
-			echo'<form action="" method="post">';
-				$post_DATA_DO = (isset($_POST['DATA_DO']) && strlen($_POST['DATA_DO']) == 10)? $_POST['DATA_DO'] : date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
-				echo'<p>'."Termin płatności: ".'</p>';
-				echo'<input type="text" name="'."DATA_DO".'" value="'.$post_DATA_DO.'" />';
-				echo'<input type="submit" name="sbmt" value="'."Wyslij".'" />';
-			echo'</form>';
-			echo'</td></tr></table>';
-			return;
-		} else {
-			$THIS_DATA_DO = $post_DATA_DO;
-		}
-		self::wezwanie($user, $THIS_DATA_DO);
-	}
-
-	public static function wezwanie_ostateczne(&$user, $wezwanie_termin) {
-		self::wezwanie($user, $wezwanie_termin, true);
-	}
-
-	public static function zestawienie_vectra_nadplaty() {
-		$usersList = array();
-		$db = DB::getDB();
-		$sql_select = "
-				c.`ID` as ID
-				, c.`ID` as id_users
-				, c.`P_NAME`
-				, c.`P_NAME_SECOND`
-				, c.`P_ADDRESS_STREET`
-				, c.`P_ADDRESS_HOME`
-				, c.`P_ADDRESS_HOUSE`
-				, c.`P_ADDRESS_CITY`
-				, c.`P_ADDRESS_POST_CODE`
-				, c.`P_ADDRESS_REGION`
-				, c.`P_PESEL`
-				, c.`P_PHONE`
-				, c.`P_OTHER_DOC`
-				, c.`user_mail_contact`
-				, c.`is_firma`
-				, w.`ID` as WINDYKACJA_ID
-				, w.`ID_BILLING_USERS`
-				, w.`A_STATUS`
-				, w.`A_STATUS_UPDATE_DATE`
-				, w.`USER_PAY_TERM_ADD`
-				, w.`L_APPOITMENT_DATE`
-				, w.`L_APPOITMENT_USER`
-				, w.`L_APPOITMENT_INFO`
-				, w.`PAY_DATE`
-				, w.`PAY_DATE_FIRST_FVAT`
-				, w.`PAY_TERM`
-				, w.`PAY_SALDO`
-				, w.`PAY_FVAT`
-				, w.`wezwanie1_DATE`
-				, w.`wezwanie2_DATE`
-				, w.`ID_KORESP`
-				, w.`LAST_PAY_DATE`
-				, w.`BAD_ADDRESS`
-				, c.`STATUS`
-				, c.`BILLING_OWNER`
-				, w.`NR_SPRAWY_KRD`
-				, w.`NR_SPRAWY_SAD`
-				, w.`NR_SPRAWY_KOMORNIK`
-				, w.`LAST_FVAT_PAY_TERM`
-		";
-		$sqlWhereAdd = "
-			and (w.`LAST_FVAT_PAY_TERM`>='2014-12-01'
-				or (	w.`LAST_FVAT_PAY_TERM`='0000-00-00'
-					and w.`LAST_FVAT_SELL_DATE`>='2014-12-01'
-				)
-			)
-			and c.`ID_BILLING_PREFIXES` in('0','1')
-			and c.`BILLING_OWNER` in('1')
-		";
-		$sql = "select {$sql_select}
-			from `USERS2_WINDYKACJA_STATUS` as w
-				join `COMPANIES` as c on(c.`ID`=w.`ID_BILLING_USERS`)
-			where c.`A_ADM_COMPANY`='19994_PODMIOT_Vectra_wlasciciel'
-				{$sqlWhereAdd}
-		";
-		if (V::get('DBG_SQL', '', $_GET)) {
-			header('Content-Type: text/plain; charset=utf-8');
-			echo $sql;
-			exit;
-		}
-		$res = $db->query($sql);
-		if ($db->has_errors()) {
-			print_r($db->get_errors());
-			die('die L.' . __LINE__);
-		}
-		while ($r = $db->fetch($res)) {
-			$usersList[$r->ID_BILLING_USERS] = $r;
-		}
-		if (V::get('DBG_ILE', '', $_GET)) {
-			echo '<p>ilosc: ' . count($usersList) . '</p>' . '<pre style="max-height:200px;overflow:auto">';
-				print_r($usersList);
-			echo '</pre>';
-			exit;
-		}
-		if (V::get('DBG_IDS', '', $_GET)) {
-			header('Content-Type: text/plain; charset=utf-8');
-			echo 'ilosc: ' . count($usersList) . "\n";
-			echo implode("\n", array_keys($usersList));
-			exit;
-		}
-		$limit = V::get('DBG_LOOP_LIMIT', 100000, $_GET, 'int');
-		if(V::get('DBG_LOOP_LIMIT', 0, $_GET, 'int')){echo "Loimit: {$limit}\n";}
-		$date_limit = V::get('DATE_LIMIT', date("Y-m-d"), $_GET);
-		$date_limit_from = '2014-12-01';
-		$csvFileName = "Zestawienie-nadplaty-do-{$date_limit}";
-		header('Content-Type: text/csv; charset=utf-8');
-		header("Content-Disposition: attachment; filename={$csvFileName}.csv");
-		$showCsvHeader = true;
-		foreach ($usersList as $userId => $user) {
-			$billing_docs = WindykacjaStatsModel::get_bill_dosc_by_date($user, $date_limit);
-			$billing_docs->sort_docs();
-			$saldo = $billing_docs->get_saldo();
-			if ($saldo <= 0) {
-				continue;
-			}
-			if(V::get('DBG_LOOP', '', $_GET)){echo "{$userId}:{$saldo}\n";}
-			$incomeDocs = $billing_docs->getLastIncomeDocsForSaldo($saldo);
-			if(V::get('DBG_LOOP', '', $_GET)){print_r($incomeDocs);echo "\n";}
-			//WindykacjaStatsModel::update_doc_number($incomeDocs);
-
-			$out_tbl = array();
-			foreach ($incomeDocs as $v_fvat) {
-				$out_tr = array();
-				$out_tr['ID'] = $v_fvat['ID'];
-				$out_tr['nr'] = $v_fvat['NUMBER'] . '/' . $v_fvat['ID_BILLING_PREFIXES'];
-				$out_tr['wplata'] = number_format($v_fvat['MA'], 2, '.', '');
-				$out_tr['data'] = $v_fvat['BILL_DATE'];
-				$out_tr['pozostalo'] = number_format($v_fvat['MA_POZOSTALO'], 2, '.', '');
-				array_push($out_tbl, $out_tr);// add to the begining
-			}
-
-			{// csv
-				$csvLine = array();
-				$csvLine[] = '"id klienta"';
-				$csvLine[] = '"nr dokumentu"';
-				$csvLine[] = '"kwota brutto"';
-				$csvLine[] = '"data wpłaty"';
-				$csvLine[] = '"pozostało"';
-				if ($showCsvHeader) {
-					echo implode(';', $csvLine) . ";\n";
-					$showCsvHeader = false;
-				}
-				foreach ($out_tbl as $tr) {
-					$csvLine = array();
-					$csvLine[] = '"' . $userId . '"';
-					$csvLine[] = '"' . $tr['nr'] . '"';
-					$csvLine[] = '"' . $tr['wplata'] . '"';
-					$csvLine[] = '"' . $tr['data'] . '"';
-					$csvLine[] = '"' . $tr['pozostalo'] . '"';
-					echo implode(';', $csvLine) . ";\n";
-				}
-			}
-			//echo '<pre style="max-height:200px;overflow:auto">incomeDocs: ';print_r($incomeDocs);echo'</pre>';
-			//echo '<pre style="max-height:200px;overflow:auto">ilosc('.count($out_tbl).') ' . "client({$userId}): ";print_r($out_tbl);echo'</pre>';
-			if (--$limit < 0) {
-				echo '<br>BREAK';
-				break;
-			}
-		}
-		exit;
-	}
-
-	public static function zestawienie_vectra_zadluzenia() {
-		$usersList = array();
-		$db = DB::getDB();
-		$sql_select = "
-				c.`ID` as ID
-				, c.`ID` as id_users
-				, c.`P_NAME`
-				, c.`P_NAME_SECOND`
-				, c.`P_ADDRESS_STREET`
-				, c.`P_ADDRESS_HOME`
-				, c.`P_ADDRESS_HOUSE`
-				, c.`P_ADDRESS_CITY`
-				, c.`P_ADDRESS_POST_CODE`
-				, c.`P_ADDRESS_REGION`
-				, c.`P_PESEL`
-				, c.`P_PHONE`
-				, c.`P_OTHER_DOC`
-				, c.`user_mail_contact`
-				, c.`is_firma`
-				, w.`ID` as WINDYKACJA_ID
-				, w.`ID_BILLING_USERS`
-				, w.`A_STATUS`
-				, w.`A_STATUS_UPDATE_DATE`
-				, w.`USER_PAY_TERM_ADD`
-				, w.`L_APPOITMENT_DATE`
-				, w.`L_APPOITMENT_USER`
-				, w.`L_APPOITMENT_INFO`
-				, w.`PAY_DATE`
-				, w.`PAY_DATE_FIRST_FVAT`
-				, w.`PAY_TERM`
-				, w.`PAY_SALDO`
-				, w.`PAY_FVAT`
-				, w.`wezwanie1_DATE`
-				, w.`wezwanie2_DATE`
-				, w.`ID_KORESP`
-				, w.`LAST_PAY_DATE`
-				, w.`BAD_ADDRESS`
-				, c.`STATUS`
-				, c.`BILLING_OWNER`
-				, w.`NR_SPRAWY_KRD`
-				, w.`NR_SPRAWY_SAD`
-				, w.`NR_SPRAWY_KOMORNIK`
-				, w.`LAST_FVAT_PAY_TERM`
-		";
-		$sqlWhereAdd = "
-			and (w.`LAST_FVAT_PAY_TERM`>='2014-12-01'
-				or (	w.`LAST_FVAT_PAY_TERM`='0000-00-00'
-					and w.`LAST_FVAT_SELL_DATE`>='2014-12-01'
-				)
-			)
-			and c.`ID_BILLING_PREFIXES` in('0','1')
-			and c.`BILLING_OWNER` in('1')
-		";
-		if (V::get('DBG_NUM', '', $_GET)) {// number of clients with fvat after 2014-12-01
-			$sqlWhereAdd = "
-				and (w.`LAST_FVAT_PAY_TERM`>='2014-12-01'
-					or (	w.`LAST_FVAT_PAY_TERM`='0000-00-00'
-						and w.`LAST_FVAT_SELL_DATE`>='2014-12-01'
-					)
-				)
-				and c.`ID_BILLING_PREFIXES` in('0','1')
-				and c.`BILLING_OWNER` in('1')
-			";
-		}
-		$sql = "select {$sql_select}
-			from `USERS2_WINDYKACJA_STATUS` as w
-				join `COMPANIES` as c on(c.`ID`=w.`ID_BILLING_USERS`)
-			where c.`A_ADM_COMPANY`='19994_PODMIOT_Vectra_wlasciciel'
-				{$sqlWhereAdd}
-		";
-		if (V::get('DBG_SQL', '', $_GET)) {
-			header('Content-Type: text/plain; charset=utf-8');
-			echo $sql;
-			exit;
-		}
-		$res = $db->query($sql);
-		if ($db->has_errors()) {
-			print_r($db->get_errors());
-			die();
-		}
-		while ($r = $db->fetch($res)) {
-			$usersList[$r->ID_BILLING_USERS] = $r;
-		}
-		if (V::get('DBG_ILE', '', $_GET)) {
-			echo '<p>ilosc: ' . count($usersList) . '</p>' . '<pre style="max-height:200px;overflow:auto">';
-				print_r($usersList);
-			echo '</pre>';
-			exit;
-		}
-		if (V::get('DBG_IDS', '', $_GET)) {
-			header('Content-Type: text/plain; charset=utf-8');
-			echo 'ilosc: ' . count($usersList) . "\n";
-			echo implode("\n", array_keys($usersList));
-			exit;
-		}
-		$limit = 10000;
-		$date_limit = V::get('DATE_LIMIT', date("Y-m-d"), $_GET);
-		$date_limit_from = '2014-12-01';
-		$csvFileName = "Zestawienie-zadluzenia-do-{$date_limit}";
-		header('Content-Type: text/csv; charset=utf-8');
-		header("Content-Disposition: attachment; filename={$csvFileName}.csv");
-		$showCsvHeader = true;
-		foreach ($usersList as $userId => $user) {
-			$billing_docs = WindykacjaStatsModel::get_bill_dosc_by_date($user, $date_limit);
-			$billing_docs->sort_docs();
-			$fvat_arr = $billing_docs->get_unpaid_fvat();
-			WindykacjaStatsModel::update_doc_number($fvat_arr);
-
-			if (V::get('DBG_LAST_FVAT_TERM', '', $_GET)) {
-				$lastFvatDoc = $billing_docs->get_last_fvat_doc();
-				if ($lastFvatDoc) {
-					echo '<p>lastFvatDoc:</p><pre style="max-height:200px;overflow:auto">';
-						print_r($lastFvatDoc);
-					echo '</pre>';
-					exit;
-				}
-			}
-
-			$user->hasActiveDeal = 0;
-			$sql = "select sum(t.`DEALS_ACTIVE`) as activeDeals
-				from `temp_DEALS_STATUS` as t
-				where t.`DEALS_ACTIVE`=1
-					and t.`ID_BILLING_USERS`='{$userId}'
-			";
-			$res = $db->query($sql);
-			if ($db->num_rows($res) > 0) {
-				$user->hasActiveDeal = 1;
-			}
-
-			$out_tbl = array();
-			foreach ($fvat_arr as $v_fvat) {
-				if ($v_fvat['BILL_DATE'] < $date_limit_from || $v_fvat['BILL_DATE'] > $date_limit) {
-					//echo 'pomin fvat:'."\n";print_r($v_fvat);
-					continue;
-				}
-				$out_tr = array();
-				$out_tr['ID'] = $v_fvat['ID'];
-				$out_tr['nr'] = $v_fvat['NUMBER'] . '/' . $v_fvat['ID_BILLING_PREFIXES'];
-				$out_tr['winien'] = number_format($v_fvat['WINIEN'], 2, '.', '');
-				$out_tr['data'] = $v_fvat['BILL_DATE'];
-				$out_tr['termin'] = $v_fvat['PAYMENT_TERM'];
-				$out_tr['pozostalo'] = number_format($v_fvat['WINIEN_POZOSTALO'], 2, '.', '');
-				array_unshift($out_tbl, $out_tr);// add to the begining
-			}
-
-			{// csv
-				$csvLine = array();
-				$csvLine[] = '"id klienta"';
-				$csvLine[] = '"nr dokumentu"';
-				$csvLine[] = '"kwota brutto"';
-				$csvLine[] = '"data faktury"';
-				$csvLine[] = '"termin płatności"';
-				$csvLine[] = '"pozostało do zapłaty"';
-				$csvLine[] = '"status klienta (9=blokada)"';
-				$csvLine[] = '"aktywne uslugi"';
-				if ($showCsvHeader) {
-					echo implode(';', $csvLine) . ";\n";
-					$showCsvHeader = false;
-				}
-				foreach ($out_tbl as $tr) {
-					$csvLine = array();
-					$csvLine[] = '"' . $userId . '"';
-					$csvLine[] = '"' . $tr['nr'] . '"';
-					$csvLine[] = '"' . $tr['winien'] . '"';
-					$csvLine[] = '"' . $tr['data'] . '"';
-					$csvLine[] = '"' . $tr['termin'] . '"';
-					$csvLine[] = '"' . $tr['pozostalo'] . '"';
-					$csvLine[] = '"' . $user->STATUS . '"';
-					$csvLine[] = '"' . $user->hasActiveDeal . '"';
-					echo implode(';', $csvLine) . ";\n";
-				}
-			}
-			//echo '<pre style="max-height:200px;overflow:auto">fvat_arr: ';print_r($fvat_arr);echo'</pre>';
-			//echo '<pre style="max-height:200px;overflow:auto">ilosc('.count($out_tbl).') ' . "client({$userId}): ";print_r($out_tbl);echo'</pre>';
-			if (--$limit < 0) {
-				echo '<br>BREAK';
-				break;
-			}
-		}
-		exit;
-	}
-
-	public static function wezwanie(&$user, $wezwanie_termin, $wezwanie_ostateczne = false) {
-		$date_limit = date("Y-m-d");
-		$billing_docs = WindykacjaStatsModel::get_bill_dosc_by_date($user, $date_limit);
-
-		$billing_docs->sort_docs();
-
-		// sprawdz zadluzenie
-		if ($billing_docs->get_saldo() >= 0) {
-			echo'<p class="green">' . "Brak zadluzenia" . '</p>';
-			return;
-		}
-		else {
-			$fvat_arr = $billing_docs->get_unpaid_fvat();
-			//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">saldo('.$billing_docs->get_saldo().') fvat_arr: ';print_r($fvat_arr);echo'</pre>';
-			//foreach ($fvat_arr as $key => $v) {
-			//	echo'<br />'.number_format($v['WINIEN_POZOSTALO'], 4, ',', ' ');
-			//}
-
-			if (empty($fvat_arr)) {
-				echo'<p>'."Brak nieoplaconych faktur".'</p>';
-				return;
-			}
-
-			WindykacjaStatsModel::update_doc_number($fvat_arr);
-
-			$cols = array();
-			$cols['ID'] = "ID";
-			$cols['nr'] = "nr";
-			$cols['winien'] = "winien";
-			$cols['ma'] = "ma";
-			//$cols['saldo'] = "saldo";
-			$cols['saldo_all'] = "saldo";
-			$cols['add'] = "&nbsp;";
-
-			$saldo_all = 0;
-			foreach ($fvat_arr as $f) {
-				$saldo_all += round($f['WINIEN_POZOSTALO'], 2);
-			}
-
-			$out_tbl = array();
-			foreach ($fvat_arr as $v_fvat) {
-				$out_tr = array();
-				$out_tr['ID'] = ' <code style="font-size:10px">'."(".$v_fvat['ID'].")".'</code>';// TODO: dla KP,KW: ID_BILLING_NUMBERS zamiast ID
-				$out_tr['nr'] = $v_fvat['NUMBER'] . '/' . $v_fvat['ID_BILLING_PREFIXES'];
-				$out_tr['winien'] = number_format($v_fvat['WINIEN'], 2, ',', ' ');
-				$out_tr['data'] = $v_fvat['BILL_DATE'];
-				$out_tr['termin'] = $v_fvat['PAYMENT_TERM'];
-				$out_tr['pozostalo'] = number_format($v_fvat['WINIEN_POZOSTALO'], 2, ',', ' ');
-				array_unshift($out_tbl, $out_tr);// add to the begining
-			}
-
-			$razem = $saldo_all;
-
-			$company = WindykacjaStatsModel::get_company($user);
-
-			$nr_konta = FunkcjeL1::bankowy_formatuj_nrach(FunkcjeL1::bankowy_make_nrach($company->NR_RACH_MASS_PAY, $user->ID_BILLING_USERS, 0));
-
-		?>
-			<style type="text/css">
-body{font-family:serif; font-size:10px;line-height:14px;}
-td{font-family:verdana; font-size:10px; color:#333;}
-table {border-style:none;}
-table td, table th {padding:0 2px;border-style:solid;border-collapse:collapse;}
-table th {border-width:1px;border-color:#333;}
-table td {border-width:1px;border-color:#333;}
-			</style>
-		<?php
-
-		echo'<div style="background:#fff;border:none;margin:5px;padding:20px 40px 10px 40px;page-break-after:always;font-size:small;">';
-		$id_koresp = 0;
-		if ($user->ID_KORESP) {
-			$id_koresp = $user->ID_KORESP;
-			if ($user->LAST_ID_KORESP_WEZWANIE1 && !$wezwanie_ostateczne) {
-				$id_koresp = $user->LAST_ID_KORESP_WEZWANIE1;
-			} else if ($user->LAST_ID_KORESP_WEZWANIE2 && $wezwanie_ostateczne) {
-				$id_koresp = $user->LAST_ID_KORESP_WEZWANIE2;
-			}
-		}
-		if ($id_koresp > 0) {//$user->ID_KORESP) {// TODO: if $user->LAST_ID_KORESP_WEZWANIE1 or LAST_ID_KORESP_WEZWANIE2
-			$koresp = DB::get_by_id('IN7_DZIENNIK_KORESP', $id_koresp);
-			if ($koresp) {
-				echo '<div style="text-align:right;font-weight:bold;">';
-					echo $koresp->ID_PROJECT . '-' .$koresp->ID . "/" . substr(date("Y"), 2);
-				echo '</div>';
-			}
-		}
-
-		//echo "&bdquo;BIALL-NET&rdquo; Sp. z o.o.<br />Otomin, ul. Słoneczna 43<br />80-174 Gdańsk";
-		?>
-			<table border=0 cellspacing=0 cellpadding=0 style="width:100%;">
-				<tr>
-					<td style="width:60%;border:none;">
-						<?php echo $company->name1; ?>
-						<br /><?php echo "ul. " . $company->ulica . " " . $company->numer_dom; ?>
-						<br /><?php echo $company->kod . " " . $company->miasto; ?>
-					</td>
-					<td style="border:none;text-align:left;vertical-align:top;">
-						Gdańsk, dnia <?php echo date("Y-m-d"); ?>
-					</td>
-				</tr>
-				<tr>
-					<td style="border:none;">&nbsp;</td>
-					<td style="border:none;">
-						<p style="margin:50px 0;">
-							Numer klienta: <?php echo $user->ID; ?>
-							<br /><?php echo "{$user->P_NAME} {$user->P_NAME_SECOND}"; ?>
-<?php // TODO: P_ADRESS_KORESP_1282 ?>
-							<br /><?php echo "ul. {$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}"; ?>
-							<?php if ($user->P_ADDRESS_HOME) { echo "/{$user->P_ADDRESS_HOME}"; } ?>
-							<br /><?php echo "{$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}"; ?>
-						</p>
-					</td>
-				</tr>
-			</table>
-
-			<h1 style="text-align:center;margin:20px 10px 10px 10px;font-size:28px;">
-				<?php
-				if ($wezwanie_ostateczne) {
-					echo "OSTATECZNE WEZWANIE DO ZAPŁATY";
-				} else {
-					echo "WEZWANIE DO ZAPŁATY";
-				}
-				?>
-			</h1>
-			<p style="margin:10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Na podstawie art. 476 Kodeksu cywilnego (Dz. U. z 1964 r. nr 16, poz. 93, z późn. zmianami) wzywamy do natychmiastowego uregulowania należnej sumy, zgodnie z poniższym zestawieniem.</p>
-
-			<table border=0 cellspacing=0 cellpadding=2 style="width:100%;margin:10px;font-size:small;">
-			<thead style="background:#F3F3F3;">
-				<tr>
-					<th>Podstawa zobowiązania*</th>
-					<th>Nr dokumentu</th>
-					<?php //<th>Kwota netto</th> ?>
-					<th>Kwota brutto</th>
-					<th>Data faktury</th>
-					<th>Termin płatności</th>
-					<th>Pozostało do zapłaty</th>
-				</tr>
-			</thead>
-			<tfoot>
-				<tr>
-					<td colspan="4" style="border:none;"></td>
-					<th style="border-width:2px;border-color:#333;text-align:right;background:#F3F3F3;">Razem:</th>
-					<td style="border-width:2px;border-color:#333;font-weight:bold;"><?php echo FunkcjeL1::formatuj_grosze($razem); ?></td>
-				</tr>
-			</tfoot>
-				<?php foreach ($out_tbl as $out_tr) {
-					$k_data = $out_tr['data'];
-					$rok = substr($k_data, 0, 4);
-					$cls = array();
-					if ($add_cls = V::get('class', '', $out_tr)) $cls[] = $add_cls;
-					$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
-					//$file_total['PODSTAWA_NUMBER'] = $r['NUMBER']."/".$r['ID_BILLING_PREFIXES'];
-					//$file_total['PODSTAWA_DATA'] = date("Y-m-d",$r['BAF_TIMESTAMP']);
-					//$file_total['PAYMENT_TERM'] = date("Y-m-d",$r['TERMIN_PL']);
-					?>
-					<tr<?php echo $cls; ?>>
-					<td>
-						<?php echo "Faktura Vat"; ?>
-					</td>
-					<td>
-						<?php echo $out_tr['nr']; ?>
-					</td>
-					<td>
-						<?php echo $out_tr['winien']; ?>
-					</td>
-					<td>
-						<nobr><?php echo $out_tr['data']; ?></nobr>
-					</td>
-					<td>
-						<nobr><?php echo $out_tr['termin']; ?></nobr>
-					</td>
-					<td>
-						<?php echo $out_tr['pozostalo']; ?>
-					</td>
-					</tr>
-				<?php } ?>
-			</table>
-			<p style="margin:10px;">Słownie do zapłaty: <span style="border-bottom:1px dotted #000;padding:0 50px;">&nbsp;&nbsp;<b><?php echo FunkcjeL1::slownie($razem); ?></b>&nbsp;&nbsp;</span></p>
-			<p style="margin:10px;background:#eee;text-align:center;">Wymienioną sumę prosimy przekazać na nasz rachunek bankowy <br /><?php echo $nr_konta; ?> w terminie do dnia <span style="border-bottom:1px dotted #000;padding:0 50px;">&nbsp;&nbsp;<b><?php echo $wezwanie_termin; ?></b>&nbsp;&nbsp;</span></p>
-			<ul style="margin:10px;font-size:small;padding:0 0 0 40px;">
-				<li style="line-height:16px;">Od nieterminowych płatności mogą zostać naliczone odsetki ustawowe (art.481 § 1 KC).</li>
-				<li style="line-height:16px;">W przypadku nieterminowej zapłaty nabywca zostanie obciążony wszelkimi kosztami windykacji oraz postępowania sądowego, które zostaną poniesione przez sprzedawcę w celu odzyskania należności.</li>
-				<li style="line-height:16px;">W przypadku uregulowania należności przed otrzymaniem niniejszego wezwania, proszę potraktować je za bezprzedmiotowe.</li>
-			</ul>
-
-			<table style="width:100%;border:none">
-			<tr>
-				<td colspan="2" style="border:none;">
-					<p style="margin:5px 0;font-size:10px;">W razie problemów prosimy o kontakt z Biurem Obsługi Klienta tel. (58) 741-84-10 wew. 2,
-<br> e-mail: bok@biall.net.pl lub z Windykatorem: tel. (58) 741-84-78</p>
-				</td>
-			</tr>
-			</table>
-
-			<table style="width:100%;border:none">
-			<tr>
-				<td style="width:50%;border:none;">&nbsp;</td>
-				<td style="width:50%;border:2px solid #999"><br /><br /><br /><br /></td>
-			</tr>
-			<tr>
-				<td style="border:none;">&nbsp;</td>
-				<td style="text-align:center;border:none;">(pieczęć i podpis wierzyciela)</td>
-			</tr>
-			<tr>
-				<td colspan="2" style="border:none;">
-					<p style="margin:10px 0;font-size:xx-small;">* Podstawa zobowiązania: Faktura VAT, Rachunek, Umowa, Nota odsetkowa, Nota księgowa, Weksel, Uznanie długu, Ugoda, Kara umowna, Faktura zbiorowa, Wyrok sądowy, Nakaz zapłaty, Pożyczka, inne.</p>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="2" style="border:none">
-					<p style="margin:8px 0;font-size:x-small;text-align:center">W przypadku nieuregulowania płatności we wskazanym terminie, zgodnie z &bdquo;Ustawą o udostępnianiu informacji gospodarczych z dnia 14 lutego 2003 r. (Dz. U. Nr 50)&rdquo; , informacje o zadłużeniu zostaną przekazane do:</p>
-					<p style="margin:8px 0 0 0;font-size:small;text-align:center"><b>Krajowego Rejestru Długów<br />
-Biura Informacji Gospodarczej S.A.<br />
-ul. Armii Ludowej 21, 51-214 Wrocław<br />
-www.krd.pl</b>
-<br />
-<br />
-Informacja o zadłużeniu upubliczniona będzie w systemie KRD do dnia zapłaty  lub 10 lat od daty dokonania wpisu.</p>
-				</td>
-			</tr>
-			</table>
-		</div>
-	</body>
-</html>
-			<?php
-			die();
-		}
-	}
-
-	public static function task_update_stats() {
-		self::css();
-		$to_update_step = 1000;
-		$q = V::get('q', '', $_GET);
-		$_p = V::get('_p', 0, $_GET, 'int');
-		echo'<a href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".$q."&_p=".$_p . '">' . "Cofnij" . '<img src=icon/back.gif border=0 alt=POWROT>' . '</a>';
-
-		$to_update_total = WindykacjaStatsHelper::get_to_update_total();
-		if ($to_update_total <= 0) {
-			echo'<p style="color:green">' . "Wszystkie rekordy zaktualizowane" . '</p>';
-			return;
-		}
-
-		if ($to_update_total > $to_update_step) {
-			echo'<br />';
-			echo'<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&task=stats_update&q=".$q."&_p=".$_p . '">' . "Aktualizuj statusy (" . ($to_update_total - $to_update_step) . ")" . '</a>';
-			echo'<br />';
-		}
-
-		$to_update_list = WindykacjaStatsHelper::get_to_update_list($to_update_step);
-		if (empty($to_update_list)) {
-			echo'<p style="color:green">' . "Wszystkie rekordy zaktualizowane" . '</p>';
-			return;
-		}
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">to_update_list: ';print_r($to_update_list);echo'</pre>';
-		foreach ($to_update_list as $w) {
-			//echo'<div class="box box-blue">';
-				echo "Nr. klienta: <b>".$w->ID_BILLING_USERS . "</b> ...";
-				//echo $w->A_STATUS . ' (' . $w->A_STATUS_UPDATE_DATE . ')';
-				$user = WindykacjaStatsModel::get_user_by_id($w->ID_BILLING_USERS);
-				if ($user) {
-					$billing_docs = WindykacjaStatsModel::get_bill_dosc_by_date($user);
-					WindykacjaStatsHelper::update_stats($user, $billing_docs);
-				}
-			//echo'</div>';// .box-blue
-				echo'<br />';
-		}
-
-		if ($to_update_total > $to_update_step) {
-			echo'<br /><br />';
-			echo'<a style="color:red" href="' . "?MENU_INIT=USERS2_WINDYKACJA_STATUS&task=stats_update&q=".$q."&_p=".$_p . '">' . "Aktualizuj statusy (" . ($to_update_total - $to_update_step) . ")" . '</a>';
-		}
-	}
-
-	public static function getPowodyRezygnacji() {
-		// [895].[3888] - DEALS_TABLE.RODZAJ_DZIALANIA_HANDLOWEGO
-		$powody = array();
-		//	$powody['3226'] = "REZYGNACJA FINANSE";
-		//	$powody['3227'] = "REZYGNACJA SLABA OFERTA";
-		//	$powody['3121'] = "REZYGNACJA WYPROWADZKA";
-		//	$powody['3228'] = "REZYGNACJA PROBLEMY TECHNICZNE";
-		//	$powody['3230'] = "REZYGNACJA WYJAZD";
-		//	$powody['3229'] = "REZYGNACJA ZLA OBSLUGA BOK";
-		//	$powody['3123'] = "REZYGNACJA CESJA";
-		//	$powody['3119'] = "BRAK-BOK (Inne)";
-		//	$powody['4188'] = "UMOWA_BEZPOSREDNIA";
-		//	$powody['4189'] = "UMOWA_POSREDNIA";
-		//	$powody['4190'] = "TELEMARKETING";
-		$powody['4192'] = "REZYGNACJA ZMIANA OPERATORA";
-		$powody['4193'] = "REZYGNACJA WYPROWADZKA";
-		$powody['4194'] = "REZYGNACJA NIEZADOWOLENIE";
-		$powody['4195'] = "REZYGNACJA CESJA";
-		//$powody['4196'] = "REZYGNACJA FINANSE";
-		$powody['4197'] = "REZYGNACJA SLABA OFERTA";
-		$powody['4198'] = "REZYGNACJA PROBLEMY TECHNICZNE";
-		$powody['4199'] = "REZYGNACJA ZLA OBSLUGA BOK";
-		$powody['4200'] = "WYPOWIEDZENIE PRZEZ OPERATORA ZA DLUGI";
-		//	$powody['4201'] = "UMOWA W BOK ZWYCZAJNA";
-		//	$powody['4202'] = "REZYGNACJA WYJAZD";
-		//	$powody['4191'] = "BRAK-BOK (Inne)";
-		$powody['19803'] = "REZYGNACJA_Z_PRZEJSCIEM_DO_VECTRA";
-		$powody['22511'] = "WYPOWIEDZENIE PRZEZ OPERATORA";
-		$powody['4213'] = "REZYGNACJA INNE";
-		return $powody;
-	}
-
-	/**
-	 * @params $user
-	 * @params $id_koresp
-	 */
-	public static function task_bok_rozwiazanie_umowy_print($user, $id_koresp) {
-		$user_hist_events = WindykacjaStatsHelper::get_user_hist_status_events($user);
-		if (empty($user_hist_events)) {
-			echo '<p style="color:red">' . "Brak danych HIST" . '</p>';
-			return;
-		}
-		$v_doc = null;
-		foreach ($user_hist_events as $v_hist) {
-			if ($v_hist->ID_KORESP == $id_koresp) {
-				$v_doc = $v_hist;
-				break;
-			}
-		}
-		if (!$v_doc) {
-			echo '<p style="color:red">' . "Brak danych HIST dla kodresp(".$v_doc->ID_KORESP.")" . '</p>';
-			return;
-		}
-
-		// params(255): rozwiazanie umowy,9872,3121
-		$params = explode(',', $v_doc->params);
-		if (count($params) < 3 && $params[0] != 'rozwiazanie umowy') {
-			echo '<p style="color:red">' . "Bad params" . '</p>';
-			return;
-		}
-
-		$koresp = DB::get_by_id('IN7_DZIENNIK_KORESP', $id_koresp);
-		if (!$koresp) {
-			echo '<p style="color:red">' . "Koresp not exists!" . '</p>';
-			return;
-		}
-
-		$nr_umowy = $params[1];
-		$powod = $params[2];
-
-		$deal_id = '..........................................................';
-		$termin_odlaczenia = '.....................';
-		if (count($params) > 4) {
-			// $data_arr["params"] = "rozwiazanie umowy,{$nr_umowy},{$powod},{$termin_odlaczenia},{$new_id_deals}";
-			$termin_odlaczenia = $params[3];
-			$deal_id = $params[4];
-		}
-
-		$arg_values = array();
-		$arg_values['powod'] = self::getPowodyRezygnacji();
-
-		$com = new stdClass();
-		if ($user->BILLING_OWNER == 2) {
-			$com->name = 'NET-DAY';
-			$com->fullName = 'NET-DAY s.c.';
-			$com->address_street = 'ul. Kopeckiego 9/24';
-			$com->address_city = '80-809 Gdańsk';
-		} else {
-			$com->name = 'BIALL-NET';
-			$com->fullName = 'BIALL-NET Sp. z o.o.';
-			$com->address_street = 'Otomin ul. Słoneczna 43';
-			$com->address_city = '80-174 Gdańsk';
-		}
-
-		?>
-		<style type="text/css">
-body{margin:12px;font-family:serif;font-size:11px;line-height:14px;}
-td{font-family:verdana; font-size:10px; color:#333;}
-table {border-style:none;}
-table td, table th {padding:0 2px;border-collapse:collapse;}
-table.tbl-bordered {border-style:none;}
-table.tbl-bordered td, table.tbl-bordered th {padding:0 2px;border-style:solid;border-collapse:collapse;}
-table.tbl-bordered th {border-width:1px;border-color:#333;}
-table.tbl-bordered td {border-width:1px;border-color:#333;}
-		</style>
-
-		<table cellspacing="0" cellpadding="0" border="0" style="width:100%;"><tr>
-			<td>[1612][v3]</td>
-			<td style="text-align:right">Nr dziennika przyjęcia pisma <?php echo $com->fullName; ?> <?php echo $koresp->ID_PROJECT; ?>-<?php echo $koresp->ID; ?>/<?php echo substr(date("Y"), 2); ?>
-				<br />Gdańsk, dnia: .......................
-			</td>
-		</tr></table>
-		<br /><b>Dane Abonenta</b>
-		<br />Imię i Nazwisko / Nazwa firmy: <?php echo "{$user->P_NAME} {$user->P_NAME_SECOND}";?>
-		<br />Pesel / nr dowodu osoby reprezentującej firmę: <?php echo $user->P_PESEL; ?>
-		<br />Adres zameldowania: ul. <?php echo "{$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}/{$user->P_ADDRESS_HOME}, {$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}"; ?>
-
-		<br />Nr ID klienta: <?php echo $user->ID; ?>
-		<br />Nr ID Umowy: <?php echo $deal_id; ?>
-		<?php
-			// <br />ID_SERVICES_OLD: .......................................................... 
-		?>
-		<table cellspacing="0" cellpadding="0" border="0" style="width:100%;margin:40px 0;"><tr>
-			<td>&nbsp;</td>
-			<td style="width:260px;text-align:left">
-				<?php echo $com->fullName; ?><br /><?php echo $com->address_street; ?><br /><?php echo $com->address_city; ?>
-			</td>
-		</tr></table>
-		<p style="margin:50px 0; text-align:center;">ROZWIĄZANIE UMOWY ABONENCKIEJ O ŚWIADCZENIE USŁUG TELEKOMUNIKACYJNYCH NR <sup>[794]</sup></p>
-		<p style="margin:0 0 50px 0;text-indent:50px">Proszę o rozwiązanie umowy abonenckiej o świadczeniu Usług Telekomunikacyjnych i odłączenie sygnału <?php echo $com->fullName; ?>. Jednocześnie jestem świadomy/a tego, że jeżeli okres trwania wypowiadanej umowy jeszcze nie uległ zakończeniu to firma <?php echo $com->name; ?> może naliczyć karę za wcześniejsze zerwanie umowy zgodnie z obowiązującym regulaminem i cennikiem.</p>
-		<p>Termin odłączenia: <?php echo $termin_odlaczenia; ?>
-		<br />(poinformowano o miesięcznym terminie wypowiedzenia, jak również przedstawiono nowe propozycje oferty)</p>
-		<p style="margin:30px 0;font-weight:bold;"><sup>[1061]</sup>Powody rezygnacji z Usług (wybierz tylko 1 najważniejszy powód)</p>
-		<table cellspacing="0" cellpadding="0" border="1" style="width:100%" class="tbl-bordered">
-			<?php foreach ($arg_values['powod'] as $k_powod => $v_label) : ?>
-				<?php $sel = ($powod == $k_powod)? "X" : "&nbsp;"; ?>
-				<tr><td style="width:26%;"><?php echo $v_label; ?></td><td style="width:5%;text-align:center;"> <?php echo $sel; ?> </td><td></td></tr>
-			<?php endforeach; ?>
-		</table>
-		<table cellspacing="0" cellpadding="0" border="0" style="margin:60px 0;width:100%;">
-			<tr>
-				<td style="width:15%;">&nbsp;</td>
-				<td style="width:20%;border-top:1px dotted #000;text-align:center;">
-					Data i podpis pracownika BOK
-				</td>
-				<td>&nbsp;</td>
-				<td style="width:20%;border-top:1px dotted #000;text-align:center;">
-					Data i czytelny podpis Klienta
-				</td>
-				<td style="width:15%;">&nbsp;</td>
-			</tr>
-		</table>
-		<?php
-	}
-
-	public static function task_bok_rozwiazanie_umowy(&$user) {
-		echo'<script type="text/javascript">'."
-function frm_bok_rozwiazanie_umowy(frm){
-	if (frm.id_proj.value=='') {
-		alert('Nie podano numeru projektu!');
-	} else if (frm.nr_umowy.value=='') {
-		alert('Nie podano numeru umowy!');
-	} else if (frm.temin_odlaczenia.value=='') {
-		alert('Nie podano daty odłączenia!');
-	// TODO: powod - radio
-	} else {
-		return true;
-	}
-	return false;
-}
-		".'</script>';
-
-		$umowy_l2 = WindykacjaStatsModel::get_umowy_from_l2($user);
-		if (empty($umowy_l2)) {
-			echo '<p style="color:red">' . "Brak aktualnych umów z klientem" . '</p>';
-			return;
-		}
-
-		$arg_errors = array();
-		$arg_values = array();
-		$args = array();
-		$args['id_proj'] = V::get('id_proj', '', $_REQUEST, 'int');
-		$args['nr_umowy'] = V::get('nr_umowy', '', $_REQUEST, 'int');
-		$args['temin_odlaczenia'] = V::get('temin_odlaczenia', '', $_REQUEST);
-		$args['powod'] = V::get('powod', '', $_REQUEST, 'int');
-
-		$arg_values['nr_umowy'] = array();
-		foreach ($umowy_l2 as $k_id => $v_deal) {
-			$arg_values['nr_umowy'][$v_deal['ID']] = $v_deal['ID'] . ' (Nr umowy: ' . $v_deal['P_DEALNUMBER'] . ', ' . $v_deal['P_DEALDATE'] . ' - ' . $v_deal['P_DEALDATE_TERM'] . ')';
-		}
-
-		$arg_values['powod'] = self::getPowodyRezygnacji();
-
-		// validate
-		if ($args['temin_odlaczenia'] == '') {
-			$args['temin_odlaczenia'] = date("Y-m-d", mktime(0, 0, 0, date('m') + 1, date('d'), date('Y')));
-		} else {// cehck date format
-			if (strlen($args['temin_odlaczenia']) != 10) {
-				$arg_errors['temin_odlaczenia'] = "Błędny format daty";
-			} else {
-				$check_date = explode('-', $args['temin_odlaczenia']);
-				if (count($check_date) != 3 || strlen($check_date[0]) != 4 || strlen($check_date[1]) != 2 || strlen($check_date[2]) != 2) {
-					$arg_errors['temin_odlaczenia'] = "Błędny format daty";
-				} else {
-					// ok
-				}
-			}
-		}
-		if ($args['id_proj'] <= 0) {
-			$arg_errors['id_proj'] = "Nie podano numeru projektu!";
-		}
-		if ($args['nr_umowy'] <= 0) {
-			$arg_errors['nr_umowy'] = "Nie wybrano numeru umowy!";
-		}
-		if ($args['powod'] <= 0) {
-			$arg_errors['powod'] = "Nie wybrano powodu rezygnacji!";
-		}
-
-		// add rezygnacja z umowy
-		if (1 == V::get('contact_bok_rozwiazanie_umowy_save', 0, $_POST, 'int')) {
-			if (!empty($arg_errors)) {
-				echo '<p style="color:red">' . "W formularzy wystąpiły błędy:";
-					foreach ($arg_errors as $k_field => $v_err) {
-						echo '<br />' . $v_err;
-					}
-				echo '</p>';
-			} else {
-				$msg_log = array();
-				$ret = WindykacjaStatsHelper::update_bok_rozwiazanie_umowy($user, $args['id_proj'], $args['nr_umowy'], $args['powod'], $arg_values['powod'][$args['powod']], $args['temin_odlaczenia'], $msg_log);
-				if ($ret) {
-					echo '<p style="color:green">' . "Dane zapisano pomyślnie" . '</p>';
-					if (!empty($msg_log)) {
-						echo '<p style="color:silver">' . implode('<br />', $msg_log) . '</p>';
-					}
-					$ico_print = '<img src="icon/print.gif" height="16" />';
-					echo '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy_print"."&user_id=".$user->ID."&id_koresp=".$ret.'">' . $ico_print . " rozwiązanie umowy".'</a>';
-					return;
-				} else {
-					echo '<p style="color:red">' . "Wystąpił błąd podczas zapisu danych" . '</p>';
-					if (!empty($msg_log)) {
-						echo '<p style="color:silver">' . implode('<br />', $msg_log) . '</p>';
-					}
-				}
-			}
-		}
-
-		echo'<form action="" method="post" onsubmit="' . "return frm_bok_rozwiazanie_umowy(this);" . '">';
-			echo'<input type="hidden" name="'."contact_bok_rozwiazanie_umowy_save".'" value="'."1".'" />';
-			echo '<b>' . "Rozwiązanie umowy abonenckiej o świadczenie usług telekomunikacyjnych" . '</b>';
-			echo '<br />' . "ID projektu: ";
-			echo '<input type="text" name="'."id_proj".'" value="' . $args['id_proj'] . '" class="i" />';
-			echo '<br />' . "Nr umowy: ";
-				foreach ($arg_values['nr_umowy'] as $k_id => $v_label) {
-					$sel = ($k_id == $args['nr_umowy'])? ' checked="checked"' : '';
-					echo '<br />' . "&nbsp;&nbsp;&nbsp;&nbsp;" . '<input type="radio" name="'."nr_umowy".'" value="' . $k_id . '" class="i" ' . $sel . ' />' . " " . $v_label;
-				}
-			echo '<br />' . "Termin odłączenia: ";
-			echo '<input type="text" name="'."temin_odlaczenia".'" value="' . $args['temin_odlaczenia']. '" class="i" />';
-			echo '<br />' . "Powód rezygnacji z usług: ";
-				foreach ($arg_values['powod'] as $k_id => $v_label) {
-					$sel = ($k_id == $args['powod'])? ' checked="checked"' : '';
-					echo '<br />' . "&nbsp;&nbsp;&nbsp;&nbsp;" . '<input type="radio" name="'."powod".'" value="' . $k_id . '" class="i" ' . $sel . ' />' . " " . $v_label;
-				}
-			echo '<br />' . '<input type="submit" value="'."zapisz".'" />';
-		echo'</form>';
-	}
-
-}
-
-
-class BillingDocs {
-
-	var $_docs;
-	var $_saldo;
-
-	public function __construct() {
-		$this->_docs = array();
-		$this->_saldo = 0;
-	}
-
-	public function add_bill_doc($data, $type, $h) {
-		$bill_doc = new BillingDoc($type, $h);
-		if ('FVAT' == $type && '0000-00-00' == $data) {
-			$data = $h['BILL_DATE'];
-		}
-		$this->_docs[$data][] = $bill_doc;
-		if ($data <= date("Y-m-d")) {
-			$this->_saldo += $bill_doc->get_saldo();
-		}
-	}
-
-	public function add_event($data, $type, $h) {
-		$event = new EventDoc($type, $h);
-		$this->_docs[$data][] = $event;
-	}
-
-	public function get_saldo() {
-		if (round($this->_saldo, 2) === 0.0) {// float point bug round('-6.821210263297E-13', 2) = -0
-			$this->_saldo = 0.0;
-		}
-		return round($this->_saldo, 2);
-	}
-
-	public function get_saldo_30_dni() {
-		// `PAY_SALDO_30_DNI` bez fv z terminem płatności < 30 dni
-		$saldo_30_dni = 0;
-		$dateMinus30dni = date('Y-m-d', mktime(0,0,0, date('n'), date('j') - 30, date('Y')));
-		foreach ($this->_docs as $kData => $vDocs) {
-			foreach ($vDocs as $vDoc) {
-				if ($vDoc instanceof BillingDoc) {
-					if ('FVAT' == $vDoc->get_type()) {// TODO: if FVAT then use only date PAYMENT_TERM >= 30 dni
-						if ($vDoc->get('PAYMENT_TERM') > $dateMinus30dni) {
-							//echo'<pre>POMIŃ! $vDoc pay_term('.$vDoc->get('PAYMENT_TERM').') ';print_r($vDoc);echo'</pre>';
-						} else {
-							//echo'<pre>$vDoc pay_term('.$vDoc->get('PAYMENT_TERM').'/'.($vDoc->get('PAYMENT_TERM') > $dateMinus30dni).') ';print_r($vDoc);echo'</pre>';
-							$saldo_30_dni += $vDoc->get_saldo();
-						}
-					} else {
-						$saldo_30_dni += $vDoc->get_saldo();
-					}
-				}
-			}
-		}
-		$saldo_30_dni = round($saldo_30_dni, 2);
-		if ($saldo_30_dni === 0.0) {// float point bug round('-6.821210263297E-13', 2) = -0
-			$saldo_30_dni = 0.0;
-		}
-		return $saldo_30_dni;
-	}
-
-	public function get_saldo_issued() {
-		// `PAY_SALDO_ISSUED` fv wg daty wystawienia
-		$saldo_issued = 0;
-		foreach ($this->_docs as $kData => $vDocs) {
-			foreach ($vDocs as $vDoc) {
-				if ($vDoc instanceof BillingDoc) {
-					if (1) {// TODO: if FVAT then use SELL_DATE instead of PAYMENT_TERM
-						$saldo_issued += $vDoc->get_saldo();
-					} else {
-						$saldo_issued += $vDoc->get_saldo();
-					}
-				}
-			}
-		}
-		$saldo_issued = round($saldo_issued, 2);
-		if ($saldo_issued === 0.0) {// float point bug round('-6.821210263297E-13', 2) = -0
-			$saldo_issued = 0.0;
-		}
-		return $saldo_issued;
-	}
-
-	public function get_docs() {
-		return $this->_docs;
-	}
-
-	public function sort_docs() {
-		ksort($this->_docs);
-	}
-
-	public function get_unpaid_fvat() {
-		$today_date = date("Y-m-d");
-		$fvat_arr = array();
-		$saldo_curr = $this->get_saldo();
-		if ($saldo_curr >= 0) {
-			return $fvat_arr;
-		}
-		$break = false;
-		$saldo_dates_keys = array_keys($this->_docs);
-		$saldo_dates_keys = array_reverse($saldo_dates_keys);
-		foreach ($saldo_dates_keys as $k_data) {
-			if ($k_data > $today_date) continue;
-			$v_saldo_arr = $this->_docs[$k_data];
-			foreach ($v_saldo_arr as $k_ind => $v_doc) {
-				if ($v_doc->get_type() == 'FVAT') {
-					$h = $v_doc->get_data();
-					$h['WINIEN_POZOSTALO'] = round($h['WINIEN'], 2);
-					$saldo_curr += round($h['WINIEN'], 2);
-					if ($saldo_curr >= 0) {
-						$h['WINIEN_POZOSTALO'] -= $saldo_curr;
-						$break = true;
-					}
-					$fvat_arr[] = $h;
-				}
-				if ($break) break;
-			}
-			if ($break) break;
-		}
-		return $fvat_arr;
-	}
-
-	public function getLastIncomeDocsForSaldo($saldoLimit) {
-		$today_date = date("Y-m-d");
-		$incomeDocs = array();
-		$break = false;
-		$saldo_dates_keys = array_keys($this->_docs);
-		$saldo_dates_keys = array_reverse($saldo_dates_keys);
-		$saldo_curr = 0;
-		foreach ($saldo_dates_keys as $k_data) {
-			if ($k_data > $today_date) continue;
-			$v_saldo_arr = $this->_docs[$k_data];
-			foreach ($v_saldo_arr as $k_ind => $v_doc) {
-				if (in_array($v_doc->get_type(), array('WB_MASS','KP'))) {
-					$h = $v_doc->get_data();
-					$h['MA_POZOSTALO'] = round($h['MA'], 2);
-					$saldo_curr += round($h['MA'], 2);
-					if ($saldo_curr >= $saldoLimit) {
-						$h['MA_POZOSTALO'] -= $saldo_curr - $saldoLimit;
-						$break = true;
-					}
-					$incomeDocs[] = $h;
-				}
-				if ($break) break;
-			}
-			if ($break) break;
-		}
-		return $incomeDocs;
-	}
-
-	public function get_last_pay_doc() {
-		$last_pay_doc = null;
-		$today_date = date("Y-m-d");
-		$break = false;
-		foreach ($this->_docs as $k_data => $v_saldo_arr) {
-			if ($k_data > $today_date) continue;
-			foreach ($v_saldo_arr as $k_ind => $v_doc) {
-				if (in_array($v_doc->get_type(), array('WB_MASS','KP'))) {
-					$last_pay_doc = $v_doc;
-					break;
-				}
-			}
-			if ($break) break;
-		}
-		return $last_pay_doc;
-	}
-
-	public function get_last_fvat_doc() {
-		$last_fvat_doc = null;
-		$today_date = date("Y-m-d");
-		$break = false;
-		foreach ($this->_docs as $k_data => $v_saldo_arr) {
-			if ($k_data > $today_date) continue;
-			foreach ($v_saldo_arr as $k_ind => $v_doc) {
-				if (in_array($v_doc->get_type(), array('FVAT'))) {
-					$last_fvat_doc = $v_doc;
-					break;
-				}
-			}
-			if ($break) break;
-		}
-		return $last_fvat_doc;
-	}
-
-}
-
-
-class TimelineDoc {
-
-	var $_type;
-	var $_data;
-	var $_class;
-
-	public function get_type() { return $this->_type; }
-	public function get_data() { return $this->_data; }
-	public function get_class() { return $this->_class; }
-	public function get($key) {
-		return $this->_data[$key];
-	}
-
-}
-
-
-class EventDoc extends TimelineDoc {
-
-	public function __construct($type, &$data) {
-		$this->_data = $data;
-		$this->_class = 'EVENT';
-		$this->_type = $type;
-	}
-
-}
-
-
-class BillingDoc extends TimelineDoc {
-
-	public function __construct($type, &$data) {
-		$this->_data = $data;
-		$this->_class = 'BILLING';
-		$this->_convert_type($type);
-		$this->_count_saldo();
-	}
-
-	public function get_saldo() {
-		return $this->_saldo;
-	}
-
-	public function get($key) {
-		return $this->_data[$key];
-	}
-
-	public function _convert_type($type) {
-		$this->_type = $type;
-		switch ($this->_type) {
-			case 'FVAT':
-				$this->_data['nr'] = $this->_data['ID_BILLING_NUMBERS'];
-				$this->_data['WINIEN'] = $this->_data['WARTOSC'];
-				$this->_data['MA'] = 0;
-				break;
-
-			case 'KP':
-			case 'KW':
-			case 'WB':
-			case 'WB_MASS':
-			case 'KORV':
-				$this->_data['nr'] = $this->_data['NUMBER'];
-				break;
-
-			default:
-
-		}
-	}
-
-	public function _count_saldo() {
-		$this->_saldo = 0;
-		switch ($this->_type) {
-			case 'FVAT':
-				$this->_saldo -= round($this->_data['WARTOSC'], 2);
-				break;
-
-			case 'KORV':
-				$this->_saldo -= round($this->_data['MA'], 2);
-				break;
-
-			case 'KP':
-			case 'KW':
-			case 'WB':
-			case 'WB_MASS':
-				$this->_saldo += round($this->_data['MA'], 2);
-				$this->_saldo -= round($this->_data['WINIEN'], 2);
-				break;
-
-			default:
-
-		}
-	}
-
-}
-
-
-class WindykacjaStatsHelper {
-
-	// TODO: `A_RECORD_UPDATE_DATE` aktualizowane tylko wraz ze statusem
-	// TODO: statusy:
-		// 1. Automatyczne wysłanie powiadomień do Abonentów o niezapłaconych fakturach drogą e-mailową
-		//    5 dni roboczych po 10-go na okolo 5 dni przed blokadami
-		// - blokada: ??? dni po ostatniej dacie platnosci - odczytac czy zablokowany z l2?
-		// - 1 list - wezwanie - jesli min. 2 faktury - czyli 2 m-ce od 1 daty platnosci
-		// - 2 list - wezwanie ostateczne - min. 300 zł
-
-	public static function get_filter_selected() {
-		$filter_selected = V::get('_f', '', $_GET);
-		$filter_arr = self::get_filters();
-		$filter_selected = (array_key_exists($filter_selected, $filter_arr))? $filter_selected : '';
-		return $filter_selected;
-	}
-
-	public static function get_filter_selected_label() {
-		$fltrLabel = '';
-		$fltrSelected = self::get_filter_selected();
-		if (!empty($fltrSelected)) {
-			$fltrs = self::get_filters();
-			$fltrLabel = V::get($fltrSelected, '', $fltrs);
-			$fltrLabel = V::get(0, '', $fltrLabel);
-		}
-		return $fltrLabel;
-	}
-
-	public static function get_filters() {
-		$filter_arr['stan_zero'] = array("stan zerowy");
-		$filter_arr['10-ego'] = array("termin płatności faktur, saldo na -", 'desc'=>array("10-ego", "10-ego każdego miesiąca - termin płatnosci faktur oraz saldo na minusie"));
-		$filter_arr['WAITING'] = array("termin płatności faktur", 'desc'=>array("10-ego", "10-ego każdego miesiąca - termin płatnosci faktur"));// z regulaminu
-		$filter_arr['15'] = array("mail ponaglenie", 'desc'=>array("10-ego + 5", "10-ego + 5 dni roboczych"));
-		$filter_arr['blokada'] = array("blokada", 'desc'=>array("pn, wt, śr około 25", "najbliższy pn, wt, śr do 25"));// najbliższy pn, wt, śr do 25-ego danego miesiąca
-		$filter_arr['tel1'] = array("kontakt tel.", 'desc'=>array("", "Ostatni kontakt tel. ponad 3 m-ce temu"));
-		$filter_arr['bad_address'] = array("błędny adres");
-		$filter_arr['wezwanie1'] = array("wezwanie do zapłaty", 'desc'=>array("2 x FVat", "2 faktury"));
-		$filter_arr['waiting-wezwanie2'] = array("oczekiwanie 7 dni od terminu płatności");
-		$filter_arr['wezwanie2'] = array("ostateczne wezwanie do zapłaty, rozwiązanie umowy", 'desc'=>array("wezwanie + 14", "wezwanie + 14 dni"));
-		$filter_arr['waiting-krd'] = array("min. 30 dni od ostatecznego wezwania");
-		$filter_arr['krd'] = array("do przekazania do KRD", 'desc'=>array("wezwanie ost. + 60", "wezwanie ost. + 60 dni"));
-		$filter_arr['waiting-sad'] = array("przekazano do KRD");
-		$filter_arr['docs-in-sad'] = array("przekazać sprawę do sądu");// waiting-sad = 30 dni
-		$filter_arr['sad'] = array("przekazano sprawę do sądu");
-		$filter_arr['3 m-ce przed'] = array("3 m-ce przed przedawnieniem");// 3 m-ce przed przedawnieniem
-		$filter_arr['po-terminie'] = array("po terminie");// 3 lata po dacie platnosci faktur
-		$filter_arr['has_nr_sad'] = array("nr sprawy sąd");
-		$filter_arr['has_nr_komornik'] = array("nr sprawy komornik");
-		$filter_arr['has_ustalenia'] = array("ustalenia z klientem");
-		$filter_arr['sad_and_komornik'] = array("sąd z komornik");
-		$filter_arr['sad_bez_komornik'] = array("sąd bez komornik");
-		$filter_arr['isMovedToVectra'] = array("przeniesieni do Vectra");
-		return $filter_arr;
-	}
-
-	public static function get_by_user(&$user) {
-		$db = DB::getDB();
-		$sql = "select * from `USERS2_WINDYKACJA_STATUS` as w where w.`ID_BILLING_USERS`='{$user->ID}' ";
-		$res = $db->query($sql);
-		$ret = $db->fetch($res);
-		return $ret;
-	}
-
-	/**
-	 * Auto update user stats.
-	 * 
-	 * @returns boolean - status changed or not
-	 * @param $user - object return from function WindykacjaStatsModel::get_user_by_id
-	 * @param $billing_docs - user billing docs
-	 * 
-	 * @used in task_update_stats - for all users
-	 * @used in WindykacjaView::user_historia_platnosci after view billing docs
-	 * 
-	 * save HIST at status change to WAITING
-	 */
-	public static function update_stats(&$user, &$billing_docs) {
-		$data_arr = array();
-		if (!V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)) {
-			if ($user->A_STATUS_UPDATE_DATE >= date("Y-m-d")) {
-				return;
-			}
-		}
-		self::updateUserKoresp($user);
-
-		$saldo = $billing_docs->get_saldo();
-		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = "stat-update";
-
-		$company = WindykacjaStatsModel::get_company($user);
-		$nr_konta = FunkcjeL1::bankowy_make_nrach($company->NR_RACH_MASS_PAY, $user->ID_BILLING_USERS, 0);
-		$data_arr["ACCOUNT_NUMBER"] = $nr_konta;
-		$data_arr["SERVICES_STREETS"] = WindykacjaStatsModel::getAllServicesStreetsCSV($user);
-		// set default values
-		//$data_arr["A_STATUS"] = "WAITING";
-		//$data_arr["PAY_FVAT"] = 0;
-		//$data_arr["PAY_DATE"] = "0000-00-00";
-		// update values
-		{// LAST_PAY_DATE
-			$lastPayDoc = $billing_docs->get_last_pay_doc();
-			if ($lastPayDoc) {
-				$data_arr["LAST_PAY_DATE"] = $lastPayDoc->get('BILL_DATE');
-				$data_arr["LAST_PAY_VALUE"] = $lastPayDoc->get('MA');
-				if(V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)){echo'<pre>lastPayDoc: ';print_r($lastPayDoc);echo'</pre>';}
-			}
-		}
-		$data_arr["PAY_SALDO"] = $saldo;
-		$data_arr["PAY_SALDO_30_DNI"] = $billing_docs->get_saldo_30_dni();
-		$data_arr["PAY_SALDO_ISSUED"] = $billing_docs->get_saldo_issued();
-		$data_arr["PAY_FVAT"] = 0;
-		$data_arr["PAY_DATE_FIRST_FVAT"] = '0000-00-00';
-		$lastFvatDoc = $billing_docs->get_last_fvat_doc();
-		if(V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)){echo'<pre>lastFvatDoc: ';print_r($lastFvatDoc);echo'</pre>';}
-		if ($lastFvatDoc) {
-			$data_arr["LAST_FVAT_PAY_TERM"] = $lastFvatDoc->get('PAYMENT_TERM');
-			$data_arr["LAST_FVAT_SELL_DATE"] = $lastFvatDoc->get('SELL_DATE');
-			$data_arr["LAST_FVAT_VALUE"] = $lastFvatDoc->get('WINIEN');
-		}
-		if ($saldo <= -0.05) {
-			$fvat_arr = $billing_docs->get_unpaid_fvat();
-			$data_arr["PAY_FVAT"] = count($fvat_arr);
-			if (count($fvat_arr) > 0) {
-				foreach ($fvat_arr as $v_fvat) {
-					if (!isset($data_arr["PAY_DATE"]) || $v_fvat['PAYMENT_TERM'] > $data_arr["PAY_DATE"]) {
-						$data_arr["PAY_DATE"] = $v_fvat['PAYMENT_TERM'];
-					}
-					if ('0000-00-00' == $data_arr["PAY_DATE_FIRST_FVAT"] || $v_fvat['PAYMENT_TERM'] < $data_arr["PAY_DATE_FIRST_FVAT"]) {
-						$data_arr["PAY_DATE_FIRST_FVAT"] = $v_fvat['PAYMENT_TERM'];
-					}
-				}
-			}
-		}
-
-		// zmiana statusu na kolejny wg. salda
-		switch ($user->A_STATUS) {
-			case 'WAITING':// auto
-				if ($user->wezwanie1_DATE == '0000-00-00') {
-					if ($saldo <= -0.05) {
-						$fvat_arr = $billing_docs->get_unpaid_fvat();
-						if (count($fvat_arr) > 1) {
-							$data_arr["A_STATUS"] = "wezwanie1";
-						}
-					}
-				}
-				else if ($user->wezwanie2_DATE == '0000-00-00') {
-					$data_arr["A_STATUS"] = "waiting-wezwanie2";
-				}
-				else {
-					$data_arr["A_STATUS"] = "wezwanie2";
-				}
-				break;
-
-			case 'wezwanie1':// wymaga `PAY_TERM`, `wezwanie1_DATE`, `ID_KORESP`
-				break;
-
-			case 'waiting-wezwanie2':// auto -> wezwanie2
-				if ($user->wezwanie2_DATE == '0000-00-00') {
-					$payTermArr = explode('-', $user->PAY_TERM);// Y-m-d
-					$payTermPlus7dni = date("Y-m-d", mktime(0,0,0, intval($payTermArr[1]), intval($payTermArr[2]) + 7, intval($payTermArr[0])));
-					// TODO: data +7 dni od terminu płatności (PAY_TERM) / mktime ($user->PAY_TERM + 7 dni)
-					if ($user->PAY_TERM != '0000-00-00' && $payTermPlus7dni < date('Y-m-d')) {
-						$data_arr["A_STATUS"] = "wezwanie2";
-					}
-				}
-				break;
-
-			case 'wezwanie2':// wymaga `PAY_TERM`, `wezwanie2_DATE`, `ID_KORESP`
-				break;
-
-			case 'waiting-krd':// auto -> krd jesli minelo 30 dni od wystawienia wezwanie2
-				if ($user->wezwanie2_DATE != '0000-00-00') {
-					$wzw2 = new stdClass();
-					$wzw2->Y = intval(substr($user->wezwanie2_DATE, 0, 4));
-					$wzw2->m = intval(substr($user->wezwanie2_DATE, 5, 2));
-					$wzw2->d = intval(substr($user->wezwanie2_DATE, 8, 2));
-					$wzw2->plus_30 = date("Y-m-d", mktime(0,0,0, $wzw2->m, $wzw2->d + 30, $wzw2->Y));
-					if ($wzw2->plus_30 < date("Y-m-d")) {
-						$data_arr["A_STATUS"] = "krd";
-					}
-				}
-				break;
-
-			case 'waiting-sad':// auto -> sad jesli minelo 30 dni od wpisania do krd (wpis_w_krd_DATE)
-				if ($user->wpis_w_krd_DATE != '0000-00-00') {
-					$krdDate = new stdClass();
-					$krdDate->Y = intval(substr($user->wpis_w_krd_DATE, 0, 4));
-					$krdDate->m = intval(substr($user->wpis_w_krd_DATE, 5, 2));
-					$krdDate->d = intval(substr($user->wpis_w_krd_DATE, 8, 2));
-					$krdDate->plus_30 = date("Y-m-d", mktime(0,0,0, $krdDate->m, $krdDate->d + 30, $krdDate->Y));
-					if ($krdDate->plus_30 < date("Y-m-d")) {
-						$data_arr["A_STATUS"] = "docs-in-sad";
-					}
-				}
-				break;
-
-			default:
-				
-		}
-
-		// zmiana statusu na czysty - WAITING
-		if ($saldo > -0.05 || $data_arr["PAY_FVAT"] < 2) {
-			if (!in_array($user->A_STATUS, array('waiting-sad', 'docs-in-sad', 'sad'))) {
-				$data_arr["A_STATUS"] = "WAITING";
-				$data_arr["wezwanie2_DATE"] = '0000-00-00';
-				$data_arr["wezwanie1_DATE"] = '0000-00-00';
-				//$data_arr["PAY_DATE"] = '0000-00-00';// TODO: ?
-			}
-		}
-
-		{
-			$hasActiveNET = 0;
-			$hasActiveTV = 0;
-			$isMovedToVectra = 0;
-			$db = DB::getDB();
-			$idUser = $user->ID;
-			$sql = "
-				select
-					IF(1 = (
-							select 1 as hasActiveNET
-							from `SERVICES` srv
-							where srv.`ID_BILLING_USERS`='{$idUser}'
-								and srv.`NAME_LIST_SERVICES`='USERS2'
-								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
-							limit 1
-						), 1, 0) as hasActiveNET
-					,
-					IF(1 = (
-							select 1 as hasActiveTV
-							from `SERVICES` srv
-							where srv.`ID_BILLING_USERS`='{$idUser}'
-								and srv.`NAME_LIST_SERVICES`='TV'
-								and 'NORMAL'=A_STATUS_L2_SQL_L1(srv.`ID`)
-							limit 1
-						), 1, 0) as hasActiveTV
-					,
-					IF(1 = ('REZYGNACJA_Z_PRZEJSCIEM_DO_VECTRA'=(select `RODZAJ_DZIALANIA_HANDLOWEGO`
-						from `DEALS_TABLE`
-						where `A_STATUS`='NORMAL'
-							and `ID_BILLING_USERS`='{$user->ID}'
-						order by `ID` DESC
-						limit 1)
-						), 1, 0) as IS_MOVED_TO_VECTRA
-			";
-			DBG::_('DBG_ACTIVE_SRV', '>2', "DBG_ACTIVE_SRV sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
-			$res = $db->query($sql);
-			if ($r = $db->fetch($res)) {
-				DBG::_('DBG_ACTIVE_SRV', '>2', "r", $r, __CLASS__, __FUNCTION__, __LINE__);
-				$hasActiveNET = V::get('hasActiveNET', '', $r);
-				$hasActiveTV  = V::get('hasActiveTV', '', $r);
-				$isMovedToVectra = V::get('IS_MOVED_TO_VECTRA', '', $r);
-			}
-			$data_arr['HAS_ACTIVE_NET'] = $hasActiveNET;
-			$data_arr['HAS_ACTIVE_TV']  = $hasActiveTV;
-			$data_arr['IS_MOVED_TO_VECTRA'] = $isMovedToVectra;
-			DBG::_('DBG_ACTIVE_SRV', '>2', "data_arr", $data_arr, __CLASS__, __FUNCTION__, __LINE__);
-		}
-		if(V::get('DBG_LAST_FVAT_PAY_TERM', '', $_GET)){echo'<pre>data_arr #' . __LINE__ . ': ';print_r($data_arr);echo'</pre>';}
-
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$db = DB::getDB();
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
-		$db->query($sql);
-
-		// update HIST - tylko zmiana na WAITING - powrót do oczekujących
-		if (isset($data_arr["A_STATUS"]) && $data_arr["A_STATUS"] == "WAITING" && $user->A_STATUS != "WAITING") {
-			$sql_arr = array();
-			foreach ($data_arr as $k => $v) {
-				$sql_arr["`{$k}`"] = "'{$v}'";
-			}
-			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-			$db->query($sql);
-		}
-	}
-
-	public static function updateUserKoresp($user) {
-		//echo'<pre>TODO: updateUserKoresp: ';print_r($user);echo'</pre>';
-		$sql = <<<SQL
-			insert into `USERS2_WINDYKACJA_STATUS_HIST` (
-					`A_RECORD_UPDATE_DATE`
-					, `A_RECORD_UPDATE_AUTHOR`
-					, `ID_USERS2`
-					, `ID_KORESP`
-					, `A_STATUS_UPDATE_DATE`
-				)
-				select
-					NOW() as `A_RECORD_UPDATE_DATE`
-					, 'auto-update-koresp-hist' as `A_RECORD_UPDATE_AUTHOR`
-					, w.`ID` as `ID_USERS2`
-					, k.`ID` as `ID_KORESP`
-					, k.`K_DATA_OTRZYM_KORESP` as `A_STATUS_UPDATE_DATE`
-				from `USERS2_WINDYKACJA_STATUS` w
-					join `IN7_DZIENNIK_KORESP` k on (k.`ID_BILLING_USERS`=w.`ID_BILLING_USERS`)
-					left join `USERS2_WINDYKACJA_STATUS_HIST` h on (h.`ID_USERS2`=w.`ID` and h.`ID_KORESP`=k.`ID`)
-				where 1=1
-					and h.ID is null
-					and w.`ID_BILLING_USERS`={$user->ID_BILLING_USERS}
-SQL;
-		$db = DB::getDB();
-		$db->query($sql);
-		//echo'<pre>TODO: updateUserKoresp: last insert_id: ';print_r($db->insert_id());echo'</pre>';
-	}
-
-	public static function &get_phone_status_array(&$user) {
-		$ret = array();
-		$status_info = self::get_phone_status_info($user);
-		foreach ($status_info as $k => $v) {
-			$ret[$k] = $v['label'];
-		}
-		return $ret;
-	}
-
-	/**
-	 * @param $user
-	 * 
-	 * @returns array of 'label', 'date' -> nowy PAY_TERM ustalony wg. aktualnego stanu
-	 */
-	public static function get_phone_status_info($user) {
-		$ret = array();
-		$ret['nie_zaplaci'] = array('label'=>"nie zapłaci", 'date'=>'');
-		$today = date("Y-m-d");
-		$date = date("Y-m-d");
-		{// PAY_TERM jesli jest ustalony np. z wewaznie1 lub wezwanie2
-			if ($user->PAY_TERM != '0000-00-00') {
-				if ($user->PAY_TERM > $today) {
-					// jest już ustalona data platnosci na przyszłość
-					$date = $user->PAY_TERM;
-				}
-			}
-		}
-
-		if ($date > $today) {// data platnosci w przyszlosci -> ok
-			{// zapłaci w terminie today +14 dni lub PAY_TERM jesli jest ustalony np. z wewaznie1 lub wezwanie2
-				$ret['zaplaci_w_terminie'] = array('label'=>"zapłaci w terminie", 'date'=>$date);
-			}
-		}
-		else {// data platnosci w przeszlosci - przeterminowana -> ustalic nowa (+14,+1mc,+2mc,+3mc)
-			{// zapłaci w terminie today +14 dni lub PAY_TERM jesli jest ustalony np. z wewaznie1 lub wezwanie2
-				$date = date("Y-m-d", mktime(0,0,0,date('m'), date('d') + 14, date('Y')));
-				$ret['zaplaci_w_terminie'] = array('label'=>"zapłaci w terminie", 'date'=>$date);
-			}
-			{// zaplaci za 1-mc pozniej
-				$date = date("Y-m-d", mktime(0,0,0,date('m') + 1, date('d'), date('Y')));
-				$ret['zaplaci_za_1mc'] = array('label'=>"zapłaci miesiąc później", 'date'=>$date);
-			}
-			{// zaplaci za 2-mce pozniej
-				$date = date("Y-m-d", mktime(0,0,0,date('m') + 2, date('d'), date('Y')));
-				$ret['zaplaci_za_2mc'] = array('label'=>"zapłaci 2 miesiące później", 'date'=>$date);
-			}
-			{// zaplaci za 3-mce pozniej
-				$date = date("Y-m-d", mktime(0,0,0,date('m') + 3, date('d'), date('Y')));
-				$ret['zaplaci_za_3mc'] = array('label'=>"zapłaci 3 miesiące później", 'date'=>$date);
-			}
-		}
-
-		$ret['nie_odbiera'] = array('label'=>"nie obiera lub wyłączony telefon", 'date'=>'');
-		$ret['zly_numer'] = array('label'=>"zły numer telefonu", 'date'=>'');
-		return $ret;
-	}
-
-	public static function get_sms_status_info($user, $terminPlatnosci = '') {
-		$ret = array();
-		$today = date("Y-m-d");
-		$due_date = $user->PAY_TERM;// ustalowny pay term
-		$zaleglosc = number_format($user->PAY_SALDO, 2, ',', '');
-		if ($user->PAY_SALDO <= -0.05) {
-			$msg = "Twoje saldo na dzien {$today} wynosi {$zaleglosc} zl.\n";
-			if (strlen($terminPlatnosci) == 10 && $terminPlatnosci > date("Y-m-d")) {
-				$msg .= "Prosimy o uregulowanie w/w zaleglosci w terminie do {$terminPlatnosci}.";
-			} else {
-				$msg .= "Prosimy o niezwloczne uregulowanie zaleglosci.";
-			}
-			if ($due_date > $today) {
-			//	$msg .= "Prosimy o uregulowanie zaleglosci do dnia {$due_date} r.";
-			} else {
-			}
-			$ret['Powiadomienie SMS o zaleglosciach'] = array('label'=>"Windykacja: Powiadomienie SMS o zaleglosciach", 'msg'=>$msg);
-			// Z powodu niedotrzymania terminu płatności nastąpi blokada usług. Dowód wpłaty w kwocie #Saldo# zł prosimy przesłać na  bok@biall.net.pl. Szczegóły 587277777.
-			$doZaplaty = number_format(-1 * $user->PAY_SALDO, 2, ',', '');
-			$msgBlokada = "Z powodu niedotrzymania terminu platnosci nastapi blokada uslug. Dowod wplaty w kwocie {$doZaplaty} zl prosimy przeslac na bok@biall.net.pl. Szczegoly 587277777.";
-			$ret['Powiadomienie SMS o blokadzie'] = array('label'=>"Windykacja: Powiadomienie SMS o blokadzie", 'msg'=>$msgBlokada);
-		}
-		return $ret;
-	}
-
-	/*
-<html><body>Informujemy Pana/Pania o zalegosci w platnosciach w wysokosci 109.16 zl. Prosimy o uregulowanie w/w zaleglosci w terminie do 31.03.2015 r.<br>W przypadku watpliwosci prosimy o kontakt z Biurem Obslugi Klienta. <p>BIALL-NET Sp. z o.o. <br><br>Biuro Obslugi Klienta:<br>tel. 58 741 84 10<br>fax 58 741 84 30</body></html>
-	*/
-	public static function get_mail_status_info($user, $terminPlatnosci = '') {
-		$ret = array();
-		$today = date("Y-m-d");
-		$due_date = $user->PAY_TERM;// ustalowny pay term
-		$zaleglosc = number_format(abs($user->PAY_SALDO), 2, ',', '');
-		if ($user->PAY_SALDO <= -0.05) {
-			$msg = "Informujemy Pana/Pania o zalegosci w platnosciach w wysokosci {$zaleglosc} zl.\n";
-			if (strlen($terminPlatnosci) == 10 && $terminPlatnosci > date("Y-m-d")) {
-				$msg .= "Prosimy o uregulowanie w/w zaleglosci w terminie do {$terminPlatnosci}.";
-			} else {
-				$msg .= "Prosimy o niezwloczne uregulowanie zaleglosci.";
-			}
-			$msg .= "<br>W przypadku watpliwosci prosimy o kontakt z Biurem Obslugi Klienta.";
-			$msg .= "<p>BIALL-NET Sp. z o.o.</p>";
-			if ($due_date > $today) {
-			//	$msg .= "Prosimy o uregulowanie zaleglosci do dnia {$due_date} r.";
-			} else {
-			}
-			$ret['Powiadomienie o zaleglosciach'] = array('label'=>"Windykacja: Powiadomienie o zaleglosciach", 'msg'=>$msg);
-		}
-		return $ret;
-	}
-
-	/**
-	 * Update user phone status.
-	 * 
-	 * @returns boolean - status changed or not
-	 * @param $user - object return from function WindykacjaStatsModel::get_user_by_id
-	 * @param $phone_status - phone status
-	 * 
-	 */
-	public static function update_phone_status($user, $phone_status) {
-		$data_arr = array();
-
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["LAST_PHONE_STATUS"] = $phone_status;
-		$data_arr["LAST_PHONE_STATUS_DATE"] = date("Y-m-d");
-		$status_info = self::get_phone_status_info($user);
-		if (array_key_exists($phone_status, $status_info)) {
-			$date = V::get('date', '', $status_info[$phone_status]);
-			if ($date != '' && $date != '0000-00-00') {
-				$data_arr["PAY_TERM"] = $date;
-			}
-		}
-
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
-		DB::query($sql);
-
-		// update HIST
-		//if (DB::affected()) {
-			$sql_arr = array();
-			foreach ($data_arr as $k => $v) {
-				$sql_arr["`{$k}`"] = "'{$v}'";
-			}
-			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-			DB::query($sql);
-		//}
-		return true;
-	}
-
-	public static function update_sms_status($user, $sms_status) {
-		$data_arr = array();
-		$status_info = self::get_sms_status_info($user);
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$sms_status ';print_r($sms_status);echo'</pre>';
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$status_info ';print_r($status_info);echo'</pre>';
-
-		if (!array_key_exists($sms_status, $status_info)) {
-			echo '<div class="alert alert-danger">Nieznany status!</div>';
-			return false;
-		}
-		$db_webone = DB::getDB('931');
-		if (!$db_webone) {
-			echo '<div class="alert alert-danger">Brak połączenia do bazy billing!</div>';
-			return false;
-		}
-		$sqlArr = array();
-		$sqlArr["`ID_BILLING_USERS`"] = $user->ID;
-		$sqlArr["`SUBJECT`"] = "'{$status_info[$sms_status]['label']}'";
-		$sqlArr["`BODY_HTML`"] = "'{$status_info[$sms_status]['msg']}'";
-		$sqlArr["`REQUEST_STATUS_SMS`"] = "'SENT_SMS'";
-		$sql = "insert into `HIST_CONTACTS` (" . implode(",", array_keys($sqlArr)) . ")
-																 values (" . implode(",", array_values($sqlArr)) . ");";
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">sql ';print_r($sql);echo'</pre>';
-		//echo'TODO: TEST...';return true;
-		$db_webone->query($sql);
-		$msgId = $db_webone->insert_id();
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$msgId ';print_r($msgId);echo'</pre>';
-
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["LAST_SMS_MSG_ID"] = $msgId;
-		$data_arr["LAST_SMS_STATUS"] = $sms_status;
-		$data_arr["LAST_PHONE_STATUS_DATE"] = date("Y-m-d");
-		if (array_key_exists($sms_status, $status_info)) {
-			$date = V::get('date', '', $status_info[$sms_status]);
-			if ($date != '' && $date != '0000-00-00') {
-				$data_arr["PAY_TERM"] = $date;
-			}
-		}
-
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
-		DB::query($sql);
-
-		// update HIST
-		//if (DB::affected()) {
-			$sql_arr = array();
-			foreach ($data_arr as $k => $v) {
-				$sql_arr["`{$k}`"] = "'{$v}'";
-			}
-			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-			DB::query($sql);
-		//}
-		return true;
-	}
-
-	public static function update_mail_status($user, $mail_status) {
-		$data_arr = array();
-		$status_info = self::get_mail_status_info($user);
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$mail_status ';print_r($mail_status);echo'</pre>';
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$status_info ';print_r($status_info);echo'</pre>';
-
-		if (!array_key_exists($mail_status, $status_info)) {
-			echo '<div class="alert alert-danger">Nieznany status!</div>';
-			return false;
-		}
-		$db_webone = DB::getDB('931');
-		if (!$db_webone) {
-			echo '<div class="alert alert-danger">Brak połączenia do bazy billing!</div>';
-			return false;
-		}
-		$sqlArr = array();
-		$sqlArr["`ID_BILLING_USERS`"] = $user->ID;
-		$sqlArr["`SUBJECT`"] = "'{$status_info[$mail_status]['label']}'";
-		$sqlArr["`BODY_HTML`"] = "'<html><body>{$status_info[$mail_status]['msg']}</body></html>'";
-		$sqlArr["`REQUEST_STATUS_MAIL`"] = "'CONFIRM_SENT_MAIL'";
-		$sql = "insert into `HIST_CONTACTS` (" . implode(",", array_keys($sqlArr)) . ")
-																 values (" . implode(",", array_values($sqlArr)) . ");";
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">sql ';print_r($sql);echo'</pre>';
-		//echo'TODO: TEST...';return true;
-		$db_webone->query($sql);
-		$msgId = $db_webone->insert_id();
-		echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">$msgId ';print_r($msgId);echo'</pre>';
-
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["LAST_MAIL_MSG_ID"] = $msgId;
-		$data_arr["LAST_MAIL_STATUS"] = $mail_status;
-		$data_arr["LAST_PHONE_STATUS_DATE"] = date("Y-m-d");
-		if (array_key_exists($mail_status, $status_info)) {
-			$date = V::get('date', '', $status_info[$mail_status]);
-			if ($date != '' && $date != '0000-00-00') {
-				$data_arr["PAY_TERM"] = $date;
-			}
-		}
-
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ; ";
-		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
-		DB::query($sql);
-
-		// update HIST
-		//if (DB::affected()) {
-			$sql_arr = array();
-			foreach ($data_arr as $k => $v) {
-				$sql_arr["`{$k}`"] = "'{$v}'";
-			}
-			$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-			$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-			DB::query($sql);
-		//}
-		return true;
-	}
-
-	public static function update_old_id_koresp(&$user, $id_koresp, $koresp_type) {
-		$db = DB::getDB();
-		$koresp = DB::get_by_id('IN7_DZIENNIK_KORESP', $id_koresp);
-		if (!$koresp) {
-			return false;
-		}
-
-		// check if ID koresp already exists in HIST table!
-		$sql = "select wh.`ID`,wh.``,wh.`` from `USERS2_WINDYKACJA_STATUS_HIST` as wh where ";
-
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["ID_USERS2"] = $user->WINDYKACJA_ID;
-		$data_arr["ID_KORESP"] = $id_koresp;
-		//$data_arr["A_STATUS_UPDATE_DATE"] = $koresp->K_DATA_OTRZYMANEJ_KORESP;// data utworzenia
-		$data_arr["A_STATUS_UPDATE_DATE"] = $koresp->K_DATA_OTRZYM_KORESP;// data wyslania
-		// $koresp_type ?
-
-		// update HIST
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr["`{$k}`"] = "'{$v}'";
-		}
-		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-		$db->query($sql);
-		return true;
-	}
-
-	/**
-	 * @returns int - ID Koresp or null if error
-	 */
-	public static function update_bok_rozwiazanie_umowy(&$user, $id_proj, $nr_umowy, $powod, $powod_desc, $termin_odlaczenia, &$msg_log) {
-		$data_arr = array();
-		if ($id_proj > 0 && $nr_umowy > 0 && $powod != '') {
-			$new_id_deals = WindykacjaStatsModel::create_deals_rozwiazanie($user->ID, $nr_umowy, $termin_odlaczenia, $powod_desc);
-			if (!$new_id_deals) {
-				$msg_log[] = "Nie udało się utworzyć rekordu w DEALS_TABLE";
-				return null;
-			}
-			$msg_log[] = "Utworzonno rekord w DEALS_TABLE ID={$new_id_deals}";
-
-			$new_id_koresp = WindykacjaStatsModel::create_koresp($user, 'rozwiazanie umowy', $id_proj, array('nr_umowy'=>$nr_umowy, 'powod'=>$powod, 'powod_desc'=>$powod_desc));
-			if (!$new_id_koresp) {
-				$msg_log[] = "Nie udało się utworzyć rekordu KORESP";
-				return null;
-			}
-			$msg_log[] = "Utworzonno rekord KORESP ID={$new_id_koresp}";
-			$data_arr["ID_KORESP"] = $new_id_koresp;
-		} else {
-			return null;
-		}
-		$data_arr["params"] = "rozwiazanie umowy,{$nr_umowy},{$powod},{$termin_odlaczenia},{$new_id_deals}";
-		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");// zawsze podana jesli jest zmiana A_STATUS
-
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ";
-		DB::query($sql);
-
-		//if (DB::affected()) {
-		// update $user data
-		foreach ($data_arr as $k => $v) {
-			$user->$k = $v;
-		}
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr["`{$k}`"] = "'{$v}'";
-		}
-		$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-		DB::query($sql);
-		//}
-		return $new_id_koresp;
-	}
-
-	public static function update_users_table() {
-		if (!isset($_SESSION['USERS2_WINDYKACJA_PANEL'])) $_SESSION['USERS2_WINDYKACJA_PANEL'] = array();
-		$_SESSION['USERS2_WINDYKACJA_PANEL']['_initialized'] = 0;// always actualize
-		if (0 == V::get('_initialized', 0, $_SESSION['USERS2_WINDYKACJA_PANEL'], 'int')) {
-			$sql = "insert ignore into `USERS2_WINDYKACJA_STATUS` (`ID_BILLING_USERS`, `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
-				select `id_users`, '" . date("Y-m-d-H:i") . "', 'sync-users' from `BILLING_USERS_ADD`
-			";
-			$res = DB::query($sql);
-
-			$_SESSION['USERS2_WINDYKACJA_PANEL']['_initialized'] = 1;
-		}
-	}
-
-	public static function _to_update_where() {
-		$sql_where = "";
-		$sql_where_and_arr = array();
-		//$sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
-		$sql_where_and_arr[] = "w.`A_STATUS_UPDATE_DATE`<CURDATE()";
-		$sql_where = implode(" and ", $sql_where_and_arr);
-		return $sql_where;
-	}
-
-	public static function get_to_update_total() {
-		$ret = array();
-		$sql_where = self::_to_update_where();
-		$db = DB::getDB();
-		$sql = "select count(1) as cnt
-			from `USERS2_WINDYKACJA_STATUS` as w
-			where {$sql_where}
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret = $r->cnt;
-		}
-		return $ret;
-	}
-
-	public static function get_to_update_list($limit) {
-		$ret = array();
-		$db = DB::getDB();
-		$sql_where = self::_to_update_where();
-		$sql_limit = ($limit > 0)? "limit {$limit}" : "";
-		$sql = "select w.*
-			from `USERS2_WINDYKACJA_STATUS` as w
-			where {$sql_where}
-			order by ID desc
-			{$sql_limit}
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[] = $r;
-		}
-		return $ret;
-	}
-
-	/**
-	 * @returns boolean - status changed or not
-	 * @param $user - object return from function WindykacjaStatsModel::get_user_by_id
-	 * @param $data - array of new user data
-	 *   1. wysłanie 1 wezwania do zapłaty ($user->A_STATUS='wezwanie1'; `PAY_TERM`, `wezwanie1_DATE`, `ID_PROJ`)
-	 *   2. wysłanie 2 wezwania do zapłaty ($user->A_STATUS='wezwanie2'; `PAY_TERM`, `wezwanie2_DATE`, `ID_KORESP`)
-	 *   3. klient spłacił wszystkie zobowiązania (`PAY_SALDO` >= -0.05)
-	 * TODO: 4. bledny adres klienta - ponowne wyslanie wezwania - niezaleznie od statusu?
-	 * 
-	 * if $user->A_STATUS == 'wezwanie1' @param $data:
-	 *   $data['wezwanie1_DATE'] - user data
-	 *   $data['PAY_TERM'] - user data
-	 *   $data['ID_PROJ'] - do WindykacjaStatsModel::create_koresp
-	 */
-	public static function update_user($user, $data) {
-		if (empty($data)) {
-			return $user;
-		}
-		$data_arr = array();
-		// set up status by current status and $data
-		switch ($user->A_STATUS) {
-			case 'WAITING':// auto
-				break;
-
-			case 'wezwanie1':// wymaga `PAY_TERM`, `wezwanie1_DATE`, `ID_KORESP` - wysłanie wezwanie1 (z podaniem ID_KORESP, i PAY_TERM=NOW()+14dni)
-				// TODO: ID_KORESP z utworzonego rekordu KORESP (wymaga ID_PROJ)
-				if ("" != V::get('wezwanie1_DATE' ,'', $data) && "" != V::get('PAY_TERM' ,'', $data) && V::get('ID_PROJ' ,'', $data, 'int') > 0) {
-					$new_id_koresp = WindykacjaStatsModel::create_koresp($user, 'wezwanie1', V::get('ID_PROJ' ,'', $data, 'int'));
-					if (!$new_id_koresp) {
-						// TODO: revert changes - DB error
-						return $user;
-					}
-					$data_arr["ID_KORESP"] = $new_id_koresp;
-					$data_arr["LAST_ID_KORESP_WEZWANIE1"] = $new_id_koresp;
-					$data_arr["A_STATUS"] = "waiting-wezwanie2";
-					$data_arr["wezwanie1_DATE"] = V::get('wezwanie1_DATE' ,'', $data);
-					$data_arr["PAY_TERM"] = V::get('PAY_TERM' ,'', $data);
-					unset($data['ID_PROJ']);// TODO: RM after mv $data to $data_arr
-				}
-				break;
-
-			case 'waiting-wezwanie2':// auto
-				break;
-
-			case 'wezwanie2':// wymaga `PAY_TERM`, `wezwanie2_DATE`, `ID_KORESP` - wysłanie wezwanie2 (z podaniem ID_KORESP, i PAY_TERM=NOW()+14dni)
-				if ("" != V::get('wezwanie2_DATE' ,'', $data) && "" != V::get('PAY_TERM' ,'', $data) && V::get('ID_PROJ' ,'', $data, 'int') > 0) {
-					$new_id_koresp = WindykacjaStatsModel::create_koresp($user, 'wezwanie2', V::get('ID_PROJ' ,'', $data, 'int'));
-					if (!$new_id_koresp) {
-						// TODO: revert changes - DB error
-						return $user;
-					}
-					$data_arr["ID_KORESP"] = $new_id_koresp;
-					$data_arr["LAST_ID_KORESP_WEZWANIE2"] = $new_id_koresp;
-					$data_arr["A_STATUS"] = "waiting-krd";
-					$data_arr["wezwanie2_DATE"] = V::get('wezwanie2_DATE' ,'', $data);
-					$data_arr["PAY_TERM"] = V::get('PAY_TERM' ,'', $data);
-				}
-				break;
-
-			default:
-				
-		}
-
-		// if status not set, check id user saldo is ok
-		if (!isset($data_arr["A_STATUS"])) {
-			if (isset($data['PAY_SALDO']) && $data['PAY_SALDO'] >= -0.05) {
-				$data_arr["A_STATUS"] = "WAITING";
-			}
-		}
-
-		// error jesli nie ustalono statusu
-		if (!isset($data_arr["A_STATUS"])) {
-			return false;
-		}
-
-		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");// zawsze podana jesli jest zmiana A_STATUS
-
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ";
-		DB::query($sql);
-
-		//if (DB::affected()) {
-		// update $user data
-		foreach ($data_arr as $k => $v) {
-			$user->$k = $v;
-		}
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr["`{$k}`"] = "'{$v}'";
-		}
-		$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-		DB::query($sql);
-		//}
-		return true;
-	}
-
-	public static function bad_address_save($user, $id_koresp) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["BAD_ADDRESS"] = 1;
-		$data_arr["ID_KORESP"] = $id_koresp;
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function bad_address_confirm($user, $id_koresp) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["BAD_ADDRESS"] = 0;
-		$data_arr["ID_KORESP"] = $id_koresp;
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function _sql_update($user, $data_arr) {
-		// update values
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr[] = "`{$k}`='{$v}'";
-		}
-		$sql = "update `USERS2_WINDYKACJA_STATUS` set " . implode(",", $sql_arr) . " where `ID`='{$user->WINDYKACJA_ID}' limit 1 ";
-		DB::query($sql);
-		// update $user data
-		foreach ($data_arr as $k => $v) {
-			$user->$k = $v;
-		}
-		$sql_arr = array();
-		foreach ($data_arr as $k => $v) {
-			$sql_arr["`{$k}`"] = "'{$v}'";
-		}
-		$sql_arr["`ID_USERS2`"] = "'{$user->WINDYKACJA_ID}'";
-		$sql = "insert into `USERS2_WINDYKACJA_STATUS_HIST`(" . implode(",", array_keys($sql_arr)) . ") values(" . implode(",", array_values($sql_arr)) . ");";
-		DB::query($sql);
-		return true;
-	}
-
-	public static function change_status_save($user, $new_status) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["A_STATUS_UPDATE_DATE"] = date("Y-m-d");
-		$data_arr["A_STATUS"] = $new_status;
-		if ($user->A_STATUS == 'krd' && $new_status == 'waiting-sad') {
-			$data_arr["wpis_w_krd_DATE"] = date('Y-m-d');
-		}
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function nr_sprawy_krd_save($user, $nr_sprawy_krd) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["NR_SPRAWY_KRD"] = $nr_sprawy_krd;
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function nr_sprawy_sad_save($user, $nr_sprawy_sad) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["NR_SPRAWY_SAD"] = $nr_sprawy_sad;
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function nr_sprawy_komornik_save($user, $nr_sprawy_komornik) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["NR_SPRAWY_KOMORNIK"] = $nr_sprawy_komornik;
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function ustalenia_info_save($user, $ustalenia_date, $ustalenia_info) {
-		$data_arr = array();
-		$data_arr["A_RECORD_UPDATE_DATE"] = date("Y-m-d-H:i");
-		$data_arr["A_RECORD_UPDATE_AUTHOR"] = $_SESSION['ADM_ACCOUNT'];
-		$data_arr["L_APPOITMENT_DATE"] = $ustalenia_date;
-		$data_arr["L_APPOITMENT_INFO"] = $ustalenia_info;
-		$data_arr["L_APPOITMENT_USER"] = $_SESSION['ADM_ACCOUNT'];
-
-		if (empty($ustalenia_info) && (empty($ustalenia_date) || $ustalenia_date == '0000-00-00')) {
-			$data_arr["L_APPOITMENT_USER"] = '';
-		}
-		return self::_sql_update($user, $data_arr);
-	}
-
-	public static function get_user_hist_events(&$user) {
-		$db = DB::getDB();
-		$ret = array();
-		$sql = "select wh.*
-			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
-			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[] = $r;
-		}
-		return $ret;
-	}
-
-	public static function get_user_hist_status_events(&$user) {
-		$db = DB::getDB();
-		$ret = array();
-		$sql = "select wh.*, kor.`K_ZAWARTOS`
-			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
-				left join `IN7_DZIENNIK_KORESP` as kor on(wh.`ID_KORESP`!='N/S;' and kor.`ID`=wh.`ID_KORESP`)
-			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
-				and wh.`A_STATUS_UPDATE_DATE`!='N/S;'
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[] = $r;
-		}
-		return $ret;
-	}
-
-	public static function get_user_hist_phone_events(&$user) {
-		$ret = array();
-		$db = DB::getDB();
-		$sql = "select wh.*
-			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
-			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
-				and wh.`LAST_PHONE_STATUS_DATE`!='N/S;'
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[] = $r;
-		}
-		return $ret;
-	}
-
-	public static function get_user_bad_address_events(&$user) {
-		$ret = array();
-		$db = DB::getDB();
-		$sql = "select wh.*
-			from `USERS2_WINDYKACJA_STATUS_HIST` as wh
-			where wh.`ID_USERS2`='{$user->WINDYKACJA_ID}'
-				and wh.`BAD_ADDRESS`!='N/S;'
-			order by wh.`ID` ASC
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[] = $r;
-		}
-		return $ret;
-	}
-
-	public static function get_status_count() {
-		$sql_where_and_arr = array();
-		$usrAclGroups = User::getLdapGroupsNames();
-		$usrAclGroups[] = '';
-		$sqlUsrAclGroups = "'" . implode("','", $usrAclGroups) . "'";
-		$sql_where_and_arr[] = "a.`A_ADM_COMPANY` in({$sqlUsrAclGroups})";
-		$sql_where_and_arr[] = "a.`A_CLASSIFIED` in({$sqlUsrAclGroups})";
-		$sqlWhereAdd = " and " . implode(" and ", $sql_where_and_arr);
-
-		$ret = array();
-		$db = DB::getDB();
-		$sql = " select w.`A_STATUS`, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where 1=1 {$sqlWhereAdd}
-			group by w.`A_STATUS` 
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[$r->A_STATUS] = $r;
-		}
-		// filter: 'po-terminie'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`PAY_SALDO`<=-0.05
-				and w.`PAY_DATE`!='0000-00-00'
-				and w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 36 MONTH)
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['po-terminie'] = $r;
-		}
-		// filter: '3 m-ce przed'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`PAY_SALDO`<=-0.05
-				and w.`PAY_DATE`!='0000-00-00'
-				and w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 33 MONTH)
-				and w.`PAY_DATE`>DATE_SUB(NOW(), INTERVAL 36 MONTH)
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['3 m-ce przed'] = $r;
-		}
-		// filter: 'tel1'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`PAY_SALDO`<=-0.05
-				and w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')
-				and ( w.`LAST_PHONE_STATUS_DATE`='0000-00-00'
-					or w.`LAST_PHONE_STATUS_DATE`<DATE_SUB(NOW(), INTERVAL 14 DAY) )
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['tel1'] = $r;
-		}
-		// filter: 'bad_address'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`<=-0.05, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`PAY_SALDO`<=-0.05
-				-- and w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')
-				and w.`BAD_ADDRESS`>0
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['bad_address'] = $r;
-		}
-		// filter: 'stan_zero', '10-ego'
-		$stanZeroLimit = -0.05;
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`>{$stanZeroLimit}, 1, 0)) as cnt_stan_zero
-				, sum(IF(w.`PAY_SALDO`<={$stanZeroLimit}, 1, 0)) as cnt_stan_minus
-				, sum(IF(w.`PAY_SALDO`<={$stanZeroLimit}, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`A_STATUS`='WAITING'
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['stan_zero'] = (object)array('A_STATUS'=>'stan_zero', 'cnt'=>$r->cnt_stan_zero, 'suma_zaleglosci'=>0);
-			$ret['10-ego'] = (object)array('A_STATUS'=>'10-ego', 'cnt'=>$r->cnt_stan_minus, 'suma_zaleglosci'=>$r->suma_zaleglosci);
-		}
-		// filter: 'has_nr_sad', 'has_nr_komornik', 'has_ustalenia'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`NR_SPRAWY_SAD`!='', 1, 0)) as cnt_sad
-				, sum(IF(w.`NR_SPRAWY_KOMORNIK`!='', 1, 0)) as cnt_komornik
-				, sum(IF(w.`L_APPOITMENT_INFO`!='', 1, 0)) as cnt_ustalenia
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				(w.`NR_SPRAWY_SAD`!=''
-					or w.`NR_SPRAWY_KOMORNIK`!=''
-					or w.`L_APPOITMENT_INFO`!=''
-				)
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['has_nr_sad'] = (object)array('A_STATUS'=>'has_nr_sad', 'cnt'=>$r->cnt_sad, 'suma_zaleglosci'=>null);
-			$ret['has_nr_komornik'] = (object)array('A_STATUS'=>'has_nr_komornik', 'cnt'=>$r->cnt_komornik, 'suma_zaleglosci'=>null);
-			$ret['has_ustalenia'] = (object)array('A_STATUS'=>'has_ustalenia', 'cnt'=>$r->cnt_ustalenia, 'suma_zaleglosci'=>null);
-		}
-		// filter: 'sad_and_komornik', 'sad_bez_komornik'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`NR_SPRAWY_KOMORNIK`!='', 1, 0)) as cnt_komornik
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`A_STATUS`='sad'
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['sad_and_komornik'] = (object)array('A_STATUS'=>'sad_and_komornik', 'cnt'=>$r->cnt_komornik, 'suma_zaleglosci'=>null);
-			$ret['sad_bez_komornik'] = (object)array('A_STATUS'=>'sad_bez_komornik', 'cnt'=>($r->cnt - $r->cnt_komornik), 'suma_zaleglosci'=>null);
-		}
-		// filter: 'isMovedToVectra'
-		$sql = "select w.`A_STATUS`
-				, count(1) as cnt
-				, sum(IF(w.`PAY_SALDO`<={$stanZeroLimit}, w.`PAY_SALDO`, 0)) as suma_zaleglosci
-			from  `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where
-				w.`IS_MOVED_TO_VECTRA`=1
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$ret['isMovedToVectra'] = (object)array('cnt'=>$r->cnt, 'suma_zaleglosci'=>$r->suma_zaleglosci);
-		}
-		return $ret;
-	}
-
-}
-
-
-class WindykacjaStatsModel {
-
-	public static function _parse_query($q) {
-		$sql_where = '';
-		$sql_where_and_arr = array();
-
-		$usrAclGroups = User::getLdapGroupsNames();
-		$usrAclGroups[] = '';
-		$sqlUsrAclGroups = "'" . implode("','", $usrAclGroups) . "'";
-		$sql_where_and_arr[] = "a.`A_ADM_COMPANY` in({$sqlUsrAclGroups})";
-		$sql_where_and_arr[] = "a.`A_CLASSIFIED` in({$sqlUsrAclGroups})";
-
-		$filter_selected = WindykacjaStatsHelper::get_filter_selected();
-		if ($filter_selected) {
-			if ($filter_selected == 'po-terminie') {
-				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
-				$sql_where_and_arr[] = "w.`PAY_DATE`!='0000-00-00'";
-				$sql_where_and_arr[] = "w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 36 MONTH)";
-			}
-			else if ($filter_selected == '3 m-ce przed') {
-				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
-				$sql_where_and_arr[] = "w.`PAY_DATE`!='0000-00-00'";
-				$sql_where_and_arr[] = "w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 33 MONTH)";
-				$sql_where_and_arr[] = "w.`PAY_DATE`>DATE_SUB(NOW(), INTERVAL 36 MONTH)";
-			}
-			else if ($filter_selected == 'tel1') {
-				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
-				$sql_where_and_arr[] = "w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')";
-				$sql_where_and_arr[] = "( w.`LAST_PHONE_STATUS_DATE`='0000-00-00'
-					or w.`LAST_PHONE_STATUS_DATE`<DATE_SUB(NOW(), INTERVAL 3 MONTH) )";
-			}
-			else if ($filter_selected == 'bad_address') {
-				$sql_where_and_arr[] = "w.`BAD_ADDRESS`>0";
-				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
-			}
-			else if ($filter_selected == 'stan_zero') {
-				$sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
-				$sql_where_and_arr[] = "w.`PAY_SALDO`>-0.05";
-			}
-			else if ($filter_selected == '10-ego') {
-				$sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
-				$sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
-			}
-			else if ($filter_selected == 'has_nr_sad') {
-				$sql_where_and_arr[] = "w.`NR_SPRAWY_SAD`!=''";
-			}
-			else if ($filter_selected == 'has_nr_komornik') {
-				$sql_where_and_arr[] = "w.`NR_SPRAWY_KOMORNIK`!=''";
-			}
-			else if ($filter_selected == 'has_ustalenia') {
-				$sql_where_and_arr[] = "w.`L_APPOITMENT_INFO`!=''";
-			}
-			else if ($filter_selected == 'sad_and_komornik') {
-				$sql_where_and_arr[] = "w.`A_STATUS`='sad' and w.`NR_SPRAWY_KOMORNIK`!=''";
-			}
-			else if ($filter_selected == 'sad_bez_komornik') {
-				$sql_where_and_arr[] = "w.`A_STATUS`='sad' and w.`NR_SPRAWY_KOMORNIK`=''";
-			}
-			else if ($filter_selected == 'isMovedToVectra') {
-				$sql_where_and_arr[] = "w.`IS_MOVED_TO_VECTRA`=1";
-			}
-			else {
-				$sql_where_and_arr[] = "w.`A_STATUS`='{$filter_selected}'";
-			}
-		}
-		if (!empty($q)) {
-			$q = trim($q);
-			if (is_numeric($q)) {// billing number
-				$sqlIdUsr = DB::_($q);
-				$sql_where_and_arr[] = "a.`id_users`='{$sqlIdUsr}'";
-			}
-			else {// string - name, second name
-				$q_arr_values = array();
-				$q_exp = explode(' ', $q);
-				foreach ($q_exp as $v_q) {
-					$v_q = trim($v_q);
-					if (strlen($v_q) > 2) {// min. 3 znaki
-						$q_arr_values[] = strtolower($v_q);
-					}
-				}
-
-				foreach ($q_arr_values as $q_value) {
-					$sql_filter_q = array();
-					$q_arr = array();// uniq array
-					$q_arr_pl = array();// loop array
-
-					$pl_letters = array('ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż');
-					$en_letters = array('a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z');
-
-					$sqlQValue = DB::_($q_value);
-					$sql_filter_q[] = "a.`P_NAME` like '{$sqlQValue}%'";
-					$sql_filter_q[] = "a.`P_NAME_SECOND` like '{$sqlQValue}%'";
-
-					$q_value_clean_en = str_replace($pl_letters, $en_letters, $q_value);
-					$q_value_clean_pl = str_replace($en_letters, $pl_letters, $q_value_clean_en);
-					$q_value_clean_pr = str_replace($en_letters, '_', $q_value_clean_en);
-					if ($q_value_clean_en != $q_value) $q_arr[$q_value_clean_en] = true;
-					if ($q_value_clean_pl != $q_value) $q_arr[$q_value_clean_pl] = true;
-					if ($q_value_clean_pr != $q_value) $q_arr[$q_value_clean_pr] = true;
-
-					foreach ($q_arr as $v_q => $v_val) {
-						$sqlQValue = DB::_($v_q);
-						$sql_filter_q[] = "a.`P_NAME` like '{$sqlQValue}'";
-						$sql_filter_q[] = "a.`P_NAME_SECOND` like '{$sqlQValue}'";
-						// $sql_filter_q[] = "a.`P_ADDRESS_STREET` like '{$sqlQValue}'";
-					}
-
-					$sql_field_1 = "a.`P_NAME`";
-					$sql_field_2 = "a.`P_NAME_SECOND`";
-					foreach ($pl_letters as $k_ind => $v_char_pl) {
-						$sql_field_1 = "REPLACE({$sql_field_1}, '{$v_char_pl}', '{$en_letters[$k_ind]}')";
-						$sql_field_2 = "REPLACE({$sql_field_2}, '{$v_char_pl}', '{$en_letters[$k_ind]}')";
-					}
-					$q_value_clean_en = DB::_($q_value_clean_en);
-					$sql_filter_q[] = $sql_field_1 . " like '%{$q_value_clean_en}%'";
-					$sql_filter_q[] = $sql_field_2 . " like '%{$q_value_clean_en}%'";
-
-					$sql_where_and_arr[] = "(" . implode(" or ", $sql_filter_q) . ")";
-				}
-			}
-		}
-
-		$special_filter_active = V::get('_special_filter_active', '', $_GET);
-		if ('today' == $special_filter_active) {
-			$today = date("Y-m-d");
-			$sql_where_and_arr[] = "w.`A_STATUS_UPDATE_DATE`='{$today}'";
-		}
-		$special_filter_msg_mail = V::get('_special_filter_msg_mail', '', $_GET);
-		if ('not_today' == $special_filter_msg_mail) {
-			$sql_where_and_arr[] = "w.`LAST_PHONE_STATUS_DATE`<'{$today}'";
-		}
-		$special_filter_msg_sms = V::get('_special_filter_msg_sms', '', $_GET);
-		if ('not_today' == $special_filter_msg_sms) {
-			$sql_where_and_arr[] = "w.`LAST_PHONE_STATUS_DATE`<'{$today}'";
-		}
-
-		if (!empty($sql_where_and_arr)) {
-			$sql_where = implode(" and ", $sql_where_and_arr);
-		} else {
-			$sql_where = "1=1";
-		}
-		return $sql_where;
-	}
-
-	public static function get_order_by_fields() {
-		$order_by_fields = array();
-		$order_by_fields[] = 'ID';
-		$order_by_fields[] = 'is_firma';
-		$order_by_fields[] = 'BILLING_OWNER';
-		$order_by_fields[] = 'STATUS';
-		$order_by_fields[] = 'BLOKADA';
-		$order_by_fields[] = 'ID_BILLING_USERS';
-		$order_by_fields[] = 'P_NAME';
-		$order_by_fields[] = 'PAY_SALDO';
-		$order_by_fields[] = 'PAY_FVAT';
-		$order_by_fields[] = 'PAY_DATE';
-		$order_by_fields[] = 'PAY_TERM';
-		$order_by_fields[] = 'HAS_ACTIVE_NET';
-		$order_by_fields[] = 'HAS_ACTIVE_TV';
-		$order_by_fields[] = 'IS_MOVED_TO_VECTRA';
-		return $order_by_fields;
-	}
-
-	public static function get_users_total($q = '') {
-		$total = 0;
-		$sql_where = WindykacjaStatsModel::_parse_query($q);
-		$db = DB::getDB();
-		$sql = "select count(1) as cnt
-			from `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where {$sql_where}
-		";
-		//echo'<pre>sqlTotal:';print_r($sql);echo'</pre>';
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			$total = $r->cnt;
-		}
-		return $total;
-	}
-
-	public static function get_sql_users_select() {
-		$sql_select = "
-				a.`id_users` as ID
-				, a.`id_users`
-				, a.`P_NAME`
-				, a.`P_NAME_SECOND`
-				, a.`P_ADDRESS_STREET`
-				, a.`P_ADDRESS_HOME`
-				, a.`P_ADDRESS_HOUSE`
-				, a.`P_ADDRESS_CITY`
-				, a.`P_ADDRESS_POST_CODE`
-				, a.`P_ADDRESS_REGION`
-				, a.`P_PESEL`
-				, a.`P_PHONE`
-				, a.`P_OTHER_DOC`
-				, a.`user_mail_contact`
-				, a.`is_firma`
-				, a.`P_ADRESS_KORESP_1282`
-				, w.`ID` as WINDYKACJA_ID
-				, w.`ID_BILLING_USERS`
-				, w.`A_STATUS`
-				, w.`A_STATUS_UPDATE_DATE`
-				, w.`USER_PAY_TERM_ADD`
-				, w.`L_APPOITMENT_DATE`
-				, w.`L_APPOITMENT_USER`
-				, w.`L_APPOITMENT_INFO`
-				, w.`PAY_DATE`
-				, w.`PAY_DATE_FIRST_FVAT`
-				, w.`PAY_TERM`
-				, w.`PAY_SALDO`
-				, w.`PAY_FVAT`
-				, w.`wezwanie1_DATE`
-				, w.`wezwanie2_DATE`
-				, w.`wpis_w_krd_DATE`
-				, w.`ID_KORESP`
-				, w.`LAST_ID_KORESP_WEZWANIE1`
-				, w.`LAST_ID_KORESP_WEZWANIE2`
-				, w.`LAST_PAY_DATE`
-				, w.`LAST_PAY_VALUE`
-				, w.`LAST_FVAT_PAY_TERM`
-				, w.`LAST_FVAT_VALUE`
-				, w.`PAY_SALDO_30_DNI`
-				, w.`PAY_SALDO_ISSUED`
-				, w.`BAD_ADDRESS`
-				-- , (select bu.`BILLING_OWNER` from `BILLING_USERS` as bu where bu.`ID`=w.`ID_BILLING_USERS` limit 1) as BILLING_OWNER
-				-- , (select bu.`STATUS` from `BILLING_USERS` as bu where bu.`ID`=w.`ID_BILLING_USERS` limit 1) as STATUS
-				, bu.`STATUS`
-				, bu.`BILLING_OWNER`
-				, w.`NR_SPRAWY_KRD`
-				, w.`NR_SPRAWY_SAD`
-				, w.`NR_SPRAWY_KOMORNIK`
-				, w.`ACCOUNT_NUMBER`
-				, w.`SERVICES_STREETS`
-				, w.`IS_MOVED_TO_VECTRA` as IS_MOVED_TO_VECTRA
---				, ('REZYGNACJA_Z_PRZEJSCIEM_DO_VECTRA'=(select `RODZAJ_DZIALANIA_HANDLOWEGO`
---						from `DEALS_TABLE`
---						where `A_STATUS`='NORMAL'
---							and `ID_BILLING_USERS`=w.`ID_BILLING_USERS`
---						order by `ID` DESC
---						limit 1)
---					) as IS_MOVED_TO_VECTRA
-				, w.`HAS_ACTIVE_NET`
-				, w.`HAS_ACTIVE_TV`
-		";
-		return $sql_select;
-	}
-
-	public static function get_users($q = '', $limit = 10, $limit_start = 0, $order_by = '', $order_dir = '') {
-		$ret = array();
-
-		$sql_select = self::get_sql_users_select();
-		$sql_where = WindykacjaStatsModel::_parse_query($q);
-		$sql_limit = "limit " . (($limit > 0)? $limit : "10");
-		if ($limit_start > 0) $sql_limit .= " offset {$limit_start}";
-		$sql_order_by = "";
-		$order_by_allowed = self::get_order_by_fields();
-		if (in_array($order_by, $order_by_allowed)) {
-			if (in_array($order_by, array('P_NAME','is_firma'))) {
-				$order_by = "a.{$order_by}";
-			} else if (in_array($order_by, array('BILLING_OWNER','STATUS'))) {
-				$order_by = "bu.{$order_by}";
-			} else if ($order_by == 'BLOKADA') {
-				$order_by = "bu.`STATUS`";
-			} else {
-				$order_by = "w.{$order_by}";
-			}
-			$sql_order_by .= " order by {$order_by}";
-			if (in_array($order_dir, array('DESC','ASC'))) {
-				$sql_order_by .= " {$order_dir}";
-			}
-		}
-		$db = DB::getDB();
-		$sql = "select {$sql_select}
-			from `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS` as bu on(bu.`ID`=w.`ID_BILLING_USERS`)
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where {$sql_where}
-			{$sql_order_by}
-			{$sql_limit}
-		";
-		DBG::_('DBG_SQL', '>1', "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
-		//echo'<pre>';print_r($sql);echo'</pre>';
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$ret[$r->id_users] = $r;
-		}
-		return $ret;
-	}
-
-	public static function get_user_by_id($id) {
-		$ret = null;
-		if ($id <= 0) return $ret;
-
-		$sql_where_and_arr = array();
-		$usrAclGroups = User::getLdapGroupsNames();
-		$usrAclGroups[] = '';
-		$sqlUsrAclGroups = "'" . implode("','", $usrAclGroups) . "'";
-		$sql_where_and_arr[] = "a.`A_ADM_COMPANY` in({$sqlUsrAclGroups})";
-		$sql_where_and_arr[] = "a.`A_CLASSIFIED` in({$sqlUsrAclGroups})";
-		$sqlWhereAdd = " and " . implode(" and ", $sql_where_and_arr);
-
-		$sql_select = self::get_sql_users_select();
-		$sql_where = "a.`id_users`='{$id}'";
-		$db = DB::getDB();
-		$sql = "select {$sql_select}
-			from `USERS2_WINDYKACJA_STATUS` as w
-				left join `BILLING_USERS` as bu on(bu.`ID`=w.`ID_BILLING_USERS`)
-				left join `BILLING_USERS_ADD` as a on(a.`id_users`=w.`ID_BILLING_USERS`)
-			where {$sql_where}
-				{$sqlWhereAdd}
-		";
-		$res = $db->query($sql);
-		if ($r = $db->fetch($res)) {
-			if(0){
-				$r->BA_WINIEN = "";
-				$r->BA_MA = "";
-				$r->BA_TIMESTAMP = "";
-				$sql = "select BA.`WINIEN` as BA_WINIEN
-						, BA.`MA` as BA_MA
-						, unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP
-					from `BILLING_ACCOUNTS` as BA
-					where BA.`ID_BILLING_USERS`='" . $r->ID . "'
-				";
-				$db_webone = DB::getDB('931');
-				if ($db_webone) {
-					$res_fin = $db_webone->query($sql);
-					if ($r_fin = $db_webone->fetch($res_fin)) {
-						$r->BA_WINIEN = $r_fin->BA_WINIEN;
-						$r->BA_MA = $r_fin->BA_MA;
-						$r->BA_TIMESTAMP = $r_fin->BA_TIMESTAMP;
-					}
-				}
-			}
-			$ret = $r;
-		}
-		return $ret;
-	}
-
-	public static function get_company(&$user) {
-		if (!isset($user->_company)) {
-			$db = DB::getDB();
-			/*
-				id					1 / 2
-				name1				"BIALL-NET" Sp. z o.o. / "NET-DAY" s.c.
-				name2				--- / Adrian i Ewa Wieczorkowscy
-				kod     		80-174 / 80-809
-				miasto			Gdańsk, Otomin / Gdańsk
-				ulica				Słoneczna / Cieszyńskiego
-				numer_dom		43 / 38
-				numer_pos		NULL / NULL
-				uwagi				--- / ---
-				tel					0-58 320-72-92 / 0-58 741 84 54
-				fax					0-58 320-72-96 / 0-58 741 84 56
-				nip					593-22-68-672 / 583-27-54-031
-				regon				192120212 / 192578721
-				bank				Bank Zachodni WBK SA I O/Gdansk / ---
-				nr_rach			46 1090 1098 0000 0001 0253 7156 / 84 1500 1171 1211 7002 9997 0000
-				NR_RACH_MASS_PAY		109000049887 / 109000049669
-				BILLING_OWNER_EMAIL	biall-net@biall.net.pl / netday@netday.pl
-			 */
-			$sql = "select
-					bo.`id`
-					, bo.`name1`
-					, bo.`name2`
-					, bo.`kod`
-					, bo.`miasto`
-					, bo.`ulica`
-					, bo.`numer_dom`
-					, bo.`tel`
-					, bo.`fax`
-					, bo.`nip`
-					, bo.`regon`
-					, bo.`bank`
-					, bo.`nr_rach`
-					, bo.`NR_RACH_MASS_PAY`
-					, bo.`BILLING_OWNER_EMAIL`
-				from `BILLING_USERS` as bu
-					left join `BILLING_OWNER` as bo on (bo.`ID`=bu.`BILLING_OWNER`)
-				where
-					bu.`ID`='{$user->ID_BILLING_USERS}'
-			";
-			//$db_webone = DB::getDB('931');
-			//if ($db_webone) {
-				//$res = $db_webone->query($sql);
-				//if ($r = $db_webone->fetch($res)) {
-				//	$user->_company = $r;
-				//}
-			//}
-			$res = $db->query($sql);
-			if ($r = $db->fetch($res)) {
-				$user->_company = $r;
-			}
-		}
-		return $user->_company;
-	}
-
-	public static function get_billing_type($type_id) {
-		$ret = null;
-		$types = WindykacjaStatsModel::get_billing_types();
-		if (array_key_exists($type_id, $types)) {
-			$ret = $types[$type_id];
-		}
-		return $ret;
-	}
-
-	public static function get_billing_type_desc($type) {
-		$ret = '';
-		if ($type == 'FVAT') {
-			return "Faktura Vat";
-		}
-		$types = WindykacjaStatsModel::get_billing_types();
-		foreach ($types as $h) {
-			if ($h['TYPE'] == $type) {
-				return $h['DESC'];
-			}
-		}
-		return $ret;
-	}
-
-	public static function get_billing_types($ids = array()) {
-		static $_cache;
-		if (empty($_cache)) $_cache = array();
-		$cache_key = implode(".", $ids);
-		if (!array_key_exists($cache_key, $_cache)) {
-			$billing_types = array();
-			$db_webone = DB::getDB('931');
-			if ($db_webone) {
-				$sql_where = "1=1";
-				if (!empty($ids)) {
-					$sql_where = "`ID` in ('".implode("','", $ids)."')";
-				}
-				$sql = "select *
-					from `BILLING_NUMBERS_TYPE`
-					where
-						{$sql_where}
-				";
-				$res = $db_webone->query($sql);
-				while ($h = $db_webone->fetch_assoc($res)) {
-					$billing_types[$h['ID']] = $h;
-				}
-			}
-			$_cache[$cache_key] = $billing_types;
-		}
-		return $_cache[$cache_key];
-	}
-
-	public static function getAllServicesStreetsCSV($user) {
-		$streets = array();
-		$db = DB::getDB();
-		$sql = "
-			select s.`S_ADDRESS_STREET`
-			from `COMPANIES` c
-				join `DEALS_TABLE` d on(d.`ID_BILLING_USERS`=c.`ID`)
-				join `SERVICES` s on(s.`ID_BILLING_USERS`=c.`ID` and s.`ID_DEALS_TABLE`=d.`ID`)
-			where c.`ID`='{$user->ID}'
-		--		and c.`A_ADM_COMPANY`='19994_PODMIOT_Vectra_wlasciciel'
-				and s.`NAME_LIST_SERVICES` in ('TV','USERS2','VOIP')
-				and s.`A_STATUS` not in ('DELETED')
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$streets[$r->S_ADDRESS_STREET] = true;
-		}
-		$streets = (!empty($streets))? implode(',', array_keys($streets)) : '';
-		return $streets;
-	}
-
-	public static function get_umowy_from_l2($user) {
-		$ret = array();
-		$db_webone = DB::getDB();
-		if (!$db_webone) {
-			return -1;
-		}
-
-		$sql = "select
-				d.`ID`, d.`P_DEALPREFIX`, d.`P_DEALNUMBER`, d.`P_DEALNUMBER_OLD`, d.`P_DEALDATE`, d.`P_DEALDATE_TERM`, d.`DEALDESC`, d.`ANEX_NEEDED`, d.`ANEX_CONFIRM_DATE`
-			from `DEALS_TABLE` as d
-			where d.`ID_BILLING_USERS`='{$user->ID}'
-			order by d.`ID` DESC
-		";
-		$res = $db_webone->query($sql);
-		while ($h = $db_webone->fetch_assoc($res)) {
-			$ret[$h['ID']] = $h;
-		}
-		return $ret;
-	}
-
-	public static function get_uslugi_from_l2(&$user) {
-		// l2: www/modules/webone/form/edit_user_status.php
-		// Aktualne: Usługa[Status] => list_services2($user->ID);
-		$uID = $user->ID;
-
-		$ret = array();
-		$db_webone = DB::getDB();
-		if (!$db_webone) {
-			return -1;
-		}
-
-		if(0){//	SERVICES table struct example:
-			//[ID_BILLING_USERS] => 11363
-			//[active] => 1
-			//[TAB_UPDATE_STAT] => 1
-			//[TAB_UPDATE_DATE] => 2012-02-03 17:43:44
-			//[TAB_UPDATE_INFO] => OK-PREUPDATE-DELETED---UPDATED-OK-:195.117.2.79
-			//[SERVICE_TYPE] => ABONAMENT
-			//[ID_BILLING_NUMBERS_TYPE] => 1
-			//[ABONAMENT_PERIOD] => 1
-			//[ABONAMENT_VALUE] => 26.01
-			//[VAT] => 23
-			//[ID_CURRENCY] => 0
-			//[ABONAMENT_PAYMENT] => UP
-			//[ABONAMENT_START] => 1
-			//[MINIMUM_BILLING_VALUE] => 0.00
-			//[BILLED_TILL] => 2012-06-01 00:00:00
-			//[HANGUP_FROM] => 
-			//[HANGUP_TILL] => 
-			//[HANGUP_STATUS] => 
-			//[HANGUP_RATIO] => 1.00
-			//[TIMESTAMP] => 20120504125053
-			//[P_ID_SERVICES] => 0
-			//[uwagi] => 
-			//[ID_DEALS_TABLE] => 9373
-			//[VAT_NAME] => 23
-			//[id_list_sww] => 1
-			//[SERV_ID_BILLING_PREFIXES] => 0
-			//[ID_OFFERS] => 833
-			//[A_RECORD_CREATE_DATE] => 
-			//[A_RECORD_CREATE_AUTHOR] => 
-			//[A_RECORD_UPDATE_DATE] => 
-			//[A_RECORD_UPDATE_AUTHOR] => 
-		}
-		$sql = "select
-				s.`ID`, s.`NAME_LIST_SERVICES`, s.`A_STATUS`
-				, s.`ID_OFFERS`
-				, s.`ID_DEALS_TABLE`
-				, s.`P_ID_SERVICES`
-				, s.`P_ID_SERVICES` as P_ID
-				, s.`HANGUP_STATUS`
-				, s.`HANGUP_FROM`
-				, s.`HANGUP_TILL`
-				, ls.`description` as description
-				, lst.`name` as A_STATUS_DESC
-			from `SERVICES` as s
-				left join `LIST_SERVICES` as ls on(ls.`name`=s.`NAME_LIST_SERVICES`)
-				left join `LIST_status` as lst on(lst.`ses_users2`=s.`HANGUP_STATUS` and lst.`ID`>2)
-			where `ID_BILLING_USERS`='{$user->ID}'
-		";
-		$res = $db_webone->query($sql);
-		while ($h = $db_webone->fetch_assoc($res)) {
-			$ret[$h['ID']] = $h;
-		}
-		return $ret;
-	}
-
-	public static function get_umowy_from_l3(&$user) {
-		$ret = array();
-		$db = DB::getDB();
-		$sql = "select d.*
-			from `USERS2_DEALS` as d
-			where
-				(d.`ID_BILLING_USERS_OLD`='{$user->ID}' or d.`ID_BILLING_USERS_NEW`='{$user->ID}')
-			order by d.`ID` DESC
-		";
-		$res = $db->query($sql);
-		while ($h = $db->fetch_assoc($res)) {
-			$ret[] = $h;
-		}
-		return $ret;
-	}
-
-	public static function get_bill_dosc_by_date(&$user, $date_limit = null) {
-		// fetch finanse data from remote DB
-		$billing_docs = new BillingDocs();
-		$db_webone = DB::getDB('931');
-		if (!$db_webone) {
-			echo'<p style="color:red">'."Blad polaczenia do bazy dancyh webone_billing - Zasob [931]".'</p>';
-			return;
-		}
-		$sql_where = " BILLS_FVAT.OPEN='N' and  BILLS_FVAT.ID_BILLING_USERS ='{$user->ID}' ";
-		// blad w zaokragleniach
-		//		, sum((BILLS_FVAT_POS.AMMOUNT * BILLS_FVAT_POS.PRICE)*(1 + BILLS_FVAT_POS.VAT/100)) as WARTOSC
-		if ($date_limit) {
-			$sql_where .= " and BILLS_FVAT.PAYMENT_TERM <= '{$date_limit}' ";
-		}
-		$sql = "select
-				BILLS_FVAT.*
-				, count(BILLS_FVAT_POS.ID) as ILOSC_POZYCJI
-				, BILLS_FVAT_POS.ID_BILLS_FVAT
-				, sum(round((round(BILLS_FVAT_POS.AMMOUNT * BILLS_FVAT_POS.PRICE, 2)) * (1 + BILLS_FVAT_POS.VAT / 100), 2)) as WARTOSC
-				-- , count(BILLS_FVAT_POS.PRICE) as ILOSC_POZYCJI
-				, `BILLING_NUMBERS`.`NUMBER` as `NUMBER`
-				, `BILLING_NUMBERS`.`ID_BILLING_PREFIXES` as `ID_BILLING_PREFIXES`
-			from `BILLS_FVAT`
-				left join `BILLING_NUMBERS` on(`BILLING_NUMBERS`.`ID`=`BILLS_FVAT`.`ID_BILLING_NUMBERS`)
-				left join `BILLS_FVAT_POS` on(`BILLS_FVAT_POS`.`ID_BILLS_FVAT`=`BILLS_FVAT`.`ID`)
-			where {$sql_where}
-			group by BILLS_FVAT.ID
-			order by BILLS_FVAT.ID_BILLING_NUMBERS ASC
-		";
-		//echo'<pre>sql1: L.' . __LINE__ . "\n";print_r($sql);echo'</pre>';
-//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';print_r($sql);echo'</pre>';
-		$res = $db_webone->query($sql);
-		while ($h = $db_webone->fetch_assoc($res)) {
-			if (0){// ? dla kazdej faktury ?
-			$sql = "select t1.ID_BILLING_NUMBERS AS NR_DOK
-					, t1.ID_BILLING_USERS as PLATNIK
-					, t1.WINIEN,t1.MA
-					, t1.ID_FIN_WINIEN as ID_F_W
-					, t1.ID_FIN_WINIEN_VAL as F_WINIEN_V
-					, t1.ID_FIN_MA as ID_F_M
-					, t1.ID_FIN_MA_VAL as F_MA_V
-					, max(t2.ID)
-					, sum(t2.ID_FIN_WINIEN_VAL) as ROZ_WINIEN
-					, max(t3.ID)
-					, sum(t3.ID_FIN_MA_VAL) as ROZ_MA
-					, t1.WINIEN - sum(t2.ID_FIN_WINIEN_VAL) - sum(t3.ID_FIN_MA_VAL) as POZ_WINIEN
-					, t1.MA - sum(t3.ID_FIN_MA_VAL) - sum(t2.ID_FIN_WINIEN_VAL) as POZ_MA
-				from `BILLING_ACCOUNTS_FILES` as t1
-					left join `BILLING_ACCOUNTS_FILES` as t2 on (t1.ID_BILLING_NUMBERS=t2.ID_FIN_WINIEN)
-					left join `BILLING_ACCOUNTS_FILES` as t3 on (t1.ID_BILLING_NUMBERS=t3.ID_FIN_MA)
-				where
-					t1.ID_FIN_WINIEN is NULL and t1.ID_FIN_MA is NULL and t1.MA = 0 and  t1.WINIEN > 0
-					and t1.ID_BILLING_NUMBERS={$user->ID}
-				group by t1.ID_BILLING_NUMBERS
-				limit 0,1
-			";
-			}
-			//$h['type'] = 'FVAT';
-			//$h['nr'] = $h['ID_BILLING_NUMBERS'];
-			//$h['WINIEN'] = $h['WARTOSC'];
-			//$h['MA'] = 0;
-			$billing_docs->add_bill_doc($h['PAYMENT_TERM'], 'FVAT', $h);
-		}
-
-		$faktury_cols = array();
-		//$faktury_cols['ID_BILLING_USERS'] = "id klienta";// 
-		$faktury_cols['ID_BILLING_NUMBERS'] = "numer";// numer faktury
-		$faktury_cols['BILL_DATE'] = "";// data('Y-m-d')
-		$faktury_cols['SELL_DATE'] = "";// data('Y-m-d')
-		$faktury_cols['PAYMENT_TERM'] = "";// data('Y-m-d')
-
-		//$billing_types = WindykacjaStatsModel::get_billing_types(array(3, 4, 5, 7, 8));
-		$billing_types = WindykacjaStatsModel::get_billing_types();
-		//echo'<pre>$billing_types:';print_r($billing_types);echo'</pre>';
-
-		foreach ($billing_types as $bill_type) {
-			if ($bill_type['CLASS'] == 'FINANCE') {
-				$sql_where = ($date_limit)? " and {$bill_type['TABLE']}.BILL_DATE <= '{$date_limit}' " : "";
-				$sql = "select {$bill_type['TABLE']}.ID
-						, {$bill_type['TABLE']}.ID_BILLING_NUMBERS
-						, {$bill_type['TABLE']}.BILL_DATE
-						, round({$bill_type['TABLE']}.WINIEN, 2) as WINIEN
-						, round({$bill_type['TABLE']}.MA, 2) as MA
-						, {$bill_type['TABLE']}.ID_FK_DEKRET
-						, {$bill_type['TABLE']}.OPEN
-						, {$bill_type['TABLE']}.FK_ZAKSIEG
-						, {$bill_type['TABLE']}.do_dokumentu
-						, {$bill_type['BILLING_NUMBERS_TABLE']}.NUMBER
-						, {$bill_type['BILLING_NUMBERS_TABLE']}.ID_BILLING_PREFIXES
-						, {$bill_type['BILLING_NUMBERS_TABLE']}.ID_BILLING_NUMBERS_TYPE
-					from {$bill_type['TABLE']}
-						left join {$bill_type['BILLING_NUMBERS_TABLE']} on ({$bill_type['BILLING_NUMBERS_TABLE']}.ID={$bill_type['TABLE']}.ID_BILLING_NUMBERS)
-					where {$bill_type['TABLE']}.ID_BILLING_USERS='{$user->ID}'
-						{$sql_where}
-				";
-				//echo'<pre>sql2: L.' . __LINE__ . "\n";print_r($sql);echo'</pre>';
-				$res = $db_webone->query($sql);
-				while ($h = $db_webone->fetch_assoc($res)) {
-					$billing_docs->add_bill_doc($h['BILL_DATE'], $bill_type['TYPE'], $h);
-				}
-			}
-			else if ($bill_type['CLASS'] == 'SELL_MA') {
-				$sql_where = ($date_limit)? " and t.BILL_DATE <= '{$date_limit}' " : "";
-				$sql = "select t.ID
-						, count(t_pos.ID) as cnt
-						, t_pos.ID_BILLS_FVAT
-						, t.ID_CURRENCY
-						, round(sum((t_pos.N_AMMOUNT * t_pos.N_PRICE) * ( 1 + t_pos.N_VAT / 100)),2) as WINIEN
-						, round(sum( 
-								((t_pos.AMMOUNT * t_pos.PRICE) * ( 1 + t_pos.VAT / 100))
-								- (t_pos.N_AMMOUNT * t_pos.N_PRICE * t_pos.N_VAT / 100)
-								+ (t_pos.N_AMMOUNT * t_pos.N_PRICE * t_pos.VAT / 100)
-							),2) as MA
-						, t.ID_BILLING_NUMBERS
-						, t.OPEN
-						, t.FK_ZAKSIEG
-						, t.IF_KORV , t.BILL_DATE
-						, t_num.`NUMBER`
-						, t_num.`ID_BILLING_PREFIXES`
-						, fv_num.`NUMBER` as FV_NUMBER
-					from `{$bill_type['TABLE']}` t
-						left join `{$bill_type['BILLING_NUMBERS_TABLE']}` t_num on (t_num.`ID`=t.`ID_BILLING_NUMBERS`)
-						left join `{$bill_type['BILLING_NUMBERS_TABLE']}` fv_num on (fv_num.`ID`=t.`REMOTE_ID_BILLING_NUMBERS`)
-						left join `{$bill_type['TABLE']}_POS` t_pos on (t_pos.`ID_BILLS_FVAT`=t.`ID`)
-					where t.`ID_BILLING_USERS`='{$user->ID}'
-						{$sql_where}
-					group by t.`ID`
-					order by t.`ID`
-				";
-				//echo'<pre>sql3: L.' . __LINE__ . "\n";print_r($sql);echo'</pre>';
-				$res = $db_webone->query($sql);
-				while ($h = $db_webone->fetch_assoc($res)) {
-					$billing_docs->add_bill_doc($h['BILL_DATE'], $bill_type['TYPE'], $h);
-				}
-			}
-		}
-
-		return $billing_docs;
-	}
-
-	/**
-	 * @used in FunkcjeL1::billing_billwiev_przeterminowania
-	 */
-	public static function get_billing_account_files($user_id) {
-		$baf = array();
-		$ECHO_PARAM = '';
-		$ID_BILLING_USERS_PARAM = $user_id;
-
-		$db_webone = DB::getDB('931');
-		if (!$db_webone) {
-			echo'<p style="color:red">'."Blad polaczenia do bazy dancyh webone_billing - Zasob [931]".'</p>';
-			return $baf;
-		}
-
-		$WHERE = "";
-		if ($ID_BILLING_USERS_PARAM) $WHERE .= " and BAF.ID_BILLING_USERS='{$ID_BILLING_USERS_PARAM}' ";
-		//UZGODNIENIE_SALD
-		if (strstr($ECHO_PARAM, 'saldo_rok')) {
-			global $base_path ;
-			include_once($base_path."/modules/billing/bill/modules/billing_financefunc.inc");
-			if ($ID_BILLING_USERS_PARAM) {
-				if ($vdb->sql_numrows($vdb->sql_query("select ID from BILLING_ACCOUNTS_TILL where ID_BILLING_USERS='{$ID_BILLING_USERS_PARAM}' and TILL=YEAR(NOW())-1 ;")) != 1) {
-					UAKTUALNIJ_KONTA($ID_BILLING_USERS_PARAM);
-				}
-			}
-			$WHERE .= " AND YEAR(BN.TIMESTAMP)<YEAR(NOW()) ";
-		}
-		$WHERE_FIRMA = "";
-		if ($_GET['FIRMA']) $WHERE_FIRMA = "and BILLING_USERS.BILLING_OWNER='{$_GET['FIRMA']}'" ;
-		//$billing_account_files = WindykacjaStatsModel::
-		$sql = "create temporary table TEMP_BILLING_ACCOUNTS_FILES
-			select BAF.ID
-				, BAF.ID_BILLING_USERS
-				, BAF.WINIEN
-				, BAF.MA
-				, BAF.ID_BILLING_NUMBERS_TYPE
-				, BN.NUMBER
-				, BN.ID_BILLING_PREFIXES
-				, BAF_WINIEN.ID_FIN_WINIEN
-				, BAF_WINIEN.ID_BILLING_NUMBERS_TYPE as ID_BILLING_NUMBERS_TYPE_W
-				, BAF_BN_WINIEN.NUMBER as NUMBER_W
-				, BAF_BN_WINIEN.ID_BILLING_PREFIXES as ID_BILLING_PREFIXES_W
-				, unix_timestamp(BAF_BN_WINIEN.TIMESTAMP) as TIMESTAMP_W
-				, BAF_WINIEN.ID_FIN_WINIEN_VAL
-				, NULL as ID_FIN_MA
-				, NULL as	ID_BILLING_NUMBERS_TYPE_M
-				, NULL as	NUMBER_M
-				, NULL as ID_BILLING_PREFIXES_M
-				, NULL as TIMESTAMP_M
-				, NULL as	ID_FIN_MA_VAL
-				, unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM, BILLS_KORV.PAYMENT_TERM)) as TERMIN_PL
-				, BUA.P_NAME
-				, BUA.P_NAME_SECOND
-				, BUA.P_ADDRESS_CITY
-				, BUA.P_ADDRESS_STREET
-				, BUA.P_ADDRESS_HOUSE
-				, BUA.P_ADDRESS_HOME
-				, BUA.user_mail_contact
-				, BA.WINIEN as BA_WINIEN
-				, BA.MA as BA_MA
-				, unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP
-				, unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP
-			from BILLING_ACCOUNTS_FILES as BAF
-				left join BILLING_USERS on BILLING_USERS.ID=BAF.ID_BILLING_USERS 
-				left join BILLING_USERS_ADD  as BUA on BUA.id_users=BAF.ID_BILLING_USERS
-				left join BILLING_NUMBERS as BN on BN.ID=BAF.ID_BILLING_NUMBERS 
-				left join BILLING_ACCOUNTS as BA on BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS
-				left join BILLS_FVAT on BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
-				left join BILLS_KORV on BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
-				left join BILLING_ACCOUNTS_FILES as BAF_WINIEN on BAF_WINIEN.ID_FIN_WINIEN=BAF.ID_BILLING_NUMBERS 
-				left join BILLING_NUMBERS as BAF_BN_WINIEN on BAF_BN_WINIEN.ID=BAF_WINIEN.ID_BILLING_NUMBERS
-			where BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL and BAF.ID_FIN_WINIEN is NULL
-				{$WHERE}
-				{$WHERE_FIRMA}
-		";
-
-		$sql2 = "insert into TEMP_BILLING_ACCOUNTS_FILES
-			select BAF.ID
-				, BAF.ID_BILLING_USERS
-				, BAF.WINIEN
-				, BAF.MA
-				, BAF.ID_BILLING_NUMBERS_TYPE
-				, BN.NUMBER
-				, BN.ID_BILLING_PREFIXES
-				, NULL as ID_FIN_WINIEN
-				, NULL as ID_BILLING_NUMBERS_TYPE_W
-				, NULL as NUMBER_W
-				, NULL as ID_BILLING_PREFIXES_W
-				, NULL as TIMESTAMP_W
-				, NULL as ID_FIN_WINIEN_VAL
-				, BAF_MA.ID_FIN_MA
-				, BAF_MA.ID_BILLING_NUMBERS_TYPE as ID_BILLING_NUMBERS_TYPE_M
-				, BAF_BN_MA.NUMBER as NUMBER_M
-				, BAF_BN_MA.ID_BILLING_PREFIXES as ID_BILLING_PREFIXES_M
-				, unix_timestamp(BAF_BN_MA.TIMESTAMP) as TIMESTAMP_M
-				, BAF_MA.ID_FIN_MA_VAL
-				, unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM, BILLS_KORV.PAYMENT_TERM))
-				, BUA.P_NAME
-				, BUA.P_NAME_SECOND
-				, BUA.P_ADDRESS_CITY
-				, BUA.P_ADDRESS_STREET
-				, BUA.P_ADDRESS_HOUSE
-				, BUA.P_ADDRESS_HOME
-				, BUA.user_mail_contact
-				, BA.WINIEN as BA_WINIEN
-				, BA.MA as BA_MA
-				, unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP
-				, unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP
-			from BILLING_ACCOUNTS_FILES as BAF
-				left join BILLING_USERS on (BILLING_USERS.ID=BAF.ID_BILLING_USERS)
-				left join BILLING_USERS_ADD as BUA on (BUA.id_users=BAF.ID_BILLING_USERS)
-				left join BILLING_NUMBERS as BN on (BN.ID=BAF.ID_BILLING_NUMBERS)
-				left join BILLING_ACCOUNTS as BA on (BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS)
-				left join BILLS_FVAT on (BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS)
-				left join BILLS_KORV on (BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS)
-				left join BILLING_ACCOUNTS_FILES as BAF_MA on (BAF_MA.ID_FIN_MA=BAF.ID_BILLING_NUMBERS)
-				left join BILLING_NUMBERS as BAF_BN_MA on (BAF_BN_MA.ID=BAF_MA.ID_BILLING_NUMBERS)
-			where
-				BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL
-				{$WHERE}
-				{$WHERE_FIRMA}
-		";
-		if (strstr($ECHO_PARAM,'saldo_rok')) {
-			$sql = "create temporary table TEMP_BILLING_ACCOUNTS_FILES
-				select
-					BAF.ID, BAF.ID_BILLING_USERS , BAF.WINIEN, BAF.MA, BAF.ID_BILLING_NUMBERS_TYPE, BN.NUMBER , BN.ID_BILLING_PREFIXES,
-					BAF_WINIEN.ID_FIN_WINIEN,
-					BAF_WINIEN.ID_BILLING_NUMBERS_TYPE as  ID_BILLING_NUMBERS_TYPE_W,
-					BAF_BN_WINIEN.NUMBER as  NUMBER_W,
-					BAF_BN_WINIEN.ID_BILLING_PREFIXES as  ID_BILLING_PREFIXES_W,
-					unix_timestamp(BAF_BN_WINIEN.TIMESTAMP) as  TIMESTAMP_W,
-					BAF_WINIEN.ID_FIN_WINIEN_VAL,
-					NULL as  ID_FIN_MA, 
-					NULL as	 ID_BILLING_NUMBERS_TYPE_M,
-					NULL as	 NUMBER_M,
-					NULL as  ID_BILLING_PREFIXES_M,
-					NULL as  TIMESTAMP_M,
-					NULL as	 ID_FIN_MA_VAL,
-					unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM,ifnull( BILLS_KORV.PAYMENT_TERM,BN.TIMESTAMP ))) as TERMIN_PL ,
-					BUA.P_NAME , BUA.P_NAME_SECOND  , BUA.P_ADDRESS_CITY , BUA.P_ADDRESS_STREET ,BUA.P_ADDRESS_HOUSE  , BUA.P_ADDRESS_HOME , BUA.user_mail_contact ,
-					BA.WINIEN as BA_WINIEN , BA.MA as BA_MA , unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP,
-					unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP, 
-					BILLING_ACCOUNTS_TILL.TILL as BAT_TILL , BILLING_ACCOUNTS_TILL.WINIEN as BAT_WINIEN, BILLING_ACCOUNTS_TILL.MA as BAT_MA 
-				from BILLING_ACCOUNTS_FILES as BAF
-					left join BILLING_USERS_ADD  as BUA on BUA.id_users=BAF.ID_BILLING_USERS
-					left join BILLING_NUMBERS as BN on BN.ID=BAF.ID_BILLING_NUMBERS 
-					left join BILLING_ACCOUNTS as BA on BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS
-					left join BILLS_FVAT on BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
-					left join BILLS_KORV on BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
-					left join BILLING_ACCOUNTS_FILES as BAF_TRG on ( BAF.ID_FIN_WINIEN=BAF_TRG.ID_BILLING_NUMBERS or BAF.ID_FIN_MA=BAF_TRG.ID_BILLING_NUMBERS )
-					left join BILLING_NUMBERS as BAF_TRG_BN on ( BAF_TRG.ID_BILLING_NUMBERS=BAF_TRG_BN.ID )
-					left join BILLING_ACCOUNTS_FILES as BAF_WINIEN on ( BAF_WINIEN.ID_FIN_WINIEN=BAF.ID_BILLING_NUMBERS or BAF_WINIEN.ID_FIN_MA=BAF.ID_BILLING_NUMBERS )
-					left join BILLING_NUMBERS as BAF_BN_WINIEN on ( BAF_BN_WINIEN.ID=BAF_WINIEN.ID_BILLING_NUMBERS )
-					left join BILLING_ACCOUNTS_TILL on (BILLING_ACCOUNTS_TILL.ID_BILLING_USERS=BAF.ID_BILLING_USERS and BILLING_ACCOUNTS_TILL.TILL=year(now())-1  ) 
-				where 
-					( 	BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL or year(BAF_TRG_BN.TIMESTAMP)>year(NOW())-1   )
-					and (YEAR(BAF_BN_WINIEN.TIMESTAMP)<YEAR(NOW()) or BAF_BN_WINIEN.TIMESTAMP is NULL ) 	 
-					{$WHERE}
-				limit 2000 ;
-			";
-
-			$sql2 = " insert into TEMP_BILLING_ACCOUNTS_FILES select
-					BAF.ID, BAF.ID_BILLING_USERS , BAF.WINIEN, BAF.MA, BAF.ID_BILLING_NUMBERS_TYPE, BN.NUMBER , BN.ID_BILLING_PREFIXES,
-					NULL as ID_FIN_WINIEN,
-					NULL as ID_BILLING_NUMBERS_TYPE_W,
-					NULL as NUMBER_W ,
-					NULL as ID_BILLING_PREFIXES_W,
-					NULL as TIMESTAMP_W ,
-					NULL as ID_FIN_WINIEN_VAL ,
-					BAF_MA.ID_FIN_MA,
-					BAF_MA.ID_BILLING_NUMBERS_TYPE as ID_BILLING_NUMBERS_TYPE_M,
-					BAF_BN_MA.NUMBER as NUMBER_M,
-					BAF_BN_MA.ID_BILLING_PREFIXES as ID_BILLING_PREFIXES_M,
-					unix_timestamp(BAF_BN_MA.TIMESTAMP) as TIMESTAMP_M,
-					BAF_MA.ID_FIN_MA_VAL,
-					unix_timestamp(ifnull(BILLS_FVAT.PAYMENT_TERM,ifnull( BILLS_KORV.PAYMENT_TERM,BN.TIMESTAMP ))) as TERMIN_PL ,
-
-					BUA.P_NAME , BUA.P_NAME_SECOND  , BUA.P_ADDRESS_CITY , BUA.P_ADDRESS_STREET ,BUA.P_ADDRESS_HOUSE  , BUA.P_ADDRESS_HOME , BUA.user_mail_contact ,
-					BA.WINIEN as BA_WINIEN , BA.MA as BA_MA , unix_timestamp(BA.TIMESTAMP) as BA_TIMESTAMP,
-					unix_timestamp(BAF.TIMESTAMP) as BAF_TIMESTAMP,
-					BILLING_ACCOUNTS_TILL.TILL as BAT_TILL , BILLING_ACCOUNTS_TILL.WINIEN as BAT_WINIEN, BILLING_ACCOUNTS_TILL.MA as BAT_MA 
-				from BILLING_ACCOUNTS_FILES as BAF
-					left join BILLING_USERS_ADD  as BUA on BUA.id_users=BAF.ID_BILLING_USERS
-					left join BILLING_NUMBERS as BN on BN.ID=BAF.ID_BILLING_NUMBERS
-					left join BILLING_ACCOUNTS as BA on BA.ID_BILLING_USERS=BAF.ID_BILLING_USERS
-					left join BILLS_FVAT on BILLS_FVAT.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS
-					left join BILLS_KORV on BILLS_KORV.ID_BILLING_NUMBERS=BAF.ID_BILLING_NUMBERS 
-					left join BILLING_ACCOUNTS_FILES as BAF_TRG on ( BAF.ID_FIN_WINIEN=BAF_TRG.ID_BILLING_NUMBERS or BAF.ID_FIN_MA=BAF_TRG.ID_BILLING_NUMBERS )
-					left join BILLING_NUMBERS as BAF_TRG_BN on ( BAF_TRG.ID_BILLING_NUMBERS=BAF_TRG_BN.ID )
-					left join BILLING_ACCOUNTS_FILES as BAF_MA on ( BAF_MA.ID_FIN_WINIEN=BAF.ID_BILLING_NUMBERS or BAF_MA.ID_FIN_MA=BAF.ID_BILLING_NUMBERS )
-					left join BILLING_NUMBERS as BAF_BN_MA on ( BAF_BN_MA.ID=BAF_MA.ID_BILLING_NUMBERS )
-					left join BILLING_ACCOUNTS_TILL on (BILLING_ACCOUNTS_TILL.ID_BILLING_USERS=BAF.ID_BILLING_USERS and BILLING_ACCOUNTS_TILL.TILL=year(now())-1  ) 
-				where
-					( 	BAF.ID_FIN_WINIEN is NULL and BAF.ID_FIN_MA is NULL or year(BAF_TRG_BN.TIMESTAMP)>year(NOW())-1   )
-					and BAF.ID_BILLING_USERS='1047'  AND YEAR(BN.TIMESTAMP)<YEAR(NOW())  
-					and  (YEAR(BAF_BN_MA.TIMESTAMP)<YEAR(NOW())  or BAF_BN_MA.TIMESTAMP is NULL ) 	 
-					{$WHERE}
-				limit 1000,1000 ;
-			";
-		}//EOF if saldo_rok param
-
-		$sql_alter = "alter table TEMP_BILLING_ACCOUNTS_FILES
-			modify ID_FIN_MA int(11)
-			, modify ID_BILLING_NUMBERS_TYPE_M int(2)
-			, modify NUMBER_M int(10)
-			, modify ID_BILLING_PREFIXES_M int(2) default NULL NULL
-			, modify TIMESTAMP_M int(10)
-			, modify ID_FIN_MA_VAL decimal(10,2)
-			, modify ID_BILLING_PREFIXES int(2) default NULL NULL
-			, modify ID_BILLING_PREFIXES_W int(2)  default NULL NULL
-		";
-
-		$db_webone->query("drop TEMPORARY table TEMP_BILLING_ACCOUNTS_FILES");
-		$result_create = $db_webone->query($sql);
-		$result_alter = $db_webone->query($sql_alter);
-		$result_create2 = $db_webone->query($sql2);
-echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">db_webone: ';print_r($db_webone);echo'</pre>';
-
-		$sql = "select * from TEMP_BILLING_ACCOUNTS_FILES  order by ID_BILLING_USERS,ID ";
-		$sql_count = "select count(1) as cnt from TEMP_BILLING_ACCOUNTS_FILES ";
-		$count = 0;
-		$res = $db_webone->query($sql_count);
-		if ($r_count = $db_webone->fetch($res)) {
-			$count = $r_count->cnt;
-		}
-echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">count: ';print_r($count);echo'</pre>';
-		if ($count > 0 && $ID_BILLING_USERS_PARAM > 0) {
-			$result = $db_webone->query($sql);
-		} else {
-			$sql_none = "insert into TEMP_BILLING_ACCOUNTS_FILES (ID,ID_BILLING_USERS,BAT_TILL,BAT_WINIEN,BAT_MA)
-				select '0',ID_BILLING_USERS,TILL ,WINIEN ,MA from BILLING_ACCOUNTS_TILL where ID_BILLING_USERS='{$ID_BILLING_USERS_PARAM}' and TILL=YEAR(NOW())-1
-			";
-			$db_webone->query($sql_none);
-			$result = $db_webone->query($sql);
-		}
-		while ($h_baf = $db_webone->fetch_row($result)) {
-			$baf[] = $h_baf;
-		}
-		return $baf;
-	}
-
-	public static function update_doc_number(&$fvat_arr) {
-		$fetch_ids = array();
-		foreach ($fvat_arr as $k => $fvat) {
-			$fetch_ids[] = $fvat['ID_BILLING_NUMBERS'];
-		}
-		if (!empty($fetch_ids)) {
-			$db_webone = DB::getDB('931');
-			if (!$db_webone) {
-				return -1;
-			}
-
-			$sql = "select `ID`, `NUMBER`, `ID_BILLING_PREFIXES`
-				from `BILLING_NUMBERS`
-				where
-					`ID` in(".implode(",", $fetch_ids).")
-			";
-			$res = $db_webone->query($sql);
-			$bnum = array();
-			while ($h = $db_webone->fetch_assoc($res)) {
-				$bnum[$h['ID']] = $h;
-			}
-			foreach ($bnum as $k_id => $bn) {
-				foreach ($fvat_arr as $k_fvat => $fvat) {
-					if ($bn['ID'] == $fvat['ID_BILLING_NUMBERS']) {
-						$fvat_arr[$k_fvat]['NUMBER'] = $bn['NUMBER'];
-						$fvat_arr[$k_fvat]['ID_BILLING_PREFIXES'] = $bn['ID_BILLING_PREFIXES'];
-					}
-				}				
-			}
-		}
-	}
-
-	/**
-	 * @param $user - Windykacja status user
-	 * @param $taks - wezwanie1, wezwanie2
-	 * @param $id_proj - ID Projektu
-	 * @returns int - ID created record
-	 */
-	public static function create_koresp($user, $task, $id_proj, $params = array()) {
-		$sql_data = array();
-		$sql_zawartosc = '';
-		if ($task == 'wezwanie1') {
-			$sql_zawartosc = 'wezwanie do zaplaty';
-			$sql_data['K_TYP_KORESP'] = 'OUT';
-			$sql_data['K_TYP_RODZAJ'] = 'POLECONY';
-			$sql_data['K_LOKALIZACJA'] = 'PROJEKT';
-			$sql_data['K_LOKALIZACJA_NEW'] = 'PROJEKT';
-		} else if ($task == 'wezwanie2') {
-			$sql_zawartosc = 'wezwanie do zaplaty - ostateczne';
-			$sql_data['K_TYP_KORESP'] = 'OUT';
-			$sql_data['K_TYP_RODZAJ'] = 'POLECONY';
-			$sql_data['K_LOKALIZACJA'] = 'PROJEKT';
-			$sql_data['K_LOKALIZACJA_NEW'] = 'PROJEKT';
-		} else if ($task == 'rozwiazanie umowy') {
-			$sql_zawartosc = 'rozwiazanie umowy ID ' . $params['nr_umowy'] . ' - ' . $params['powod_desc'];
-			$sql_data['K_TYP_KORESP'] = 'IN';
-		}
-		if (!$sql_zawartosc) {
-			return false;
-		}
-
-/**
- * przykładowe wezwania:
- *   SELECT * FROM `IN7_DZIENNIK_KORESP` WHERE `K_ZAWARTOS` LIKE '%wezwanie%' ORDER BY `IN7_DZIENNIK_KORESP`.`ID` DESC;
- * przykład:
- *   SELECT * FROM `IN7_DZIENNIK_KORESP` WHERE `ID`=25951;
- */
-
-		$db = DB::getDB();
-		$sql_obj = new stdClass();
-		$sql_obj->A_STATUS = 'WAITING';
-		foreach ($sql_data as $k_field => $v_value) {
-			$sql_obj->$k_field = $v_value;
-		}
-		$sql_obj->ID_BILLING_USERS = $user->ID;
-		$sql_obj->K_DATA_OTRZYM_KORESP = '';// data ?
-		$sql_obj->K_DATA_OTRZYMANEJ_KORESP = '';// data ?
-		$sql_obj->K_OD_KOGO = "{$user->P_NAME} {$user->P_NAME_SECOND}";
-		$sql_obj->OD_KOGO_ADRES = "ul. {$user->P_ADDRESS_STREET} {$user->P_ADDRESS_HOUSE}/{$user->P_ADDRESS_HOME}, {$user->P_ADDRESS_POST_CODE} {$user->P_ADDRESS_CITY}";
-		$sql_obj->K_ZAWARTOS = $sql_zawartosc;
-		$sql_obj->K_ZNAK_REFERENTA = User::getFullName() . ' (' . User::getInicjaly() . ')';
-		$sql_obj->ID_PROJECT = $id_proj;
-		$ret_id = $db->ADD_NEW_OBJ('IN7_DZIENNIK_KORESP', $sql_obj);
-		return $ret_id;
-	}
-
-	/**
-	 * @param int $user_id - IS klienta
-	 * @param int $id_deals_old - ID umowy do wyłączenia
-	 * @param date 'Y-m-d' $termin_odlaczenia - Termin odłączenia
-	 * @returns int - ID created record
-	 */
-	public static function create_deals_rozwiazanie($user_id, $id_deals_old, $termin_odlaczenia, $powod_desc = '') {
-		$db = DB::getDB();
-		$old_deal = $db->get_by_id('DEALS_TABLE', $id_deals_old);
-		if (!$old_deal) {
-			return false;
-		}
-
-		$sql_obj = new stdClass();
-		$sql_obj->DEALDESC = "Rezygnacja z dniem {$termin_odlaczenia}";
-		$sql_obj->A_STATUS = 'WAITING';
-		$sql_obj->ID_BILLING_USERS = $user_id;
-		$sql_obj->P_DEALNUMBER_OLD = $old_deal->ID;
-		$sql_obj->S_ADDRESS_STREET = $old_deal->S_ADDRESS_STREET;
-		$sql_obj->P_DEALDATE = $old_deal->P_DEALDATE;
-		$sql_obj->P_DEALDATE_TERM = $old_deal->P_DEALDATE_TERM;
-		$sql_obj->L2_HANGUP_FROM = $termin_odlaczenia;
-		$sql_obj->RODZAJ_DZIALANIA_HANDLOWEGO = $powod_desc;
-		// TODO: $sql_obj->ID_OFFERS_OFF = get_active_services_id($old_deal->ID);
-/*
-		if(
-			SV.HANGUP_STATUS=SV.A_STATUS
-			, coalesce(SV.A_STATUS)
-			, if(
-				( unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
-					and  ( SV.HANGUP_TILL='0000-00-00' or SV.HANGUP_TILL is NULL )
-					and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
-				)
-				, coalesce(SV.HANGUP_STATUS)
-				, if(
-					( unix_timestamp(NOW()) < unix_timestamp(SV.HANGUP_FROM) 
-						and (SV.HANGUP_TILL='0000-00-00' or SV.HANGUP_TILL is NULL )
-						and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
-					)
-					, coalesce(SV.A_STATUS)
-					, if(
-						( unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
-							and unix_timestamp(NOW()) < unix_timestamp(SV.HANGUP_TILL)
-							and ( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
-							and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
-						)
-					, coalesce(SV.HANGUP_STATUS)
-					, if(
-							( unix_timestamp(NOW()) < unix_timestamp(SV.HANGUP_FROM) and  unix_timestamp(NOW())< unix_timestamp(SV.HANGUP_TILL) 
-			and  ( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
-			and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null ))
-							, coalesce(SV.A_STATUS)
-							, if(
-									(	( SV.HANGUP_TILL='0000-00-00' or SV.HANGUP_TILL is NULL )
-			and ( SV.HANGUP_FROM='0000-00-00' or SV.HANGUP_FROM is null ))
-									, coalesce(SV.A_STATUS)
-									, if( unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
-											and  unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_TILL)
-											and (
-												( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
-												and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )
-											)
-										, coalesce(SV.A_STATUS)
-										, if(
-											unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_FROM)
-											and unix_timestamp(NOW()) > unix_timestamp(SV.HANGUP_TILL)
-											and SV.HANGUP_FROM<SV.HANGUP_TILL
-											and (
-			( SV.HANGUP_TILL<>'0000-00-00' and SV.HANGUP_TILL is not NULL )
-			and ( SV.HANGUP_FROM<>'0000-00-00' and SV.HANGUP_FROM is not null )) , 'ERROR1', 
-			'ERROR2'
-			)
-			)      
-			)    
-			)
-			)
-			)    
-			)
-		)
- */
-/*
-		$id_offers_off = array();
-		$sql = "select
-				s.``
-				, s.`ID_OFFERS`
-			from `SERVICES` as s
-			where
-				s.`ID_DEALS_TABLE`='{$old_deal->ID}'
-				and s.`ID_BILLING_USERS`='{$user_id}'
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$id_offers_off[] = $r;
-		}
- */
-		$ret_id = $db->ADD_NEW_OBJ('DEALS_TABLE', $sql_obj);
-		return $ret_id;
-	}
-
-}
-
-
-class Lay_Html_Toggle {
-
-	public static function start($title, $attrs = array()) {
-		$cls = array();
-		$cls[] = 'may-hide';
-		if (array_key_exists('open', $attrs) && $attrs['open'] == false) $cls[] = 'hide';
-		echo'<div class="'.implode(' ', $cls).'">';
-		$st = array();
-		$st[] = 'margin-bottom:0';
-		if (!empty($attrs['color'])) $st[] = 'color:'.$attrs['color'];
-		echo'<h4 style="'.implode(';', $st).'">'.$title;
-			echo'<a class="btn-hide" href="#" onclick="'."return hide(this);".'">'."-".'</a>';
-			echo'<a class="btn-show" href="#" onclick="'."return hide(this);".'">'."+".'</a>';
-		echo'</h4>';
-		echo'<div class="to-hide">';
-	}
-
-	public static function end() {
-			echo'</div>';// .to-hide
-		echo'</div>';// .may-hide'
-	}
-
-	public static function show_js() {
-		echo'<script type="text/javascript">'."
-		function hide(n){
-			jQuery(n).parent().parent().toggleClass('hide');
-			return false;
-		}
-		".'</script>';
-	}
-
-}
-
-
-class FunkcjeL1 {
-
-	public static function bankowy_make_nrach($NR_RACH_MASS_PAY, $ID_BILLING_USERS, $ID_BILLING_NUMBERS) {
-		//echo "TTUTAJ <hr> AASDADS f. bankowy_make_nrach($NR_RACH_MASS_PAY,$ID_BILLING_USERS,$ID_BILLING_NUMBERS) <br>";
-		$ID_BILLING_USERS = str_pad($ID_BILLING_USERS, 10, 0, STR_PAD_LEFT);
-		$ID_BILLING_NUMBERS = str_pad($ID_BILLING_NUMBERS, 2, 0, STR_PAD_LEFT);
-		$ID_BILLING_NUMBERS = substr($ID_BILLING_NUMBERS, -2);
-		$NN = self::bankowy_make($NR_RACH_MASS_PAY . $ID_BILLING_NUMBERS . $ID_BILLING_USERS);
-		if ($NN) return $NN . $NR_RACH_MASS_PAY . $ID_BILLING_NUMBERS . $ID_BILLING_USERS;
-	}
-
-	public static function bankowy_make($nrb) {
-		$nrb = preg_replace("/[^0-9]/", "", $nrb);
-		if (strlen($nrb) <> 24) return 0;
-		$nrb .= "252100";
-		$modulo = self::my_bcmod($nrb, 97);
-		$modulo = 98 - $modulo;
-		if (strlen($modulo) == 1) {
-			$modulo = "0" . $modulo;
-		}
-		return $modulo;
-	}
-
-	public static function my_bcmod($x, $y) {
-		// how many numbers to take at once? carefull not to exceed (int)
-		$take = 5;    
-		$mod = '';
-		do {
-			$a = (int)$mod . substr($x, 0, $take);
-			$x = substr($x, $take);
-			$mod = $a % $y;
-		} while (strlen($x));
-		return (int)$mod;
-	}
-
-	public static function bankowy_formatuj_nrach($NR_RACH_MASS_PAY) {
-		$NR_RACH_MASS_PAY_FORMATTED = '';
-		if ($NR_RACH_MASS_PAY) {
-			for ($i = 4; $i < strlen($NR_RACH_MASS_PAY); $i += 4) {
-				$NR_RACH_MASS_PAY_FORMATTED = " " . substr($NR_RACH_MASS_PAY, -$i, 4) . $NR_RACH_MASS_PAY_FORMATTED;
-			}
-			$NR_RACH_MASS_PAY_FORMATTED = substr($NR_RACH_MASS_PAY, 0, $i - strlen($NR_RACH_MASS_PAY)) . " " . $NR_RACH_MASS_PAY_FORMATTED;
-		}
-		return $NR_RACH_MASS_PAY_FORMATTED;
-	}
-
-	public static function policz($l,$t1,$t2,$t3) {
-		$j = array("", "jeden ", "dwa ", "trzy ", "cztery ", "pięć ", "sześć ",
-		"siedem ", "osiem ", "dziewięć ", "dziesięć ", "jedenaście ", 
-		"dwanaście ", "trzynaście ", "czternaście ", "piętnaście ", 
-		"szesnaście ", "siedemnaście ", "osiemnaście ", "dziewiętnaście ");
-		$d = array("", "", "dwadzieścia ", "trzydzieści ", "czterdzieści ",
-		"pięćdziesiąt ", "sześćdziesiąt ", "siedemdziesiąt ", 
-		"osiemdziesiąt ", "dziewięćdziesiąt ");
-		$s = array("","sto ", "dwieście ", "trzysta ", "czterysta ", "pięćset ",
-		"sześćset ", "siedemset ", "osiemset ", "dziewięćset ");
-
-		$txt = $s[0+substr($l,0,1)];
-		if (substr($l,1,2)<20) {
-			$txt .= $j[0+substr($l,1,2)];
-		}
-		else {
-			$txt .= $d[0+substr($l, 1,1)].$j[0+substr($l, 2,1)];
-		}
-		if ($l<>0) {
-			if ($l==1) {
-				$txt .= "$t1 ";
-			} else {
-				if ((substr($l,2,1)==2 or substr($l,2,1)==3 or substr($l,2,1)==4) and (substr($l,1,2)>20 or substr($l,1,2)<10)) {
-					$txt .= "$t2 ";
-				} else {
-					$txt .= "$t3 ";
-				}
-			}
-		}
-		return $txt;
-	}
-
-	public static function slownie($liczba) {
-		$txt = '';
-		$kwota = explode(".", $liczba);
-		if (strlen($kwota[1])==1) $kwota[1] = $kwota[1]."0";
-		$kwotazl = sprintf("%012d",$kwota[0]);
-		$kwotagr = sprintf("%03d",$kwota[1]);
-		$txt .= self::policz(substr($kwotazl, 0,3),"miliard","miliardy","miliardów");
-		$txt .= self::policz(substr($kwotazl, 3,3),"milion","miliony","milionów");
-		$txt .= self::policz(substr($kwotazl, 6,3),"tysiąc","tysiące","tysięcy");
-		$txt .= self::policz(substr($kwotazl, 9,3),"złoty","złote","złotych");
-		if ($kwotazl==0) $txt .= "zero złotych ";
-		$txt .= " i ";
-		$txt .= self::policz($kwotagr,"grosz","grosze","groszy");
-		if ($kwotagr==0) $txt .= "zero groszy";
-		return $txt;
-	}
-
-	public static function formatuj_grosze($kwota) {
-		$kwota = round($kwota, 2);
-		$liczba = explode(".", $kwota);
-		if (!$liczba[1]) {
-			$liczba = explode(",", $kwota);
-			if (!$liczba[1]) $liczba[1] = "00";
-		}
-		if (strlen($liczba[1]) == 1) $liczba[1] = $liczba[1] . "0";
-		$liczba_out = $liczba[0] . "." . "$liczba[1]";
-		return $liczba_out;
-	}
-
-	public static function billing_billwiev_przeterminowania($ID_BILLING_USERS_PARAM, $IF_PRINT_PARAM, $ECHO_PARAM) {
-		global $vdb
-			, $STOPA_ODSETEK // from billing-l1/www/config.php
-			, $form_mail_sender // billing-l1/www/config.php:24:$form_mail_sender="/usr/bin/mutt";
-			, $form_send_from_param // billing-l1/www/config.php:19:$form_send_from_param="biall-net@biall.net.pl";
-		;
-
-		//NAGLOWKI DO HTML MAILA
-		$naglowki  = "From: ".$form_send_from_param."\r\n";
-		$naglowki .= "MIME-Version: 1.0\r\n";
-		$naglowki .= "Content-type: text/html; charset=iso-8859-1\r\n";
-
-		//PODRECZNE_ZAPYTANIE_SLOWNIKOWE_DO_TYPOW_DOKUMENTOW
-		$BNT = array();
-		$bnt_types = WindykacjaStatsModel::get_billing_types();
-		foreach ($bnt_types as $k_type_id => $h_type) {
-			$BNT[$h_type['ID']] = $h_type['TYPE'];
-		}
-
-	echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">bnt_types: ';print_r($bnt_types);echo'</pre>';
-	echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">BNT: ';print_r($BNT);echo'</pre>';
-
-		if ($_GET['ID_BILLING_USERS_PARAM']) $ID_BILLING_USERS_PARAM = $_GET['ID_BILLING_USERS_PARAM'];
-
-		if (!$IF_PRINT_PARAM && !$ECHO_PARAM) {
-			echo'<p style="text-align:right">';
-			echo"<a href=\"javascript:openWindow('/modules/make_billing/edit.php?op=zadluzenia&print=1&FIRMA=1&uid=$ID_BILLING_USERS_PARAM','print','scrollbars,resizable=yes,width=750,height=550')\">";
-			echo"<img border=\"0\" src=\"$xpath/ico/kw.gif\" width=\"16\" height=\"16\" alt=\"Zadłużenia\">";
-			echo"Druki wezwania do zaplaty";
-			echo"</a>";
-			echo'</p>';
-		}
-
-		$user_id = $ID_BILLING_USERS_PARAM;
-		$billing_account_files = WindykacjaStatsModel::get_billing_account_files($user_id);
-		echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billing_account_files: ';print_r($billing_account_files);echo'</pre>';
-	die('F.' . __FUNCTION__ . ' ...');
-
-		$NAGLOWEK = "<table border=\"1\" width=\"100%\"><tr><td>Płatnik</td><td>WINIEN</td><td>MA</td><td>DOK</td><td>Numer</td><td>(T)ermin pł./(D)ata ksiegowania </td><td>Dni przeterminowania</td><td>Kwota przeterminowana</td><td>Odsetki</td></tr>";
-		//while ($BAF = $vdb->sql_fetchrow($result)) {
-		foreach ($billing_account_files as $BAF) {
-			//RESETUJEMY FORM - jak nie chcemy pojedynczego odczytu:
-			if (!$ID_BILLING_USERS_PARAM) unset($FORM);
-			if (!$LAST_PLATNIK) $LAST_PLATNIK = $BAF[1];
-			if (!$LPD) $LPD = $BAF;
-			if (($BAF[0] <> $LAST_ID)) {// ID
-				//DRUKUJEMY_STARE_PODSUMOWANIE (DLA_FAKTURY POJEDYNCZEJ)
-				if ($LAST_ID) {
-					$FORM_2.="<tr><td></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL[WINIEN])."</b></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL[MA])."</b></td><td colspan=\"3\"></td>";
-					$FORM_S.= "<tr><td></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL[WINIEN])."</b></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL[MA])."</b></td><td colspan=\"3\"></td>";
-					$LDNI = floor((date("U") - $DOC_TERM) / 86400) ; 
-					if(($LDNI>0) && ($DOC_TERM) && ($LTOTAL['WINIEN_MA'] == "WINIEN")) {
-						$LODSETKI= FunkcjeL1::formatuj_grosze($LTOTAL[$LTOTAL[WINIEN_MA]] * $STOPA_ODSETEK  * $LDNI / 365);
-						$POD_ODSETEK=$LTOTAL[$LTOTAL['WINIEN_MA']];
-						$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI;
-						$PLATNIK_DATA['PRZETER']['WINIEN'] += $LTOTAL[$LTOTAL['WINIEN_MA']];
-					} else {
-						unset($LODSETKI);
-						unset($LDNI);
-						unset($POD_ODSETEK);
-					}
-					$FORM_2.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
-					$FORM_2.= "<td>$LODSETKI</td>";
-					$FORM_S.= "<td>---</td><td>---</td><td>---</td>";
-					//  if(!$PLATNIK_DATA[TOTAL][WINIEN]) 
-					$PLATNIK_DATA[TOTAL][WINIEN]+=FunkcjeL1::formatuj_grosze($LTOTAL[WINIEN]) ;
-					//  if(!$PLATNIK_DATA[TOTAL][MA])
-					$PLATNIK_DATA[TOTAL][MA]+=FunkcjeL1::formatuj_grosze($LTOTAL[MA]) ;
-					$FORM_2.= "</tr>";
-					$FORM_2.= "<tr><td colspan=\"6\"><hr></td></tr>";
-					$FORM_S.="</tr><tr><td colspan=\"6\"><hr></td></tr>";
-					$TOTAL[WINIEN]+=$LTOTAL[WINIEN] ; $TOTAL[MA]+=$LTOTAL[MA] ;
-					if ($LAST_PLATNIK <> $BAF[1]) {//PODSUMOWANIE_DLA_PLATNIKA
-						$TOTAL[PRZETER]+=$PLATNIK_DATA[PRZETER][WINIEN];
-						$TOTAL[ODSETKI]+=$PLATNIK_DATA[PRZETER][ODSETKI];
-						$FORM_2.= "<tr><td colspan=\"9\">Podsumowanie salda niezbilansowanych zobowiązań dla platnika $LAST_PLATNIK 
-						$LPD[P_NAME] $LPD[P_NAME_SECOND] $LPD[P_ADDRESS_CITY] $LPD[P_ADDRESS_STREET] $LPD[P_ADDRESS_HOUSE] $LPD[P_ADDRESS_HOME]
-						<br> WINIEN: <b>".$PLATNIK_DATA[TOTAL][WINIEN]."</b> - MA: <b>".$PLATNIK_DATA[TOTAL][MA]."</b>  DO ZAPŁATY: <b>".FunkcjeL1::formatuj_grosze($PLATNIK_DATA[TOTAL][WINIEN]-$PLATNIK_DATA[TOTAL][MA])."</b> " ;
-						if($PLATNIK_DATA[PRZETER][WINIEN]) $FORM_2.=", z czego przeterminowane <font color=\"red\"><b> ".FunkcjeL1::formatuj_grosze($PLATNIK_DATA[PRZETER][WINIEN])." </b></font> ";
-						if($PLATNIK_DATA[PRZETER][ODSETKI]) $FORM_2.= " ( aktualnie nalezne odsetki to ".$PLATNIK_DATA[PRZETER][ODSETKI]." PLN , które mogą zostać naliczone ) " ;
-						if($LPD[BA_TIMESTAMP]) $FORM_2.=" <br> Stan wzajemnych rozrachunków:  WINIEN: <b>$LPD[BA_WINIEN]</b> -  MA: <b>$LPD[BA_MA]</b>    SALDO(DO ZAPŁATY): <b>".FunkcjeL1::formatuj_grosze($LPD[BA_WINIEN]-$LPD[BA_MA])."</b> , i jest to stan na dzień ".date("Y-m-d",$LPD['BA_TIMESTAMP'])." ";
-						$RETURN_ARR="";
-						$FORM_S.="<tr><td colspan=\"9\"></td></tr></table>";
-						$FORM_2.="<br>W razie problemów prosimy o kontakt z biurem obsługi. <br><font size=\"1\" color=\"#CCCCCC\">webone billing system &copy;2004 by Arkadiusz Binder & www.grafnet.pl | finance module by A.Binder </font>";
-						$FORM_2.= "  </tr></table>";
-						$FORM_2 = "{$NAGLOWEK} \n {$FORM_2}";
-						$FORM_S= "{$NAGLOWEK} \n {$FORM_S}";
-						if ($IF_PRINT_PARAM) {
-							$delivery_subject="Stan rozrachunków dla  {$LPD[P_NAME]} {$LPD[P_NAME_SECOND]}"	;
-							$sql2="insert into HIST_CONTACTS (ID_BILLING_USERS,ID_BILLING_NUMBERS,SUBJECT,BODY_HTML,REQUEST_STATUS_MAIL) values
-							('".$LAST_PLATNIK."','','{$delivery_subject}','{$FORM_2}','CONFIRM_SENT_MAIL') ";
-							$res = $vdb->sql_query($sql2) ;
-							echo "<hr> $sql2 <hr>****"; 
-						} else if (!$ECHO_PARAM) {
-							echo $FORM_2;
-						}
-						$LAST_PLATNIK=$BAF[1];
-						unset($PLATNIK_DATA);
-						$FORM.=$FORM_2 ;
-						unset($FORM_2);
-						$FORM_SS.=$FORM_S ;
-						unset($FORM_S);
-					} else {
-					}
-					//$PLATNIK_DATA[TOTAL][WINIEN]+=$BAF[2];
-					//$PLATNIK_DATA[TOTAL][MA]+=$BAF[3];
-					$LPD = $BAF;
-					$LAST_PLATNIK = $BAF[1];
-				}
-				else {
-				}
-				//DODAJEMY_NOWY_REKORD_OD_SAMEJ_PLATNOSCI
-				unset($LTOTAL);
-				$FORM_2.= "<tr><td>$BAF[1]</td><td>$BAF[2]</td><td>$BAF[3]</td><td>".$BNT[$BAF[4]]."</td><td>$BAF[5]/$BAF[6]</td>   <td colspan=\"1\">";
-				if ($BAF[19]) $FORM_2.="T: ".date("Y-m-d",$BAF[19])." "; else  $FORM_2.="D: ".date("Y-m-d",$BAF['BAF_TIMESTAMP'])." "; 
-				$FORM_2.="</td></tr>";
-				$FORM_S.= "<tr><td>$BAF[1]</td><td>$BAF[2]</td><td>$BAF[3]</td><td>".$BNT[$BAF[4]]."</td><td>$BAF[5]/$BAF[6]</td>   <td colspan=\"1\">";
-				if($BAF[19])$FORM_S.="T: ".date("Y-m-d",$BAF[19])." "; else  $FORM_2.="D: ".date("Y-m-d",$BAF['BAF_TIMESTAMP'])." "; 
-				$FORM_S.="</td></tr>";
-				$DOC_TERM = $BAF[19];
-				if ($BAF[2] > 0) $LTOTAL['WINIEN_MA'] = "WINIEN"; else $LTOTAL['WINIEN_MA'] = "MA";
-				$LTOTAL[$LTOTAL['WINIEN_MA']] = $BAF[2] + $BAF[3];
-			} else {
-				//DRUKUJEMY_PODSTUMOWANIE_STAREGO i ZAPODAJEMY NOWY_REKORD
-			}
-
-			if ($BAF[12]) {// ID_FIN_WINIEN_VAL
-				$FORM_2.= "<tr><td colspan=\"1\"></td>";
-				$FORM_S.= "<tr><td colspan=\"1\"></td>";
-				if($LTOTAL['WINIEN_MA']=="MA") { 
-				$FORM_2.= "<td><font color=\"green\"><b> $BAF[12] </b> </font></td>";
-				$FORM_2.= "<td></td>";
-				$FORM_S.="<td><font color=\"green\"><b> $BAF[12] </b> </font></td><td></td>";
-				} else {
-				$FORM_2.= "<td></td>";
-				$FORM_2.= "<td><font color=\"green\"><b> $BAF[12] </b> </font></td>";
-				$FORM_S.="<td></td><td><font color=\"green\"><b> $BAF[12] </b> </font></td>";
-				} 
-				$FORM_2.= "<td>".$BNT[$BAF[8]]."</td>";
-				$FORM_2.= "<td> $BAF[9]/$BAF[10] </td><td>D: ".date("Y-m-d",$BAF[11])."</td> ";
-
-				$FORM_S.= "<td>".$BNT[$BAF[8]]."</td>";
-				$FORM_S.= "<td> $BAF[9]/$BAF[10] </td><td>D: ".date("Y-m-d",$BAF[11])."</td> ";
-
-				$LDNI = floor(($BAF[11] - $DOC_TERM) / 86400);
-				if (($LDNI > 0) && ($DOC_TERM) && ($LTOTAL['WINIEN_MA'] == "WINIEN")) {
-					$DOC_TERM = $BAF[11];
-					$LODSETKI = FunkcjeL1::formatuj_grosze($LTOTAL[$LTOTAL['WINIEN_MA']] * $STOPA_ODSETEK  * $LDNI / 365);
-					$POD_ODSETEK = $LTOTAL[$LTOTAL['WINIEN_MA']];
-					$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI;
-				} else {
-					unset($LODSETKI);
-					unset($LDNI);
-					unset($POD_ODSETEK);
-				}
-				$FORM_2.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
-				$FORM_2.= "<td>$LODSETKI</td>";
-				$FORM_2.= "</tr>";
-				$FORM_S.="<td>---</td><td>---</td><td>---</td></tr>";
-				$LTOTAL[$LTOTAL['WINIEN_MA']] -= $BAF[12];
-			}
-
-			if ($BAF[18]) {// ID_FIN_MA_VAL
-				$FORM_2.= "<tr><td colspan=\"1\"></td>";
-				$FORM_S.= "<tr><td colspan=\"1\"></td>";
-				if ($LTOTAL['WINIEN_MA'] == "MA") {
-					$FORM_2.= "<td><font color=\"red\"><b> $BAF[18] </b> </font></td>";
-					$FORM_2.= "<td></td>";
-					$FORM_S.= "<td><font color=\"red\"><b> $BAF[18] </b> </font></td><td></td>";
-				} else {
-					$FORM_2.= "<td></td>";
-					$FORM_2.= "<td><font color=\"red\"><b> $BAF[18] </b> </font></td>";
-					$FORM_S.="<td></td><td><font color=\"red\"><b> $BAF[18] </b> </font></td>";
-				} 
-				$FORM_2.= "<td>".$BNT[$BAF[14]]."</td>";
-				$FORM_2.= "<td> $BAF[15]/$BAF[16] </td> <td>D: ".date("Y-m-d",$BAF[17])."</td> ";
-				$FORM_S.="<td>".$BNT[$BAF[14]]."</td> <td> $BAF[15]/$BAF[16] </td> <td>D: ".date("Y-m-d",$BAF[17])."</td> ";
-
-				$LDNI=floor(($BAF[17] - $DOC_TERM) / 86400) ; 
-				//				$LDNI=10;
-				if (($LDNI > 0) && ($DOC_TERM) && ($LTOTAL['WINIEN_MA'] == "WINIEN")) {
-					$LODSETKI = FunkcjeL1::formatuj_grosze($LTOTAL[$LTOTAL[WINIEN_MA]] * $STOPA_ODSETEK  * $LDNI / 365);
-					$POD_ODSETEK = $LTOTAL[$LTOTAL['WINIEN_MA']];
-					$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI;
-				} else {
-					unset($LODSETKI);
-					unset($LDNI);
-					unset($POD_ODSETEK);
-				}
-				$FORM_2.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
-				$FORM_S.= "<td>$LDNI</td><td>$POD_ODSETEK</td>";
-				$FORM_2.= "<td>$LODSETKI</td>";
-				$FORM_S.= "<td>$LODSETKI</td>";
-				$FORM_2.= "</tr>";
-				$FORM_S.= "</tr>";
-				$LTOTAL[$LTOTAL['WINIEN_MA']]-=$BAF[18] ;
-			}
-
-			$LAST_ID = $BAF[0];
-			$L_BAF = $BAF;
-		}//eof SQL while($BAF=$vdb->sql_fetchrow($result)) {
-
-		//DODANIE_ZESTAWIENIA KOPIA_Z_GORY
-
-		//DRUKUJEMY_STARE_PODSUMOWANIE (DLA_FAKTURY POJEDYNCZEJ)
-		if ($LAST_ID) {
-			$FORM_2.="<tr><td></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL['WINIEN'])."</b></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL['MA'])."</b></td><td colspan=\"3\"></td>";
-			$FORM_S.="<tr><td></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL['WINIEN'])."</b></td><td><b>".FunkcjeL1::formatuj_grosze($LTOTAL['MA'])."</b></td><td colspan=\"3\"></td>";
-
-			$LDNI = round((date("U") - $DOC_TERM) / 86400, 0);
-			if (($LDNI > 0) && ($DOC_TERM)) {
-				$LODSETKI = FunkcjeL1::formatuj_grosze($LTOTAL[$LTOTAL['WINIEN_MA']] * $STOPA_ODSETEK  * $LDNI / 365);
-				$POD_ODSETEK = $LTOTAL[$LTOTAL['WINIEN_MA']];
-				$PLATNIK_DATA['PRZETER']['ODSETKI'] += $LODSETKI ;
-				$PLATNIK_DATA['PRZETER']['WINIEN'] += $LTOTAL[$LTOTAL['WINIEN_MA']];
-			} else {
-				unset($LODSETKI);
-				unset($LDNI);
-				unset($POD_ODSETEK);
-			}
-			$FORM_2.= "<td>$LDNI</td><td>".FunkcjeL1::formatuj_grosze($POD_ODSETEK)."</td>";
-			$FORM_2.= "<td>$LODSETKI</td>";
-			$FORM_S.="<td>---</td><td>---</td><td>---</td>";
-
-			//  if(!$PLATNIK_DATA[TOTAL]['WINIEN'])
-			$PLATNIK_DATA['TOTAL']['WINIEN']+=FunkcjeL1::formatuj_grosze($LTOTAL['WINIEN']) ;
-			//  if(!$PLATNIK_DATA[TOTAL][MA])
-			$PLATNIK_DATA['TOTAL']['MA']+=FunkcjeL1::formatuj_grosze($LTOTAL['MA']) ;
-
-			$FORM_2.= "</tr>";
-			$FORM_2.= "<tr><td colspan=\"6\"><hr></td></tr>";
-			$FORM_S.="</tr><tr><td colspan=\"6\"><hr></td></tr>";
-			$TOTAL['WINIEN']+=$LTOTAL['WINIEN'] ; $TOTAL['MA']+=$LTOTAL['MA'] ;
-
-			if ($LAST_PLATNIK <> $BAF[1]) {//PODSUMOWANIE_DLA_PLATNIKA
-
-				$TOTAL['PRZETER'] += $PLATNIK_DATA['PRZETER']['WINIEN'];
-				$TOTAL['ODSETKI'] += $PLATNIK_DATA['PRZETER']['ODSETKI'];
-				if (!$LPD) $LPD = $L_BAF ;
-				$FORM_2.= "<tr><td colspan=\"9\">Podsumowanie salda niezbilansowanych zobowiązań dla platnika $LAST_PLATNIK 
-				$LPD[P_NAME] $LPD[P_NAME_SECOND] $LPD[P_ADDRESS_CITY] $LPD[P_ADDRESS_STREET] $LPD[P_ADDRESS_HOUSE] $LPD[P_ADDRESS_HOME]
-				<br> WINIEN: <b>".$PLATNIK_DATA['TOTAL']['WINIEN']."</b> - MA: <b>".$PLATNIK_DATA['TOTAL']['MA']."</b> 
-				DO ZAPŁATY: <b>".FunkcjeL1::formatuj_grosze($PLATNIK_DATA['TOTAL']['WINIEN']-$PLATNIK_DATA['TOTAL']['MA'])."</b> " ;
-				if ($PLATNIK_DATA['PRZETER']['WINIEN']) $FORM_2.=", z czego przeterminowane <font color=\"red\"><b> ".FunkcjeL1::formatuj_grosze($PLATNIK_DATA['PRZETER']['WINIEN'])." </b></font> ";
-				if ($PLATNIK_DATA['PRZETER']['ODSETKI']) $FORM_2.= " ( aktualnie nalezne odsetki to ".$PLATNIK_DATA['PRZETER']['ODSETKI']." PLN , które mogą zostać naliczone ) " ;
-				if ($LPD['BA_TIMESTAMP']) $FORM_2.=" <br> Stan wzajemnych rozrachunków:  WINIEN: <b>".$LPD['BA_WINIEN']."</b> -  MA: <b>".$LPD['BA_MA']."</b>    SALDO(DO ZAPŁATY): <b>".FunkcjeL1::formatuj_grosze($LPD['BA_WINIEN']-$LPD['BA_MA'])."</b> , i jest to stan na dzień ".date("Y-m-d",$LPD['BA_TIMESTAMP'])." ";
-				$RETURN_ARR="";
-				$FORM_S.="<tr><td colspan=\"9\"></td></tr></table>";
-
-				$FORM_2.="<br>W razie problemów prosimy o kontakt z biurem obsługi. <br><font size=\"1\" color=\"#CCCCCC\">webone billing system &copy;2004 by Arkadiusz Binder & www.grafnet.pl | finance module by A.Binder </font>";
-				$FORM_2.= "  </tr></table>";
-
-
-				$FORM_2 = "{$NAGLOWEK} \n {$FORM_2}";
-				$FORM_S = "{$NAGLOWEK}{$FORM_S}";
-
-				//DRUKOWANIE ZESTAWIENIA
-				if ($IF_PRINT_PARAM) {
-					$delivery_subject="Stan rozrachunków dla  {$LPD['P_NAME']} {$LPD['P_NAME_SECOND']}"	;
-					//         exec("echo  \"Pliki zostały dołączone do załącznika\" | $form_mail_sender -n -a \"$filename\" $delivery_mail -s ".$delivery_subject."" );
-					$sql2="insert into HIST_CONTACTS (ID_BILLING_USERS,ID_BILLING_NUMBERS,SUBJECT,BODY_HTML,REQUEST_STATUS_MAIL) values
-						('".$LAST_PLATNIK."','','{$delivery_subject}','{$FORM_2}','CONFIRM_SENT_MAIL') ";
-					$res = $vdb->sql_query($sql2);
-					echo "<hr> {$sql2} <hr>***"; 
-				} else if (!$ECHO_PARAM) {
-					echo $FORM_2;
-				}
-				//EOF DRUKOWANIE ZESTAWIENIA itp
-
-				$LAST_PLATNIK = $BAF[1];
-				$ECHO_DATA=$PLATNIK_DATA;
-				unset($PLATNIK_DATA);
-
-				$FORM .= "{$FORM_2}</table>";
-				$FORM_SS .= "{$FORM_S}</table>";
-				unset($FORM_2);
-				unset($FORM_S);
-			}
-		}
-
-		$FORM_2.= $NAGLOWEK;
-		$FORM_2.= "<tr><td>TOT</td><td><b>{$TOTAL['WINIEN']}</b></td><td><b>{$TOTAL['MA']}</b></td><td colspan=\"4\"></td>
-			<td><b>{$TOTAL['PRZETER']}</b></td><td><b>{$TOTAL['ODSETKI']}</b></td></tr>";
-		$FORM_2 .= "</table>";
-		if (!$ECHO_PARAM)	echo "{$FORM_2}";
-		$FORM_S.=  "</table> ";
-		if ($ECHO_PARAM == "zadluzenie") return FunkcjeL1::formatuj_grosze($ECHO_DATA['PRZETER']['WINIEN']);
-		if ($ECHO_PARAM == "saldo") return FunkcjeL1::formatuj_grosze($LPD['BA_WINIEN']-$LPD['BA_MA']);
-		if ($ECHO_PARAM == "zadluzenie_lista") return $FORM;
-		if ($ECHO_PARAM == "saldo_rok") {
-			$L_BAF['FORM'] = $FORM;
-			$L_BAF['FORM_SALDO'] = $FORM_SS;
-			return $L_BAF;
-		}
-	}
-
-}

+ 2 - 7
SE/superedit-WINDYKACJA_ZESTAWIENIE_NADPLATY_VECTRA.php

@@ -1,15 +1,10 @@
 <?php
 
 require_once APP_PATH_ROOT . DS . 'superedit-USERS2_WINDYKACJA_STATUS.php';
+Lib::loadClass('Windykacja_View');
 
 function WINDYKACJA_ZESTAWIENIE_NADPLATY_VECTRA() {
 
-	$db = DB::getDB();
-	if (!$db) {
-		echo '<div class="alert alert-danger">' . "Database Error" . '</div>';
-		return;
-	}
-
 	$task = V::get('task', '', $_REQUEST);
 	if ('zest_month' == $task) {
 		$args = array();
@@ -29,7 +24,7 @@ function WINDYKACJA_ZESTAWIENIE_NADPLATY_VECTRA() {
 		$args['DATE_LIMIT'] = sprintf("%4d-%02d-01", $args['year'], $args['month']);
 
 		$_GET['DATE_LIMIT'] = $args['DATE_LIMIT'];
-		WindykacjaView::zestawienie_vectra_nadplaty();
+		Windykacja_View::zestawienie_vectra_nadplaty();
 		die();
 	}
 

+ 2 - 7
SE/superedit-WINDYKACJA_ZESTAWIENIE_ZADLUZENIA_VECTRA.php

@@ -1,15 +1,10 @@
 <?php
 
 require_once APP_PATH_ROOT . DS . 'superedit-USERS2_WINDYKACJA_STATUS.php';
+Lib::loadClass('Windykacja_View');
 
 function WINDYKACJA_ZESTAWIENIE_ZADLUZENIA_VECTRA() {
 
-	$db = DB::getDB();
-	if (!$db) {
-		echo '<div class="alert alert-danger">' . "Database Error" . '</div>';
-		return;
-	}
-
 	$task = V::get('task', '', $_REQUEST);
 	if ('zest_month' == $task) {
 		$args = array();
@@ -29,7 +24,7 @@ function WINDYKACJA_ZESTAWIENIE_ZADLUZENIA_VECTRA() {
 		$args['DATE_LIMIT'] = sprintf("%4d-%02d-01", $args['year'], $args['month']);
 
 		$_GET['DATE_LIMIT'] = $args['DATE_LIMIT'];
-		WindykacjaView::zestawienie_vectra_zadluzenia();
+		Windykacja_View::zestawienie_vectra_zadluzenia();
 		die();
 	}