Procházet zdrojové kódy

added edit cost in Budget for pro-netmedia

Piotr Labudda před 9 roky
rodič
revize
73d8336367

+ 185 - 4
SE/se-lib/Route/UrlAction/ProjektyProNetMediaBudget.php

@@ -426,7 +426,8 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 <script src="static/sweetalert2.min.js"></script>
 <script>
 (function(){
-	var _saveLink = '<?php echo Request::getPathUri(); ?>index.php?_route=UrlAction_ProjektyProNetMediaBudget&_task=addCostAjax&ID_PROJECT=<?php echo $data['id_project']; ?>';
+	var _saveAddCostLink = '<?php echo Request::getPathUri(); ?>index.php?_route=UrlAction_ProjektyProNetMediaBudget&_task=addCostAjax&ID_PROJECT=<?php echo $data['id_project']; ?>';
+	var _saveEditCostLink = '<?php echo Request::getPathUri(); ?>index.php?_route=UrlAction_ProjektyProNetMediaBudget&_task=editCostAjax&ID_PROJECT=<?php echo $data['id_project']; ?>';
 	var _dbg = <?php echo V::get('DBG', 0, $_REQUEST, 'int'); ?>;
 	var _initCosts = <?php echo json_encode($costs); ?>;
 	var _initBudgetValue = <?php echo ($data['budget']) ? $data['budget'] : 0; ?>;
@@ -556,42 +557,63 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 
 			// <td style="color:<?php echo ($cost['budget_aneks']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_aneks']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_aneks']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ANEKS', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_aneks'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_aneks']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_aneks'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_kary']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_kary']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_kary']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'KARY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_kary'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_kary']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_kary'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_osprzet']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_osprzet']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_osprzet']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'OSPRZET', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_osprzet'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_osprzet']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_osprzet'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_materialy']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_materialy']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_materialy']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'MATERIALY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_materialy'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_materialy']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_materialy'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_koszt_pracownikow']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_koszt_pracownikow']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_koszt_pracownikow']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'PRACOWNICY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_koszt_pracownikow'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_koszt_pracownikow']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_koszt_pracownikow'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_koszt_podwykonawcow']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_koszt_podwykonawcow']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_koszt_podwykonawcow']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'PODWYKONAWCY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_koszt_podwykonawcow'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_koszt_podwykonawcow']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_koszt_podwykonawcow'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_koszt_reprezentacyjny']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_koszt_reprezentacyjny']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_koszt_reprezentacyjny']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'REPREZENTACYJNE', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_koszt_reprezentacyjny'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_koszt_reprezentacyjny']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_koszt_reprezentacyjny'], '0,00')))
 			costNode.appendChild(tdNode)
@@ -665,48 +687,72 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 
 			// <td style="color:<?php echo ($cost['budget_zaliczki']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zaliczki']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_zaliczki']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZALICZKA_KWOTA', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zaliczki'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zaliczki']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zaliczki'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_rozliczone_zaliczki']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_rozliczone_zaliczki']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_rozliczone_zaliczki']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZALICZKA_KOSZTY_DZIENNE', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_rozliczone_zaliczki'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_rozliczone_zaliczki']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_rozliczone_zaliczki'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_zgoda_sluzebnosci']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zgoda_sluzebnosci']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_zgoda_sluzebnosci']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZGODY_SLUZEBNOSCI', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zgoda_sluzebnosci'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zgoda_sluzebnosci']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zgoda_sluzebnosci'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_zgoda_odszkodowania']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zgoda_odszkodowania']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_zgoda_odszkodowania']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZGODY_ODSZKODOWANIA', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zgoda_odszkodowania'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zgoda_odszkodowania']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zgoda_odszkodowania'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_sprzet_wlasny']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_sprzet_wlasny']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_sprzet_wlasny']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'SPRZET_WLASNY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_sprzet_wlasny'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_sprzet_wlasny']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_sprzet_wlasny'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_sprzet_wynajety']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_sprzet_wynajety']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_sprzet_wynajety']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'SPRZET_WYNAJETY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_sprzet_wynajety'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_sprzet_wynajety']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_sprzet_wynajety'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_organizacja_ruchu']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_organizacja_ruchu']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_organizacja_ruchu']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ORGANIZACJA_RUCHU', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_organizacja_ruchu'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_organizacja_ruchu']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_organizacja_ruchu'], '0,00')))
 			costNode.appendChild(tdNode)
 
 			// <td style="color:<?php echo ($cost['budget_zajetosc_pasa']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zajetosc_pasa']); ?></td>
 			tdNode = document.createElement('td')
+			if (cost['budget_zajetosc_pasa']) {
+				tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZAJETOSC_PASA', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zajetosc_pasa'] + "})");
+			}
 			p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zajetosc_pasa']) ? 'black' : 'silver')})
 			tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zajetosc_pasa'], '0,00')))
 			costNode.appendChild(tdNode)
@@ -723,6 +769,98 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 		if (!payload || !payload.props || !payload.props.type) return false;
 		budget_addCost(n, payload.props.type);
 	});
+	jQuery(document).on('p5:Budget:editCost:click', function(e, n, payload) {
+		if (!payload || !payload.props || !payload.props.type || !payload.props.id) return false;
+		budget_editCost(n, payload.props.id, payload.props.type, payload.props.price);
+	});
+
+	function budget_editCost(n, id, type, costPrice) {
+		var labels = {}
+		labels['ANEKS'] = "Aneks"
+		labels['KARY'] = "Kary, potrącenia"
+		labels['OSPRZET'] = "Osprzęt"
+		labels['MATERIALY'] = "Materiały"
+		labels['PRACOWNICY'] = "Koszty pracowników"
+		labels['PODWYKONAWCY'] = "Koszt firmy podwykonawczej"
+		labels['REPREZENTACYJNE'] = "Koszty reprezentacyjne"
+		labels['ZALICZKA_KWOTA'] = "Zaliczka kwota"
+		labels['ZALICZKA_KOSZTY_DZIENNE'] = "Rozliczanie zaliczki koszty dzienne"
+		labels['ZGODY_SLUZEBNOSCI'] = "Służebności"
+		labels['ZGODY_ODSZKODOWANIA'] = "Odszkodowania"
+		labels['SPRZET_WLASNY'] = "Sprzęt własny"
+		labels['SPRZET_WYNAJETY'] = "Sprzęt wynajęty"
+		labels['ORGANIZACJA_RUCHU'] = "Organizacja ruchu"
+		labels['ZAJETOSC_PASA'] = "Zajętość pasa drogowego"
+		var labelText = (type in labels) ? labels[type] : type
+		var desc = {}
+		desc['ANEKS'] = "<br>Proszę wprowadzić róznicę pomiędzy aktualnym <abbr title=\"kwotą na umowie lub poprzednim aneksie\">budżetem</abbr>, a kwotą na aneksie"
+		desc['ANEKS'] += ", np.:"
+		desc['ANEKS'] += "<br><small>- kwota na umowie: 100,000"
+		desc['ANEKS'] += "<br>- kwota na aneksie: 150,000"
+		desc['ANEKS'] += "<br>wprowadzamy: <code>-50,000</code></small>"
+		var descText = (type in desc) ? desc[type] : ''
+
+		swal({
+		  title: 'Kwota netto dla kosztu:',
+			html: '"' + labelText + '"' + descText,
+			animation: false,
+		  input: 'text',
+		  inputValue: costPrice,
+			inputPlaceholder: '0,00',
+			// inputAttributes: {'step': '0.01'},
+		  showCancelButton: true,
+		  confirmButtonText: 'Edytuj koszt',
+		  showLoaderOnConfirm: true,
+		  preConfirm: function(price) {
+		    return new Promise(function(resolve, reject) {
+					price = p5Utils__parseFloatOrZero(price)
+	        if ('ANEKS' != type && price <= 0) {
+	          reject('Kwota musi być większa od zera.')
+	        } else if ('ANEKS' == type && price == 0) {
+	          reject('Kwota musi być inna niż zero.')
+	        } else {
+						superagent
+							.post(_saveEditCostLink)
+							.type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form');
+							.send({
+								id: id,
+								type: type,
+								price: price
+							})
+							.set('Accept', 'application/json')
+							.end(function(err, res) {
+								if(_dbg)console.log('#widget-budget/editCost: res:', res, 'res.body:', res.body)
+								if (err || !res.ok) {
+									// jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Req error', err: err});
+									reject("Request error")
+								} else {
+									if ('application/json' !== res.type) {
+										reject("Wrong response type - required json")
+										return
+									}
+									if (!res.body.id || res.body.id <= 0) reject(res.body.msg || "Wystąpiły błędy podczas aktualizacji kosztu")
+									resolve(res.body)
+								}
+							})
+		      }
+		    })
+		  },
+		  allowOutsideClick: false
+		}).then(function(responseBody) {
+		  swal({
+		    type: 'success',
+				animation: false,
+		    title: responseBody.msg || 'Koszt zaktualizowano',
+		    html: 'Rodzaj kosztu: ' + (labelText || responseBody.type) + '<br>Kwota: ' + p5Utils__pricePrintPL(responseBody.price, '0') + '.'
+		  })
+			if (responseBody.update_data) {
+				// TODO: budget__renderData(responseBody.update_data)
+				budget__renderCosts(responseBody.update_data['costs']);
+			}
+		}).catch(function(e) {
+			// eg. hit Cancel
+		})
+	}
 
 	function budget_addCost(n, type) {
 		var labels = {}
@@ -766,10 +904,10 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 	        if ('ANEKS' != type && price <= 0) {
 	          reject('Kwota musi być większa od zera.')
 	        } else if ('ANEKS' == type && price == 0) {
-	          reject('Kwota musi być inna niż zera.')
+	          reject('Kwota musi być inna niż zero.')
 	        } else {
 						superagent
-							.post(_saveLink)
+							.post(_saveAddCostLink)
 							.type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form');
 							.send({
 								type: type,
@@ -829,7 +967,7 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 			if (empty($json)) throw new Exception("Error Processing Request - json expected");
 			$json = @json_decode($json, $assoc = true);
 			if (null == $json && 0 !== json_last_error()) throw new Exception("Error Processing Request - Parse json error: " . json_last_error());
-			$price = V::get('price', '', $json);
+			$price = V::get('price', '', $json, 'price');
 			$type = V::get('type', '', $json);
 			if (empty($price)) throw new Exception("Missing price");
 			if (empty($type)) throw new Exception("Missing type");
@@ -860,6 +998,49 @@ dostęp dla zarządu i os. odp.	kwota końcowa
 		Response::sendJsonExit($response);
 	}
 
+	public function editCostAjaxAction() {
+		$response = array();
+		$response['type'] = 'danger';
+		$response['msg'] = 'Unknown error';
+		try {
+			$idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
+			if (!$idProject) throw new Exception("Missing id project");
+			$json = Request::getRequestBody();
+			if (empty($json)) throw new Exception("Error Processing Request - json expected");
+			$json = @json_decode($json, $assoc = true);
+			if (null == $json && 0 !== json_last_error()) throw new Exception("Error Processing Request - Parse json error: " . json_last_error());
+			$id = V::get('id', '', $json);
+			$price = V::get('price', '', $json, 'price');
+			$type = V::get('type', '', $json);
+			if (empty($price)) throw new Exception("Missing price");
+			if (empty($type)) throw new Exception("Missing type");
+			$response['price'] = $price;
+			$response['type'] = $type;
+
+			$cost = array();
+			$cost['ID'] = $id;
+			$cost['ID_PROJECT'] = $idProject;
+			$cost['COST_VALUE'] = $price;
+			$cost['COST_TYPE'] = $type;
+			// $cost['NOTES'] = $notes;// TODO: add notes to form?
+			$affected = DB::getDB()->UPDATE_OBJ('PROJECT_COSTS', (object)$cost);
+			if ($affected <= 0) throw new Exception("Wystąpiły błędy podczas aktualizacji rekordu w bazie danych");
+			$response['id'] = $id;
+			$response['type'] = 'success';
+			$response['msg'] = "Koszt został zaktualizowany";
+			{// update costs
+				$data = array();
+				$data['id_project'] = $idProject;
+				$data = $this->setProps($data);
+				$response['update_data'] = $data;
+			}
+		} catch (Exception $e) {
+			$response['type'] = 'danger';
+			$response['msg'] = $e->getMessage();
+		}
+		Response::sendJsonExit($response);
+	}
+
 }
 
 /*

+ 7 - 0
SE/se-lib/V.php

@@ -100,6 +100,13 @@ class V {
 					settype($ret, $type);
 				}
 				break;
+			case 'price':// 0.00 - decimal(n, 2)
+				if (is_scalar($from)) {
+					$ret = str_replace(',', '.', $from);
+					settype($ret, 'float');
+					$ret = round($ret, 2);
+				}
+				break;
 			case 'object':
 			case 'array':
 				if (is_scalar($from) || is_array($from) || is_object($from)) {