ソースを参照

updated ZamZlec pro-netmedia

Piotr Labudda 10 年 前
コミット
f5b2699748

+ 661 - 122
SE/se-lib/Route/UrlAction/ProjektyProNetMediaZamZlec.php

@@ -13,6 +13,24 @@ class Route_UrlAction_ProjektyProNetMediaZamZlec extends RouteBase {// TODO: Url
 		}
 	}
 
+/*
+
+Kwota planowana
+Zamówienie
+zaliczki
+ilość pracowników / koszty pracownicze: powiązanie z raportami X współczynnik
+koszty sprzętu/ wynajmowany na budowie: rozdział na różne rodzaj sprzętu: koparka itp.
+koszty własne: naprawy sprzętu
+koszty materiałów
+osprzet
+dodatkowe koszty związane z nadwyżkami - rozbieżności odnośnie ustaleń
+
+
+podkład fv	podkład fv
+dostęp dla zarządu i os. odp.	kwota końcowa
+
+*/
+
 	public function typespecialAction() {
 		$DBG = ('1' == V::get('DBG', '', $_REQUEST));
 		header("Content-type: application/json");
@@ -60,6 +78,18 @@ class Route_UrlAction_ProjektyProNetMediaZamZlec extends RouteBase {// TODO: Url
 		SE_Layout::dol();
 	}
 
+	public function addZlecenieAction() {
+		die("TODO: add zlecenie and redirect");
+	}
+
+	public function rmOrdersDataAction() {// TODO: RMME only TEST
+		if ('diradmin' != User::getLogin()) die('access denied!');
+		if ('doRemove' != V::get('rm', '', $_GET)) die('confirmation required!');
+		DB::getPDO()->exec("TRUNCATE CRM_LISTA_ZASOBOW_ORDERS_HIST");
+		DB::getPDO()->exec("TRUNCATE CRM_LISTA_ZASOBOW_ORDERS");
+		die('orders data removed');
+	}
+
 	public function zlecenieAction() {
 		SE_Layout::gora();
 		if (1 != V::get('_print', '', $_GET)) SE_Layout::menu();
@@ -90,25 +120,87 @@ class Route_UrlAction_ProjektyProNetMediaZamZlec extends RouteBase {// TODO: Url
 		SE_Layout::dol();
 	}
 
+	public function addZamowienieAction() {
+		$id_company = V::get('id_company', 0, $_REQUEST, 'int');
+		$id_project = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
+		$orderType = 'zamowienie';
+
+		$data = array();
+		$data['id_company'] = $id_company;
+		$data['id_project'] = $id_project;
+		$data = $this->setProps($data);
+
+		$sqlFieldsList = array();
+		$sqlFieldsList[] = 'ID_PROJECT';
+		$sqlFieldsList[] = 'ID_COMPANIES';
+		$sqlFieldsList[] = 'COMPANY_NAME';
+		$sqlFieldsList[] = 'COMPANY_ADDRESS';
+		$sqlFieldsList[] = 'COMPANY_POST_CODE';
+		$sqlFieldsList[] = 'COMPANY_CITY';
+		$sqlFieldsList[] = 'COMPANY_NIP';
+		$sqlFieldsList[] = 'COMPANY_CONTACT_PERSON';
+		$sqlFieldsList[] = 'COMPANY_CONTACT_TEL';
+		$sqlFieldsList[] = 'COMPANY_CONTACT_MAIL';
+		$sqlFieldsList[] = 'DELIVERY_DATE';
+		$sqlFieldsList[] = 'DELIVERY_TYPE';
+		$sqlFieldsList[] = 'DELIVERY_LOCATION';
+		$sqlFieldsList[] = 'CASH_PENALTY';
+		$sqlFieldsList[] = 'ORDER_CONTACT_PERSON';
+		$sqlFieldsList[] = 'ORDER_APPROVE_PERSON';
+		$sqlFieldsList[] = 'DELIVERY_CONTACT_PERSON';
+		$sqlObj = array();
+		$sqlObj['ORDER_TYPE'] = $orderType;
+		foreach ($data as $fldName => $val) {
+			if (!in_array($fldName, $sqlFieldsList)) continue;
+			$sqlObj[$fldName] = $val;
+		}
+
+		$idOrder = DB::getDB()->ADD_NEW_OBJ('CRM_LISTA_ZASOBOW_ORDERS', (object)$sqlObj);
+		if ($idOrder > 0) {
+			{// update `ORDER_LABEL`: nr zamówienia / inicjały zamawiającego / numer budowy / miesiąc / rok
+				if (!empty($data['obcy_nr_sprawy'])) {
+					$inicjaly = User::getInicjaly();
+					$year = date('Y');
+					$month = '';// n	Liczbowa forma miesiąca, bez zer wiodących	1 aż do 12
+					switch (date('n')) {
+						case  1: $month = 'I'; break;
+						case  2: $month = 'II'; break;
+						case  3: $month = 'III'; break;
+						case  4: $month = 'IV'; break;
+						case  5: $month = 'V'; break;
+						case  6: $month = 'VI'; break;
+						case  7: $month = 'VII'; break;
+						case  8: $month = 'VIII'; break;
+						case  9: $month = 'IX'; break;
+						case 10: $month = 'X'; break;
+						case 11: $month = 'XI'; break;
+						case 12: $month = 'XII'; break;
+					}
+					$data['ORDER_LABEL'] = "{$idOrder}/{$inicjaly}/{$data['obcy_nr_sprawy']}/{$month}/{$year}";// TODO: nr zamówienia / inicjały zamawiającego / numer budowy / miesiąc / rok
+				}
+				DB::getPDO()->exec("update CRM_LISTA_ZASOBOW_ORDERS set ORDER_LABEL = '{$data['ORDER_LABEL']}' where ID = '{$idOrder}'");
+			}
+			$urlZam = Request::getPathUri() . "index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task={$orderType}&id={$idOrder}";
+			header("Location: {$urlZam}");
+			exit;
+		} else {
+			SE_Layout::gora();
+			SE_Layout::menu();
+			SE_Layout::alert('danger', 'Nie udało się utworzyć rekordu');
+			SE_Layout::dol();
+		}
+	}
+
 	public function zamowienieAction() {
 		SE_Layout::gora();
 		if (1 != V::get('_print', '', $_GET)) SE_Layout::menu();
 		try {
+			$id_order = V::get('id', 0, $_REQUEST, 'int');
 			$id_project = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
 			$id_company = V::get('id_company', 0, $_REQUEST, 'int');
 			$items_count = V::get('items_count', 10, $_REQUEST, 'int');
-			if (1 != V::get('_print', '', $_GET)) {
-				$basePrintUrl = "index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&ID_PROJECT={$id_project}";
-				$basePrintUrl .= "&id_company={$id_company}";
-				$basePrintUrl .= "&items_count={$items_count}";
-				?>
-				<div class="container" style="margin:2em auto; text-align:right">
-					<a class="btn btn-default" href="<?php echo $basePrintUrl; ?>">Cofnij</a>
-					<a class="btn btn-primary" href="<?php echo $basePrintUrl; ?>&_task=zamowienie&_print=1" target="_blank">Drukuj Zamówienie</a>
-				</div>
-				<?php
-			}
 			$data = array();
+			$data['id'] = $id_order;
 			$data['ile_pozycji'] = $items_count;
 			$data['id_company'] = $id_company;
 			$data['id_project'] = $id_project;
@@ -121,34 +213,84 @@ class Route_UrlAction_ProjektyProNetMediaZamZlec extends RouteBase {// TODO: Url
 	}
 
 	public function setProps($data) {
+		$data['_nr_budowy'] = '';// TODO: fetch from project - field M_DIST_DESC
+
+		$sqlIdOrder = V::get('id', 0, $data, 'int');
+		if ($sqlIdOrder > 0) {
+			$rows = DB::getPDO()->fetchAll("
+				select t.*
+				from CRM_LISTA_ZASOBOW_ORDERS t
+				where t.ID = {$sqlIdOrder}
+			");
+			if (count($rows) > 0) {
+				$row = reset($rows);
+				if (!empty($row['ID_COMPANIES'])) $data['id_company'] = $row['ID_COMPANIES'];
+				if (!empty($row['ID_PROJECT']))   $data['id_project'] = $row['ID_PROJECT'];
+
+				$data['ORDER_TYPE'] = V::get('ORDER_TYPE', '', $row);
+				$data['ORDER_LABEL'] = V::get('ORDER_LABEL', '', $row);
+				$data['OFFER_NR'] = V::get('OFFER_NR', '', $row);
+				$data['COMPANY_NAME'] = V::get('COMPANY_NAME', '', $row);
+				$data['COMPANY_ADDRESS'] = V::get('COMPANY_ADDRESS', '', $row);
+				$data['COMPANY_POST_CODE'] = V::get('COMPANY_POST_CODE', '', $row);
+				$data['COMPANY_CITY'] = V::get('COMPANY_CITY', '', $row);
+				$data['COMPANY_NIP'] = V::get('COMPANY_NIP', '', $row);
+				$data['COMPANY_CONTACT_PERSON'] = V::get('COMPANY_CONTACT_PERSON', '', $row);
+				$data['COMPANY_CONTACT_TEL'] = V::get('COMPANY_CONTACT_TEL', '', $row);
+				$data['COMPANY_CONTACT_MAIL'] = V::get('COMPANY_CONTACT_MAIL', '', $row);
+				$data['DELIVERY_DATE'] = V::get('DELIVERY_DATE', '', $row);
+				$data['DELIVERY_TYPE'] = V::get('DELIVERY_TYPE', '', $row);
+				$data['DELIVERY_LOCATION'] = V::get('DELIVERY_LOCATION', '', $row);
+				$data['CASH_PENALTY'] = V::get('CASH_PENALTY', '', $row);
+				$data['ORDER_CONTACT_PERSON'] = V::get('ORDER_CONTACT_PERSON', '', $row);
+				$data['ORDER_APPROVE_PERSON'] = V::get('ORDER_APPROVE_PERSON', '', $row);
+				$data['DELIVERY_CONTACT_PERSON'] = V::get('DELIVERY_CONTACT_PERSON', '', $row);
+			}
+
+			$data['orderPosList'] = $this->fetchOrderPosList($sqlIdOrder);
+		}
 		$sqlIdCompany = V::get('id_company', 0, $data, 'int');
 		if ($sqlIdCompany > 0) {
 			$rows = DB::getPDO()->fetchAll("
-			select c.*
-			from COMPANIES c
-			where c.ID = {$sqlIdCompany}
+				select c.*
+				from COMPANIES c
+				where c.ID = {$sqlIdCompany}
 			");
 			if (count($rows) > 0) {
 				$row = reset($rows);
-				if (!empty($row['P_NAME'])) $data['dostawca_name'] = $row['P_NAME'];
-				$data['dostawca_address'] = "{$row['P_ADDRESS_POST_CODE']} {$row['P_ADDRESS_CITY']}, ul. {$row['P_ADDRESS_STREET']} {$row['P_ADDRESS_HOUSE']}";
-				if (!empty($row['P_ADDRESS_HOME'])) $data['dostawca_address'] .= "/{$row['P_ADDRESS_HOME']}";
-				if (!empty($row['P_NIP'])) $data['dostawca_nip'] = $row['P_NIP'];
+				DBG::_('DBG', '>2', "company by id='{$sqlIdCompany}'", $row, __CLASS__, __FUNCTION__, __LINE__);
+				if (empty($data['COMPANY_NAME'])) $data['COMPANY_NAME'] = V::get('P_NAME', '', $row);
+				if (empty($data['COMPANY_ADDRESS'])) {
+					$data['COMPANY_ADDRESS'] = V::get('P_ADDRESS_STREET', '', $row);
+					if (!empty($row['P_ADDRESS_HOUSE'])) $data['COMPANY_ADDRESS'] .= " {$row['P_ADDRESS_HOUSE']}";// TODO: add P_ADDRESS_HOUSE
+					if (!empty($row['P_ADDRESS_HOME'])) $data['COMPANY_ADDRESS'] .= "/{$row['P_ADDRESS_HOME']}";// TODO: add '/' P_ADDRESS_HOME
+				}
+				if (empty($data['COMPANY_POST_CODE'])) $data['COMPANY_POST_CODE'] = V::get('P_ADDRESS_POST_CODE', '', $row);
+				if (empty($data['COMPANY_CITY'])) $data['COMPANY_CITY'] = V::get('P_ADDRESS_CITY', '', $row);
+				if (empty($data['COMPANY_NIP'])) $data['COMPANY_NIP'] = V::get('P_NIP', '', $row);
+				if (empty($data['COMPANY_CONTACT_PERSON'])) $data['COMPANY_CONTACT_PERSON'] = V::get('P_CONTACT_PERSON', '', $row);
+				if (empty($data['COMPANY_CONTACT_TEL'])) $data['COMPANY_CONTACT_TEL'] = V::get('P_PHONE', '', $row);
+				if (empty($data['COMPANY_CONTACT_MAIL'])) $data['COMPANY_CONTACT_MAIL'] = V::get('user_mail_contact', '', $row);
 			}
 		}
 		$sqlIdProject = V::get('id_project', 0, $data, 'int');
 		if ($sqlIdProject > 0) {
 			$rows = DB::getPDO()->fetchAll("
-			select p.*
-			from IN7_MK_BAZA_DYSTRYBUCJI p
-			where p.ID = {$sqlIdProject}
+				select p.*
+				from IN7_MK_BAZA_DYSTRYBUCJI p
+				where p.ID = {$sqlIdProject}
+				limit 1
 			");
 			if (count($rows) > 0) {
 				$row = reset($rows);
 				if (!empty($row['M_DIST_DEALNUM'])) $data['obcy_nr_sprawy'] = $row['M_DIST_DEALNUM'];
+				if (!empty($row['M_DIST_DESC'])) $data['_nr_budowy'] = $row['M_DIST_DESC'];
 			}
 		}
+		if (!empty($data['id_company'])) $data['ID_COMPANIES'] = $data['id_company'];
+		if (!empty($data['id_project'])) $data['ID_PROJECT'] = $data['id_project'];
 		// TODO: $data['obcy_nr_sprawy'] = 'zam./OSOBA/nr budowy/I/2016' lub 'zlec./OSOBA/nr budowy/I/2016'
+
 		return $data;
 	}
 
@@ -157,6 +299,20 @@ class Route_UrlAction_ProjektyProNetMediaZamZlec extends RouteBase {// TODO: Url
 		$id_company = V::get('id_company', 0, $data);
 		$items_count = V::get('items_count', 0, $data);
 		$widgetCompanies = V::get('widgetCompanies', array(), $data);
+
+		$sqlWhere = '';
+		if ($id_project > 0) $sqlWhere = "where o.ID_PROJECT = {$id_project}";
+		$projOrders = DB::getPDO()->fetchAll("
+			select o.*
+					, p.M_DIST_DEALNUM as obcy_nr_sprawy
+			from CRM_LISTA_ZASOBOW_ORDERS o
+				left join IN7_MK_BAZA_DYSTRYBUCJI p on(p.ID = o.ID_PROJECT)
+				left join COMPANIES c on(c.ID = o.ID_COMPANIES)
+			{$sqlWhere}
+			order by ID DESC
+			limit 100
+		");
+
 ?>
 <div class="container" style="margin-top:2em">
 	<form action="" method="get" class="form-horizontal">
@@ -191,29 +347,57 @@ class Route_UrlAction_ProjektyProNetMediaZamZlec extends RouteBase {// TODO: Url
 					<?php endif; ?>
 		    </div>
 		  </div>
+<!--
 		  <div class="form-group">
 		    <label for="items_count" class="col-sm-2 control-label">Ilość pozycji</label>
 		    <div class="col-sm-4">
 					<input type="number" name="items_count" value="<?php echo $items_count; ?>" class="form-control">
 		    </div>
 		  </div>
+-->
 		  <div class="form-group">
 		    <div class="col-sm-offset-2 col-sm-10">
 					<input type="hidden" name="_task" value="">
-		      <button type="submit" class="btn btn-default" onclick="return submitZamowienie(this);">Zamówienie</button>
-		      <button type="submit" class="btn btn-default" onclick="return submitZlecenie(this);">Zlecenie</button>
+					<label>Dodaj nowe </label>
+		      <button type="submit" class="btn btn-primary" onclick="return submitZamowienie(this);">Zamówienie</button>
+		      <button type="submit" class="btn btn-primary" onclick="return submitZlecenie(this);">Zlecenie</button>
 		    </div>
 		  </div>
 	</form>
+
+	<hr>
+	<table class="table table-bordered table-hover">
+		<thead>
+			<tr>
+				<th>#</th>
+				<th>id</th>
+				<th>nr zlecenia</th>
+				<th>nr budowy</th>
+			</tr>
+		</thead>
+		<tbody>
+		<?php foreach ($projOrders as $order) : ?>
+			<tr>
+				<td>
+					<a href="index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=<?php echo $order['ORDER_TYPE']; ?>&id=<?php echo $order['ID']; ?>"
+						class="btn btn-link btn-xs">Edytuj <?php echo $order['ORDER_TYPE']; ?></a>
+				</td>
+				<td><?php echo $order['ID']; ?></td>
+				<td><?php echo $order['ORDER_LABEL']; ?></td>
+				<td><?php echo $order['obcy_nr_sprawy']; ?></td>
+			</tr>
+		<?php endforeach; ?>
+		</tbody>
+	</table>
 </div>
 <script>
 function submitZamowienie(fld) {
 	var frm = fld.form;
-	frm['_task'].value='zamowienie';
+	frm['_task'].value='addZamowienie';
 }
 function submitZlecenie(fld) {
 	var frm = fld.form;
-	frm['_task'].value='zlecenie';
+	frm['_task'].value='addZlecenie';
 }
 </script>
 <?php
@@ -335,104 +519,362 @@ body { font-size:12px; line-height:1.3em }
 		$body = Request::getRequestBody();
 		$json = json_decode($body, $assoc = true);
 
+		$data = array();
+		$data['id'] = V::get('id', 0, $_REQUEST, 'int');
+		$data['id_company'] = V::get('id_company', 0, $_REQUEST, 'int');
+		$data['id_project'] = V::get('id_project', 0, $_REQUEST, 'int');
+		$data = $this->setProps($data);
+
 		$res = new stdClass();
 		$res->type = 'success';
 		$res->msg = 'OK';
+		$res->idOrder = V::get('idOrder', -1, $json, 'int');
 		$res->orderPosList = array();
-		if (!empty($json['orderPosList'])) {
+		$res->fields = new stdClass();
+		$res->DBG_DATA = $data;// TODO: DBG
+		if (!empty($json['fields'])) {
+			$sqlFieldsList = array();
+			$sqlFieldsList[] = 'ID_PROJECT';
+			$sqlFieldsList[] = 'ID_COMPANIES';
+			$sqlFieldsList[] = 'COMPANY_NAME';
+			$sqlFieldsList[] = 'COMPANY_ADDRESS';
+			$sqlFieldsList[] = 'COMPANY_POST_CODE';
+			$sqlFieldsList[] = 'COMPANY_CITY';
+			$sqlFieldsList[] = 'COMPANY_NIP';
+			$sqlFieldsList[] = 'COMPANY_CONTACT_PERSON';
+			$sqlFieldsList[] = 'COMPANY_CONTACT_TEL';
+			$sqlFieldsList[] = 'COMPANY_CONTACT_MAIL';
+			$sqlFieldsList[] = 'DELIVERY_DATE';
+			$sqlFieldsList[] = 'DELIVERY_TYPE';
+			$sqlFieldsList[] = 'DELIVERY_LOCATION';
+			$sqlFieldsList[] = 'CASH_PENALTY';
+			$sqlFieldsList[] = 'ORDER_CONTACT_PERSON';
+			$sqlFieldsList[] = 'ORDER_APPROVE_PERSON';
+			$sqlFieldsList[] = 'DELIVERY_CONTACT_PERSON';
+			$sqlFieldsList[] = 'OFFER_NR';
+
+			$sqlObj = array();
+			//$sqlObj['ORDER_TYPE'] = $json['type'];
+			foreach ($data as $fldName => $val) {
+				if (!in_array($fldName, $sqlFieldsList)) continue;
+				$sqlObj[$fldName] = $val;
+			}
+			foreach ($json['fields'] as $fldName => $val) {
+				if (!in_array($fldName, $sqlFieldsList)) continue;
+				$sqlObj[$fldName] = $val;
+			}
+			$res->TODO_SQL_OBJ = $sqlObj;
+			$res->fields = $sqlObj;
+
+			if ($res->idOrder > 0) {
+				$sqlObj['ID'] = $res->idOrder;
+				$affected = DB::getDB()->UPDATE_OBJ('CRM_LISTA_ZASOBOW_ORDERS', (object)$sqlObj);
+				if ($affected > 0) {
+					$res->type = 'success';
+					$res->msg = "Zaktualizowano rekord '{$res->idOrder}'";
+					$rows = DB::getPDO()->fetchAll("select * from CRM_LISTA_ZASOBOW_ORDERS where ID = '{$res->idOrder}'");
+					$row = reset($rows);
+					$res->fields = (object)$row;
+				} else if ($affected < 0) {
+					$res->type = 'danger';
+					$res->msg = 'Nie udało się wprowadzić zmian';
+				}
+			} else {
+				$idOrder = DB::getDB()->ADD_NEW_OBJ('CRM_LISTA_ZASOBOW_ORDERS', (object)$sqlObj);
+				if ($idOrder > 0) {
+					$res->idOrder = $idOrder;
+					$res->type = 'success';
+					$res->msg = "Utworzono rekord nr '{$res->idOrder}'";
+					$rows = DB::getPDO()->fetchAll("select * from CRM_LISTA_ZASOBOW_ORDERS where ID = '{$res->idOrder}'");
+					$row = reset($rows);
+					$res->fields = (object)$row;
+				} else {
+					$res->idOrder = -1;
+					$res->type = 'danger';
+					$res->msg = 'Nie udało się utworzyć rekordu';
+				}
+			}
+		}
+
+		$currentPosList = $this->fetchOrderPosList($res->idOrder);
+
+		$res->validateErrors = array();
+		if (!empty($json['orderPosList']) && $res->idOrder > 0) {
+			$idMap = array();// $idFrontEnd => $idBackEnd
 			foreach ($json['orderPosList'] as $item) {
-				if ($item['id'] < 0) {// TODO: add new record
-					$item['id'] = -1 * $item['id'] + 10000;
-				} else {// TODO: update record
+				$sqlObj = array();
+				$sqlObj['ID_ORDER'] = $res->idOrder;
+				if ($item['id'] <= 0
+					&& empty($item['name'])
+					&& empty($item['price'])
+					&& empty($item['quantity'])
+					&& empty($item['unit'])) {// skip empty pos
+					continue;
+				}
+
+				$validatePosErrors = $this->validatePos($item);
+				if (!empty($validatePosErrors)) {
+					$res->validateErrors[ $item['id'] ] = $validatePosErrors;
+				} else {
+					$sqlObj['OFFER_NAME'] = $item['name'];
+					$sqlObj['OFFER_PRICE_PER_UNIT'] = $item['price'];
+					$sqlObj['OFFER_QUANTITY'] = $item['quantity'];
+					$sqlObj['OFFER_UNIT'] = $item['unit'];
+					if ($item['id'] > 0) {
+						$sqlObj['ID'] = $item['id'];
+					}
+					if ($sqlObj['ID'] > 0) {
+						DB::getDB()->UPDATE_OBJ('CRM_LISTA_ZASOBOW_OFFERS', (object)$sqlObj);
+					} else {
+						$idPos = DB::getDB()->ADD_NEW_OBJ('CRM_LISTA_ZASOBOW_OFFERS', (object)$sqlObj);
+						$idMap[ $item['id'] ] = $idPos;
+					}
+				}
+			}
+			if (!empty($json['toDeletePosList']) && $res->idOrder > 0) {
+				$res->DELETE_LOG = array();
+				foreach ($json['toDeletePosList'] as $idFrontEnd => $bool) {
+					if (!$bool) continue;
+					if ($idFrontEnd <= 0) continue;
+					if (array_key_exists($idFrontEnd, $currentPosList)) {
+						$sqlObj = array();
+						$sqlObj['ID'] = $idFrontEnd;
+						$sqlObj['A_STATUS'] = 'DELETED';
+						$res->DELETE_LOG[$idFrontEnd] =  DB::getDB()->UPDATE_OBJ('CRM_LISTA_ZASOBOW_OFFERS', (object)$sqlObj);
+					}
+				}
+			}
+			$orderPoslist = array();
+			{// fix state frontEnd <--> backEnd
+				$updatedPosList = $this->fetchOrderPosList($res->idOrder);
+				foreach ($json['orderPosList'] as $item) {
+					$idFrontEnd = $item['id'];
+					$idBackEnd = 0;
+					if ($idFrontEnd <= 0 && array_key_exists($idFrontEnd, $idMap)) {
+						$idBackEnd = $idMap[$idFrontEnd];
+					} else {// $item['id'] > 0
+						$idBackEnd = $idFrontEnd;
+					}
+					if (!array_key_exists($idBackEnd, $updatedPosList)) $idBackEnd = 0;
+
+					if ($idBackEnd) {
+						$orderPoslist[] = $updatedPosList[ $idBackEnd ];
+					} else {
+						$orderPoslist[] = $item;
+						$res->validateErrors[ $item['id'] ][ 'name' ] = true;
+						$res->validateErrors[ $item['id'] ][ 'price' ] = true;
+						$res->validateErrors[ $item['id'] ][ 'quantity' ] = true;
+						$res->validateErrors[ $item['id'] ][ 'unit' ] = true;
+					}
+				}
+				$res->orderPosList = $orderPoslist;
+			}
+			foreach ($idMap as $idFrontEnd => $idBackEnd) {
+				if (array_key_exists($idFrontEnd, $res->validateErrors)) {
 
 				}
-				$res->orderPosList[] = $item;
 			}
 		}
+		$res->validateErrors = (object)$res->validateErrors;
 		Response::sendJsonExit($res);
 	}
 
-	public function zamowienieView($data) {
+	public function validatePos($item) {
+		$validatePosErrors = array();
+		if (empty($item['name'])) $validatePosErrors['name'] = 'Brak nazwy';
+		if (empty($item['unit'])) $validatePosErrors['unit'] = 'Brak jednostki';
+		if (empty($item['quantity'])) $validatePosErrors['quantity'] = 'Brak ilości';
+		if (empty($item['price'])) $validatePosErrors['price'] = 'Brak ceny jednostkowej';
+		return $validatePosErrors;
+	}
+
+	public function fetchOrderPosList($idOrder) {
 		$orderPosList = array();
-		$ile_pozycji = V::get('ile_pozycji', 10, $data);
-		for ($i = 1; $i <= $ile_pozycji; $i++) {
-			$posItem = array('id' => -1 * $i, 'name' => '', 'price' => '', 'quantity' => '', 'unit' => '');
-			$orderPosList[] = (object)$posItem;
+		$rows = DB::getPDO()->fetchAll("
+			select o.*
+			from CRM_LISTA_ZASOBOW_OFFERS o
+			where o.ID_ORDER = {$idOrder}
+				and (o.A_STATUS != 'DELETED' or o.A_STATUS is null)
+		");
+		foreach ($rows as $row) {
+			$price = number_format($row['OFFER_PRICE_PER_UNIT'], 4, '.', '');
+			$price_f2 = number_format($row['OFFER_PRICE_PER_UNIT'], 2, '.', '');
+			if ($price_f2 . "00" == $price) $price = $price_f2;
+
+			$quantity = number_format($row['OFFER_QUANTITY'], 4, '.', '');
+			$quantity_f2 = number_format($row['OFFER_QUANTITY'], 2, '.', '');
+			$quantity_int = intval($row['OFFER_QUANTITY']);
+			if ($quantity_int . ".0000" == $quantity) $quantity = $quantity_int;
+			else if ($quantity_f2 . "00" == $quantity) $quantity = $quantity_f2;
+			$posItem = array('id' => $row['ID'], 'name' => $row['OFFER_NAME'], 'price' => $price, 'quantity' => $quantity, 'unit' => $row['OFFER_UNIT']);
+			$orderPosList[ $row['ID'] ] = (object)$posItem;
 		}
-		// fetch from db - overwrite $orderPosList
+		return $orderPosList;
+	}
 
-		$saveLink = Request::getPathUri() . 'index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=saveAjax';
+	public function zamowienieView($data) {
+		$id_order = V::get('id', 0, $data);
+		$id_company = V::get('id_company', 0, $data);
+		$id_project = V::get('id_project', 0, $data);
+		$orderPosList = array();
 
+		if ($id_order > 0) {
+			$orderPosList = V::get('orderPosList', array(), $data);
+			$orderPosList = array_values($orderPosList);
+		}
+		if (empty($orderPosList)) {
+			$ile_pozycji = V::get('ile_pozycji', 10, $data);
+			for ($i = 1; $i <= $ile_pozycji; $i++) {
+				$posItem = array('id' => -1 * $i, 'name' => '', 'price' => '', 'quantity' => '', 'unit' => '');
+				$orderPosList[] = (object)$posItem;
+			}
+		}
+		// fetch from db - overwrite $orderPosList
+		DBG::_('DBG', '>1', 'data', $data, __CLASS_, __FUNCTION__, __LINE__);
+		$saveLink = Request::getPathUri() . "index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=saveAjax&id={$id_order}";
+		$fields = $data;// TODO: only row fields?
 ?>
 <style type="text/css">
 body { font-size:12px; line-height:1.3em }
 #tbl-items td { padding:3px !important }
 @media print {
-	 body { font-size:9px; line-height:1.2em }
-  table { page-break-inside:auto }
-     tr { page-break-inside:avoid; page-break-after:auto }
-     li { page-break-inside:avoid; page-break-after:auto }
-  .page-break-block { page-break-inside:avoid; page-break-after:auto }
+	body { font-size:9px; line-height:1.2em }
+		h4 { font-size:1.1em; margin-top:8px; margin-bottom:6px }
+		h3 { font-size:1.2em; margin-top:8px; margin-bottom:6px }
+		h2 { font-size:1.3em; margin-top:8px; margin-bottom:6px }
+		h1 { font-size:1.4em; margin-top:8px; margin-bottom:6px }
+
+ table { page-break-inside:auto }
+		tr { page-break-inside:avoid; page-break-after:auto }
+		li { page-break-inside:avoid; page-break-after:auto }
+ .page-break-block { page-break-inside:avoid; page-break-after:auto }
+
+ td, th,
+	 .table>tbody>tr>td,
+	 .table>tbody>tr>th,
+	 .table>thead>tr>th { padding:2px }
+
+ .order-panel { display:none }
 }
 </style>
 <div class="container">
-	<div id="tbl-items" style="margin-top:2em">
+	<div id="tbl-items">
 		<div id="widget-orders"></div>
 	</div>
-
-	<h4 style="font-size:1.2em">WARUNKI REALIZACJI ZAMÓWIENIA:</h4>
-	<ol>
-		<li>Termin dostawy: …………………………, po tym terminie Zamawiający zastrzega sobie prawo do odmowy odbioru przedmiotu zamówienia.</li>
-		<li>Forma dostawy: ………………………….</li>
-		<li>Miejsce dostawy: ……………………………………..</li>
-		<li>Warunki płatności zadatku: na podstawie faktury proforma.</li>
-		<li>Forma płatności: przelew.</li>
-		<li>Termin płatności: 30 dni od daty wpływu do siedziby Zamawiającego prawidłowych i kompletnych dokumentów, o których mowa w pkt 7 poniżej w trybie zgodnym z pkt 8 poniżej.</li>
-		<li>Płatność dokonana będzie wyłącznie na podstawie prawidłowo wystawionej i doręczonej Zamawiającemu przez Dostawcę faktury VAT z dołączonym oryginałem dokumentu potwierdzającego bezusterkowy odbiór przez Zamawiającego przedmiotu zamówienia wraz ze wszystkimi niezbędnymi dokumentami, gwarancjami, atestami, testami, etc. przez osoby wymienione w pkt 11-12 poniżej, a także kopią niniejszego zamówienia podpisaną przez Zamawiającego i Dostawcę zgodnie z zasadami reprezentacji, poświadczoną przez Dostawcę za zgodność z oryginałem.</li>
-		<li>Dostawca przekaże Zamawiającemu fakturę VAT wraz z wymaganymi załącznikami, o których mowa w pkt 7 powyżej wyłącznie przesyłką poleconą Poczty Polskiej za potwierdzeniem odbioru.</li>
-		<li>W przypadku gdy Zamawiający otrzyma dokumenty, o których mowa w pkt 7 i 8 powyżej, niespełniające warunków wskazanych w niniejszym zamówieniu lub zostaną one wysłane niezgodnie z trybem określonym w pkt 8 powyżej, wówczas Zamawiający zastrzega sobie prawo do odmowy realizacji płatności i odesłania ich na adres Dostawcy celem skorygowania.</li>
-		<li>Zamawiającemu przysługuje prawo do naliczenia Dostawcy kary umownej w wysokości ….% wartości zamówienia netto za każdy rozpoczęty dzień opóźnienia w dostawie przedmiotu zamówienia z terminem płatności tej kary – 7 dni od dnia jej naliczenia. Zamawiający może potrącić wskazaną karę umowną z wynagrodzenia Dostawcy. Zamawiający zastrzega sobie prawo do dochodzenia odszkodowania na zasadach ogólnych, przekraczającego wysokość kary umownej zastrzeżonej w niniejszym punkcie.</li>
-		<li>Osoba do kontaktu ze strony Zamawiającego: ……………………………………..</li>
-		<li>Osoba uprawniona do kontaktu ze strony Dostawcy: ………………………………</li>
-		<li>Za datę zapłaty uważa się datę obciążenia rachunku bankowego Zamawiającego.</li>
-		<li>Niniejsze zamówienie jest ważne po potwierdzeniu przez Dostawcę przyjęcia do realizacji niniejszego zamówienia w terminie 2 dni roboczych od daty jego złożenia Dostawcy przez Zamawiającego. Potwierdzenie pod rygorem nieważności winno być przesłane faksem do Zamawiającego pod numer ………… lub pocztą elektroniczną na adres email: ……….. Brak potwierdzenia jest uznawany jako odmowa przyjęcia przez Dostawcę do realizacji niniejszego zamówienia. Każda proponowana zamiana warunków dostawy określonych w niniejszym zamówieniu oznacza złożenie nowej oferty i winna być pod rygorem nieważności potwierdzona przez Zamawiającego. Nie dopuszcza się akceptu milczącego.</li>
-		<li>Wierzytelności wynikające z niniejszego zamówienia nie mogą być przenoszone przez Dostawcę na osoby trzecie bez uprzedniej, pisemnej zgody Zamawiającego.</li>
-	</ol>
-
-	<div style="padding-top:3em" class="page-break-block">
-		(pieczęć i czytelny podpis Zamawiającego) …………………………………………………………….
-	</div>
-	<div class="page-break-block">
-		<h4 style="font-size:1.2em">NINIEJSZYM OŚWIADCZAM, ŻE DOSTAWCA PRZYJMUJE ZAMÓWIENIE DO REALIZACJI NA POWYŻSZYCH WARUNKACH:</h4>
-		<div style="padding-top:2em;">
-		………………………….,dnia………………………….………………………………………………..
-		<br>(pieczęć i czytelny podpis Dostawcy zgodnie z zasadami reprezentacji)
-		</div>
-	</div>
 </div>
 
 <script src="stuff/vendors.js"></script>
 <script src="stuff/bundle.se_route_orders.js"></script>
 <script>
-var isPrint = false;// TODO: from request
 var _mode = '<?php echo (V::get('_print', '', $_REQUEST))? 'print' : 'view'; ?>';
-var _projectInfo = {id: 5130};
+var _projectInfo = {id: 5130};// TODO: ID PROJECT - use only fields?
 var _notes = 'NA FAKTURZE VAT NALEŻY UMIESZCZAĆ CZYTELNY NR ZAMÓWIENIA';
 var _pos = <?php echo json_encode($orderPosList); ?>;
 var _saveLink = '<?php echo $saveLink; ?>';
 var _dbg = <?php echo (DBG::isActive())? 'true' : 'false'; ?>;
+var _fields = <?php echo json_encode($fields); ?>;
+var _conditions = [];
+_conditions.push([
+  ['bold', 'Termin wykonania usługi: '],
+  ['field', '', 'DELIVERY_DATE', 'date'],
+  ['text', ', po tym terminie Zamawiający zastrzega sobie prawo do odmowy odbioru przedmiotu zamówienia.']
+]);
+_conditions.push([
+    ['bold', 'Forma dostawy: '],
+    ['field', '', 'DELIVERY_TYPE', 'string']
+]);
+_conditions.push([
+    ['bold', 'Miejsce dostawy: '],
+    ['field', '', 'DELIVERY_LOCATION', 'string']
+]);
+_conditions.push([
+    ['bold', 'Warunki płatności: '],
+    ['text', 'przelew 60 dni po dostawie towaru']
+]);
+_conditions.push([
+    ['bold', 'Forma płatności: '],
+    ['text', 'przelew']
+]);
+_conditions.push([
+    ['bold', 'Termin płatności: '],
+    ['text', '60 dni od daty wpływu do siedziby Zamawiającego prawidłowych i kompletnych dokumentów, o których mowa w pkt 7 poniżej w trybie zgodnym z pkt 8 poniżej.']
+]);
+_conditions.push([
+    ['text', 'Płatność dokonana będzie wyłącznie na podstawie prawidłowo wystawionej i doręczonej Zamawiającemu przez Dostawcę faktury VAT z dołączonym oryginałem dokumentu potwierdzającego bezusterkowy odbiór przez Zamawiającego przedmiotu zamówienia wraz ze wszystkimi niezbędnymi dokumentami, gwarancjami, atestami, testami, etc. przez osoby wymienione w pkt 11-12 poniżej, a także kopią niniejszego zamówienia podpisaną przez Zamawiającego i Dostawcę zgodnie z zasadami reprezentacji, poświadczoną przez Dostawcę za zgodność z oryginałem.']
+]);
+_conditions.push([
+    ['text', 'Dostawca przekaże Zamawiającemu fakturę VAT wraz z wymaganymi załącznikami, o których mowa w pkt 7 powyżej wyłącznie przesyłką poleconą Poczty Polskiej za potwierdzeniem odbioru.']
+]);
+_conditions.push([
+    ['text', 'W przypadku gdy Zamawiający otrzyma dokumenty, o których mowa w pkt 7 i 8 powyżej, niespełniające warunków wskazanych w niniejszym zamówieniu lub zostaną one wysłane niezgodnie z trybem określonym w pkt 8 powyżej, wówczas Zamawiający zastrzega sobie prawo do odmowy realizacji płatności i odesłania ich na adres Dostawcy celem skorygowania.']
+]);
+_conditions.push([
+    ['text', 'Zamawiającemu przysługuje prawo do naliczenia Dostawcy kary umownej w wysokości '],
+    ['field', '', 'CASH_PENALTY', 'price'],
+    ['text', '% wartości zamówienia netto za każdy rozpoczęty dzień opóźnienia w dostawie przedmiotu zamówienia z terminem płatności tej kary - 7 dni od dnia jej naliczenia. Zamawiający może potrącić wskazaną karę umowną z wynagrodzenia Dostawcy. Zamawiający zastrzega sobie prawo do dochodzenia odszkodowania na zasadach ogólnych, przekraczającego wysokość kary umownej zastrzeżonej w niniejszym punkcie.']
+]);
+_conditions.push([
+    ['bold', 'Osoba do kontaktu ze strony Zamawiającego:'],
+    ['tag', 'newline'],
+    ['field', '', 'ORDER_CONTACT_PERSON', 'text']
+]);
+_conditions.push([
+    ['bold', 'Osoby upoważnione do odbioru towaru:'],
+    ['tag', 'newline'],
+    ['field', '', 'ORDER_APPROVE_PERSON', 'text']
+]);
+_conditions.push([
+    ['bold', 'Osoba uprawniona do kontaktu ze strony Dostawcy: '],
+    ['field', '', 'DELIVERY_CONTACT_PERSON', 'string']
+]);
+_conditions.push([
+    ['text', 'Za datę zapłaty uważa się datę obciążenia rachunku bankowego Zamawiającego.']
+]);
+_conditions.push([
+    ['text', 'Niniejsze zamówienie jest ważne po potwierdzeniu przez Dostawcę przyjęcia do realizacji niniejszego zamówienia w terminie 2 dni roboczych od daty jego złożenia Dostawcy przez Zamawiającego.'],
+    ['tag', 'newline'],
+    ['text', 'Potwierdzenie pod rygorem nieważności winno być przesłane faksem do Zamawiającego pod numer (58) 347 51 02 lub pocztą elektroniczną na adres email: '],
+    ['tag', 'u', 'asmentoch@pro-netmedia.pl'],
+    ['text', ' Brak potwierdzenia jest uznawany jako odmowa przyjęcia przez Dostawcę do realizacji niniejszego zamówienia. Każda proponowana zamiana warunków dostawy określonych w niniejszym zamówieniu oznacza złożenie nowej oferty i winna być pod rygorem nieważności potwierdzona przez Zamawiającego. Nie dopuszcza się akceptu milczącego.']
+]);
+_conditions.push([
+    ['text', 'Wierzytelności wynikające z niniejszego zamówienia nie mogą być przenoszone przez Dostawcę na osoby trzecie bez uprzedniej, pisemnej zgody Zamawiającego.']
+]);
 
 jQuery("#widget-orders").p5_Orders({
 	year: '2016',
-	deal: {
+	idOrder: '<?php echo V::get('id', '', $data); ?>',
+  deal: {
+		type: 'zamowienie',
     label: 'Zamówienie',
-    nr: '<?php echo V::get('obcy_nr_sprawy', 'nr zamówienia / inicjały zamawiającego / numer budowy / miesiąc / rok', $data); ?>',
+		nr: '<?php echo V::get('ORDER_LABEL', 'nr zamówienia / inicjały zamawiającego / numer budowy / miesiąc / rok', $data); ?>',
     showOfferLabel: true,
     offerLabel: 'Zamawiający zleca Dostawcy dostawę poniższych materiałów na wskazanych poniżej warunkach. Zgodnie z ofertą',
-    offerNr: '<?php echo V::get('nr_oferty', '..................', $data); ?>',
-    offerDate: '<?php echo V::get('data_oferty', '..................', $data); ?>',
-    date: '13-05-2016',
-    city: 'Gdańsk'
+		offerNr: '',
+		targetName: '',
+    statement: 'NINIEJSZYM OŚWIADCZAM, ŻE DOSTAWCA PRZYJMUJE ZAMÓWIENIE DO REALIZACJI NA POWYŻSZYH WARUNKACH:',
+    conditions: _conditions,
+    condLabel: 'WARUNKI REALIZACJI ZAMÓWIENIA',
+		date: '<?php echo V::get('ORDER_DATE', date("Y-m-d"), $data); ?>',
+		city: '<?php echo V::get('ORDER_CITY', 'Gdańsk', $data); ?>'
+  },
+	fields: _fields,
+	mapFields: {
+    deal: {
+      nr: 'ORDER_LABEL',
+      offerNr: 'OFFER_NR',
+			targetName: '_nr_budowy'// TODO: nazwa budowy?
+    },
+    comB: {
+      name: 'COMPANY_NAME',
+      address: 'COMPANY_ADDRESS',
+      postCode: 'COMPANY_POST_CODE',
+      city: 'COMPANY_CITY',
+      nip: 'COMPANY_NIP',
+      contactPerson: 'COMPANY_CONTACT_PERSON',
+      contactTel: 'COMPANY_CONTACT_TEL',
+      contactMail: 'COMPANY_CONTACT_MAIL'
+    }
   },
   comA: {
     label: 'Zamawiający',
@@ -442,52 +884,79 @@ jQuery("#widget-orders").p5_Orders({
     city: 'Gdańsk',
     nip: '583-315-47-35'
   },
-  comB: {
+	comB: {
     label: 'Dostawca',
-    name: '<?php echo V::get('dostawca_name', '.........................', $data); ?>',
-    address: '<?php echo V::get('dostawca_address', '.........................', $data); ?>',
-    postCode: '<?php echo V::get('dostawca_post_code', '......', $data); ?>',
-    city: '<?php echo V::get('dostawca_city', '.........', $data); ?>',
-    nip: '<?php echo V::get('dostawca_nip', '.........................', $data); ?>'
+		name: '',
+    address: '',
+    postCode: '',
+    city: '',
+    nip: ''
   },
+	backLink: 'index.php?_route=UrlAction_ProjektyProNetMediaZamZlec',
+	printLink: 'index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=zamowienie&_print=1',
+  printIdOrderArg: 'id',
 	projectInfo: _projectInfo,
 	pos: _pos,
   notes: _notes,
   mode: _mode,
-  save: function(data, callback) {
-    var orderPosList, idOrder;
-    try {
-      console.log('#widget-orders/Orders::save: data:', data);
-      if (!data || !('orderPosList' in data)) throw "Brak danych do zapisania";
-      orderPosList = data.orderPosList || [];
-			idOrder = data.idOrder || -1;
-
-			var req = superagent
-				.post(_saveLink)
-				.type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form');
-				.send({orderPosList: orderPosList, idOrder: idOrder})
-				.set('Accept', 'application/json')
-				.end(function(err, res) {
-					if(_dbg)console.log('#widget-orders/Orders::save: res:', res, 'res.body:', res.body);
-					if (err || !res.ok) {
-						jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Req error', err: err});
-					} else {
-						if ('application/json' !== res.type) {
-							jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Wrong response type - required json. ' + res.text});
-							return;
+  actions: {
+    save: function(data, callback) {
+			var orderPosList, idOrder;
+	    try {
+	      console.log('#widget-orders/Orders::save: data:', data);
+	      if (!data || !('orderPosList' in data)) throw "Brak danych do zapisania";
+	      var orderPosList = data.orderPosList || [];
+				var fields = data.fields || {};
+				var idOrder = data.idOrder || -1;
+
+				var req = superagent
+					.post(_saveLink)
+					.type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form');
+					.send({
+						type: data.type || 'zamowienie',
+						orderPosList: orderPosList,
+						toDeletePosList: data.toDeletePosList || {},
+						fields: fields,
+						idOrder: idOrder
+					})
+					.set('Accept', 'application/json')
+					.end(function(err, res) {
+						if(_dbg)console.log('#widget-orders/Orders::save: res:', res, 'res.body:', res.body);
+						if (err || !res.ok) {
+							jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Req error', err: err});
+						} else {
+							if ('application/json' !== res.type) {
+								jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Wrong response type - required json. ' + res.text});
+								return;
+							}
+							jQuery(document).trigger('DBG:notify', {type: 'success', msg: 'res.status:' + res.status + '. res.body:' + JSON.stringify(res.body)});
+							callback(null, {
+								message: 'Saved',
+								type: 'success',
+								orderPosList: res.body.orderPosList,
+								fields: res.body.fields,
+								idOrder: res.body.idOrder
+							});
 						}
-						jQuery(document).trigger('DBG:notify', {type: 'success', msg: 'res.status:' + res.status + '. res.body:' + JSON.stringify(res.body)});
-						callback(null, {message: 'Saved', type: 'success', orderPosList: res.body.orderPosList, idOrder: res.body.idOrder});
-					}
-					req = null;
-				});
-    } catch (e) {
-      callback(e);
-    }
+						req = null;
+					});
+	    } catch (e) {
+	      callback(e);
+	    }
+    },
   },
 	dbg: true
 });
 </script>
+<script>
+jQuery(document).ready(function() {
+	var _mode = '<?php echo (V::get('_print', '', $_REQUEST))? 'print' : 'view'; ?>';
+	document.title = 'zamowienie_nr_<?php echo V::get('ORDER_LABEL', 'nr zamówienia / inicjały zamawiającego / numer budowy / miesiąc / rok', $data); ?>';
+	if ('print' == _mode) {
+		window.print();
+	}
+})
+</script>
 
 <?php
 		exit;
@@ -499,6 +968,17 @@ jQuery("#widget-orders").p5_Orders({
 ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS`      ADD `ID_ORDER` int(11)     NOT NULL DEFAULT 0;
 ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS_HIST` ADD `ID_ORDER` varchar(11) NOT NULL DEFAULT 'N/S;';
 
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS`      ADD `ORDER_CONTACT_PERSON` varchar(255)     NOT NULL DEFAULT '';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS_HIST` ADD `ORDER_CONTACT_PERSON` varchar(255) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS`      ADD `ORDER_APPROVE_PERSON` varchar(255)     NOT NULL DEFAULT '';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS_HIST` ADD `ORDER_APPROVE_PERSON` varchar(255) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS`      ADD `DELIVERY_CONTACT_PERSON` varchar(255)     NOT NULL DEFAULT '';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS_HIST` ADD `DELIVERY_CONTACT_PERSON` varchar(255) NOT NULL DEFAULT 'N/S;';
+
+$sqlFieldsList[] = 'ORDER_CONTACT_PERSON';
+$sqlFieldsList[] = 'ORDER_APPROVE_PERSON';
+$sqlFieldsList[] = 'DELIVERY_CONTACT_PERSON';
+
 CREATE TABLE IF NOT EXISTS `CRM_LISTA_ZASOBOW_ORDERS` (
 	`ID` int(11) NOT NULL AUTO_INCREMENT,
 	`ID_COMPANIES` int(11) NOT NULL DEFAULT 0,
@@ -519,16 +999,27 @@ CREATE TABLE IF NOT EXISTS `CRM_LISTA_ZASOBOW_ORDERS` (
 	`A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
 	`A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
 	`NR` varchar(255) NOT NULL DEFAULT '',
-	`COMPANY_NIP` varchar(32) NOT NULL DEFAULT '',
 	`COMPANY_NAME` varchar(255) NOT NULL DEFAULT '',
 	`COMPANY_ADDRESS` varchar(255) NOT NULL DEFAULT '',
+	`COMPANY_POST_CODE` varchar(6) NOT NULL DEFAULT '',
+	`COMPANY_CITY` varchar(255) NOT NULL DEFAULT '',
+	`COMPANY_NIP` varchar(32) NOT NULL DEFAULT '',
+	`COMPANY_CONTACT_PERSON` varchar(64) NOT NULL DEFAULT '',
+	`COMPANY_CONTACT_TEL` varchar(32) NOT NULL DEFAULT '',
+	`COMPANY_CONTACT_MAIL` varchar(64) NOT NULL DEFAULT '',
 	`OFFER_DATE` date DEFAULT NULL,
 	`OFFER_NR` varchar(255) NOT NULL DEFAULT '',
 	`ORDER_TYPE` varchar(255) NOT NULL DEFAULT '',
 	`DELIVERY_DATE` date DEFAULT NULL,
+	`DELIVERY_TYPE` varchar(255) DEFAULT '',
+	`DELIVERY_LOCATION` varchar(255) DEFAULT '',
 	`EXECUTION_START_DATE` date DEFAULT NULL,
 	`EXECUTION_END_DATE` date DEFAULT NULL,
 	`CASH_PENALTY` varchar(255) NOT NULL DEFAULT '',
+	`ORDER_CONTACT_PERSON` varchar(255) NOT NULL DEFAULT '',
+	`ORDER_APPROVE_PERSON` varchar(255) NOT NULL DEFAULT '',
+	`DELIVERY_CONTACT_PERSON` varchar(255) NOT NULL DEFAULT '',
+
 	`LOCATION` date DEFAULT NULL,
 	`NOTES` varchar(1000) NOT NULL DEFAULT '',
 	PRIMARY KEY (`ID`)
@@ -556,17 +1047,28 @@ CREATE TABLE IF NOT EXISTS `CRM_LISTA_ZASOBOW_ORDERS_HIST` (
 	`A_ADM_COMPANY` varchar(255) NOT NULL DEFAULT 'N/S;',
 	`A_CLASSIFIED` varchar(255) NOT NULL DEFAULT 'N/S;',
 	`NR` varchar(255) NOT NULL DEFAULT 'N/S;'
-	`COMPANY_NIP` varchar(32) NOT NULL DEFAULT 'N/S;'
 	`COMPANY_NAME` varchar(255) NOT NULL DEFAULT 'N/S;'
 	`COMPANY_ADDRESS` varchar(255) NOT NULL DEFAULT 'N/S;'
+	`COMPANY_POST_CODE` varchar(6) NOT NULL DEFAULT 'N/S;'
+	`COMPANY_CITY` varchar(255) NOT NULL DEFAULT 'N/S;'
+	`COMPANY_NIP` varchar(32) NOT NULL DEFAULT 'N/S;'
+	`COMPANY_CONTACT_PERSON` varchar(64) NOT NULL DEFAULT 'N/S;'
+	`COMPANY_CONTACT_TEL` varchar(32) NOT NULL DEFAULT 'N/S;'
+	`COMPANY_CONTACT_MAIL` varchar(64) NOT NULL DEFAULT 'N/S;'
 	`OFFER_DATE` varchar(10) NOT NULL DEFAULT 'N/S;'
 	`OFFER_NR` varchar(255) NOT NULL DEFAULT 'N/S;'
 	`ORDER_TYPE` varchar(255) NOT NULL DEFAULT 'N/S;'
 	`DELIVERY_DATE` varchar(255) NOT NULL DEFAULT 'N/S;'
-	`EXECUTION_START_DATE` varchar(10) NOT NULL DEFAULT 'N/S;'
-	`EXECUTION_END_DATE` varchar(10) NOT NULL DEFAULT 'N/S;'
-	`CASH_PENALTY` varchar(255) NOT NULL DEFAULT 'N/S;'
-	`LOCATION` varchar(10) NOT NULL DEFAULT 'N/S;'
+	`DELIVERY_TYPE` varchar(255) DEFAULT 'N/S;',
+	`DELIVERY_LOCATION` varchar(255) DEFAULT 'N/S;',
+	`EXECUTION_START_DATE` varchar(10) NOT NULL DEFAULT 'N/S;',
+	`EXECUTION_END_DATE` varchar(10) NOT NULL DEFAULT 'N/S;',
+	`CASH_PENALTY` varchar(255) NOT NULL DEFAULT 'N/S;',
+	`ORDER_CONTACT_PERSON` varchar(255) NOT NULL DEFAULT 'N/S;',
+	`ORDER_APPROVE_PERSON` varchar(255) NOT NULL DEFAULT 'N/S;',
+	`DELIVERY_CONTACT_PERSON` varchar(255) NOT NULL DEFAULT 'N/S;',
+
+	`LOCATION` varchar(10) NOT NULL DEFAULT 'N/S;',
 	`NOTES` varchar(1000) NOT NULL DEFAULT 'N/S;',
 	PRIMARY KEY (`ID`),
   KEY `ID_USERS2` (`ID_USERS2`)
@@ -610,4 +1112,41 @@ CREATE VIEW `CRM_LISTA_ZASOBOW_ORDERS_summary_view` AS SELECT o.`ID`
 	GROUP BY o.`ID`
 ;
 
+-- ADD ORDER_NR to KORESP
+ALTER TABLE `IN7_DZIENNIK_KORESP_HIST` ADD `ORDER_NR` VARCHAR(32) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `IN7_DZIENNIK_KORESP` ADD `ORDER_NR` VARCHAR(32) NOT NULL DEFAULT '';
+SELECT ID,ID_PROJECT,ORDER_NR FROM `IN7_DZIENNIK_KORESP` where ID_PROJECT is not null or ORDER_NR != '' ORDER BY `IN7_DZIENNIK_KORESP`.`ID`  DESC limit 500;
+SELECT ID,ID_PROJECT,ORDER_NR FROM `IN7_DZIENNIK_KORESP` where ID_PROJECT is not null and ORDER_NR != '' ORDER BY `IN7_DZIENNIK_KORESP`.`ID`  DESC limit 500;
+
+-- ADD missing fields in CRM_LISTA_ZASOBOW_OFFERS
+-- ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS` CHANGE `OFFER_UNIT_TYPE` `OFFER_UNIT_TYPE` VARCHAR(16) CHARACTER SET latin2 COLLATE latin2_general_ci NULL DEFAULT 'szt.';
+ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS_HIST` ADD `OFFER_NAME` VARCHAR(255) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS` ADD `OFFER_NAME` VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS_HIST` ADD `OFFER_QUANTITY` VARCHAR(16) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS` ADD `OFFER_QUANTITY` decimal(10,4) NOT NULL DEFAULT 0;
+ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS_HIST` ADD `OFFER_UNIT` VARCHAR(16) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_OFFERS` ADD `OFFER_UNIT` VARCHAR(16) NOT NULL DEFAULT '';
+
+-- ADD zatwierdzony przez
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS_HIST` ADD `APPROVED_BY` VARCHAR(64) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS` ADD `APPROVED_BY` VARCHAR(64) NOT NULL DEFAULT ''; -- ZATWIERDZONE PRZEZ
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS_HIST` ADD `APPROVE_STATUS` VARCHAR(32) NOT NULL DEFAULT 'N/S;';
+ALTER TABLE `CRM_LISTA_ZASOBOW_ORDERS` ADD `APPROVE_STATUS` enum('WERSJA_ROBOCZA', 'OCZEKUJE_ZATWIERDZENIA', 'ZATWIERDZONE', 'ODRZUCONE') NOT NULL DEFAULT 'WERSJA_ROBOCZA';
+
+
+1213		12		14/AS/13/SP/2014/IV/2016		14 / AS / 13/SP/2014 /   IV / 2016
+1292		30		34/JL/16/SP/2015/V/2016			34 / JL / 16/SP/2015 /    V / 2016
+1259		37		24/JT/23/SP/2015/V/2016			24 / JT / 23/SP/2015 /    V / 2016
+1210		44		1/AS/2/2016/III/2016				 1 / AS /  2/   2016 /  III / 2016
+1211		44		1/AS/2/2016/III/2016				 1 / AS /  2/   2016 /  III / 2016
+1212		44		9/JT/2/SP/2016/IV/2016			 9 / JT /  2/SP/2016 /   IV / 2016
+1215		44		10/JT/2/SP/2016/IV/2016			10 / JT /  2/SP/2016 /   IV / 2016
+1216		44		11/JT/2/SP/2016/V/2016			11 / JT /  2/SP/2016 /    V / 2016
+1214		45		8/AS/3/SP/2016/IV/2016			 8 / AS /  3/SP/2016 /   IV / 2016
+1218		46		25/AS/04/SP/2016/V/2016			25 / AS / 04/SP/2016 /    V / 2016
+1255		46		11/RG/04/SP/2016/III/2016		11 / RG / 04/SP/2016 /  III / 2016
+1270		46		27/RG/04/SP/2016/V/2016			27 / RG / 04/SP/2016 /    V / 2016
+1219		50		2/MK/8/SP/2016/V/2016				 2 / MK /  8/SP/2016 /    V / 2016
+1223		50		3/AS/8/SP/2016/V/2016				 3 / AS /  8/SP/2016 /    V / 2016
+
 */

ファイルの差分が大きいため隠しています
+ 0 - 0
SE/stuff/bundle.se_route_orders.js


ファイルの差分が大きいため隠しています
+ 0 - 0
SE/stuff/vendors.js


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません