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']);
// TODO: tylko ZATWIERDZONE, OCZEKUJE_ZATWIERDZENIA i OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA
$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.ID in (2293) -- TEST
-- and k.ID in (2537, 2538, 2539, 2536) -- TEST
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'
");
foreach ($data['profitFvRaw'] as $fv) {
$item = array(
'_type' => 'profit_fv',
'data' => $fv['data'],
'sum' => (-1 * $fv['profit']),
'profit_fv_value' => $fv['profit'],
'label' => $fv['obcy_nr_koresp'],
'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'=>100, 'sum'=>-100, 'label'=>"TEST/FV/1", 'costRaw'=>array());// TODO: DBG
$data['costs'][] = array('_type'=>'profit_fv', 'data'=>date("Y-m-d"), 'profit_fv_value'=>150, 'sum'=>-150, 'label'=>"TEST/FV/2", 'costRaw'=>array());// TODO: DBG
$data['costs'][] = array('_type'=>'profit_fv', 'data'=>'2016-09-01', 'profit_fv_value'=>200, 'sum'=>-200, '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() {
$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'] = Typespecial::getInstance($widgetProject['idKomorka'], $colName = $widgetProject['fieldName']);
return $widgetProject;
}
public function typespecialAction() {
$DBG = ('1' == V::get('DBG', '', $_REQUEST));
$fld = V::get('fld', '', $_GET);
$widgetProject = $this->getWidgetProject();
header("Content-type: application/json");
switch ($fld) {
case 'ID_PROJECT': {
$typeSpecialIdProject = Typespecial::getInstance($widgetProject['idKomorka'], $colName = $widgetProject['fieldName']);
$query = V::get('q', '', $_REQUEST);
$rawRows = null;
$rows = $typeSpecialIdProject->getValuesWithExports($query);
if($DBG){echo'
rows('.$query.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($rows);echo'';}
foreach ($rows as $kID => $vItem) {
$itemJson = new stdClass();
$itemJson->id = $vItem->id;
$itemJson->name = $vItem->param_out;
if (!empty($vItem->exports)) {
$itemJson->exports = $vItem->exports;
}
$jsonData[] = $itemJson;
}
echo json_encode($jsonData);
}
break;
}
}
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();
?>
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);
$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);
}
}
/*
-- `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;
*/