<?php

function display_outside_material_requisition_header_details($omr_no, $omrc_no) {
    global $approval_statuses, $systypes_array;
    
    $req_hd_row = get_outside_material_requisition_header($omr_no);
        
        $user_id = $_SESSION['wa_current_user']->user;
        $cap = can_access_project($req_hd_row['project_id'], $user_id);
            if ($cap['success'] !== true) {
                display_error($cap["message"]);
                display_footer_exit();
                exit;
            } 
    
    display_heading($systypes_array[ST_OUTSIDE_MATERIAL_REQ]." Header");
    
        $req_trans_no = $req_hd_row['trans_no'];
        
        if (! isset($_POST['to_loc_code']) && ! ($omrc_no > 0)) {
            $_POST['to_loc_code'] = $req_hd_row['to_loc_code'];
        }
        if (! isset($_POST['from_location']) && ! ($omrc_no > 0)) {
            $_POST['from_location'] = $req_hd_row['from_location'];
        }
    
    start_outer_table(TABLESTYLE2, "width=65%"); // outer table
        start_table(TABLESTYLE2);  
            table_section(1, "27%");
                $jo_id = $req_hd_row['jo_id'];
                label_row("Req. Trans #:", get_inventory_trans_view_str($req_hd_row['type'], $req_hd_row['trans_no']));  
                label_row("Job Card #:", get_service_trans_view_str(ST_JOB_ORDER, $jo_id));
                label_row("Requestor:", $req_hd_row['requestor_name']);  

            table_section(2, "45%");
                label_row("Reference:", $req_hd_row['reference']);  
                label_row("Project:", get_project_formatted_name($req_hd_row['project_id']));  
                label_row("Date:", sql2date($req_hd_row['tran_date']));  
                
            table_section(3, "27%");
                label_row("From Location:", $req_hd_row['from_location']);  
                label_row("To Location:", $req_hd_row['to_location_name']);  
                $s = get_project_trans_view_str(ST_APPROVAL_LOG, $req_trans_no."&source_type_id=".ST_OUTSIDE_MATERIAL_REQ, "Approval Status");
                label_row($s, $approval_statuses[$req_hd_row['approval_status']]);

    end_outer_table(2); // outer table
    
    if (strlen($req_hd_row['comments']) > 0) {
        start_table(TABLESTYLE);
            label_row("Comment:", nl2br($req_hd_row['comments']));  
        end_table(2);
    }
    
    return $req_hd_row;
}

function display_outside_material_receipt_header($omrc_no, $req_hd_row) {
    global $Refs, $systypes_array;
    
    display_heading($systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT]." Header");
    
        $type = ST_OUTSIDE_MATERIAL_RECEIPT;
        $trans_no = 0;
    
        $_POST['project_id'] = $req_hd_row['project_id'];
        hidden('project_id', $req_hd_row['project_id']);

        $user_id = $_SESSION['wa_current_user']->user;
        $cap = can_access_project($_POST['project_id'], $user_id);
            if ($cap['success'] !== true) {
                display_error($cap["message"]);
                set_focus('project_id');
                display_footer_exit();
                exit;
            }  
            
        $header = get_outside_material_receipt_header($omrc_no);

        if (is_array($header)) {
            
            $trans_no = $header['trans_no'];

            if (! isset($_POST['reference'])) {
                $_POST['reference'] = $header['reference'];
            }

            if (! isset($_POST['comments'])){
                $_POST['comments'] = $header['comments'];
            }        

            if (! isset($_POST['from_location'])) {
                $_POST['from_location'] = $header['from_location'];
            }

            if (! isset($_POST['to_loc_code'])) {
                $_POST['to_loc_code'] = $header['to_loc_code'];
            }

            if (! isset($_POST['tran_date'])) {
                $_POST['tran_date'] = sql2date($header['tran_date']);
            }

            if (! isset($_POST['approval_status'])) {
                $_POST['approval_status'] = $header['approval_status'];
            }

        } else {
            $_POST['reference'] = $Refs->get_next($type);            
            $_POST['approval_status'] = 0;
        }
        
        div_start('nsit_header');
  
            start_outer_table(TABLESTYLE2, "width=65%"); // outer table
                start_table(TABLESTYLE2);  
                    table_section(1, "50%");

                        if (is_array($header)) {
                            label_row("Trans #:", get_inventory_trans_view_str($header['type'], $header['trans_no']));  
                            
                            $reference = $header['reference'];            
                            text_row("Reference:", 'reference', $reference, null, null);            
                        } else {            
                            text_row("Reference:", 'reference', $Refs->get_next($type), null, null);   
                        }
                        
                        date_row("Date:", "tran_date");
                        text_row("From Location:", "from_location", null, 50, 500);

                    table_section(2, "50%");
                        
                        locations_list_row("Receiving Location:", 'to_loc_code', null, '', false); 
                        textarea_row("Comment:", 'comments', null, 50, 2); 

                        global $approval_statuses;
                        $s = get_project_trans_view_str(ST_APPROVAL_LOG, $trans_no."&source_type_id=".$type, "Approval Status");
                        label_row($s, $approval_statuses[$_POST['approval_status']]);

            end_outer_table(2); // outer table
    
        div_end();
}

function display_outside_material_receipt_details($omr_no, $omrc_no, &$selected_id, &$Mode) { 
    global $Ajax, $daily_item_types_array, $systypes_array;
    
    display_heading($systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT]." Details");
    
    $req_trans_no = $receipt_trans_no = 0;
    $req_header = get_outside_material_requisition_header_record($omr_no);
        if (is_array($req_header)) {
            $req_trans_no = $req_header['trans_no'];
        } 
        
    $receipt_hd_row = get_outside_material_receipt_header_record($omrc_no);
        if (is_array($receipt_hd_row)) {
            $receipt_trans_no = $receipt_hd_row['trans_no'];
        } 
        
    $units_array = build_all_item_units_array();
    
    $Ajax->activate('nsit_details');
    div_start('nsit_details');
    
        start_table(TABLESTYLE, "width=99%");

            $th = array(_("Req. Line"), _("Receipt Line"), _("Item Type"), _("Item"), _("Req. Unit"), _("Req."), _('Receipt'), _('Receipt Alloc'), _('Returned'), 
                        _('Retur.Alloc'), _('Remain'), _('Receipt Unit'), _('Receipt Qty'), _('Budget'), _('Site'), _('Line Comment'), _(""), _(""), (""));  
                
            table_header($th);

            $k = 0; $dec = 4;
                $result = get_outside_material_requisition_with_outside_material_receipt_details($req_trans_no, $receipt_trans_no);      
                    while ($row = db_fetch($result)) {
                        $id = $row['trans_id'];
                        $receipt_line_id = $row['receipt_line_id'];
                        
                        $req_array = display_outside_material_requisition_line_from_outside_material_receipt($id);
                        
                        if ($receipt_line_id > 0 && $row['receipt_stock_id'] != $row['stock_id']) {
                            start_row("style=background-color:#f3cbf7");
                        } else {
                            alt_table_row_color($k);
                        }

                            label_cell('', 'align=center');
                            label_cell($receipt_line_id, 'align=center');
                            
                            if (! isset($_POST["item_type_$id"]) && ! ($receipt_line_id > 0) && is_array($req_array)) {
                                $_POST["item_type_$id"] = $req_array['item_type'];
                            } elseif (! isset($_POST["item_type_$id"]) && $receipt_line_id > 0) {
                                $_POST["item_type_$id"] = $row['receipt_item_type'];
                            }
                            custom_values_list_cells('', "item_type_$id", $daily_item_types_array, null, '', true);
                            
                            if (! isset($_POST["stock_id_$id"]) && ! ($receipt_line_id > 0) && is_array($req_array)) {
                                $_POST["stock_id_$id"] = $req_array['stock_id'];
                            } elseif (! isset($_POST["stock_id_$id"]) && $receipt_line_id > 0) {
                                $_POST["stock_id_$id"] = $row['receipt_stock_id'];
                            }
                            if (! isset($_POST["item_description_$id"]) && ! ($receipt_line_id > 0) && is_array($req_array)) {
                                $_POST["item_description_$id"] = $req_array['item_description'];
                            } elseif (! isset($_POST["item_description_$id"]) && $receipt_line_id > 0) {
                                $_POST["item_description_$id"] = $row['receipt_item_description'];
                            }

                            if ($_POST["item_type_$id"] == NSIT_NON_STOCK_ITEM) {
                                label_cell(non_stock_items_list("stock_id_$id", null, false, true));
                                $itm = get_item($_POST["stock_id_$id"]);
                                    if (is_array($itm)) {
                                        hidden("item_description_$id", $itm['description']);
                                    } else {
                                        hidden("item_description_$id", '');
                                    }
                            } elseif ($_POST["item_type_$id"] == NSIT_STOCK_ITEM) {
                                label_cell(stock_and_manufacture_items_list("stock_id_$id", null, false, true));
                                $itm = get_item($_POST["stock_id_$id"]);
                                    if (is_array($itm)) {
                                        hidden("item_description_$id", $itm['description']);
                                    } else {
                                        hidden("item_description_$id", '');
                                    }
                            } elseif ($_POST["item_type_$id"] == NSIT_COMMENT) {
                                text_cells('', "item_description_$id", null, 20, 1000, 'Item Description');
                                hidden("stock_id_$id", '');
                            } else {
                                label_cell(''); 
                                hidden("stock_id_$id", '');
                                hidden("item_description_$id", '');
                            }
                            
                            label_cell('', 'colspan=7');
                            
                            if (! isset($_POST["receipt_tran_unit_$id"])) {
                                if ($receipt_line_id > 0) {
                                    $_POST["receipt_tran_unit_$id"] = $row["receipt_tran_unit"];
                                } else {
                                    $_POST["receipt_tran_unit_$id"] = $row["tran_unit"];
                                }
                            }
                            
                            if ($row['item_type'] == NSIT_NON_STOCK_ITEM || $row['item_type'] == NSIT_STOCK_ITEM) {
                                units_list_cells('', "receipt_tran_unit_$id", $_POST["stock_id_$id"], null, '', true);
                            } else {
                                custom_values_list_cells('', "receipt_tran_unit_$id", $units_array, null, '', true);   
                            }
                            
                            if (! isset($_POST["receipt_tran_qty_$id"])) {
                                if ($receipt_line_id > 0) {
                                    $_POST["receipt_tran_qty_$id"] = $row["receipt_tran_qty"];
                                } else {
                                    set_outside_material_receipt_remain_qty($id, $row, $dec);
                                }
                            } else {
                                if (list_updated("receipt_tran_unit_$id")) {
                                    set_outside_material_receipt_remain_qty($id, $row, $dec);
                                }
                            }
                            amount_cells("", "receipt_tran_qty_$id", null, null, null, $dec);
                            
                            if (! isset($_POST["task_id_$id"]) && ! ($receipt_line_id > 0)) {
                                $_POST["task_id_$id"] = $row['task_id'];
                            } elseif (! isset($_POST["task_id_$id"]) && $receipt_line_id > 0) {
                                $_POST["task_id_$id"] = $row['receipt_task_id'];
                            }
                            
                            if (in_array($_POST["item_type_$id"], array(NSIT_NON_STOCK_ITEM, NSIT_STOCK_ITEM))) {
                                all_budgets_list_cells('', "task_id_$id", GLOBAL_VOTES, null, _(''));
                            } else {
                                label_cell('');
                                $_POST["task_id_$id"] = 0;
                                hidden("task_id_$id", 0);
                            }

                            if (! isset($_POST["site_id_$id"]) && ! ($receipt_line_id > 0)) {
                                $_POST["site_id_$id"] = $row['project_site_id'];
                            } elseif (! isset($_POST["site_id_$id"]) && $receipt_line_id > 0) {
                                $_POST["site_id_$id"] = $row['receipt_project_site_id'];
                            }
                            all_project_sites_list_cells("", "site_id_$id", GLOBAL_VOTES, null, '', false); 
                            
                            if (! isset($_POST["line_comment_$id"]) && $receipt_line_id > 0) {
                                $_POST["line_comment_$id"] = $row['receipt_line_comment'];
                            }
                            text_cells('', "line_comment_$id", null, 20, 200, 'Line Comment');
                            
                            if ($receipt_line_id > 0 && $row['stock_control_method'] == SKCM_LOTS) {
                                $receipt_convesion_factor = 1;
                                get_convertion_factor2($row["stock_id"], $_POST["receipt_tran_unit_$id"], $receipt_convesion_factor);
                                
                                display_lot_serial_edit_cells($row['stock_control_method'], ST_OUTSIDE_MATERIAL_RECEIPT, $receipt_trans_no, $receipt_line_id, 
                                                              $receipt_convesion_factor, $dec);
                            } else {
                                label_cell('');
                            }
                            
                            if (! isset($_POST["checked_$id"]) && $receipt_line_id > 0) {
                                $_POST["checked_$id"] = 1;
                            } 
                            check_cells(null, "checked_$id", null, false, false, 'align=center colspan=2');

                        end_row();    
                        
                        vertical_space('height=18px colspan=19');
                    }
                    
                    display_outside_material_receipt_new_lines_details($receipt_trans_no, $selected_id, $Mode, $k);

        end_table(2);
    
    div_end();
}

function display_outside_material_requisition_line_from_outside_material_receipt($omrc_req_line_id) {
    global $daily_item_types_array;
    
    if (! ($omrc_req_line_id > 0)) {
        return;
    }
    
    $dec = 4;
    $row = get_outside_material_requisition_detail_line_details($omrc_req_line_id);
    
        $conversion_factor = $row['conversion_factor'];
        
        start_row('style=background-color:#abdbda');
            label_cell(text_bold($omrc_req_line_id), 'colspan=1 align=center');
            label_cell('');
            label_cell($daily_item_types_array[$row['item_type']]);
            if ($row['item_type'] == NSIT_NON_STOCK_ITEM || $row['item_type'] == NSIT_STOCK_ITEM) {
                label_cell($row["stock_id"]." - ".$row["item_description"]);  
            } else {
                label_cell($row["item_description"]);
            }
            label_cell(text_bold($row["unit_name"]));
            qty_cell($row["tran_qty"], true, $dec);
            qty_cell($row["receipt_quantity"] / $conversion_factor, false, $dec);
            qty_cell($row["receipt_alloc"] / $conversion_factor, false, $dec);
            
            $total_receipt_receipt_alloc = $row["receipt_quantity"] + $row["receipt_alloc"];
            
            $total_returned_quantity = $row["returned_quantity"];
            qty_cell($total_returned_quantity / $conversion_factor, true, $dec);
            qty_cell($row["returned_alloc"] / $conversion_factor, true, $dec);
            qty_cell(($row["tran_qty"] - ($total_receipt_receipt_alloc - $total_returned_quantity)) / $conversion_factor, false, $dec);
            
            label_cell('', 'colspan=2');     
            label_cell($row["task_description"]);     
            label_cell($row["site_description"]);          
            label_cell(nl2br($row["line_comment"]), 'colspan=4'); 
        end_row();
        
        return array('item_type' => $row['item_type'], 'stock_id' => $row['stock_id'], 'item_description' => $row['item_description']); 
}

function set_outside_material_receipt_remain_qty($id, $row, $dec=4) {
    $convesion_factor = 1;
    get_convertion_factor2($row['stock_id'], $_POST["receipt_tran_unit_$id"], $convesion_factor);
    $total_receipt_qty = $row["receipt_quantity"] + $row["receipt_alloc"] - $row["returned_quantity"];

    $remain_tran_qty = ($row["qty"] - $total_receipt_qty) / $convesion_factor;

    $_POST["receipt_tran_qty_$id"] = number_format($remain_tran_qty, $dec);
}

function display_outside_material_receipt_new_lines_details($receipt_trans_no, $selected_id, $Mode, &$k) {
    global $daily_item_types_array, $systypes_array;
    
    start_row('style=background-color:#afedab');
        label_cell(text_bold($systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT].' Records Without '.$systypes_array[ST_OUTSIDE_MATERIAL_REQ]), 'align=center colspan=19');
    end_row();
    
    $dec = 4;
    $result = get_outside_material_receipt_details_with_no_source($receipt_trans_no, ST_OUTSIDE_MATERIAL_RECEIPT);
        while ($row = db_fetch($result)) {
            $omrc_line_id = $row['trans_id'];
            
            if ($selected_id != $omrc_line_id || $Mode == 'Delete') {
                alt_table_row_color($k);
                    label_cell('No OM Req');
                    label_cell(text_bold($omrc_line_id), 'colspan=1 align=center');
                    label_cell($daily_item_types_array[$row['item_type']]);
                    if ($row['item_type'] == NSIT_NON_STOCK_ITEM || $row['item_type'] == NSIT_STOCK_ITEM) {
                        label_cell($row["stock_id"]." - ".$row["item_description"]);  
                    } else {
                        label_cell($row["item_description"]);
                    }
                    label_cell('', 'colspan=7');          
                    label_cell($row["unit_name"]);
                    qty_cell($row["tran_qty"], false, $dec);
                    label_cell($row["task_description"]);          
                    label_cell($row["site_description"]);          
                    label_cell(nl2br($row["line_comment"]), 'colspan=0'); 
                    
                    if ($omrc_line_id > 0 && $row['stock_control_method'] == SKCM_LOTS) {
                        $receipt_convesion_factor = 1;
                        get_convertion_factor2($row["stock_id"], $row["receipt_tran_unit"], $receipt_convesion_factor);

                        display_lot_serial_edit_cells($row['stock_control_method'], ST_OUTSIDE_MATERIAL_RECEIPT, $receipt_trans_no, $omrc_line_id, $receipt_convesion_factor, 
                                                      $dec);
                    } else {
                        label_cell('');
                    }
                    
                    edit_button_cell("Edit$omrc_line_id", _("Edit"));    
                    delete_button_cell("Delete$omrc_line_id", _("Delete"));  
                end_row();
            } else {
                display_outside_material_receipt_detail_edit_controls($selected_id, $Mode);
            }
        }
        
        if (! ($selected_id > 0) || $Mode == 'Delete') {
            display_outside_material_receipt_detail_edit_controls($selected_id, $Mode);
        }
}

function display_outside_material_receipt_detail_edit_controls($selected_id, &$Mode) {
    global $Ajax, $daily_item_types_array;
    $dec = 4;
    
    if ($selected_id > 0 && $Mode != 'Delete') {   
        $row = get_outside_material_receipt_detail_record($selected_id); 
            if ($Mode == 'Edit') {
                $_POST['item_type'] = $row["item_type"];
                $_POST['stock_id'] = $row["stock_id"];
                $_POST['item_description'] = $row["item_description"];
                $_POST['tran_unit'] = $row["tran_unit"];
                $_POST['tran_qty'] = $row["tran_qty"];
                $_POST['site_id'] = $row["project_site_id"];
                $_POST['task_id'] = $row["task_id"];
                $_POST['item_cost'] = $row["standard_cost"] * $row["conversion_factor"];
                $_POST['line_comment'] = $row["line_comment"];
            }
            
            if (! (strlen($_POST['stock_id']) > 0)) {
                $_POST['stock_id'] = $row["stock_id"];
            }
            if ($_POST['tran_unit'] == -1) {
                $_POST['tran_unit'] = $row["tran_unit"];
            }
            if (! ($_POST['tran_qty'] > 0)) {
                $_POST['tran_qty'] = $row["tran_qty"];
            }
            if (! ($_POST['task_id'] > 0)) {
                $_POST['task_id'] = $row["task_id"];
            }
            if (! ($_POST['item_cost'] > 0)) {
                $_POST['item_cost'] = $row["standard_cost"] * $row["conversion_factor"];
            }
            
            if (! (strlen($_POST['line_comment']) > 0)) {
                $_POST['line_comment'] = $row["line_comment"];
            }
    }
  
    echo "<td colspan=17>";
        $Ajax->activate("control_items");    
        div_start('control_items');
            start_outer_table(TABLESTYLE2);
            
                table_section(1);

                    if ($selected_id > 0 && $Mode != 'Delete') {  
                        label_row('Rec Id:', $selected_id);
                        label_row('Item Type:', $daily_item_types_array[$row['item_type']]);
                        $_POST['item_type'] = $row['item_type'];
                        hidden('item_type', $row['item_type']);
                    } else {
                        custom_values_list_row('Item Type:', 'item_type', $daily_item_types_array, null, '', true);
                    }

                        if ($_POST['item_type'] == NSIT_NON_STOCK_ITEM) {

                            if ($selected_id > 0 && $Mode != 'Delete') {  
                                label_row('Item:', $_POST['stock_id']);
                                hidden('stock_id', $_POST['stock_id']);
                                text_row_ex('Item Description:', 'item_description', 50, 250, 'Item Description');
                            } else {
                                label_row('Stock Item:', non_stock_items_list('stock_id', null, false, true));
                                $itm = get_item($_POST['stock_id']);
                                    if (is_array($itm)) {
                                        hidden('item_description', $itm['description']);
                                    } else {
                                        hidden('item_description', '');
                                    }
                            }

                            units_list_row('Unit:', 'tran_unit', $_POST['stock_id'], null, '');
                            $dec = get_qty_dec($_POST["stock_id"]);

                        } elseif ($_POST['item_type'] == NSIT_STOCK_ITEM) {

                            if ($selected_id > 0 && $Mode != 'Delete') {  
                                label_row('Stock Item:', $_POST['stock_id']);
                                hidden('stock_id', $_POST['stock_id']);
                                text_row_ex('Item Description:', 'item_description', 50, 250, 'Item Description');
                            } else {
                                label_row('Stock Item:', stock_and_manufacture_items_list('stock_id', null, false, true));
                                $itm = get_item($_POST['stock_id']);
                                    if (is_array($itm)) {
                                        hidden('item_description', $itm['description']);
                                    } else {
                                        hidden('item_description', '');
                                    }
                            }

                            units_list_row('Unit:', 'tran_unit', $_POST['stock_id'], null, '');
                            $dec = get_qty_dec($_POST["stock_id"]);

                        } elseif ($_POST['item_type'] == NSIT_COMMENT) {
                            text_row_ex('Item Description:', 'item_description', 50, 250, 'Item Description');
                            hidden('stock_id', '');

                            $units_array = build_all_item_units_array();
                            custom_values_list_row('Unit:', 'tran_unit', $units_array, null, '');
                        } else {
                            hidden('stock_id', '');
                            hidden('tran_unit', '');
                            hidden('item_description', '');
                        }

                table_section(2);
                
                    amount_row("Quantity:", 'tran_qty', null, null, null, $dec);

                    if (in_array($_POST['item_type'], array(NSIT_NON_STOCK_ITEM, NSIT_STOCK_ITEM))) {
                        all_budgets_list_row('Budget:', 'task_id', GLOBAL_VOTES, null, _(''));
                    } else {
                        $_POST['task_id'] = 0;
                        hidden('task_id', 0);
                    }

                    if ($_POST['item_type'] == NSIT_NON_STOCK_ITEM) {
                        amount_row("Item Cost:", 'item_cost', null, null, null, 0);
                    } else {
                        $_POST['item_cost'] = 0;
                        hidden('item_cost', 0);
                    }

                table_section(3);
                
                    all_project_sites_list_row("Site:", 'site_id', GLOBAL_VOTES, null, '', false); 
                    text_row_ex('Line Comment:', 'line_comment', 50, 400, 'Line Comment');

            end_outer_table();
        div_end();
    
    echo "</td>";
    
        if ($selected_id > 0 && $Mode != 'Delete') {
            button_cell('Update_OMRC_LN', _("Update"),  _('Confirm changes'), ICON_UPDATE);
            button_cell('cancel', _("Cancel"), _("Cancel changes"), ICON_CANCEL);
            hidden('selected_id', $selected_id);

        } else {        
            button_cell('Add_OMRC_LN', _("ADD"),  _('Confirm changes'), ICON_ADD);
            button_cell('cancel', _("Cancel"), _("Cancel changes"), ICON_CANCEL);
        }
}

function can_save_outside_material_receipt_header($omr_no, $omrc_no) {
    global $Refs, $systypes_array;
    
    $req_hd = get_outside_material_requisition_header_record($omr_no);
        if (is_array($req_hd)) {
            if ($req_hd['type'] != ST_OUTSIDE_MATERIAL_REQ) {
                return array("success" => false, "message" => "Invalid transaction type.");
            }
            if (! in_array($req_hd['approval_status'], array(AS_APPROVED, AS_COMPLETED))) {
                return array("success" => false, "message" => $systypes_array[ST_OUTSIDE_MATERIAL_REQ]." #$omr_no is not approved/ completed.");
            } 
        } else {
            return array("success" => false, "message" => $systypes_array[ST_OUTSIDE_MATERIAL_REQ]." #$omr_no has been deleted by another user.");
        }
        
    $trans_no = $receipt_row_state = 0;
    $req_trans_no = $req_hd['trans_no'];
    $req_row_state = $req_hd['row_state'];
    $header = get_outside_material_receipt_header_record($omrc_no);
    
    if (($omrc_no > 0) && ! is_array($header)) {
        return array("success" => false, "message" => $systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT]." #$omrc_no has been deleted by another user.");
    }
      
    if ($omrc_no > 0) {
        if (! in_array($header['approval_status'], array(AS_NEW, AS_WITH_THE_APPROVER, AS_AWAITING_APPROVAL, AS_BACK_TO_ORIGINATOR))) {
            return array("success" => false, "message" => "This document status does not allow further updating.");
        }
        
        $ced_msg = can_edit_document(ST_OUTSIDE_MATERIAL_RECEIPT, $header['project_id'], $header['next_approval_group_id'], $_SESSION['wa_current_user']->user, 
                                     $header['created_by']);
            if ($ced_msg['success'] !== true){
                return array("success" => false, "message" => $ced_msg['message']);
            }
            
        $trans_no = $header['trans_no']; $receipt_row_state = $header['row_state'];
    }
    
    // check allow to add or update by user role if any new item not add or not change any item
    $can_access_msg = can_access_outside_material_receipt($trans_no, $req_trans_no);
        if ($can_access_msg['success'] === false) {
            return $can_access_msg;
        }
    
    if (! $Refs->is_valid($_POST['reference'])) {
        return array("success" => false, "focus_to" => 'reference', "message" => "Please enter a reference.");      
    }    
 
    $ref_msg = reference_exists($_POST['reference'], ST_OUTSIDE_MATERIAL_RECEIPT, $trans_no);
        if ($ref_msg) {
            return array("success" => false, "focus_to" => 'reference', "message" => $ref_msg);       
        }
      
    if (! is_date($_POST['tran_date'])) {
        return array("success" => false, "focus_to" => 'tran_date', "message" => "Date entered is not a valid date.");        
    }
      
    if (! (strlen($_POST['from_location']) > 2)) {
        return array("success" => false, "focus_to" => 'from_location', "message" => "From location cannot empty.");
    }
      
    if ($_POST['to_loc_code'] == '') {
        return array("success" => false, "focus_to" => 'to_loc_code', "message" => "Receiving location cannot empty.");
    }
    
    return array("success" => true, 'req_row_state' => $req_row_state, 'receipt_row_state' => $receipt_row_state, "message" => "", 'req_hd' => $req_hd);    
}

function can_save_outside_material_receipt_lines($req_trans_no, $receipt_trans_no, $type, $to_loc_code, $process=false) {
    global $systypes_array;
    
    $result = get_outside_material_requisition_with_outside_material_receipt_details($req_trans_no, $receipt_trans_no);  
        if (! (db_num_rows($result) > 0)) {
            return array('success' => false, 'message' => "No source ".$systypes_array[ST_OUTSIDE_MATERIAL_REQ]." found.");
        }
        
        $check_exceeded_only = $process === false ? true : false;
        
        $no_selected_recs = 0;
        
        while ($row = db_fetch($result)) {
            $id = $row['trans_id'];
            $receipt_line_id = $row['receipt_line_id'];
            
            if (isset($_POST["checked_$id"]) && $_POST["checked_$id"] == 1) {
                $item_type = $_POST["item_type_$id"];
                $stock_id = $_POST["stock_id_$id"];
                $item_description = $_POST["item_description_$id"];
                $receipt_tran_unit = $_POST["receipt_tran_unit_$id"];
                $receipt_tran_qty = input_num("receipt_tran_qty_$id");
                $task_id = $_POST["task_id_$id"];
                
                $convesion_factor = 1;
                
                // can save outside material receipt line
                $cn_sv_ln = can_save_outside_material_receipt_line($receipt_trans_no, $stock_id, $to_loc_code, $item_type, $item_description, $receipt_tran_unit, 
                                                                   $receipt_tran_qty, $convesion_factor, $task_id, $receipt_line_id, $id, $row, $check_exceeded_only);
                    if ($cn_sv_ln['success'] !== true) {
                        return array("success" => false, "message" => $cn_sv_ln['message']);
                    }
                    
                $no_selected_recs++;
                    
            } else {
                
                if ($receipt_line_id > 0) {
                    $lot_row = get_lot_allocation_records($type, $receipt_trans_no, $receipt_line_id, fetch:true);
                        if (is_array($lot_row) > 0) {
                            return array("success" => false, "focus_to" => '', "message" => "Please delete all ".$systypes_array[ST_LOT_ALLOCATION]." details in ".
                                                                                             $systypes_array[$type]." Line #$receipt_line_id.");
                        }
                }
            }
        }
        
        $recs_without_om_req = get_outside_material_receipt_details_lines_count($receipt_trans_no, ST_OUTSIDE_MATERIAL_RECEIPT, false);
        
            if (! ($no_selected_recs > 0) && ! ($recs_without_om_req > 0)) {
                return array("success" => false, "message" => "Please select at least one record before saving.");  
            }

        if ($process === true) {
            $result = get_outside_material_receipt_detail_records_with_no_source(ST_OUTSIDE_MATERIAL_RECEIPT, $receipt_trans_no);      
                while ($row = db_fetch($result)) {
                    if (in_array($row['item_type'], array(NSIT_NON_STOCK_ITEM, NSIT_STOCK_ITEM))) {
                        if (! ($row['task_id'] > 0)) {
                            $line_id = $row['trans_id'];
                            return array("success" => false, "message" => "Receipt line #$line_id please select a budget.");  
                        }
                    }
                }
        }
        
        return array("success" => true, "message" => "");
}

function can_save_outside_material_receipt_line($trans_no, $stock_id, $to_loc_code, $item_type, $item_description, $receipt_tran_unit, $receipt_tran_qty, $convesion_factor, 
                                                $task_id, $receipt_line_id, $id, $row, $check_exceeded_only=true) {
    $type = ST_OUTSIDE_MATERIAL_RECEIPT;
    
    if (! ($item_type > 0)) {
        return array("success" => false, "focus_to" => "item_type_$id", "message" => "Req. Line #$id Please select an item type.");  
    }
    
    if (in_array($item_type, array(NSIT_NON_STOCK_ITEM, NSIT_STOCK_ITEM))) {
        if (! (strlen($stock_id) > 0)) {
            return array("success" => false, "focus_to" => "stock_id_$id", "message" => "Req. Line #$id Please select an item.");  
        }

        if ($receipt_tran_unit == -1) {
            return array("success" => false, "focus_to" => "receipt_tran_unit_$id", "message" => "Req. Line #$id Please select a tran unit.");  
        }
    } elseif ($item_type == NSIT_COMMENT) {
        if (! (strlen($item_description) > 0)) {
            return array("success" => false, "focus_to" => "item_description_$id", "message" => "Req. Line #$id Item description cannot be empty.");  
        }
        
        if ($receipt_tran_unit == '0') {
            return array("success" => false, "focus_to" => "receipt_tran_unit_$id", "message" => "Req. Line #$id Please select a tran unit.");  
        }
    }
    
        if (! ($receipt_tran_qty > 0)) {
            return array("success" => false, "focus_to" => "receipt_tran_qty_$id", "message" => "Req. Line #$id Qty should be greater than zero.");  
        }

        get_convertion_factor2($stock_id, $receipt_tran_unit, $convesion_factor);
        
        // check whether total receipt requested qty is exceeded
        $returned_qty = $row['returned_quantity'];
        $rem_trn_qty_ary = get_outside_material_requisition_line_remain_qty_array($row['qty'], $id, $receipt_tran_qty, $convesion_factor, $receipt_line_id, 4, $returned_qty);
        $old_rem_trn_qty = $rem_trn_qty_ary['old_rem_trn_qty'];
        $new_rem_trn_qty_ = $rem_trn_qty_ary['new_rem_trn_qty'];
            if ($new_rem_trn_qty_ < 0) {
                $new_rem_trn_qty = abs($new_rem_trn_qty_);
                return array('success' => false, "focus_to" => "receipt_tran_qty_$id", 
                             'message' => "Req. Line #$id remain tran qty $old_rem_trn_qty is exceeded by $new_rem_trn_qty in tran unit.");
            }

        // check lot allocation exceeded
        if ($row['stock_control_method'] == SKCM_LOTS && $receipt_line_id > 0) {
            $data_arr = array('type' => $type, 'trans_no' => $trans_no, 'line_id' => $receipt_line_id, 'stock_id' => $stock_id, 'loc_code' => $to_loc_code, 
                              'conversion_factor' => $convesion_factor, 'tran_qty' => $receipt_tran_qty, 'tran_unit' => $receipt_tran_unit);
            $lot_ex_msg = check_total_lot_allocations_item_qty_exceed_allowable_qty($data_arr, $check_exceeded_only);
                if ($lot_ex_msg['success'] === false) {
                    if ($lot_ex_msg['exceeded'] === true) {
                        return array("success" => false, "message" => "Receipt line #$receipt_line_id Receipt Qty cannot smaller than total lot allcations."); 
                    } else {
                        return array("success" => false, "message" => "Receipt line #$receipt_line_id Receipt Qty cannot greater than total lot allcations."); 
                    }
                }
        }
        
        if ($item_type == NSIT_NON_STOCK_ITEM || $item_type == NSIT_STOCK_ITEM) {
            if (! ($task_id > 0)) {
                return array("success" => false, "focus_to" => "task_id_$id", "message" => "Req. Line #$id Please select a budget.");  
            }
        }
                
        return array("success" => true, "focus_to" => "", "message" => ""); 
}

function can_access_outside_material_receipt($receipt_trans_no=0, $req_trans_no=0) {
    global $systypes_array;
    
    $tran_tp_name = $systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT];
    $current_user_id = $_SESSION['wa_current_user']->user;
    
    $can_access = false;
    $correct_role = 'WMS Store Keeper';
    
    $user_recs = get_users(id: $current_user_id);
        $user_row = db_fetch($user_recs);
        $role = $user_row['role'];
        
        if ($role == $correct_role) {
            $can_access = true;
        }
    
        // when creating new outside material receipt record
        if ($receipt_trans_no == 0 && $can_access === false) {
            return array("success" => false, "message" => "Your role is not allowed to create new ".$tran_tp_name." only $correct_role allow to create new one.");
        } elseif ($receipt_trans_no > 0) {

            // when unapproved outside material receipt record updating
            $header = get_outside_material_receipt_header_record_type_trans_no(ST_OUTSIDE_MATERIAL_RECEIPT, $receipt_trans_no);
                if ($header['approval_status'] != AS_AWAITING_APPROVAL && $can_access === false) {
                    return array("success" => false, "message" => "Your role is not allowed to update ".$tran_tp_name." only $correct_role allow to update.");
                }
        }
        
        return array("success" => true, "message" => "");
}

function save_outside_material_receipt_lines($req_trans_no, $receipt_trans_no, $project_id, $from_location, $to_loc_code, $tran_date, $process=false, $approval_status=0) {
    global $systypes_array;
    $type = ST_OUTSIDE_MATERIAL_RECEIPT;
    
    $result = get_outside_material_requisition_with_outside_material_receipt_details($req_trans_no, $receipt_trans_no);  
    
    $receipt_lines_count = get_outside_material_receipt_details_lines_count($receipt_trans_no, $type, true);
        if ($receipt_lines_count > 0) {
            $del_af_rows = delete_outside_material_receipt_detail_lines($type, $receipt_trans_no, true);
                if ($del_af_rows != $receipt_lines_count) {
                    cancel_transaction();
                    return array('success' => false, 'message' => "Could not delete ".$systypes_array[$type]." detail lines.");
                }
        }
        
        while ($row = db_fetch($result)) {
            $id = $row['trans_id'];
            $receipt_line_id = $row['receipt_line_id'];
            
            if (isset($_POST["checked_$id"]) && $_POST["checked_$id"] == 1) {
                
                $item_type = $_POST["item_type_$id"];
                $stock_id = $_POST["stock_id_$id"];
                $item_description = $_POST["item_description_$id"];
                $receipt_tran_unit = $_POST["receipt_tran_unit_$id"];
                $receipt_tran_qty = input_num("receipt_tran_qty_$id");
                $task_id = $_POST["task_id_$id"];
                $site_id = $_POST["site_id_$id"];
                $line_comment = $_POST["line_comment_$id"];
                
                $convesion_factor = 1;
                
                // save outside material receipt line
                $sv_ln_msg = save_outside_material_receipt_line($type, $receipt_trans_no, $receipt_line_id, $from_location, $to_loc_code, $tran_date, $item_type, $stock_id, 
                                                                $item_description, $receipt_tran_unit, $receipt_tran_qty, $convesion_factor, $task_id, $site_id, $line_comment, 
                                                                $row);
                    if ($sv_ln_msg['success'] !== true) {
                        cancel_transaction();
                        return array("success" => false, "message" => $sv_ln_msg['message']);
                    }
                    
                // process outside material receipt line 
                if ($process === true && $approval_status == AS_APPROVED) {
                    $stock_control_method = $row['stock_control_method'];
                    
                    $prs_msg = process_outside_material_receipt_line($type, $receipt_trans_no, $tran_date, $project_id, $receipt_line_id, $stock_control_method);
                        if ($prs_msg['success'] !== true) {
                            cancel_transaction();
                            return array("success" => false, "message" => $prs_msg['message']);
                        }
                } 
            } 
        }
        
        return array("success" => true, "message" => "");  
}

function save_outside_material_receipt_header(&$omr_no, &$omrc_no, &$receipt_trans_no, $type, $project_id, $from_location, $to_loc_code, $tran_date, $receipt_row_state, 
                                              $jo_id) {
    global $systypes_array;
    
    $af_no = write_outside_material_receipt_header($type, $omr_no, $omrc_no, $receipt_trans_no, $_POST['reference'], $project_id, $from_location, $to_loc_code, 
                                                   $_POST['comments'], $tran_date, $receipt_row_state, $jo_id, 0); 
    
        if ($af_no > 0) {
            return array("success" => true, "message" => $systypes_array[$type]." header record #$omrc_no has been saved.");
        } else {
            return array("success" => false, "message" => "Could not be saved ".$systypes_array[$type].' header.');
        }
}

function save_outside_material_receipt_line($type, $receipt_trans_no, &$receipt_line_id, $from_location, $to_loc_code, $tran_date, $item_type, $stock_id, $item_description, 
                                            $tran_unit, $tran_qty, $conversion_factor, $task_id, $site_id, $line_comment, $row) {    
    global $systypes_array;
    
        $id = $row['trans_id'];
        $standard_cost = $row['standard_cost'];
                
            if ($item_type == NSIT_STOCK_ITEM) {
                $standard_cost = get_standard_cost($stock_id);
            } 
            
            get_convertion_factor2($stock_id, $tran_unit, $conversion_factor);

            $base_qty = $tran_qty * $conversion_factor;

            $ln_id = insert_outside_material_receipt_line($receipt_trans_no, $type, $from_location, $to_loc_code, $tran_date, $stock_id, $item_type, $item_description, 
                                                          $tran_unit, $tran_qty, $base_qty, $conversion_factor, $standard_cost, $site_id, $line_comment, $task_id, $id, 
                                                          $receipt_line_id);

                if (! ($ln_id > 0)) {
                    return array("success" => false, "message" => "Could not save Req. Line #$id ".$systypes_array[$type]." line details.");
                } 
        
                $receipt_line_id = $ln_id;
                
        return array("success" => true, "message" => $systypes_array[$type]." details have been saved.");
}

function save_outside_material_receipts(&$omr_no, &$omrc_no, $process=false) {
    global $systypes_array;
    
    $req_type = ST_OUTSIDE_MATERIAL_REQ; $type = ST_OUTSIDE_MATERIAL_RECEIPT;
    
    $cn_sv_hd = can_save_outside_material_receipt_header($omr_no, $omrc_no);   
        if ($cn_sv_hd["success"] !== true) {          
            return $cn_sv_hd;
        }
        
        $req_row_state = $cn_sv_hd['req_row_state']; $receipt_row_state = $cn_sv_hd['receipt_row_state'];
        
    $req_header = get_outside_material_requisition_header_record($omr_no);
        $req_trans_no = $req_header['trans_no']; $project_id = $req_header['project_id']; $jo_id = $req_header['jo_id']; $omrc_req_ap = $req_header['approval_status'];
        
    $receipt_trans_no = $approval_status = 0; 
    $receipt_hd_row = get_outside_material_receipt_header_record($omrc_no);
        if (is_array($receipt_hd_row)) {
            $receipt_trans_no = $receipt_hd_row['trans_no']; 
        }
        
    $cn_sv_line = can_save_outside_material_receipt_lines($req_trans_no, $receipt_trans_no, $type, $_POST['to_loc_code'], $process);   
        if ($cn_sv_line["success"] !== true) {          
            return $cn_sv_line;
        }
        
    $tran_date = date2sql($_POST['tran_date']);
       
        begin_transaction();

            $hd_msg = save_outside_material_receipt_header($omr_no, $omrc_no, $receipt_trans_no, $type, $project_id, $_POST['from_location'], $_POST['to_loc_code'], 
                                                           $tran_date, $receipt_row_state, $jo_id);
                if ($hd_msg["success"] !== true) {
                    cancel_transaction();
                    return array("success" => false, "message" => $hd_msg['message']);
                }
                
            if ($process === true) {
                $ap_msg = approve_outside_material_receipt($omrc_no, $receipt_trans_no, $req_trans_no);     
                    if ($ap_msg['success'] === false ) {
                        cancel_transaction();
                        return $ap_msg;
                    }
                    
                    $approval_status = $ap_msg['approval_status']; // this approval status is used by below functions.
            }
                
            $sv_ln_msg = save_outside_material_receipt_lines($req_trans_no, $receipt_trans_no, $project_id, $_POST['from_location'], $_POST['to_loc_code'], $tran_date, 
                                                             $process, $approval_status);
                if ($sv_ln_msg['success'] !== true) {
                    cancel_transaction();
                    return $sv_ln_msg;       
                }
                
            if ($process === true && $approval_status == AS_APPROVED) {
                // process newly added outside maiterial receipt lines with no outside material req line no 
                $result = get_outside_material_receipt_details_with_no_source($receipt_trans_no, $type);
                    while ($row = db_fetch($result)) {
                        $receipt_line_id = $row['trans_id'];
                        $stock_control_method = $row['stock_control_method'];
                    
                        $prs_msg = process_outside_material_receipt_line($type, $receipt_trans_no, $tran_date, $project_id, $receipt_line_id, $stock_control_method);
                            if ($prs_msg['success'] !== true) {
                                cancel_transaction();
                                return array("success" => false, "message" => $prs_msg['message']);
                            }
                    }
            }
            
            // save outside material req receipt alloc, receipt qty => this shold be called after lines saving becouse it checks with approval status
            $sv_is_rt_qty = save_outside_material_requisition_lines_receipt_alloc_receipt_qty_total($req_type, $req_trans_no);
                if ($sv_is_rt_qty['success'] !== true) {
                    cancel_transaction();
                    return $sv_is_rt_qty;
                }

            // receipt qty + receipt alloc qty - returned qty
            $fully_receipt = check_all_outside_material_requisition_lines_fully_processed($req_type, $req_trans_no);
                if ($fully_receipt === true && $omrc_req_ap === AS_APPROVED) {
                    $ds_msg = direct_update_document_status($req_type, $req_trans_no, AS_COMPLETED, $req_row_state);     
                        if ($ds_msg['success'] === false ) {
                            cancel_transaction();
                            return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." approval status.");
                        }

                        $req_row_state = db_new_row_state($req_row_state);
                } elseif ($fully_receipt === false && $omrc_req_ap === AS_COMPLETED) {
                    $ds_msg = direct_update_document_status($req_type, $req_trans_no, AS_APPROVED, $req_row_state);     
                        if ($ds_msg['success'] === false ) {
                            cancel_transaction();
                            return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." approval status.");
                        }

                        $req_row_state = db_new_row_state($req_row_state);
                }
                
            $req_af = update_outside_material_requisition_row_state($omr_no, $req_row_state);
                if (! ($req_af > 0)) {
                    cancel_transaction();
                    return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." record #$omr_no row state.");
                }
                
        commit_transaction();
            
            if ($process === true) {
                set_session_variable('omrc_messages', $ap_msg['message']);
                meta_forward($_SERVER['PHP_SELF'], "type=$type&ProcessedID=$receipt_trans_no"); 
            } else {
                return array("success" => true, "message" => $systypes_array[$type]." trans #$receipt_trans_no has been saved.");
            }
}

function can_save_new_outside_material_receipt_line() {
    if (! ($_POST['item_type'] > 0)) {
        return array("success" => false, "focus_to" => "item_type", "message" => "Please select an item type.");  
    }
    
    if (in_array($_POST['item_type'], array(NSIT_NON_STOCK_ITEM, NSIT_STOCK_ITEM))) {
        if (! (strlen($_POST['stock_id']) > 0)) {
            return array("success" => false, "focus_to" => "stock_id", "message" => "Please select an item.");  
        }

        if ($_POST['tran_unit'] == -1) {
            return array("success" => false, "focus_to" => "tran_unit", "message" => "Please select a tran unit.");  
        }
    } elseif ($_POST['item_type'] == NSIT_COMMENT) {
        if (! (strlen($_POST['item_description']) > 0)) {
            return array("success" => false, "focus_to" => "item_description", "message" => "Item description cannot be empty.");  
        }
        
        if ($_POST['tran_unit'] == '0') {
            return array("success" => false, "focus_to" => "tran_unit", "message" => "Please select a tran unit.");  
        }
    }
    
    $item = get_stock_item_edit_info($_POST['stock_id']);
        if ($_POST['item_type'] == NSIT_NON_STOCK_ITEM){
            if (! ($item['mb_flag'] == "D")) {
                return array("success" => false, "focus_to" => "stock_id", 
                             "message" => "Selected item is a stock item, Please select a non-stock item.");  
            } 
        } elseif ($_POST['item_type'] == NSIT_STOCK_ITEM){
            if (! in_array($item['mb_flag'], array("B", "M"))) {
                return array("success" => false, "focus_to" => "stock_id", 
                             "message" => "Selected item is not a stock item, Please select a stock item.");  
            } 
        }
    
    if (! ($_POST['tran_qty'] > 0)) {
        return array("success" => false, "focus_to" => "tran_qty", "message" => "Quantity should be greater than zero.");  
    }
    
    if ($_POST['item_type'] == NSIT_NON_STOCK_ITEM) {
        if (! ($_POST['item_cost'] > 0)) {
            return array("success" => false, "focus_to" => "item_cost", "message" => "Item cost should be greater than zero.");  
        }
    }

        return array("success" => true, "focus_to" => '', "message" => "");  
}

function handle_save_outside_material_receipt_line(&$omr_no, &$omrc_no, $selected_id) {
    global $systypes_array;
    
    $req_type = ST_OUTSIDE_MATERIAL_REQ; $type = ST_OUTSIDE_MATERIAL_RECEIPT;
    
    $cn_sv_hd = can_save_outside_material_receipt_header($omr_no, $omrc_no);   
        if ($cn_sv_hd["success"] !== true) {          
            return $cn_sv_hd;
        }
        
        $req_row_state = $cn_sv_hd['req_row_state']; 
        $new_receipt_row_state = $receipt_row_state = $cn_sv_hd['receipt_row_state'];
        $req_hd = $cn_sv_hd['req_hd']; 
        
        $jo_id = $req_hd['jo_id']; 
        $req_trans_no = $req_hd['trans_no']; 
        $project_id = $req_hd['project_id'];
        
   $cn_sv_ln = can_save_new_outside_material_receipt_line(); 
        if ($cn_sv_ln["success"] !== true) {          
            return $cn_sv_ln;
        }    
        
    $receipt_trans_no = $conversion_factor = $standard_cost = 0; 
    $receipt_hd_row = get_outside_material_receipt_header_record($omrc_no);
        if (is_array($receipt_hd_row)) {
            $receipt_trans_no = $receipt_hd_row['trans_no']; 
        }
        
        $tran_date = date2sql($_POST['tran_date']);
       
        begin_transaction();
        
            if ($selected_id > 0) {
                $dl_row = delete_outside_material_receipt_detail_line_by_id($selected_id);
                    if ($dl_row != 1) {
                        cancel_transaction();
                        return array("success" => false, "message" => "Receipt line #$selected_id could not delete.");
                    }
            }
            
            if ($omrc_no > 0) {
                $new_receipt_row_state = db_new_row_state($receipt_row_state);
            } 

            $hd_msg = save_outside_material_receipt_header($omr_no, $omrc_no, $receipt_trans_no, $type, $project_id, $_POST['from_location'], $_POST['to_loc_code'], 
                                                           $tran_date, $receipt_row_state, $jo_id);
                if ($hd_msg["success"] !== true) {
                    cancel_transaction();
                    return array("success" => false, "message" => $hd_msg['message']);
                }
                
            // save outside material receipt new line
            if ($_POST["item_type"] == NSIT_STOCK_ITEM) {
                $standard_cost = get_standard_cost($_POST["stock_id"]);
            } elseif ($_POST['item_type'] == NSIT_NON_STOCK_ITEM) {
                get_convertion_factor2($_POST['stock_id'], $_POST["tran_unit"], $conversion_factor);
                $standard_cost = input_num('item_cost') / $conversion_factor;
            }
            
            get_convertion_factor2($_POST["stock_id"], $_POST["tran_unit"], $conversion_factor);

            $base_qty = input_num("tran_qty") * $conversion_factor;
            
            $nid = insert_outside_material_receipt_line($receipt_trans_no, $type, $_POST['from_location'], $_POST['to_loc_code'], $tran_date, $_POST["stock_id"], 
                                                        $_POST["item_type"], $_POST["item_description"], $_POST["tran_unit"], input_num("tran_qty"), $base_qty, 
                                                        $conversion_factor, $standard_cost, $_POST['site_id'], $_POST['line_comment'], $_POST['task_id'], 0, $selected_id);

                if (! ($nid > 0)) {
                    cancel_transaction();
                    return array("success" => false, "message" => "Could not save ".$systypes_array[$type]." line details.");
                } 
                    
            $qc_af = update_outside_material_receipt_row_state($type, $receipt_trans_no, $new_receipt_row_state);
                if (! ($qc_af > 0)) {
                    cancel_transaction();
                    return array("success" => false, "message" => "Could not update ".$systypes_array[$type]." trans #$receipt_trans_no row state.");
                }
                    
            $req_af = update_outside_material_requisition_row_state($omr_no, $req_row_state);
                if (! ($req_af > 0)) {
                    cancel_transaction();
                    return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." trnas #$req_trans_no row state.");
                }
                    
        commit_transaction();
            
        return array("success" => true, "message" => $systypes_array[$type]." #$receipt_trans_no has been saved.");
}

function can_delete_outside_material_receipt_line($omrc_no, $selected_id) {
    global $systypes_array;
    $omrcp_name = $systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT];
    
    $header = get_outside_material_receipt_header_record($omrc_no);
        if (is_array($header)) {
            if (! in_array($header['approval_status'], array(AS_NEW, AS_WITH_THE_APPROVER, AS_AWAITING_APPROVAL, AS_BACK_TO_ORIGINATOR))) {
                return array("success" => false, "message" => "This document status does not allow further updating.");
            }
            
            $ced_msg = can_edit_document(ST_OUTSIDE_MATERIAL_RECEIPT, $header['project_id'], $header['next_approval_group_id'], $_SESSION['wa_current_user']->user, 
                                         $header['created_by']);
                if ($ced_msg['success'] !== true) {
                    return array("success" => false, "message" => $ced_msg['message']);
                }
        } else {
            return array("success" => false, "message" => "Could not find $omrcp_name header #$omrc_no.");
        }
    
    $dpr_line = get_outside_material_receipt_detail_record($selected_id);
        if (! is_array($dpr_line)) {
            return array("success" => false, "message" => "Receipt line #$selected_id is already deleted by another user.");
        } 
        
        $req_hd = get_outside_material_requisition_header_record($header['omr_no']);
        
    // check allow to add or update by user role. if any new item not add or not change any item
    $can_access_msg = can_access_outside_material_receipt($header['trans_no'], $req_hd['trans_no']);
        if ($can_access_msg['success'] === false) {
            return $can_access_msg;
        }
    
    $lines_count = get_outside_material_receipt_details_lines_count($header['trans_no'], $header['type'], null, $selected_id);
        if (! ($lines_count > 0)) {
            return array("success" => false, "message" => "This is the last line. Can not delete receipt line #$selected_id.");
        }  
    
    return array("success" => true, "message" => "");       
}

function handle_delete_outside_material_receipt_line($omrc_no, $selected_id) {
    global $systypes_array;
    
    $cd_msg = can_delete_outside_material_receipt_line($omrc_no, $selected_id);
        if ($cd_msg['success'] !== true) {
            return $cd_msg;
        }
        
        begin_transaction();
        
            $af_row = delete_outside_material_receipt_detail_line_by_id($selected_id);
                if ($af_row != 1) {
                    cancel_transaction();
                    return array("success" => false, "message" => $systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT]." line #$selected_id could not delete.");
                }
                
        commit_transaction();

    return array("success" => true, "message" => $systypes_array[ST_OUTSIDE_MATERIAL_RECEIPT]." line #$selected_id has been deleted.");
}

function approve_outside_material_receipt($omrc_no, $receipt_trans_no, $req_trans_no) {
    global $systypes_array;
    
    $current_user_id = $_SESSION['wa_current_user']->user;
    $task_costs = 0;
    
    $header = get_outside_material_receipt_header_record($omrc_no);
    
    $changed_item = check_outside_material_receipt_item_edit_or_new_items_added($receipt_trans_no, $req_trans_no);
        if ($changed_item === true) {
            return approve_document($header['type'], $header['trans_no'], $header['project_id'], $task_costs, $header['next_approval_group_id'], $current_user_id, 
                                    $header['row_state'], $header['created_by']);
        } else {
            $ap_msg = direct_update_document_status($header['type'], $header['trans_no'], AS_APPROVED, $header['row_state']);     
                if ($ap_msg['success'] === false ) {
                    cancel_transaction();
                    return array("success" => false, "message" => "Could not approve ".$systypes_array[$header['type']].".");
                }
        }
        
        return array("success" => true, "message" => $systypes_array[$header['type']]." #$receipt_trans_no has been approved.", 'approval_status' => AS_APPROVED);
}

function check_outside_material_receipt_item_edit_or_new_items_added($receipt_trans_no, $req_trans_no) {
    // check new lines are added to this outside material receipt.
    $new_recs = get_outside_material_receipt_details_lines_count($receipt_trans_no, ST_OUTSIDE_MATERIAL_RECEIPT, false);
        if ($new_recs > 0) {
            return true;
        }
        
    // check old outside material receipt lines' items are edited.        
    $old_result = get_not_outside_material_requisition_lines_from_outside_material_receipt($req_trans_no, $receipt_trans_no);  
        if (db_num_rows($old_result) > 0) {
            return true;
        }
        
        return false;
}

function can_reject_back_to_originator_outside_material_receipt($omr_no, $omrc_no, $trans_tp_name, $reject) {
    global $systypes_array;
    
    $req_hd = get_outside_material_requisition_header_record($omr_no);
        if (is_array($req_hd)) {
            if ($req_hd['type'] != ST_OUTSIDE_MATERIAL_REQ) {
                return array("success" => false, "message" => "Invalid transaction type.");
            }
        } else {
            return array("success" => false, "message" => $systypes_array[ST_OUTSIDE_MATERIAL_REQ]." #$omr_no has been deleted by another user.");
        }
    
    $hd_row = get_outside_material_receipt_header_record($omrc_no);
    
        if (! is_array($hd_row)) {
            return array("success" => false, "message" => "Could not find $trans_tp_name #$omrc_no.");
        }

        if (! isset($hd_row['type']) || $hd_row['type'] != ST_OUTSIDE_MATERIAL_RECEIPT) {
            return array("success" => false, "message" => "Invalid transaction type.");
        }
        
        if ($reject === true) {
            if (! in_array($hd_row['approval_status'], array(AS_NEW, AS_AWAITING_APPROVAL, AS_BACK_TO_ORIGINATOR, AS_WITH_THE_APPROVER))) {
                return array("success" => false, "message" => "This document status does not allow to reject. Only unapproved records can be rejected.");
            }
        } else {
            if (! in_array($hd_row['approval_status'], array(AS_AWAITING_APPROVAL, AS_WITH_THE_APPROVER))) {
                return array("success" => false, "message" => "This document status does not allow to back to originator.");
            }
        }
        
        $ced_msg = can_edit_document(ST_OUTSIDE_MATERIAL_RECEIPT, $hd_row['project_id'], $hd_row['next_approval_group_id'], $_SESSION['wa_current_user']->user, 
                                     $hd_row['created_by']);
            if ($ced_msg['success'] !== true){
                return array("success" => false, "message" => $ced_msg['message']);
            }
        
        return array("success" => true, "message" => "", "req_hd_row" => $req_hd, "hd_row" => $hd_row);
}

function reject_outside_material_receipt($omr_no, $omrc_no) {
    global $systypes_array;
    
    $req_type = ST_OUTSIDE_MATERIAL_REQ;
    $type = ST_OUTSIDE_MATERIAL_RECEIPT;
    $trans_tp_name = $systypes_array[$type];
    
    $cn_rej = can_reject_back_to_originator_outside_material_receipt($omr_no, $omrc_no, $trans_tp_name, true);
        if ($cn_rej["success"] !== true) { 
            return $cn_rej;
        } 
        
        $req_hd_row = $cn_rej["req_hd_row"];
            $req_row_state = $req_hd_row['row_state'];
            $req_trans_no = $req_hd_row["trans_no"];
            $om_req_ap = $req_hd_row["approval_status"];
        
        $hd_row = $cn_rej["hd_row"];
            $trans_no = $hd_row["trans_no"];
        
        begin_transaction();
        
            $rj_msg = reject_document($type, $trans_no, $hd_row['project_id'], $hd_row['next_approval_group_id'], $_SESSION['wa_current_user']->user, $hd_row['row_state']);
                if ($rj_msg['success'] !== true) {
                    cancel_transaction();
                    return array("success" => false, "message" => $rj_msg['message']);
                }
                
            // save outside material req receipt alloc, receipt qty => this shold be called after lines saving becouse it checks with approval status
            $sv_is_rt_qty = save_outside_material_requisition_lines_receipt_alloc_receipt_qty_total($req_type, $req_trans_no);
                if ($sv_is_rt_qty['success'] !== true) {
                    cancel_transaction();
                    return $sv_is_rt_qty;
                }

            // receipt qty + receipt alloc qty - returned qty
            $fully_receipt = check_all_outside_material_requisition_lines_fully_processed($req_type, $req_trans_no);
                if ($fully_receipt === true && $om_req_ap === AS_APPROVED) {
                    $ds_msg = direct_update_document_status($req_type, $req_trans_no, AS_COMPLETED, $req_row_state);     
                        if ($ds_msg['success'] === false ) {
                            cancel_transaction();
                            return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." approval status.");
                        }

                        $req_row_state = db_new_row_state($req_row_state);
                } elseif ($fully_receipt === false && $om_req_ap === AS_COMPLETED) {
                    $ds_msg = direct_update_document_status($req_type, $req_trans_no, AS_APPROVED, $req_row_state);     
                        if ($ds_msg['success'] === false ) {
                            cancel_transaction();
                            return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." approval status.");
                        }

                        $req_row_state = db_new_row_state($req_row_state);
                }
                
            $req_af = update_outside_material_requisition_row_state($omr_no, $req_row_state);
                if (! ($req_af > 0)) {
                    cancel_transaction();
                    return array("success" => false, "message" => "Could not update ".$systypes_array[$req_type]." record #$omr_no row state.");
                }
            
        commit_transaction();

            set_session_variable('omrc_rj_messages', $rj_msg['message']);
            meta_forward($_SERVER['PHP_SELF'], "type=$type&RejectedID=$trans_no"); 
}

function back_to_originator_outside_material_receipt($omr_no, $omrc_no) {
    global $systypes_array;
    
    $type = ST_OUTSIDE_MATERIAL_RECEIPT;
    $trans_tp_name = $systypes_array[$type];
    
    $cn_rej = can_reject_back_to_originator_outside_material_receipt($omr_no, $omrc_no, $trans_tp_name, false);
        if ($cn_rej["success"] !== true) { 
            return $cn_rej;
        } 
        
        $hd_row = $cn_rej["hd_row"];
        $trans_no = $hd_row["trans_no"];
        
        begin_transaction();
        
            $ap_msg = send_back_to_document_originator($type, $trans_no, $hd_row['project_id'], $hd_row['next_approval_group_id'], $_SESSION['wa_current_user']->user, 
                                                       $hd_row['row_state'], $hd_row['created_by']);
                if ($ap_msg['success'] === false ) {
                    cancel_transaction();
                    return array("success" => false, "message" => $ap_msg['message']);
                }
            
        commit_transaction();

            set_session_variable('omrc_bo_messages', $ap_msg['message']);
            meta_forward($_SERVER['PHP_SELF'], "type=$type&BackedOrgID=$trans_no"); 
}

function clear_outside_material_receipt_details() {
    unset($_POST['item_type']);
    unset($_POST['stock_id']);
    unset($_POST['item_description']);
    unset($_POST['tran_unit']);
    unset($_POST['tran_qty']);
    unset($_POST['site_id']);
    unset($_POST['line_comment']);
}

function process_outside_material_receipt_line($type, $trans_no, $tran_date, $project_id, $receipt_line_id, $stock_control_method) {
    $row = get_outside_material_receipt_details_line_by_type_trans_no_line_no($type, $trans_no, $receipt_line_id);
            
        // stock move
        $stk_mv_msg = process_outside_material_receipt_item($trans_no, $type, $tran_date, $project_id, $row);
            if ($stk_mv_msg['success'] === false) {
                cancel_transaction();
                return $stk_mv_msg;
            }
            
        // lot move
        if ($stock_control_method == SKCM_LOTS) {
            $lot_mv_msg = lot_allocations_to_lot_moves($type, $trans_no, $receipt_line_id);
                if ($lot_mv_msg['success'] === false) {
                    cancel_transaction();
                    return $lot_mv_msg;
                }
                
            $lot_loc_array = $lot_mv_msg['lot_loc_array'];
            
            // update lot balances
            $lot_bl_msg = save_lot_balances_from_array($lot_loc_array);
                if ($lot_bl_msg['success'] === false) {
                    cancel_transaction();
                    return $lot_bl_msg;
                }
        }
        
        // budget update 
        if ($row['item_type'] != NSIT_COMMENT) {
            $omrc_details_array = $b = array();
            
            $qty = $row['qty'];
            $b['row_id'] = $row['trans_id'];
            $b['stock_id'] = $row['stock_id'];
            $b['task_id'] = $row['task_id'];
            $b['requested_qty'] = $row['qty'];
            $b['high_value_item'] = 0;

            $standard_cost = $row['standard_cost'];
            $b['reference_cost'] = $standard_cost; 
            $b['standard_cost'] = $standard_cost;
            $b['charging_cost'] = $standard_cost;
            $b['total_issued_qty'] = $qty;
            $b['qty'] = $qty;

            $omrc_details_array[] = $b;
            
            $omrc_tasks_summary = calculate_task_remaining_totals($omrc_details_array);
            $created_by = $_SESSION['wa_current_user']->user;

            $mtrec_msg = charge_cost_to_tasks($type, $trans_no, $omrc_tasks_summary, $created_by);
                if ($mtrec_msg['success'] !== true) {
                    cancel_transaction();
                    return array("success" => $mtrec_msg['success'], "tran_no" => $trans_no, "message" => $mtrec_msg['message']);
                }
        }

        return array("success" => true, "message" => "");
}

function process_outside_material_receipt_item($trans_no, $type, $tran_date, $project_id, $row) {
    $tran_date_ = sql2date($tran_date);
    $qty = abs($row["qty"]);
    $tran_qty = abs($row["tran_qty"]);
    
    $standard_cost = $row["standard_cost"];
    
        if ($row['mb_flag'] == 'B' || $row['mb_flag'] == 'M') {
            $n = add_stock_adjustment_item($trans_no, $row["stock_id"], $row["to_loc_code"], $tran_date_, $row["reference"], $qty, $standard_cost, '', $row["tran_unit"], 
                                           $tran_qty, $row["conversion_factor"], $type, $row["task_id"], $row["project_site_id"], $row["trans_id"], $project_id);
        } else {
            $n = add_non_stock_move($type, $row["stock_id"], $trans_no, $row["to_loc_code"], $tran_date_, $row["reference"], $qty, $standard_cost, '', $row["visible"], 
                                    $row["price"], $row["discount_percent"], $row["tran_unit"], $tran_qty, $row["conversion_factor"], $row["task_id"], $row["project_site_id"], 
                                    $row["trans_id"], $row["item_description"], $project_id);
        }

        if (! ($n > 0)) {
            return array("success" => false, "message" => "Could not create the movement record for rec id : ".$row["trans_id"]);
        }

        return array("success" => true, 'trans_no' => $trans_no, "message" => "");            
}

function view_outside_material_receipt_header($type, $trans_no) {
    global $approval_statuses;
    
    $row = get_outside_material_receipt_header_type_trans_no($type, $trans_no);
    
    $user_id = $_SESSION['wa_current_user']->user;
    $cap = can_access_project($row['project_id'], $user_id);
        if ($cap['success'] !== true) {
            display_error($cap["message"]);
            display_footer_exit();
            exit;
        }
    
        start_outer_table(TABLESTYLE2, "width=70%");

            table_section(1, "50%");
                $jo_id = $row['jo_id'];
                $re_hd = get_outside_material_requisition_header_record($row['omr_no']);
                label_row("Req. Trans #:", get_inventory_trans_view_str(ST_OUTSIDE_MATERIAL_REQ, $re_hd['trans_no']), "class='tableheader2'");  
                label_row("Job Card #:", get_service_trans_view_str(ST_JOB_ORDER, $jo_id), "class='tableheader2'");
                label_row(_("Project:"), get_project_formatted_name($row['project_id']), "class='tableheader2'");
                label_row(_("Reference:"), $row['reference'], "class='tableheader2'");

            table_section(2, "50%");
                label_row(_("Date:"), sql2date($row['tran_date']), "class='tableheader2'");
                label_row(_("From Location:"), $row['from_location'], "class='tableheader2'");
                label_row(_("Receiving Location:"), $row['to_location_name'], "class='tableheader2'");
                $s = get_project_trans_view_str(ST_APPROVAL_LOG, $trans_no."&source_type_id=".$type, "Approval Status");
                label_row($s, $approval_statuses[$row['approval_status']], "class='tableheader2'");

        end_outer_table(2);

        if (strlen($row['comments']) > 0) {
            start_table(TABLESTYLE2);
                label_row(_("Comment:"), nl2br($row['comments']), "class='tableheader2'");
            end_table(2);
        }
        
        return $row['id'];
}

function view_outside_material_receipt_details($type, $trans_no) {
    global $daily_item_types_array;
    
    $view_tp = ST_LOT_ALLOCATION;
    $hd_row = get_outside_material_receipt_header_record_type_trans_no($type, $trans_no);
        if (in_array($hd_row['approval_status'], array(AS_APPROVED))) {
            $view_tp = ST_LOT_MOVE;
        }
        
    $user_id = $_SESSION['wa_current_user']->user;
    $cap = can_access_project($hd_row['project_id'], $user_id);
        if ($cap['success'] !== true) {
            display_error($cap["message"]);
            display_footer_exit();
            exit;
        }
    
    start_table(TABLESTYLE, "width=99%");

        $th = array(_("Line Id"), _("Req.Ln"), _("Req.Item"), _("Item Type"), _("Description"), _("Unit"), _("Tran Qty"), _("Returned Qty"), _("Returned Alloc"), _('Budget'), 
                    _('Cost'), _('Project Site'), _('Comment'));  
        table_header($th);

        $k = 0; //row colour counter
            $result = get_outside_material_receipt_details_with_om_requsition_details($trans_no, $type);      
                while ($row = db_fetch($result)) {
                    $dec = 4;
                    
                    if ($row['request_stock_id'] != $row['stock_id']) {
                        start_row("style=background-color:#f3cbf7");
                    } else {
                        alt_table_row_color($k);
                    }

                        $trans_id = $row['trans_id'];
                        $source_line_id = $row['source_line_id'];
                        $conversion_factor = $row['conversion_factor'];
                        
                        if ($row['stock_control_method'] == SKCM_LOTS) {
                            $params = "type=".ST_OUTSIDE_MATERIAL_RECEIPT."&trans_no=$trans_no&line_id=$trans_id";
                            label_cell(get_data_view_str($view_tp, $params, $trans_id), 'align=center');
                        } else {
                            label_cell($trans_id, 'align=center');
                        }
                        
                        if ($source_line_id > 0) {
                            label_cell($source_line_id, 'align=center');
                            label_cell($row["request_stock_id"]." - ".$row["request_stock_description"]);  
                        } else {
                            label_cell('No OM Req');
                            label_cell('');
                        }
                            
                        label_cell($daily_item_types_array[$row['item_type']]);
                        if ($row['item_type'] == NSIT_NON_STOCK_ITEM || $row['item_type'] == NSIT_STOCK_ITEM) {
                            label_cell($row["stock_id"]." - ".$row["item_description"]);  
                            
                            $dec = get_qty_dec($row["stock_id"]);
                        } else {
                            label_cell($row["item_description"]);
                        }
                        label_cell($row["unit_name"]);
                        
                        if ($row['stock_control_method'] == SKCM_LOTS) {
                            $params = "type=".ST_OUTSIDE_MATERIAL_RECEIPT."&trans_no=$trans_no&line_id=$trans_id";
                            label_cell(get_data_view_str($view_tp, $params, number_format($row["tran_qty"], $dec)), 'align=right');
                        } else {
                            qty_cell($row["tran_qty"], false, $dec);
                        }
                        qty_cell($row["returned_quantity"] / $conversion_factor, false, $dec);
                        qty_cell($row["returned_alloc"] / $conversion_factor, false, $dec);
                        
                        if ($row['item_type'] == NSIT_COMMENT) {
                            label_cell('No budget required');
                        } else {
                            label_cell($row["task_description"]);
                        }
                        $tran_unit_cost = $row["conversion_factor"] * $row["standard_cost"];
                            if ($tran_unit_cost > 0) {
                                qty_cell($tran_unit_cost, false, $dec);
                            } else {
                                label_cell('');
                            }
                            
                        label_cell($row["site_description"]);          
                        label_cell(nl2br($row["line_comment"]));          

                    end_row();        
                }

    end_table(2);
}

function view_outside_material_receipt_return_headers_by_omr_no($omr_no, $type) {
    $result = get_outside_material_receipt_headers_by_omr_no_type($omr_no, $type); 
        if (! (db_num_rows($result) > 0)) {
            return;
        }
        
    $req_hd = get_outside_material_requisition_header_record($omr_no);
    $user_id = $_SESSION['wa_current_user']->user;
    $cap = can_access_project($req_hd['project_id'], $user_id);
        if ($cap['success'] !== true) {
            display_error($cap["message"]);
            display_footer_exit();
            exit;
        }
    
    global $systypes_array, $approval_statuses;
    
    display_heading($systypes_array[$type]." headers");
    
        start_table(TABLESTYLE, "width=70%");

            $th = array(_("Trans #"), _("Trans Date"), _("From Location"), _("Receiving Location"), _("Approval Status"));  
            table_header($th);

            $k = 0; //row colour counter
                while ($row = db_fetch($result)) {
                    alt_table_row_color($k);
                        label_cell(get_inventory_trans_view_str($row['type'], $row['trans_no']), 'align=center');
                        label_cell(sql2date($row["tran_date"]), 'align=center');
                        label_cell($row['from_location']);
                        label_cell($row['to_location_name']);
                        label_cell($approval_statuses[$row['approval_status']], 'align=center');
                    end_row();        
                }

        end_table(2);
}

function view_outside_material_receipt_return_headers_by_jo_id($jo_id, $type, $width=70) {
    global $approval_statuses, $systypes_array;
    
    $jo_row = get_job_order_project_id($jo_id);
    $user_id = $_SESSION['wa_current_user']->user;
    $cap = can_access_project($jo_row['project_id'], $user_id);
        if ($cap['success'] !== true) {
            display_error($cap["message"]);
            display_footer_exit();
            exit;
        }
    
    display_heading2($systypes_array[$type].'s');    br();
    
    start_table(TABLESTYLE, "width=$width%");

        $th = array(_("Trans #"), _("Reference"), _("Description"), _("Date"), _("From Location"), _("Receiving Location"), _("Approval Status"));  
        table_header($th);

        $k = 0; //row colour counter
            $result = get_outside_material_receipt_headers_by_filters($jo_id, 0, $type);      
                while ($row = db_fetch($result)) {
                    alt_table_row_color($k);
                        
                        label_cell(get_trans_view_str($row['type'], $row['trans_no']), 'align=center');
                        label_cell($row["reference"]);
                        label_cell($row["comments"]);
                        label_cell(sql2date($row["tran_date"]), 'align=center');
                        label_cell($row['from_location']);
                        label_cell($row['to_location_name']);
                        label_cell($approval_statuses[$row['approval_status']], 'align=center');

                    end_row();        
                }

    end_table(2);
}

?>