setProps($data); $this->budgetView($data, $viewParams); } catch (Exception $e) { SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } SE_Layout::dol(); } public function setProps($data) { $idProj = V::get('id_project', 0, $data, 'int'); if (!$idProj) return $data;// throw errro? $data['budget'] = 0; $data['projectInfo'] = null; $data['projectLabel'] = ''; $data['costs'] = array(); $rows = DB::getPDO()->fetchAll(" select p.ID , p.M_DIST_DESC , p.M_DIST_DEALNUM , p.M_DIST_COST_PROJECT , p.POCZATEK_UMOWY , p.KONIEC_BUDOWY , p.COST_OSPRZET , p.COST_MATERIALY from IN7_MK_BAZA_DYSTRYBUCJI p where p.A_STATUS not in('DELETED') and p.ID = {$idProj} "); if (empty($rows)) return $data;// throw errro? $data['projectInfo'] = $rows[0]; $data['budget'] = V::get('M_DIST_COST_PROJECT', 0, $data['projectInfo']); $data['projectLabel'] = $data['projectInfo']['M_DIST_DESC']; $data['POCZATEK_UMOWY'] = V::get('POCZATEK_UMOWY', '', $data['projectInfo']); $data['KONIEC_BUDOWY'] = V::get('KONIEC_BUDOWY', '', $data['projectInfo']); $data['days_to_finish'] = null; // pozostało dni - // ilość dni wyliczana z różnicy dat [13513] KONIEC_BUDOWY - [13512] POCZATEK_UMOWY (raczej today) $data['budget'] = V::get('DBG_M_DIST_COST_PROJECT', $data['budget'], $_GET);// TODO: TEST $data['KONIEC_BUDOWY'] = V::get('DBG_KONIEC_BUDOWY', $data['KONIEC_BUDOWY'], $_GET);// TODO: TEST if ($data['KONIEC_BUDOWY']) { $dStart = new DateTime(date('Y-m-d')); $dEnd = new DateTime($data['KONIEC_BUDOWY']); $dDiff = $dStart->diff($dEnd); $data['days_to_finish'] = ('-' == $dDiff->format('%R')) ? -1 * $dDiff->days : $dDiff->days; } $data['COST_OSPRZET'] = V::get('COST_OSPRZET', 0, $data['projectInfo']); $data['COST_MATERIALY'] = V::get('COST_MATERIALY', 0, $data['projectInfo']); $data['ordersRaw'] = DB::getPDO()->fetchAll(" select r.ID , r.ORDER_LABEL , r.ORDER_DATE , r.APPROVE_STATUS , sum(o.OFFER_PRICE_PER_UNIT * o.OFFER_QUANTITY) as SUM_NETTO from CRM_LISTA_ZASOBOW_ORDERS r left join CRM_LISTA_ZASOBOW_OFFERS o on( o.ID_ORDER = r.ID and (o.A_STATUS is null or o.A_STATUS not in('DELETED')) ) where (r.A_STATUS is null or r.A_STATUS not in('DELETED')) and r.ID_PROJECT = {$idProj} and r.APPROVE_STATUS in('ZATWIERDZONE', 'OCZEKUJE_ZATWIERDZENIA', 'OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA') group by r.ID "); $toFindKoresp = array();// Order.ID => Order.label { $idx = 0; foreach ($data['ordersRaw'] as $idxOrders => $order) { $idOrder = $order['ID']; $labelOrder = $order['ORDER_LABEL']; $toFindKoresp[$idOrder] = $labelOrder; if (count($data['costs']) < $idxOrders + 1) { $data['costs'][] = array( '_type'=>'order', 'data'=>$order['ORDER_DATE'], 'order_approve_status'=>$order['APPROVE_STATUS'], 'order_cost'=>$order['SUM_NETTO'], 'order_nr'=>$labelOrder, 'nr_fv_do_zamowienia'=>array(), 'sum'=>$order['SUM_NETTO'], 'orderRaw'=>$order ); } } if (!empty($toFindKoresp)) {// TODO: find fv nr - from Koresp. (nr_fv_do_zamowienia) - Koresp.ORDER_NR $sqlOrderLabels = array(); foreach ($toFindKoresp as $idOrder => $labelOrder) { $sqlOrderLabels[] = "'{$labelOrder}'"; } $sqlOrderLabels = implode(",", $sqlOrderLabels); // TODO: tylko określone typy z Koresp? // TODO: co jeśli brakuje obcy_nr_koresp(`K_NR_OTRZYM_KORESP`) - ID? $data['fvToOrdersRaw'] = DB::getPDO()->fetchAll(" select k.ID , k.ORDER_NR , k.K_NR_OTRZYM_KORESP as obcy_nr_koresp , k.COST_VALUE as cost from IN7_DZIENNIK_KORESP k where k.A_STATUS != 'DELETED' and k.ORDER_NR in({$sqlOrderLabels}) "); foreach ($data['fvToOrdersRaw'] as $fv) { $labelOrder = $fv['ORDER_NR']; foreach ($data['costs'] as $idx => $cost) { // if ('order' == $cost['_type'] && 'ZATWIERDZONE' == $cost['order_approve_status']) // TEST // OCZEKUJE_ZATWIERDZENIA, OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA if ('order' == $cost['_type'] && $labelOrder == $cost['order_nr']) { $idKoresp = $fv['ID']; // $cost['nr_fv_do_zamowienia'][$idKoresp] = $fv['obcy_nr_koresp']; $data['costs'][$idx]['nr_fv_do_zamowienia'][] = array('id'=>$idKoresp, 'nr'=>$fv['obcy_nr_koresp'], 'cost'=>$fv['cost']); } } } } {// PROJECT_COSTS $data['projectCostsRaw'] = DB::getPDO()->fetchAll(" select c.ID , c.ID_PROJECT , c.COST_DATE , c.COST_VALUE , c.COST_TYPE from PROJECT_COSTS c where (c.A_STATUS is null or c.A_STATUS not in('DELETED')) and c.ID_PROJECT = {$idProj} order by c.COST_DATE ASC, c.ID ASC "); foreach ($data['projectCostsRaw'] as $projCost) { $item = array( '_type'=>'project_cost', 'data'=>$projCost['COST_DATE'], 'sum'=>$projCost['COST_VALUE'], 'costRaw'=>$projCost ); switch ($projCost['COST_TYPE']) { case 'ANEKS': $item['budget_aneks'] = (float)$projCost['COST_VALUE']; break; case 'KARY': $item['budget_kary'] = (float)$projCost['COST_VALUE']; break; case 'OSPRZET': $item['budget_osprzet'] = (float)$projCost['COST_VALUE']; break; case 'MATERIALY': $item['budget_materialy'] = (float)$projCost['COST_VALUE']; break; case 'PRACOWNICY': $item['budget_koszt_pracownikow'] = (float)$projCost['COST_VALUE']; break; case 'PODWYKONAWCY': $item['budget_koszt_podwykonawcow'] = (float)$projCost['COST_VALUE']; break; case 'REPREZENTACYJNE': $item['budget_koszt_reprezentacyjny'] = (float)$projCost['COST_VALUE']; break; case 'ZALICZKA_KWOTA': $item['budget_zaliczki'] = (float)$projCost['COST_VALUE']; break; case 'ZALICZKA_KOSZTY_DZIENNE': $item['budget_rozliczone_zaliczki'] = (float)$projCost['COST_VALUE']; break; case 'ZGODY_SLUZEBNOSCI': $item['budget_zgoda_sluzebnosci'] = (float)$projCost['COST_VALUE']; break; case 'ZGODY_ODSZKODOWANIA': $item['budget_zgoda_odszkodowania'] = (float)$projCost['COST_VALUE']; break; case 'SPRZET_WLASNY': $item['budget_sprzet_wlasny'] = (float)$projCost['COST_VALUE']; break; case 'SPRZET_WYNAJETY': $item['budget_sprzet_wynajety'] = (float)$projCost['COST_VALUE']; break; case 'ORGANIZACJA_RUCHU': $item['budget_organizacja_ruchu'] = (float)$projCost['COST_VALUE']; break; case 'ZAJETOSC_PASA': $item['budget_zajetosc_pasa'] = (float)$projCost['COST_VALUE']; break; } $data['costs'][] = $item; } } $data['profitFvRaw'] = DB::getPDO()->fetchAll(" select k.ID , k.K_DATA_OTRZYMANEJ_KORESP as data , k.K_NR_OTRZYM_KORESP as obcy_nr_koresp , k.INCOME_VALUE as profit from IN7_DZIENNIK_KORESP k where k.A_STATUS != 'DELETED' and k.INCOME_VALUE != 0 and k.K_TYP_KORESP = 'OUT' and k.ID_PROJECT = '{$idProj}' "); foreach ($data['profitFvRaw'] as $fv) { $item = array( '_type' => 'profit_fv', 'data' => $fv['data'], 'sum' => 0, 'profit_fv_value' => $fv['profit'], 'label' => (!empty($fv['obcy_nr_koresp'])) ? $fv['obcy_nr_koresp'] : $fv['ID'], 'costRaw' => $fv ); $data['costs'][] = $item; } if (V::get('DBG_PROFIT_FV', '', $_GET)>0) {// DBG $data['costs'][] = array('_type'=>'profit_fv', 'data'=>date("Y-m-d"), 'profit_fv_value'=>100000, 'sum'=>-100000, 'label'=>"TEST/FV/1", 'costRaw'=>array());// TODO: DBG $data['costs'][] = array('_type'=>'profit_fv', 'data'=>date("Y-m-d"), 'profit_fv_value'=>150000, 'sum'=>-150000, 'label'=>"TEST/FV/2", 'costRaw'=>array());// TODO: DBG $data['costs'][] = array('_type'=>'profit_fv', 'data'=>'2016-09-01', 'profit_fv_value'=>10000, 'sum'=>-10000, 'label'=>"TEST/FV/3", 'costRaw'=>array());// TODO: DBG } // order $data['costs'] by `data`, then by `ID` for the same `_type` else: order, project_cost, koresp usort($data['costs'], function($a, $b) { if ($a['data'] == $b['data']) { if ($a['_type'] == $b['_type']) { if ('project_cost' == $a['_type']) { return ($a['costRaw']['ID'] < $b['costRaw']['ID']) ? -1 : 1; } if ('order' == $a['_type']) { return ($a['orderRaw']['ID'] < $b['orderRaw']['ID']) ? -1 : 1; } return 0; } $oa = 999; $ob = 999; if ('order' == $a['_type']) $oa = 1; else if ('project_cost' == $a['_type']) $oa = 2; if ('order' == $b['_type']) $ob = 1; else if ('project_cost' == $b['_type']) $ob = 2; return ($oa < $ob) ? -1 : 1; } return ($a['data'] < $b['data']) ? -1 : 1; }); $budget = $data['budget']; foreach ($data['costs'] as $idx => $cost) { // TODO: fix - `cost_wynajem` pewnie będzie częścią z zamówienia - minus od project COST_OSPRZET // TODO: fix - `cost_materialy` pewnie będzie częścią z zamówienia - minus od project COST_MATERIALY // TODO: cost_wynajem i cost_materialy - edit in this table - cost may be verified by fv, etc. $sum = $cost['sum']; $budget -= $sum; $data['costs'][$idx]['budget_minus_sum'] = $budget; } } return $data; } public function getWidgetProject() {// mv to Route_UrlAction_ProjektyProNetMediaZamZlec, use Router::getRoute('UrlAction_ProjektyProNetMediaZamZlec')->getWidgetProject() $widgetProject = array(); $widgetProject['idTabela'] = 1656;// TODO: idZasob for TABELA Projekty $widgetProject['idKomorka'] = 1658;// TODO: idZasob for KOMORKA Projekty.P_ID $widgetProject['fieldName'] = 'ID_PROJECT'; $widgetProject['dataUrl'] = "index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=typespecial&fld={$widgetProject['fieldName']}"; $widgetProject['typeSpecial'] = null; $acl = User::getAcl()->getObjectAcl('default_db', 'IN7_MK_BAZA_DYSTRYBUCJI'); if ($acl) { $acl->init($force = false); $widgetProject['typeSpecial'] = Typespecial::getInstance($widgetProject['idKomorka'], $colName = $widgetProject['fieldName']); } return $widgetProject; } public function budgetView($data, $viewParams) { $styleZyskStrata = 'color: black'; if ($data['TODO__sum_zysk_strata'] > 0) $styleZyskStrata = 'color:green'; if ($data['TODO__sum_zysk_strata'] < 0) $styleZyskStrata = 'color:red'; $costs = $data['costs']; DBG::_('DBG', '>2', 'costs', $costs, __CLASS__, __FUNCTION__, __LINE__); $widgetProject = $this->getWidgetProject(); ?>
0) { $tsValues = $widgetProject['typeSpecial']->getValuesWithExports($q = $data['id_project']); if (!empty($tsValues[ $data['id_project'] ])) { $fldParams['typespecialValue'] = $tsValues[ $data['id_project'] ]->param_out; } } //$fldParams['ajaxDataUrlBase'] .= "&DBG_TS=3"; echo $widgetProject['typeSpecial']->showFormItem($idTbl = $widgetProject['idTabela'], $fName, $selValue = $data['id_project'], $fldParams); ?>

Projekt:

data
data rozpoczęcia umowy data zakończenia umowy pozostało dni: Wartość kosztorysu
ROBOCIZNA Koszty dodatkowe (reprezentacyjne) Zamówienia Zaliczki Zgody wejścia w teren Wynajem sprzętu Koszty projektu
Sprzedaż Kwota Umowy (netto) Aneks (netto) kary, potrącenia (netto) Osprzęt Materiały



koszty pracowników koszt firmy podwykonawczej
numer zamówienia (kwota netto) numer faktury kwota po weryfikacji zaliczka kwota rozliczanie zaliczki koszty dzienne służebności odszkodowania Sprzęt własny Sprzęt wynajęty organizacja ruchu zajętość pasa drogowego
2', 'data', $data, __CLASS__, __FUNCTION__, __LINE__); } public function addCostAjaxAction() { $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()); $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_PROJECT'] = $idProject; $cost['COST_VALUE'] = $price; $cost['COST_TYPE'] = $type; $cost['COST_DATE'] = date("Y-m-d"); // $cost['NOTES'] = $notes;// TODO: add notes to form? $idItem = DB::getDB()->ADD_NEW_OBJ('PROJECT_COSTS', (object)$cost); if ($idItem <= 0) throw new Exception("Wystąpiły błędy podczas tworzenia nowego rekordu w bazie danych"); $response['type'] = 'success'; $response['id'] = $idItem; $response['msg'] = "Koszt został dodany"; {// 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); } 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); } } /* -- `PROJECT_COSTS`.`COST_VALUE` max 1000000123456,78 CREATE TABLE IF NOT EXISTS `PROJECT_COSTS` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `ID_PROJECT` int(11) NOT NULL DEFAULT 0, `A_RECORD_CREATE_DATE` datetime DEFAULT NULL, `A_RECORD_CREATE_AUTHOR` varchar(20) DEFAULT NULL, `SYNC_SQIX_STATUS` varchar(100) NOT NULL DEFAULT '', `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 NULL, `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '', `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '', `COST_VALUE` decimal(16,2) NOT NULL DEFAULT '', `COST_TYPE` varchar(32) NOT NULL DEFAULT '', `COST_DATE` date DEFAULT NULL, `NOTES` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`ID`) KEY `ID_PROJECT` (`ID_PROJECT`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2; CREATE TABLE IF NOT EXISTS `PROJECT_COSTS_HIST` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `ID_USERS2` int(11) NOT NULL, `ID_PROJECT` varchar(255) NOT NULL DEFAULT 'N/S;', `A_RECORD_CREATE_DATE` varchar(255) NOT NULL DEFAULT 'N/S;', `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;', `SYNC_SQIX_STATUS` varchar(255) NOT NULL DEFAULT 'N/S;', `A_RECORD_UPDATE_DATE` varchar(255) NOT NULL DEFAULT 'N/S;', `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;', `A_STATUS` varchar(255) NOT NULL DEFAULT 'N/S;', `A_STATUS_INFO` varchar(255) NOT NULL DEFAULT 'N/S;', `A_ADM_COMPANY` varchar(255) NOT NULL DEFAULT 'N/S;', `A_CLASSIFIED` varchar(255) NOT NULL DEFAULT 'N/S;', `COST_VALUE` varchar(16) NOT NULL DEFAULT 'N/S;', `COST_TYPE` varchar(32) NOT NULL DEFAULT 'N/S;', `COST_DATE` varchar(10) NOT NULL DEFAULT 'N/S;', `NOTES` varchar(255) NOT NULL DEFAULT 'N/S;', PRIMARY KEY (`ID`), KEY `ID_USERS2` (`ID_USERS2`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2; */