_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: } } }