Przeglądaj źródła

update Zaliczka, added Wniosek

Piotr Labudda 9 lat temu
rodzic
commit
62bdde1849

+ 248 - 54
SE/se-lib/Route/UrlAction/UserProNetMediaZaliczka.php

@@ -8,7 +8,8 @@ Lib::loadClass('Response');
 Lib::loadClass('ProcesHelper');
 Lib::loadClass('Route_UrlAction');
 Lib::loadClass('UI');
-Lib::loadClass('Core_AclHelper');
+Lib::loadClass('ACL');
+Lib::loadClass('TableAjax');
 
 // - [ ] zaliczkaListaView:
 //   - [ ] btn "Dodaj Zaliczkę" $acl->addItem($item); // @require only 'worker' => [ 'id', 'login', 'name' ]
@@ -32,6 +33,7 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 			$data = array();
 			$data['idUser'] = V::get('idUser', User::getID(), $_REQUEST, 'int');
 			$data['idZaliczka'] = V::get('idZaliczka', 0, $_REQUEST, 'int');// TODO: idZaliczka is always MAX(z.ID);
+			$data['tab'] = V::get('tab', 'wnoiski', $_REQUEST, 'word');
 
 			if (!$data['idZaliczka']) {
 				$this->zaliczkaListaView($data);
@@ -50,7 +52,9 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 			}
 		} catch (Exception $e) {
 			UI::alert('danger', "Error #" . $e->getCode() .  "|" . $e->getLine() .  ": " . $e->getMessage());
+			DBG::log($e);
 		}
+		if (!empty($_POST)) echo UI::h('script', [], "history.replaceState(null, 'Zaliczka', window.location.href);");
 		if (1 != V::get('_print', '', $_GET)) UI::dol();
 	}
 
@@ -103,7 +107,7 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 			if ('default_db/IN7_DZIENNIK_KORESP/ZaliczkaKoresp' == $args['schema']['@namespace']) {
 				return [
 					'type' => 'success',
-					'options' => array_values(Core_AclHelper::getAclByNamespace($args['schema']['@namespace'])->getItems([
+					'options' => array_values(ACL::getAclByNamespace($args['schema']['@namespace'])->getItems([
 						'f_title' => V::get('query', '', $args)
 					]))
 				];
@@ -115,7 +119,7 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 			// objectNamespace : "default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja"
 			if (empty($args['childName'])) throw new Exception("Missing childName");
 
-			$acl = Core_AclHelper::getAclByNamespace($args['objectNamespace']);
+			$acl = ACL::getAclByNamespace($args['objectNamespace']);
 			return [
 				'type' => 'success',
 				'options' => $acl->getEnumValues($args['childName'])
@@ -152,73 +156,214 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 
 	public function zaliczkaListaView($data) {
 		$idUser = V::get('idUser', User::getID(), $data);
+		$tab = V::get('tab', 'wnioski', $data);
+		if (!in_array($tab, ['wnioski', 'zaliczki'])) $tab = 'wnioski';
 
-		$ownerAcl = Core_AclHelper::getAclByNamespace("default_objects/AccessOwner");
+		$ownerAcl = ACL::getAclByNamespace("default_objects/AccessOwner");
 		$user = $ownerAcl->getItem($idUser);// [id, login, name]
 		if (!$user) throw new Exception("Nie znaleziono pracownika o nr '{$idUser}'");
 
-		$acl = Core_AclHelper::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
+		$acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
 
 		UI::startContainer(['style' => "padding-top:20px"]);
 		UI::setTitle("Zaliczka");
 
-		UI::table([
-			'caption' => "Zaliczki pracownika {$user['name']} " . '<br>' . UI::hButtonPost("Dodaj nową zaliczkę", [
-				'data' => [
-					'_route' => "UrlAction_UserProNetMediaZaliczka",
-					'_task' => "add",
-					'idUser' => $idUser,
-				],
-				'fields' => [
-					[ 'name' => "kwota", 'type' => 'text', 'class' => 'form-control input-sm', 'style' => "width:200px", 'placeholder' => "kwota" ]
-				],
-				'class' => 'btn-sm btn-primary',
-				'form.style' => 'display:block; margin-top:4px'
+		echo UI::h('h2', [], "Zaliczki pracownika {$user['name']} ");
+		echo UI::hButtonPost("Dodaj wniosek o zaliczkę", [
+			'data' => [
+				'_route' => "UrlAction_UserProNetMediaZaliczka",
+				'_task' => 'add',
+				'idUser' => $idUser,
+			],
+			'class' => "btn-sm btn-primary",
+			'form.style' => "display:block; margin-top:4px; padding:20px; background:#eee"
+		], [
+			UI::h('input', [ 'name' => "kwota", 'type' => 'text', 'class' => 'form-control input-sm', 'style' => "width:200px;margin-right:4px", 'placeholder' => "kwota" ]),
+			UI::h('div', ['class'=>"input-group", 'style'=>"margin-right:4px"], [
+				UI::h('input', [ 'name' => "uwagi", 'type' => 'text', 'class' => 'form-control input-sm', 'style' => "width:400px", 'placeholder' => "uwagi" ]),
+				UI::h('span', ['class'=>"input-group-btn"], [
+					UI::h('button', ['class'=>"btn btn-sm btn-default", 'onClick' => "return false"], [
+						UI::h('i', [
+							'class' => "glyphicon glyphicon-question-sign",
+							'title' => "Czego dotyczy zaliczka?"
+						])
+					])
+				]),
 			]),
-			'rows' => array_map(
-				function ($row) use ($idUser) {
-					$instance = DB::getPDO()->fetchValue("select INSTANCE_NAME from `ZALICZKA__#INSTANCE` where PRIMARY_KEY = {$row['id']}");
-					$editLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&idZaliczka={$row['id']}";
-					$editLabel = ('ZaliczkaAktywna' == $instance) ? "Rozlicz / Podgląd" : "Podgląd";
-					$histLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=hist&idUser={$idUser}&idZaliczka={$row['id']}";
-					return [
-						'Nr' => $row['id'],
-						'Typ' => $instance,
-						'Pracownik' => $row['L_APPOITMENT_USER'],
-						'Kwota' => $row['kwota'],
-						'Nierozliczona kwota' => $row['nierozliczona_kwota'],
-						'#' => '<a href="' . $editLink . '">' . $editLabel . '</a>' . (V::get('DBG', '', $_GET)
-							? '<a href="' . $histLink . '">' . "DBG HIST" . '</a>'
-							: ''
-						),
-					];
-				},
-				$acl->getItems([
-					'#refFrom' => [
-						'namespace' => 'default_db__x3A__ADMIN_USERS/Worker',
-						'primaryKey' => $idUser
-					]
-				])
-			),
-			'empty_msg' => "Brak",
-			'disable_lp' => true,
 		]);
 
+		echo UI::h('ul', ['class' => "nav nav-tabs", 'style' => "margin-top:24px"], [
+			UI::h('li', ['role' => "presentation", 'class' => ('wnioski' == $tab) ? "active" : ''], [
+				UI::h('a', ['href'=>Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&tab=wnioski"], "Wnioski")
+				// UI::h('a', ['href'=>"#tab-wnioski", 'onClick' => "return p5__Zaliczka__showTab(this, 'tab-wnioski')"], "Wnioski")
+			]),
+			UI::h('li', ['role' => "presentation", 'class' => ('zaliczki' == $tab) ? "active" : ''], [
+				UI::h('a', ['href'=>Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&tab=zaliczki"], "Zaliczki")
+				// UI::h('a', ['href'=>"#tab-zaliczki", 'onClick' => "return p5__Zaliczka__showTab(this, 'tab-zaliczki')"], "Zaliczki")
+			]),
+		]);
+		if ('wnioski' == $tab) {
+			$this->viewWidgetUserWnioski($idUser);
+		} else if ('zaliczki' == $tab) {
+			$this->viewWidgetUserZaliczki($idUser);
+		}
+		// UI::startTag('div', ['id'=>'tab-wnioski']);
+		// $this->viewWidgetUserWnioski();
+		// UI::endTag('div');// #tab-wnioski
+		// UI::startTag('div', ['id'=>'tab-zaliczki']);
+		// $this->viewWidgetUserZaliczki();
+		// UI::endTag('div');// #tab-zaliczki
 		UI::endContainer();
+		// echo UI::h('script', [], "
+		// 	(function (window) {
+		// 		var idxSelected = 0
+		// 		var tabs = [
+		// 			'tab-wnioski',
+		// 			'tab-zaliczki'
+		// 		]
+		// 		var tabNodes = [
+		// 			window.document.getElementById('tab-wnioski'),
+		// 			window.document.getElementById('tab-zaliczki'),
+		// 		]
+		//
+		// 		function p5__Zaliczka__showTab(n, tab) {
+		// 			var idxTab = tabs.indexOf(tab)
+		// 			if (-1 === idxTab) return
+		// 			n.parentNode.parentNode.childNodes.forEach(function (liNode) {
+		// 				if (liNode.nodeType !== 1) return // Node.ELEMENT_NODE == 1
+		// 				if (liNode.tagName !== 'LI') return
+		// 				liNode.classList.remove('active')
+		// 			})
+		// 			n.parentNode.classList.add('active')
+		// 			p5__Zaliczka__renderTabs(idxTab)
+		// 			return false
+		// 		}
+		//
+		// 		function p5__Zaliczka__renderTabs(idxTab) {
+		// 			tabNodes.forEach(function (tabNode) {
+		// 				tabNode.style.display = 'none'
+		// 			})
+		// 			tabNodes[idxTab].style.display = 'block'
+		// 		}
+		//
+		// 		p5__Zaliczka__renderTabs(idxSelected)
+		//
+		// 		window.p5__Zaliczka__showTab = p5__Zaliczka__showTab
+		// 	})(window)
+		// ");
+	}
+
+	public function viewWidgetUserWnioski($data = []) {
+		$idUser = V::get('idUser', User::getID(), $data);
+		if (!$idUser) throw new Exception("Błędny numer pracownika");
+		// $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
+		// if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
+		// $acl = ACL::getAclByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek");
+		$acl = ACL::getAclByNamespace("default_db/zaliczka_wniosek_info_view");
+		$syncUrl = Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=' . $acl->getNamespace();
+		$tbl = new TableAjax($acl);
+		$tblLabel = $acl->getNamespace();
+		if ('default_db' == $acl->getSourceName()) {
+			$tblLabel = array();
+			$zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
+			if (!$zasobObj) throw new Exception("Zasob TABELA ID=" . $acl->getID() . " nie istnieje");
+			if (!empty($zasobObj->DESC_PL)) $tblLabel[] = $zasobObj->DESC_PL;
+			if (!empty($zasobObj->OPIS))    $tblLabel[] = $zasobObj->OPIS;
+			$tblLabel = implode(" - ", $tblLabel);
+		}
+		$tbl->setSyncUrl($syncUrl);
+		$tbl->setLabel($tblLabel);
+		$tbl->setRowFunctions([]);
+
+		$tbl->setFilterInit([
+			'currSortCol' => "created",
+			'currSortFlip' => "desc"
+		]);
+		$tbl->setForceFilterInit([
+			'ID_USER' => $idUser
+			// 'workerLogin' => $workerLogin
+		]);
+		echo $tbl->render();
+	}
+
+	public function viewWidgetUserZaliczki($data = []) {
+		$idUser = V::get('idUser', User::getID(), $data);
+		if (!$idUser) throw new Exception("Błędny numer pracownika");
+		$workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
+		if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
+		$acl = ACL::getAclByNamespace("default_db/ZALICZKA_INFO_VIEW");// 'default_db/ZALICZKA/Zaliczka'
+		$syncUrl = Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=' . $acl->getNamespace();
+		$tbl = new TableAjax($acl);
+		$tblLabel = $acl->getNamespace();
+		if ('default_db' == $acl->getSourceName()) {
+			$tblLabel = array();
+			$zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
+			if (!$zasobObj) throw new Exception("Zasob TABELA ID=" . $acl->getID() . " nie istnieje");
+			if (!empty($zasobObj->DESC_PL)) $tblLabel[] = $zasobObj->DESC_PL;
+			if (!empty($zasobObj->OPIS))    $tblLabel[] = $zasobObj->OPIS;
+			$tblLabel = implode(" - ", $tblLabel);
+		}
+		$tbl->setSyncUrl($syncUrl);
+		$tbl->setLabel($tblLabel);
+		$tbl->setRowFunctions([]);
+
+		$tbl->setFilterInit([
+			'currSortCol' => "ID",
+			'currSortFlip' => "desc"
+		]);
+		$tbl->setForceFilterInit([
+			'L_APPOITMENT_USER' => $workerLogin
+		]);
+		echo $tbl->render();
+
+		// $acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
+		// UI::table([
+		// 	'caption' => "Zaliczki",
+		// 	'rows' => array_map(
+		// 		function ($row) use ($idUser) {
+		// 			$instance = DB::getPDO()->fetchValue("select INSTANCE_NAME from `ZALICZKA__#INSTANCE` where PRIMARY_KEY = {$row['id']}");
+		// 			$editLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&idZaliczka={$row['id']}";
+		// 			$editLabel = ('ZaliczkaAktywna' == $instance) ? "Rozlicz / Podgląd" : "Podgląd";
+		// 			$histLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=hist&idUser={$idUser}&idZaliczka={$row['id']}";
+		// 			return [
+		// 				'Nr' => $row['id'],
+		// 				'Typ' => $instance,
+		// 				'Pracownik' => $row['L_APPOITMENT_USER'],
+		// 				'Kwota' => $row['kwota'],
+		// 				'Nierozliczona kwota' => $row['nierozliczona_kwota'],
+		// 				'#' => '<a href="' . $editLink . '">' . $editLabel . '</a>' . (V::get('DBG', '', $_GET)
+		// 					? '<a href="' . $histLink . '">' . "DBG HIST" . '</a>'
+		// 					: ''
+		// 				),
+		// 			];
+		// 		},
+		// 		$acl->getItems([
+		// 			'#refFrom' => [
+		// 				'namespace' => 'default_db__x3A__ADMIN_USERS/Worker',
+		// 				'primaryKey' => $idUser
+		// 			]
+		// 		])
+		// 	),
+		// 	'empty_msg' => "Brak",
+		// 	'disable_lp' => true,
+		// ]);
 	}
 
 	public function addAction() {
-		$idUser = V::get('idUser', User::getID(), $_REQUEST);
+		$idUser = V::get('idUser', User::getID(), $_REQUEST, 'int');
 		$kwota = V::get('kwota', 0, $_REQUEST, 'price');
+		$uwagi = V::get('uwagi', '', $_REQUEST);
 		try {
-			$acl = Core_AclHelper::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
+			if (!$idUser) throw new Exception("Błędny numer pracownika");
+			$workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
+			if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
+			$acl = ACL::getAclByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek");
 			$id = $acl->addItem([
 				'kwota' => $kwota,
-				'worker' => [
-					'id' => $idUser
-				]
+				'uwagi' => $uwagi,
+				'workerLogin' => $workerLogin
 			]);
-			if (!$id) throw new Exception("Nie udało się utworzyć zaliczki");
+			if (!$id) throw new Exception("Nie udało się utworzyć wniosku o zaliczkę");
 		} catch (Exception $e) {
 			UI::gora();
 			UI::startContainer();
@@ -234,7 +379,7 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 			exit;
 		}
 
-		$redirectUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&idZaliczka={$id}";
+		$redirectUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}";// TODO:? &idWniosek={$id}
 		if (!headers_sent()) {
 			header("Location: {$redirectUrl}");
 		} else {
@@ -251,13 +396,27 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 	public function reinstallAction() {
 		UI::gora();
 		try {
-			Core_AclHelper::getAclByNamespace("default_db/ZALICZKA/Zaliczka")->reinstall();
+			ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka")->reinstall();
+			ACL::getAclByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek")->reinstall();
 			UI::startContainer();
 			UI::alert('success', "Structure for 'default_db/ZALICZKA/Zaliczka' created in a database");
 			$backUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka";
 			UI::tag('a', ['href'=>$backUrl, 'class'=>"btn btn-primary"], "wróć");
 
 			$databaseName = DB::getPDO()->getDatabaseName();
+			UI::table([
+				'caption' => "Zaliczka Wniosek",
+				'rows' => DB::getPDO()->fetchAll("
+					select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
+					from `information_schema`.`COLUMNS` t
+					where t.TABLE_SCHEMA = '{$databaseName}'
+						and (t.TABLE_NAME like 'ZALICZKA_WNIOSEK'
+							or t.TABLE_NAME like 'ZALICZKA_WNIOSEK_HIST'
+						)
+					order by t.TABLE_NAME asc, t.COLUMN_NAME asc
+				")
+			]);
+
 			UI::table([
 				'caption' => "Zaliczka",
 				'rows' => DB::getPDO()->fetchAll("
@@ -304,6 +463,8 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 								or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
 								or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
 								or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
+								or t.TABLE_NAME like 'ZALICZKA_WNIOSEK'
+								or t.TABLE_NAME like 'ZALICZKA_WNIOSEK_HIST'
 							)
 						group by t.TABLE_NAME
 					")
@@ -379,7 +540,10 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 							, t.L_APPOITMENT_USER
 							, t.A_STATUS
 							, t.KWOTA
+							, t.UWAGI
 							, t.NIEROZLICZONA_KWOTA
+							, t.APPROVED_BY
+							, t.PAYMENT_METHOD
 							, sum(COALESCE(p.kwota, 0)) as rozliczona_kwota
 					from ZALICZKA t
 						join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
@@ -404,6 +568,30 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 					where t.A_STATUS not in ('DELETED')
 					group by u.ADM_ACCOUNT
 				");
+				DB::getPDO()->execSql("
+					CREATE OR REPLACE VIEW `ZALICZKA_WNIOSEK_INFO_VIEW` AS
+					select t.ID
+							, t.A_RECORD_CREATE_DATE as created
+							, u.ID as ID_USER
+							, t.L_APPOITMENT_USER
+							, t.A_STATUS
+							, t.KWOTA
+							, t.UWAGI
+							, t.APPROVED_BY
+							, IF('WAITING' = t.A_STATUS, 'Oczekuje zatwierdzenia',
+									IF ('NORMAL' = t.A_STATUS, 'Zatwierdzony',
+										IF ('OFF_HARD' = t.A_STATUS, 'Odrzucony',
+											IF ('OFF_HARD' = t.A_STATUS, 'Anulowany',
+												'nieznany'
+											)
+										)
+									)
+								) as status
+					from ZALICZKA_WNIOSEK t
+						join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
+--					where t.A_STATUS not in ('DELETED')
+					group by t.ID
+				");
 
 				UI::table([
 					'caption' => "Table `ZALICZKA_USER_SALDO_VIEW`",
@@ -434,8 +622,14 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 							left join ZALICZKA_POZYCJA p on(p.ID = refPoz.REMOTE_PRIMARY_KEY)
 					")
 				]);
+				UI::table([
+					'caption' => "Table `ZALICZKA_WNIOSEK_INFO_VIEW`",
+					'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_WNIOSEK_INFO_VIEW` ")
+				]);
 			}
 
+			Router::getRoute('UrlAction_UserProNetMediaZaliczkaWniosekConfirm')->reinstall();
+			Router::getRoute('UrlAction_UserProNetMediaZaliczkaWniosekRemove')->reinstall();
 
 			UI::endContainer();
 		} catch (Exception $e) {
@@ -452,7 +646,7 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 		UI::tag('div', ['id'=>"zaliczka-app", 'data-dbg'=>V::get('DBG', '', $_GET), 'data-sync-js-function'=>"syncZaliczkaState", 'data-fetch-data-js-function'=>"zaliczkaFetchData"]);
 		UI::emptyTag('br');
 
-		$acl = Core_AclHelper::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
+		$acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
 		$schema = $acl->getSimpleSchemaTree();
 		// DBG::nicePrint($schema, '$schema');
 
@@ -475,7 +669,7 @@ class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlAct
 			$idZaliczka = V::get('idZaliczka', 0, $_GET, 'int');
 			if ($idZaliczka <= 0) throw new Exception("Missing idZaliczka");
 
-			$acl = Core_AclHelper::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
+			$acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
 			$zaliczka = $acl->getItem($idZaliczka);
 			if (!$zaliczka) throw new Exception("Zaliczka not found!");
 

+ 165 - 0
SE/se-lib/Route/UrlAction/UserProNetMediaZaliczkaWniosekConfirm.php

@@ -0,0 +1,165 @@
+<?php
+
+Lib::loadClass('RouteBase');
+Lib::loadClass('DBG');
+Lib::loadClass('UI');
+Lib::loadClass('User');
+
+class Route_UrlAction_UserProNetMediaZaliczkaWniosekConfirm extends RouteBase {
+
+  public function handleAuth() {
+		if (!User::logged()) {
+			User::authByRequest();
+		}
+	}
+  public function getActionLabel() { return "Zatwierdź Wniosek"; }
+	public function getActionDescription() { return "Zatwierdź Wniosek o Zaliczkę"; }
+  public function getActionArgs() {
+    return [
+      'idZaliczkaWniosek' => 'Nr wniosku o zaliczkę'
+    ];
+  }
+
+  public function getProps($args) {
+    $idZaliczkaWniosek = V::get('idZaliczkaWniosek', 0, $_GET, 'int');
+    if ($idZaliczkaWniosek <= 0) throw new Exception("Missing param idZaliczkaWniosek");
+    $wniosekAcl = ACL::getAclByNamespace('default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek');
+    $wniosek = $wniosekAcl->getItem($idZaliczkaWniosek);
+    if (!$wniosek) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} nie został odnaleziony w bazie danych");
+    $props = [
+      'idZaliczkaWniosek' => $idZaliczkaWniosek,
+      'wniosekAcl' => $wniosekAcl,
+      'wniosek' => $wniosek,
+    ];
+    return $props;
+  }
+
+  public function confirmAction() {
+    UI::gora();
+    UI::menu();
+		UI::startContainer();
+    try {
+      $props = $this->getProps([
+        'idZaliczkaWniosek' => V::get('idZaliczkaWniosek', 0, $_GET, 'int')
+      ]);
+
+      $affected = $props['wniosekAcl']->updateItem([
+        'id' => $props['wniosek']['id'],
+        'status' => "Zatwierdzony",
+        'approvedBy' => User::getLogin()
+      ]);
+      DBG::log(['msg'=>"update Wniosek(affected={$affected})", '$wniosek'=>$wniosek]);
+
+      $zaliczkaAcl = ACL::getAclByNamespace('default_db/ZALICZKA/Zaliczka');
+      $id = $zaliczkaAcl->addItem([
+        'kwota' => $props['wniosek']['kwota'],
+        'worker' => [
+          'id' => $props['wniosek']['workerID'],
+        ],
+        'uwagi' => $props['wniosek']['uwagi'],
+        'approvedBy' => User::getLogin()
+      ]);
+      DBG::log(['msg'=>"add Zaliczka(id={$id})"]);
+      if (!$id) throw new Exception("Nie udało się utworzyć zaliczki");
+
+      UI::alert('success', "Wniosek zatwierdzony");
+      echo $this->viewWniosek($props['wniosek']);
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    UI::endContainer();
+		UI::dol();
+  }
+
+  public function rejectAction() {
+    UI::gora();
+    UI::menu();
+		UI::startContainer();
+    try {
+      $props = $this->getProps([
+        'idZaliczkaWniosek' => V::get('idZaliczkaWniosek', 0, $_GET, 'int')
+      ]);
+
+      $affected = $props['wniosekAcl']->updateItem([
+        'id' => $props['wniosek']['id'],
+        'status' => "Odrzucony",
+        'approvedBy' => User::getLogin()
+      ]);
+      DBG::log(['msg'=>"update Wniosek(affected={$affected})", '$wniosek'=>$wniosek]);
+      UI::alert('info', "Wniosek o zaliczkę został odrzucony");
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    UI::endContainer();
+		UI::dol();
+  }
+
+  public function defaultAction() {
+		UI::gora();
+    UI::menu();
+		UI::startContainer();
+    try {
+      $props = $this->getProps([
+        'idZaliczkaWniosek' => V::get('idZaliczkaWniosek', 0, $_GET, 'int')
+      ]);
+      $idZaliczkaWniosek = $props['idZaliczkaWniosek'];
+      $wniosekAcl = $props['wniosekAcl'];
+      $wniosek = $props['wniosek'];
+
+      if ('Anulowany' == $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} został wcześniej anulowany");
+      if ('Odrzucony' == $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} został wcześniej odrzucony");
+      if ('Zatwierdzony' == $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} został już wcześniej zatwierdzony");
+      // if ('Oczekuje zatwierdzenia' !== $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} ma nieznany status");
+
+      echo UI::h('h1', [], "Wniosek o wypłatę zaliczki");
+      echo UI::h('div', ['style' => "text-align:center; padding:32px"], [
+        UI::h('a', [
+          'href' => Request::getPathUri() . "?_route=UrlAction_UserProNetMediaZaliczkaWniosekConfirm&idZaliczkaWniosek={$idZaliczkaWniosek}&_task=confirm",
+          'class' => "btn btn-lg btn-primary",
+          'style' => "margin-right:24px"
+        ], "Zatwierdź"),
+        UI::h('a', [
+          'href' => Request::getPathUri() . "?_route=UrlAction_UserProNetMediaZaliczkaWniosekConfirm&idZaliczkaWniosek={$idZaliczkaWniosek}&_task=reject",
+          'class' => "btn btn-lg btn-danger",
+          'style' => "margin-left:24px"
+        ], "Odrzuć"),
+      ]);
+      echo UI::h('hr');
+      DBG::log(['msg'=>'$wniosek', '$wniosek'=>$wniosek]);
+      echo $this->viewWniosek($wniosek);
+
+      echo UI::h('hr');
+      echo UI::h('h3', [], "Pozostałe wnioski pracownika <code>{$wniosek['workerLogin']}</code>:");
+      Router::getRoute('UrlAction_UserProNetMediaZaliczka')->viewWidgetUserWnioski([
+        'idUser' => $wniosek['workerID']
+      ]);
+
+			// $wniosekAcl->updateItem([
+			// 	'id' => $idZaliczkaWniosek,
+			// 	'status' => "Anulowany"
+			// ]);
+
+      // UI::alert('success', "Wniosek anulowany");
+
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    if (!empty($_POST)) echo UI::h('script', [], "history.replaceState(null, '', window.location.href)");
+    UI::endContainer();
+		UI::dol();
+  }
+
+  public function viewWniosek($wniosek) {
+    return UI::h('blockquote', [], [
+      UI::h('p', [], "Nr: {$wniosek['id']}"),
+      UI::h('p', [], "Autor: {$wniosek['workerLogin']}"),
+      UI::h('p', [], "Data zgłoszenia: {$wniosek['created']}"),
+      UI::h('p', [], "Kwota: <b>" . UI::price($wniosek['kwota']) . "</b>"),
+      UI::h('p', [], "Uwagi: {$wniosek['uwagi']}"),
+    ]);
+  }
+
+}

+ 56 - 0
SE/se-lib/Route/UrlAction/UserProNetMediaZaliczkaWniosekRemove.php

@@ -0,0 +1,56 @@
+<?php
+
+Lib::loadClass('RouteBase');
+Lib::loadClass('DBG');
+Lib::loadClass('UI');
+Lib::loadClass('User');
+
+class Route_UrlAction_UserProNetMediaZaliczkaWniosekRemove extends RouteBase {
+
+  public function handleAuth() {
+		if (!User::logged()) {
+			User::authByRequest();
+		}
+	}
+  public function getActionLabel() { return "Anuluj Wniosek"; }
+	public function getActionDescription() { return "Anuluj Wniosek o Zaliczkę"; }
+  public function getActionArgs() {
+    return [
+      'idZaliczkaWniosek' => 'Nr wniosku o zaliczkę'
+    ];
+  }
+
+  public function defaultAction() {
+		UI::gora();
+		UI::menu();
+		UI::startContainer();
+    try {
+      $idZaliczkaWniosek = V::get('idZaliczkaWniosek', 0, $_GET, 'int');
+      if ($idZaliczkaWniosek <= 0) throw new Exception("Missing param idZaliczkaWniosek");
+      $wniosekAcl = ACL::getAclByNamespace('default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek');
+      $wniosek = $wniosekAcl->getItem($idZaliczkaWniosek);
+      if (!$wniosek) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} nie został odnaleziony w bazie danych");
+
+      if ('Anulowany' == $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} został już anulowany wcześniej");
+      if ('Odrzucony' == $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} został odrzucony");
+      if ('Zatwierdzony' == $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} został zatwierdzony");
+      // if ('Oczekuje zatwierdzenia' !== $wniosek['status']) throw new Exception("Wniosek o numerze {$idZaliczkaWniosek} ma nieznany status");
+			$wniosekAcl->updateItem([
+				'id' => $idZaliczkaWniosek,
+				'status' => "Anulowany"
+			]);
+
+      UI::alert('success', "Wniosek anulowany");
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+		UI::endContainer();
+		UI::dol();
+  }
+
+  public function reinstallAction() {
+
+  }
+
+}

+ 47 - 19
SE/se-lib/Schema/DefaultDb/zaliczka/ZaliczkaStorageAcl.php

@@ -14,11 +14,13 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
       'created' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_CREATE_DATE' ],
       'worker' => [ '@ref' => 'default_objects/AccessOwner' ],// 'alias_ref:default_objects:AccessOwner'
       'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2, '@alias' => 'KWOTA' ],
+      'uwagi' => [ '@type' => 'xsd:string', '@alias' => 'UWAGI' ],
       'nierozliczona_kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2, '@alias' => 'NIEROZLICZONA_KWOTA' ],
       'korespondencja' => [ '@ref' => 'default_db/IN7_DZIENNIK_KORESP/ZaliczkaKoresp' ],
       'pozycja' => [ '@ref' => 'default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja', '@maxOccurs' => 'unbounded' ],
       'A_STATUS' => [ '@type' => 'xsd:string' ],
       'L_APPOITMENT_USER' => [ '@type' => 'xsd:string' ],
+      'approvedBy' => [ '@type' => 'xsd:string', '@alias' => 'APPROVED_BY' ],
     ],
   ];
 
@@ -106,11 +108,15 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
     DBG::log(['msg' => '$userSaldo', 'log' => $userSaldo]);
 
     $usrLogin = User::getLogin();
+    $sqlUwagi = DB::getPDO()->quote(V::get('uwagi', '', $itemTodo), PDO::PARAM_STR);
+    $sqlApprovedBy = DB::getPDO()->quote(V::get('approvedBy', '', $itemTodo), PDO::PARAM_STR);
     $execRet = DB::getPDO()->execSql("
       insert into `ZALICZKA` (A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE
-          , L_APPOITMENT_USER, NIEROZLICZONA_KWOTA, KWOTA)
+          , L_APPOITMENT_USER, NIEROZLICZONA_KWOTA
+          , KWOTA, UWAGI, APPROVED_BY)
         select '{$usrLogin}' as A_RECORD_CREATE_AUTHOR, NOW() as A_RECORD_CREATE_DATE
-          , u.ADM_ACCOUNT, '{$userSaldo}', '{$itemTodo['kwota']}'
+          , u.ADM_ACCOUNT, '{$userSaldo}'
+          , '{$itemTodo['kwota']}', {$sqlUwagi}, {$sqlApprovedBy}
         from ADMIN_USERS u
         where u.ID = {$idUser}
     ");
@@ -184,9 +190,19 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
     ");
 
     // TODO: legacy fill table ZALICZKA_HIST
+    // $itemTodo['A_RECORD_UPDATE_AUTHOR'] = User::getLogin();
+		// $itemTodo['A_RECORD_UPDATE_DATE'] = "NOW()";
+		// $affected = DB::getPDO()->update($rootTableName, $pkField, $pk, $itemTodo);
+		// if ($affected && $histTableName) {
+		// 	$itemTodo['ID_USERS2'] = $pk;
+		// 	$itemTodo['A_RECORD_CREATE_AUTHOR'] = User::getLogin();
+		// 	$itemTodo['A_RECORD_CREATE_DATE'] = "NOW()";
+
     DB::getPDO()->execSql("
-      insert into `ZALICZKA_HIST` (ID_USERS2, L_APPOITMENT_USER, NIEROZLICZONA_KWOTA, KWOTA)
+      insert into `ZALICZKA_HIST` (ID_USERS2, L_APPOITMENT_USER, NIEROZLICZONA_KWOTA, KWOTA
+        , A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE)
         select z.ID as ID_USERS2, z.L_APPOITMENT_USER, z.NIEROZLICZONA_KWOTA, z.KWOTA
+          , z.A_RECORD_CREATE_AUTHOR, z.A_RECORD_CREATE_DATE
         from ZALICZKA z
         where z.ID = {$id}
     ");
@@ -358,6 +374,9 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
 				`L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT '',
 				`KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
 				`NIEROZLICZONA_KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
+				`UWAGI` varchar(255) NOT NULL DEFAULT '',
+        `PAYMENT_METHOD` enum('', 'Gotówka', 'Przelew') NOT NULL DEFAULT '',
+        `APPROVED_BY` varchar(255) NOT NULL DEFAULT '',
 				PRIMARY KEY (`ID`)
 			) ENGINE=MyISAM DEFAULT CHARSET=latin2;
 		");
@@ -375,6 +394,9 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
 				`L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
 				`KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
 				`NIEROZLICZONA_KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
+        `UWAGI` varchar(255) NOT NULL DEFAULT 'N/S;',
+        `PAYMENT_METHOD` varchar(255) NOT NULL DEFAULT 'N/S;',
+        `APPROVED_BY` varchar(255) NOT NULL DEFAULT 'N/S;',
 				PRIMARY KEY (`ID`),
 			  KEY `ID_USERS2` (`ID_USERS2`)
 			) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
@@ -423,30 +445,36 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
 
     echo UI::h('div', [ 'class' => "container", 'style' => "background:#ffe5b6; margin-top:6px" ], "<p style=\"margin:0; padding:6px\">Upgrade schema</p>");
     UI::startContainer([ 'style' => "max-height:200px; overflow-y:scroll; border:1px solid #ffe5b6" ]);
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `nr_faktury` varchar(255) NOT NULL DEFAULT '' ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `nr_faktury` varchar(255) NOT NULL DEFAULT '' ");
+    } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `vat` int(11) NOT NULL DEFAULT 23 ");
+    } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `kwota_netto` decimal(16,2) NOT NULL DEFAULT 0 ");
+    } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `kategoria_kosztu` varchar(255) NOT NULL DEFAULT '' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `vat` int(11) NOT NULL DEFAULT 23 ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `nr_faktury` varchar(255) NOT NULL DEFAULT 'N/S;' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `kwota_netto` decimal(16,2) NOT NULL DEFAULT 0 ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `vat` varchar(5) NOT NULL DEFAULT 'N/S;' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `kategoria_kosztu` varchar(255) NOT NULL DEFAULT '' ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `kwota_netto` varchar(16) NOT NULL DEFAULT 'N/S;' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `nr_faktury` varchar(255) NOT NULL DEFAULT 'N/S;' ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `kategoria_kosztu` varchar(255) NOT NULL DEFAULT 'N/S;' ");
+    } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
+    UI::endContainer();
+    UI::startContainer([ 'style' => "max-height:200px; overflow-y:scroll; border:1px solid #ffe5b6" ]);
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA` ADD `UWAGI` varchar(255) NOT NULL DEFAULT '' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `vat` varchar(5) NOT NULL DEFAULT 'N/S;' ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_HIST` ADD `UWAGI` varchar(255) NOT NULL DEFAULT 'N/S;' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `kwota_netto` varchar(16) NOT NULL DEFAULT 'N/S;' ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA` ADD `PAYMENT_METHOD` enum('', 'Gotówka', 'Przelew') NOT NULL DEFAULT '' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
-    try {
-      DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `kategoria_kosztu` varchar(255) NOT NULL DEFAULT 'N/S;' ");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_HIST` ADD `PAYMENT_METHOD` varchar(255) NOT NULL DEFAULT 'N/S;' ");
     } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA` ADD `APPROVED_BY` varchar(255) NOT NULL DEFAULT '' ");
+    } catch (Exception $e) { DBG::log($e); }
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_HIST` ADD `APPROVED_BY` varchar(255) NOT NULL DEFAULT 'N/S;' ");
+    } catch (Exception $e) { DBG::log($e); }
     UI::endContainer();
 
     ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');

+ 279 - 0
SE/se-lib/Schema/DefaultDb/zaliczka_wniosek/ZaliczkaWniosekStorageAcl.php

@@ -0,0 +1,279 @@
+<?php
+
+Lib::loadClass('Core_AclSimpleSchemaBase');// extends Core_AclBase
+Lib::loadClass('Core_AclHelper');
+Lib::loadClass('DBG');
+
+class Schema_DefaultDb_zaliczka_wniosek_ZaliczkaWniosekStorageAcl extends Core_AclSimpleSchemaBase {
+
+  public $_simpleSchema = [
+    'root' => [
+      '@namespace' => 'default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek',// Api_WfsNs::getBaseWfsUri() . '/default_db/Zaliczka'
+      '@primaryKey' => 'id',
+      'id' => [ '@type' => 'xsd:integer', '@alias' => 'ID' ],
+      'created' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_CREATE_DATE' ],
+      'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2, '@alias' => 'KWOTA' ],
+      'uwagi' => [ '@type' => 'xsd:string', '@alias' => 'UWAGI' ],
+      'status' => [ '@type' => 'p5:enum', '@alias' => 'A_STATUS', '@aliasMap' => [
+        'WAITING' => "Oczekuje zatwierdzenia",
+        'NORMAL' => "Zatwierdzony",
+        'OFF_HARD' => "Odrzucony",
+        'DELETED' => "Anulowany",
+      ], '@default' => 'WAITING' ],
+      'workerLogin' => [ '@type' => 'xsd:string', '@alias' => 'L_APPOITMENT_USER' ],
+      'approvedBy' => [ '@type' => 'xsd:string', '@alias' => 'APPROVED_BY' ],
+    ],
+  ];
+
+  public function getField($idField) {
+    $idField = (int)$idField;
+    $fieldName = DB::getPDO()->fetchValue("
+      select z.`DESC`
+      from CRM_LISTA_ZASOBOW z
+      where z.ID = $idField
+    ");
+    if ('id' == $fieldName) {
+      return [
+        'name' => 'id',
+        'type' => 'int(11)',
+        'perms' => 'R'
+      ];
+    }
+  }
+
+  public function addItem($itemTodo) {
+    DBG::log(['msg' => '$itemTodo', 'log' => $itemTodo]);
+    if (empty($itemTodo['kwota'])) throw new Exception("Nie podano kwoty");
+    if (empty($itemTodo['workerLogin'])) throw new Exception("Nie podano pracownika");
+
+    $id = DB::getPDO()->insert('ZALICZKA_WNIOSEK', [
+      'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
+      'A_RECORD_CREATE_DATE' => 'NOW()',
+      'L_APPOITMENT_USER' => $itemTodo['workerLogin'],
+      'KWOTA' => $itemTodo['kwota'],
+      'UWAGI' => $itemTodo['uwagi']
+    ]);
+    DBG::log(['msg' => '$id', 'log' => $id]);
+    if (!$id) throw new Exception("Wystąpiły błędy podczas dodawania Zaliczki do bazy danych");
+
+    DB::getPDO()->insert('ZALICZKA_WNIOSEK_HIST', [
+      'ID_USERS2' => $id,
+      'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
+      'A_RECORD_CREATE_DATE' => 'NOW()',
+      'L_APPOITMENT_USER' => $itemTodo['workerLogin'],
+      'KWOTA' => $itemTodo['kwota'],
+      'UWAGI' => $itemTodo['uwagi']
+    ]);
+    return $id;
+  }
+
+  public function updateItem($itemPatch) {
+    DBG::log(['msg' => '$itemPatch', $itemPatch]);
+    $pkField = $this->getPrimaryKeyField();
+    if (!array_key_exists($pkField, $itemPatch)) throw new Exception("Missing primary key");
+    $pk = (int)$itemPatch[$pkField];
+    if ($pk <= 0) throw new Exception("Wrong primary key format");
+
+    $sqlItemTodo = [];
+    if (array_key_exists('status', $itemPatch)) {
+      $sqlItemTodo['A_STATUS'] = $this->enumValueToSql('status', $itemPatch['status']);
+    }
+    if (array_key_exists('approvedBy', $itemPatch)) {
+      $sqlItemTodo['APPROVED_BY'] = $itemPatch['approvedBy'];
+    }
+    if (empty($sqlItemTodo)) throw new Exception("Nothing to change");
+
+    unset($sqlItemTodo[$pkField]);
+    DB::getPDO()->update($this->getRootTableName(), $pkField, $pk, $sqlItemTodo);
+    $sqlItemTodo['ID_USERS2'] = $pk;
+    DB::getPDO()->insert($this->getRootTableName() . "_HIST", $sqlItemTodo);
+  }
+
+  public function getItem($primaryKey, $params = []) {
+    $sqlWhere = $this->_parseSqlWhere([
+      '@primaryKey' => $primaryKey
+    ]);
+    $row = DB::getPDO()->fetchFirst("
+      select t.*
+        , (select u.ID from ADMIN_USERS u where u.ADM_ACCOUNT = t.L_APPOITMENT_USER limit 1) as ID_USER
+      from ZALICZKA_WNIOSEK t
+      {$sqlWhere}
+    ");
+    return [
+      'id' => $row['ID'],
+      'created' => $row['A_RECORD_CREATE_DATE'],
+      'status' => $this->enumValueFromSql('status', $row['A_STATUS']),
+      'kwota' => $row['KWOTA'],
+      'uwagi' => $row['UWAGI'],
+      'workerLogin' => $row['L_APPOITMENT_USER'],
+      'workerID' => $row['ID_USER'],
+    ];
+  }
+
+  public function getTotal($params = []) {
+    $sqlWhere = $this->_parseSqlWhere($params);
+    return DB::getPDO()->fetchValue("
+      select count(*) as cnt
+      from ZALICZKA_WNIOSEK t
+      {$sqlWhere}
+    ");
+  }
+
+  public function getItems($params = []) {
+    DBG::log(['msg'=>'getItems $params', '$params' => $params]);
+    $sqlWhere = $this->_parseSqlWhere($params);
+    $sqlOrderBy = "";
+    if (!empty($params['sortBy'])) {
+      $sqlOrderBy = $this->parseSqlSortBy($params['sortBy'], 't');
+    } else if (array_key_exists('order_by', $params) && array_key_exists('order_dir', $params)) {
+      $sqlOrderBy = $this->parseSqlSortBy("{$params['order_by']} {$params['order_dir']}", 't');
+    }
+    return array_map(function ($row) {
+      return [
+        'id' => $row['ID'],
+        'created' => $row['A_RECORD_CREATE_DATE'],
+        'status' => $this->enumValueFromSql('status', $row['A_STATUS']),
+        'kwota' => $row['KWOTA'],
+        'uwagi' => $row['UWAGI'],
+        'workerLogin' => $row['L_APPOITMENT_USER'],
+        'approvedBy' => $row['APPROVED_BY'],
+      ];
+    }, DB::getPDO()->fetchAll("
+      select t.*
+      from ZALICZKA_WNIOSEK t
+      {$sqlWhere}
+      {$sqlOrderBy}
+    "));
+  }
+
+  public function _parseSqlWhere($params = []) {
+    DBG::log(['msg'=>'_parseSqlWhere $params', '$params' => $params]);
+    $sqlWhere = [];
+    if (!empty($params['f_workerLogin'])) {
+      $sqlUserLogin = DB::getPDO()->quote($params['f_workerLogin'], PDO::PARAM_STR);
+      $sqlWhere[] = "t.`L_APPOITMENT_USER` = {$sqlUserLogin}";
+    }
+    if (!empty($params['f_id'])) {
+      $sqlWhere[] = "t.`ID` = " . DB::getPDO()->quote($params['f_id'], PDO::PARAM_STR);
+    }
+    if (!empty($params['@primaryKey'])) {
+      $sqlWhere[] = "t.`ID` = " . DB::getPDO()->quote($params['@primaryKey'], PDO::PARAM_STR);
+    }
+    return (!empty($sqlWhere)) ? " where " . implode("\n and ", $sqlWhere) : "";
+  }
+
+  public function enumValueFromSql($fieldName, $sqlValue) {
+    DBG::log(['msg'=>'enumValueFromSql $type', '$type' => $this->getXsdFieldType($fieldName)]);
+    if ('p5:enum' == $this->getXsdFieldType($fieldName)) {
+      $aliasMap = V::get('@aliasMap', '', $this->_simpleSchema['root'][$fieldName]);
+      if (!empty($aliasMap) && is_array($aliasMap)) {
+        if (array_key_exists($sqlValue, $aliasMap)) {
+          return $aliasMap[$sqlValue];
+        }
+      }
+    }
+    return $sqlValue;
+  }
+  public function enumValueToSql($fieldName, $value) {
+    DBG::log(['msg'=>'enumValueToSql $type', '$type' => $this->getXsdFieldType($fieldName)]);
+    if ('p5:enum' == $this->getXsdFieldType($fieldName)) {
+      $aliasMap = V::get('@aliasMap', '', $this->_simpleSchema['root'][$fieldName]);
+      if (empty($aliasMap) || !is_array($aliasMap)) throw new Exception("Schema error - missing @aliasMap for field '{$fieldName}'");
+      $aliasMap = array_flip($aliasMap);
+      if (!array_key_exists($value, $aliasMap)) throw new Exception("Schema error - value not exists in alias map");
+      return $aliasMap[$value];
+    }
+    throw new Exception("Schema error - field is not enum '{$fieldName}'");
+  }
+
+  /**
+  * @param sortBy ID A,COL_X D,COL_Y A,...
+  * @return sql string "order by ..."
+  */
+  public function parseSqlSortBy($sortBy, $sqlTablePrefix = 't') {
+    $list = $this->parseSortBy($sortBy);
+    DBG::log(['msg'=>'parseSqlSortBy $list', '$list' => $list]);
+    if (empty($list)) return "";
+    return "order by " . implode(", ", array_map(function ($orderItem) use ($sqlTablePrefix) {
+      list($fieldName, $order) = $orderItem;
+      $sqlFieldName = $this->getSqlFieldName($fieldName);
+      return "{$sqlTablePrefix}.`{$sqlFieldName}` {$order}";
+    }, $list));
+  }
+
+  /**
+  * @param sortBy ID A,COL_X D,COL_Y A,...
+  * @return array with field names and sort order: [ fieldName => order ( ASC | DESC ) ]
+  * TODO: require convert to sql names / validate if field exists or is allowed to sort
+  */
+  public function parseSortBy($sortBy) {
+    if (!$sortBy) return [];
+    return array_filter(
+      array_map(
+        function ($sortPart) {
+          DBG::log(['msg'=>'parseSortBy $sortPart', '$sortPart' => $sortPart]);
+          if (!$sortPart) return null;
+          list($fieldName, $order, $error) = explode(' ', trim($sortPart));
+          DBG::log("parseSortBy \$fieldName='{$fieldName}', \$order='{$order}', \$error='{$error}'");
+          if ($error) throw new Exception("sortBy parse error '{$sortPart}'");
+          if (!array_key_exists($fieldName, $this->_simpleSchema['root'])) throw new Exception("Parse sort by error - field not exists! '{$fieldName}'");
+          $order = strtoupper($order);
+          if ('A' == $order || 'ASC' == $order) {
+            $order = 'ASC';
+  				} else if ('D' == $order || 'DESC' == $order) {
+  					$order = 'DESC';
+  				} else throw new Exception("sortBy parse error - unknown sort order '{$order}' #" . __LINE__);
+          return [ $fieldName, $order ];
+        }, explode(',', $sortBy)
+      )
+      , function ($orderItem) {
+        return !empty($orderItem);
+      }
+    );
+  }
+
+  public function reinstall() {
+    // TODO: mv to Core_AclSimpleSchemaBase and reainstall by _simpleSchema - read current data from `information_schema`
+		DB::getPDO()->execSql("
+			CREATE TABLE IF NOT EXISTS `ZALICZKA_WNIOSEK` (
+				`ID` int(11) NOT NULL AUTO_INCREMENT,
+				`A_RECORD_CREATE_DATE` datetime  DEFAULT NULL,
+				`A_RECORD_CREATE_AUTHOR` varchar(20)  DEFAULT NULL,
+				`A_RECORD_UPDATE_DATE` datetime  DEFAULT NULL,
+				`A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+				`A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') DEFAULT 'WAITING',
+				`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
+				`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
+				`L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT '',
+				`KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
+				`UWAGI` varchar(255) NOT NULL DEFAULT '',
+				`APPROVED_BY` varchar(255) NOT NULL DEFAULT '',
+				PRIMARY KEY (`ID`)
+			) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+		");
+		DB::getPDO()->execSql("
+			CREATE TABLE IF NOT EXISTS `ZALICZKA_WNIOSEK_HIST` (
+				`ID` int(11) NOT NULL AUTO_INCREMENT,
+				`ID_USERS2` int(11) NOT NULL,
+				`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_STATUS` varchar(20) NOT NULL DEFAULT 'N/S;',
+				`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
+				`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
+				`L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
+				`KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
+        `UWAGI` varchar(255) NOT NULL DEFAULT 'N/S;',
+        `APPROVED_BY` varchar(255) NOT NULL DEFAULT 'N/S;',
+				PRIMARY KEY (`ID`),
+			  KEY `ID_USERS2` (`ID_USERS2`)
+			) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+		");
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_WNIOSEK` ADD `APPROVED_BY` varchar(255) NOT NULL DEFAULT '' ");
+    } catch (Exception $e) { DBG::log($e); }
+    try { DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_WNIOSEK_HIST` ADD `APPROVED_BY` varchar(255) NOT NULL DEFAULT 'N/S;' ");
+    } catch (Exception $e) { DBG::log($e); }
+  }
+
+}

+ 9 - 3
SE/se-lib/Schema/SystemObjectStorageAcl.php

@@ -73,9 +73,15 @@ class Schema_SystemObjectStorageAcl extends Core_AclSimpleSchemaBase {
       array_merge(
         array_map(
           function ($row) {
-            $row['namespace'] = "default_db/{$row['tabela']}";
-            $row['typeName'] = "default_db:{$row['tabela']}";
-            $row['ID'] = $this->_generateUniqueKeyFromNamespace($row['namespace']);
+            $row['ID'] = $row['id_zasob'];
+            if (false !== strpos($row['tabela'], '/')) {
+              $row['namespace'] = "{$row['tabela']}";
+              $row['typeName'] = "default_db:{$row['tabela']}";// TODO: parse namespace - get from acl
+            } else {
+              $row['namespace'] = "default_db/{$row['tabela']}";
+              $row['typeName'] = "default_db:{$row['tabela']}";
+              // $row['ID'] = $this->_generateUniqueKeyFromNamespace($row['namespace']);
+            }
             return $row;
           }
           , DB::getPDO()->fetchAll("

Plik diff jest za duży
+ 0 - 0
SE/static/vendor.js


+ 0 - 1
SE/static/zaliczka/main.css

@@ -1 +0,0 @@
-.App{text-align:center}.App-logo{-webkit-animation:App-logo-spin infinite 20s linear;animation:App-logo-spin infinite 20s linear;height:80px}.App-header{background-color:#222;height:150px;padding:20px;color:#fff}.App-intro{font-size:large}@-webkit-keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes App-logo-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}body{margin:0;padding:0;font-family:sans-serif}

Plik diff jest za duży
+ 0 - 0
SE/static/zaliczka/main.js


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików