/*******************************************************************
 * fm_pymt_pol_chagre_process_result()
 * This function reads the response from vendor
 * and assigns a reason ID for the response
 *******************************************************************/
static void
fm_pymt_pol_charge_process_result(
	pcm_context_t           *ctxp,
	pin_flist_t		*i_flistp,
	int			*reason_id,
	int			*domain_idp,
	pin_errbuf_t		*ebufp)
{
	pin_flist_t             *info_flistp = NULL;
	pin_errbuf_t            any_field_ebuf;
	pin_cookie_t            cookie = NULL;
	pin_fld_num_t		field = 0;
	int32			rec_id = 0;
	pin_charge_result_t	*resultp = NULL;
	if (PIN_ERR_IS_ERR(ebufp))
	{
		return ;
	}
	PIN_ERR_CLEAR_ERR(ebufp);

	PIN_ERR_CLEAR_ERR(&any_field_ebuf);	

	while (PIN_FLIST_ANY_GET_NEXT(i_flistp, &field, 
				&rec_id, &cookie, &any_field_ebuf) != NULL ){
		if (field == PIN_FLD_CC_INFO || field == PIN_FLD_DD_INFO) {
			info_flistp = PIN_FLIST_ELEM_GET(i_flistp, 
					field, 0, 0, ebufp);
			resultp = (pin_charge_result_t *)PIN_FLIST_FLD_GET(info_flistp,
					PIN_FLD_RESULT, 0,ebufp);
			/*******************************************
			 * Set the PIN_FLD_RESULT_ID in the PIN_FLD_RESULTS 
			 * array
			 ******************************************/
			if (resultp){
				/******************************
				 *Set Default Reason ID to 0
				 *******************************/
				switch (*resultp) {
				case PIN_CHARGE_RES_PASS: 
					*reason_id = PIN_REASON_ID_APPROVED;
					*domain_idp = PIN_PYMT_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_NO_ANS:
					*reason_id = PIN_REASON_ID_FAIL_NO_ANS;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_ADDR_AVS:
					*reason_id = PIN_REASON_ID_FAIL_ADDR_AVS;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_ADDR_LOC:
					*reason_id = PIN_REASON_ID_FAIL_ADDR_LOC;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_ADDR_ZIP:
					*reason_id = PIN_REASON_ID_FAIL_ADDR_ZIP;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_CARD_BAD:
					*reason_id = PIN_REASON_ID_FAIL_CARD_BAD;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_DECL_SOFT:
					*reason_id = PIN_REASON_ID_FAIL_DECL_SOFT;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_SRVC_UNAVAIL:
					*reason_id = PIN_REASON_ID_FAIL_SRVC_UNAVAIL;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_DECL_HARD:
					*reason_id = PIN_REASON_ID_FAIL_DECL_HARD;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_NO_MIN:
					*reason_id = PIN_REASON_ID_FAIL_NO_MIN;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_INVALID_CMD:
					*reason_id = PIN_REASON_ID_INVALID_CMD;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_SELECT_ITEMS:
					*reason_id = PIN_REASON_ID_FAIL_SELECT_ITEMS;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_CVV_BAD:
					*reason_id = PIN_REASON_ID_FAIL_CVV_BAD;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_NO_CREDIT_BALANCE:
					*reason_id =  PIN_REASON_ID_NO_CREDIT_BALANCE;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_LOGICAL_PROBLEM:
					*reason_id = PIN_REASON_ID_FAIL_LOGICAL_PROBLEM;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_FORMAT_ERROR:
					*reason_id = PIN_REASON_ID_FAIL_FORMAT_ERROR;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_INVALID_CONTENT:
					*reason_id = PIN_REASON_ID_FAIL_INVALID_CONTENT;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				case PIN_CHARGE_RES_FAIL_TECHNICAL_PROBLEM:
					*reason_id = PIN_REASON_ID_FAIL_TECHNICAL_PROBLEM;
					*domain_idp = PIN_PYMT_FAILED_REASON_DOMAIN_ID;
					break;
				default:
					*reason_id = PIN_REASON_ID_DEFAULT;
					/*******************************************
					 * Setting the default reason domain
					 * since we are setting default reason ID
					 * The following line can be commented if
					 * the domain id has to be retained as 
					 * it was passed in the function.
					 ******************************************/
					*domain_idp = PIN_PYMT_REASON_DOMAIN_ID;
					break;
				}
			}
                }
	}
	/*************************************************
	 * Check Error buf and Debug it
	 ************************************************/
	if (PIN_ERR_IS_ERR(ebufp)) {
                PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_DEBUG,
                                "fm_pymt_pol_charge_process_result", ebufp);
	}

	return;
}
static void
fm_get_meta_field(
	pcm_context_t           *ctxp,
        pin_flist_t             *in_flistp,
        pin_flist_t             **out_flistpp,
        pin_errbuf_t            *ebufp)
{
	pin_flist_t     *keys_flistp = NULL;
        pin_flist_t     *search_flistp = NULL;
        pin_flist_t     *flistp = NULL; 
        poid_t          *s_pdp = NULL; 
        poid_t          *bi_pdp = NULL; 
        int64           database = 0;
        int32           sflags = 256;
        int32           result = PIN_BOOLEAN_FALSE;
        void            *vp = NULL;
        pin_decimal_t   *zero_decimal =  pin_decimal("0.0", ebufp);
	pin_flist_t	*r_flistp = NULL;
	char                    *name = NULL;
	char                    *class_name = NULL;
	char                    *default_value;
	int32           count = 0;
	int32           cnt_flds = 0;
	int32                   elemid = 1;
	pin_errbuf_t            any_field_ebuf;
        pin_cookie_t            cookie = NULL;
        pin_fld_num_t           field = 0;
        int32                   rec_id = 0;
	void            *type = NULL;

        if (PIN_ERR_IS_ERR(ebufp)) {
                return;
        }
        PIN_ERR_CLEAR_ERR(ebufp);
	PIN_ERR_CLEAR_ERR(&any_field_ebuf);
	
	PIN_ERR_LOG_FLIST(PIN_ERR_LEVEL_DEBUG, "fm_get_meta_field input flistp", in_flistp);
	bi_pdp = (poid_t *) PIN_FLIST_FLD_GET(in_flistp,
                                PIN_FLD_POID,0, ebufp);

	count = PIN_FLIST_ELEM_COUNT (in_flistp,
                        PIN_FLD_KEYS, ebufp);
	if (count == 0)
        {

                 pin_set_err(ebufp, PIN_ERRLOC_FM,
                        PIN_ERRCLASS_SYSTEM_DETERMINATE,
                        PIN_ERR_BAD_OPCODE, 0, 0, count);
                PIN_ERR_LOG_EBUF(PIN_ERR_LEVEL_ERROR,
                        "op_get_meta_field search flistp", ebufp);

                *out_flistpp = NULL;
                return;
        }

	else {
	keys_flistp = PIN_FLIST_ELEM_GET (in_flistp, PIN_FLD_KEYS,
                PIN_ELEMID_ANY, 0, ebufp);
	while (PIN_FLIST_ANY_GET_NEXT(keys_flistp, &field,
                                &rec_id, &cookie, &any_field_ebuf) != NULL ){
        cnt_flds = cnt_flds + 1;
	if (field == PIN_FLD_NAME){
 	name = (char *)PIN_FLIST_FLD_GET(keys_flistp, PIN_FLD_NAME, 1, ebufp);
	}
	if (field == PIN_FLD_CLASS_NAME){
       class_name = PIN_FLIST_FLD_GET(keys_flistp, PIN_FLD_CLASS_NAME, 0, ebufp );
	}
	if (field == PIN_FLD_TYPE){
	type = PIN_FLIST_FLD_GET(keys_flistp, PIN_FLD_TYPE, 0, ebufp );			
	}
	}
	if ( cnt_flds == 1)
        {
        vp = (void *)"select X from /metafield where F1 = V1 ";
        }
        if ( cnt_flds == 2)
        {
        vp = (void *)"select X from /metafield where F1 = V1 and F2 = V2 ";
        }
        if ( cnt_flds == 3)
        {
        vp = (void *)"select X from /metafield where F1 = V1 and F2 = V2 and F3 = V3 ";
        }

	 /*********************************************************
         * Create the search flist to search in the item objects
         *********************************************************/
        search_flistp = PIN_FLIST_CREATE(ebufp);
        database = PIN_POID_GET_DB(bi_pdp);
        s_pdp = PIN_POID_CREATE(database, "/search", -1, ebufp);
        PIN_FLIST_FLD_PUT(search_flistp, PIN_FLD_POID, (void *)s_pdp, ebufp);
       /******************************************************************
         * Set the search template.
         ******************************************************************/
        PIN_FLIST_FLD_SET(search_flistp, PIN_FLD_TEMPLATE, vp, ebufp);
        PIN_FLIST_FLD_SET(search_flistp, PIN_FLD_FLAGS, (void *)&sflags, ebufp);

	/*********************************************************
         * Add the search arguments.
         *********************************************************/
	if (name != NULL) {
        flistp = PIN_FLIST_ELEM_ADD(search_flistp, PIN_FLD_ARGS, elemid++, ebufp);
        PIN_FLIST_FLD_SET(flistp, PIN_FLD_NAME, name, ebufp);
	}

        /*********************************************************
         * Add the search arguments.
         *********************************************************/
	if (class_name != NULL) {
        flistp = PIN_FLIST_ELEM_ADD(search_flistp, PIN_FLD_ARGS, elemid++, ebufp);
        PIN_FLIST_FLD_SET(flistp, PIN_FLD_CLASS_NAME, class_name, ebufp);
        }
	
	/*********************************************************
         * Add the search arguments.
         *********************************************************/
        if (type != NULL) {
        flistp = PIN_FLIST_ELEM_ADD(search_flistp, PIN_FLD_ARGS, elemid++, ebufp);
        PIN_FLIST_FLD_SET(flistp, PIN_FLD_TYPE, type, ebufp);
        }


        /*********************************************************
         * Add the result array for the search.
         *********************************************************/

        flistp = PIN_FLIST_ELEM_ADD(search_flistp, PIN_FLD_RESULTS, 0, ebufp);
	PIN_FLIST_FLD_SET(flistp, PIN_FLD_TYPE,(void *)NULL, ebufp);
        
	PIN_ERR_LOG_FLIST(PIN_ERR_LEVEL_DEBUG, "op_get_meta_field search flistp", search_flistp);  

	 PCM_OP(ctxp, PCM_OP_SEARCH, 0, search_flistp, out_flistpp, ebufp);

	PIN_ERR_LOG_FLIST(PIN_ERR_LEVEL_DEBUG, "op_get_meta_field search flistp", *out_flistpp);
	}
	     
 	}