<?php
/**
* Copyright (C) 2009 Arie Nugraha (hide@address.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/* Stock Take */
// main system configuration
require '../../../sysconfig.inc.php';
// start the session
require SENAYAN_BASE_DIR.'admin/default/session.inc.php';
require SENAYAN_BASE_DIR.'admin/default/session_check.inc.php';
require SIMBIO_BASE_DIR.'simbio_GUI/table/simbio_table.inc.php';
require SIMBIO_BASE_DIR.'simbio_GUI/form_maker/simbio_form_table_AJAX.inc.php';
require SIMBIO_BASE_DIR.'simbio_DB/simbio_dbop.inc.php';
// privileges checking
$can_read = utility::havePrivilege('stock_take', 'r');
$can_write = utility::havePrivilege('stock_take', 'w');
if (!($can_read AND $can_write)) {
die('<div class="errorBox">'.__('You don\'t have enough privileges to access this area!').'</div>');
}
// check if there is any active stock take proccess
$stk_q = $dbs->query('SELECT * FROM stock_take WHERE is_active=1');
if ($stk_q->num_rows) {
echo '<div class="errorBox">'.__('There is already stock taking proccess running!').'</div>';
} else {
// add new stock take
if (isset($_POST['saveData']) AND empty($_POST['name'])) {
utility::jsAlert(__('Stock Take Name must be filled!'));
exit();
} else if (isset($_POST['saveData']) AND !empty($_POST['name'])) {
$data['stock_take_name'] = trim($dbs->escape_string(strip_tags($_POST['name'])));
$data['start_date'] = date('Y-m-d H:i:s');
$data['init_user'] = $_SESSION['realname'];
$data['is_active'] = 1;
$sql_op = new simbio_dbop($dbs);
if ($sql_op->insert('stock_take', $data)) {
// get latest stock take id
$stock_take_id = $sql_op->insert_id;
// criteria
$criteria = ' WHERE (ist.skip_stock_take<1 OR ist.skip_stock_take IS NULL) ';
// gmd
if ($_POST['gmdID'] != '0') {
$criteria .= ' AND b.gmd_id='.intval($_POST['gmdID']).' ';
}
// collection type
if ($_POST['collTypeID'] != '0') {
$criteria .= ' AND i.coll_type_id=\''.intval($_POST['collTypeID']).'\' ';
}
// location
if ($_POST['location'] != '0') {
$criteria .= ' AND i.location_id=\''.$dbs->escape_string($_POST['location']).'\' ';
}
// site/placement
if ($_POST['itemSite']) {
$criteria .= ' AND i.site LIKE \''.$dbs->escape_string($_POST['itemSite']).'\' ';
}
// classification
if ($_POST['classification']) {
$criteria .= ' AND (';
// each class
$arr_class = explode(',', $_POST['classification']);
$class_criteria = '';
foreach ($arr_class as $each_class) {
// check each class if its containing wildcard
if (strpos($each_class, '*') !== false) {
$each_class = str_replace('*', '%', $dbs->escape_string($each_class));
$class_criteria .= ' b.classification LIKE \''.$each_class.'\' OR ';
} else {
$each_class = $dbs->escape_string($each_class);
$class_criteria .= ' b.classification=\''.$each_class.'\' OR ';
}
}
// remove last OR
$class_criteria = substr_replace($class_criteria, '', -3);
$criteria .= $class_criteria.' )';
}
// for debugging purpose only
// emptying previous stock take item data
$clean_q = $dbs->query('TRUNCATE TABLE stock_take_item');
// copy all item data to stock take detail table
$insert_q = $dbs->query("INSERT INTO stock_take_item (stock_take_id, item_id, item_code, title, gmd_name, classification, coll_type_name, call_number, location, status, checked_by, last_update)
SELECT $stock_take_id, i.item_id, i.item_code, b.title, g.gmd_name, b.classification, ct.coll_type_name, b.call_number, loc.location_name, 'm', '".$_SESSION['realname']."', NULL FROM
item AS i
LEFT JOIN mst_item_status AS ist ON i.item_status_id=ist.item_status_id
LEFT JOIN mst_coll_type AS ct ON i.coll_type_id=ct.coll_type_id
LEFT JOIN mst_location AS loc ON i.location_id=loc.location_id
LEFT JOIN biblio AS b ON i.biblio_id=b.biblio_id
LEFT JOIN mst_gmd AS g ON b.gmd_id=g.gmd_id
$criteria");
// get number of item on loan
$item_loan_q = $dbs->query("SELECT COUNT(loan_id) FROM loan AS l WHERE is_lent=1 AND is_return=0");
$item_loan_d = $item_loan_q->fetch_row();
if (!$item_loan_d[0]) {
$item_loan_d[0] = 0;
}
// update data for item being loan
$update_q = $dbs->query("UPDATE stock_take_item SET status='l' WHERE item_code IN (SELECT item_code FROM loan AS l WHERE is_lent=1 AND is_return=0)");
// total rows inserted
$total_rows_q = $dbs->query("SELECT COUNT(item_code) FROM stock_take_item WHERE status='m'");
$total_rows_d = $total_rows_q->fetch_row();
if ($total_rows_d[0] > 0) {
// update total_lost_item field value in stock_take table
$update_total_q = $dbs->query('UPDATE stock_take SET total_item_stock_taked='.$total_rows_d[0].', total_item_loan='.$item_loan_d[0].', total_item_lost='.$total_rows_d[0].", stock_take_users='".$_SESSION['realname']."\n' WHERE stock_take_id=$stock_take_id");
// write log
utility::writeLogs($dbs, 'staff', $_SESSION['uid'], 'stock_take', $_SESSION['realname'].' initialize stock take ('.$data['stock_take_name'].') from address '.$_SERVER['REMOTE_ADDR']);
utility::jsAlert(__('Stock Taking Initialized'));
echo '<script type="text/javascript">parent.location.href = \''.SENAYAN_WEB_ROOT_DIR.'admin/index.php?mod=stock_take\';</script>';
} else {
// delete stock take data
$dbs->query('DELETE FROM stock_take WHERE stock_take_id='.$stock_take_id);
utility::jsAlert(__('Stock Taking FAILED to Initialized.\nNo item to stock take!'));
}
exit();
}
}
// create new instance
$form = new simbio_form_table_AJAX('mainForm', $_SERVER['PHP_SELF'].'?action=new', 'post');
$form->submit_button_attr = 'name="saveData" value="'.__('Initialize Stock Take').'" class="button"';
// form table attributes
$form->table_attr = 'align="center" id="dataList" cellpadding="5" cellspacing="0"';
$form->table_header_attr = 'class="alterCell" style="font-weight: bold;"';
$form->table_content_attr = 'class="alterCell2"';
/* Form Element(s) */
// stock take name
$form->addTextField('text', 'name', __('Stock Take Name').'*', '', 'style="width: 60%;"');
// gmd
// get gmd data related to this record from database
$gmd_q = $dbs->query('SELECT gmd_id, gmd_name FROM mst_gmd');
$gmd_options[] = array('0', __('ALL'));
while ($gmd_d = $gmd_q->fetch_row()) {
$gmd_options[] = array($gmd_d[0], $gmd_d[1]);
}
$form->addSelectList('gmdID', __('GMD'), $gmd_options);
// collection type
// get coll_type data related to this record from database
$coll_type_q = $dbs->query('SELECT coll_type_id, coll_type_name FROM mst_coll_type');
$coll_type_options[] = array('0', __('ALL'));
while ($coll_type_d = $coll_type_q->fetch_row()) {
$coll_type_options[] = array($coll_type_d[0], $coll_type_d[1]);
}
$form->addSelectList('collTypeID', __('Collection Type'), $coll_type_options);
// location
// get language data related to this record from database
$location_q = $dbs->query("SELECT location_id, location_name FROM mst_location");
$location_options[] = array('0', __('ALL'));
while ($location_d = $location_q->fetch_row()) {
$location_options[] = array($location_d[0], $location_d[1]);
}
$form->addSelectList('location', __('Location'), $location_options);
// item site
$form->addTextField('text', 'itemSite', __('Shelf Location'), '', 'style="width: 20%;"');
// classification;
$str_input = simbio_form_element::textField('text', 'classification', '', 'style="width: 60%;"');
$str_input .= '<br />'.__('Separate each class comma sign. Use * for wildcard');
$form->addAnything(__('Classification'), $str_input);
// print out the object
echo $form->printOut();
}
?>