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()
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
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()
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)
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)
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))
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)
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
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()