_docs = array(); $this->_saldo = 0; } public function add_bill_doc($date, $type, $item) { $bill_doc = new Windykacja_BillingDoc($date, $type, $item); if ('FVAT' == $type && '0000-00-00' == $date) { $date = $item['BILL_DATE']; } $this->_docs[$date][] = $bill_doc; if ($date <= date("Y-m-d")) { $this->_saldo += $bill_doc->get_saldo(); } } public function add_event($date, $type, $item) { $event = new Windykacja_EventDoc($date, $type, $item); $this->_docs[$date][] = $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'
POMIŃ! $vDoc pay_term('.$vDoc->get('PAYMENT_TERM').') ';print_r($vDoc);echo'';
} else {
//echo'$vDoc pay_term('.$vDoc->get('PAYMENT_TERM').'/'.($vDoc->get('PAYMENT_TERM') > $dateMinus30dni).') ';print_r($vDoc);echo'';
$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);
}
function set_saldo_for_all_docs() {
$saldo = 0;
foreach ($this->_docs as $day => $listDayDocs) {
foreach ($listDayDocs as $doc) {
$saldo += $doc->get_saldo();
$doc->set_saldo_overall($saldo);
}
}
}
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 $_date;
var $_data;
var $_class;
var $_saldo;
var $_saldo_overall;
public function get_type() { return $this->_type; }
public function get_date() { return $this->_date; }
public function get_data() { return $this->_data; }
public function get_class() { return $this->_class; }
public function get_saldo() { return $this->_saldo; }
public function get($key) {
return $this->_data[$key];
}
public function get_saldo_overall() { return $this->_saldo_overall; }
public function set_saldo_overall($overallSaldo) {
$this->_saldo_overall = round($overallSaldo, 2);
}
}
class Windykacja_EventDoc extends Windykacja_TimelineDoc {
public function __construct($date, $type, &$data) {
$this->_date = $date;
$this->_data = $data;
$this->_class = 'EVENT';
$this->_type = $type;
$this->_saldo = 0;
}
}
class Windykacja_BillingDoc extends Windykacja_TimelineDoc {
public function __construct($date, $type, &$data) {
$this->_date = $date;
$this->_data = $data;
$this->_class = 'BILLING';
$this->_convert_type($type);
$this->_count_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:
}
}
}