diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php new file mode 100644 index 000000000..7c242b2e2 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -0,0 +1,98 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about a Konto + * Listens to ajax post calls to change the Konto data + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Konto extends FHCAPI_Controller +{ + /** + * Calls the parent's constructor and prepares libraries and phrases + */ + public function __construct() + { + // TODO(chris): permissions + parent::__construct([ + 'get' => 'student/stammdaten:r' + ]); + + // Load models + $this->load->model('crm/Konto_model', 'KontoModel'); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Get details for a prestudent + * + * @param string $type + * @param string (optional) $studiengang_kz + * @return void + */ + public function get($type, $studiengang_kz = '') + { + // TODO(chris): validation + + $person_id = $this->input->post('person_id'); + + if ($this->input->post('only_open')) { + $result = $this->KontoModel->getOffeneBuchungen($person_id, $studiengang_kz); + } else { + $result = $this->KontoModel->getAlleBuchungen($person_id, $studiengang_kz); + } + + #$result = $this->getDataOrTerminateWithError($result); + if (isError($result)) + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $result = $result->retval; + + // sort into tree + $childs = []; + $data = []; + foreach ($result as $entry) { + if ($entry->buchungsnr_verweis) { + if (isset($data[$entry->buchungsnr_verweis])) { + if (!isset($data[$entry->buchungsnr_verweis]->_children)) + $data[$entry->buchungsnr_verweis]->_children = []; + $data[$entry->buchungsnr_verweis]->_children[] = $entry; + } else { + if (!isset($childs[$entry->buchungsnr_verweis])) + $childs[$entry->buchungsnr_verweis] = []; + $childs[$entry->buchungsnr_verweis][] = $entry; + } + } else { + $data[$entry->buchungsnr] = $entry; + if (isset($childs[$entry->buchungsnr])) + $entry->_children = $childs[$entry->buchungsnr]; + } + } + + $this->terminateWithSuccess(array_values($data)); + } +} diff --git a/application/controllers/components/stv/Config.php b/application/controllers/components/stv/Config.php index 45c26c966..e9ed7ec44 100644 --- a/application/controllers/components/stv/Config.php +++ b/application/controllers/components/stv/Config.php @@ -14,6 +14,7 @@ class Config extends FHC_Controller public function student() { + // TODO(chris): phrases $result = []; $result['details'] = [ 'title' => 'Details', @@ -35,6 +36,11 @@ class Config extends FHC_Controller 'title' => 'Status', 'component' => './Stv/Studentenverwaltung/Details/Status.js' ]; + $result['konto'] = [ + 'title' => 'Konto', + 'component' => './Stv/Studentenverwaltung/Details/Konto.js', + 'config' => ['ZAHLUNGSBESTAETIGUNG_ANZEIGEN' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN)] + ]; $result['betriebsmittel'] = [ 'title' => 'Betriebsmittel', 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js' @@ -53,6 +59,18 @@ class Config extends FHC_Controller public function students() { - $this->outputJsonSuccess([]); + // TODO(chris): phrases + $result = []; + $result['konto'] = [ + 'title' => 'Konto', + 'component' => './Stv/Studentenverwaltung/Details/Konto.js', + 'config' => ['ZAHLUNGSBESTAETIGUNG_ANZEIGEN' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN)] + ]; + + Events::trigger('stv_conf_students', function & () use (&$result) { + return $result; + }); + + $this->outputJsonSuccess($result); } } diff --git a/application/controllers/components/stv/Student.php b/application/controllers/components/stv/Student.php deleted file mode 100644 index ddfd95aed..000000000 --- a/application/controllers/components/stv/Student.php +++ /dev/null @@ -1,543 +0,0 @@ -load->library('AuthLib'); - $this->load->library('VariableLib', ['uid' => getAuthUID()]); - - // Load language phrases - $this->loadPhrases([ - 'ui' - ]); - } - - public function get($prestudent_id) - { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); - - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - - $this->PrestudentModel->addSelect('p.*'); - $this->PrestudentModel->addSelect('s.student_uid'); - $this->PrestudentModel->addSelect('matrikelnr'); - $this->PrestudentModel->addSelect('b.aktiv'); - $this->PrestudentModel->addSelect('v.semester'); - $this->PrestudentModel->addSelect('v.verband'); - $this->PrestudentModel->addSelect('v.gruppe'); - $this->PrestudentModel->addSelect('b.alias'); - - if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) { - $this->PrestudentModel->addSelect("(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung ORDER BY kontakt_id LIMIT 1) AS email_privat", false); - } - - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_studentlehrverband v', 'b.uid = v.student_uid AND v.studiensemester_kurzbz = ' . $this->PrestudentModel->escape($studiensemester_kurzbz), 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'p.person_id = tbl_prestudent.person_id'); - - $result = $this->PrestudentModel->loadWhere(['prestudent_id' => $prestudent_id]); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJson(getError($result)); - } elseif (!hasData($result)) { - $this->output->set_status_header(REST_Controller::HTTP_NOT_FOUND); - $this->outputJson('NOT FOUND'); - } else { - $this->outputJson(current(getData($result))); - } - } - - public function save($prestudent_id) - { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); - - $this->load->model('person/Person_model', 'PersonModel'); - $this->load->model('crm/Student_model', 'StudentModel'); - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); - - $this->load->library('form_validation'); - - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - - $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date') - ]); - - $this->form_validation->set_rules('semester', 'Semester', 'integer'); - - if ($this->form_validation->run() == false) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - return $this->outputJsonError($this->form_validation->error_array()); - } - - $result = $this->StudentModel->loadWhere(['prestudent_id' =>$prestudent_id]); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson(getError($result)); - } elseif (!hasData($result)) { - $uid = null; - } else { - $student = current(getData($result)); - $uid = $student->student_uid; - } - - $result = $this->PrestudentModel->loadWhere(['prestudent_id' =>$prestudent_id]); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson(getError($result)); - } elseif (!hasData($result)) { - $person_id= null; - } else { - $person = current(getData($result)); - $person_id = $person->person_id; - } - - $array_allowed_props_lehrverband = ['verband', 'semester', 'gruppe']; - $update_lehrverband = array(); - foreach ($array_allowed_props_lehrverband as $prop) - { - $val = $this->input->post($prop); - if ($val !== null) { - $update_lehrverband[$prop] = $val; - } - } - - $array_allowed_props_person = [ - 'anrede', - 'bpk', - 'titelpre', - 'titelpost', - 'nachname', - 'vorname', - 'vornamen', - 'wahlname', - 'gebdatum', - 'gebort', - 'geburtsnation', - 'svnr', - 'ersatzkennzeichen', - 'staatsbuergerschaft', - 'matr_nr', - 'sprache', - 'geschlecht', - 'familienstand', - 'foto', - 'anmerkung', - 'homepage' - ]; - $update_person = array(); - foreach ($array_allowed_props_person as $prop) - { - $val = $this->input->post($prop); - if ($val !== null) { - $update_person[$prop] = $val; - } - } - - $array_allowed_props_student = ['matrikelnr']; - $update_student = array(); - foreach ($array_allowed_props_student as $prop) - { - $val = $this->input->post($prop); - if ($val !== null) { - $update_student[$prop] = $val; - } - } - - if (count($update_lehrverband) + count($update_student) && $uid === null) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - // TODO(chris): phrase - return $this->outputJson("Kein/e StudentIn vorhanden!"); - } - if (count($update_person) && $person_id === null) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - // TODO(chris): phrase - return $this->outputJson("Keine Person vorhanden!"); - } - - if (count($update_lehrverband)) - { - $result = $this->StudentlehrverbandModel->update([ - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'student_uid' => $uid - ], $update_lehrverband); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson(getError($result)); - } - } - - if (count($update_person)) - { - $result = $this->PersonModel->update( - $person_id, - $update_person - ); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson(getError($result)); - } - } - - - if (count($update_student)) - { - $result = $this->StudentModel->update( - [$uid], - $update_student - ); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson(getError($result)); - } - } - - $this->outputJson(success(array_fill_keys(array_merge( - array_keys($update_lehrverband), - array_keys($update_person), - array_keys($update_student) - ), ''), 1)); - } - - public function check() - { - $_POST = json_decode($this->input->raw_input_stream, true); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date') - ]); - - if ($this->form_validation->run() == false) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - return $this->outputJsonError($this->form_validation->error_array()); - } - - $vorname = $this->input->post('vorname'); - $nachname = $this->input->post('nachname'); - $gebdatum = $this->input->post('gebdatum'); - - if (!$vorname && !$nachname && !$gebdatum) { - return $this->outputJsonError(['#' => 'At least one of vorname, nachname or gebdatum must be set']); - } - - $this->load->model('person/Person_model', 'PersonModel'); - - if ($gebdatum) - $this->PersonModel->db->where('gebdatum', (new DateTime($gebdatum))->format('Y-m-d')); - if ($vorname && $nachname) { - $this->PersonModel->db->or_group_start(); - $this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape($nachname) . ')', false); - $this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape($vorname) . ')', false); - $this->PersonModel->db->group_end(); - } elseif ($nachname) { - $this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape($nachname) . ')', false); - } - - $result = $this->PersonModel->load(); - - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - } - - $this->outputJson($result); - } - - public function add() - { - $_POST = json_decode($this->input->raw_input_stream, true); - - if (!$this->input->post('person_id')) { - if (!isset($_POST['address']) || !is_array($_POST['address'])) - $_POST['address'] = []; - $_POST['address']['func'] = 1; - } - if ($this->input->post('incoming')) { - $_POST['ausbildungssemester'] = 0; - } - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [ - 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required') - ]); - $this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [ - 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required') - ]); - $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date') - ]); - $this->form_validation->set_rules('address[func]', 'Address', 'required|integer|less_than[2]|greater_than[-2]'); - $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required') - ]); - $this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required') - ]); - $this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required') - ]); - $this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required') - ]); - $this->form_validation->set_rules('email', 'E-Mail', 'valid_email'); - $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'required'); - $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required'); - $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|integer|less_than[9]|greater_than[-1]'); - // TODO(chris): validate studienplan with studiengang, semester and orgform? - // TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht? - - if ($this->form_validation->run() == false) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - return $this->outputJsonError($this->form_validation->error_array()); - } - - // TODO(chris): This should be in a library - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); - - $this->db->trans_start(); - - $result = $this->addInteressent(); - - $this->db->trans_complete(); - - if ($this->db->trans_status() === FALSE) { - return $this->outputJsonSuccess(true); // TODO(chris): DEBUG! REMOVE! - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - } - - $this->outputJson($result); - } - - protected function addInteressent() - { - // Person anlegen wenn nötig - $person_id = $this->input->post('person_id'); - if (!$person_id) { - $this->load->model('person/Person_model', 'PersonModel'); - - $data = [ - 'nachname' => $this->input->post('nachname'), - 'insertamum' => date('c'), - 'insertvon' => getAuthUID(), - 'zugangscode' => uniqid(), - 'aktiv' => true - ]; - if ($this->input->post('anrede')) - $data['anrede'] = $this->input->post('anrede'); - if ($this->input->post('titelpre')) - $data['titelpre'] = $this->input->post('titelpre'); - if ($this->input->post('titelpost')) - $data['titelpost'] = $this->input->post('titelpost'); - if ($this->input->post('vorname')) - $data['vorname'] = $this->input->post('vorname'); - if ($this->input->post('vornamen')) - $data['vornamen'] = $this->input->post('vornamen'); - if ($this->input->post('wahlname')) - $data['wahlname'] = $this->input->post('wahlname'); - if ($this->input->post('geschlecht')) - $data['geschlecht'] = $this->input->post('geschlecht'); - if ($this->input->post('gebdatum')) - $data['gebdatum'] = (new DateTime($this->input->post('datum_obj')))->format('Y-m-d'); - if ($this->input->post('geburtsnation')) - $data['geburtsnation'] = $this->input->post('geburtsnation'); - if ($this->input->post('staatsbuergerschaft')) - $data['staatsbuergerschaft'] = $this->input->post('staatsbuergerschaft'); - - $result = $this->PersonModel->insert($data); - if (isError($result)) - return $result; - $person_id = getData($result); - } - - // Addresse anlegen - $anlegen = $this->input->post('address[func]'); - if ($anlegen) { - $this->load->model('person/Adresse_model', 'AdresseModel'); - - $data = [ - 'nation' => $this->input->post('address[nation]'), - 'strasse' => $this->input->post('address[address]'), - 'plz' => $this->input->post('address[plz]'), - 'ort' => $this->input->post('address[ort]'), - 'gemeinde' => $this->input->post('address[gemeinde]'), - 'typ' => 'h', - 'zustelladresse' => true, - ]; - if ($anlegen < 0) { // Überschreiben - $this->AdresseModel->addOrder('zustelladresse', 'DESC'); - $this->AdresseModel->addOrder('sort'); - $result = $this->AdresseModel->loadWhere([ - 'person_id' => $person_id - ]); - if (isError($result)) - return $result; - if (hasData($result)) { - $address = current(getData($result)); - - $data['updateamum'] = date('c'); - $data['updatevon'] = getAuthUID(); - - $result = $this->AdresseModel->update($address->adresse_id, $data); - if (isError($result)) - return $result; - } else { - //Wenn keine Adrese vorhanden ist dann eine neue Anlegen - $anlegen = 1; - $data['heimatadresse'] = true; - } - } - if ($anlegen > 0) { - $data['person_id'] = $person_id; - $data['insertamum'] = date('c'); - $data['insertvon'] = getAuthUID(); - if (!isset($data['heimatadresse'])) - $data['heimatadresse'] = !$this->input->post('person_id'); - - $result = $this->AdresseModel->insert($data); - if (isError($result)) - return $result; - } - } - - // Kontaktdaten - $kontaktdaten = []; - foreach (['email', 'telefon', 'mobil'] as $k) { - $v = $this->input->post($k); - if ($v) - $kontaktdaten[$k] = $v; - } - if (count($kontaktdaten)) { - $this->load->model('person/Kontakt_model', 'KontaktModel'); - - foreach ($kontaktdaten as $typ => $kontakt) { - $data = [ - 'person_id' => $person_id, - 'kontakttyp' => $typ, - 'kontakt' => $kontakt, - 'zustellung' => true, - 'insertamum' => date('c'), - 'insertvon' => getAuthUID() - ]; - $result = $this->KontaktModel->insert($data); - if (isError($result)) - return $result; - } - } - - // Prestudent anlegen - $data = [ - 'aufmerksamdurch_kurzbz' => 'k.A.', - 'person_id' => $person_id, - 'studiengang_kz' => $this->input->post('studiengang_kz'), - 'ausbildungcode' => $this->input->post('letzteausbildung'), - 'anmerkung' => $this->input->post('anmerkungen'), - 'reihungstestangetreten' => false, - 'bismelden' => true - ]; - $ausbildungsart = $this->input->post('ausbildungsart'); - if ($ausbildungsart) - $data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart; - // Incomings und ausserordentliche sind bei Meldung nicht förderrelevant - $incoming = $this->input->post('incoming'); - if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9') - $data['foerderrelevant'] = false; - // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen - $this->PrestudentModel->addOrder('zgvmas_code'); - $this->PrestudentModel->addOrder('zgv_code', 'DESC'); - $this->PrestudentModel->addLimit(1); - $result = $this->PrestudentModel->loadWhere([ - 'person_id' => $person_id - ]); - if (isError($result)) - return $result; - if (hasData($result)) { - $prestudent = current(getData($result)); - if ($prestudent->zgv_code) { - $data['zgv_code'] = $prestudent->zgv_code; - $data['zgvort'] = $prestudent->zgvort; - $data['zgvdatum'] = $prestudent->zgvdatum; - - $data['zgvmas_code'] = $prestudent->zgvmas_code; - $data['zgvmaort'] = $prestudent->zgvmaort; - $data['zgvmadatum'] = $prestudent->zgvmadatum; - } - } - // Prestudent speichern - $result = $this->PrestudentModel->insert($data); - if (isError($result)) - return $result; - $prestudent_id = getData($result); - - // Prestudent Rolle Anlegen - $data = [ - 'prestudent_id' => $prestudent_id, - 'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent', - 'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'), - 'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0, - 'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null, - 'studienplan_id' => $this->input->post('studienplan_id') ?: null, - 'datum' => date('Y-m-d'), - 'insertamum' => date('c'), - 'insertvon' => getAuthUID() - ]; - $result = $this->PrestudentstatusModel->insert($data); - if (isError($result)) - return $result; - - if ($incoming) { - // TODO(chris): IMPLEMENT! - //Matrikelnummer und UID generieren - //Benutzerdatensatz anlegen - //Studentendatensatz anlegen - //StudentLehrverband anlegen - } - - // TODO(chris): DEBUG - /*$result = $this->PrestudentModel->loadWhere([ - 'pestudent_id' => 1 - ]); - if (isError($result)) { - return $result; - }*/ - - return success(true); - } - - public function requiredIfNotPersonId($value) - { - if (isset($_POST['person_id'])) - return true; - return !!$value; - } - - public function requiredIfAddressFunc($value) - { - if (!$_POST['address']['func']) - return true; - return !!$value; - } - - public function isValidDate($date) - { - try { - new DateTime($date); - } catch (Exception $e) { - return false; - } - return true; - } -} diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php index e76ed9e7a..00a621d0e 100644 --- a/application/models/crm/Konto_model.php +++ b/application/models/crm/Konto_model.php @@ -12,6 +12,73 @@ class Konto_model extends DB_Model $this->pk = 'buchungsnr'; } + + /** + * Get all accounting entries for a person optionally filtered by Studiengang + * + * @param integer|array $person_id + * @param string (optional) $studiengang_kz + * + * @return stdClass + */ + public function getAlleBuchungen($person_id, $studiengang_kz = '') + { + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('UPPER(typ::varchar(1) || kurzbz) AS kuerzel'); + $this->addSelect('person.anrede'); + $this->addSelect('person.titelpost'); + $this->addSelect('person.titelpre'); + $this->addSelect('person.vorname'); + $this->addSelect('person.vornamen'); + $this->addSelect('person.nachname'); + + $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); + $this->addJoin('public.tbl_person person', 'person_id', 'LEFT'); + + $this->addOrder('buchungsdatum'); + + if (is_array($person_id)) + $this->db->where_in('person_id', $person_id); + else + $this->db->where('person_id', $person_id); + + if ($studiengang_kz) + return $this->loadWhere([ + 'studiengang_kz' => $studiengang_kz + ]); + return $this->load(); + } + + /** + * Get all open accounting entries for a person optionally filtered by Studiengang + * + * @param integer|array $person_id + * @param string (optional) $studiengang_kz + * + * @return stdClass + */ + public function getOffeneBuchungen($person_id, $studiengang_kz = '') + { + $this->addSelect('buchungsnr'); + $this->db->where('(betrag + ( + SELECT CASE WHEN sum(betrag) is null THEN 0 ELSE sum(betrag) END + FROM ' . $this->dbTable . ' + WHERE buchungsnr_verweis=konto_a.buchungsnr + )) !=', 0, false); + if (is_array($person_id)) + $this->db->where_in('person_id', $person_id); + else + $this->db->where('person_id', $person_id); + $sql = $this->db->get_compiled_select($this->dbTable . ' konto_a'); + + $this->db->group_start(); + $this->db->where_in('buchungsnr', $sql, false); + $this->db->or_where_in('buchungsnr_verweis', $sql, false); + $this->db->group_end(); + + return $this->getAlleBuchungen($person_id, $studiengang_kz); + } + /** * Sets a Payment as paid */ diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Konto.js b/public/js/components/Stv/Studentenverwaltung/Details/Konto.js new file mode 100644 index 000000000..99bb85c87 --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Konto.js @@ -0,0 +1,133 @@ +import {CoreFilterCmpt} from "../../../filter/Filter.js"; + +// TODO(chris): filter +// TODO(chris): multi pers +// TODO(chris): new header(multi pers), edit/row, gegenb.(date) multi, löschen multi, best. multi(recht) + +export default { + components: { + CoreFilterCmpt + }, + props: { + modelValue: Object, + config: { + type: Object, + default: {} + } + }, + data() { + return { + filter: 'alle' + }; + }, + computed: { + stg_kz() { + if (this.modelValue.studiengang_kz) + return this.modelValue.studiengang_kz; + let values = this.modelValue.map(e => e.studiengang_kz).filter((v,i,a) => a.indexOf(v) === i); + if (values.length != 1) + return ''; + return values[0]; + }, + tabulatorOptions() { + return { + ajaxURL: 'api/frontend/v1/stv/konto/get/alle', + ajaxParams: () => { + const params = { + person_id: this.modelValue.person_id || this.modelValue.map(e => e.person_id), + only_open: (this.filter == 'offene') + }; + return params; + }, + ajaxRequestFunc: (url, config, params) => { + return this.$fhcApi.post(url, params, config); + }, + ajaxResponse: (url, params, response) => response.data, + dataTree: true, + columns: [ + { + field: "buchungsdatum", + title: "Buchungsdatum" + }, + { + field: "buchungstext", + title: "Buchungstext" + }, + { + field: "betrag", + title: "Betrag" + }, + { + field: "studiensemester_kurzbz", + title: "StSem" + }, + { + field: "buchungstyp_kurzbz", + title: "Typ", + visible: false + }, + { + field: "buchungsnr", + title: "buchungs_nr", + visible: false + }, + { + field: "insertvon", + title: "Angelegt von", + visible: false + }, + { + field: "insertamum", + title: "Anlagedatum", + visible: false + }, + { + field: "kuerzel", + title: "Studiengang", + visible: false + }, + { + field: "anmerkung", + title: "Anmerkung" + } + ], + index: 'buchungs_nr', + }; + } + }, + watch: { + modelValue() { + this.$refs.table.reloadTable(); + } + }, + methods: { + reload() { + this.$refs.table.reloadTable(); + } + }, + template: ` +