見出し画像

Webixライブラリを使ってWebアプリを開発する手順を複数回にわたって説明します。(その3)作業日報追加画面No.043

前回までで、作業日報用のデータベースを作成し、作業日報一覧の表示画面とDBを検索するRESTIFを紹介しましたが、今回は、作業日報を追加する画面を作成します。まずは、PC向けで作成し、その後、スマホ用に変更します。
新規作成は、一覧表画面の中に新規登録のボタンを配備し、そのボタン押下で、新規登録用の画面を開いて、必要事項を入力し、サーバに登録依頼をする動作となります。新規追加画面(後日、編集画面と兼務しますが)とDBにINSERTするREST IFを作成します。
作業日報でカメラ撮影映像も追加できるように、別の記事で記載しますが、今回の新規登録画面では、その機能を省略して実装します。(スマホ画面にするタイミングで修正予定です)
新規登録の画面デザインは、Webixサイトでサービスしているsnippet editorを使って、デザインします。

リアルタイムに画面デザインを確認できるので、サイズやレイアウト変更作業が簡単です。
今回の新規登録画面は、windowコンポーネントで実装します。
以下のような画面デザインにします。

以下のリンクで画面デザイン確認できます。snippet editorで、事前デザインできるのは、作業性が向上するのでいいツールです。
尚、スタイルシートはcompactを使っているので、ツール使うときもスタイルを変更しておく必要があります。
以下のURLにアクセスすると上記画面デザインを確認できます。

画面描画のソースは、以下のとおりです。

//======================================================================
//File Name       : DR0011_dailyreport_winform.php
//Encoding        : UTF-8
//Creation Date   : 2024-06-16
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//======================================================================
webix.i18n.setLocale("ja-JP");
    
//======================================================================
//File Name       : DR0011_dailyreport_winform.php
//Encoding        : UTF-8
//Creation Date   : 2024-06-16
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//======================================================================
webix.i18n.setLocale("ja-JP");
    
var DR0011_win_job_info = "DR0011";
var DR0011_win_resize_height=530;
var DR0011_win_resize_width=500;
var DR0011_win_resize_top=5;
var DR0011_win_resize_left=5;
var DR0011_form_minwidth = 5000;


function DR0011_create_data_win_show(){
    $$("DR0011_dailyreport_win").config.modal = true;
    DR0011_dailyreport_win.show();

    DR0011_dailyreport_form_clear();
    $$("DR0011_dailyreport_win_form1").clearValidation();
    $$("DR0011_dailyreport_udate_btn").enable();
    $$("DR0011_dailyreport_udate_btn").define("label","登録");
    $$("DR0011_dailyreport_udate_btn").refresh();
    $$("DR0011_dailyreport_cancel_btn").define("label","キャンセル");
    $$("DR0011_dailyreport_cancel_btn").refresh();
    $$("DR0011_dailyreport_delete_btn").hide();
    $$("DR0011_dailyreport_delete_btn").disable();
    
    $$("DR0011_dailyreport_editmode").setValue("3");  //1:閲覧 2:更新 3:新規登録
    return true;
}

function DR0011_dailyreport_form_clear(){
    $$("DR0011_id").setValue("");
    $$("DR0011_report_id").setValue("");

}

function DR0011_disp_win_show(permission_info,session_info,dailyreport_code){
    $$("DR0011_mess").setValue("");

}


    
var DR0011_dailyreport_form1 = [
            { margin:20,cols:[
                {view:"text",id:"DR0011_id"           ,name:"DR0011_id"           ,label:"id"    ,width: 30,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true,hidden:true},
                {view:"text",id:"DR0011_report_id"    ,name:"DR0011_report_id"    ,label:"作業日報id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true},
                {view:"text",id:"DR0011_user_id"      ,name:"DR0011_user_id"      ,label:"user_id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",hidden:true},
            ]},
            { margin:20,cols:[
    	        {view: "datepicker",id:"DR0011_report_date",name:"DR0011_report_date",  label:"作業日", format:webix.Date.dateToStr("%Y/%m/%d"),width: 220,invalidMessage:"未指定です",labelWidth:100,labelAlign:"right"},
           ]},
            { margin:20,cols:[
                {view:"datepicker",type:"time",stringResult:true  ,label:"作業開始時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_start_time",name:"DR0011_start_time" },
                {view:"select", label:"経過時間",  value:"1.0",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_duration_hour",name:"DR0011_duration_hour" ,
                 options:["1.0","1.5","2.0","2.5","3.0","3.5","4.0","4.5","5.0","5.5","6.0" ],
                }
            ]},
            { margin:20,cols:[
                {view:"datepicker",type:"time",stringResult:true  ,label:"作業終了時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_end_time",name:"DR0011_end_time" },
                {view:"select", label:"作業人数",  value:"2",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_workers",name:"DR0011_workers",
                 options:["1","2"]
                }
             ]},
            { margin:10,cols:[
                {view:"select", label:"作業場所",  value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_place",name:"DR0011_work_place",
                 options:["自宅","畑","倉庫畑","柑橘畑","田んぼ畑","その他"]
                },
              { view:"button", id:"DR0011_gps_get_btn",name:"DR0011_gps_get_btn", css:"webix_primary", value: "GPS取得", align:"center", width: 80,
                    click:function(){
                    }
                },
                {view:"text",id:"latitude",name:"latitude",label:"緯度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_latitude",name:"DR0011_latitude"},
            ]},
            { margin:10,cols:[
                {view:"select", label:"作業内容",  value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_details",name:"DR0011_work_details",
                 options:["収穫","水やり","肥料","監視","耕作","水やり","出荷","その他"]
                },
              {width:80},
                {view:"text",id:"longitude",name:"longitude",label:"経度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_longitude",name:"DR0011_longitude"},
           ]},
            { margin:20,cols:[
                {view:"text",id:"DR0011_memo"  ,name:"DR0011_memo" ,label:"メモ",width: 450,labelWidth: 100,labelAlign:"right"},
            ]},
            { margin:20,cols:[
                {view:"label", width:450,label: "",id:"DR0011_mess",css:"red"},
                {view:"text",id:"DR0011_dailyreport_editmode" ,name:"DR0011_dailyreport_editmode" ,label:"editmode",width: 200,labelWidth: 100,labelAlign:"right",hidden:true},
            ]},  
     ];



DR0011_dailyreport_win = webix.ui({
    view:"window", 
    id: "DR0011_dailyreport_win",
    move:true,
    resize:true,
    height : DR0011_win_resize_height,
    width : DR0011_win_resize_width,
    top : DR0011_win_resize_top,
    left : DR0011_win_resize_left,
head:{
    cols:[
        {template:"作業日報情報(DR0011)", type:"header", borderless:true},
        {view:"icon", icon:"wxi-close", tooltip:"画面を閉じます", click: function(){
            //閲覧モードの場合は、すぐに閉じる
            var form_mode = $$("DR0011_dailyreport_editmode").getValue(); //1:閲覧 2:更新 3:新規登録
            if(form_mode == "1")
            {
                DR0011_dailyreport_win.hide();
                $$("DR0011_dailyreport_editmode").setValue("1");  //1:閲覧 2:更新 3:新規登録
                return;
            }
            webix.confirm({
                title:"確認",
                ok:"はい", 
                cancel:"いいえ",
                text: "操作を中断して画面を閉じますか?",
            })
            .then(function(result){
                //「はい」の場合
                DR0011_dailyreport_win.hide();
                $$("DR0011_dailyreport_editmode").setValue("1");  //1:閲覧 2:更新 3:新規登録
            })
            .fail(function(){
                //「いいえ」の場合(2枚目)   
                webix.message({type:"debug",text:"操作を継続できます。"});
            });
        }}  
    ]
},
    body:{
        rows:[
            {
                margin:5,
                view:"form",
                id: "DR0011_dailyreport_win_form1",
                name: "DR0011_dailyreport_win_form1",
                elements:DR0011_dailyreport_form1,
                elementsConfig:{
                    bottomPadding:14
                },
                width:DR0011_win_resize_width,
               
                margin:3
            },
            {height:40,
             cols:[
                {},
                { view:"button",  css:"webix_danger", id:"DR0011_dailyreport_delete_btn",name:"DR0011_dailyreport_delete_btn",label:"削除", align:"center", width: 100,
                    click:function(){
                        var dailyreport_id = $$("dailyreport_id").getValue();
                        
                        webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text:dailyreport_name+"を削除しますか?"
                        })
                        .then(function(result){
                            $$("DR0011_dailyreport_editmode").setValue("4");  //1:閲覧 2:更新 3:新規 4:削除
                        })
                        .fail(function(){
                            webix.message("操作をキャンセルしました。");
                        });
                    }
                },

                // 更新,登録
                { view:"button",  css:"webix_primary", id:"DR0011_dailyreport_udate_btn",name:"DR0011_dailyreport_udate_btn",label: "編集", align:"center", width: 100,
                    click:function(){
                        $$("DR0011_mess").setValue("");
                        var edit_mode = $$("DR0011_dailyreport_editmode").getValue(); ///1:閲覧 2:更新 3:新規登録
                        if(edit_mode == "2"){   //2:更新
                            //更新処理
                        }
                        else if(edit_mode == "3"){  //3:新規登録
                            var data_list = $$("DR0011_dailyreport_win_form2").getValues();
                            webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text:"日報を新規登録しますか?"
                        })
                        .then(function(result){
                            var formData = new FormData();
                        })
                        .fail(function(){
                            webix.message("操作をキャンセルしました。");
                        });
                        }
                    }
                },
                { view:"button", id:"DR0011_dailyreport_cancel_btn",name:"DR0011_dailyreport_cancel_btn", css:"webix_primary", value: "キャンセル", align:"center", width: 100,css:"menu",
                    click:function(){
                         form_mode = $$("DR0011_dailyreport_editmode").getValue();    //1:閲覧 2:更新 3:新規登録
                        if(form_mode == "1")
                        {
                            DR0011_dailyreport_win.hide();
                            $$("DR0011_dailyreport_editmode").setValue("1");  //1:閲覧 2:更新 3:新規登録
                            return;
                        }
                        webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text: "操作を中断して画面を閉じますか?",
                        })
                        .then(function(result){
                            //「はい」の場合
                            DR0011_dailyreport_win.hide();
                        })
                        .fail(function(){
                            //「いいえ」の場合(2枚目)   
                            webix.message({type:"debug",text:"操作を継続できます。"});
                        });
                    }
                }
            ]
            }
        ]}
});


DR0011_create_data_win_show();

このソースの前後に実際に動くようにコードやPHPのソースを追加します。
この画面は、一覧表から新規登録ボタンをクリックしたときに、以下の関数をコールするようにして画面を開く動作となります。
DR0011_create_data_win_show(my_permission,my_local_session.userid);
引数に権限情報や登録ユーザIDを渡します。(今回は、権限によって、一部の情報だけ編集できるような仕様にはしないので、実際には、権限情報は、関数内では使わないです)
作業日報の一覧画面に、新規登録ボタンを追加します。

{ view:"button",id:"DR0010_new_dailyreport_btn", name:"DR0010_new_dailyreport_btn", value: "新規登録", align:"center", width: 110, css:"webix_primary", 
	click:function(){
		DR0011_create_data_win_show(my_permission,my_local_session.userid);
	}
},

画面デザインが完成したら、フォーム内のロジックを追加してゆきます。
今回のフォームでは、作業開始時刻、終了時刻、その間の時間をどのようにエントリするかです。作業が完了した時点で作業日報を記載するとすれば、終了時刻は現在時刻相当とし、標準作業時間を2.0Hとしておけば、自動的に開始時刻も計算できます。このあたりは、1つの作業をどのくらいで定義するかなどの業務仕様を決めて、ロジックを埋め込むことになります。
時刻を入力するコンポーネントは、datepickerを使いますが、時刻指定ができるデザインにするため、view:"datepicker",type:"time"のように宣言すると、以下のような画面で表示できます。

粒度は5分にしていますが、変更も可能です。
また、実際の時刻は、15分単位で丸めるようにするには、
以下のようなロジックで実現できます。

	$$("DR0011_report_date").setValue(moment().format("YYYY/MM/DD"));
    var now_time_h = moment().format("HH");
    var now_time_m = moment().format("mm");
   
    var now_time_m2 = Math.round(now_time_m/ 15) * 15;
    var duration_hour = "2.0";
	$$("DR0011_duration_hour").setValue(duration_hour);
	$$("DR0011_start_time").setValue(moment(now_time_h+":"+now_time_m2,"HH:mm").subtract(Number(duration_hour),'h').format("HH:mm"));
	$$("DR0011_end_time").setValue(now_time_h+":"+now_time_m2);

各ボタンを操作したときに、開始時刻、終了時刻、経過時間を自動計算するために、イベントハンドラを登録します。
今回は、以下のようにしました。

$$("DR0011_start_time").attachEvent("onChange", function(newValue, oldValue, config){
	var new_start_time = newValue;
	var duration_hour = $$("DR0011_duration_hour").getValue();
	var new_end_time = moment(new_start_time).add(duration_hour,'h').format("HH:mm");
    $$("DR0011_end_time").setValue(moment(new_start_time).add(duration_hour,'h').format("HH:mm"));
    
});

$$("DR0011_duration_hour").attachEvent("onChange", function(newValue, oldValue, config){
	var start_time = $$("DR0011_start_time").getValue();
	if(start_time!= ""){
		var duration_hour = newValue;
		var v1= moment(start_time,"HH:mm").add(duration_hour ,'h').format("HH:mm");
    	$$("DR0011_end_time").setValue(v1);
    }
});
$$("DR0011_end_time").attachEvent("onChange", function(newValue, oldValue, config){
	var start_time = $$("DR0011_start_time").getValue();
	var end_time = newValue;
	if(start_time!= "" && end_time != null){
		var duration_hour = $$("DR0011_duration_hour").getValue();
		var v1= moment(end_time,"HH:mm").subtract(duration_hour ,'h').format("HH:mm");
    	$$("DR0011_start_time").setValue(v1);
    }
});

詳細画面は、新規登録時と更新操作時で共有できるソースにします。
さらに、登録した作業日報を削除する機能も実装します。
一覧表から、対象行をクリックして、更新画面(詳細表示画面)を開き、更新操作または、削除操作を選択します。
新規登録は、一覧から専用のボタンで操作します。
尚、新規登録、更新操作、削除操作後は、対象詳細画面は閉じて、一覧は、最新化(再検索)して表示します。
以下が、一覧画面です。

2行目をクリックして詳細画面を開くと一覧画面の上に、詳細画面(編集画面)を開きます。

画面上で、必要な項目を編集して更新ボタン押下すれば、更新されます。


今回の仕様は、ログインしたユーザ自身の作業日報を作成したり、更新する仕様としています。別のユーザが作成した作業日報の表示や更新操作はできない仕様です。(管理者は、全ユーザの操作ができる機能にすることも可能です)
作業場所や作業内容は、候補から選択する仕様としましたが、必要時に、項目追加する仕様で実装することも可能です。
緯度、経度の情報は、スマホ画面を作るときに、説明します。(画像取り込みも同様です)
今回、作成したソースは、画面関連で2つ
REST_API(サーバ関連)で、4つです。
\view\DR0010\DR0010_dailyreport_lists.php 一覧画面
\view\DR0010\DR0011_dailyreport_winform.php 詳細画面(追加・更新)

\rest_api\DR0010\DR0012_dailyreport_selectlists.php  一覧検索
\rest_api\DR0010\DR0013_dailyreport_select.php 個別詳細検索
\rest_api\DR0010\DR0014_entry_dailyreport.php 新規追加
\rest_api\DR0010\DR0015_update_dailyreport.php 更新
\rest_api\DR0010\DR0016_delete_dailyreport.php 削除

\view\DR0010\DR0010_dailyreport_lists.php 一覧画面

<?php
//======================================================================
//File Name       : DR0010_dailyreport_lists.php
//Encoding        : UTF-8
//Creation Date   : 2024-06-18
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//====================================================================== 
	$TITLE_INFO ="作業日報一覧";
	$VER_INFO ="V01L01";
	$JOB_INFO = "DR0010";
	$myfilename = basename(__FILE__);	//自分自身のファイル名取得
    define('SUB_FOLDER','/webix02');    //サブフォルダを指定したURL 
    define('ROOT_PATH','/home/sunsun/www/webix02'); //ソースを保存しているパス(動作環境に応じて記述する必要あり)
	$userid = '';
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
	if($_SERVER["REQUEST_METHOD"] != "GET"){
	  error_log($logheader.'  REQUEST_METHOD no GET');
	  header("HTTP/1.0 404 Not Found");
	  return;
	}
	$error_flag = -1;
	$accesskey = 0;
	$userclient ="pc";
	$mypermission = 0;
	if(isset($_GET['accesskey'])){
		 if(is_numeric($_GET['accesskey'])){
			$accesskey =$_GET['accesskey'];
			$error_flag = 1;
		}
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  accesskey not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
	if(isset($_GET['userid'])){
		$userid = $_GET['userid'];
		$error_flag = 1;
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  userid not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
	if(isset($_GET['userclient'])){
		$userclient = $_GET['userclient'];
	}
	if(isset($_GET['permission'])){
		if(is_numeric($_GET['permission'])){
			$mypermission = intval($_GET['permission']);
		}
	}
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)

	include('../../commonlib/svr_common_lib_v2.php');	//
	$config_obj = get_config_obj();
	
	if(Chk_AccessKey($accesskey)){
	}
	else{
		error_log($logheader.'  accesskey check error');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
?>

<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title><?php echo $TITLE_INFO.' DR0010 ('.$VER_INFO.')' ?></title> 
		<script src="/webix_GPL_1020/webix.js" type="text/javascript" charset="utf-8"></script>
		<link href="/webix_GPL_1020/skins/compact.css?<?php echo date('Ymd-H'); ?>" rel="stylesheet" type="text/css">
		<link href="<?php  echo SUB_FOLDER; ?>/commonlib/webix_custom_css.css?<?php echo date('Ymd-H'); ?>" rel="stylesheet" type="text/css">
		<link rel="icon" href="<?php  echo SUB_FOLDER; ?>/image/webix_64.ico">
		<script src="<?php  echo SUB_FOLDER; ?>/commonlib/object-assign.js"></script>
		<script src="<?php  echo SUB_FOLDER; ?>/commonlib/moment-with-locales.js"></script>
    	<script src="<?php  echo SUB_FOLDER; ?>/commonlib/webix_common_lib.js"></script>
		<link rel="stylesheet" href="/webix_GPL_1020/css/materialdesignicons.min.css" type="text/css" charset="utf-8">
	<style>
	.blue .webix_el_box{
  		color: #0000ff;
	}
	.blue .webix_control.webix_el_text{
  		color: #0000ff;
	}
	.red .webix_el_box{
  		color: #ff0000;
	}
	.red  .webix_control.webix_el_text{
  		color: #ff0000;
	}
	.invalid_mess{font-size:8px}
	.red  .webix_control.webix_el_text{
  		color: #ff0000;
	}
	.orange_bgcolor button.webix_button{
		background: #FF8856;
		color:#FFFFFF;
		border:1px solid #FF8856;
	}
	.gray_bgcolor {
		background: #efefef;
		
	}
	.highlight{
        background-color:#FFAAAA;
    }
    .teal_bgcolor .webix_button {
 		background-color: #008080;
  		 color: #FFFFFF;
	}
	.green input{
		background-color:#B1FF91;
		border-color:green;
	}
	.pink input{
		background-color:#FFB6FE;
		border-color:red ;
	} 
  	</style>
  	</head>	
	<body>
		<script type="text/javascript" charset="utf-8">		
		webix.i18n.setLocale("ja-JP");
		var my_local_session = webix.storage.local.get('login');
<?php
	include_once('../../commonlib/CM0010_goto_menu_action.php');
	include_once('../../commonlib/CM0030_sendprm_set_request.php');
	include_once('../../commonlib/CM0060_common_validate_check.php');
    include_once('../../commonlib/CM0070_prompt_parameter_setting.php');
    include_once('../../commonlib/CM0080_screen_control.php');
	if(isset($_GET['open_mode'])){
		$open_mode = $_GET['open_mode'];
		if($open_mode == '_blank'){
			echo '	var menu_btn_name = "閉じる";'."\n";
		}
		else{
			echo '	var menu_btn_name = "メニュー";'."\n";
		}
	}
	else{
			echo '	var menu_btn_name = "メニュー";'."\n";
	}
	echo '	var my_permission ='.$mypermission.";\n";
?>

<?php
	if($userclient != "pc"){
?>
	webix.ui.fullScreen();
<?php
}
?>

	var fl_start_report_date = moment().startOf('month').format("YYYY/MM/DD");
	var fl_end_report_date = moment().format("YYYY/MM/DD");

webix.i18n.setLocale("ja-JP");
function DR0010_select_dailyreport_lists(fl_user_id){
	$$("DR0010_table").clearAll();			//リストを一度クリア
	CM0080_datatable_filter_clear("DR0010_table");
	var start_date = moment($$("fl_start_report_date").getValue()).format("YYYY/MM/DD");
	var end_date   = moment($$("fl_end_report_date").getValue()).format("YYYY/MM/DD");
	var access_key = Get_AccessKey();
	var send_prm  = Prepare_send_prm(my_local_session, access_key);
	send_prm.fl_user_id = fl_user_id;
	send_prm.fl_start_report_date = start_date;
	send_prm.fl_end_report_date = end_date;
	var xhr =webix.ajax().sync().get("<?php  echo SUB_FOLDER; ?>/rest_api/DR0010/DR0012_dailyreport_selectlists.php",send_prm);
	var resp =  JSON.parse(xhr.responseText);
	if(resp.resp =="ok"){
		$$("DR0010_table").parse(resp.var_lists);
		var v_count =$$("DR0010_table").count();
		$$("select_count").setValue(String(v_count));
		if(v_count == 0 ){				
			$$("comment").setValue("検索結果は、0件です。");
			webix.message({type:"debug", text:"検索結果は、0件です。"});
		}				
		else{
			$$("comment").setValue("");
		}
	}
	else{
		webix.message({type:"error", text:"検索でエラーが発生しました。code="+resp.error_code});
	}
}
	
	//検索条件フォーム構成リスト
	var form_collection = [
		{ margin:5,
			cols:[
				{ view:"label", height:50, template:"<span style='font-weight:bold; font-size:180%;'>作業日報一覧</span>",width:890},
			]
		},
		{ margin:5, 
			cols:[
				{view:"datepicker",id:"fl_start_report_date",name:"fl_start_report_date",label:'開始日',labelAlign:"right",value:fl_start_report_date,width:"200",type: "date",format:webix.Date.dateToStr("%Y/%m/%d")
				,on:{
					onChange:function(newv,oldv){
						var end_date =  moment($$("fl_end_report_date").getValue()).format("YYYYMMDD");
						var start_date = moment(newv).format("YYYYMMDD");
						var today = moment().format("YYYYMMDD");
						if(start_date >  today ){
							$$("DR0010_search_btn").disable();
							webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
						}
						else if(end_date < start_date){
							$$("DR0010_search_btn").disable();
							webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
						}
						else{
							$$("DR0010_search_btn").enable();
						}
					},
					onEnter(ev){
						$$("DR0010_search_btn").focus();
					}
					
				}
				},
				{view:"datepicker",id:"fl_end_report_date",name:"fl_end_report_date",label:'終了日',labelAlign:"right",value:fl_end_report_date,width:"200",type: "date",format:webix.Date.dateToStr("%Y/%m/%d"),
				on:{
					onChange:function(newv,oldv){
						var start_date = moment($$("fl_start_report_date").getValue()).format("YYYYMMDD");
						var end_date =  moment(newv).format("YYYYMMDD");
						var today = moment().format("YYYYMMDD");
						if(end_date >  today ){
							$$("DR0010_search_btn").disable();
							webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
						}
						else if(end_date < start_date){
							$$("DR0010_search_btn").disable();
							webix.message({type:"error",text:"日付の範囲が<br>正しくありません。"});
						}
						else{
							$$("DR0010_search_btn").enable();
						}

					},
					onEnter(ev){
						$$("DR0010_search_btn").focus();
					}
				}},
				{ view:"button", value: "検索", align:"center", width: 110,id:"DR0010_search_btn",name:"DR0010_search_btn",
					click:function(){
						var fl_user_id = my_local_session.userid;
						DR0010_select_dailyreport_lists(fl_user_id);
					}
				},
				{ view:"button",id:"DR0010_new_dailyreport_btn", name:"DR0010_new_dailyreport_btn", value: "新規登録", align:"center", width: 110, css:"webix_primary", 
					click:function(){
						DR0011_create_data_win_show(my_permission,my_local_session.userid);
					}
				},
				// メニューに戻るボタン実装
				{ view:"button",  value: menu_btn_name, align:"center", width: 110, css:"menu",
					click:function(){
						Goto_Menu(my_local_session["userclient"]);	//メニュー画面へ遷移
					}
				}
			]
		},
	];


function time_format(value){
	var str1 = String(value).replace(/\./g,"");
	if(str1 == "" || str1 == 0)	return "";
	else{
		return str1.substring(0,5);
	}
}
	
	var grid1 = {
		id: "DR0010_table",
		name: "DR0010_table",
		type:"clean",
		view:"datatable",
		width:800,
		resizeColumn:true,
		resizeRow: { headerOnly:true },
		columns:[
            { id:"id",header:["id",{content:"textFilter"}],width:60,sort:"int", css:{"text-align":"right"}},
            { id:"report_id",header:["report_id"],width:100,sort:"int",hidden:true},
            { id:"user_id",header:["user_id"],width:100,sort:"int",hidden:true},
            { id:"report_date",header:["日付",{content:"textFilter"}],width:100,sort:"int", css:{"text-align":"right"},format:webix.Date.dateToStr("%Y/%m/%d")},
            { id:"work_place",header:["作業場所'",{content:"selectFilter"}],width:200,sort:"string"},
            { id:"work_details",header:["作業内容'",{content:"selectFilter"}],width:200,sort:"string"},
            { id:"start_time",header:["作業開始時刻'",{content:"selectFilter"}],width:100,sort:"int",format:time_format, css:{"text-align":"right"}},
            { id:"duration_hour",header:["経過時間(h)",{content:"selectFilter"}],width:100,sort:"int", css:{"text-align":"right"}},
            { id:"workers",header:["作業人数'",{content:"selectFilter"}],width:100,sort:"int", css:{"text-align":"right"}},
		],
		//	選択	
		on:{
			onItemClick:function(id){
				var item = this.getItem(id);
				DR0011_disp_win_show(my_permission,my_local_session,item.report_id,item.id);
			}
		},
		resizeColumn:true, resizeRow:true,
		leftSplit:2,
		scroll:"xy",
		select:"row",
		datatype:"json",
		data:[]
	};

	//画面描画
	webix.ui({
		padding: 10,
		rows:[ { view:"form", id: "form1", elements : form_collection, margin:3, select:true },
			   { margin:5,cols: [
			      { view:"text", label:"検索結果(件)", labelWidth:100,labelAlign:"right",name:"select_count",id:"select_count",value:0,width:160, inputAlign:"right",readonly:true },
		          { view:"label",label:"", width:300, name:"comment", id:"comment" }
		       ]},
		grid1,
		]
	});
<?php
	include_once('DR0011_dailyreport_winform.php');	//作業日報明細表示
?>
	var fl_user_id = my_local_session.userid;
	DR0010_select_dailyreport_lists(fl_user_id);


</script>
</body>
</html>

\view\DR0010\DR0011_dailyreport_winform.php 詳細画面(追加・更新)

//======================================================================
//File Name       : DR0011_dailyreport_winform.php
//Encoding        : UTF-8
//Creation Date   : 2024-06-16
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//======================================================================
webix.i18n.setLocale("ja-JP");
    
var DR0011_win_job_info = "DR0011";
var DR0011_win_resize_height=540;
var DR0011_win_resize_width=500;
var DR0011_win_resize_top=5;
var DR0011_win_resize_left=5;
var DR0011_form_minwidth = 500;


function DR0011_create_data_win_show(permission_info,userid){
    $$("DR0011_dailyreport_win").config.modal = true;
    DR0011_dailyreport_win.show();

    DR0011_dailyreport_form_clear();
    $$("DR0011_user_id").setValue(userid);
    
    $$("DR0011_dailyreport_udate_btn").enable();
    $$("DR0011_dailyreport_udate_btn").define("label","登録");
    $$("DR0011_dailyreport_udate_btn").refresh();
    $$("DR0011_dailyreport_cancel_btn").define("label","キャンセル");
    $$("DR0011_dailyreport_cancel_btn").refresh();
    $$("DR0011_dailyreport_delete_btn").hide();
    
    $$("DR0011_dailyreport_editmode").setValue("3");  //1:閲覧 2:編集 3:新規登録
    return true;
}

function DR0011_dailyreport_form_clear(){
    $$("DR0011_id").setValue("");
    $$("DR0011_report_id").setValue("");
	$$("DR0011_report_date").setValue(moment().format("YYYY/MM/DD"));
    var now_time_h = moment().format("HH");
    var now_time_m = moment().format("mm");
   
    var now_time_m2 = Math.round(now_time_m/ 15) * 15;
    var duration_hour = "2.0";
	$$("DR0011_duration_hour").setValue(duration_hour);
	$$("DR0011_start_time").setValue(moment(now_time_h+":"+now_time_m2,"HH:mm").subtract(Number(duration_hour),'h').format("HH:mm"));
	$$("DR0011_end_time").setValue(now_time_h+":"+now_time_m2);
}




//行から読み出して、report_idをキーにDBを検索してフォームにセットする
function DR0011_disp_win_show(permission_info,session_info,report_id,id){
    DR0011_dailyreport_form_clear();
    
    $$("DR0011_mess").setValue("");
    var access_key = Get_AccessKey();
    var send_prm = Prepare_send_prm(session_info,access_key);
    send_prm.report_id = report_id;
    send_prm.id = id;
	var xhr =webix.ajax().sync().get("<?php  echo SUB_FOLDER; ?>/rest_api/DR0010/DR0013_dailyreport_select.php",send_prm);
	var resp =  JSON.parse(xhr.responseText);
	if(resp.resp =="ok"){
		$$("DR0011_dailyreport_win_form1").setValues(resp.form_datas);

        $$("DR0011_dailyreport_udate_btn").enable();
        $$("DR0011_dailyreport_udate_btn").define("label","更新");
        $$("DR0011_dailyreport_udate_btn").refresh();
        $$("DR0011_dailyreport_cancel_btn").define("label","キャンセル");
        $$("DR0011_dailyreport_cancel_btn").refresh();
        $$("DR0011_dailyreport_editmode").setValue("2");  //1:閲覧 2:編集 3:新規登録

        if(CM0010_permission_check(permission_info,CM0080_PERMISSION_B5)){  //削除可能者
            $$("DR0011_dailyreport_delete_btn").enable();
            $$("DR0011_dailyreport_delete_btn").show();
        }
        else{
            $$("DR0011_dailyreport_delete_btn").disable();
            $$("DR0011_dailyreport_delete_btn").hide();
        }
		DR0011_dailyreport_win.show();
    }
	else{
		webix.message({type:"error", text:"検索でエラーが発生しました。code="+resp.error_code});
	}
	
}

    
var DR0011_dailyreport_form1 = [
            { margin:20,cols:[
                {view:"text",id:"DR0011_id"           ,name:"DR0011_id"           ,label:"id"    ,width: 30,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true,hidden:true},
                {view:"text",id:"DR0011_report_id"    ,name:"DR0011_report_id"    ,label:"作業日報id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",readonly:true},
                {view:"text",id:"DR0011_user_id"      ,name:"DR0011_user_id"      ,label:"user_id",width: 200,labelWidth:100,labelAlign:"right",inputAlign:"right",hidden:true},
            ]},
            { margin:20,cols:[
    	        {view: "datepicker",id:"DR0011_report_date",name:"DR0011_report_date",  label:"作業日", format:webix.Date.dateToStr("%Y/%m/%d"),width: 220,invalidMessage:"未指定です",labelWidth:100,labelAlign:"right"},
           ]},
            { margin:20,cols:[
                {view:"datepicker",type:"time",stringResult:true  ,label:"作業開始時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_start_time",name:"DR0011_start_time" },
                {view:"select", label:"経過時間",  value:"1.0",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_duration_hour",name:"DR0011_duration_hour" ,
                 options:["1.0","1.5","2.0","2.5","3.0","3.5","4.0","4.5","5.0","5.5","6.0" ],
                }
            ]},
            { margin:20,cols:[
                {view:"datepicker",type:"time",stringResult:true  ,label:"作業終了時刻",width: 220,labelWidth:100,labelAlign:"right",id:"DR0011_end_time",name:"DR0011_end_time" },
                {view:"select", label:"作業人数",  value:"2",width: 160,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_workers",name:"DR0011_workers",
                 options:["1","2"]
                }
             ]},
            { margin:10,cols:[
                {view:"select", label:"作業場所",  value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_place",name:"DR0011_work_place",
                 options:["自宅","畑","倉庫畑","柑橘畑","田んぼ畑","その他"]
                },
              { view:"button", id:"DR0011_gps_get_btn",name:"DR0011_gps_get_btn", css:"webix_primary", value: "GPS取得", align:"center", width: 80,
                    click:function(){
                    }
                },
                {view:"text",id:"latitude",name:"latitude",label:"緯度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_latitude",name:"DR0011_latitude"},
            ]},
            { margin:10,cols:[
                {view:"select", label:"作業内容",  value:"畑",width: 200,labelWidth:100,labelAlign:"right", inputAlign:"right",id:"DR0011_work_details",name:"DR0011_work_details",
                 options:["収穫","水やり","肥料","監視","耕作","水やり","出荷","その他"]
                },
              {width:80},
                {view:"text",id:"longitude",name:"longitude",label:"経度",width: 150,labelWidth:40,labelAlign:"right",inputAlign:"right",value:"",id:"DR0011_longitude",name:"DR0011_longitude"},
           ]},
            { margin:20,cols:[
                {view:"text",id:"DR0011_memo"  ,name:"DR0011_memo" ,label:"メモ",width: 450,labelWidth: 100,labelAlign:"right"},
            ]},
            { margin:20,cols:[
                {view:"label", width:450,label: "",id:"DR0011_mess",css:"red"},
                {view:"text",id:"DR0011_dailyreport_editmode" ,name:"DR0011_dailyreport_editmode" ,label:"editmode",width: 200,labelWidth: 100,labelAlign:"right",hidden:true},
            ]},  
     ];



function check_form_data(){
	var report_date = $$("DR0011_report_date").getValue();
	if(report_date == null || report_date == ""){
		$$("DR0011_mess").setValue("作業日が未指定です。");
		webix.alert("作業日が未指定です。");
		return false;
	}
	var start_time = $$("DR0011_start_time").getValue();
	var end_time   = $$("DR0011_end_time").getValue();
	var duration_hour = $$("DR0011_duration_hour").getValue();
	if(start_time == null || start_time == ""){
		$$("DR0011_mess").setValue("作業開始時刻が未指定です。");
		webix.alert("作業開始時刻が未指定です。");
		return false;
	}
	if(end_time == null || end_time == ""){
		$$("DR0011_mess").setValue("作業終了時刻が未指定です。");
		webix.alert("作業終了時刻が未指定です。");
		return false;
	}
	if(duration_hour == ""){
		$$("DR0011_mess").setValue("経過時間が未指定です。");
		webix.alert("経過時間が未指定です。");
		return false;
	}
	return true;
}


DR0011_dailyreport_win = webix.ui({
    view:"window", 
    id: "DR0011_dailyreport_win",
    move:true,
    resize:true,
    height : DR0011_win_resize_height,
    width : DR0011_win_resize_width,
    top : DR0011_win_resize_top,
    left : DR0011_win_resize_left,
head:{
    cols:[
        {template:"作業日報情報(DR0011)", type:"header", borderless:true},
        {view:"icon", icon:"wxi-close", tooltip:"画面を閉じます", click: function(){
            //閲覧モードの場合は、すぐに閉じる
            var form_mode = $$("DR0011_dailyreport_editmode").getValue(); //1:閲覧 2:編集 3:新規登録
            if(form_mode == "1")
            {
                DR0011_dailyreport_win.hide();
                $$("DR0011_dailyreport_editmode").setValue("1");  //1:閲覧 2:編集 3:新規登録
                return;
            }
            webix.confirm({
                title:"確認",
                ok:"はい", 
                cancel:"いいえ",
                text: "操作を中断して画面を閉じますか?",
            })
            .then(function(result){
                //「はい」の場合
                DR0011_dailyreport_win.hide();
                $$("DR0011_dailyreport_editmode").setValue("1");  //1:閲覧 2:編集 3:新規登録
            })
            .fail(function(){
                //「いいえ」の場合(2枚目)   
                webix.message({type:"debug",text:"操作を継続できます。"});
            });
        }}  
    ]
},
    body:{
        rows:[
            {
                margin:5,
                view:"form",
                id: "DR0011_dailyreport_win_form1",
                name: "DR0011_dailyreport_win_form1",
                elements:DR0011_dailyreport_form1,
                elementsConfig:{
                    bottomPadding:14
                },
                width:DR0011_win_resize_width,
               
                margin:3
            },
            {height:40,
             cols:[
                {},
                { view:"button",  css:"webix_danger", id:"DR0011_dailyreport_delete_btn",name:"DR0011_dailyreport_delete_btn",label:"削除", align:"center", width: 100,
                    click:function(){
                        $$("DR0011_mess").setValue("");
                        var DR0011_report_id = $$("DR0011_report_id").getValue();
                        
                        webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text:"作業日報:"+DR0011_report_id+"を<br>削除しますか?"
                        })
                        .then(function(result){
                            $$("DR0011_dailyreport_editmode").setValue("4");  //1:閲覧 2:更新 3:新規 4:削除
                            var report_id = $$("DR0011_report_id").getValue();
                            var formData = new FormData();
        					var access_key = Get_AccessKey();
        					formData.append("accesskey",access_key);
        					formData.append("userid",  my_local_session.userid);
                            formData.append("report_id",report_id );
                            formData.append("edit_mode",4);
         					var xhr =webix.ajax().sync().post("<?php  echo SUB_FOLDER; ?>/rest_api/DR0010/DR0016_delete_dailyreport.php",formData);
        					var resp =  JSON.parse(xhr.responseText);
        					if(resp.resp =="ok"){
        						DR0011_dailyreport_win.hide();
								var fl_user_id = my_local_session.userid;
								DR0010_select_dailyreport_lists(fl_user_id);
            					webix.message({type:"success",text:"作業日報を削除しました。"});
            					return;
        					}
        					else{
            					webix.alert("作業日報の削除でエラーしました。 code="+resp.error_code);
            					return;
        					}
                        })
                        .fail(function(){
                            webix.message("操作をキャンセルしました。");
                        });
                    }
                },
                {width:100},
                // 更新,登録
                { view:"button",  css:"webix_primary", id:"DR0011_dailyreport_udate_btn",name:"DR0011_dailyreport_udate_btn",label: "更新", align:"center", width: 100,
                    click:function(){
                        $$("DR0011_mess").setValue("");
                        if(check_form_data()){
                        }
                        else{
                        	return;
                        }
                        var edit_mode = $$("DR0011_dailyreport_editmode").getValue(); ///1:閲覧 2:更新3:新規登録
                        if(edit_mode == "2"){   //2:更新
                            //更新処理
                            var upate_datas = $$("DR0011_dailyreport_win_form1").getValues();
                            webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text:"作業日報を更新しますか?"
                        	})
                            .then(function(result){
                            	start_time = moment($$("DR0011_start_time").getValue(),"HH:mm").format("HH:mm");
                            	end_time = moment($$("DR0011_end_time").getValue(),"HH:mm").format("HH:mm");
                                var formData = new FormData();
        						var access_key = Get_AccessKey();
        						formData.append("accesskey",access_key);
        						formData.append("userid",  my_local_session.userid);
                                formData.append("upate_datas",JSON.stringify(upate_datas));
                                formData.append("report_date",moment($$("DR0011_report_date").getValue()).format("YYYY-MM-DD"));
                                formData.append("start_time",start_time);
                                formData.append("end_time",end_time);
                                formData.append("edit_mode",edit_mode);
         						var xhr =webix.ajax().sync().post("<?php  echo SUB_FOLDER; ?>/rest_api/DR0010/DR0015_update_dailyreport.php",formData);
        						var resp =  JSON.parse(xhr.responseText);
        						if(resp.resp =="ok"){
        							$$("DR0011_report_id").setValue(resp.report_id);
        							DR0011_dailyreport_win.hide();
									var fl_user_id = my_local_session.userid;
									DR0010_select_dailyreport_lists(fl_user_id);
        							
            						webix.message({type:"success",text:"作業日報を更新しました。"});
            						
            						return;
        						}
        						else{
            						webix.alert("作業日報の更新でエラーしました。 code="+resp.error_code);
            						return;
        						}
                            })
                            .fail(function(){
                                webix.message("操作をキャンセルしました。");
                            });
                            
                            
                        }
                        else if(edit_mode == "3"){  //3:新規登録
                            var entry_datas = $$("DR0011_dailyreport_win_form1").getValues();
                            webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text:"作業日報を新規登録しますか?"
                        	})
                            .then(function(result){
                            	start_time = moment($$("DR0011_start_time").getValue(),"HH:mm").format("HH:mm");
                            	end_time = moment($$("DR0011_end_time").getValue(),"HH:mm").format("HH:mm");
                                var formData = new FormData();
        						var access_key = Get_AccessKey();
        						formData.append("accesskey",access_key);
        						formData.append("userid",  my_local_session.userid);
                                formData.append("entry_datas",JSON.stringify(entry_datas));
                                formData.append("report_date",moment($$("DR0011_report_date").getValue()).format("YYYY-MM-DD"));
                                formData.append("start_time",start_time);
                                formData.append("end_time",end_time);
                                formData.append("edit_mode",edit_mode);
         						var xhr =webix.ajax().sync().post("<?php  echo SUB_FOLDER; ?>/rest_api/DR0010/DR0014_entry_dailyreport.php",formData);
        						var resp =  JSON.parse(xhr.responseText);
        						if(resp.resp =="ok"){
        							$$("DR0011_report_id").setValue(resp.report_id);
        							DR0011_dailyreport_win.hide();
									var fl_user_id = my_local_session.userid;
									DR0010_select_dailyreport_lists(fl_user_id);
        							
            						webix.message({type:"success",text:"作業日報を登録しました。"});
            						return;
        						}
        						else{
            						webix.alert("作業日報の登録でエラーしました。 code="+resp.error_code);
            						return;
        						}
                            })
                            .fail(function(){
                                webix.message("操作をキャンセルしました。");
                            });
                        }
                    }
                },
                { view:"button", id:"DR0011_dailyreport_cancel_btn",name:"DR0011_dailyreport_cancel_btn", css:"webix_primary", value: "キャンセル", align:"center", width: 100,css:"menu",
                    click:function(){
                         form_mode = $$("DR0011_dailyreport_editmode").getValue();    //1:閲覧 2:更新 3:新規登録
                        if(form_mode == "1")
                        {
                            DR0011_dailyreport_win.hide();
                            $$("DR0011_dailyreport_editmode").setValue("1");  //1:閲覧 2:更新 3:新規登録
                            return;
                        }
                        webix.confirm({
                            title:"確認",
                            ok:"はい", 
                            cancel:"いいえ",
                            text: "操作を中断して画面を閉じますか?",
                        })
                        .then(function(result){
                            //「はい」の場合
                            DR0011_dailyreport_win.hide();
                        })
                        .fail(function(){
                            //「いいえ」の場合(2枚目)   
                            webix.message({type:"debug",text:"操作を継続できます。"});
                        });
                    }
                }
            ]
            }
        ]}
});

$$("DR0011_start_time").attachEvent("onChange", function(newValue, oldValue, config){
	var new_start_time = newValue;
	var duration_hour = $$("DR0011_duration_hour").getValue();
	var new_end_time = moment(new_start_time).add(duration_hour,'h').format("HH:mm");
    $$("DR0011_end_time").setValue(moment(new_start_time).add(duration_hour,'h').format("HH:mm"));
    
});

$$("DR0011_duration_hour").attachEvent("onChange", function(newValue, oldValue, config){
	var start_time = $$("DR0011_start_time").getValue();
	if(start_time!= ""){
		var duration_hour = newValue;
		var v1= moment(start_time,"HH:mm").add(duration_hour ,'h').format("HH:mm");
    	$$("DR0011_end_time").setValue(v1);
    }
});
$$("DR0011_end_time").attachEvent("onChange", function(newValue, oldValue, config){
	var start_time = $$("DR0011_start_time").getValue();
	var end_time = newValue;
	if(start_time!= "" && end_time != null){
		var duration_hour = $$("DR0011_duration_hour").getValue();
		var v1= moment(end_time,"HH:mm").subtract(duration_hour ,'h').format("HH:mm");
    	$$("DR0011_start_time").setValue(v1);
    }
});

\rest_api\DR0010\DR0012_dailyreport_selectlists.php  一覧検索

 <?php
//======================================================================
//File Name       : DR0012_dailyreport_selectlists.php
//Encoding        : UTF-8
//Creation Date   : 2024-06-18
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//
//  usage example /rest_api/DR0010/DR0012_dailyreport_selectlists.php?userid=admin&fl_user_id=admin&fl_start_report_date=2024-06-18&fl_end_report_date=2024-06-18
//====================================================================== 
	//header("Content-Type: text/javascript; charset=utf-8");
    $userid ='';
	$myfilename = basename(__FILE__);	//自分自身のファイル名取得
	$logheader = 'log:'.$myfilename.' userid='.$userid.' :';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)

	if($_SERVER["REQUEST_METHOD"] != "GET"){
	  //GET以外ははじく
	  error_log($logheader.'  REQUEST_METHOD no GET');
	  header("HTTP/1.0 404 Not Found");
	  return;
	}
    //$accesskey =0;
    //GET情報からパラメータ取得
    //if(isset($_GET['accesskey'])){
	//	 if(is_numeric($_GET['accesskey'])){
	//		$accesskey = intval($_GET['accesskey']);
	//	}
	//}
	//else{
	//	$error_flag = -1;
	//  	error_log($logheader.'  accesskey not found');
	//  	header("HTTP/1.0 404 Not Found");
	//  	exit;
	//}
	if(isset($_GET['userid'])){
		$userid = $_GET['userid'];
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  userid not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}

	$logheader = 'log:'.$myfilename.' userid='.$userid.' :';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
	include('../../commonlib/svr_common_lib_v2.php');	//

    //検索条件用パラメータ
    $fl_user_id ='';
    $fl_start_report_date='';
    $fl_end_report_date='';
	if(isset($_GET['fl_user_id'])){
		$fl_user_id = $_GET['fl_user_id'];
	}
	if(isset($_GET['fl_start_report_date'])){
		$fl_start_report_date = $_GET['fl_start_report_date'];
	}
	if(isset($_GET['fl_end_report_date'])){
		$fl_end_report_date = $_GET['fl_end_report_date'];
	}

	error_log($logheader.'   $fl_user_id ='.$fl_user_id);
	error_log($logheader.'   $fl_start_report_date ='.$fl_start_report_date);
	error_log($logheader.'   $fl_end_report_date   ='.$fl_end_report_date);
	
	$config_obj = get_config_obj();
	//アクセスキーチェック
	//if(Chk_AccessKey($accesskey)){
	//	$error_flag = 1;
	//}
	//else{
	//	error_log($logheader.'  accesskey check error');
	//  	header("HTTP/1.0 404 Not Found");
	//  	exit;
	//}

    //
    //メインルーチン
    //
    //データベース接続する(MySQLDB)
    $dbh = mariadb_connect($config_obj,'app01','webix_webix');	//configファイルに従って、DB接続して応答を返す
    if($dbh == false){
    	//エラー応答
    	$resp = "ng";
    	$count = 0;
		$error_code = -1;
		$var_lists = array();
 		$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
		echo $json_data;
		exit;
	}
	try {
        $select_sql = 'SELECT id as report_id,user_id,report_date,work_place,work_details,start_time,end_time,duration_hour,workers from dailyreports ';
        $where_str_array = array();
        if($fl_user_id != ""){
            $where_str_array[] =" user_id = '".$fl_user_id."'";
        }
        if($fl_start_report_date != ""){
            $where_str_array[] =" report_date >= '".$fl_start_report_date."'";
        }
        if($fl_end_report_date != ""){
            $where_str_array[] =" report_date <= '".$fl_end_report_date."'";
        }
		if(count($where_str_array) > 0){
			$where_str = implode(" and ",$where_str_array);
			$select_sql =  $select_sql." where ".$where_str;
		}
		$select_sql = $select_sql.' order by report_date DESC,start_time DESC,user_id ';
		//作成したSQL文をログに出力
		error_log($logheader.'  sql='.$select_sql); 
        $stmt1 = $dbh->prepare($select_sql);
        $stmt1->execute();
		$var_lists =  $stmt1->fetchAll(PDO::FETCH_ASSOC); //フィールド名だけで保存(index情報なし)
		$count = count($var_lists);
		error_log($logheader.' select dailyreports count ='.$count );
		for($i=0;$i<$count;$i++){
			$var_lists[$i]["id"] = strval($i+1);
		}
		$resp = "ok";
		$error_code = 0;
	}catch (Exception $e) {
		$resp = "ng";
		$count = 0;
		$error_code = -1;
   	}
   	//後処理
	$stmt = null;
	$dbh = null;	//DBクローズ
	$json_data = json_encode(compact("resp","error_code","count","var_lists"),JSON_UNESCAPED_UNICODE);
	echo $json_data;
?>

\rest_api\DR0010\DR0014_entry_dailyreport.php 新規追加

 <?php
 	//DR0014_entry_dailyreport.php
	//header("Content-Type: text/javascript; charset=utf-8");
	$myfilename = basename(__FILE__);	//自分自身のファイル名取得
	$userid = '';
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
	if($_SERVER["REQUEST_METHOD"] != "POST"){
	  //POST以外ははじく
	  error_log($logheader.' not POST method');
	  header("HTTP/1.0 404 Not Found");
	  return;
	}
	//指定パラメータで作業日報新規追加(INSERT)する
    //POST情報からパラメータ取得
	$accesskey = 0;
	if(isset($_POST['accesskey'])){
		 if(is_numeric($_POST['accesskey'])){
			$accesskey = $_POST['accesskey'];
			$error_flag = 1;
		}
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  accesskey not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
	if(isset($_POST['userid'])){
		$userid = $_POST['userid'];
		$error_flag = 1;
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  userid not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
	$job_info = "DR0014";
	if(isset($_POST['job_info'])){
		$job_info = $_POST['job_info'];
	}

	$report_date = $_POST['report_date'];
	$start_time = $_POST['start_time'];
	$end_time = $_POST['end_time'];
	
    
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)

	include('../../commonlib/svr_common_lib_v2.php');	//
	$config_obj = get_config_obj();
	//アクセスキーチェック
	if(Chk_AccessKey($accesskey)){
	}
	else{
		error_log($logheader.'  accesskey check error');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;

	}

	$edit_mode = "1";
	if(isset($_POST['edit_mode'])){
		$edit_mode = $_POST['edit_mode'];	//1:閲覧 2:更新 3:新規 4:削除
	}
	if( $edit_mode != "3"){
		error_log($logheader.'prm error  userid='.$userid.' edit_mode='.$edit_mode);
 		$resp = "ng";
		$error_code = -1;
		$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
		echo $json_data;
   		return;
	}
	//Form data
	if(isset($_POST['entry_datas'])){
		$entry_datas_str = $_POST['entry_datas'];
 		$entry_datas = json_decode($entry_datas_str ,true);
	}
    //
    //メインルーチン
    //
   	$config_obj = get_config_obj();
    //データベース接続する(MySQLDB)
    $dbh = mariadb_connect($config_obj,'app01','webix_webix');
    if($dbh == false){
    	//エラー応答
    	$resp = "ng";
		$error_code = -2;
 		$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
		echo $json_data;
		exit;
    }

  	try{
	
		$insert_sql1 = "INSERT INTO dailyreports(user_id,report_date,work_place,work_details,start_time,end_time,duration_hour,workers,memo,created_userid,updated_userid,created_on,updated_on)  VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)";
		$insert_stmt =  $dbh->prepare($insert_sql1);
		// 静的プレースホルダを指定
   		$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
   		// エラー発生時に例外を投げる
   		$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	
    	//トランザクション処理を開始
    	$dbh->beginTransaction();
		$resp = "ok";
		$error_code = 0;
		//dailyreportsに追加する情報
		$insert_stmt->bindValue(1,$userid);
		$insert_stmt->bindValue(2,$report_date);
		$insert_stmt->bindValue(3,$entry_datas["DR0011_work_place"]);
		$insert_stmt->bindValue(4,$entry_datas["DR0011_work_details"]);
		$insert_stmt->bindValue(5,$start_time);
		$insert_stmt->bindValue(6,$end_time);
		$insert_stmt->bindValue(7,$entry_datas["DR0011_duration_hour"]);
		$insert_stmt->bindValue(8,$entry_datas["DR0011_workers"]);
		$insert_stmt->bindValue(9,$entry_datas["DR0011_memo"]);
		$insert_stmt->bindValue(10,$userid);	//created_userid
		$insert_stmt->bindValue(11,$userid);	//updated_userid
		$insert_stmt->bindValue(12,date("Y-m-d H:i:s"));
		$insert_stmt->bindValue(13,date("Y-m-d H:i:s"));
		$insert_stmt->execute();
		error_log($logheader.' insert dailyreports report_date='.$report_date.' start_time='.$start_time.' end_time='.$end_time.' duration_hour='.$entry_datas["DR0011_duration_hour"]);
		$select_stmt1 = $dbh->prepare("SELECT LAST_INSERT_ID() as report_id");
		$select_stmt1->execute();
		$insert_code = $select_stmt1->fetchAll(PDO::FETCH_ASSOC); //フィールド名だけで保存(index情報なし)
		$report_id = $insert_code[0]["report_id"];
		error_log($logheader.' insert report_id:'.$report_id);
		$dbh->commit();
		error_log($logheader.' commit');
  	} catch(PDOException $e){
		error_log($logheader.'  捕捉した例外: '.$e->getMessage());	//例外発生時の処理(エラー情報をログに格納してエラー応答)
		$resp = "ng";
		$error_code = -1;
		$report_id = "0";
  	}
	$dbh = null;
	$json_data = json_encode(compact("resp","error_code","report_id"),JSON_UNESCAPED_UNICODE);
	echo $json_data;
?>

今回は、ここまでの紹介です。次回、スマホ画面を紹介します。

(補足)今回、画面を作成するうえで、データベースのテーブル定義を一部、変更しています。

CREATE TABLE `dailyreports` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id:自動連番',
`user_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'ユーザID',
`report_date` date DEFAULT NULL COMMENT '日付',
`work_place` varchar(255) NOT NULL DEFAULT '' COMMENT '作業場所',
`work_details` varchar(255) NOT NULL DEFAULT '' COMMENT '作業内容',
`start_time` time DEFAULT NULL COMMENT '開始時刻',
`end_time` time DEFAULT NULL COMMENT '終了時刻',
`duration_hour` varchar(16) NOT NULL DEFAULT '0.0' COMMENT '経過時間',
`photo_name` varchar(255) NOT NULL DEFAULT '' COMMENT '写真ファイル名',
`photo_folder` varchar(255) NOT NULL DEFAULT '' COMMENT '写真フォルダ名',
`workers` int(4) NOT NULL DEFAULT 0 COMMENT '作業人数',
`memo` varchar(255) NOT NULL DEFAULT '' COMMENT 'メモ',
`latitude` varchar(255) NOT NULL DEFAULT '' COMMENT '緯度',
`longitude` varchar(255) NOT NULL DEFAULT '' COMMENT '経度',
`created_userid` varchar(16) NOT NULL DEFAULT 'admin' COMMENT '作成ユーザ',
`updated_userid` varchar(16) NOT NULL DEFAULT 'admin' COMMENT '更新ユーザ',
`created_on` datetime DEFAULT NULL COMMENT '作成日時',
`updated_on` datetime DEFAULT NULL COMMENT '更新日時',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作業日報';

いいなと思ったら応援しよう!