Files
crm.e5.pl/modules/EcmStockOperations/EcmStockOperation.php
2024-04-27 09:23:34 +02:00

615 lines
24 KiB
PHP
Executable File

<?php
if (! defined ( 'sugarEntry' ) || ! sugarEntry)
die ( 'Not A Valid Entry Point' );
/*
* ******************************************************************************* SugarCRM is a customer relationship management program developed by SugarCRM, Inc. Copyright (C) 2004 - 2007 SugarCRM Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with the addition of the following permission added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. 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, see http://www.gnu.org/licenses or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. The interactive user interfaces in modified source and object code versions of this program must display Appropriate Legal Notices, as required under Section 5 of the GNU General Public License version 3. In accordance with Section 7(b) of the GNU General Public License version 3, these Appropriate Legal Notices must retain the display of the "Powered by SugarCRM" logo. If the display of the logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices must display the words "Powered by SugarCRM". ******************************************************************************
*/
/* * *******************************************************************************
* Description: TODO: To be written.
* Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
* All Rights Reserved.
* Contributor(s): ______________________________________..
* ****************************************************************************** */
require_once ('data/SugarBean.php');
require_once ('include/utils.php');
class EcmStockOperation extends SugarBean {
var $field_name_map = array ();
var $id;
var $date_entered;
var $date_modified;
var $modified_user_id;
var $assigned_user_id;
var $name;
var $product_name;
var $product_code;
var $product_id;
var $stock_name;
var $stock_id;
var $quantity;
var $price;
var $parent_type;
var $parent_name;
var $parent_id;
var $in_id;
var $documentitem_id;
var $type;
var $module_dir = 'EcmStockOperations';
var $table_name = "ecmstockoperations";
var $object_name = "EcmStockOperation";
var $new_schema = true;
var $additional_column_fields = array (
'assigned_user_name',
'assigned_user_id'
);
function EcmStockOperation() {
parent::SugarBean ();
$this->setupCustomFields ( 'EcmStockOperations' );
foreach ( $this->field_defs as $field ) {
$this->field_name_map [$field ['name']] = $field;
}
}
function get_summary_text() {
return $this->name;
}
function create_list_query($order_by, $where, $show_deleted = 0) {
$custom_join = $this->custom_fields->getJOIN ();
$query = "SELECT ";
$query .= "ecmstockoperations.*,users.user_name as assigned_user_name";
if ($custom_join)
$query .= $custom_join ['select'];
$query .= " FROM ecmstockoperations ";
$query .= "LEFT JOIN users ON ecmstockoperations.assigned_user_id=users.id";
$query .= " ";
if ($custom_join)
$query .= $custom_join ['join'];
$where_auto = '1=1';
if ($show_deleted == 0)
$where_auto = " $this->table_name.deleted=0 ";
elseif ($show_deleted == 1)
$where_auto = " $this->table_name.deleted=1 ";
if ($where != "")
$query .= "where $where AND " . $where_auto;
else
$query .= "where " . $where_auto;
if (substr_count ( $order_by, '.' ) > 0)
$query .= " ORDER BY $order_by";
elseif ($order_by != "")
$query .= " ORDER BY $order_by";
else
$query .= " ORDER BY ecmstockoperations.name";
return $query;
}
function create_export_query($order_by, $where) {
$custom_join = $this->custom_fields->getJOIN ();
$query = "SELECT ";
$query .= "ecmstockoperations.*,users.user_name as assigned_user_name";
if ($custom_join)
$query .= $custom_join ['select'];
$query .= " FROM ecmstockoperations ";
$query .= "LEFT JOIN users ON ecmstockoperations.assigned_user_id=users.id";
$query .= " ";
if ($custom_join)
$query .= $custom_join ['join'];
$where_auto = '1=1';
if ($show_deleted == 0)
$where_auto = " $this->table_name.deleted=0 ";
elseif ($show_deleted == 1)
$where_auto = " $this->table_name.deleted=1 ";
if ($where != "")
$query .= "where $where AND " . $where_auto;
else
$query .= "where " . $where_auto;
if (substr_count ( $order_by, '.' ) > 0)
$query .= " ORDER BY $order_by";
elseif ($order_by != "")
$query .= " ORDER BY $order_by";
else
$query .= " ORDER BY ecmstockoperations.name";
return $query;
}
function fill_in_additional_list_fields() {
}
function fill_in_additional_detail_fields() {
parent::fill_in_additional_detail_fields ();
}
function get_list_view_data() {
global $current_language;
$the_array = parent::get_list_view_data ();
$app_list_strings = return_app_list_strings_language ( $current_language );
$mod_strings = return_module_language ( $current_language, 'EcmStockOperations' );
$this->retrieve ( $this->id );
$mod_strings_doc = return_module_language ( $current_language, $this->parent_type );
$the_array ['PARENT_TYPE'] = $this->parent_type;
$the_array ['PARENT_TYPE_NAME'] = $mod_strings_doc ['LBL_MODULE_NAME'];
$the_array ['NAME'] = (($this->name == "") ? "<em>blank</em>" : $this->name);
$r = $GLOBALS ['db']->fetchByAssoc ( $GLOBALS ['db']->query ( "select parent_name,parent_id,parent_type from ecmstockoperations where id='" . $this->id . "'" ) );
$the_array ['DOCUMENT_NAME'] = $r ['parent_name'];
$the_array ['PREVIEW_PDF'] = '<img src="modules/EcmStockDocIns/images/pdf.gif" onclick="EcmPreviewPDF(\'index.php?module=' . $r ['parent_type'] . '&action=previewPDF&method=I&record=' . $r ['parent_id'] . '&to_pdf=1\',{zoom:75,toolbar:1});" style="cursor: pointer;" border="0">';
$the_array ['STOCK_NAME'] = '<a href="index.php?module=EcmStockOperations&action=&query=true&searchFormTab=basic_search&stock_id_basic=' . $this->stock_id . '&stock_name_basic=' . $this->stock_name . '">' . $this->stock_name . '</a>';
$the_array ['ENCODED_NAME'] = $this->name;
$db = $GLOBALS['db'];
$r = $db->fetchByAssoc($db->query("SELECT quantity FROM ecmstockoperations WHERE id='$this->id'"));
$the_array['QUANTITY'] = $r['quantity'];
return $the_array;
}
function build_generic_where_clause($the_query_string) {
$where_clauses = array ();
$the_query_string = PearDatabase::quote ( from_html ( $the_query_string ) );
array_push ( $where_clauses, "ecmstockoperations.name like '$the_query_string%'" );
$the_where = "";
foreach ( $where_clauses as $clause ) {
if ($the_where != "")
$the_where .= " or ";
$the_where .= $clause;
}
return $the_where;
}
function set_notification_body($xtpl, $ecmstockoperation) {
global $mod_strings, $app_list_strings;
$xtpl->assign ( "ECMSTOCKOPERATION_SUBJECT", $ecmstockoperation->name );
return $xtpl;
}
function bean_implements($interface) {
switch ($interface) {
case 'ACL' :
return true;
}
return false;
}
function save($check_notify = FALSE) {
return parent::save ( $check_notify );
}
function deleteProducts($p, $id, $itemid, $stock_id, $date) {
$arr = array ();
$w = $GLOBALS ['db']->query ( "select quantity as qty,id,price from ecmstockoperations where deleted='0' and type='0' and used=0 and in_id IS NULL and stock_id='" . $stock_id . "' and product_id='" . $p ['id'] . "'" );
while ( $rrr = $GLOBALS ['db']->fetchByAssoc ( $w ) ) {
$ww = $GLOBALS ['db']->query ( "select quantity from ecmstockoperations where in_id='" . $rrr ['id'] . "' and type='1' and in_id IS NOT NULL and stock_id='" . $stock_id . "' and product_id='" . $p ['id'] . "' and deleted='0'" );
$rqty = 0;
while ( $rrp = $GLOBALS ['db']->fetchByAssoc ( $ww ) ) {
$rqty += $rrp ['quantity'];
}
$qty = $rrr ['qty'] - $rqty;
if ($qty > 0) {
$arr [] = array (
"qty" => $qty,
"id" => $rrr ['id'],
"price" => $rrr ['price']
);
}
}
$rr = array ();
$used_qty = 0;
$stop = 0;
foreach ( $arr as $value ) {
if ($p ['quantity'] - $used_qty <= $value ['qty']) {
$rr [] = array (
"id" => $value ['id'],
"qty" => $p ['quantity'] - $used_qty,
"price" => $value ['price']
);
$stop = 1;
} else {
$rr [] = array (
"id" => $value ['id'],
"qty" => $value ['qty'],
"price" => $value ['price']
);
$used_qty += $value ['qty'];
}
if ($stop) {
$stop = 0;
break;
}
}
$qq = 0;
$pp = 0;
$avg_pq = 0;
$avg_q = 0;
foreach ( $rr as $r ) {
$this->addDeleteOperation ( $r ['id'], $p ['id'], $r ['qty'], $r ['price'], $date, $id, $stock_id, $itemid );
$avg_pq += $r ['qty'] * $r ['price'];
$avg_q += $r ['qty'];
}
$GLOBALS ['db']->query ( "update ecmstockdocoutitems set price='" . ($avg_pq / $avg_q) . "' where id='" . $itemid . "'" );
}
function addDeleteOperation($stock_in_id, $product_id, $quantity, $price, $date, $wz_id, $stock_id, $itemid) {
require_once ("modules/EcmStockOperations/EcmStockOperation.php");
$o = new EcmStockOperation ();
$o->unformat_all_fields ();
require_once ("modules/EcmProducts/EcmProduct.php");
$o->product_id = $product_id;
$p = new EcmProduct ();
$p->retrieve ( $product_id );
$o->product_code = $p->code;
$o->product_name = $p->name;
require_once ("modules/EcmStocks/EcmStock.php");
$o->stock_id = $stock_id;
$s = new EcmStock ();
$s->retrieve ( $stock_id );
$o->stock_name = $s->name;
$o->parent_id = $wz_id;
$r = $GLOBALS ['db']->fetchByAssoc ( $GLOBALS ['db']->query ( "select document_no from ecmstockdocouts where id='" . $wz_id . "'" ) );
$o->parent_name = $r ['document_no'];
$o->parent_type = "EcmStockDocOuts";
$o->quantity = $quantity;
$o->price = $price;
$o->in_id = $stock_in_id;
$o->documentitem_id = $itemid;
$o->type = 1;
$o->save ();
require_once ("modules/EcmStockStates/EcmStockState.php");
$ss = new EcmStockState ();
$ss->UpdateStockState ( $o->stock_id, $o->product_id );
}
function saveReservation($stock_id, $product_id, $temp_doc_id, $temp_item_id, $quantity, $doc_type) {
global $db, $current_user;
// get session
session_start ();
$sid = session_id ();
$q = "select count(*) as cnt from ecmreservations where temp_item_id='" . $temp_item_id . "'";
// var_dump($q);
$r = $db->fetchByAssoc ( $db->query ( $q ) );
// var_dump($r);
if ($r ['cnt'] > 0) {
$updateQuery = '
UPDATE
ecmreservations
SET
quantity = \'' . $quantity . '\'
WHERE
temp_item_id = \'' . $temp_item_id . '\'
;';
$result = $db->query ( $updateQuery );
} else {
$insertQuery = '
INSERT INTO
ecmreservations
SET
date_modified = \'' . date ( "Y-m-d H:i:s" ) . '\',
date_entered = \'' . date ( "Y-m-d H:i:s" ) . '\',
modified_user_id = \'' . $_SESSION ['authenticated_user_id'] . '\',
created_by = \'' . $_SESSION ['authenticated_user_id'] . '\',
id = \'' . create_guid () . '\',
temp_doc_id = \'' . $temp_doc_id . '\',
temp_item_id = \'' . $temp_item_id . '\',
product_id = \'' . $product_id . '\',
quantity = \'' . $quantity . '\',
session_id = \'' . $sid . '\',
stock_id = \'' . $stock_id . '\',
doc_type = \'' . $doc_type . '\'
;';
$result = $db->query ( $insertQuery );
}
return $result;
}
function saveParentReservation($stock_id, $product_id, $doc_id, $item_id, $quantity, $doc_type) {
global $db, $current_user;
session_start ();
$q = "select count(*) as cnt from ecmreservations where item_id='$item_id' and doc_id='$doc_id'";
$r = $db->fetchByAssoc ( $db->query ( $q ) );
if ($r ['cnt'] > 0) {
$updateQuery = '
UPDATE
ecmreservations
SET
quantity = \'' . $quantity . '\'
WHERE
item_id = \'' . $item_id . '\'
;';
$result = $db->query ( $updateQuery );
} else {
$insertQuery = '
INSERT INTO
ecmreservations
SET
date_modified = \'' . date ( "Y-m-d H:i:s" ) . '\',
date_entered = \'' . date ( "Y-m-d H:i:s" ) . '\',
modified_user_id = \'' . $_SESSION ['authenticated_user_id'] . '\',
created_by = \'' . $_SESSION ['authenticated_user_id'] . '\',
id = \'' . create_guid () . '\',
doc_id = \'' . $doc_id . '\',
item_id = \'' . $item_id . '\',
product_id = \'' . $product_id . '\',
quantity = \'' . $quantity . '\',
stock_id = \'' . $stock_id . '\',
doc_type = \'' . $doc_type . '\'
;';
$result = $db->query ( $insertQuery );
}
return $result;
}
function updateReservation($doc_id, $item_id, $quantity) {
global $db;
if ($quantity < 0) {
$q = $db->fetchByAssoc ( $db->query ( "SELECT quantity FROM ecmreservations WHERE doc_id='$doc_id' and item_id='$item_id'" ) );
if (! $q || $q ['quantity'] == '')
return;
if ($q ['quantity'] + $quantity <= 0)
$db->query ( "DELETE from ecmreservations WHERE doc_id='$doc_id' AND item_id='$item_id'" );
else
$db->query ( "UPDATE ecmreservations SET quantity=quantity+$quantity WHERE doc_id='$doc_id' AND item_id='$item_id'" );
}
/*
* else { $q = $db->fetchByAssoc($db->query("SELECT quantity FROM ecmreservations WHERE doc_id='$doc_id' and item_id='$item_id'")); if (!$q || $q['quantity']='') { } }
*/
}
/**
* Save document reservations.
*/
function saveDocumentReservations($temp_doc_id) {
global $db;
$query = '
UPDATE
`ecmreservations` AS r
SET
r.`session_id` = NULL,
r.`doc_id` = r.`temp_doc_id`,
r.`item_id` = r.`temp_item_id`,
r.`temp_doc_id` = NULL,
r.`temp_item_id` = NULL
WHERE
r.`temp_doc_id` = \'' . $temp_doc_id . '\'
;';
echo $query;
$result = $db->query ( $query );
return $result;
}
function removeReservation($temp_item_id) {
global $db;
$db->query ( "DELETE FROM ecmreservations WHERE temp_item_id='" . $temp_item_id . "'" );
}
function removeDocumentReservations($temp_doc_id) {
global $db;
$db->query ( "DELETE FROM ecmreservations WHERE temp_doc_id='" . $temp_doc_id . "'" );
}
function removeSaleProductReservations($item_id) {
global $db;
$db->query ( "DELETE FROM ecmreservations WHERE item_id='" . $item_id . "'" );
}
function removeSaleReservations($sale_id) {
global $db;
$db->query ( "DELETE FROM ecmreservations WHERE doc_id='" . $sale_id . "'" );
}
function getSaleReservations($ecmsale_id, $item_id) {
global $db;
$res = $db->fetchByAssoc ( $db->query ( "SELECT quantity as res FROM ecmreservations WHERE doc_id='" . $ecmsale_id . "' AND item_id='" . $item_id . "'" ) );
return $res ['res'];
}
function getStockR($product_id, $stock_id = "", $item_id = "") {
global $db;
if ($stock_id != '')
$stock = " and stock_id='" . $stock_id . "'";
else
$stock = "";
$z = "select sum(quantity) as q from ecmreservations where product_id='" . $product_id . "'" . $stock;
$q = $db->query ( $z );
$row = $db->fetchByAssoc ( $q );
return ( int ) $row ['q'];
}
// stock without reservations
function getRealStock($product_id, $stock_id = "") {
global $db;
if ($stock_id != '')
$stock = " and stock_id='" . $stock_id . "'";
else
$stock = "";
$rquery = "SELECT sum(quantity) as quantity FROM ecmstockstates WHERE product_id='" . $product_id . "'" . $stock;
// get stockstates quantity
$r = $db->fetchByAssoc ( $db->query ( $rquery ) );
if (! $r ['quantity'])
$r ['quantity'] = 0;
return $r ['quantity'];
}
function getStock($product_id, $stock_id = "") {
global $db;
if ($stock_id != '')
$stock = " and stock_id='" . $stock_id . "'";
else
$stock = "";
$rquery = "SELECT quantity FROM ecmstockstates WHERE product_id='" . $product_id . "'" . $stock;
// get stockstates quantity
$r = $db->fetchByAssoc ( $db->query ( $rquery ) );
$rrquery = "SELECT sum(quantity) as res FROM ecmreservations WHERE product_id='" . $product_id . "'" . $stock;
// get reservations
$rr = $db->fetchByAssoc ( $db->query ( $rrquery ) );
if (! is_array ( $rr ))
$rr ['res'] = 0;
return $r ['quantity'] - $rr ['res'];
}
function getStockArray($product_id) {
if (! $product_id)
return '';
global $db;
$res = $db->query ( "SELECT id, name FROM ecmstocks WHERE deleted='0'" );
$ret = array ();
while ( $row = $db->fetchByAssoc ( $res ) ) {
$qty = $this->getStock ( $product_id, $row ['id'] );
if ($qty > 0)
$ret [$row ['name']] = $qty;
}
return $ret;
}
function getPurchaseArray($product_id) {
if (! $product_id)
return '';
global $db;
$res = $db->query("SELECT parent_name, parent_id, quantity, price FROM ecmstockoperaions WHERE product_id='$product_id' AND type='1' AND used='0' AND deleted='0'");
return "SELECT parent_name, parent_id, quantity, price FROM ecmstockoperaions WHERE product_id='$product_id' AND type='1' AND used='0' AND deleted='0'";
}
function getAllQuantity($product_id) {
global $db;
$r = $db->fetchByAssoc ( $db->query ( "
SELECT
CASE WHEN (SELECT sum(quantity) FROM ecmreservations WHERE product_id='$product_id') IS NULL
THEN
(SELECT sum(quantity) FROM ecmstockstates WHERE product_id='$product_id')
ELSE
((SELECT sum(quantity) FROM ecmstockstates WHERE product_id='$product_id')-(SELECT sum(quantity) FROM ecmreservations WHERE product_id='$product_id'))
END
as qty
" ) );
return $r ['qty'];
}
function checkStock($p, $stock_id) {
global $db;
$p = base64_decode ( $p );
print_r ( $_REQUEST );
require_once ('include/json_config.php');
$json_config = new json_config ();
$json = getJSONobj ();
$pll = array ();
$exp = explode ( "||||", $p );
foreach ( $exp as $ep ) {
if ($ep) {
$pll [] = $json->decode ( htmlspecialchars_decode ( $ep ) );
}
}
$p = $pll;
foreach ( $p as $rr ) {
$products [] = array (
"product_name" => $rr ['name'],
"product_id" => $rr ['id'],
"quantity" => $rr ['quantity'],
"item_id" => $rr ['item_id']
);
}
// print_r($products);echo "mmmmmmmmmm";
$str .= '<div style="text-align:center">';
$str .= '<span style="font-family:Geneva,Arial;font-size: 12px;font-weight:bold;">Sprawdzanie stanów magazynowych</span>';
$str .= '<table align="center" style="padding:3px;border:1px solid #ccc"><tr><td style="background:#999;color:white;font-weight:bold;padding:3px;">Produkt</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">Ilość</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">Magazyn</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">&nbsp;</td></tr>';
if (count ( $products ) > 0) {
foreach ( $products as $p ) {
if (! $p ['product_id'])
continue;
$qty = self::getStock ( $p ['product_id'], $stock_id, $p ['item_id'] );
$str .= '<tr><td style="padding:3px;">' . $p ['product_name'] . '</td><td style="padding:3px;">' . $p ['quantity'] . '</td><td style="padding:3px;">' . $qty . '</td><td style="padding:3px;">';
if ($p ['quantity'] > $qty) {
$no = true;
$str .= '<span style="color:red">' . "błąd" . '</span>';
} else
$str .= '<span style="color:green">' . "ok" . '</span>';
$str .= '</td></tr>';
}
}
$str .= '</table><br>';
if ($no) {
$str .= '<span style="font-family:Geneva,Arial;font-size: 12px;font-weight:bold;">' . "Brakuje produktów na magazynie" . '</span>';
$str .= '&nbsp;<input type="button" class="button" onclick="document.getElementById(\'check_stock\').style.display=\'none\';" value="' . "Popraw" . '">';
} else {
$str .= '<input type="submit" name="save" class="button" value="Zapisz" onclick="executingPostBack=1;saveItems(true);this.form.action.value=\'Save\';" />';
}
$str .= '</div>';
return $str;
}
function checkStockSales($p, $stock_id) {
global $db;
require_once ('include/json_config.php');
$json_config = new json_config ();
$json = getJSONobj ();
$pll = array ();
$exp = explode ( "||||", $p );
foreach ( $exp as $ep ) {
if ($ep) {
$pll [] = $json->decode ( htmlspecialchars_decode ( $ep ) );
}
}
$p = $pll;
foreach ( $p as $rr ) {
$products [] = array (
"product_name" => $rr ['name'],
"product_id" => $rr ['id'],
"quantity" => $rr ['quantity'],
"reservation" => $rr ['reservation'],
"rq" => $rr ['rq']
);
}
$str .= '<div style="text-align:center">';
$str .= '<span style="font-family:Geneva,Arial;font-size: 12px;font-weight:bold;">Sprawdzanie stanów magazynowych</span>';
$str .= '<table align="center" style="padding:3px;border:1px solid #ccc"><tr><td style="background:#999;color:white;font-weight:bold;padding:3px;">Produkt</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">Ilość</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">Ilość do rezerwacji</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">Magazyn</td><td style="background:#999;color:white;font-weight:bold;padding:3px;">&nbsp;</td></tr>';
if (count ( $products ) > 0) {
foreach ( $products as $p ) {
if (! $p ['product_id'] || ! $p ['reservation'])
continue;
$qty = self::getStock ( $p ['product_id'], $stock_id );
$str .= '<tr><td style="padding:3px;">' . $p ['product_name'] . '</td><td style="padding:3px;">' . $p ['quantity'] . '</td><td style="padding:3px;">' . $p ['rq'] . '</td><td style="padding:3px;">' . $qty . '</td><td style="padding:3px;">';
if ($p ['rq'] > $qty || $p ['rq'] > $p ['quantity']) {
$no = true;
$str .= '<span style="color:red">' . "błąd" . '</span>';
} else
$str .= '<span style="color:green">' . "ok" . '</span>';
$str .= '</td></tr>';
}
}
$str .= '</table><br>';
if ($no) {
$str .= '<span style="font-family:Geneva,Arial;font-size: 12px;font-weight:bold;">' . "Brakuje produktów na magazynie lub wpisałeś za dużą ilość produktów do zarezerwowania" . '</span>';
$str .= '&nbsp;<input type="button" class="button" onclick="document.getElementById(\'check_stock\').style.display=\'none\';" value="' . "Popraw" . '">';
} else {
$str .= '<input type="submit" name="save" class="button" value="Zapisz" onclick="executingPostBack=1;saveItems(true);this.form.action.value=\'Save\';" />';
}
$str .= '</div>';
return $str;
}
}
?>