"margin-bottom: 24px; border-bottom: 1px solid #eee" ], "Dodaj notatkę ze spotkania z klientem {$idUser}");
Windykacja_View::viewUserInfo($idUser);
$postTask = V::get('_postTask', '', $_POST);
switch ($postTask) {
case 'saveConcat': $this->saveContactPostTask($idUser); break;
case '': break;
default: throw new Exception("Not implemented postTask '{$postTask}'");
}
$this->viewSaveContactForm($idUser);
echo UI::h('hr');
$this->viewUserPaymentContactsHistory($idUser);
}
function viewSaveContactForm($idUser) {
$windykInfo = Windykacja_View::getWindykacjaInfo($idUser);
$windykStatusInfo = ($windykInfo) ? $windykInfo['A_STATUS_INFO'] : '';
$windykReminder = ($windykInfo && (
!empty($windykInfo['L_APPOITMENT_USER'])
|| ( !empty($windykInfo['L_APPOITMENT_DATE']) && '0000-00-00' != $windykInfo['L_APPOITMENT_DATE'] )
|| !empty($windykInfo['L_APPOITMENT_INFO'])
)) ? [
'Pracownik' => $windykInfo['L_APPOITMENT_USER'],
'Data przypomnienia' => $windykInfo['L_APPOITMENT_DATE'],
'Adnotacje' => $windykInfo['L_APPOITMENT_INFO'],
] : null;
$args = [];
$args['L_APPOITMENT_USER'] = V::get('L_APPOITMENT_USER', User::getLogin(), $_POST);
$args['L_APPOITMENT_DATE'] = V::get('L_APPOITMENT_DATE', date("Y-m-d H:i"), $_POST);
$args['L_APPOITMENT_TYPE'] = V::get('L_APPOITMENT_TYPE', '', $_POST);
$args['L_APPOITMENT_INFO'] = V::get('L_APPOITMENT_INFO', '', $_POST);
$args['change_windykacja_status'] = V::get('change_windykacja_status', '', $_POST);
$args['A_STATUS_INFO'] = V::get('A_STATUS_INFO', $windykStatusInfo, $_POST);
$args['add_reminder'] = V::get('add_reminder', '', $_POST);
$args['REMINDER_USER'] = V::get('REMINDER_USER', User::getLogin(), $_POST);
$args['REMINDER_DATE'] = V::get('REMINDER_DATE', '', $_POST);
$args['REMINDER_INFO'] = V::get('REMINDER_INFO', '', $_POST);
echo UI::h('form', [ 'method' => "POST" ], [
UI::h('input', [ 'type' => "hidden", 'name' => '_postTask', 'value' => "saveConcat" ]),
UI::h('input', [ 'type' => "hidden", 'name' => 'id_user', 'value' => $idUser ]),
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-6" ], [
UI::h('label', [], "Pracownik"),
UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'L_APPOITMENT_USER', 'value' => $args['L_APPOITMENT_USER'] ]),
]),
UI::h('div', [ 'class' => "col-md-3" ], [
UI::h('label', [], "Data spotkania"),
UI::h('div', [ 'class' => "input-group" ], [
UI::h('input', [ 'class' => "form-control se_type-datetime", 'data-format' => "yyyy-MM-dd hh:mm", 'type' => "text", 'name' => 'L_APPOITMENT_DATE', 'value' => $args['L_APPOITMENT_DATE'] ]),
UI::h('span', [ 'class' => "input-group-addon" ], [
UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
]),
]),
]),
UI::h('div', [ 'class' => "col-md-3" ], [
UI::h('label', [], "Rodzaj spotkania"),
UI::h('select', [ 'class' => "form-control", 'name' => 'L_APPOITMENT_TYPE', 'onChange' => "p5_addUserNote_handleChangeType(this)" ], [
UI::h('option', [ 'value' => "" ]),
UI::h('option', array_merge([ 'value' => 'LIVE' ], ('LIVE' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "LIVE"),
UI::h('option', array_merge([ 'value' => 'TEL' ], ('TEL' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "TEL"),
UI::h('option', array_merge([ 'value' => 'TEL_NIE_ODBIERA' ], ('TEL_NIE_ODBIERA' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "TEL_NIE_ODBIERA"),
UI::h('option', array_merge([ 'value' => 'MAIL' ], ('MAIL' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "MAIL"),
UI::h('option', array_merge([ 'value' => 'SMS' ], ('SMS' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "SMS"),
UI::h('option', array_merge([ 'value' => 'INNE' ], ('INNE' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "INNE"),
]),
]),
]),
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-12" ], [
UI::h('label', [], "Notatka ze spotkania"),
UI::h('textarea', array_merge(
[ 'class' => "form-control", 'type' => "text", 'name' => 'L_APPOITMENT_INFO', 'rows' => 3],
('TEL_NIE_ODBIERA' === $args['L_APPOITMENT_TYPE']) ? [ 'disabled' => 'disabled' ] : []
), $args['L_APPOITMENT_INFO']),
]),
]),
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-12", 'style' => "border:1px solid #eee" ], [
UI::h('div', [ 'class' => "checkbox" ], [
UI::h('label', [ 'style' => "font-size:14px; line-height:22px" ], [
UI::h('input', array_merge([
'type' => "checkbox",
'name' => "change_windykacja_status",
'onClick' => "document.getElementById('fld__change_windykacja_status').style.display = event.target.checked ? 'block' : 'none'",
], ($args['change_windykacja_status']) ? [ 'checked' => "checked" ] : [])),
" Zmień status windykacji (ustalenia z klientem)",
]),
]),
UI::h('div', [
'id' => "fld__change_windykacja_status",
'style' => "display:" . ($args['change_windykacja_status'] ? 'block' : 'none') . "; padding-bottom:12px",
], [
// UI::h('label', [], "Status windykacji:"),
UI::h('p', [], [
"Obecny status: ",
($windykStatusInfo) ? $windykStatusInfo : "brak",
]),
UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'A_STATUS_INFO', 'value' => $args['A_STATUS_INFO'] ]),
]),
]),
]),
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-12", 'style' => "border:1px solid #eee" ], [
UI::h('div', [ 'class' => "checkbox" ], [
UI::h('label', [ 'style' => "font-size:14px; line-height:22px" ], [
UI::h('input', array_merge([
'type' => "checkbox",
'name' => "add_reminder",
'onClick' => "document.getElementById('fld__add_reminder').style.display = event.target.checked ? 'block' : 'none'",
], ($args['add_reminder']) ? [ 'checked' => "checked" ] : [])),
" Przypomnienie",
]),
]),
UI::h('div', [
'id' => "fld__add_reminder",
'style' => "display:" . ($args['add_reminder'] ? 'block' : 'none') . "; padding-bottom:4px",
], [
($windykReminder) ? UI::h('div', [ 'style' => "border-left: 5px solid orange; padding:6px 12px; margin-bottom:12px" ], [
UI::h('p', [], "Obecne przypomnienie (Uwaga: zostanie nadpisane)"),
UI::hTable([ 'rows' => [ $windykReminder ], 'disable_lp' => true, 'style' => "margin-bottom:0" ]),
]) : '',
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-6" ], [
UI::h('label', [], "Pracownik"),
UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'REMINDER_USER', 'value' => $args['REMINDER_USER'] ]),
]),
UI::h('div', [ 'class' => "col-md-3" ], [
UI::h('label', [], "Data przypomnienia"),
UI::h('div', [ 'class' => "input-group" ], [
UI::h('input', [ 'class' => "form-control se_type-datetime", 'data-format' => "yyyy-MM-dd hh:mm", 'type' => "text", 'name' => 'REMINDER_DATE', 'value' => $args['REMINDER_DATE'] ]),
UI::h('span', [ 'class' => "input-group-addon" ], [
UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
]),
]),
]),
]),
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-9" ], [
UI::h('label', [], "Adnotacje"),
UI::h('textarea', [ 'class' => "form-control", 'type' => "text", 'name' => 'REMINDER_INFO' ], $args['REMINDER_INFO']),
]),
]),
]),
]),
]),
//
UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
UI::h('div', [ 'class' => "col-md-12" ], [
UI::h('button', [ 'class' => "btn btn-primary" ], "Zapisz notatkę"),
]),
]),
]);
echo UI::h('script', [], "
var DBG1 = true;
var DBG = false;
function p5_addUserNote_handleChangeType(n) {
DBG && console.log('DBG:p5_addUserNote_handleChangeType', { value: n.value, desc: n.form['L_APPOITMENT_INFO'] , n, form: n.form });
if ('TEL_NIE_ODBIERA' === n.value) {
n.form['L_APPOITMENT_INFO'].disabled = true
} else {
n.form['L_APPOITMENT_INFO'].disabled = false
}
}
");
}
function saveContactPostTask($idUser) {
$args = [];
$args['L_APPOITMENT_USER'] = V::get('L_APPOITMENT_USER', '', $_POST);
$args['L_APPOITMENT_DATE'] = V::get('L_APPOITMENT_DATE', '', $_POST);
$args['L_APPOITMENT_TYPE'] = V::get('L_APPOITMENT_TYPE', '', $_POST);
$args['L_APPOITMENT_INFO'] = V::get('L_APPOITMENT_INFO', '', $_POST);
$args['change_windykacja_status'] = V::get('change_windykacja_status', '', $_POST);
$args['A_STATUS_INFO'] = V::get('A_STATUS_INFO', '', $_POST);
$args['add_reminder'] = V::get('add_reminder', '', $_POST);
$args['REMINDER_USER'] = V::get('REMINDER_USER', '', $_POST);
$args['REMINDER_DATE'] = V::get('REMINDER_DATE', '', $_POST);
$args['REMINDER_INFO'] = V::get('REMINDER_INFO', '', $_POST);
try {
if (empty($args['L_APPOITMENT_USER'])) throw new Exception("Brak pracownika");
if (empty($args['L_APPOITMENT_DATE'])) throw new Exception("Brak daty spotkania");
if (empty($args['L_APPOITMENT_TYPE'])) throw new Exception("Brak rodzaju spotkania");
if (empty($args['L_APPOITMENT_INFO']) && 'TEL_NIE_ODBIERA' !== $args['L_APPOITMENT_TYPE']) throw new Exception("Brak treści notatki");
if ($args['change_windykacja_status']) {
if (empty($args['A_STATUS_INFO'])) throw new Exception("Brak statusu windykacji");
}
if ($args['add_reminder']) {
if (empty($args['REMINDER_USER'])) throw new Exception("Brak pracownika w przypomnieniu");
if (empty($args['REMINDER_DATE'])) throw new Exception("Brak daty przypomnienia");
if (empty($args['REMINDER_INFO'])) throw new Exception("Brak adnotacji przypomnienia");
}
$windykInfo = Windykacja_View::getWindykacjaInfo($idUser);
// create new record with L_APPOITMENT_* in table `USERS2_CONTACT`
$newContactItem = [
'ID_BILLING_USERS' => $idUser,
'L_APPOITMENT_USER' => $args['L_APPOITMENT_USER'],
'L_APPOITMENT_DATE' => $args['L_APPOITMENT_DATE'],
'L_APPOITMENT_TYPE' => $args['L_APPOITMENT_TYPE'],
'L_APPOITMENT_INFO' => $args['L_APPOITMENT_INFO'],
'SALDO' => $windykInfo['PAY_SALDO'],
'A_RECORD_CREATE_DATE' => "NOW()",
'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
];
$idCreated = DB::getPDO()->insert('USERS2_CONTACT', $newContactItem);
DB::getPDO()->insert('USERS2_CONTACT_HIST', array_merge($newContactItem, [ 'ID_USERS2' => $idCreated ]));
// update A_STATUS_INFO in `USERS2_WINDYKACJA_STATUS` if $args['change_windykacja_status']
if ($args['change_windykacja_status']) {
if ($windykInfo['A_STATUS_INFO'] != $args['A_STATUS_INFO']) {
$toUpdateWindyk = [
'A_STATUS_INFO' => $args['A_STATUS_INFO'],
'A_RECORD_UPDATE_DATE' => "NOW()",
'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
];
DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $idUser, $toUpdateWindyk);
DB::getPDO()->insert('USERS2_WINDYKACJA_STATUS_HIST', array_merge($toUpdateWindyk, [
'ID_USERS2' => $windykInfo['ID'],
]));
}
}
// update L_APPOITMENT_* fields using REMINDER_* in `USERS2_WINDYKACJA_STATUS` if $args['add_reminder']
if ($args['add_reminder']) {
DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $idUser, [
'L_APPOITMENT_USER' => $args['REMINDER_USER'],
'L_APPOITMENT_DATE' => $args['REMINDER_DATE'],
'L_APPOITMENT_INFO' => $args['REMINDER_INFO'],
'A_RECORD_UPDATE_DATE' => "NOW()",
'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
]);
}
} catch (Exception $e) {
DBG::log($e);
UI::alert('danger', $e->getMessage());
return;
}
throw new AlertSuccessException("Wprowadzono notatkę ze spotkania z klientem " . UI::h('a', [ 'href' => $this->getLink('', [ 'id_user' => $idUser ]) ], "wróć"));
}
function viewUserPaymentContactsHistory($idUser, $params = []) {
$markEventsFromSpotkanieNr = V::get('markEventsFromSpotkanieNr', 0, $params, 'int');
Lib::loadClass('Windykacja_StatsModel');
$billDocs = Windykacja_StatsModel::getBillDocsByDate($idUser);
$lastHist = DB::getPDO()->fetchAll("
select t.ID
, t.ID_BILLING_USERS
-- , t.CLIENT_INFO
, t.A_STATUS
-- , t.A_STATUS_INFO
, t.L_APPOITMENT_USER
, t.L_APPOITMENT_DATE
, t.L_APPOITMENT_TYPE
, t.L_APPOITMENT_INFO
, t.A_RECORD_CREATE_DATE
-- , IF('0000-00-00 00:00:00' = t.A_RECORD_UPDATE_DATE, t.A_RECORD_CREATE_DATE, t.A_RECORD_UPDATE_DATE) as A_RECORD_UPDATE_DATE
from USERS2_CONTACT t
where t.ID_BILLING_USERS = :id
and t.A_STATUS != 'DELETED'
limit 11
", [ ':id' => $idUser ]);
// DBG::nicePrint($lastHist, '$lastHist');
if (!empty($lastHist)) {
foreach ($lastHist as $bill_doc) {
$billDocs->add_event(substr($bill_doc['A_RECORD_CREATE_DATE'], 0, 10), 'HIST_CONTACT', $bill_doc);
}
}
// TODO: add zmiania statusu: select h.* from Windyk_HIST where A_STATUS_INFO != 'N/S;'
$umowy_l2 = Windykacja_StatsModel::getClientUmowy($idUser);
//echo'billDocs ';print_r($billDocs);echo'
';
//echo'billDocs ';print_r(reset($billDocs));echo'
';
//echo'umowy_l2 ';print_r($umowy_l2);echo'
';
if (!empty($umowy_l2)) {
foreach ($umowy_l2 as $h) {
$billDocs->add_event($h['P_DEALDATE'], 'UMOWA', $h);
if ($h['P_DEALDATE_TERM'] != '0000-00-00') {// < date('Y-m-d')) {
$billDocs->add_event($h['P_DEALDATE_TERM'], 'KONIEC UMOWY', $h);
}
}
}
$user_hist_events = Windykacja_StatsHelper::getUserHistStatusEvents($idUser);
if (!empty($user_hist_events)) {
foreach ($user_hist_events as $bill_doc) {
$billDocs->add_event($bill_doc['A_STATUS_UPDATE_DATE'], 'HIST_STATUS', $bill_doc);
}
}
$user_hist_events = Windykacja_StatsHelper::getUserHistPhoneEvents($idUser);
if (!empty($user_hist_events)) {
foreach ($user_hist_events as $bill_doc) {
$billDocs->add_event(substr($bill_doc['A_RECORD_UPDATE_DATE'], 0, 10), 'HIST_PHONE', $bill_doc);
}
}
$user_hist_events = Windykacja_StatsHelper::getUserBadAddressEvents($user->ID);
if (!empty($user_hist_events)) {
foreach ($user_hist_events as $bill_doc) {
$billDocs->add_event(substr($bill_doc['A_RECORD_UPDATE_DATE'], 0, 10), 'HIST_BAD_ADDRESS', $bill_doc);
}
}
// add today
$bill_doc = array();
$bill_doc['saldo'] = $billDocs->get_saldo();
$billDocs->add_event(date('Y-m-d'), 'TODAY', $bill_doc);
$billDocs->sort_docs();
$billDocs->set_saldo_for_all_docs();
$listBillDocs = $billDocs->get_docs(); // [ day => [ Windykacja_EventDoc, ... ], ... ]
// convert to: [ year => [ Windykacja_EventDoc, ... ] ]
$groupedByYearBillDocs = array_reduce($listBillDocs, function ($ret, $listDayEvents) {
foreach ($listDayEvents as $event) {
$year = substr($event->get_date(), 0, 4);
if (empty($ret[$year])) $ret[$year] = [];
array_unshift($ret[$year], $event);
}
return $ret;
}, []);
$groupedByYearBillDocs = array_reverse($groupedByYearBillDocs, true);
// DBG::nicePrint($listBillDocs, '$listBillDocs');
// DBG::nicePrint($groupedByYearBillDocs, '$groupedByYearBillDocs');
// UI::table([ 'caption' => "Historia kontaktów z klientem (TODO: w trakcie prac. Zobacz " .
// UI::h('a', [ 'href' => "index.php?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=&_f=&_user_id={$idUser}" ], "Panel windykacji") .
// ")", 'rows' => $lastHist ]);
// if (count($lastHist) > 10) UI::alert('info', "Przeglądaj wszystkie wpisy TODO: link to view table with ff_ID_BILLING_USERS");
echo UI::h('div', [], array_merge(
[
UI::h('h3', [], "Historia klienta"),
],
array_map(function ($listEventDocs, $year) use ($markEventsFromSpotkanieNr) {
return UI::h('details', array_merge([ 'style' => "margin:8px 0" ],
(date("Y") == $year) ? [ 'open' => "" ] : []
), [
UI::h('summary', [ 'style' => "height:20px; position:relative; cursor:pointer; outline:none" ], [
UI::h('div', [ 'style' => "position:absolute; top:9px; left:20px; width: 100%; border-bottom:2px solid #000" ]),
UI::h('span', [ 'style' => "position:absolute; top:0; left:12px; padding:0 12px 0 0; line-height:20px; background-color:#fff; font-weight:bold" ], [
"{$year}:",
]),
]),
UI::h('div', [ 'style' => "padding: 8px 0px 8px 54px" ],
array_merge(
[
UI::hTable([
'disable_lp' => true,
'@class' => 'table table-hover', // table-bordered
'cols' => [
'data',
'winien',
'ma',
'saldo',
'#',
'uwagi',
],
'@style[data]' => "width:80px; text-align:right",
'@style[winien]' => "width:90px; text-align:right",
'@style[ma]' => "width:90px; text-align:right",
'@style[saldo]' => "width:90px; text-align:right; background-color:#f5f5f5",
'@style[#]' => "width:140px; padding-left:12px; text-align:left",
'rows' => array_map(function ($eventDoc) use ($markEventsFromSpotkanieNr) {
$saldo = $eventDoc->get_saldo();
$overallSaldo = $eventDoc->get_saldo_overall();
$rowClass = "";
// $markEventsFromSpotkanieNr
if ($markEventsFromSpotkanieNr
&& $eventDoc->get_class() == 'EVENT' && $eventDoc->get_type() == 'HIST_CONTACT'
&& $eventDoc->get('ID') == $markEventsFromSpotkanieNr
) {
$rowClass = "info";
} else {
$rowClass = ('EVENT' === $eventDoc->get_class() && 'TODAY' === $eventDoc->get_type()) ? "warning" : "";
}
return [
'data' => $eventDoc->get_date(),
'winien' => UI::h('span', [
'style' => "color:" . ( (-1 * $saldo > 0) ? "#000" : "#ddd" ),
], ($saldo < 0) ? UI::price(-1 * $saldo) : 0
),
'ma' => UI::h('span', [
'style' => "color:" . ( ($saldo > 0) ? "#000" : "#ddd" ),
], ($saldo > 0) ? UI::price($saldo) : 0
),
'saldo' => UI::h('span', [
'style' => "color:" . ( ($overallSaldo >= 0) ? "green" : "red" ),
], UI::price($overallSaldo)
),
'#' => $this->viewUserPaymentContactsHistory_eventNr($eventDoc),
'uwagi' => $this->viewUserPaymentContactsHistory_eventLabel($eventDoc),
'@class' => $rowClass,
'@style[data]' => "text-align:right",
'@style[winien]' => "text-align:right",
'@style[ma]' => "text-align:right",
'@style[saldo]' => "text-align:right; background-color:#f5f5f5",
'@style[#]' => "padding-left:12px",
];
}, $listEventDocs),
]),
],
[]
)
),
]);
}, $groupedByYearBillDocs, array_keys($groupedByYearBillDocs))
));
}
function viewUserPaymentContactsHistory_eventNr($v_doc) { // return html (string)
/* 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
* https://biuro.biall-net.pl/dev-pl/se-master/index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=809557
*/
if ($v_doc->get_class() == 'BILLING' && 'FVAT' == $v_doc->get_type()) {
$nr = $v_doc->get_type();
Lib::loadClass('Windykacja_StatsModel');
$type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
if ($type_desc) {
$type_desc .= "\n Wystawiona: ".$v_doc->get('BILL_DATE')."\n Termin płatności: ".$v_doc->get('PAYMENT_TERM');
$nr = ''.$nr.'';
// TODO: podglad faktury
//if ($h['type'] == 'FVAT') $nr .= ' ID."&task=view_faktura&id=".$h['ID'].'" target="_blank">'.'
'.'';
}
$docNr = $v_doc->get('nr');
$docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
$nr .= ' '."({$docNrLabel})".'';
return $nr;
}
if ($v_doc->get_class() == 'BILLING' && 'KORV' == $v_doc->get_type()) {
$nr = $v_doc->get_type();
Lib::loadClass('Windykacja_StatsModel');
$type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
if ($type_desc) {
$nr = ''.$nr.'';
}
$docNr = $v_doc->get('nr');
$docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
$remoteFvNum = $v_doc->get('FV_NUMBER');
$korNr = $v_doc->get('ID_BILLING_NUMBERS');
$korTitle = "Korekta dotycząca faktury nr: {$remoteFvNum}";
$nr .= ' '."({$docNrLabel})".'';
return $nr;
}
if ($v_doc->get_class() == 'BILLING') {
$nr = $v_doc->get_type();
Lib::loadClass('Windykacja_StatsModel');
$type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
if ($type_desc) {
$nr = ''.$nr.'';
}
$docNr = $v_doc->get('nr');
$docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
return $nr;
}
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'TODAY') return "";
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_STATUS') return "";
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_PHONE') return "";
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_BAD_ADDRESS') return "";
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_CONTACT') return "Spotkanie " . UI::h('a', [
'href' => "index.php?_route=ViewTableAjax&namespace=default_db/USERS2_CONTACT#EDIT/" . $v_doc->get('ID'),
'target' => "_blank",
'title' => "Notatka ze spotkania",
], "(" . $v_doc->get('ID') . ")");
if ($v_doc->get_class() == 'EVENT') return UI::h('span', [ 'title' => $v_doc->get('ID') ], $v_doc->get_type()); // TODO: dla KP,KW: ID_BILLING_NUMBERS zamiast ID
return "???";
}
function viewUserPaymentContactsHistory_eventLabel($v_doc) { // return html (string)
if ($v_doc->get_class() == 'BILLING') return '';
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'TODAY') return '';
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_STATUS') {
$id_koresp = intval($v_doc->get('ID_KORESP'));
$add = '';
if ($id_koresp > 0) {
$koresp_edit_link = "index.php?_route=ViewTableAjax&namespace=default_db/IN7_DZIENNIK_KORESP#EDIT/{$id_koresp}";
$add = " " . '' . "KOR" . '';
}
switch ($v_doc->get('A_STATUS')) {
case 'WAITING': return "powrót do oczekujących {$add}";
case 'waiting-wezwanie2':return "wezwanie do zapłaty (Nr koresp.: ".$v_doc->get('ID_KORESP').") (termin: ".$v_doc->get('PAY_TERM').") {$add}";
case 'waiting-krd': return "wezwanie do zapłaty ost. (Nr koresp.: ".$v_doc->get('ID_KORESP').") (termin: ".$v_doc->get('PAY_TERM').") {$add}";
case 'N/S;': return "Nr koresp.: ".$v_doc->get('ID_KORESP')." (" . $v_doc->get('K_ZAWARTOS') . ")" .
(
($v_doc->get('ID_KORESP') > 0 && substr($v_doc->get('params'), 0, strlen('rozwiazanie umowy')) == 'rozwiazanie umowy')
? " " . 'ID}&id_koresp=".$v_doc->get('ID_KORESP').'" target="_blank" title="' . "Generuj druk rozwiązania umowy" . '">' . "druk" . ''
: ""
) . " {$add}"
;
// 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')).')';
default: return "zmiana statusu na: " . $v_doc->get('A_STATUS') . " ";
}
}
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_PHONE') {
$lastUpdateDate = $v_doc->get('A_RECORD_UPDATE_DATE');
$lastPhoneStatus = ('N/S;' === $v_doc->get('LAST_PHONE_STATUS')) ? '' : $v_doc->get('LAST_PHONE_STATUS');
if (!empty($lastPhoneStatus)) {
$date = $v_doc->get('PAY_TERM');
if ($date == 'N/S;') $date = '';
switch ($lastPhoneStatus) {
case 'nie_zaplaci': return "nie zapłaci";
case 'zaplaci_w_terminie': return "zapłaci w terminie {$date} " . '' . "(ustalono {$lastUpdateDate})" . '';
case 'zaplaci_za_1mc': return "zapłaci miesiąc później {$date} " . '' . "(ustalono {$lastUpdateDate})" . '';
case 'zaplaci_za_2mc': return "zapłaci 2 miesiące później {$date} " . '' . "(ustalono {$lastUpdateDate})" . '';
case 'zaplaci_za_3mc': return "zapłaci 3 miesiące później {$date} " . '' . "(ustalono {$lastUpdateDate})" . '';
default: return "kontakt z klientem: {$lastPhoneStatus} " . '' . "(ustalono {$lastUpdateDate})" . '';
}
}
$lastSmsStatus = $v_doc->get('LAST_SMS_STATUS');
if ($lastSmsStatus == 'N/S;') $lastSmsStatus = '';
if (!empty($lastSmsStatus)) {
$lastSmsId = $v_doc->get('LAST_SMS_MSG_ID');
return "SMS: {$lastSmsStatus} " . '' . "(wysłano {$lastUpdateDate})" . '';
}
$lastMailStatus = $v_doc->get('LAST_MAIL_STATUS');
if ($lastMailStatus == 'N/S;') $lastMailStatus = '';
if (!empty($lastMailStatus)) {
$lastMailId = $v_doc->get('LAST_MAIL_MSG_ID');
return "MAIL: {$lastMailStatus} " . '' . "(wysłano {$lastUpdateDate})" . '';
}
}
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_BAD_ADDRESS') {
$koresp_edit_link = "index.php?_route=ViewTableAjax&namespace=default_db/IN7_DZIENNIK_KORESP#EDIT/";
$add = ($v_doc->get('ID_KORESP') > 0)
? " - ID Koresp. (" . '' . $v_doc->get('ID_KORESP') . '' . ")"
: ""
;
return ($v_doc->get('BAD_ADDRESS'))
? "błędny adres zameldowania {$add}"
: "poprawa adresu zameldowania {$add}"
;
}
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'UMOWA') {
return "umowa nr ".$v_doc->get('P_DEALNUMBER')." (termin ".$v_doc->get('P_DEALDATE_TERM').")";
}
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'KONIEC UMOWY') {
return "zakończenie umowy nr ".$v_doc->get('P_DEALNUMBER')." (z dnia ".$v_doc->get('P_DEALDATE').")";
}
if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_CONTACT') {
return implode(" ", [
$v_doc->get('L_APPOITMENT_TYPE'),
$v_doc->get('L_APPOITMENT_INFO'),
UI::h('em', [], "(" . $v_doc->get('L_APPOITMENT_USER') . ")"),
]);
}
return "...";
}
function prepareTable() {
DB::getPDO()->execSql("
CREATE TABLE IF NOT EXISTS `USERS2_CONTACT` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ID_BILLING_USERS` int(11) NOT NULL DEFAULT '0',
`CLIENT_INFO` varchar(255) NOT NULL DEFAULT '',
`CLIENT_TEL` varchar(255) NOT NULL DEFAULT '',
`A_STATUS` enum('WAITING','NORMAL','DELETED') NOT NULL DEFAULT 'WAITING',
`A_STATUS_INFO` varchar(255) NOT NULL,
`L_APPOITMENT_DATE` date NOT NULL DEFAULT '0000-00-00',
`L_APPOITMENT_USER` varchar(20) NOT NULL DEFAULT '',
`L_APPOITMENT_PERIOD` varchar(4) NOT NULL,
`L_APPOITMENT_INFO` varchar(255) NOT NULL,
`L_APPOITMENT_TYPE` enum('','LIVE','TEL','TEL_NIE_ODBIERA','MAIL','SMS','INNE') DEFAULT NULL,
`A_RECORD_CREATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
`A_RECORD_UPDATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
`A_PROBLEM` enum('','WARNING','PROBLEM','SERIOUS','UNVERIFIED') DEFAULT NULL,
`A_PROBLEM_DESC` varchar(255) NOT NULL DEFAULT '',
`A_PROBLEM_DATE` varchar(30) NOT NULL DEFAULT '',
`T_WORKPOINTS` varchar(100) NOT NULL DEFAULT '',
`T_WORKPOINTS_VALUE` varchar(100) NOT NULL DEFAULT '',
`T_WORKPOINTS_TYPE` varchar(100) NOT NULL DEFAULT '',
`T_WORKPOINTS_USER` varchar(100) NOT NULL DEFAULT '',
`T_WORKPOINTS_DATE` varchar(100) NOT NULL DEFAULT '',
`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
`ROZLICZ_MONTH` date NOT NULL DEFAULT '0000-00-00',
`ROZLICZ_CONFIRM` int(11) NOT NULL DEFAULT '0',
`SALDO` decimal(10,2) NOT NULL DEFAULT '0.00',
`ILE_ODZYSKANO` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;
");
DB::getPDO()->execSql("
CREATE TABLE IF NOT EXISTS `USERS2_CONTACT_HIST` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ID_USERS2` int(11) NOT NULL,
`ID_BILLING_USERS` varchar(11) NOT NULL DEFAULT 'N/S;',
`CLIENT_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
`CLIENT_TEL` varchar(255) NOT NULL DEFAULT 'N/S;',
`A_STATUS` varchar(32) NOT NULL DEFAULT 'N/S;',
`A_STATUS_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
`L_APPOITMENT_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
`L_APPOITMENT_USER` varchar(20) NOT NULL DEFAULT 'N/S;',
`L_APPOITMENT_PERIOD` varchar(4) NOT NULL DEFAULT 'N/S;',
`L_APPOITMENT_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
`L_APPOITMENT_TYPE` varchar(16) NOT NULL DEFAULT 'N/S;',
`A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
`A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
`A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
`A_PROBLEM` varchar(16) NOT NULL DEFAULT 'N/S;',
`A_PROBLEM_DESC` varchar(255) NOT NULL DEFAULT 'N/S;',
`A_PROBLEM_DATE` varchar(30) NOT NULL DEFAULT 'N/S;',
`T_WORKPOINTS` varchar(100) NOT NULL DEFAULT 'N/S;',
`T_WORKPOINTS_VALUE` varchar(100) NOT NULL DEFAULT 'N/S;',
`T_WORKPOINTS_TYPE` varchar(100) NOT NULL DEFAULT 'N/S;',
`T_WORKPOINTS_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
`T_WORKPOINTS_DATE` varchar(100) NOT NULL DEFAULT 'N/S;',
`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
`ROZLICZ_MONTH` varchar(20) NOT NULL DEFAULT 'N/S;',
`ROZLICZ_CONFIRM` varchar(11) NOT NULL DEFAULT 'N/S;',
`SALDO` varchar(11) NOT NULL DEFAULT 'N/S;',
`ILE_ODZYSKANO` varchar(11) NOT NULL DEFAULT 'N/S;',
PRIMARY KEY (`ID`),
KEY `ID_USERS2` (`ID_USERS2`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;
");
}
}
/*
insert into USERS2_CONTACT (
A_RECORD_CREATE_DATE,
A_RECORD_CREATE_AUTHOR,
ID_BILLING_USERS,
CLIENT_INFO,
L_APPOITMENT_TYPE,
L_APPOITMENT_DATE,
L_APPOITMENT_USER,
L_APPOITMENT_INFO
)
select
h.A_RECORD_UPDATE_DATE as A_RECORD_CREATE_DATE,
h.A_RECORD_UPDATE_AUTHOR as A_RECORD_CREATE_AUTHOR,
( select w.ID_BILLING_USERS from USERS2_WINDYKACJA_STATUS w where w.ID = h.ID_USERS2 ) as ID_BILLING_USERS,
'' as CLIENT_INFO,
'TEL' as L_APPOITMENT_TYPE,
IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS_DATE, h.L_APPOITMENT_DATE) as L_APPOITMENT_DATE,
IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.A_RECORD_UPDATE_AUTHOR, h.L_APPOITMENT_USER) as L_APPOITMENT_USER,
IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS, h.L_APPOITMENT_INFO) as L_APPOITMENT_INFO
-- , '===' as X, h.*
from USERS2_WINDYKACJA_STATUS_HIST h
where
h.A_RECORD_UPDATE_DATE like '2019-08-%'
and h.A_RECORD_UPDATE_AUTHOR not like '%update%'
and h.ID_KORESP = 'N/S;' -- params like 'rowzwiazanie umowy%'
===
dzięki akcjom windykacyjnym w miesiącu 2020-01 odzyskano: {odzyskano}
{total_wpis} wpisów ({nie_odbiera} nie odbiera) do {total_user} klientów.
===
```sql
select x.* from (
select
(select sum(ILE_ODZYSKANO) as odzyskano from USERS2_CONTACT where L_APPOITMENT_DATE like '2020-01-%' and A_STATUS != 'DELETED') as odzyskano,
(select count(*) as total_wpis from USERS2_CONTACT where L_APPOITMENT_DATE like '2020-01-%' and A_STATUS != 'DELETED') as total_wpis,
(select count(DISTINCT ID_BILLING_USERS) as total_user from USERS2_CONTACT where L_APPOITMENT_DATE like '2020-01-%' and A_STATUS != 'DELETED') as total_user,
(select count(*) as nie_odbiera from USERS2_CONTACT where L_APPOITMENT_DATE like '2020-01-%' and A_STATUS != 'DELETED' and L_APPOITMENT_TYPE = 'TEL_NIE_ODBIERA') as nie_odbiera
) x
```
select count(DISTINCT ID_BILLING_USERS) from USERS2_CONTACT where A_RECORD_UPDATE_DATE like '2019-10-%';
select count(DISTINCT ID_BILLING_USERS) from USERS2_CONTACT where L_APPOITMENT_DATE like '2019-12-%';
select ID_BILLING_USERS, count(*) as cnt from USERS2_CONTACT where A_RECORD_UPDATE_DATE like '2019-10-%' group by ID_BILLING_USERS;
* fix rows order and HIST
insert into USERS2_CONTACT_temp201909 (
ID_OLD,
A_RECORD_CREATE_DATE,
A_RECORD_CREATE_AUTHOR,
ID_BILLING_USERS,
CLIENT_INFO,
L_APPOITMENT_TYPE,
L_APPOITMENT_DATE,
L_APPOITMENT_USER,
L_APPOITMENT_INFO
)
select t.*
from
(
select
0 as ID_OLD,
h.A_RECORD_UPDATE_DATE as A_RECORD_CREATE_DATE,
h.A_RECORD_UPDATE_AUTHOR as A_RECORD_CREATE_AUTHOR,
( select w.ID_BILLING_USERS from USERS2_WINDYKACJA_STATUS w where w.ID = h.ID_USERS2 ) as ID_BILLING_USERS,
'' as CLIENT_INFO,
'TEL' as L_APPOITMENT_TYPE,
IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS_DATE, h.L_APPOITMENT_DATE) as L_APPOITMENT_DATE,
IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.A_RECORD_UPDATE_AUTHOR, h.L_APPOITMENT_USER) as L_APPOITMENT_USER,
IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS, h.L_APPOITMENT_INFO) as L_APPOITMENT_INFO
from USERS2_WINDYKACJA_STATUS_HIST h
where
h.A_RECORD_UPDATE_DATE like '2019-09-%'
and h.A_RECORD_UPDATE_AUTHOR not like '%update%'
and h.ID_KORESP = 'N/S;' -- params like 'rowzwiaanie umowy%'
union
select
c.ID as ID_OLD,
c.A_RECORD_CREATE_DATE,
c.A_RECORD_CREATE_AUTHOR,
c.ID_BILLING_USERS,
c.CLIENT_INFO,
c.L_APPOITMENT_TYPE,
c.L_APPOITMENT_DATE,
c.L_APPOITMENT_USER,
c.L_APPOITMENT_INFO
from USERS2_CONTACT c
where c.ID >= 28
) as t
order by t.A_RECORD_CREATE_DATE
*/