home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Freeware 31 / FreelogHS31.iso / ArgentCompta / Bankperfect / bp.exe / Scripts / Scheduler / previsions.py < prev    next >
Text File  |  2005-11-05  |  8KB  |  178 lines

  1. import BP, cPickle, time
  2. exe = BP.BankPerfectExePath()
  3.  
  4. def DaysOfMonth(y, m):
  5.   if m == 2 and (y % 4 == 0) and (y % 100 != 0 or y % 400 == 0): return 29
  6.   else: return [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1]
  7.  
  8. def AddD(date, delta):
  9.   s = time.mktime(date + (3, 0, 0, 0, 0, 0))
  10.   return time.gmtime(s + 86400 * delta)[:3]
  11.  
  12. def AddM(date, delta):
  13.   y, m, d = date
  14.   KeepLastDay = DaysOfMonth(y, m) == d
  15.   m += delta
  16.   if delta > 0:
  17.     while m > 12: y += 1; m -= 12
  18.   elif delta < 0:
  19.     while m < 1: y -= 1; m += 12;
  20.  
  21.   LastDay = DaysOfMonth(y, m)
  22.   if KeepLastDay or d > LastDay: return y, m, LastDay
  23.   else: return y, m, d
  24.  
  25. def Add2Date(d, delta, unit):
  26.   if unit == 0: return AddD(d, delta)
  27.   elif unit == 1: return AddM(d, delta)
  28.   else: return d[0] + delta, d[1], d[2]
  29.  
  30. def Reduce2Month(Vals):
  31.   d = {}
  32.   for v in Vals:
  33.     k = (v[0][0], v[0][1])
  34.     d[k] = (v[1], d.get(k, (0, 0))[1] + v[2])
  35.   K = d.keys()
  36.   K.sort()
  37.   return [((k[0], k[1], DaysOfMonth(k[0], k[1])), d[k][0], d[k][1]) for k in K]
  38.  
  39. def Cumul(Vals):
  40.   t = sum([BP.OperationAmount[Acc][i] for i in BP.VisibleLines()])
  41.   last_date = max([(int(d[6:]), int(d[3:5]), int(d[:2])) for d in BP.OperationDate[Acc]])
  42.   l = [(last_date, "Solde actuel", t, t)]
  43.   Max = abs(t)
  44.   for v in Vals:
  45.     if v[0] > last_date:
  46.       t += v[2]
  47.       if abs(t) > Max: Max = abs(t)
  48.       l.append( (v[0], v[1], v[2], t) )
  49.   return [v + (int(1000 * v[3] / Max), ) for v in l]
  50.  
  51. def ApplyRec(Vals, Rec, Acc, Until):
  52.   End, n = Rec["enddate"], "nextdate"
  53.   if End != (0, 0, 0) and End < Until: Until = End
  54.   while Rec[n] <= Until:
  55.     Vals.append((Rec[n], Rec["tiers"], Rec["montant"]))
  56.     Rec[n] = Add2Date(Rec[n], Rec["delta"], Rec["deltaunit"])
  57.  
  58. def bar(v, p):
  59.   w = p / 10
  60.   if w == 0: clr = "dddddd"
  61.   elif v < 0: clr = "cc0000"
  62.   else: clr = "007700"
  63.   head = '<table width="100" border="0" height="10" cellspacing="0"><tr>'
  64.   foot = '</td></tr></table>'
  65.   if w == 100 or w == 0: return '%s<td colspan="2" height="10" bgcolor="#%s" width="100%%">%s' %(head, clr, foot)
  66.   else: return '%s<td height="10" bgcolor="#%s" width="%s%%"></td><td height="10" bgcolor="#dddddd" width="%s%%">%s' %(head, clr, w, 100 - w, foot)
  67.  
  68. def Export(Sender):
  69.   s = "\n".join(['<tr><td align="right">%.2d %s %.4d</td><td>%s</td><td align="right">%.2f</td><td align="right">%.2f</td><td>%s</td></tr>' %(v[0][2], mois[v[0][1] - 1], v[0][0], v[1], v[2], v[3], bar(v[2], v[3])) for v in Vals])
  70.   s = '<html><head><style>.t, td, h2 {border: solid 1px #000;font-family: Arial}</style></head><body><h2 align="center">Tableau prévisionnel du compte %s</h2><table class="t" align="center" border="0">\n<tr><td align="center" bgcolor="#dddddd">Date</td><td align="center" bgcolor="#dddddd">Montant</td><td align="center" bgcolor="#dddddd">Solde</td><td align="center" bgcolor="#dddddd">Progression</td></tr>\n%s\n</table></body></html>' %(path, s)
  71.   open("%sexport.htm" %exe, "w").write(s)
  72.   BP.ShellExecute("open", "%sexport.htm" %exe, "", 1)
  73.  
  74. def draw(Sender, ACol, ARow, R, State):
  75.   cv = Sender.Canvas
  76.   cv.Font.Color = 0x00000000
  77.   if "gdSelected" in State: cv.Brush.Color = 0x00dec5b9
  78.   elif ARow > 0 and ARow % 2 == 0: cv.Brush.Color = 0x00f0f0f0
  79.   cv.FillRect(R)
  80.  
  81.   try:
  82.     if ARow == 0:
  83.       s = ["Date", "Tiers", "Montant", "Solde", "Progression"][ACol]
  84.       cv.Font.Style = ["fsBold"]
  85.     else:
  86.       v = Vals[ARow - 1]
  87.       if ACol == 0: s = "%.2d %s %.4d" %(v[0][2], mois[v[0][1] - 1], v[0][0])
  88.       elif ACol == 1: s = str(v[1])
  89.       elif ACol in [2, 3]:
  90.         s = "%.2f" %v[ACol]
  91.         if v[ACol] < 0: cv.Font.Color = 0x000000CC
  92.         else: cv.Font.Color = 0x00003300
  93.       else:
  94.         s = ""
  95.         w = int(abs(v[4]) * (R.Right - R.Left - 6) / 1000.0)
  96.         R.Left, R.Right, R.Top, R.Bottom = R.Left + 3, R.Left + w, R.Top + 6, R.Bottom - 6
  97.         if R.Right <= R.Left: R.Right = R.Left + 1
  98.         cv.Brush.Color = 0x00000000
  99.         cv.FillRect(R)
  100.         R.Left, R.Right, R.Top, R.Bottom = R.Left + 1, R.Right - 1, R.Top + 1, R.Bottom - 1
  101.         if v[4] < 0: cv.Brush.Color = 0x000000CC
  102.         else: cv.Brush.Color = 0x00007700
  103.         cv.FillRect(R)
  104.   except:
  105.     s = ""
  106.  
  107.   if s != "":
  108.     Y = (R.Bottom - R.Top - dY) / 2
  109.     if Y < 3: Y = 3
  110.     if ACol == 0 or ARow == 0:
  111.       X = (R.Right - R.Left - cv.TextWidth(s)) / 2
  112.       if X < 3: X = 3
  113.       X = R.Left + X
  114.     elif ACol in [2, 3]:
  115.       X = R.Right - 3 - cv.TextWidth(s)
  116.     else:
  117.       X = R.Left + 3
  118.     cv.TextRect(R, X, R.Top + Y, s)
  119.   cv.Brush.Style = 1
  120.  
  121. def Resize(S):
  122.   Grid.DefaultColWidth = (Grid.Width - 40) / 5
  123.  
  124. f = CreateComponent("TForm", None)
  125. f.SetProps(Position="poMainFormCenter", Width=280, Height=205, BorderStyle="bsSingle", BorderIcons=["biSystemMenu","biMinimize"], Caption="PrΘvisions")
  126. f.Font.Name = "Tahoma"
  127. L1 = CreateComponent("TLabel", f)
  128. L1.SetProps(Parent=f, Left=30, Top=30, Width=201, Caption="Calculer le tableau prΘvisionnel jusqu'au :")
  129. Dt1 = CreateComponent("TDateTimePicker", f)
  130. Dt1.SetProps(Parent=f, Left=30, Top=50, Width=214, Height=20, Format="dddd dd MMMM yyyy")
  131. now = time.localtime()[:3]
  132. now = (now[0] + 1, now[1], now[2])
  133. Dt1.Date = time.mktime(now + (1, 0, 0, 0, 0, 0)) / 86400 + 25569
  134. ChkEnd = CreateComponent("TCheckBox", f)
  135. ChkEnd.SetProps(Parent=f, Left=30, Top=80, Width=214, Caption="Afficher des soldes mensuels")
  136. BCnl = CreateComponent("TButton", f)
  137. BCnl.SetProps(Parent=f, Left=48, Top=120, Width=90, Height=25, Caption="Annuler", Cancel=1, ModalResult=2)
  138. BOK = CreateComponent("TButton", f)
  139. BOK.SetProps(Parent=f, Left=144, Top=120, Width=90, Height=25, Caption="OK", Default=1, ModalResult=1)
  140.  
  141. try:
  142.   fn = open("%sScripts\\Scheduler\\scheduler.dat" %exe, "rb")
  143.   files = cPickle.load(fn)
  144.   fn.close()
  145. except:
  146.   files = {}
  147.  
  148. AccNames = BP.AccountName;
  149. path = BP.BankPerfectFileName()
  150. while path.find("\\") > -1: path = path[path.find("\\") + 1:]
  151.  
  152. if files.has_key(path):
  153.   LenAcc = BP.AccountCount()
  154.   f.ShowModal()
  155.   if f.ModalResult == 1:
  156.     Until = time.gmtime((int(Dt1.Date) - 25569) * 86400)[:3]
  157.     Vals = []
  158.     Acc = BP.AccountCurrent()
  159.     for Rec in files[path]:
  160.       if Rec["account"] == Acc: ApplyRec(Vals, Rec, Acc, Until)
  161.     Vals.sort()
  162.     if ChkEnd.Checked: Vals = Reduce2Month(Vals)
  163.     Vals = Cumul(Vals)
  164.     mois = ["jan", "fΘv", "mar", "avr", "mai", "jun", "jul", "ao√", "sep", "oct", "nov", "dΘc"]
  165.  
  166.     f = CreateComponent("TForm", None)
  167.     f.SetProps(Position="poMainFormCenter", Width=600, Height=400, Caption="PrΘvisions", OnResize=Resize)
  168.     Grid = CreateComponent("TDrawGrid", f)
  169.     Grid.SetProps(Parent=f, DefaultColWidth=100, RowCount=len(Vals) + 1, Anchors=["akLeft", "akRight", "akTop", "akBottom"], OnDrawCell=draw, Left=30, Top=30, Width=540, Height=310, FixedCols = 0, FixedRows = 1, ColCount=5, Options = ["goFixedHorzLine", "goVertLine", "goDrawFocusSelected", "goRowSelect", "goThumbTracking"])
  170.     BExport = CreateComponent("TButton", f)
  171.     BExport.SetProps(Parent=f, Left=380, Top=350, Width=90, Height=25, Anchors=["akRight","akBottom"], Caption="Export HTML", OnClick=Export)
  172.     BOK = CreateComponent("TButton", f)
  173.     BOK.SetProps(Parent=f, Left=480, Top=350, Width=90, Height=25, Anchors=["akRight","akBottom"], Caption="OK", Default=1, Cancel=1, ModalResult=1)
  174.     dY = Grid.Canvas.TextHeight('A')
  175.     Grid.DefaultRowHeight = 20
  176.     f.ShowModal()
  177. else:
  178.   BP.MsgBox("Il n'y a aucune ΘchΘance enregistrΘe", 64)