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

  1. #Version 2.3
  2.  
  3. #2.3 : Correction du bug qui dΘcalait les catΘgories
  4. #2.2 : correction de bugs
  5. #2.1 : possibilitΘ de supprimer ou de renomer un fichier d'ΘchΘance
  6. #2.0 : possibilitΘ de dΘcaler une ΘchΘance en avant ou en arriΦre
  7. #1.9 : nouveau script de mise α jour des catΘgories
  8.  
  9. import BP, cPickle, time
  10.  
  11. s = BP.BankPerfectExePath() + "Scripts\\Scheduler\\%s.dat"
  12. Dat = s %"scheduler"
  13. Units = ["jours", "mois", "ans"]
  14. modes = ["Carte", "Retrait DAB", "ChΦque Θmis", "PrΘlΦvement", "Virement Θmis", "TIP", "Versement", "DΘp⌠t de chΦque", "Virement reτu"]
  15. OtherMode = {0: 8, 1: 6, 2: 7, 3: 8, 4: 8, 5: 8, 6: 1, 7: 2, 8: 3}
  16. modesigns = [-1, -1, -1, -1, -1, -1, 1, 1, 1]
  17.  
  18. FrmFiles = """listbox=LstFiles;Left=20;Top=20;Anchors=lrtb;Width=400;Height=130;Text=%s;Enabled=1;ItemIndex=0
  19. button=BRename;Anchors=lb;Left=20;Top=130;Width=90;Height=25;Caption=Renommer
  20. button=BDelete;Anchors=lb;Left=120;Top=130;Width=90;Height=25;Caption=Supprimer
  21. button=BDouble;Anchors=lb;Left=220;Top=130;Width=90;Height=25;Caption=Dupliquer
  22. button=BClose;Anchors=lb;Left=320;Top=130;Width=90;Height=25;Caption=Fermer;cancel=1"""
  23.  
  24. FrmRecs = """grid=ListRecs;Left=20;Top=20;Width=700;Height=349;Anchors=lrtb;Rows=%d;Cols=5;Cells=Compte\\r\\nIntervalle\\r\\nTiers\\r\\nMontant\\r\\nProchaine ΘchΘance\\r\\n%s;Index=%d
  25. label=LInfo;Left=20;Top=372;Anchors=lb;Caption=%s
  26. button=BAdd;Left=20;Top=400;Width=80;Height=25;Anchors=lb;Caption=Ajouter
  27. button=BModify;Left=104;Top=400;Width=80;Height=25;Anchors=lb;Caption=Modifier
  28. button=BDelete;Left=188;Top=400;Width=80;Height=25;Anchors=lb;Caption=Supprimer
  29. button=BApply;Left=272;Top=400;Width=80;Height=25;Anchors=lb;Caption=Appliquer
  30. label=LDelta;Left=420;Top=384;Width=96;Height=13;Anchors=lb;Caption=DΘcaler l'ΘchΘance :
  31. button=BRewind;Left=384;Top=400;Width=80;Height=25;Anchors=lb;Caption=½ en arriΦre;hint=Avancer la date d'une pΘriode
  32. button=BForward;Left=468;Top=400;Width=80;Height=25;Anchors=lb;Caption=en avant ╗;hint=Reculer la date d'une pΘriode
  33. button=BClose;Left=628;Top=400;Width=90;Height=25;Anchors=rb;Caption=Fermer;Cancel=1"""
  34.  
  35. FrmApply = """label=LInsert;Left=20;Top=20;Width=85;Caption=InsΘrer jusqu'au :
  36. date=UntilDate;Left=20;Top=36;Width=260;Date=%s
  37. label=LWhat;Left=20;Top=80;Width=185;Caption=Quelles lignes souhaitez-vous insΘrer ?
  38. combo=CBWhat;Left=20;Top=96;Width=260;Text=La ligne sΘlectionnΘe\\r\\nLes lignes qui ne s'insΦrent pas automatiquement\\r\\nToutes les lignes\\r\\n;ItemIndex=0
  39. checkbox=CheckSimulation;Left=20;Top=136;Width=260;Caption=InsΘrer les lignes pour effectuer une simulation
  40. label=LSimulation;Left=36;Top=156;Width=212;Caption=(ne met pas α jour les dates des ΘchΘances);Color=CC0000
  41. button=BOK;Left=55;Top=192;Width=90;Height=25;Caption=OK;Default=1
  42. button=BCancel;Left=155;Top=192;Width=90;Height=25;Caption=Annuler;Cancel=1"""
  43.  
  44. FrmRec = """label=LMsg;Left=30;Top=30;Width=103;Bold=1;Color=%s;Caption=%s
  45. label=LNextDate;Left=30;Top=74;Width=103;Caption=Prochaine ΘchΘance :
  46. label=LThirdPartyDetails;Left=30;Top=198;Width=69;Caption=Tiers /DΘtails :
  47. label=LValue;Left=30;Top=244;Width=47;Caption=Montant :
  48. label=LModeCateg;Left=30;Top=156;Width=152;Caption=Mode de paiement / CatΘgorie :
  49. label=LDelta;Left=30;Top=288;Width=82;Caption=InsΘrer tous les :
  50. label=LAccount;Left=325;Top=288;Width=82;Caption=Compte :
  51. date=NextDate;Left=220;Top=70;Width=300;Date=%s
  52. checkbox=CheckEndDate;Left=30;Top=112;Width=175;Height=17;Caption=DerniΦre ΘchΘance (incluse) :;Checked=%d
  53. date=EndDate;Left=220;Top=110;Width=300;Date=%s
  54. combo=CBMode;Left=220;Top=152;Width=145;Text=%s\\r\\n;ItemIndex=%d
  55. combo=CBCateg;Left=375;Top=152;Width=145;Text=%s\\r\\n;ItemIndex=%d
  56. edit=EThirdParty;Left=220;Top=194;Width=145;Text=%s;Readonly=0
  57. edit=EDetails;Left=375;Top=194;Width=145;Text=%s;Readonly=0
  58. edit=EValue;Left=220;Top=240;Width=301;Text=%s;Readonly=0
  59. edit=EDelta;Left=220;Top=284;Width=30;Text=%s;Readonly=0
  60. combo=CBDeltaUnit;Left=255;Top=284;Width=60;Text=jour(s)\\r\\nmois\\r\\nan(s);ItemIndex=%d
  61. combo=CBAccounts;Left=375;Top=284;Width=145;Text=%s;ItemIndex=%d
  62. checkbox=CheckTransfer;Left=30;Top=325;Width=334;Height=20;Caption=Cette ΘchΘance est un transfert vers (ou depuis) le compte :;Enabled=1;Checked=%d
  63. combo=CBAccounts2;Left=375;Top=324;Width=145;Height=21;Text=%s;Enabled=1;ItemIndex=%d
  64. checkbox=CheckAutoInsert;Left=30;Top=350;Width=435;Height=17;Caption=InsΘrer automatiquement cette ΘchΘance α l'ouverture du fichier;Checked=%d
  65. label=LPostpone;Left=30;Top=385;Caption=DΘcaler l'Θchance si elle tombe un :
  66. checkbox=CheckSat;Left=210;Top=383;Caption=Samedi;Checked=%d
  67. checkbox=CheckDim;Left=290;Top=383;Caption=Dimanche;Checked=%d
  68. checkbox=CheckFer;Left=370;Top=383;Caption=Jour fΘriΘ;Checked=%d
  69. button=BOK;Left=283;Top=415;Width=90;Height=25;Caption=OK;Default=1
  70. button=BCancel;Left=181;Top=415;Width=90;Height=25;Caption=Annuler;Cancel=1"""
  71.  
  72. def CopyDic(dic):
  73.   new_dic = {}
  74.   for key in dic.keys():
  75.     new_dic[key] = dic[key]
  76.   return new_dic
  77.  
  78. def DaysOfMonth(y, m):
  79.   if m == 2 and (y % 4 == 0) and (y % 100 != 0 or y % 400 == 0): return 29
  80.   else: return [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1]
  81.  
  82. def AddYears(date, delta):
  83.   y, m, d = date
  84.   return y + delta, m, d
  85.  
  86. def AddDays(dt, delta):
  87.   y, m, d = dt
  88.   d += delta
  89.   if delta > 0:
  90.     while d > DaysOfMonth(y, m):
  91.       d -= DaysOfMonth(y, m)
  92.       m += 1
  93.       if m == 13: y += 1; m = 1
  94.   else:
  95.     while d < 1:
  96.       m -= 1
  97.       d += DaysOfMonth(y, m)
  98.       if  m == 0: y -= 1; m = 12
  99.   return y, m, d
  100.  
  101. def AddMonths(date, delta):
  102.   y, m, d = date
  103.   KeepLast = DaysOfMonth(y, m) == d
  104.   m += delta
  105.   if delta > 0:
  106.     while m > 12: y += 1; m -= 12
  107.   elif delta < 0:
  108.     while m < 1: y -= 1; m += 12;
  109.  
  110.   LastDay = DaysOfMonth(y, m)
  111.   if KeepLast or d > LastDay: return y, m, LastDay
  112.   else: return y, m, d
  113.  
  114. def Add2Date(dt, d, u):
  115.   if u == 0: return AddDays(dt, d)
  116.   elif u == 1: return AddMonths(dt, d)
  117.   else: return AddYears(dt, d)
  118.  
  119. def DayOfWeek(y, m, d):
  120.   t = time.mktime((y, m, d, 12, 0, 0, 0, 0, 0))
  121.   return time.localtime(t)[6]
  122.  
  123. def Easter(Y):
  124.   C = Y / 100
  125.   H = (19 * (Y % 19) + C - (C / 4) - ((8 * C + 13) / 25) + 15) % 30
  126.   I = ((H / 28) * (29 / (H + 1)) * ((21 - (Y % 19)) / 11) - 1) * (H / 28) + H
  127.   R = 28 + I - (((Y / 4 + Y) + I + 2 + (C / 4) - C) % 7)
  128.   if R <= 31: return (Y, 3, R)
  129.   else: return (Y, 4, R - 31)
  130.  
  131. print Easter(2006)
  132.  
  133. def NonWorkingDay(dt, include): #include: DSF, D=dim, S=sam, F=FΘriΘ
  134.   y, m, d = dt
  135.   dw = DayOfWeek(y, m, d)
  136.   if "D" in include and dw == 6: return 1
  137.   if "S" in include and dw == 5: return 1
  138.   if "F" in include:
  139.     if (m, d) in [(1, 1), (5, 1), (8, 1), (7, 14), (8, 15), (11, 1), (11, 11), (12, 25)]: return 1
  140.     E = Easter(y)
  141.     #Lundi de pΓques, Jeudi ascension, Lundi de Pentecote
  142.     if (y, m, d) in [AddDays(E, 1), AddDays(E, 39), AddDays(E, 50)]: return 1
  143.   return 0
  144.  
  145. def NextWorkingDate(dt, include):
  146.   while NonWorkingDay(dt, include): dt = AddDays(dt, 1)
  147.   return dt
  148.  
  149. def parse(v):
  150.   lines = v.replace("\r\n", "\n").replace("\r", "\n").split("\n")
  151.   d = {}
  152.   for line in lines:
  153.     i = line.find("=")
  154.     if i > -1: d[line[:i]] = line[i + 1:]
  155.   return d
  156.  
  157. def ExtractFName(path):
  158.   while path.find("\\") > -1:
  159.     path = path[path.find("\\") + 1:]
  160.   return path
  161.  
  162. def Rec2Str(Rec):
  163.   dl = Rec["delta"]
  164.   d = Rec["deltaunit"]
  165.   if dl == 1: s = "Tous les %s" %Units[d]
  166.   else: s = "Tous les %d %s" %(dl, Units[d])
  167.   try:
  168.     acc_name = AccNames[Rec["account"]]
  169.   except:
  170.     acc_name = "COMPTE INACCESSIBLE"
  171.   if Rec.get("transfer", -1) > -1: trf = " (transfert)"
  172.   else: trf = ""
  173.   return "%s\\r\\n%s\\r\\n%s%s\\r\\n%.2f\\r\\n%s" %(acc_name, s, Rec["tiers"], trf, Rec["montant"], Date2Str(Rec["nextdate"]))
  174.  
  175. def Date2Str(date):
  176.   if date == (0, 0, 0): y, m, d = time.localtime()[:3]
  177.   else: y, m, d = date
  178.   return "%.02d/%.02d/%.04d" %(d, m, y)
  179.  
  180. def Str2Date(d):
  181.   l = d.replace("/", "-").split("-")
  182.   return int(l[2]), int(l[1]), int(l[0])
  183.  
  184. def Str2Float(s, Def):
  185.   s = s.replace("$", "").replace(" ", "").replace("Ç", "").replace("F", "").replace(",", ".")
  186.   if "." in s:
  187.     l = s.split(".")
  188.     s = "%s.%s" %( "".join(l[:-1]), l[-1] )
  189.   try:
  190.     return float(s)
  191.   except:
  192.     return Def
  193.  
  194. def IBool(b):
  195.   if b: return 1
  196.   return 0
  197.  
  198. def EditRec(Rec0):
  199.   Rec = CopyDic(Rec0)
  200.   StrAcc = "\\r\\n".join(accounts)
  201.   AccIdx = BP.AccountCurrent()
  202.   color = "000000"
  203.  
  204.   StrCtg = "\\r\\n".join(["Sans catΘgorie"] + CNames)
  205.   StrModes = "\\r\\n".join(modes)
  206.   caption = ("Modifier une ΘchΘance", "Ajouter une ΘchΘance")[Rec == {}]
  207.  
  208.   #Affichage de la form
  209.   show = 1
  210.   msg = "Saisissez la valeur de chaque champ de l'ΘchΘance"
  211.   while show:
  212.     Postpone = Rec.get("Postpone", "")
  213.     PostponeSat = IBool("S" in Postpone)
  214.     PostponeDim = IBool("D" in Postpone)
  215.     PostponeFer = IBool("F" in Postpone)
  216.     people = Rec.get("tiers", "")
  217.     details = Rec.get("details", "")
  218.     value = abs(Rec.get("montant", 0))
  219.     delta = Rec.get("delta", "1")
  220.     nextdate = Date2Str(Rec.get("nextdate", (0, 0, 0)))
  221.     enddate = Date2Str(Rec.get("enddate", (0, 0, 0)))
  222.     categ = CPositions.get(Rec.get("categ", -1), -1) + 1
  223.     mode = Rec.get("mode", 3)
  224.     du = Rec.get("deltaunit", 1)
  225.     checkdate = Rec.get("enddate", (0, 0, 0)) > (0, 0, 0)
  226.     AutoInsert = Rec.get("autoinsert", 1)
  227.     AccIdx = Rec.get("account", 0)
  228.     Acc2Idx = Rec.get("transfer", -1)
  229.     check_transfer = Acc2Idx > -1
  230.  
  231.     params = (color, msg, nextdate, checkdate, enddate, StrModes, mode, StrCtg, categ, people, details, value, delta, du, StrAcc, AccIdx, check_transfer, StrAcc, Acc2Idx, AutoInsert, PostponeSat, PostponeDim, PostponeFer)
  232.     result = parse(BP.CustomForm(caption, FrmRec %params, 562, 480))
  233.     if result["SelectedButton"] == "BOK":
  234.       msg = ""
  235.       if result["CheckEndDate"] == "1": Rec["enddate"] = Str2Date(result["EndDate"])
  236.       else: Rec["enddate"] = (0, 0, 0)
  237.       Rec["nextdate"]   = Str2Date(result["NextDate"])
  238.       Rec["mode"]       = int(result["CBMode"])
  239.       Rec["tiers"]      = result["EThirdParty"]
  240.       Rec["details"]    = result["EDetails"]
  241.       Rec["categ"]      = CIndexes.get(int(result["CBCateg"]) - 1, 0)
  242.       Rec["montant"]    = Str2Float(result["EValue"], 0)
  243.       Rec["autoinsert"] = int(result["CheckAutoInsert"])
  244.       Rec["account"]    = int(result["CBAccounts"])
  245.       
  246.       Postpone = ""
  247.       if result["CheckSat"] == "1": Postpone += "S"
  248.       if result["CheckDim"] == "1": Postpone += "D"
  249.       if result["CheckFer"] == "1": Postpone += "F"
  250.       Rec["Postpone"] = Postpone
  251.  
  252.       if int(result["CheckTransfer"]):
  253.         Rec["transfer"] = int(result["CBAccounts2"])
  254.         if Rec["transfer"] == Rec["account"]: msg = "Il faut choisir deux comptes diffΘrents pour un transfert"
  255.       else: Rec["transfer"] = -1
  256.         
  257.       try:
  258.         Rec["delta"] = int(result["EDelta"])
  259.         if Rec["delta"] < 1: Rec["delta"] = 1
  260.       except:
  261.         msg = "Intervalle incorrect"
  262.         Rec["delta"] = 1
  263.       Rec["deltaunit"]  = int(result["CBDeltaUnit"])
  264.       
  265.       if msg == "":
  266.         if Rec["montant"] == 0: msg = "Un montant non nul est obligatoire"
  267.         elif Rec["tiers"] == "": msg = "Le tiers est obligatoire"
  268.  
  269.       if msg == "":
  270.         #Calcul automatique du signe du montant:
  271.         Rec["montant"] = modesigns[Rec["mode"]] * abs(Rec["montant"])
  272.         return Rec
  273.       else:
  274.         color = "dd0000"
  275.     else:
  276.       return Rec0
  277.       show = 0
  278.  
  279. def ApplyRec(RecList, SelecIdx):
  280.   until = time.localtime()[:3]
  281.   result = parse(BP.CustomForm("InsΘrer des ΘchΘances", FrmApply %(Date2Str(until)), 300, 270))
  282.   if result["SelectedButton"] != "BOK": return
  283.   
  284.   what = result["CBWhat"]
  285.   
  286.   if result["CheckSimulation"] == "1": CurrentRecs = [d.copy() for d in RecList]
  287.   else: CurrentRecs = RecList
  288.   
  289.   if what == "0": CurrentRecs = CurrentRecs[SelecIdx:SelecIdx + 1]
  290.   elif what == "1": CurrentRecs = [r for r in CurrentRecs if r.get("auto_insert", 1) != 1]
  291.   
  292.   inserted = []
  293.   for Rec in CurrentRecs:
  294.     if Rec["account"] > BP.AccountCount() - 1: continue
  295.     
  296.     until = Str2Date(result["UntilDate"])
  297.     
  298.     enddate = Rec["enddate"]
  299.     if enddate != (0, 0, 0) and enddate < until: until = enddate
  300.  
  301.     acc1 = Rec.get("account", 0)
  302.     acc2 = Rec.get("transfer", -1)
  303.  
  304.     ctg = Rec["categ"]
  305.     if not CPositions.has_key(ctg): ctg = -1
  306.     while Rec["nextdate"] <= until:
  307.       DateInsert = Rec["nextdate"]
  308.       if Rec.get("Postpone", ""): DateInsert = NextWorkingDate(DateInsert, Rec["Postpone"])
  309.       date = Date2Str(DateInsert)
  310.       if acc2 > -1:
  311.         #Transfert de compte α compte
  312.         n1 = AccNames[acc1]
  313.         n2 = AccNames[acc2]
  314.         mode1 = Rec["mode"]
  315.         mode2 = OtherMode[mode1]
  316.         if mode1 in [0, 1, 2, 3, 4, 5]:
  317.           sens1 = "vers"
  318.           sens2 = "depuis"
  319.         else:
  320.           sens1 = "depuis"
  321.           sens2 = "vers"
  322.         BP.LineAdd(acc1, date, modes[mode1], "Transfert %s le compte %s" %(sens1, n2), Rec["details"], ctg, Rec["montant"], 0)
  323.         BP.LineAdd(acc2, date, modes[mode2], "Transfert %s le compte %s" %(sens2, n1), Rec["details"], ctg, -Rec["montant"], 0)
  324.       else:
  325.         #OpΘration standard
  326.         BP.LineAdd(acc1, date, modes[Rec["mode"]], "[auto] " + Rec["tiers"], Rec["details"], ctg, Rec["montant"], 0)
  327.       inserted.append("- EchΘance %s le %s" %(Rec["tiers"], date))
  328.       Rec["nextdate"] = Add2Date(Rec["nextdate"], Rec["delta"], Rec["deltaunit"])
  329.   l = len(inserted)
  330.   if l == 0:
  331.     BP.MsgBox("Aucune ΘchΘance n'a ΘtΘ insΘrΘe", 0)
  332.   else:
  333.     if l == 1: BP.MsgBox("Une ΘchΘance a ΘtΘ insΘrΘe :\r\n\r\n%s" %inserted[0], 0)
  334.     else: BP.MsgBox("%d ΘchΘances ont ΘtΘ insΘrΘes :\r\n\r\n%s" %(l, "\r\n".join(inserted)), 0)
  335.     BP.AccountRefreshScreen()
  336.     files[FName] = Recs
  337.     SaveFile()
  338.  
  339. def SaveFile():
  340.   f = open(Dat, "wb")
  341.   cPickle.dump(files, f, 1)
  342.   f.close()
  343.  
  344.  
  345.  
  346. try:
  347.   f = open(Dat, "rb")
  348.   files = cPickle.load(f)
  349.   f.close()
  350. except:
  351.   files = {}
  352.  
  353. FNames = files.keys()
  354. FPath = BP.BankPerfectFileName()
  355.  
  356. btn = "Show"
  357.  
  358. if FPath == "":
  359.  
  360.   while btn in ["Show", "BDelete", "BRename", "BDouble"]:
  361.     if files == {}:
  362.       BP.MsgBox("Il n'y a aucune ΘchΘance α afficher", 0)
  363.       btn = "BClose"
  364.     else:
  365.       LstFiles = "\\r\\n".join(FNames)
  366.       result = parse(BP.CustomForm("Fichiers contenant des ΘchΘances", FrmFiles %LstFiles, -440, -210))
  367.       btn = result["SelectedButton"]
  368.       SelecIdx = int(result["LstFiles"])
  369.       FName = FNames[SelecIdx]
  370.       if btn == "BRename":
  371.         send_ok, new_key = BP.InputText("Renommer un fichier", "Saisissez le nouveau nom du fichier .bp", FName)
  372.         if send_ok and new_key != FName:
  373.           value = files[FName]
  374.           files[new_key] = value
  375.           del(files[FName])
  376.           SaveFile()
  377.           FNames = files.keys()
  378.       if btn == "BDouble":
  379.         new_f = BP.OpenDialog("SΘlectionnez le fichier o∙ importer les ΘchΘances", "", ".bp", "Fichier BankPerfect (*.bp)|*.bp")
  380.         new_f = new_f[new_f.rfind("\\") + 1:]
  381.         if new_f != "" and new_f != FName:
  382.           value = files[FName]
  383.           files[new_f] = value
  384.           SaveFile()
  385.           FNames = files.keys()
  386.       if btn == "BDelete":
  387.         if BP.MsgBox("Supprimer les ΘchΘances du fichier %s ?" %FName, 4) == 6:
  388.           del(files[FName])
  389.           SaveFile()
  390.           FNames = files.keys()
  391. else:
  392.   cnames = BP.CategName
  393.   CTrimNames = []
  394.   CPositions = {-1: -1}
  395.   CIndexes = {-1: -1}
  396.   CNames = []
  397.   for i, c in enumerate(cnames):
  398.     p = c.find("=")
  399.     CNames.append(c[p+1:])
  400.     CTrimNames.append(c[p+1:].strip())
  401.     idx = int(c[:p])
  402.     CPositions[idx] = i
  403.     CIndexes[i] = idx
  404.   accounts = BP.AccountName
  405.   AccNames = BP.AccountName;
  406.   FName = ExtractFName(FPath)
  407.   if not files.has_key(FName): files[FName] = []
  408.   Recs = files[FName]
  409.   ShowFrm = 1
  410.   SelecIdx = 0
  411.   
  412.   Recs = [(r["nextdate"], r) for r in Recs]
  413.   Recs.sort()
  414.   Recs = [r[1] for r in Recs]
  415.   
  416.   while ShowFrm:
  417.     StrRec = "\\r\\n".join([Rec2Str(Rec) for Rec in Recs])
  418.     NbRec = len(Recs)
  419.     if NbRec == 0: StrNbRec = "Aucune ΘchΘance"
  420.     elif NbRec == 1: StrNbRec = "Une ΘchΘance"
  421.     else: StrNbRec = "%d ΘchΘances" %NbRec
  422.     result = parse(BP.CustomForm("EchΘances du fichier %s" %FName, FrmRecs %(NbRec + 1, StrRec, SelecIdx + 1, StrNbRec), -740, -445))
  423.     btn = result["SelectedButton"]
  424.     SelecIdx = int(result["ListRecs"])
  425.     if btn == "BDelete":
  426.       if SelecIdx == -1: BP.MsgBox("Veuillez sΘlectionner l'ΘchΘance α supprimer", 0)
  427.       elif BP.MsgBox("Supprimer l'ΘchΘance %s ?" %Recs[SelecIdx]["tiers"], 4) == 6:
  428.         del(Recs[SelecIdx])
  429.         max_val = len(Recs) - 1
  430.         if SelecIdx > max_val: SelecIdx = max_val
  431.         files[FName] = Recs
  432.         SaveFile()
  433.     elif btn == "BAdd":
  434.       Rec = EditRec({})
  435.       if Rec != {}: Recs.append(Rec)
  436.       SelecIdx = len(Recs) - 1
  437.       files[FName] = Recs
  438.       SaveFile()
  439.     elif btn == "BModify":
  440.       if SelecIdx == -1: BP.MsgBox("Vous devez tout d'abord sΘlectionner l'ΘchΘance α modifier.\r\nSi vous souhaitez crΘer une ΘchΘance, cliquez sur le bouton 'Ajouter'", 0)
  441.       else:
  442.         Recs[SelecIdx] = EditRec(Recs[SelecIdx])
  443.         files[FName] = Recs
  444.         SaveFile()
  445.     elif btn == "BApply":
  446.       if FPath == "": BP.MsgBox("Il n'y a pas de fichier BankPerfect ouvert", 0)
  447.       else: ApplyRec(Recs, SelecIdx)
  448.     elif btn == "BForward":
  449.       if SelecIdx > -1:
  450.         Rec = Recs[SelecIdx]
  451.         Rec["nextdate"] = Add2Date(Rec["nextdate"], Rec["delta"], Rec["deltaunit"])
  452.         files[FName] = Recs
  453.         SaveFile()
  454.     elif btn == "BRewind":
  455.       if SelecIdx > -1:
  456.         Rec = Recs[SelecIdx]
  457.         Rec["nextdate"] = Add2Date(Rec["nextdate"], -Rec["delta"], Rec["deltaunit"])
  458.         files[FName] = Recs
  459.         SaveFile()
  460.     else:
  461.       btn = ""
  462.       ShowFrm = 0