回精華區
作者itoc, 信區: itoc
標題[功能] reaper.c 發站務板主薪水、全站發錢
時間03/08/17
作者: itoc (:MM:) 看板: plan
標題: [功能] reaper.c 發薪水 扣所得稅
時間: Sat Feb  8 13:51:36 2003                          Updated: 2005/05/08

  發板主薪水、全站發錢
  都可以在 reaper.c 處理

: reaper.c:reaper()

  ulevel = acct.userlevel;
  life = acct.lastlogin;        /* 必不為 0 */
  login = acct.numlogins;

+ levy_tax(&acct, fpath);

: reaper.c 新增以下這段於 reaper() 之前

static int              /* 是幾個板的板主 */
how_many_bm_i_am(userid)
  char *userid;
{
  BRD *bhdr, *tail;
  char *list;
  int count, len;

  count = 0;
  len = strlen(userid);
  bhdr = bshm->bcache;
  tail = bhdr + bshm->number;
  do
  {
    list = bhdr->BM;
    if (str_has(list, userid, len))
      count++;
  } while (++bhdr < tail);

  return count;
}


/*-------------------------------------------------------*/
/* 發信給使用者                                          */
/*-------------------------------------------------------*/


static void
add_mail(userid, fpath, title)           /* 發文給使用者 */
  char *userid;         /* 欲 mail 的使用者 */
  char *fpath;          /* 檔案路徑 */
  char *title;          /* 文章標題 */
{
  HDR hdr;
  char folder[64];

  usr_fpath(folder, userid, FN_DIR);
  hdr_stamp(folder, HDR_LINK, &hdr, fpath);
  strcpy(hdr.owner, STR_SYSOP);
  strcpy(hdr.nick, SYSOPNICK);
  strcpy(hdr.title, title);
  rec_add(folder, &hdr, sizeof(HDR));
}


static void
tax_mail(acct, gold, money)
  ACCT *acct;
  int gold, money;
{
  char fpath[64];
  FILE *fp;

  sprintf(fpath, "tmp/tax_mail_%s", acct->userid);   /* 暫存檔 */
  if (fp = fopen(fpath, "w"))
  {
    fprintf(fp, "\n    \033[1;37;44m %s 發薪及扣稅 \033[m \n\n", acct->userid);
    if (gold)
      fprintf(fp, "      金幣%s額:%d\n", gold > 0 ? "增" : "減", abs(gold));
    if (money)
      fprintf(fp, "      銀幣%s額:%d\n", money > 0 ? "增" : "減", abs(money));
    fclose(fp);

    add_mail(acct->userid, fpath, "[紀錄] 薪水袋、扣繳憑單");
    unlink(fpath);
  }
}


/*-------------------------------------------------------*/
/* 發薪水                                                */
/*-------------------------------------------------------*/


static void
levy_tax(acct, userid)
  ACCT *acct;
  char *userid;
{
  int money, gold;
  time_t start;
  struct tm *ptime;

  time(&start);
  ptime = localtime(&start);

  // 以下這整段的公式隨便怎麼寫 
  // 若要全站發獎金,也是改這裡的公式就可以 

  money = gold = 0;

  /* 全站發錢,每人 10 元 */
  money += 10;

  /* 板主發薪每板 200 元 */
  if (acct->userlevel & PERM_BM)
    money += how_many_bm_i_am(acct->userid) * 200;

  /* 站務發薪金幣 500 元 */
  if (acct->userlevel & PERM_ALLADMIN)
    gold += 500;

  // 以上這整段的公式隨便怎麼寫 

  if (money || gold)   /* 有金額變動才發信、發支票 */
  {
    PAYCHECK paycheck;
    char fpath[64];

    tax_mail(acct, gold, money);

    memset(&paycheck, 0, sizoef(PAYCHECK));
    time(&paycheck.tissue);
    paycheck.money = money;
    paycheck.gold = gold;
    strcpy(paycheck.reason, "系統發獎金");

    usr_fpath(fpath, acct->userid, FN_PAYCHECK);
    rec_add(fpath, &paycheck, sizeof(PAYCKECK));
  }
}


--
    ╭── Origin ╮  動力核心  processor.tfcis.org  ~ δεζ ──┼
    │     Modify ╯ 03/02/08 13:52:09 
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻