home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Freeware 31 / FreelogHS31.iso / ArgentCompta / Bankperfect / bp.exe / Scripts / Scheduler / scheduler_auto.py < prev    next >
Text File  |  2007-03-25  |  6KB  |  178 lines

  1. #Version 1.5
  2.  
  3. import BP, cPickle, time
  4. global modes, files, inserted_lines, refused_lines
  5.  
  6. inserted_lines = []
  7. transfer_other_mode = {0: 8, 1: 6, 2: 7, 3: 8, 4: 8, 5: 8, 6: 1, 7: 2, 8: 3}
  8. data_path = "%sScripts\\Scheduler\\scheduler.dat" %BP.BankPerfectExePath()
  9. modes = ["Carte", "Retrait DAB", "ChΦque Θmis", "PrΘlΦvement", "Virement Θmis", "TIP", "Versement", "DΘp⌠t de chΦque", "Virement reτu"]
  10.  
  11. def DaysOfMonth(y, m):
  12.   is_leap_year = (y % 4 == 0) and (y % 100 != 0 or y % 400 == 0)
  13.   days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  14.   if m == 2 and is_leap_year: return 29
  15.   else: return days[m - 1]
  16.  
  17. def add_years(date, delta):
  18.   y, m, d = date
  19.   return y + delta, m, d
  20.  
  21. def AddDays(dt, delta):
  22.   y, m, d = dt
  23.   d += delta
  24.   if delta > 0:
  25.     while d > DaysOfMonth(y, m):
  26.       d -= DaysOfMonth(y, m)
  27.       m += 1
  28.       if m == 13: y += 1; m = 1
  29.   else:
  30.     while d < 1:
  31.       m -= 1
  32.       d += DaysOfMonth(y, m)
  33.       if  m == 0: y -= 1; m = 12
  34.   return y, m, d
  35.  
  36. def AddMonths(date, delta):
  37.   y, m, d = date
  38.   is_last_day = DaysOfMonth(y, m) == d
  39.   m += delta
  40.   if delta > 0:
  41.     while m > 12: y += 1; m -= 12
  42.   elif delta < 0:
  43.     while m < 1: y -= 1; m += 12;
  44.  
  45.   last_day = DaysOfMonth(y, m)
  46.   if is_last_day or d > last_day: return y, m, last_day
  47.   else: return y, m, d
  48.  
  49. def add_to_date(date, delta, unit):
  50.   if unit == 0: #jours
  51.     return AddDays(date, delta)
  52.   elif unit == 1: #mois
  53.     return AddMonths(date, delta)
  54.   else: #annΘes
  55.     return add_years(date, delta)
  56.  
  57. def date_to_str(date):
  58.   if date == (0, 0, 0): y, m, d = time.localtime()[:3]
  59.   else: y, m, d = date
  60.   return "%.02d/%.02d/%.04d" %(d, m, y)
  61.  
  62. def extract_file_name(path):
  63.   while path.find("\\") > -1:
  64.     path = path[path.find("\\") + 1:]
  65.   return path
  66.  
  67. def record_to_str(record):
  68.   return "Compte %s : ΘchΘance \"%s\" du %s (montant : %.2f)" %(account_names[record["account"]], record["tiers"], date_to_str(record["nextdate"]), record["montant"])
  69.  
  70. def Easter(Y):
  71.   C = Y / 100
  72.   H = (19 * (Y % 19) + C - (C / 4) - ((8 * C + 13) / 25) + 15) % 30
  73.   I = ((H / 28) * (29 / (H + 1)) * ((21 - (Y % 19)) / 11) - 1) * (H / 28) + H
  74.   R = 28 + I - (((Y / 4 + Y) + I + 2 + (C / 4) - C) % 7)
  75.   if R <= 31: return (Y, 3, R)
  76.   else: return (Y, 4, R - 31)
  77.  
  78. def DayOfWeek(y, m, d):
  79.   t = time.mktime((y, m, d, 12, 0, 0, 0, 0, 0))
  80.   return time.localtime(t)[6]
  81.  
  82. def NonWorkingDay(dt, include): #include: DSF, D=dim, S=sam, F=FΘriΘ
  83.   y, m, d = dt
  84.   dw = DayOfWeek(y, m, d)
  85.   if "D" in include and dw == 6: return 1
  86.   if "S" in include and dw == 5: return 1
  87.   if "F" in include:
  88.     if (m, d) in [(1, 1), (5, 1), (8, 1), (7, 14), (8, 15), (11, 1), (11, 11), (12, 25)]: return 1
  89.     E = Easter(y)
  90.     #Lundi de pΓques, Jeudi ascension, Lundi de Pentecote
  91.     if (y, m, d) in [AddDays(E, 1), AddDays(E, 39), AddDays(E, 50)]: return 1
  92.   return 0
  93.  
  94. def NextWorkingDate(dt, include):
  95.   while NonWorkingDay(dt, include): dt = AddDays(dt, 1)
  96.   return dt
  97.  
  98. def apply_record(record):
  99.   global inserted_lines, refused_lines
  100.   until = time.localtime()[:3]
  101.   enddate = record["enddate"]
  102.   if enddate != (0, 0, 0) and enddate < until: until = enddate
  103.   
  104.   account_number1 = record["account"]
  105.   account_number2 = record.get("transfer", -1)
  106.   max_account_number = BP.AccountCount() - 1
  107.   if account_number1 > max_account_number or account_number2 > max_account_number:
  108.     refused_lines.append(record_to_str(record) + "... compte inexistant")
  109.   else:
  110.     while record["nextdate"] <= until:
  111.       DateInsert = record["nextdate"]
  112.       if record.get("Postpone", ""): DateInsert = NextWorkingDate(DateInsert, record["Postpone"])
  113.       date = date_to_str(DateInsert)
  114.       count1 = BP.OperationCount[account_number1]
  115.       ctg = record["categ"]
  116.       if ctg >= CntCtg: ctg = -1
  117.       if account_number2 > -1:
  118.         #Transfert de compte α compte
  119.         n1 = account_names[account_number1]
  120.         n2 = account_names[account_number2]
  121.         mode1 = record["mode"]
  122.         mode2 = transfer_other_mode[mode1]
  123.         if mode1 in [0, 1, 2, 3, 4, 5]:
  124.           direction1 = "vers"
  125.           direction2 = "depuis"
  126.         else:
  127.           direction1 = "depuis"
  128.           direction2 = "vers"
  129.         BP.LineAdd(account_number1, date, modes[mode1], "Transfert %s le compte %s" %(direction1, n2), \
  130.                    record["details"], ctg, record["montant"], 0)
  131.         BP.LineAdd(account_number2, date, modes[mode2], "Transfert %s le compte %s" %(direction2, n1), \
  132.                    record["details"], ctg, -record["montant"], 0)
  133.       else:
  134.         #OpΘration standard
  135.         BP.LineAdd(account_number1, date, modes[record["mode"]], "[auto] " + record["tiers"], \
  136.                    record["details"], ctg, record["montant"], 0)
  137.       
  138.       count2 = BP.OperationCount[account_number1]
  139.       if count1 == count2: refused_lines.append(record_to_str(record))
  140.       else: inserted_lines.append(record_to_str(record))
  141.       record["nextdate"] = add_to_date(record["nextdate"], record["delta"], record["deltaunit"])
  142.  
  143.  
  144.  
  145.  
  146. try:
  147.   f = open(data_path, "rb")
  148.   files = cPickle.load(f)
  149.   f.close()
  150. except:
  151.   files = {}
  152.  
  153. account_names = BP.AccountName;
  154. inserted_lines = []
  155. refused_lines = []
  156. filename = extract_file_name(BP.BankPerfectFileName())
  157.  
  158. if files.has_key(filename):
  159.   CntCtg = BP.CategCount()
  160.   records = files[filename]
  161.   
  162.   lastaccount = BP.AccountCount() - 1
  163.   for record in records:
  164.     if record.get("autoinsert", 1) and record["account"] <= lastaccount:
  165.       apply_record(record)
  166.  
  167.   if len(inserted_lines) + len(refused_lines) > 0:
  168.     f = open(data_path, "wb")
  169.     cPickle.dump(files, f, 1)
  170.     f.close()
  171.     
  172.     s = "EchΘancier :\r\n\r\n"
  173.     if len(inserted_lines) > 0: s += "Lignes insΘrΘes :\r\n%s\r\n" %"\r\n".join(inserted_lines)
  174.     if len(refused_lines) > 0: s += "Lignes refusΘes :\r\n%s" %"\r\n".join(refused_lines)
  175.     BP.MsgBox(s, 0)
  176.  
  177.   BP.AccountRefreshScreen()
  178.