Учет оргтехники в организации v 2.0 (работа в браузере) (закончено)

ВНИМАНИЕ! Данный материал устарел. Новую версию смотрите здесь

DEMO страница на sourceforge (test/test)
Скачать последнюю версию

Сообщить об ошибке
SVN репозитарий 


Общие сведения

Данный программный продукт предназначен для ведения учета оргтехники (да и любой ТМЦ) в одной или нескольких небольших организациях (разработка и тестирование проводилось в организации с численностью единиц оргтехники в количестве 293 и 2-х организаций). Учет ведется в разрезе материальной ответственности, а так-же привязки сотрудников к помещениям. Таким образом, вы и любой сотрудник организации в любой момент можете увидеть: количество и состав ТМЦ находящихся в его ведении, историю перемещений объекта, его фото, а так-же историю его ремонтов. Так-же данный программный продукт удобно использовать для проведения инвентаризаций (у меня например используется связка с данными по 1с). Основным же преимуществом этой разработки считаю : учет ведется из браузера в WEB интерфейсе, т.е. нет необходимости на каждом рабочем месте ставить клиентское ПО.

Лицензионное соглашение

В данный момент это ПО лицензируется и распространяется по принципу «Как есть». Вы можете скачивать, устанавливать, изменять исходные коды и использовать их для любых своих нужд, кроме продажи (ну или хочу долю!). Со своей стороны я так-же не гарантирую ничего: ни поддержки, ни обновлений, ни вообще работоспособности конечного продукта. Так-же я волен изменить данную лицензию в любой момент.

Материальное стимулирование

Несомненно приветствуется. Если вам хочется простимулировать автора данного ПО для дальнейших подвигов, свяжитесь со мной. У автора есть два пути обрести душевное спокойствие: материальное благополучие и слава. И то и другое автор очень любит.

Установка

Для успешного запуска ПО необходимы установленные Apache 2+,PHP 4+, MySQL 4+. Процесс развертывания LAMP достаточно легко найти в www.google.com Работа тестировалась на дистрибутиве Linux  Debian, однако я уверен, что и  любителей Windows проблем не возникнет.

Крайне не рекомендую СЕЙЧАС устанавливать данное ПО на «реальном» хостинге, «смотрящем» в интернет.  Хотя работать конечно будет…но не долго…ибо «придурков-хакеров» сейчас много, а зайцев поди мало.. Я к тому, что на вопрос безопасности никто не тестировал данное ПО. Для локальной сети пойдет, но в интернет выставлять, яб не стал. Работы по тестированию-устранению дыр будут проведены в ближайших релизах, после чего скорее всего запущу «Демо» в интернете, чтоб можно было «пощупать» в «живую».

Далее:

  1. Скачиваем последнюю версию исходников с https://sourceforge.net/projects/webuseorg/files/ 
  2. Копируем/распаковываем их в папку с сайтом.
  3. Запускаем инсталлятор http://имя_сайта/install/index.php
  4. Открываем config.php, прописываем данные для соединения с БД
  5. Пробуем запустить.
  6. Удаляем папку install

Обновление

Обновления являются каммулятивными — для обновления до последней версии нужен только самый последний релиз. Т.е. скачиваем ПОСЛЕДНЮЮ версию данного ПО. Копируем её 1 в 1 с заменой файлов в каталог где стояла предыдущая версия (за исключением config.php в корне). Выполняем  http://имя_или_IP_сайта/update.php Не забудьте после обновления удалить файл update.php

В ближайшее время планирую внедрить «проверку обновлений». При выходе новой версии, будет показано соответствующее уведомление в меню «Администрирование-Настройка».

Для любителей «свежатинки» — SVN репозитарий. По крайне мере сейчас (Декабрь 2012) там стабильно идут правки 1-2 раза в день.

Точно не будет и не планируется в ближайших релизах: автообновление. Вот может когда «деревья станут большими», вот тогда…

Первоначальная настройка

  1. Заходим на сайт
  2. Логинимся под пользователем test пароль test
  3. Идем в панель администрирования->Настройки
  4. Ставим галочки, заполняем.

Некоторые пояснения:

Аутенфикация через AD — если у вас поднят AD, то можно просто завести пользователей руками, пароль при проверке входа будет браться из AD.

И вообще будем слать что то по почте? — в случае поступления новой задачи пользователю, или движения ТМЦ по данному пользователю, ему будет отослано соответствующее письмо.

Первоначальное заполнение справочников

Для полноценной работы Вам необходимо сначала заполнить справочники. Хотя-бы основные позиции.

Ведение реестра ТМЦ

Заходим: Реестры -> Имущество. Здесь происходят основные операции с ТМЦ. Поступление, Редактирование (в т.ч. добавление фото), Перемещение, Печать штрихкода. Так-же реализован поиск ТМЦ. Для каждой единицы отображается история перемещения, а так-же нажатием на знак «+» слева, можно ввести дополнительные параметры, привязанные к группе номенклатуры (например типа операционной системы, количество памяти и т.п.).

Планы помещений

Снимок-12

С версии 1.04 появилась возможность загружать в справочнике «Организации» план помещений (формат PNG) и размещать ТМЦ соответственно на этом плане

Отчеты

Заходим: Главная-> Отчеты. Здесь вы можете отобразить в удобовариваемом для печати формате некоторые данные по состоянию учета ТМЦ на текущую дату.

Сейчас отчетов не так уж много, но в ближайшее время , если не заленюсь, будет добавлено еще несколько..

Новости

Заходим: Реестры-> Новости. Добавляем новости. Они будут отображаться на главной странице. Последняя по дате новость помеченная как «закреплено» будет отображаться так-же на главной странице.

Меню «Имущество»

Заходим:  Главная->Имущество. Предназначено для отображения имущества находящегося на попечении текущего пользователя (тот кто залогинился), как в помещении где он находится, так и на материальной ответственности.

Так-же для администратора есть возможность из данного раздела загружать фото.

Удаление объектов

Для окончательного удаления помеченных на удаление объектов разработан механизм поиска взаимосвязей помеченных на удаление объектов  В случае если объект ни от чего не зависит  то он будет удален. Правила для удаления объектов описаны в файле delete.xml

<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) В папке modules/menu/doc создаем файл news со следующим содержимым:
<li><a href=?content_page=news>Новости</a></li>
Это даст нам отображение в меню «Реестры» надписи  «Новости»  со ссылкой content_page=news. Соответственно при нажатии на эту ссылку, будет загружены сначала: файл news.php из папки mosules, а затем Smarty загрузит templates/текущая_тема/news.tpl
2)Создаем файл templates/текущая_тема/news.tpl c кодом:
{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 — классы, общие для всех модулей
3) Создаем controller/client/js/news.js
// загружаем в таблицу #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 после нажатия кнопок «Добавить» или «Редактировать»

<?
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 данной формы

<?
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 репозитарий). Адекватно оценивайте свои силы! Помощники, которых мне придется обучать азам программирования, не принесут пользы..
  • нашли ошибку, а еще лучше если знаете как её устранить/уже устранили
  • хотите написать нормальную документацию, а не то что читаете сейчас

VN:F [1.9.22_1171]
Rating: 10.0/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)
Учет оргтехники в организации v 2.0 (работа в браузере) (закончено), 10.0 out of 10 based on 2 ratings

Комментарии:

Учет оргтехники в организации v 2.0 (работа в браузере) (закончено): 8 комментариев

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Жизнь замечательных грибов