#include #include #include #include #include #include #include #include #include #include "./include/db_adaptor.h" extern _db_cfg db_cfg; #define ARRAY_SIZE 1024 #define MAX_PREFIX_ROW 2048 #define PREFIX_TABLE_FILE "/usr/local/agt/etc/tariff/prefix_table.txt" extern char *GetAsciiTime(); extern void crm_prov_hlr_auc_vms_account(char sub_data[][ARRAY_SIZE]); extern int GetMonthDay(); extern int pstn_get_krone_pair_resource_id(); extern int pstn_get_ssentry_resource_id(); extern int dba_db_sql_query_only_execute_real(const char *sql, char result[][1024], int MAX_ROWS, int MAX_FIELDS); typedef enum CRM_CLI_ST{ CRM_CLI_ST_READ_CMD, CRM_CLI_ST_HSS_PROV, CRM_CLI_ST_HSS_PROV_RES, CRM_CLI_ST_AUC_PROV, CRM_CLI_ST_AUC_PROV_RES, CRM_CLI_ST_OCS_PROV, CRM_CLI_ST_OCS_PROV_RES, CRM_CLI_ST_VMS_PROV, CRM_CLI_ST_VMS_PROV_RES, CRM_CLI_ST_PCRF_PROV, CRM_CLI_ST_PCRF_PROV_RES, CRM_CLI_ST_PSTN_PROV, CRM_CLI_ST_PSTN_PROV_RES, }_CRM_CLI_ST; typedef enum CRM_SCAN_ST{ CRM_SCAN_ST_NULL, CRM_SCAN_ST_START, CRM_SCAN_ST_END, }_CRM_SCAN_ST; typedef struct dba_crm_thread { int state; int state_timer; int sub_state; int sub_state_timer; int key_id; int resend; }_dba_crm_thread; _dba_crm_thread crm_smcli_thread, crm_scan_bundle_thread; /*--- to check if any pending subs, provisoning command to AUC, HLR/HSS, OCS, VMS or PSTN the cli command is configurable -----*/ typedef enum cmd_type { CT_CREATE_NA, CT_CREATE_SUB, CT_REPLACE_SUB, CT_SUSPEND_ACCOUNT, CT_DISABLE_ACCOUNT, CT_RESUME_ACCOUNT, CT_DISCONNECT_ACCOUNT, CT_UPDATE_SUB, CT_MAX, }cmd_type; typedef enum node_type { NT_NA, NT_OCS, NT_HSS, NT_AUC, NT_VMS, NT_PSTN, NT_MSAN, NT_ADSL, NT_PCRF, NT_MAX, }node_type; char node_name[NT_MAX][128]={"NULL","OCS","HSS","AUC","VMS","PSTN","MSAN","ADSL","PCRF"}; /*-------------------------------------------------*/ int dba_crm_dump_prefix_table_into_file() { char sql[256]; int rc; FILE *fp=NULL; sprintf(sql, "SELECT area_code, area_name FROM config_area"); fp = fopen(PREFIX_TABLE_FILE, "w"); rc = dba_db_sql_execute_crm(sql, NULL, MAX_PREFIX_ROW, 3, 1, fp); if(rc != 0) { dba_crm_set_prefix_table_created(); } if(fp != NULL) fclose(fp); return 1; } int dba_crm_get_product_rent(int from, int package_id) { char sql[1024]; char rent_des[1][ARRAY_SIZE]; int rent = 0; int rc; /* sprintf(sql, "SELECT f.FEE_VALUE rentValueFROM tb_prd_ofr_detail_inst_551 d, tb_prd_ofr_inst_551 i, tb_prd_ofr o, tb_prd_prd_once_fee f\ WHERE d.PRD_INST_ID = %d\ AND d.EXP_DATE > CURRENT_TIMESTAMP AND d.EFF_DATE <= CURRENT_TIMESTAMP AND i.OFR_INST_ID = d.OFR_INST_ID \ AND o.OFR_ID = i.OFR_ID AND o.OFR_TYPE_ID = 1 AND f.PRD_ID = o.OFR_ID AND f.TYPE = 2 AND f.FEE_TYPE = 5", package_id); */ sprintf(sql, "SELECT f.FEE_VALUE rentValue FROM tb_prd_prd_once_fee f WHERE f.PRD_ID = %d AND f.TYPE = 2 AND f.FEE_TYPE = 5", package_id); if(from == 0)//crm rc = dba_db_sql_execute_crm(sql, rent_des, 1, 1, 0, NULL); else rc = dba_db_sql_execute_ocs(sql, rent_des, 1, 1, 0, NULL); if(rc != 0) { if(rent_des[0][0] == 0) rent = 0; else rent = atoi(rent_des[0]); } return rent; } int dba_crm_get_vc_key_with_seq(int seq_id, char *result) { char sql[256]; char key[1][ARRAY_SIZE]; int rc; sprintf(sql, "SELECT IMPORT_KEY from card_seq_info where SEQ_ID=%d", seq_id); rc = dba_db_sql_execute_ocs(sql, key, 1, 1, 0, NULL); if(rc != 0) { strcpy(result, key[0]); } return rc; } int dba_crm_get_vc_info_with_enc_pwd(const char *enc_vc_pwd, char result[][ARRAY_SIZE]) { char sql[256]; int rc; sprintf(sql, "SELECT BALANCE, STATE, UNIX_TIMESTAMP(EXP_DATE) from card_info_20c where PASSWD='%s'", enc_vc_pwd); rc = dba_db_sql_execute_ocs(sql, result, 3, 64, 0, NULL); return rc; } int dba_crm_get_vc_validity_days(int face_value) { char sql[256]; char valid_day_buf[1][ARRAY_SIZE]; int rc, valid_day=1; sprintf(sql, "select VALID_EXTEND from tb_bil_recharge_valid where min_value=%d", face_value); rc = dba_db_sql_execute_ocs(sql, valid_day_buf, 1, 1, 0, NULL); if(rc != 0) { valid_day = atoi(valid_day_buf[0]); } return valid_day; } int dba_crm_update_vc_info_as_used_with_enc_pwd(const char *msisdn, const char *enc_vc_pwd, const char *status) { char sql[256]; int rc; sprintf(sql, "UPDATE card_info_20c set STATE='%s', STATE_DATE=NOW() where PASSWD='%s'", status, enc_vc_pwd); // sprintf(sql, "UPDATE card_info_20c set STATE='%s', STATE_DATE=NOW(), SERVICE_NBR='%s' where PASSWD='%s'", status, enc_vc_pwd, msisdn); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } int dba_crm_insert_recharge_record_in_db(long account_id, const char *msisdn, int pay_amount, int balance) { char sql[512]; char acct_id[1][ARRAY_SIZE]; int op=17; char state_done[]={"C0C"}; int rc; sprintf(sql, "select acct_id from tb_prd_prd_inst_551 where PRD_INST_STAS_ID IN ('1001','1201') and service_nbr='%s'", msisdn); rc = dba_db_sql_execute_ocs(sql, acct_id, 1, 1); if(rc != 0) sprintf(sql, "INSERT INTO tb_bil_pay_log_551 set OPER_LATN_ID=551, OPERATION_TYPE=%d, STATE='%s', CREATED_DATE=NOW(), STATE_DATE=NOW(), OBJ_ID='%s', OBJ_TYPE=0, \ PRE_BALANCE=%d, PAY_AMOUNT=%d, LEFT_BALANCE=%d, SERVICE_NBR='%s', PAY_METHOD=17", op, state_done, acct_id[0], balance, pay_amount, balance+pay_amount, msisdn); else sprintf(sql, "INSERT INTO tb_bil_pay_log_551 set OPER_LATN_ID=551, OPERATION_TYPE=%d, STATE='%s', CREATED_DATE=NOW(), STATE_DATE=NOW(), OBJ_ID=%ld, OBJ_TYPE=0, \ PRE_BALANCE=%d, PAY_AMOUNT=%d, LEFT_BALANCE=%d, SERVICE_NBR='%s', PAY_METHOD=17", op, state_done, account_id, balance, pay_amount, balance+pay_amount, msisdn); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } int dba_verify_vc_with_pwd(const char *vc_pwd, char card_info[][ARRAY_SIZE], char *enc_password) { char enc_vc_pwd[ARRAY_SIZE], asc_vc_pwd_buf[ARRAY_SIZE]; char md5_key[ARRAY_SIZE]={"11111111"}; char vc_info[32][ARRAY_SIZE]; /* the MD5 key is fetch with vc sequnce info: 2/5/8/11 digits of the input PWD */ int seq_id = 0; int len; int i; int rc = 0; if(vc_pwd == NULL || enc_vc_pwd == NULL) return 0; len = strlen(vc_pwd); if(len < 12) return 0; seq_id = (vc_pwd[2] - 0x30)*1000 + (vc_pwd[5] - 0x30)*100 + (vc_pwd[8] - 0x30)*10 + (vc_pwd[11] - 0x30)*1; if(dba_crm_get_vc_key_with_seq(seq_id, md5_key) == 0) { myLOG_D("DBA: Can't get key with seq_id=%d\n", seq_id); return 0; } else { myLOG_D("DBA: Get key=%s with seq_id=%d\n", md5_key, seq_id) ; } hmac_md5(vc_pwd, strlen(vc_pwd), md5_key, 8, enc_vc_pwd); len = 16; BcdToAscii(asc_vc_pwd_buf, enc_vc_pwd, len*2); printf("Enc pwd: %s\n", asc_vc_pwd_buf); rc = dba_crm_get_vc_info_with_enc_pwd(asc_vc_pwd_buf, vc_info); if(rc != 0) { strcpy(enc_password, asc_vc_pwd_buf); if(card_info != NULL) { for(i=0; i<3; i++) strcpy(card_info[i], vc_info[i]); } } return rc; } static int log_file_counter=0; static char sql_head_of_data[4096], sql_head_of_cs[4096]; static char date_time_str[24]; void get_cur_data_time_str() { time_t time_ptr; struct tm *tmp_ptr = NULL; int year,month,day,hour,minute,sec; time(&time_ptr); tmp_ptr = localtime(&time_ptr); year = tmp_ptr->tm_year + 1900; month = tmp_ptr->tm_mon + 1; day = tmp_ptr->tm_mday; hour = tmp_ptr->tm_hour; minute = tmp_ptr->tm_min; sec = tmp_ptr->tm_sec; sprintf(date_time_str, "%04d%02d%02d%02d%02d%02d",year,month,day,hour,minute,sec); return 0; } void dba_init_tariff_sql() { int holidy_benefis_support = 1; if(holidy_benefis_support == 0) { strcpy(sql_head_of_data, "SELECT \ IFNULL(hr.holiday_discount,100) as holiday_discount, \ g.TARIFF_ID, \ p.PRD_INST_ID, \ b.OFR_INST_ID, \ rr.FREE_VALUE AS ratableValue, \ rr.VALUE usedRatable, \ g.ACCT_ITEM_TYPE_ID acctItemType, \ g.SCALED_RATE_VALUE_ID fee, \ g.rate_unit rateUnit, \ IFNULL( rr.id, 0 ) \ FROM \ tb_prd_ofr_detail_inst_551 a \ INNER JOIN tb_prd_prd_inst_551 p ON a.ofr_detail_inst_ref_id = p.PRD_INST_ID \ INNER JOIN tb_prd_ofr_inst_551 b ON a.ofr_inst_id = b.ofr_inst_id \ INNER JOIN tb_prd_ofr c ON b.ofr_id = c.ofr_id \ INNER JOIN tb_bil_pricing_combine_group d ON c.pricing_plan_id = d.pricing_plan_id \ INNER JOIN tb_bil_pricing_combine_gp_list e ON d.pricing_combine_group_id = e.pricing_combine_group_id \ INNER JOIN tb_bil_pricing_section f ON e.event_pricing_strategy_id = f.event_pricing_strategy_id \ AND f.TARIFF_ID \ IS NOT NULL INNER JOIN tb_bil_tariff g ON f.pricing_section_id = g.pricing_section_id \ INNER JOIN tb_bil_evt_pricing_strategy h ON e.event_pricing_strategy_id = h.event_pricing_strategy_id \ LEFT JOIN ratable_history rr ON rr.OWNER_ID = p.PRD_INST_ID \ AND rr.PRICING_SUB_SECTION_ID = g.PRICING_SECTION_ID \ " ); strcpy(sql_head_of_cs, "SELECT \ IFNULL(hr.holiday_discount,100) as holiday_discount, \ g.TARIFF_ID, \ p.PRD_INST_ID, \ b.OFR_INST_ID, \ rr.FREE_VALUE AS ratableValue, \ rr.VALUE usedRatable, \ g.ACCT_ITEM_TYPE_ID acctItemType, \ g.SCALED_RATE_VALUE_ID fee, \ g.rate_unit rateUnit, \ IFNULL( rr.id, 0 ) \ FROM \ tb_prd_ofr_detail_inst_551 a \ INNER JOIN tb_prd_prd_inst_551 p ON a.ofr_detail_inst_ref_id = p.PRD_INST_ID \ INNER JOIN tb_prd_ofr_inst_551 b ON a.ofr_inst_id = b.ofr_inst_id \ INNER JOIN tb_prd_ofr c ON b.ofr_id = c.ofr_id \ INNER JOIN tb_bil_pricing_combine_group d ON c.pricing_plan_id = d.pricing_plan_id \ INNER JOIN tb_bil_pricing_combine_gp_list e ON d.pricing_combine_group_id = e.pricing_combine_group_id \ INNER JOIN tb_bil_pricing_section f ON e.event_pricing_strategy_id = f.event_pricing_strategy_id \ AND f.TARIFF_ID \ IS NOT NULL INNER JOIN tb_bil_tariff g ON f.pricing_section_id = g.pricing_section_id \ INNER JOIN tb_bil_evt_pricing_strategy h ON e.event_pricing_strategy_id = h.event_pricing_strategy_id \ INNER JOIN TB_BIL_PRICING_AREA ar ON ar.STRATEGY_ID = h.event_pricing_strategy_id \ INNER JOIN config_area ca ON ca.area_id = ar.area_id \ LEFT JOIN ratable_history rr ON rr.OWNER_ID = p.PRD_INST_ID \ AND rr.PRICING_SUB_SECTION_ID = g.PRICING_SECTION_ID \ " ); } else { strcpy(sql_head_of_data, "SELECT \ IFNULL(hr.holiday_discount,100) as holiday_discount, \ g.TARIFF_ID, \ p.PRD_INST_ID, \ b.OFR_INST_ID, \ rr.FREE_VALUE AS ratableValue, \ rr.VALUE usedRatable, \ g.ACCT_ITEM_TYPE_ID acctItemType, \ g.SCALED_RATE_VALUE_ID fee, \ g.rate_unit rateUnit, \ IFNULL( rr.id, 0 ) \ FROM \ tb_prd_ofr_detail_inst_551 a \ INNER JOIN tb_prd_prd_inst_551 p ON a.ofr_detail_inst_ref_id = p.PRD_INST_ID \ INNER JOIN tb_prd_ofr_inst_551 b ON a.ofr_inst_id = b.ofr_inst_id \ INNER JOIN tb_prd_ofr c ON b.ofr_id = c.ofr_id \ INNER JOIN tb_bil_pricing_combine_group d ON c.pricing_plan_id = d.pricing_plan_id \ INNER JOIN tb_bil_pricing_combine_gp_list e ON d.pricing_combine_group_id = e.pricing_combine_group_id \ INNER JOIN tb_bil_pricing_section f ON e.event_pricing_strategy_id = f.event_pricing_strategy_id \ AND f.TARIFF_ID \ IS NOT NULL INNER JOIN tb_bil_tariff g ON f.pricing_section_id = g.pricing_section_id \ INNER JOIN tb_bil_evt_pricing_strategy h ON e.event_pricing_strategy_id = h.event_pricing_strategy_id \ LEFT JOIN ratable_history rr ON rr.OWNER_ID = p.PRD_INST_ID \ AND rr.PRICING_SUB_SECTION_ID = g.PRICING_SECTION_ID \ LEFT JOIN (SELECT t.HOLIDAY_GROUP FROM ( \ SELECT hd.HOLIDAY_GROUP, hd.HOLIDAY_PRIORITY, COUNT(1) AS HOLIDAY_COUNT FROM tb_bil_holiday hd \ WHERE ((hd.HOLIDAY_TYPE = '02' AND hd.HOLIDAY_BEGIN_DATE >= (WEEKDAY(SYSDATE()) + 1) AND hd.holiday_end_date <= (WEEKDAY(SYSDATE()) + 1)) \ OR (hd.holiday_type = '03' AND DATE_FORMAT(SYSDATE(),'%m%d') >= DATE_FORMAT(CONCAT('2020', hd.HOLIDAY_BEGIN_DATE), '%m%d') AND DATE_FORMAT(SYSDATE(),'%m%d') <= DATE_FORMAT(CONCAT('2020', hd.holiday_end_date), '%m%d')) \ OR (hd.holiday_type = '04' AND DATE_FORMAT(CURTIME(), '%H%i%s') >= DATE_FORMAT(STR_TO_DATE(CONCAT('20200101', hd.HOLIDAY_BEGIN_DATE), '%Y%m%d%H%i%s'),'%H%i%s') \ AND DATE_FORMAT(CURTIME(), '%H%i%s') <= DATE_FORMAT(STR_TO_DATE(CONCAT('20200101', hd.holiday_end_date), '%Y%m%d%H%i%s'),'%H%i%s')) \ and hd.STATE='L0R') \ GROUP BY hd.HOLIDAY_PRIORITY, hd.HOLIDAY_GROUP) t \ WHERE t.HOLIDAY_COUNT = (SELECT COUNT(1) FROM tb_bil_holiday w WHERE t.HOLIDAY_GROUP = w.HOLIDAY_GROUP) \ ORDER BY t.HOLIDAY_PRIORITY LIMIT 1) hd ON 1 = 1 \ LEFT JOIN tb_bil_holiday_rel hr ON ( hr.state='1' and hr.tariff_id = g.TARIFF_ID AND g.tariff_seq = hr.tariff_seq AND hd.HOLIDAY_GROUP = hr.holiday_group ) \ " ); strcpy(sql_head_of_cs, "SELECT \ IFNULL(hr.holiday_discount,100) as holiday_discount, \ g.TARIFF_ID, \ p.PRD_INST_ID, \ b.OFR_INST_ID, \ rr.FREE_VALUE AS ratableValue, \ rr.VALUE usedRatable, \ g.ACCT_ITEM_TYPE_ID acctItemType, \ g.SCALED_RATE_VALUE_ID fee, \ g.rate_unit rateUnit, \ IFNULL( rr.id, 0 ) \ FROM \ tb_prd_ofr_detail_inst_551 a \ INNER JOIN tb_prd_prd_inst_551 p ON a.ofr_detail_inst_ref_id = p.PRD_INST_ID \ INNER JOIN tb_prd_ofr_inst_551 b ON a.ofr_inst_id = b.ofr_inst_id \ INNER JOIN tb_prd_ofr c ON b.ofr_id = c.ofr_id \ INNER JOIN tb_bil_pricing_combine_group d ON c.pricing_plan_id = d.pricing_plan_id \ INNER JOIN tb_bil_pricing_combine_gp_list e ON d.pricing_combine_group_id = e.pricing_combine_group_id \ INNER JOIN tb_bil_pricing_section f ON e.event_pricing_strategy_id = f.event_pricing_strategy_id \ AND f.TARIFF_ID \ IS NOT NULL INNER JOIN tb_bil_tariff g ON f.pricing_section_id = g.pricing_section_id \ INNER JOIN tb_bil_evt_pricing_strategy h ON e.event_pricing_strategy_id = h.event_pricing_strategy_id \ INNER JOIN TB_BIL_PRICING_AREA ar ON ar.STRATEGY_ID = h.event_pricing_strategy_id \ INNER JOIN config_area ca ON ca.area_id = ar.area_id \ LEFT JOIN ratable_history rr ON rr.OWNER_ID = p.PRD_INST_ID \ AND rr.PRICING_SUB_SECTION_ID = g.PRICING_SECTION_ID \ LEFT JOIN (SELECT t.HOLIDAY_GROUP FROM ( \ SELECT hd.HOLIDAY_GROUP, hd.HOLIDAY_PRIORITY, COUNT(1) AS HOLIDAY_COUNT FROM tb_bil_holiday hd \ WHERE ((hd.HOLIDAY_TYPE = '02' AND hd.HOLIDAY_BEGIN_DATE >= (WEEKDAY(SYSDATE()) + 1) AND hd.holiday_end_date <= (WEEKDAY(SYSDATE()) + 1)) \ OR (hd.holiday_type = '03' AND DATE_FORMAT(SYSDATE(),'%m%d') >= DATE_FORMAT(CONCAT('2020', hd.HOLIDAY_BEGIN_DATE), '%m%d') AND DATE_FORMAT(SYSDATE(),'%m%d') <= DATE_FORMAT(CONCAT('2020', hd.holiday_end_date), '%m%d')) \ OR (hd.holiday_type = '04' AND DATE_FORMAT(CURTIME(), '%H%i%s') >= DATE_FORMAT(STR_TO_DATE(CONCAT('20200101', hd.HOLIDAY_BEGIN_DATE), '%Y%m%d%H%i%s'),'%H%i%s') \ AND DATE_FORMAT(CURTIME(), '%H%i%s') <= DATE_FORMAT(STR_TO_DATE(CONCAT('20200101', hd.holiday_end_date), '%Y%m%d%H%i%s'),'%H%i%s')) \ and hd.STATE='L0R') \ GROUP BY hd.HOLIDAY_PRIORITY, hd.HOLIDAY_GROUP) t \ WHERE t.HOLIDAY_COUNT = (SELECT COUNT(1) FROM tb_bil_holiday w WHERE t.HOLIDAY_GROUP = w.HOLIDAY_GROUP) \ ORDER BY t.HOLIDAY_PRIORITY LIMIT 1) hd ON 1 = 1 \ LEFT JOIN tb_bil_holiday_rel hr ON ( hr.state='1' and hr.tariff_id = g.TARIFF_ID AND g.tariff_seq = hr.tariff_seq AND hd.HOLIDAY_GROUP = hr.holiday_group ) \ " ); } } int dba_query_tariff_record(char *msisdn, int call_type, char *called_number, char tariff[][1024]) { char sql_head[4096], sql_tail[2048], sql_tail1[2048]; char sql[8192]; int rc; int now_sec; struct timeval tv; gettimeofday(&tv, NULL); now_sec = tv.tv_sec % 86400; if(call_type==2)//data { sprintf(sql_tail, " WHERE g.MEASURE_DOMAIN = '%02d' \ AND p.PRD_INST_STAS_ID = '1001' \ AND a.EXP_DATE > SYSDATE( ) \ AND ((c.OFR_TYPE_ID = '3' AND rr.OFR_INST_ID = b.OFR_INST_ID AND rr.ID > 0 ) OR ( c.ofr_type_id = '1' )) \ AND TIME_TO_SEC( g.START_REF_VALUE ) <= %d AND TIME_TO_SEC( g.END_REF_VALUE ) >= %d \ AND p.SERVICE_NBR = '%s' ", call_type, now_sec, now_sec, msisdn); strcpy(sql_tail1, "AND ((rr.`ID` > 0 AND STR_TO_DATE(rr.END_TIME, '%Y%m%d%H%i%s') >= SYSDATE() AND rr.`FREE_VALUE` > rr.`VALUE`) OR (rr.`ID` IS NULL)) \ ORDER BY c.CALC_PRIORITY, c.OFR_TYPE_ID DESC,h.EVENT_PRIORITY DESC, a.CRT_DATE, rr.FREE_VALUE ASC \ LIMIT 1" ); sprintf(sql, "%s%s%s", sql_head_of_data, sql_tail, sql_tail1); } else { sprintf(sql_tail, " WHERE ca.area_code = '%s' \ AND g.MEASURE_DOMAIN = '%02d' \ AND p.PRD_INST_STAS_ID = '1001' \ AND a.EXP_DATE > SYSDATE( ) \ AND ((c.OFR_TYPE_ID = '3' AND rr.OFR_INST_ID = b.OFR_INST_ID AND rr.ID > 0 ) OR ( c.ofr_type_id = '1' )) \ AND TIME_TO_SEC( g.START_REF_VALUE ) <= %d AND TIME_TO_SEC( g.END_REF_VALUE ) >= %d \ AND p.SERVICE_NBR = '%s' ", called_number, call_type, now_sec, now_sec, msisdn); strcpy(sql_tail1, "AND ((rr.`ID` > 0 AND STR_TO_DATE(rr.END_TIME, '%Y%m%d%H%i%s') >= SYSDATE() AND rr.`FREE_VALUE` > rr.`VALUE`) OR (rr.`ID` IS NULL)) \ ORDER BY c.CALC_PRIORITY DESC,h.EVENT_PRIORITY DESC, a.CRT_DATE, rr.FREE_VALUE ASC \ LIMIT 1"); sprintf(sql, "%s%s%s", sql_head_of_cs, sql_tail, sql_tail1); } if(0) { FILE *fp=NULL; char file_name[128]; sprintf(file_name,"./log/sql_%04d.txt", log_file_counter++%1000); fp = fopen(file_name,"w"); fprintf(fp,"%s", sql); fclose(fp); } if(0) { rc= dba_db_sql_query_only_execute_real(sql, tariff, 1, 10); } else { rc = dba_db_sql_execute_ocs(sql, tariff, 1, 10, 0, NULL); } return rc; } int dba_update_plan_info(int service_type, int plan_id, long long plan_used_value, int update_expiry_date, long long plan_total_value) { char sql[8192]; int rc; if(update_expiry_date) { //get_cur_data_time_str(); //sprintf(sql, "UPDATE ratable_history SET `VALUE`=%lld, END_TIME='%s' WHERE ID=%d", plan_total_value, date_time_str, plan_id);// 20200831000000 sprintf(sql, "UPDATE ratable_history SET `VALUE`=%lld WHERE ID=%d", plan_total_value, plan_id); } else { sprintf(sql, "UPDATE ratable_history SET `VALUE`=%lld WHERE ID=%d", plan_used_value, plan_id); } rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } int dba_update_plan_data_info(int plan_id, long long volume_used_value, int op_flag) { char sql[8192]; int rc; if(op_flag == 0) sprintf(sql, "UPDATE ratable_history SET `VALUE`= VALUE+%lld WHERE ID=%d", volume_used_value, plan_id); else sprintf(sql, "UPDATE ratable_history SET `VALUE`= VALUE-%lld WHERE ID=%d", volume_used_value, plan_id); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } int dba_send_plan_notification_info(int account_id, int plan_id, int service_type, int update_expiry_date, int used_rate) { char sql[8192]; int rc; int rate = used_rate; int rate_type = service_type; if(update_expiry_date) { rate = 100; } /* if(rate_type == 2) rate_type = 3; else if(rate_type == 3) rate_type = 2; */ sprintf(sql, "INSERT into tb_sync_msg SET msg_type=2, rate_type=%d, acct_id=%d, rate_value=%d, state=1, ofr_inst_id=%d" ,rate_type, account_id, rate,plan_id); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } int dba_send_expired_notification_info(int account_id, int plan_id, long expired_date) { char sql[8192]; int rc; sprintf(sql, "INSERT into tb_sync_msg SET msg_type=1, acct_id=%d, ofr_inst_id=%d, exp_date=FROM_UNIXTIME(%ld), state=1", account_id, plan_id, expired_date); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } /* typedef enum account_status { T_FRESH=0, T_NORMAL, T_SUSPEND, T_BLACKLIST, T_RELEASED, T_OPRTRIAL, T_DISABLE, MAX_USER_TYPE, T_EXTERNAL=10, } _account_status; */ int dba_update_user_status_in_crm(int account_id, int account_status) { char sql[1024]; int status_in_crm=1001; int rc; switch(account_status) { case 1: status_in_crm = 1001; break; case 2: status_in_crm = 1205; break; case 4: status_in_crm = 1101; break; case 6: status_in_crm = 1202; break; } if(0) { sprintf(sql, "update tb_prd_prd_inst_551 set PRD_INST_STAS_ID=%d, MOD_DATE=NOW() where ACCT_ID=%d", status_in_crm, account_id); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); } if(account_status == 4)//disconnection { if(1) { sprintf(sql, "INSERT INTO tb_mobile_disc_cmd set ACCT_ID=%d, ACCT_STATUS=0, UPDATE_DATE=NOW()", account_id); rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); } mobile_delete_handle(account_id); } } int dba_send_update_hlr_tele_service(char *msisdn, int account_status) { char cmd_update_user[1024]; char sql[1024]; int rc; switch(account_status) { case 1://normal sprintf(cmd_update_user,"modify subscriber -msisdn %s -odb disable -telephony enable -sms Both", msisdn); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_RESUME_ACCOUNT, NT_HSS, node_name[NT_HSS], msisdn, cmd_update_user); break; case 2: //suspended sprintf(cmd_update_user,"modify subscriber -msisdn %s -odb enable -baoc enable -telephony enable - sms Mobile_Term", msisdn); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_SUSPEND_ACCOUNT, NT_HSS, node_name[NT_HSS], msisdn, cmd_update_user); break; case 6://Disable sprintf(cmd_update_user,"modify subscriber -msisdn %s-odb disable -telephony disable -sms Mobile_Term", msisdn); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISABLE_ACCOUNT, NT_HSS, node_name[NT_HSS], msisdn, cmd_update_user); break; case 4: //Disconnect sprintf(cmd_update_user,"delete subscriber -msisdn %s ", msisdn); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_HSS, node_name[NT_HSS], msisdn, cmd_update_user); break; } rc = dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); return rc; } int dba_crm_read_bundle_info(int sn) { char sql[8192]; int rc; char bundle_info[20][1024]; sprintf(sql, "SELECT i.OFR_INST_ID, a.ACCT_ID, p.SERVICE_NBR, i.EXP_DATEFROM tb_prd_ofr_detail_inst_551 i, \ tb_prd_prd_inst_551 p, tb_prd_ofr o, tb_bil_acct_551 a WHERE o.OFR_TYPE_ID = 3 \ AND p.PRD_INST_STAS_ID='1001' AND p.PRD_INST_ID = i.OFR_DETAIL_INST_REF_ID \ AND a.ACCT_ID = p.ACCT_ID AND a.PREPAY = 1 AND o.OFR_ID = i.OFR_ID AND datediff( i.EXP_DATE, CURRENT_TIME)=3 limit %d,1", sn); rc = dba_db_sql_execute_crm(sql, bundle_info, 1, 10, 0, NULL); if(rc != 0) { sprintf(sql, "INSERT into tb_sync_msg SET msg_type=1, state=1, acct_id=%d, ofr_inst_id=%d" ,atoi(bundle_info[1]), atoi(bundle_info[0])); dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); } return rc; } int dba_crm_scan_bundle_thread(unsigned int now_sec) { static int scan_limit_counter = 1; int state = 0, timer = 0; int rc=0; char result[256]; state = crm_scan_bundle_thread.state; switch(state) { case CRM_SCAN_ST_NULL: if((now_sec-28800)%86400<20)//08:00:20 AM start to scan { crm_scan_bundle_thread.state = CRM_SCAN_ST_START; scan_limit_counter = 1; } break; case CRM_SCAN_ST_START: rc = dba_crm_read_bundle_info(scan_limit_counter++); if(rc == 0) { crm_scan_bundle_thread.state = CRM_SCAN_ST_END; crm_scan_bundle_thread.state_timer = 0; } break; case CRM_SCAN_ST_END: if(crm_scan_bundle_thread.state_timer++>3600)//1hour later { crm_scan_bundle_thread.state = CRM_SCAN_ST_NULL; } break; } return 1; } int dba_get_user_rent(char *msisdn) { char sql[8192]; int rc, rent_charge=0 ; char rent[1][1024]; sprintf(sql, "SELECT f.prd_id, f.FEE_VALUE, 2 AS product_type, p.SERVICE_NBR, \ s.PRD_INST_ID, p.PRD_INST_ID MAIN_PRD_INST_ID, s.CRT_DATE \ FROM tb_prd_sub_prd_inst_551 s, tb_prd_prd_once_fee f, \ tb_prd_prd_inst_551 p WHERE s.MAIN_PRD_INST_ID = p.PRD_INST_ID \ AND f.PRD_ID = s.OFR_ID AND f.FEE_TYPE = 5 \ AND p.SERVICE_NBR = '%s' AND p.PRD_INST_STAS_ID = '1001' AND s.EXP_DATE > CURRENT_TIMESTAMP AND s.EFF_DATE <= CURRENT_TIMESTAMP", msisdn); rc = dba_db_sql_execute_ocs(sql, rent, 1, 1, 0, NULL); if(rent[0][0] != 0x00) rent_charge = atoi(rent[0]); return rent_charge; } int subs_provisioning_update_result(char *sql) { int rc; rc = dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); return rc; } int mobile_provisioning_command_process() { char sql[8192]; char sub_data[32][ARRAY_SIZE]; int rc; int mobile_type = 0; int oper_type =0 ; sprintf(sql, "select PRE_ID, OPER_TYPE, IMSI, SERVICE_NBR, KI, OPC, CUST_ID, ACCT_ID, PRD_INST_ID, MOBILE_TYPE, VMS_FLAG, BIRTH_DATE, BALANCE, \ BALANCE_EXP_DATE, OFR_ID, EXP_DATE, CUG_ID from tb_sync_mobile where STATE=1 limit 1"); rc = dba_db_sql_execute_crm(sql, sub_data, 1, 32,0, NULL); if(rc == 0) return 0; //if(rc != 0) { oper_type = atoi(sub_data[1]); if(0) { sprintf(sql, "update tb_sync_mobile set STATE=3, UPDATE_DATE=NOW() where PRE_ID=%d", atoi(sub_data[0]));//treating to avoid re-create subs_provisioning_update_result(sql); if(1)//mobile { pthread_t tid; pthread_create(&tid, NULL, (void *)crm_prov_hlr_auc_vms_account, sub_data); //crm_prov_hlr_auc_vms_account(sub_data); mobile_type = atoi(sub_data[9]);//0=postpaid, 1=prepaid if(mobile_type == 1) { crm_prov_mobile_prepaid_account( sub_data); } } } else { char cmd_create_user[256]; oper_type = atoi(sub_data[1]); if(oper_type == 2)//replace sim card {//delete old imsi from HSS first , then add new IMSI in HSS/AUC.. char sql_tmp[1024]; char cmd_delete_user[1024]; char old_imsi_info[3][ARRAY_SIZE]; int rc0=0; sprintf(sql_tmp, "select PRE_ID, IMSI, PRD_INST_ID from tb_sync_mobile WHERE SERVICE_NBR='%s' and STATE>1 ORDER BY PRE_ID DESC limit 1", sub_data[3]); rc0 = dba_db_sql_execute_crm(sql_tmp, old_imsi_info, 1, 32,2, NULL); if(rc0==0) return 0; //if(rc0 !=0) { sprintf(cmd_delete_user,"delete subscriber -imsi %s ", old_imsi_info[1]); sprintf(sql_tmp, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_HSS, node_name[NT_HSS], old_imsi_info[2], cmd_delete_user); dba_db_sql_execute_crm(sql_tmp, NULL, 0, 0, 0, NULL); sprintf(cmd_delete_user,"delete aucSubscriber -imsi %s ", old_imsi_info[1]); sprintf(sql_tmp, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_AUC, node_name[NT_AUC], old_imsi_info[2], cmd_delete_user); dba_db_sql_execute_crm(sql_tmp, NULL, 0, 0, 0, NULL); sprintf(sql_tmp, "UPDATE tb_sync_mobile set STATE=6 where PRE_ID=%d", atoi(old_imsi_info[0])); dba_db_sql_execute_crm(sql_tmp, NULL, 0, 0, 0, NULL); } //create sprintf(cmd_create_user,"create subscriber -imsi %s -msisdn %s -eps_user_tpl def_eps -impi %s@ims.mnc010.mcc505.3gppnetwork.org", sub_data[2], sub_data[3], sub_data[2]); sprintf(sql_tmp, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_HSS, node_name[NT_HSS], sub_data[8], cmd_create_user); dba_db_sql_execute_crm(sql_tmp, NULL, 0, 0, 0, NULL); if(sub_data[5][0] == 0) sprintf(cmd_create_user,"create aucSubscriber -imsi %s -ki %s", sub_data[2], sub_data[4]); else sprintf(cmd_create_user,"create aucSubscriber -imsi %s -ki %s -opc %s", sub_data[2], sub_data[4], sub_data[5]); sprintf(sql_tmp, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_AUC, node_name[NT_AUC], sub_data[8], cmd_create_user); dba_db_sql_execute_crm(sql_tmp, NULL, 0, 0, 0, NULL); goto prov_done; } sprintf(cmd_create_user,"create subscriber -imsi %s -msisdn %s -eps_user_tpl def_eps -impi %s@ims.mnc010.mcc505.3gppnetwork.org", sub_data[2], sub_data[3], sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_HSS, node_name[NT_HSS], sub_data[8], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); if(sub_data[5][0] == 0) sprintf(cmd_create_user,"create aucSubscriber -imsi %s -ki %s", sub_data[2], sub_data[4]); else sprintf(cmd_create_user,"create aucSubscriber -imsi %s -ki %s -opc %s", sub_data[2], sub_data[4], sub_data[5]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_AUC, node_name[NT_AUC], sub_data[8], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); if(atoi(sub_data[10]))//VMS enabled { sprintf(cmd_create_user,"create vmsSubscriber -msisdn %s", sub_data[3]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_VMS, node_name[NT_VMS], sub_data[8], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } mobile_type = atoi(sub_data[9]);//0=postpaid, 1=prepaid if(mobile_type == 1) { char rent_data[2][ARRAY_SIZE]; char user_class_data[2][ARRAY_SIZE]; int cug_id = 0, user_class=1;//local user default int rc1=0; sprintf(sql, "select OFR_ID from tb_prd_sub_prd_inst_551 where MAIN_PRD_INST_ID=%d limit 1", atoi(sub_data[8])); rc1 = dba_db_sql_execute_crm(sql, rent_data, 1, 1,2, NULL); if(rc1 != 0) { if(rent_data[0][0] !=0x00) cug_id = atoi(rent_data[0]); } sprintf(sql, "select OFR_LEVEL from tb_prd_ofr where OFR_ID=%d limit 1", atoi(sub_data[14])); rc1 = dba_db_sql_execute_crm(sql, user_class_data, 1, 1,2, NULL); if(rc1 != 0) { if(user_class_data[0][0] !=0x00) user_class = atoi(user_class_data[0]); } crm_prov_mobile_prepaid_account(sub_data, cug_id, user_class); sprintf(cmd_create_user,"create ppsSubscriber -msisdn %s -PRE_ID %ld", sub_data[3]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=2, result=1, cause='000:Command Successful', timestamp=NOW()", CT_CREATE_SUB, NT_OCS, node_name[NT_OCS], sub_data[8], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } } } prov_done: sprintf(sql, "update tb_sync_mobile set STATE=2, UPDATE_DATE=NOW() where PRE_ID=%d", atoi(sub_data[0])); subs_provisioning_update_result(sql); return rc; } int mobile_delete_handle(int account_id) { char sql[8192]; char sub_data[32][ARRAY_SIZE]; int rc; int mobile_type = 0; sprintf(sql, "select PRE_ID, OPER_TYPE, IMSI, SERVICE_NBR, KI, OPC, CUST_ID, STATE, PRD_INST_ID, MOBILE_TYPE, VMS_FLAG, BIRTH_DATE, BALANCE, \ BALANCE_EXP_DATE, OFR_ID, EXP_DATE, CUG_ID from tb_sync_mobile where ACCT_ID=%d ORDER BY PRE_ID DESC limit 1", account_id); rc = dba_db_sql_execute_ocs(sql, sub_data, 1, 32,0, NULL); if(rc == 0) return 0; if(1) { char cmd_delete_user[256]; sprintf(cmd_delete_user,"delete subscriber -imsi %s ", sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_HSS, node_name[NT_HSS], sub_data[8], cmd_delete_user); dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); sprintf(cmd_delete_user,"delete aucSubscriber -imsi %s", sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_AUC, node_name[NT_AUC], sub_data[8], cmd_delete_user); dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); //if(atoi(sub_data[10]))//VMS enabled if(1)//VMS enabled { sprintf(cmd_delete_user,"delete vmsSubscriber -msisdn %s", sub_data[3]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_VMS, node_name[NT_VMS], sub_data[8], cmd_delete_user); dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); } mobile_type = atoi(sub_data[9]);//0=postpaid, 1=prepaid if(0)//no smcli connection to OCS { if(mobile_type == 1) { sprintf(cmd_delete_user,"delete ppsSubscriber -msisdn %s", sub_data[3]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=2, result=1, cause='000:Command Successful', timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_OCS, node_name[NT_OCS], sub_data[8], cmd_delete_user); dba_db_sql_execute_ocs(sql, NULL, 0, 0, 0, NULL); } } } return rc; } void update_plan_quotation_when_on_boarding(int owner_id) { char sql[8192]; char cur_time[10]; int rate = 100; int max_days = 31; GetCurrentTime(cur_time); switch(cur_time[1]) { case 4: case 6: case 9: case 11: max_days = 30; break; case 2: if(cur_time[0]%4 == 0) { max_days = 29; } else { max_days = 28; } break; } rate = ((max_days - cur_time[2])+1) * 100 / max_days; sprintf(sql, "update ratable_history set FREE_VALUE=FREE_VALUE*%d/100 where OWNER_ID=%d", rate, owner_id); subs_provisioning_update_result(sql); } void pstn_provisioning_command_process() { char sql[8192]; char cmd_create_user[256]; char sub_data[32][ARRAY_SIZE], sub_data1[32][ARRAY_SIZE]; int rc; sprintf(sql, "select POST_ID, SERVICE_NBR, CUST_NAME, VMS_FLAG, PRD_INST_ID,OFR_TYPE, ORDER_ID from tb_sync_pstn where STATE=1 limit 1"); rc = dba_db_sql_execute_crm(sql, sub_data, 1, 32, 2, NULL); if(rc != 0) { int krone_pair_id=0, ssentry=1125; char res_data[32][ARRAY_SIZE]; sprintf(sql, "update tb_sync_pstn set STATE=3, UPDATE_DATE=NOW() where POST_ID=%d", atoi(sub_data[0])); subs_provisioning_update_result(sql); sprintf(sql, "SELECT C.RESOURCE_EXAM_NUM FROM TB_PRD_RES_INST_551 A, \ TB_PRD_RES_INST_DETAIL_551 B, \ TB_RESOURCE_EXAM C WHERE A.RES_INST_ID=B.RES_INST_ID AND B.RESOURCE_EXAM_ID=C.RESOURCE_EXAM_ID AND C.RESOURCE_ID=%d \ AND A.ORDER_ID=%s", pstn_get_krone_pair_resource_id(), sub_data[6]); rc = dba_db_sql_execute_crm(sql, res_data, 1, 1, 2, NULL); if(rc != 0) krone_pair_id = atoi(res_data[0]); sprintf(sql, "SELECT C.RESOURCE_EXAM_NUM FROM TB_PRD_RES_INST_551 A, \ TB_PRD_RES_INST_DETAIL_551 B, \ TB_RESOURCE_EXAM C WHERE A.RES_INST_ID=B.RES_INST_ID AND B.RESOURCE_EXAM_ID=C.RESOURCE_EXAM_ID AND C.RESOURCE_ID=%d \ AND A.ORDER_ID=%s", pstn_get_ssentry_resource_id(), sub_data[6]); rc = dba_db_sql_execute_crm(sql, res_data, 1, 1, 2, NULL); if(rc != 0) ssentry = atoi(res_data[0]); if(1) { sprintf(cmd_create_user,"create pstn user isdn=%s, krone_pair_id=%d, ssentry=%d, user_name=%s", sub_data[1], krone_pair_id, ssentry, sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_PSTN, node_name[NT_PSTN], sub_data[4], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); if(0) { sprintf(cmd_create_user,"create pstn user isdn=%s, krone_pair_id=%d, ssentry=%d, user_name=%s", sub_data[1], krone_pair_id, ssentry, sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_MSAN, node_name[NT_MSAN], sub_data[4], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } } //crm_prov_pstn_account(sub_data, ssentry, krone_pair_id); if(atoi(sub_data[3]))//VMS enabled { sprintf(cmd_create_user,"create vmsSubscriber -msisdn %s", sub_data[1]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_CREATE_SUB, NT_VMS, node_name[NT_VMS], sub_data[4], cmd_create_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); //crm_create_vms_account(sub_data[1]); } //update_plan_quotation_when_on_boarding(atoi(sub_data[4])); } else { sprintf(sql, "select cmd_id, acct_id from tb_pstn_disc_cmd where acct_status=0 limit 1"); rc = dba_db_sql_execute_crm(sql, sub_data, 1, 32, 2, NULL); if(rc != 0) { sprintf(sql, "update tb_pstn_disc_cmd set acct_status=1 where cmd_id='%s'", sub_data[0]); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); sprintf(sql,"select SERVICE_NBR from tb_prd_prd_inst_551 WHERE acct_id='%s'", sub_data[1]); rc = dba_db_sql_execute_crm(sql, sub_data1, 1, 32, 2, NULL); if(rc != 0) { long account_id = atol(sub_data[1]); crm_delete_subscriber_profile(sub_data1[0], 2, account_id); } } } } int pstn_provisioning_node_process() { char sql[8192]; char data[32][ARRAY_SIZE]; int rc; int krone_pair_id, ss_entry, pre_id; char isdn[32], user_name[64],state[64],buf[32]; char *ptr=NULL, *ptr1=NULL; int cmd_type; sprintf(sql, "select id, command, node_type,cmd_type from tb_sync_cn_cmd where state=1 and node_type=%d limit 1", NT_PSTN); rc = dba_db_sql_execute_crm(sql, data, 1, 32, 0, NULL); if(rc != 0) { pre_id = atoi(data[0]); sprintf(sql, "update tb_sync_cn_cmd set state=3, timestamp=NOW() where id=%d", pre_id); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); cmd_type = atoi(data[3]); if(1)//if(cmd_type == CT_CREATE_SUB || cmd_type == CT_UPDATE_SUB) { //command=create pstn user isdn=%s, krone_pair_id=%d, ss_entry=%d, user_name= ptr = strstr(data[1], "isdn="); if(ptr != NULL) { ptr1 = strstr(data[1], ", krone_pair_id="); if(ptr1 != NULL) { memset(isdn, 0x00, 32); memcpy(isdn,ptr+5, ptr1-ptr-5); } } if(ptr1 != NULL) { ptr = ptr1; ptr1 = strstr(data[1], ", ssentry="); if(ptr1 != NULL) { memset(buf, 0x00, 32); memcpy(buf,ptr+16, ptr1-ptr-16); krone_pair_id = atoi(buf); } } if(ptr1 != NULL) { ptr = ptr1; if(cmd_type == CT_CREATE_SUB) ptr1 = strstr(data[1], ", user_name="); else ptr1 = strstr(data[1], ", state="); if(ptr1 != NULL) { memset(buf, 0x00, 32); memcpy(buf,ptr+10, ptr1-ptr-10); ss_entry = atoi(buf); } } if(ptr1 != NULL) { if(cmd_type == CT_CREATE_SUB) strcpy(state, ptr1+12); else strcpy(state, ptr1+8); } sprintf(data[1], "%s", isdn); if(cmd_type == CT_CREATE_SUB) sprintf(data[2], "%s", user_name); else sprintf(data[2], "%s", state); sprintf(data[4], "%d", pre_id); if(cmd_type == CT_CREATE_SUB) sprintf(data[5], "%d", 1); //create else sprintf(data[5], "%d", 2); //update crm_prov_pstn_account(data, ss_entry, krone_pair_id); } } else { sprintf(sql, "select id, command from tb_sync_cn_cmd where result=3 and node_type=%d limit 1", NT_PSTN); rc = dba_db_sql_execute_crm(sql, data, 1, 32, 0, NULL); if(rc != 0) { pre_id = atoi(data[0]); sprintf(sql, "update tb_sync_cn_cmd set state=3, result=4, timestamp=NOW() where id=%d", pre_id); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } } return rc; } static char crm_user_prov_cmd[10][16]={"None","Create","Replace","Suspend","Disable","Resume","Disconnect"}; int pstn_service_control_process() { char sql[8192]; char cmd_update_user[1024]; char data[32][ARRAY_SIZE], sync_data[32][ARRAY_SIZE], tmp_data[32][ARRAY_SIZE]; int rc; int node_type, pre_id; int cmd_type; int krone_pair_id, ssentry; sprintf(sql, "select id, service_nbr, type, SERVICE_TYPE from tb_service_control where state=1 limit 1"); rc = dba_db_sql_execute_crm(sql, data, 1, 32, 0, NULL); if(rc != 0) { pre_id = atoi(data[0]); sprintf(sql, "update tb_service_control set state=2, update_date=NOW() where id=%d", pre_id); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); node_type = atoi(data[3]); if(node_type == 1)//ADSL , do nothing return 1; cmd_type = atoi(data[2]); if(cmd_type>=10) return 0; if(node_type == 2)//PSTN { sprintf(sql, "select PRD_INST_ID, CUST_ID from tb_sync_pstn where SERVICE_NBR='%s' ORDER BY POST_ID DESC limit 1", data[1]); rc = dba_db_sql_execute_crm(sql, sync_data, 1, 32, 0, NULL); if(rc == 0)//can't find on-boarding info return 0; sprintf(sql, "SELECT C.RESOURCE_EXAM_NUM FROM TB_PRD_RES_INST_551 A, \ TB_PRD_RES_INST_DETAIL_551 B, \ TB_RESOURCE_EXAM C WHERE A.RES_INST_ID=B.RES_INST_ID AND B.RESOURCE_EXAM_ID=C.RESOURCE_EXAM_ID AND C.RESOURCE_ID=%d \ AND A.CUST_ID=%s", pstn_get_krone_pair_resource_id(), sync_data[1]); rc = dba_db_sql_execute_crm(sql, tmp_data, 1, 1, 2, NULL); if(rc != 0) krone_pair_id = atoi(tmp_data[0]); sprintf(sql, "SELECT C.RESOURCE_EXAM_NUM FROM TB_PRD_RES_INST_551 A, \ TB_PRD_RES_INST_DETAIL_551 B, \ TB_RESOURCE_EXAM C WHERE A.RES_INST_ID=B.RES_INST_ID AND B.RESOURCE_EXAM_ID=C.RESOURCE_EXAM_ID AND C.RESOURCE_ID=%d \ AND A.CUST_ID=%s", pstn_get_ssentry_resource_id(), sync_data[1]); rc = dba_db_sql_execute_crm(sql, tmp_data, 1, 1, 2, NULL); if(rc != 0) ssentry = atoi(tmp_data[0]); sprintf(cmd_update_user,"update pstn user isdn=%s, krone_pair_id=%d, ssentry=%d, state=%s", data[1], krone_pair_id, ssentry, crm_user_prov_cmd[cmd_type]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", cmd_type, NT_PSTN, node_name[NT_PSTN], sync_data[0], cmd_update_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } } return rc; } void pstn_update_provisiong_result(int result, int post_id, char *cause) { char sql[1024]; if(result == 1) { sprintf(sql, "update tb_sync_cn_cmd set state=2, result=5, timestamp=NOW() where id=%d", post_id); } else { sprintf(sql, "update tb_sync_cn_cmd set state=2, result=6, cause='%s', timestamp=NOW() where id=%d", cause, post_id); } subs_provisioning_update_result(sql); } void adsl_provisioning_command_process() { char sql[8192]; char sub_data[32][ARRAY_SIZE]; int rc; sprintf(sql, "select POST_ID, PRD_INST_ID from tb_sync_adsl where STATE=1 limit 1"); rc = dba_db_sql_execute_crm(sql, sub_data, 1, 32, 2, NULL); if(rc != 0) { sprintf(sql, "update tb_sync_adsl set STATE=2, UPDATE_DATE=NOW() where POST_ID=%d", atoi(sub_data[0])); subs_provisioning_update_result(sql); //update_plan_quotation_when_on_boarding(atoi(sub_data[1])); //CRM will assign plan benefits when do on-boarding } } int mobile_provisioning_node_process(int nt_type) { char sql[8192]; char data[32][ARRAY_SIZE]; int rc; sprintf(sql, "select id, command from tb_sync_cn_cmd where state=1 and node_type=%d limit 1", nt_type); rc = dba_db_sql_execute_crm(sql, data, 1, 32, 0, NULL); if(rc != 0) { sprintf(sql, "update tb_sync_cn_cmd set state=3, timestamp=NOW() where id=%d", atoi(data[0])); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); smcli_send_command(data[1]); crm_smcli_thread.resend = 0; crm_smcli_thread.key_id = atoi(data[0]); } else { sprintf(sql, "select id, command from tb_sync_cn_cmd where result=3 and node_type=%d limit 1", nt_type); rc = dba_db_sql_execute_crm(sql, data, 1, 32, 0, NULL); if(rc != 0) { sprintf(sql, "update tb_sync_cn_cmd set result=4, timestamp=NOW() where id=%d", atoi(data[0])); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); smcli_send_command(data[1]); crm_smcli_thread.resend = 1; crm_smcli_thread.key_id = atoi(data[0]); } } return rc; } void mobile_provisioning_node_update_result(int nt_type, int result, char *result_des) { char sql[8192]; if(crm_smcli_thread.resend == 0) { sprintf(sql, "update tb_sync_cn_cmd set state=2, result=%d, cause='%s', timestamp=NOW() where id=%d", result, result_des, crm_smcli_thread.key_id); } else { if(result == 1) sprintf(sql, "update tb_sync_cn_cmd set state=2, result=5, timestamp=NOW() where id=%d", crm_smcli_thread.key_id); else sprintf(sql, "update tb_sync_cn_cmd set state=2, result=6, cause='%s', timestamp=NOW() where id=%d", result_des, crm_smcli_thread.key_id); } dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } void crm_delete_subscriber_profile(char *service_num, int account_type, int account_id) {//account_type=1/2/3 mobile/pstn/adsl char sql[8192]; char sub_data[32][ARRAY_SIZE],sub_data1[32][ARRAY_SIZE],sub_data2[32][ARRAY_SIZE]; int rc; int mobile_type = 0; int vms_flag =0 ; char cmd_delete_user[1024]; if(account_type == 1)//mobile { sprintf(sql, "select PRE_ID, IMSI, SERVICE_NBR, MOBILE_TYPE, VMS_FLAG, PRD_INST_ID from tb_sync_mobile where ACCT_ID=%d limit 1", account_id); //service number -> product_inst_id rc = dba_db_sql_execute_crm(sql, sub_data, 1, 32,2, NULL); if(rc != 0) { mobile_type = atoi(sub_data[3]); vms_flag = atoi(sub_data[4]); sprintf(cmd_delete_user,"delete subscriber -imsi %s ", sub_data[1]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_HSS, node_name[NT_HSS], sub_data[5], cmd_delete_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); sprintf(cmd_delete_user,"delete aucSubscriber -imsi %s ", sub_data[1]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_AUC, node_name[NT_AUC], sub_data[5], cmd_delete_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); if(mobile_type == 1)//prepaid to OCS { sprintf(cmd_delete_user,"delete ppsSubscriber -msisdn %s ", sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=2, result=1, cause='0000:Command successful', timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_OCS, node_name[NT_OCS], sub_data[5], cmd_delete_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } if(vms_flag == 1)//VMS enabled to VMS { sprintf(cmd_delete_user,"delete vmsSubscriber -msisdn %s ", sub_data[2]); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=0, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_VMS, node_name[NT_VMS], sub_data[5], cmd_delete_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); } } } else if(account_type == 2)//pstn { int krone_pair_id=0,ssentry=0; sprintf(sql, "select ORDER_ID from tb_sync_pstn where SERVICE_NBR='%s' ORDER by ORDER_ID desc limit 1", service_num); rc = dba_db_sql_execute_crm(sql, sub_data, 1, 1, 2, NULL); sprintf(sql, "SELECT C.RESOURCE_EXAM_NUM FROM TB_PRD_RES_INST_551 A, \ TB_PRD_RES_INST_DETAIL_551 B, \ TB_RESOURCE_EXAM C WHERE A.RES_INST_ID=B.RES_INST_ID AND B.RESOURCE_EXAM_ID=C.RESOURCE_EXAM_ID AND C.RESOURCE_ID=1046 \ AND A.ORDER_ID=%s", sub_data[0]); rc = dba_db_sql_execute_crm(sql, sub_data1, 1, 1, 2, NULL); if(rc != 0) krone_pair_id = atoi(sub_data1[0]); sprintf(sql, "SELECT C.RESOURCE_EXAM_NUM FROM TB_PRD_RES_INST_551 A, \ TB_PRD_RES_INST_DETAIL_551 B, \ TB_RESOURCE_EXAM C WHERE A.RES_INST_ID=B.RES_INST_ID AND B.RESOURCE_EXAM_ID=C.RESOURCE_EXAM_ID AND C.RESOURCE_ID=%d \ AND A.ORDER_ID=%s", pstn_get_ssentry_resource_id(), sub_data[0]); rc = dba_db_sql_execute_crm(sql, sub_data2, 1, 1, 2, NULL); if(rc != 0) ssentry = atoi(sub_data2[0]); sprintf(cmd_delete_user,"delete pstn user isdn=%s, krone_pair_id=%d, ssentry=%d, state=Deleted, account_id=%d ", service_num,krone_pair_id, ssentry,account_id); sprintf(sql, "INSERT INTO tb_sync_cn_cmd SET cmd_type=%d, node_type=%d, node_name='%s', srv_num='%s', command='%s', state=1, result=1, timestamp=NOW()", CT_DISCONNECT_ACCOUNT, NT_PSTN, node_name[NT_PSTN], service_num, cmd_delete_user); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); //crm_prov_pstn_account_delete(service_num, krone_pair_id); } } void set_smcli_state(int new_state) { //printf("smcli thread state %d->%d\r\n", crm_smcli_thread.state, new_state); crm_smcli_thread.state = new_state; crm_smcli_thread.state_timer = 0; } static int smcli_timer = 16; //8seconds int user_prov_smcli_thread() { int state = 0, timer = 0; int rc=0; char result[256]; state = crm_smcli_thread.state; timer = crm_smcli_thread.state_timer ++; switch(state) { case CRM_CLI_ST_READ_CMD: rc = mobile_provisioning_command_process(); if(rc !=0 ) { set_smcli_state(CRM_CLI_ST_HSS_PROV); } else { set_smcli_state(CRM_CLI_ST_HSS_PROV); } break; case CRM_CLI_ST_HSS_PROV: rc = mobile_provisioning_node_process(NT_HSS); if(rc == 0) { set_smcli_state(CRM_CLI_ST_AUC_PROV); } else { set_smcli_state(CRM_CLI_ST_HSS_PROV_RES); } break; case CRM_CLI_ST_HSS_PROV_RES: if(timer>=smcli_timer) { mobile_provisioning_node_update_result(NT_HSS, 2, "timeout"); //failed set_smcli_state(CRM_CLI_ST_AUC_PROV); } else { rc = smcli_get_result(result); if(rc != 0) { mobile_provisioning_node_update_result(NT_HSS, rc, result); set_smcli_state(CRM_CLI_ST_AUC_PROV); } } break; case CRM_CLI_ST_AUC_PROV: rc = mobile_provisioning_node_process(NT_AUC); if(rc == 0) { set_smcli_state(CRM_CLI_ST_OCS_PROV); } else { set_smcli_state(CRM_CLI_ST_AUC_PROV_RES); } break; case CRM_CLI_ST_AUC_PROV_RES: if(timer>=smcli_timer) { mobile_provisioning_node_update_result(NT_AUC, 2, "timeout"); //failed set_smcli_state(CRM_CLI_ST_OCS_PROV); } else { rc = smcli_get_result(result); if(rc != 0) { mobile_provisioning_node_update_result(NT_AUC, rc, result); set_smcli_state(CRM_CLI_ST_OCS_PROV); } } break; case CRM_CLI_ST_OCS_PROV: rc = mobile_provisioning_node_process(NT_OCS); if(rc == 0) { set_smcli_state(CRM_CLI_ST_VMS_PROV); } else { set_smcli_state(CRM_CLI_ST_OCS_PROV_RES); } break; case CRM_CLI_ST_OCS_PROV_RES: if(timer>=smcli_timer)// { mobile_provisioning_node_update_result(NT_OCS, 2, "timeout"); //failed set_smcli_state(CRM_CLI_ST_VMS_PROV); } else { rc = smcli_get_result(result); if(rc != 0) { mobile_provisioning_node_update_result(NT_OCS, rc, result); set_smcli_state(CRM_CLI_ST_VMS_PROV); } } break; case CRM_CLI_ST_VMS_PROV: rc = mobile_provisioning_node_process(NT_VMS); if(rc == 0) { set_smcli_state(CRM_CLI_ST_READ_CMD); } else { set_smcli_state(CRM_CLI_ST_VMS_PROV_RES); } break; case CRM_CLI_ST_VMS_PROV_RES: if(timer>=smcli_timer) { mobile_provisioning_node_update_result(NT_VMS, 2, "timeout"); //failed set_smcli_state(CRM_CLI_ST_READ_CMD); } else { rc = smcli_get_result(result); if(rc != 0) { mobile_provisioning_node_update_result(NT_VMS, rc, result); set_smcli_state(CRM_CLI_ST_READ_CMD); } } break; case CRM_CLI_ST_PCRF_PROV: break; } } int subs_provisioning_command_process() { if(0) mobile_provisioning_command_process(); else user_prov_smcli_thread(); pstn_provisioning_command_process(); pstn_provisioning_node_process(); pstn_service_control_process(); adsl_provisioning_command_process(); return 1; } /* +-------------------+--------------+------+-----+---------+--------------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------+------+-----+---------+--------------------------------+ | sms_alert_id | int(11) | NO | PRI | NULL | auto_increment | | sms_called_number | varchar(20) | YES | | NULL | | | sms_content | varchar(500) | YES | | NULL | | | sms_dcs | int(1) | YES | | 0 | | | sms_state | int(1) | YES | | 1 | | | sms_validity | datetime(6) | YES | | NULL | | | sms_crt_date | datetime(6) | YES | | NULL | on update CURRENT_TIMESTAMP(6) | | sms_module | int(1) | YES | | NULL | | +-------------------+--------------+------+-----+---------+--------------------------------+ */ void sms_notification_handle() { char sql[8192]; char sms_data[8][ARRAY_SIZE]; int rc; sprintf(sql, "select * from tb_sms_info where sms_state=1 limit 1"); rc = dba_db_sql_execute_crm(sql, sms_data, 1, 32, 0, NULL); if(rc != 0) { sprintf(sql, "update tb_sms_info set sms_state=2 where sms_alert_id=%d", atoi(sms_data[0])); dba_db_sql_execute_crm(sql, NULL, 0, 0, 0, NULL); rest_crm_send_sms_notification(sms_data); } return 1; } int sms_notification_process() { sms_notification_handle(); return 1; }