Учет оргтехники в организации v 2.0 2012 (работа в браузере) (закончено)
ВНИМАНИЕ! Данный материал устарел. Новую версию смотрите здесь
DEMO страница на sourceforge (test/test)
Скачать последнюю версию
Сообщить об ошибке
SVN репозитарий 
- Общие сведения
- Лицензионное соглашение
- Материальное стимулирование
- Установка
- Обновление
- Настройка
- Первоначальное заполнение справочников
- Ведение реестра ТМЦ
- Планы помещений
- Отчеты
- Новости
- Меню «Имущество»
- Удаление объектов
- Выгрузка в формате xml
- Написание собственных модулей
- Обратная связь
Общие сведения
Лицензионное соглашение
В данный момент это ПО лицензируется и распространяется по принципу «Как есть». Вы можете скачивать, устанавливать, изменять исходные коды и использовать их для любых своих нужд, кроме продажи (ну или хочу долю!). Со своей стороны я так-же не гарантирую ничего: ни поддержки, ни обновлений, ни вообще работоспособности конечного продукта. Так-же я волен изменить данную лицензию в любой момент.
Материальное стимулирование
Несомненно приветствуется. Если вам хочется простимулировать автора данного ПО для дальнейших подвигов, свяжитесь со мной. У автора есть два пути обрести душевное спокойствие: материальное благополучие и слава. И то и другое автор очень любит.
Установка
Для успешного запуска ПО необходимы установленные Apache 2+,PHP 4+, MySQL 4+. Процесс развертывания LAMP достаточно легко найти в www.google.com Работа тестировалась на дистрибутиве Linux Debian, однако я уверен, что и любителей Windows проблем не возникнет.
Крайне не рекомендую СЕЙЧАС устанавливать данное ПО на «реальном» хостинге, «смотрящем» в интернет. Хотя работать конечно будет…но не долго…ибо «придурков-хакеров» сейчас много, а зайцев поди мало.. Я к тому, что на вопрос безопасности никто не тестировал данное ПО. Для локальной сети пойдет, но в интернет выставлять, яб не стал. Работы по тестированию-устранению дыр будут проведены в ближайших релизах, после чего скорее всего запущу «Демо» в интернете, чтоб можно было «пощупать» в «живую».
Далее:
- Скачиваем последнюю версию исходников с https://sourceforge.net/projects/webuseorg/files/
- Копируем/распаковываем их в папку с сайтом.
- Запускаем инсталлятор http://имя_сайта/install/index.php
- Открываем config.php, прописываем данные для соединения с БД
- Пробуем запустить.
- Удаляем папку install
Обновление
Обновления являются каммулятивными — для обновления до последней версии нужен только самый последний релиз. Т.е. скачиваем ПОСЛЕДНЮЮ версию данного ПО. Копируем её 1 в 1 с заменой файлов в каталог где стояла предыдущая версия (за исключением config.php в корне). Выполняем http://имя_или_IP_сайта/update.php Не забудьте после обновления удалить файл update.php
В ближайшее время планирую внедрить «проверку обновлений». При выходе новой версии, будет показано соответствующее уведомление в меню «Администрирование-Настройка».
Для любителей «свежатинки» — SVN репозитарий. По крайне мере сейчас (Декабрь 2012) там стабильно идут правки 1-2 раза в день.
Точно не будет и не планируется в ближайших релизах: автообновление. Вот может когда «деревья станут большими», вот тогда…
Первоначальная настройка
- Заходим на сайт
- Логинимся под пользователем test пароль test
- Идем в панель администрирования->Настройки
- Ставим галочки, заполняем.
Некоторые пояснения:
Аутенфикация через AD — если у вас поднят AD, то можно просто завести пользователей руками, пароль при проверке входа будет браться из AD.
И вообще будем слать что то по почте? — в случае поступления новой задачи пользователю, или движения ТМЦ по данному пользователю, ему будет отослано соответствующее письмо.
Первоначальное заполнение справочников
Для полноценной работы Вам необходимо сначала заполнить справочники. Хотя-бы основные позиции.
Ведение реестра ТМЦ
Заходим: Реестры -> Имущество. Здесь происходят основные операции с ТМЦ. Поступление, Редактирование (в т.ч. добавление фото), Перемещение, Печать штрихкода. Так-же реализован поиск ТМЦ. Для каждой единицы отображается история перемещения, а так-же нажатием на знак «+» слева, можно ввести дополнительные параметры, привязанные к группе номенклатуры (например типа операционной системы, количество памяти и т.п.).
Планы помещений
С версии 1.04 появилась возможность загружать в справочнике «Организации» план помещений (формат PNG) и размещать ТМЦ соответственно на этом плане
Отчеты
Заходим: Главная-> Отчеты. Здесь вы можете отобразить в удобовариваемом для печати формате некоторые данные по состоянию учета ТМЦ на текущую дату.
Сейчас отчетов не так уж много, но в ближайшее время , если не заленюсь, будет добавлено еще несколько..
Новости
Заходим: Реестры-> Новости. Добавляем новости. Они будут отображаться на главной странице. Последняя по дате новость помеченная как «закреплено» будет отображаться так-же на главной странице.
Меню «Имущество»
Заходим: Главная->Имущество. Предназначено для отображения имущества находящегося на попечении текущего пользователя (тот кто залогинился), как в помещении где он находится, так и на материальной ответственности.
Так-же для администратора есть возможность из данного раздела загружать фото.
Удаление объектов
Для окончательного удаления помеченных на удаление объектов разработан механизм поиска взаимосвязей помеченных на удаление объектов В случае если объект ни от чего не зависит то он будет удален. Правила для удаления объектов описаны в файле delete.xml
| 1 2 3 4 5 6 7 8 9 10 | <table name="group_nome" comment="Группы номенклатуры"> 	  <reqtable name="nome"  comment="Номенклатура"> 		  <fromkey>id</fromkey>  		  <tokey>groupid</tokey>  	  </reqtable> 	  <reqtable name="group_param"  comment="Параметры группы"> 		  <fromkey>id</fromkey>  		  <tokey>groupid</tokey>  	  </reqtable>   </table> | 
Например вот этот кусок показывает зависимость таблицы group_nome от таблиц nome и group_param по ключам id и groupid. В случаеприсутстсвия в таблицах nome и group_param хоть одной связанной записи с group_nome, ни одна запись из group_nome удалена не будет
Выгрузка в формате xml
Это фактически механизм для взаимодействия с другими учетными системами. Например с 1С. Конкретно у меня получившийся файл загружается в специальный документ в 1С и сравнивается с учетом по данным 1С и с учетом в данной «учетной» системе. Подробнее о возможном использовании здесь
Написание собственных модулей
Достаточно просто написать собственный модуль, если необходимо добавить функционал. Мало того, это приветствуется! Если вы написали свой модуль, то пришлите его мне, я с удовольствием включу его в следующий релиз/обновление.
Для понимания процесса опишу логику загрузки ПО:
- грузится index.php из корня сайта
- подгружаются настройки, классы, подключается smarty.
- Если в url есть content_page=имя_модуля, то загружается сначала файл modules/имя_модуля.php, затем templates/шаблон_сайта/имя_модуля.tpl
- меню берется из папки modules/menu
| 1 | <li><a href=?content_page=news>Новости</a></li> | 
| 1 2 3 4 5 6 7 8 9 10 11 | {if $user_mode==1} //проверяем что текущий пользователь - админ. 1- админ 0 - пользователь, пусто - не залогинился. <div class="hero-unit">    <table id="list2"></table> // сюда будет загружена таблица новостей при помощи jqGrid    <div id="pager2"></div> // здесь будет панель управления таблицей    <div id="pg_add_edit" name="pg_add_edit"></div> // сюда будет загружена     <script type="text/javascript" src="controller/client/js/news.js"></script>  // подгружаем скрипты JS.  </div> {else}    <div class="alert alert-error">Не достаточно прав!</div> {/if} | 
- controller/client — располагаются скрипты вывода клиентской части (то что выводится на экран) на PHP, которые подгружаются Ajax
- controller/client/js — располагаются скрипты вывода клиентской части (то что выводится на экран) на JavaScript
- controller/server — скрипты которые подготавливают и выдают данные запрашиваемые Ajax кодом
- modules — располагаются PHP файлы которые выполняются перед обработкой *.tpl
- inc — общие для всех модулей файлы
- inc/classes — классы, общие для всех модулей
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | // загружаем в таблицу #list2 список новостей jQuery("#list2").jqGrid({  url:'controller/server/news.php',  datatype: "json",  colNames:['Id','Дата','Заголовок','Закреплено','Действия'],  colModel:[  {name:'id',index:'id', width:55,editable:false},  {name:'dt',index:'dt', width:60,editable:false},  {name:'title',index:'title', width:200,editable:true},  {name:'stiker',index:'stiker', width:200,editable:true,formatter: 'checkbox',edittype: 'checkbox', editoptions: {value: '1:0'}},  {name:'myac', width:80, fixed:true, sortable:false, resize:false, formatter:'actions',formatoptions:{keys:true}}  ],  autowidth: true,   pager: '#pager2',  sortname: 'id',  scroll:1,  viewrecords: true,  sortorder: "asc",  editurl:"controller/server/news.php",  caption:"Новости" }); // загружаем навигационную панель jQuery("#list2").jqGrid('navGrid','#pager2',{edit:false,add:false,del:false,search:false}); // добавляем в таблицу кнопку "Добавить" jQuery("#list2").jqGrid('navButtonAdd','#pager2',{caption:"Добавить",   onClickButton:function(){  $("#pg_add_edit" ).dialog( "destroy" );  $("#pg_add_edit").dialog({autoOpen: false,height: 370,width: 650,modal:true,title: "Добавление новости" });  $("#pg_add_edit" ).dialog( "open" );   $("#pg_add_edit").load("controller/client/news.php?step=add");   }  }); // добавляем в таблицу кнопку "Отредактировать" jQuery("#list2").jqGrid('navButtonAdd','#pager2',{caption:"Отредактировать",   onClickButton:function(){  var gsr = jQuery("#list2").jqGrid('getGridParam','selrow');  if(gsr){   $("#pg_add_edit" ).dialog( "destroy" );  $("#pg_add_edit").dialog({autoOpen: false,height: 370,width: 650,modal:true,title: "Редактирование новости" });  $("#pg_add_edit" ).dialog( "open" );   $("#pg_add_edit").load("controller/client/news.php?step=edit&id="+gsr);  } else {  alert("Сначала выберите строку!")  }   } }); | 
4) Создаем файл controller/client/news.php, который подгружается в pg_add_edit после нажатия кнопок «Добавить» или «Редактировать»
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <? include("../../inc/class/config.php");		// загружаем классы настроек include("../../inc/class/users.php");		// загружаем классы настроек $cfg=new Tconfig; include("../../config.php");			// загружаем основные настройки, которых нет в БД include("../../inc/connect.php");			// соеденяемся с БД, получаем $cfg->base_id $cfg->GetFromBaseNoSmarty();				// получаем настройки из базы include("../../controller/server/login.php");			// проверяем вход пользователя include("../../controller/server/functions.php");		// подгружаем функции пользователя $step=$_GET["step"]; $id=$_GET["id"]; if ($step=='edit')  {     $result = mysql_query("SELECT * FROM news WHERE id='$id';",$cfg->base_id); 		       while ($myrow = mysql_fetch_array($result)){ 			    $dtpost=MySQLDateTimeToDateTime($myrow[dt]); 			    $title=$myrow[title]; 			    $txt=$myrow[body];			     		       };  }; ?> <script type="text/javascript" src="templates/<? echo "$cfg->theme"; ?>/js/tiny.js"></script> <div id="messenger"></div>     <form ENCTYPE="multipart/form-data" action="?content_page=news&step=<? echo "$step&newsid=$id"; ?>" method="post" name="form1" target="_self"> <table> <tr> <td>      Дата: <br>  <input name=dtpost id=dtpost value="<? echo "$dtpost"; ?>" size="14"><br> </td>    <td>        Заголовок:<br>   <input name=title class="field span4" value="<? echo "$title";?>"  placeholder="Заголовок" size="50"><br> </td>        </tr>  <tr>     <td colspan="2" rowspan="1">      Тело:<br> <textarea name=txt class="field span6" rows="6" placeholder="Введите новость" cols=80> <? echo "$txt";?> </textarea> </td>     </tr> </table> </form>  <script>  $(function(){         var field = new Array("dtpost", "title", "txt");//поля обязательные         $("form1").submit(function() {// обрабатываем отправку формы             var error=0; // индекс ошибки             $("form").find(":input").each(function() {// проверяем каждое поле в форме                 for(var i=0;i<field.length;i++){ // если поле присутствует в списке обязательных                     if($(this).attr("name")==field[i]){ //проверяем поле формы на пустоту                         if(!$(this).val()){// если в поле пустое                             $(this).css('border', 'red 1px solid');// устанавливаем рамку красного цвета                             error=1;// определяем индекс ошибки                         }                         else{                             $(this).css('border', 'gray 1px solid');// устанавливаем рамку обычного цвета                         }                     }                 }            })             if(error==0){ // если ошибок нет то отправляем данные                 return true;             }             else {             if(error==1) var err_text = "Не все обязательные поля заполнены!<hr>";             $("#messenger").html(err_text);             $("#messenger").fadeIn("slow");             return false; //если в форме встретились ошибки , не  позволяем отослать данные на сервер.             }         })     }); </script> <script type="text/javascript" src="templates/<? echo "$cfg->theme"; ?>/js/rulesdatepicker.js"></script> | 
5) Создаем файл modules/news.php который и будет собственно обрабатывать submit данной формы
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <? if (isset($_GET["step"])) {$step=$_GET["step"];} else {$step="";}; if (($user->mode==1) and ($step!='')) {         $dtpost=DateToMySQLDateTime2(ClearHtml($_POST["dtpost"]));     if ($dtpost==""){$err[]="Не введена дата!";};     $title=ClearHtml($_POST["title"]);     if ($title==""){$err[]="Не задан заголовок!";};     $txt=$_POST["txt"];     if ($txt==""){$err[]="Нету тела новости!";};     $newsid=$_GET["newsid"];     if ($step=="add"){      if (count($err)==0){               $sql="INSERT INTO news (id,dt,title,body) VALUES (NULL,'$dtpost','$title','$txt')";                                         		$result = mysql_query($sql,$cfg->base_id);                   		if ($result==''){die('Не смог добавить новость!: ' . mysql_error());}              };     };     if (($step=="edit") and ($newsid!="")){      if (count($err)==0){               $sql="UPDATE news SET dt='$dtpost',title='$title',body='$txt' WHERE id='$newsid'";                                         		$result = mysql_query($sql,$cfg->base_id);                   		if ($result==''){die('Не смог отредактировать новость!: ' . mysql_error());}              };     }; }; ?> | 
Вот так мы и получили рабочий модуль администрирования новостей.
Вообще конечно если действительно есть желание что-то «допилить», то выходите на меня, дам доступ к SVN, будем «пилить» вместе.
Обратная связь
Вы можете всегда найти меня по следующим контактам ссылка. Я буду весьма благодарен, если вы будете контактировать со мной если:
- хотите материально помочь проекту
- хотите уделить свое время для помощи в разработке проекта (есть SVN репозитарий). Адекватно оценивайте свои силы! Помощники, которых мне придется обучать азам программирования, не принесут пользы..
- нашли ошибку, а еще лучше если знаете как её устранить/уже устранили
- хотите написать нормальную документацию, а не то что читаете сейчас



 
			 
			 
			 
			 
			 
			 
			 
			 
			 
			
Уведомление: Не вошедшее в последнее обновление… | Жизнь замечательных грибов