/*
 *========================================================================
 *
 *   시스템명 : 요금징수 시스템
 *   파 일 명 : chk_chng.c
 *   작 성 자 : 조보용 (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.10
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

/*==========================================================================*/
/* Head  정의                                                               */
/*==========================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/msg.h>
#include <sys/types.h>
#include "hi_ctrl.h"
#include "snd_rcv_knd.h"
#include "hi_packet_format.h"
#include "file_lb.h"
#include "lb_func_list.h"
#include "func_list.h"

/*==========================================================================*/
/* 전역 변수 정의                                                           */
/*==========================================================================*/
extern FILE *debug;

 /*
 *========================================================================
 *
 *   함 수 명 : get_data_time()
 *   작 성 자 : 조보용 (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.10
 *   수 정 일 :
 *   설    명 : 수신 DATA 종별에 따라 발생 일시를 CHECK
 *
 *========================================================================
*/
int get_data_time(struct hi_packet_format *hpf, struct write_info *wi)
{
    struct    hi_rpr_data     *hrd;     //보수
    struct    hi_close_pass   *hcp;    //야간계수데이터
    struct    hi_wrk_start    *hws;     //근무개시보고
    struct    hi_hnd_data     *hhd;   //처리
    struct    hi_crd_hnd_data *hchd;   //카드처리
    struct    hi_wrk_end      *hwe;   //근무종료

    time_t    c_clock, n_day, p_day;
    struct    tm      dtm;
    int       hkind;

    char cyear[4], cmon[2], cday[2];

    memset(cyear, 0x00, sizeof(cyear));
    memset(cmon , 0x00, sizeof(cmon ));
    memset(cday , 0x00, sizeof(cday ));
    memset(wi, 0, sizeof(struct write_info));

    sprintf(cyear, "%04d", hi_comm_ctrl.cday.tm_year + 1900);
    sprintf(cmon , "%02d", hi_comm_ctrl.cday.tm_mon  + 1   );
    sprintf(cday , "%02d", hi_comm_ctrl.cday.tm_mday + 1   );

    hkind = lb_string2hexa(hpf->kind, 2);
    
    switch (hkind)
    {
        case NS_RPR_DATA :/* 보수 DATA */
            hrd = (struct hi_rpr_data *)hpf;
            e_memcpy(wi->year, hrd->year);
            e_memcpy(wi->mon , hrd->month);
            e_memcpy(wi->day , hrd->day);
            e_memcpy(wi->hr  , hrd->hour);
            e_memcpy(wi->min , hrd->min);
            e_memcpy(wi->sec , hrd->sec);
            break;
        case NS_CLOSE_PASS: /* 야간계수데이터 */
            hcp = (struct hi_close_lane_pass *)hpf;
            e_memcpy(wi->year, hcp->year );
            e_memcpy(wi->mon , hcp->month);
            e_memcpy(wi->day , hcp->day  );
            e_memcpy(wi->hr  , hcp->hour );
            e_memcpy(wi->min , hcp->min  );
            e_memcpy(wi->sec , hcp->sec  );
            break;
        case NS_WRK_START:/* 근무개시보고    */
            hws = (struct hi_wrk_start *)hpf;
            e_memcpy(wi->year, hws->wrk_start_year );
            e_memcpy(wi->mon , hws->wrk_start_month);
            e_memcpy(wi->day , hws->wrk_start_day  );
            e_memcpy(wi->hr  , hws->wrk_start_hour );
            e_memcpy(wi->min , hws->wrk_start_min  );
            e_memcpy(wi->sec , hws->wrk_start_sec  );
            break;
        case NS_HND_DATA:    /* 처리 DATA */
            hhd = (struct hi_out_way_hnd_data *)hpf;
            e_memcpy(wi->year, hhd->hnd_info.hnd_year );
            e_memcpy(wi->mon , hhd->hnd_info.hnd_month);
            e_memcpy(wi->day , hhd->hnd_info.hnd_day  );
            e_memcpy(wi->hr  , hhd->hnd_info.hnd_hour );
            e_memcpy(wi->min , hhd->hnd_info.hnd_min  );
            e_memcpy(wi->sec , hhd->hnd_info.hnd_sec  );
            break;
        case NS_CRD_HND_DATA:/* 카드처리 DATA */
            hchd = (struct hi_in_way_hnd_data *)hpf;
            e_memcpy(wi->year, hchd->hnd_year );
            e_memcpy(wi->mon , hchd->hnd_month);
            e_memcpy(wi->day , hchd->hnd_day  );
            e_memcpy(wi->hr  , hchd->hnd_hour );
            e_memcpy(wi->min , hchd->hnd_min  );
            e_memcpy(wi->sec , hchd->hnd_sec  );
            break;
        case NS_WRK_END:/* 근무 종료 */
            hwe = (struct hi_in_way_wrk_end *)hpf;
            e_memcpy(wi->year, hwe->wrk_end_year );
            e_memcpy(wi->mon , hwe->wrk_end_month);
            e_memcpy(wi->day , hwe->wrk_end_day  );
            e_memcpy(wi->hr  , hwe->wrk_end_hour );
            e_memcpy(wi->min , hwe->wrk_end_min  );
            e_memcpy(wi->sec , hwe->wrk_end_sec  );
            break;
        default:
            return (0);
    }

    if (atoi((const char *)wi->year) == 0)
    {
        e_memcpy(wi->year, cyear);
        if (memcmp(wi->mon, cmon, sizeof(cmon)) > 0)
            sprintf((char *)wi->year, "%04d", atoi(cyear) - 1);
    }

    memset(&dtm, 0, sizeof(struct tm));
    dtm.tm_year = atoi((const char *)wi->year)-1900;
    dtm.tm_mon  = atoi((const char *)wi->mon)-1;
    dtm.tm_mday = atoi((const char *)wi->day);
    dtm.tm_hour = 1;
    c_clock = mktime(&dtm);
    n_day = hi_comm_ctrl.time + (24*60*60);
    p_day = hi_comm_ctrl.time - (7*24*60*60);
    

    if (c_clock > n_day || c_clock < p_day)
        return (-1);
    return(0);
}

/*****************************************************************************/
/* wkr_no2wrk_stat()    근무자 번호에의한 근무상태 정보 산출                 */
/* natoi()              N-BYTE STRING을 정수형으로 변환                      */
/* itona()              정수형을 N-BYTE STRING으로 변환                      */
/* err_log()            오류 MESSAGE LOGING 처리                             */
/*****************************************************************************/

 /*
 *========================================================================
 *
 *   함 수 명 : wkr_no2wrk_stat()
 *   작 성 자 : 조보용 (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.10
 *   수 정 일 :
 *   설    명 : 근무자번호에 따른 근무 형태 CHECK
 *
 *========================================================================
*/
int wkr_no2wrk_stat(uchar *wrkr_no)
{
    char    user_id[16];
    int    wrkr_num;

    memcpy(user_id, wrkr_no, 4);
    user_id[4] = '\0';
    wrkr_num = natoi(user_id, 4);

    if (wrkr_num >= 5000 && wrkr_num <= 5999)
        return (WS_ADMIN);

    if (wrkr_num >= 6000 && wrkr_num <= 6999)
        return (WS_RPR);
    else
        return(WS_NORMAL);

    if ((strncmp(user_id, "A001", 4) >= 0) && (strncmp(user_id, "FFFF", 4) <= 0))
        return (WS_NORMAL);
    return (WS_NONE);
}

 /*
 *========================================================================
 *
 *   함 수 명 : natoi()
 *   작 성 자 : 조보용 (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.10
 *   수 정 일 :
 *   설    명 : N BYTEs ACII CHAR STRING을 INT 형으로 변환
 *
 *========================================================================
*/
int natoi(char *str, int len)
{
    char    temp[128];

    memcpy(temp, str, len);
    temp[len] = '\0';
    return (atoi(temp));
}

 /*
 *========================================================================
 *
 *   함 수 명 : itona()
 *   작 성 자 : 조보용 (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.10
 *   수 정 일 :
 *   설    명 : INT형을 N BYTEs ACII CHAR STRING으로 변환
 *
 *========================================================================
*/
int itona(char *buff, int val, int len)
{
    char    temp[128], form_b[32];

    sprintf(form_b, "%%0%dd", len);
    sprintf(temp, form_b, val);
    memcpy(buff, temp, len);
    return (0);
}

 /*
 *========================================================================
 *
 *   함 수 명 : err_log()
 *   작 성 자 : 조보용 (baarong@neighbor21.co.kr)
 *   작 성 일 : 2019.05.10
 *   수 정 일 :
 *   설    명 : LOGGING ERROR MESSAGE
 *
 *========================================================================
*/
int err_log(uchar *msg, int delay)
{
    time_t    tclock;
    struct    tm *tm;
    char    prog[32];

    tclock = time(0);
    tm     = localtime(&tclock);

    lane_log( " [%02d:%02d] (chk_chng.c) 메시지[%s]\n", tm->tm_hour, tm->tm_min, msg);
    sprintf(prog, "tcslcp%.2s%02d", hi_comm_ctrl.bas_tbl.plz_id, hi_comm_ctrl.lane_no);
    lb_err_log(prog, (char *)msg, 0x03);
    if (delay) sleep(1);
    return (0);
}

