Example #1
0
 def setControlInitValues(self):
     self.dateFormatRadioBox.SetSelection(self.dateFormatChoice)
     self.dateFormatRadioBox.Refresh()
     self.netPayTextCtrl.LabelText = self.netpay
     self.netPayTextCtrl.Refresh()
     ref_date_type = type(self.ref_date)
     if ref_date_type is str or ref_date_type is DateTime:
         ref_date_parsed = Date.parse_date(
             self, self.ref_date, Date.get_global_date_format(self))
         ref_date = Date.convertDateFormat(self, ref_date_parsed,
                                           self.dateFormat, self.dateFormat)
         self.ref_date = ref_date
         self.refPayDatePicker.SetValue(ref_date["dt"])
         self.refPayDatePicker.Refresh()
         self.refPayDateTextCtrl.LabelText = ref_date["str"]
         self.refPayDateTextCtrl.Refresh()
     else:
         self.MsgBox(
             "Unknown ref date type %s ignored - ref date intfo ignored" %
             (type(self.ref_date)))
     try:
         self.payDepositChoice = self.payment_accounts.index(
             self.payDepositAcct)
     except:
         self.payDepositChoice = -1
     if self.payDepositChoice == -1:
         self.payDepositChoice = 0
         self.MsgBox("Unknown payment account %s ignored - default to %s" %
                     (self.payDepositAcct,
                      self.payment_accounts[self.payDepositChoice]))
     self.payAcctCtrl.SetSelection(self.payDepositChoice)
     self.payAcctCtrl.Refresh()
     self.payTypeRadioBox.SetSelection(self.payType)
     self.payTypeRadioBox.Refresh()
Example #2
0
 def readConfigFile(self, cfgFile):
     if cfgFile == "":
         d = wx.FileDialog(self, "", "", "", "*.cfg", wx.FD_OPEN)
         if d.ShowModal() == wx.ID_OK:
             fname = d.GetFilename()
             dir = d.GetDirectory()
             total_name_in = os.path.join(dir, fname)
             self.cfgFile = total_name_in
     else:
         self.cfgFile = cfgFile
     try:
         file = open(self.cfgFile, 'r')
         lines = file.readlines()
         self.dateFormat = lines.pop(0).replace('\n', '')
         Date.set_global_date_format(self, self.dateFormat)
         self.payType = lines.pop(0).replace('\n', '')
         in_ref_date = lines.pop(0).replace('\n', '')
         ref_date = Date.parse_date(self, in_ref_date, self.dateFormat)
         self.ref_date = ref_date["dt"]
         self.netpay = lines.pop(0).replace('\n', '')
         self.payDepositAcct = lines.pop(0).replace('\n', '')
         file.close()
         return True
     except:
         return False
Example #3
0
 def properties(self, *args):
     dateFormat = Date.get_global_date_format(self)
     ref_date_parsed = Date.parse_date(self, self.ref_date, dateFormat)
     if ref_date_parsed != None:
         ref_date_dt = ref_date_parsed["dt"]
         ref_date = wx.DateTime.FromDMY(ref_date_dt.day, ref_date_dt.month,
                                        ref_date_dt.year).Format(dateFormat)
     else:
         ref_date = ""  # For now to test!  JJG 08/06/2021
     frame = PropertyFrameWithForm(self, self.dateFormat, self.payType,
                                   ref_date, self.netpay,
                                   self.payDepositAcct)
     frame.Show()
Example #4
0
 def onRefPayDateEntered(self, event):
     ref_date = event.String
     dateFormat = Date.get_date_format(self)
     ref_date_parsed = Date.parse_date(self, ref_date, dateFormat)
     if ref_date_parsed != None:
         ref_date = Date.convertDateFormat(self, ref_date_parsed,
                                           dateFormat, dateFormat)
         self.__log("Month: %02d, Day: %02d, Year: %04d" %
                    (ref_date_parsed["month"], ref_date_parsed["day"],
                     ref_date_parsed["year"]))
         self.updateRefPayDateControls(ref_date, "entered")
     else:
         dateFormat = dateFormat.replace("%y", "yy").replace(
             "%m", "mm").replace("%d", "dd").replace("%Y", "yyyy")
         error = "Bad input reference date (%s) entered - format is %s - try again" % (
             ref_date, dateFormat)
         self.MsgBox(error)
Example #5
0
 def onRefPayDatePicked(self, event):
     year = event.Date.year
     month = event.Date.month
     day = event.Date.day
     self.__log("Month: %02d, Day: %02d, Year: %04d" %
                (month + 1, day, year))
     ref_date = wx.DateTime.FromDMY(day, month, year)
     dateFormat = Date.get_date_format(self)
     ref_date_parsed = Date.parse_date(self, ref_date, dateFormat)
     if ref_date_parsed != None:
         ref_date = Date.convertDateFormat(self, ref_date_parsed,
                                           dateFormat, dateFormat)
         self.updateRefPayDateControls(ref_date, "picked")
     else:
         dateFormat = dateFormat.replace("%y", "yy").replace(
             "%m", "mm").replace("%d", "dd").replace("%Y", "yyyy")
         error = "Bad input reference date (%s) picked - format is %s - try again" % (
             ref_date, dateFormat)
         self.MsgBox(error)
Example #6
0
 def onProjDateEntered(self, evt):
     in_date = evt.String
     date_format = Date.get_global_date_format(self)
     returned_date = Date.parse_date(self, in_date, date_format)
     if returned_date != None:
         self.proj_date = wx.DateTime.FromDMY(returned_date["day"],
                                              returned_date["month"] - 1,
                                              returned_date["year"])
         self.proj_year = returned_date["year"]
         self.proj_month = returned_date["month"]
         self.proj_day = returned_date["day"]
         print(
             "Projected date %s, parse: Month: %02d, Day: %02d, Year: %04d"
             % (self.proj_date.Format(self.dateFormat), self.proj_month,
                self.proj_day, self.proj_year))
         Date.set_proj_date(self, in_date)
     else:
         self.proj_date = None
         self.DisplayMsg("Bad projected date ignored: %s" % (in_date))
Example #7
0
 def GridCellDateRenderer(self, row, col):
     cellValue = str(self.getColMethod(row, col))
     if cellValue == None or cellValue == "None":
         tableValue = ""
     elif self.getColZeroSuppress(
             row, col) == self.ZERO_SUPPRESS and (cellValue == "0"
                                                  or cellValue == ""):
         tableValue = ""
     else:
         returned_date = Date.parse_date(self, cellValue,
                                         Date.get_global_date_format(self))
         if returned_date != None:
             tableDate = wx.DateTime.FromDMY(returned_date["day"],
                                             returned_date["month"] - 1,
                                             returned_date["year"])
             dateFormat = Date.get_global_date_format(self)
             date_sep = Date.get_global_date_sep(self)
             dateParts = dateFormat.split(date_sep)
             tableValue = ""
             for i in range(len(dateParts)):
                 if dateParts[i] == "%m":
                     tableValue = tableValue + "%02d" % (int(
                         returned_date["month"]))
                 elif dateParts[i] == "%d":
                     tableValue = tableValue + "%02d" % (int(
                         returned_date["day"]))
                 elif dateParts[i] == "%Y":
                     tableValue = tableValue + "%04d" % (int(
                         returned_date["year"]))
                 elif dateParts[i] == "%y":
                     # assume all 2 digit years are in the range 2000 <= year < 2099.  Don't expect this software to be used in the year 2100!! JJG 07/08/2021
                     tableValue = tableValue + "%04d" % (
                         2000 + int(returned_date["year"]))
                 if i < len(dateParts) - 1:
                     tableValue = tableValue + "%s" % (
                         Date.get_global_date_sep(self))
         else:
             tableValue = ""
             self.DisplayMsg("Bad cell date for row %d col %d ignored: %s" %
                             (row, col, cellValue))
     self.SetCellAlignment(row, col, wx.ALIGN_CENTER, wx.ALIGN_CENTER)
     self.getFrame().assetGrid.SetCellValue(row, col, tableValue)
Example #8
0
    def read_qif(self, filename, readmode="normal"):
        if readmode == 'normal':  # things not to do on 'import':
            name = filename.replace('.qif', '')
            self.filename = os.path.split(name)[1]
        Found_assets = AssetList(self)
        mffile = open(filename, 'r')
        lines = mffile.readlines()
        mffile.close()
        section = UNKNOWN
        for line in lines:
            input_type, rest = line[0], line[1:].strip().replace(",", "")
            if input_type == "!":
                if rest == "Account":
                    section = ACCOUNT
                elif rest.__contains__("Type"):
                    section = DETAIL
                    cur_transaction = Transaction(self)
                else:
                    if section == ACCOUNT:
                        section = "account"
                    elif section == DETAIL:
                        section = "detail"
                    else:
                        section = "unknown"
                    print("in", section, "section got unknown ! line: ",
                          line[:-1])

            elif input_type == "^":
                if section == DETAIL:
                    cur_asset.transactions.append(cur_transaction)
                    cur_transaction = Transaction(self)
            elif input_type == "C":
                if section == DETAIL:
                    if rest == "*" or rest == "C":
                        cur_transaction.set_state("cleared")
                    elif rest == "X" or rest == "R":
                        cur_transaction.set_state("reconciled")
                    else:
                        cur_transaction.set_state("unknown")
            elif input_type == "D":
                if section == DETAIL:
                    formatted_date = Date.parse_date(self, rest, "%m/%d/%y")
                    formatted_date['month'] = formatted_date['month'] - 1
                    cur_transaction.set_due_date(formatted_date)
            elif input_type == "L":
                if section == ACCOUNT:
                    cur_asset.set_limit(rest)
            elif input_type == "N":
                if section == ACCOUNT:
                    cur_asset = Found_assets.get_asset_by_name(rest)
                elif section == DETAIL:
                    cur_transaction.set_check_num(rest)
            elif input_type == "P" or input_type == "M":  # JJG 1/22/2022  Seems some use M lines incorrectly!
                if section == DETAIL:
                    cur_transaction.set_payee(rest)
            elif input_type == "T":
                kind = line[1:].strip()
                if section == ACCOUNT:
                    if kind == "Bank":
                        if cur_asset.get_name().upper().find("SAVINGS") != -1:
                            cur_asset.set_type("Savings")
                        elif cur_asset.get_name().upper().find(
                                "CHECKING") != -1:
                            cur_asset.set_type("Checking")
                    elif kind == "CCard":
                        cur_asset.set_type("Credit card")
                elif section == DETAIL:
                    cur_transaction.set_amount(rest)
            elif input_type == "U":
                if section == DETAIL:
                    cur_transaction.set_amount(rest)
            else:
                if section == ACCOUNT:
                    section = "account"
                elif section == DETAIL:
                    section = "detail"
                else:
                    section = "unknown"
                print("in", section, "section got unparsable line: ",
                      line[:-1])
            pass
        return Found_assets
Example #9
0
 def cellchanging(self, evt):
     row = evt.GetRow()
     col = evt.GetCol()
     ret_val = wx.OK
     new_value = evt.String
     if row < 0 or row >= len(self.frame.transactions):
         str = "Warning: cellchanging on bad cell %d %d!" % (row, col)
         ret_val = self.DisplayMsg(str)
     elif self.col_info[col][self.EDIT_COL] == self.NOT_EDITABLE:
         str = "Warning: Changes not allowed for column %s!" % (
             self.getColName(col))
         ret_val = self.DisplayMsg(str)
     if ret_val == wx.OK and self.col_info[col][
             self.TYPE_COL] == self.DOLLAR_TYPE:
         #TODO  move regular expression for dollar format to new object
         m = re.match("^-?\$?\d{1,3}(\,?\d{3})*(\.\d{2})*$", new_value)
         if m:
             self.edited = True
             dollar_amount = new_value.replace("$", "").replace(",", "")
             if "." not in dollar_amount:
                 dollar_amount += ".00"
                 evt.Veto()
                 self.frame.transaction_grid.SetCellValue(
                     row, col, dollar_amount)
             evt.String = dollar_amount
         else:
             str = "%s is not a valid dollar string" % (new_value)
             ret_val = self.DisplayMsg(str)
     elif ret_val == wx.OK and self.col_info[col][
             self.TYPE_COL] == self.RATE_TYPE:
         #TODO  move regular expression for rate format to new object
         m = re.match("^\d{1,3}(\.\d{1,3})?\%?$", new_value)
         if m:
             self.edited = True
             evt.Veto()
             rate_amount = Round(
                 float(new_value.replace("%", "")) / 100.0, 2)
             evt.String = "%8.5f" % (rate_amount)
         else:
             str = "%s is not a valid rate string" % (new_value)
             ret_val = self.DisplayMsg(str)
     elif ret_val == wx.OK and self.col_info[col][
             self.TYPE_COL] == self.DATE_TYPE:
         if new_value == "" and self.getColZeroSuppress(
                 row, col) == self.ZERO_SUPPRESS:
             evt.Veto()
         else:
             dateFormat = Date.get_global_date_format(self)
             date_sep = Date.get_global_date_sep(self)
             input_date = new_value.split(date_sep)
             dateParts = dateFormat.split(date_sep)
             tableValue = ""
             if len(input_date) == 3:
                 for i in range(len(dateParts)):
                     if dateParts[i] == "%m":
                         tableValue = tableValue + "%02d" % (int(
                             input_date[i]))
                     elif dateParts[i] == "%d":
                         tableValue = tableValue + "%02d" % (int(
                             input_date[i]))
                     elif dateParts[i] == "%Y":
                         tableValue = tableValue + "%04d" % (int(
                             input_date[i]))
                     elif dateParts[i] == "%y":
                         # assume all 2 digit years are in the range 2000 <= year < 2099.  Don't expect this software to be used in the year 2100!! JJG 07/08/2021
                         tableValue = tableValue + "%04d" % (
                             2000 + int(input_date[i]))
                     if i < len(dateParts) - 1:
                         tableValue = tableValue + "%s" % (date_sep)
             evt.Veto()
             try:
                 returned_date = Date.parse_date(
                     self, tableValue, Date.get_global_date_format(self))
             except:
                 str = "%s is not a valid date string" % (new_value)
                 ret_val = self.DisplayMsg(str)
             else:
                 self.edited = True
                 evt.String = tableValue
     elif ret_val == wx.OK and self.col_info[col][
             self.TYPE_COL] == self.DATE_TIME_TYPE:
         if new_value == "" and self.getColZeroSuppress(
                 row, col) == self.ZERO_SUPPRESS:
             evt.Veto()
         else:
             #TODO  move regular expression for datetime format to new object
             m = re.match(
                 "^\d{1,2}([/-])\d{1,2}([/-])\d{4} \d{2}:\d{2}:\d{2}?$",
                 new_value)
             if m:
                 sep = m.groups()
                 evt.Veto()
                 pos1 = new_value.index(sep[0])
                 pos2 = new_value.rindex(sep[1])
                 pos3 = new_value.index(" ")
                 pos4 = new_value.index(":")
                 pos5 = new_value.rindex(":")
                 mon = int(new_value[0:pos1])
                 day = int(new_value[pos1 + 1:pos2])
                 year = int(new_value[pos2 + 1:pos3])
                 hour = int(new_value[pos3 + 1:pos4])
                 min = int(new_value[pos4 + 1:pos5])
                 sec = int(new_value[pos5 + 1:])
                 try:
                     in_datetime = datetime(year, mon, day, hour, min, sec)
                 except:
                     str = "%s is not a valid datetime string" % (new_value)
                     ret_val = self.DisplayMsg(str)
                 else:
                     self.edited = True
                     in_datetime_string = "%04s-%02d-%02d %02d:%02d:%02d" % (
                         year, mon, day, hour, min, sec)
                     evt.String = in_datetime_string
             else:
                 str = "%s is not a valid datetime string" % (new_value)
                 ret_val = self.DisplayMsg(str)
     elif ret_val == wx.OK and self.col_info[col][
             self.TYPE_COL] == self.STRING_TYPE:
         if col == self.TRANS_ACTION_COL:
             if new_value != "+" and new_value != "-":
                 str = "%s is not a valid action string" % (new_value)
                 ret_val = self.DisplayMsg(str)
         else:
             pass
     else:
         if ret_val != wx.OK:
             str = "Warning: cellchanging not allowed for cell %d %d!" % (
                 row, col)
             ret_val = self.DisplayMsg(str)
     if ret_val == wx.OK:
         print("TransactionGrid: Change detected for row", row, ", col",
               col)
         self.frame.assetchange(row, col, new_value)
         self.frame.redraw_all()
     else:
         evt.Veto()