function processPaymentNotice() {
  var output = { state: "init", debug: {}, error: "" };
  try {
    var sheet = getSheetStudentProgress();
    var last_row = getLastRow(sheet);
    output = { ...output, debug: { ...output.debug, last_row } };

    for (var i = ROW_START; i < last_row + 1; i++) {
      var email_cell = getCell(sheet, i, COL_STUDENT_PROGRESS_EMAIL_ADDRESS);
      var payment_progress_cell = getCell(
        sheet,
        i,
        COL_STUDENT_PROGRESS_PAYMENT_PROGRESS
      );
      var payment_progress = readCell(payment_progress_cell);

      if (checkNotNotifiedForPayment(payment_progress)) {
        resetResult(i);
        appendResult(
          i,
          `not notified(${CONST_NOT_NOTIFIED}), proceed send payment notification email`
        );

        var quota_available = checkEmailQuotaAvailable();
        var payment_link_available = checkPaymentLinkAvailable(i);
        if (quota_available && payment_link_available) {
          try {
            sendPaymentNoticeEmail(i);
            updateRowToNotificationSent(i);
          } catch (error) {
            Browser.msgBox("error during sending email");
          }
        } else {
          if (quota_available < 1) {
            Browser.msgBox(EMAIL_QUOTA_USED_UP);
          }
          if (!payment_link_available) {
            appendResult(i, `payment link not exist, skipping`);
          }
        }
      } else {
        resetResult(i);
        appendResult(i, `not "${CONST_NOT_NOTIFIED}" skipping`);
        // var student_email = readCell(email_cell);
      }
    }
  } catch (error) {
    output = { ...output, error };
    console.log(output);
  }
}
