@SuppressWarnings("unchecked")
  public boolean add3rdBillExt(Map<String, String> mVal, int id, Vector vecObj) {
    BillingClaimHeader1Data claim1Obj = (BillingClaimHeader1Data) vecObj.get(0);
    boolean retval = true;
    String[] temp = {
      "billTo",
      "remitTo",
      "total",
      "payment",
      "discount",
      "provider_no",
      "gst",
      "payDate",
      "payMethod"
    };
    String demoNo = mVal.get("demographic_no");
    String dateTime = UtilDateUtilities.getToday("yyyy-MM-dd HH:mm:ss");
    mVal.put("payDate", dateTime);
    String paymentSumParam = null;
    String paymentDateParam = null;
    String paymentTypeParam = null;
    String provider_no = mVal.get("provider_no");
    for (int i = 0; i < temp.length; i++) {
      String val = mVal.get(temp[i]);
      if ("discount".equals(temp[i])) {
        val =
            mVal.get(
                "total_discount"); // 'refund' stands for write off, here totoal_discount is write
                                   // off
      }
      if ("payment".equals(temp[i])) {
        val = mVal.get("total_payment");
      }
      BillingONExt billingONExt = new BillingONExt();
      billingONExt.setBillingNo(id);
      billingONExt.setDemographicNo(Integer.parseInt(demoNo));
      billingONExt.setKeyVal(StringEscapeUtils.escapeSql(temp[i]));
      billingONExt.setValue(StringEscapeUtils.escapeSql(val));
      billingONExt.setDateTime(new Date());
      billingONExt.setStatus('1');
      extDao.persist(billingONExt);

      if (i == 3) paymentSumParam = mVal.get("total_payment"); // total_payment
      else if (i == 7) paymentDateParam = mVal.get(temp[i]); // paymentDate
      else if (i == 8) paymentTypeParam = mVal.get(temp[i]); // paymentMethod
    }

    if (paymentSumParam != null) {
      BillingONPaymentDao billingONPaymentDao =
          (BillingONPaymentDao) SpringUtils.getBean("billingONPaymentDao");
      BillingPaymentTypeDao billingPaymentTypeDao =
          (BillingPaymentTypeDao) SpringUtils.getBean("billingPaymentTypeDao");
      BillingONCHeader1 ch1 = cheaderDao.find(id);
      Date paymentDate = null;
      try {
        paymentDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(paymentDateParam);
      } catch (ParseException ex) {
        _logger.error("add3rdBillExt wrong date format " + paymentDateParam);
        return retval;
      }

      // allow user to override with the text box added
      String paymentDateOverride = mVal.get("payment_date");
      if (paymentDateOverride != null && paymentDateOverride.length() > 0) {
        try {
          paymentDate =
              new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(paymentDateOverride + " 00:00:00");
        } catch (ParseException ex) {
          _logger.error("add3rdBillExt wrong date format " + paymentDateOverride);
          return retval;
        }
      }

      if (paymentTypeParam == null || paymentTypeParam.equals("")) {
        paymentTypeParam = "1";
      }
      BillingPaymentType type = billingPaymentTypeDao.find(Integer.parseInt(paymentTypeParam));
      BillingONPayment payment = null;

      if (paymentSumParam != null) {
        payment = new BillingONPayment();
        payment.setTotal_payment(BigDecimal.valueOf(Double.parseDouble(paymentSumParam)));
        payment.setTotal_discount(
            BigDecimal.valueOf(Double.parseDouble(mVal.get("total_discount"))));
        payment.setTotal_refund(new BigDecimal(0));
        payment.setPaymentDate(paymentDate);
        payment.setBillingOnCheader1(ch1);
        payment.setBillingNo(id);
        payment.setCreator(claim1Obj.getCreator());
        payment.setPaymentTypeId(Integer.parseInt(paymentTypeParam));

        // payment.setBillingPaymentType(type);
        billingONPaymentDao.persist(payment);
        addItemPaymentRecord(
            (List) vecObj.get(1),
            id,
            payment.getId(),
            Integer.parseInt(paymentTypeParam),
            paymentDate);
        addCreate3rdInvoiceTrans(
            (BillingClaimHeader1Data) vecObj.get(0),
            (List<BillingItemData>) vecObj.get(1),
            payment);
      }
    }
    return retval;
  }
  private void addCreate3rdInvoiceTrans(
      BillingClaimHeader1Data billHeader,
      List<BillingItemData> billItemList,
      BillingONPayment billOnPayment) {
    if (billItemList.size() < 1) {
      return;
    }
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Timestamp updateTs = new Timestamp(new Date().getTime());
    BillingOnTransaction billTrans = null;
    BillingOnTransactionDao billTransDao =
        (BillingOnTransactionDao) SpringUtils.getBean(BillingOnTransactionDao.class);
    for (BillingItemData billItem : billItemList) {
      billTrans = new BillingOnTransaction();
      billTrans.setActionType(BillingDataHlp.ACTION_TYPE.C.name());
      try {
        billTrans.setAdmissionDate(sdf.parse(billHeader.getAdmission_date()));
      } catch (Exception e) {
        billTrans.setAdmissionDate(null);
      }
      try {
        billTrans.setBillingDate(sdf.parse(billHeader.getBilling_date()));
      } catch (Exception e) {
        billTrans.setBillingDate(null);
      }

      billTrans.setBillingNotes(billHeader.getComment());
      billTrans.setBillingOnItemPaymentId(Integer.parseInt(billItem.getId()));
      billTrans.setCh1Id(Integer.parseInt(billHeader.getId()));
      billTrans.setClinic(billHeader.getClinic());
      billTrans.setCreator(billHeader.getCreator());
      billTrans.setDemographicNo(Integer.parseInt(billHeader.getDemographic_no()));
      billTrans.setDxCode(billItem.getDx());
      billTrans.setFacilityNum(billHeader.getFacilty_num());
      billTrans.setManReview(billHeader.getMan_review());
      billTrans.setPaymentDate(billOnPayment.getPaymentDate());
      billTrans.setPaymentId(billOnPayment.getId());
      billTrans.setPaymentType(billOnPayment.getPaymentTypeId());
      billTrans.setPayProgram(billHeader.getPay_program());
      billTrans.setProviderNo(billHeader.getProviderNo());
      billTrans.setProvince(billHeader.getProvince());
      billTrans.setRefNum(billHeader.getRef_num());
      billTrans.setServiceCode(billItem.getService_code());
      billTrans.setServiceCodeInvoiced(billItem.getFee());
      try {
        billTrans.setServiceCodeDiscount(new BigDecimal(billItem.getDiscount()));
      } catch (Exception e) {
        billTrans.setServiceCodeDiscount(BigDecimal.ZERO);
      }
      billTrans.setServiceCodeNum(billItem.getSer_num());
      try {
        billTrans.setServiceCodePaid(new BigDecimal(billItem.getPaid()));
      } catch (Exception e) {
        billTrans.setServiceCodePaid(BigDecimal.ZERO);
      }
      try {
        billTrans.setServiceCodeRefund(new BigDecimal(billItem.getRefund()));
      } catch (Exception e) {
        billTrans.setServiceCodeRefund(BigDecimal.ZERO);
      }
      billTrans.setStatus(billHeader.getStatus());
      billTrans.setSliCode(billHeader.getLocation());
      billTrans.setUpdateDatetime(updateTs);
      billTrans.setUpdateProviderNo(billHeader.getCreator());
      billTrans.setVisittype(billHeader.getVisittype());
      billTransDao.persist(billTrans);
    }
  }