def parse_record(self, row): row = take(5, row) stmt_line = StatementLine() stmt_line.date = self.parse_datetime(row[0]) _ = self.parse_datetime(row[1]) # TODO: ??? stmt_line.refnum = row[2] stmt_line.memo = row[3] stmt_line.amount = row[4] # # Looks like SEB formats description for card transactions so it includes the actual purchase date # within e.g. 'WIRSTRÖMS PU/14-12-31' and it means that description is 'WIRSTRÖMS PU' while the actual # card operation is 2014-12-31. # # P.S. Wirströms Irish Pub is our favorite pub in Stockholm: http://www.wirstromspub.se # m = re.match('(.*)/([0-9]{2}-[0-9]{2}-[0-9]{2})$', stmt_line.memo) if m: card_memo, card_date = m.groups() if self.brief: stmt_line.memo = card_memo stmt_line.date_user = datetime.strptime(card_date, '%y-%m-%d') stmt_line.id = generate_transaction_id(stmt_line) return stmt_line
def _parse_line(self, ntry): sline = StatementLine() crdeb = _find(ntry, 'CdtDbtInd').text amtnode = _find(ntry, 'Amt') amt = self._parse_amount(amtnode, self.statement.currency) if crdeb == CD_DEBIT: amt = -amt payee = _find(ntry, 'NtryDtls/TxDtls/RltdPties/Cdtr/Nm') else: payee = _find(ntry, 'NtryDtls/TxDtls/RltdPties/Dbtr/Nm') sline.payee = payee.text sline.amount = amt dt = _find(ntry, 'ValDt') sline.date = self._parse_date(dt) bookdt = _find(ntry, 'BookgDt') sline.date_user = self._parse_date(bookdt) svcref = _find(ntry, 'NtryDtls/TxDtls/Refs/AcctSvcrRef') sline.refnum = svcref.text rmtinf = _find(ntry, 'NtryDtls/TxDtls/RmtInf/Ustrd') sline.memo = rmtinf.text return sline
def parse_record(self, line): if self.cur_record <= 2: # Skip header line return None if not self.statement.account_id: self.statement.account_id = line[16] # Get all fields type_code = line[12] date = line[1] date_user = line[11] c_or_d = line[14] amount = self.parse_float(line[3]) id = line[10] refnum = line[10] note = line[9] payee_name = line[4] currency = line[17] # Convert LVL to EUR if currency == 'LVL': currency = 'EUR' amount = round(float(amount) / 0.702804, 2) # Create a statement line stmt_line = StatementLine(id, self.parse_datetime(date), note, self.parse_float(amount)) stmt_line.payee = payee_name stmt_line.refnum = refnum stmt_line.date_user = self.parse_datetime(date_user) # Credit & Debit stuff stmt_line.trntype = "DEP" if c_or_d == 'D': stmt_line.amount = -stmt_line.amount stmt_line.trntype = "DEBIT" # Various types if 'PMNTCCRDCWDL' in type_code: stmt_line.trntype = "ATM" elif 'ACMTMDOPFEES' in type_code: stmt_line.trntype = "SRVCHG" elif 'LDASCSLNINTR' in type_code: stmt_line.trntype = "INT" elif 'PMNTCCRDOTHR' in type_code: stmt_line.trntype = "PAYMENT" m = self.card_purchase_re.match(stmt_line.memo) if m: # This is an electronic purchase. Extract check number from the memo field stmt_line.check_no = m.group(1) elif 'PMNTRCDTESCT' in type_code or 'PMNTICDTESCT' in type_code: stmt_line.trntype = "XFER" # DEBUG if self.debug: print(stmt_line, stmt_line.trntype) return stmt_line
def parse_record(self, row): stmt_line = StatementLine() stmt_line.date = self.parse_datetime(row[0]) stmt_line.date_user = self.parse_datetime(row[1]) stmt_line.memo = row[2] stmt_line.amount = self.parse_float(row[3]) stmt_line.id = generate_transaction_id(stmt_line) return stmt_line
def parse_record(self, row): self.row_num += 1 line = StatementLine() line.date = self.parse_datetime(row[0].value) line.date_user = self.parse_datetime(row[1].value) line.refnum = str(self.row_num) line.memo = row[2].value line.amount = row[3].value line.trntype = self.get_type(line) line.id = generate_transaction_id(line) return line
def parse_record(self, mov): stat_line = StatementLine(None, mov.data_contabile, mov.descrizione_estesa, Decimal(mov.accrediti) if mov.accrediti else Decimal(mov.addebiti)) stat_line.id = generate_transaction_id(stat_line) stat_line.date_user = mov.data_valuta stat_line.trntype = IntesaSanPaoloXlsxParser._get_transaction_type(mov) logging.debug(stat_line) return stat_line
def parse_record(self, line): # Namespace stuff namespaces = {'ns': line.tag[1:].partition("}")[0]} # Get all fields type_code = line.find('ns:TypeCode', namespaces=namespaces).text date = line.find('ns:BookDate', namespaces=namespaces).text c_or_d = line.find('ns:CorD', namespaces=namespaces).text amount = line.find('ns:AccAmt', namespaces=namespaces).text id = line.find('ns:BankRef', namespaces=namespaces).text note = line.find('ns:PmtInfo', namespaces=namespaces).text # Payee name payee_name = None payee = line.find('ns:CPartySet', namespaces=namespaces) if payee: payee_account = payee.find('ns:AccHolder', namespaces=namespaces) if payee_account: payee_name = payee_account.find('ns:Name', namespaces=namespaces).text # Create statement line stmt_line = StatementLine(id, self.parse_datetime(date), note, self.parse_float(amount)) stmt_line.payee = payee_name # Credit & Debit stuff stmt_line.trntype = "DEP" if c_or_d == 'D': stmt_line.amount = -stmt_line.amount stmt_line.trntype = "DEBIT" # Various types if type_code == 'MEMD': stmt_line.trntype = "SRVCHG" elif type_code == 'OUTP': stmt_line.trntype = "PAYMENT" # Check if paid by card m = CARD_PURCHASE_RE.match(stmt_line.memo) if m: # this is an electronic purchase. extract some useful # information from memo field date = m.group(1).split('/') date = '%s-%s-%s' % (date[2], date[1], date[0]) stmt_line.date_user = self.parse_datetime(date) # DEBUG if self.debug: print(stmt_line, stmt_line.trntype) return stmt_line
def _parse_line(self, ntry: ET.Element) -> Optional[StatementLine]: sline = StatementLine() crdeb = self._findstrict(ntry, "CdtDbtInd").text amtnode = self._findstrict(ntry, "Amt") amt_ccy = amtnode.get("Ccy") if amt_ccy != self.statement.currency: # We can't include amounts with incompatible currencies into the # statement. return None amt = self._parse_amount(amtnode) if crdeb == CD_DEBIT: amt = -amt payee = self._find(ntry, "NtryDtls/TxDtls/RltdPties/Cdtr/Nm") else: payee = self._find(ntry, "NtryDtls/TxDtls/RltdPties/Dbtr/Nm") sline.payee = payee.text if payee is not None else None sline.amount = amt dt = self._find(ntry, "ValDt") sline.date = self._parse_date(dt) bookdt = self._find(ntry, "BookgDt") sline.date_user = self._parse_date(bookdt) svcref = self._find(ntry, "NtryDtls/TxDtls/Refs/AcctSvcrRef") if svcref is None: svcref = self._find(ntry, "AcctSvcrRef") if svcref is not None: sline.refnum = svcref.text # Try to find memo from different possible locations refinf = self._find(ntry, "NtryDtls/TxDtls/RmtInf/Strd/CdtrRefInf/Ref") rmtinf = self._find(ntry, "NtryDtls/TxDtls/RmtInf/Ustrd") addinf = self._find(ntry, "AddtlNtryInf") if refinf is not None: sline.memo = refinf.text elif rmtinf is not None: sline.memo = rmtinf.text elif addinf is not None: sline.memo = addinf.text return sline
def parse_record(self, line): # Namespace stuff namespaces = {"ns": line.tag[1:].partition("}")[0]} # Get all fields type_code = line.find("ns:TypeCode", namespaces=namespaces).text date = line.find("ns:BookDate", namespaces=namespaces).text c_or_d = line.find("ns:CorD", namespaces=namespaces).text amount = line.find("ns:AccAmt", namespaces=namespaces).text id = line.find("ns:BankRef", namespaces=namespaces).text note = line.find("ns:PmtInfo", namespaces=namespaces).text # Payee name payee_name = None payee = line.find("ns:CPartySet", namespaces=namespaces) if payee: payee_account = payee.find("ns:AccHolder", namespaces=namespaces) if payee_account: payee_name = payee_account.find("ns:Name", namespaces=namespaces).text # Create statement line stmt_line = StatementLine(id, self.parse_datetime(date), note, self.parse_float(amount)) stmt_line.payee = payee_name # Credit & Debit stuff stmt_line.trntype = "DEP" if c_or_d == "D": stmt_line.amount = -stmt_line.amount stmt_line.trntype = "DEBIT" # Various types if type_code == "MEMD": stmt_line.trntype = "SRVCHG" elif type_code == "OUTP": stmt_line.trntype = "PAYMENT" # Check if paid by card m = CARD_PURCHASE_RE.match(stmt_line.memo) if m: # this is an electronic purchase. extract some useful # information from memo field date = m.group(1).split("/") date = "%s-%s-%s" % (date[2], date[1], date[0]) stmt_line.date_user = self.parse_datetime(date) # print(stmt_line) return stmt_line
def _parse_line(self, ntry): sline = StatementLine() crdeb = self._find(ntry, 'CdtDbtInd').text amtnode = self._find(ntry, 'Amt') amt_ccy = amtnode.get('Ccy') if amt_ccy != self.statement.currency: # We can't include amounts with incompatible currencies into the # statement. return None amt = self._parse_amount(amtnode) if crdeb == CD_DEBIT: amt = -amt payee = self._find(ntry, 'NtryDtls/TxDtls/RltdPties/Cdtr/Nm') else: payee = self._find(ntry, 'NtryDtls/TxDtls/RltdPties/Dbtr/Nm') sline.payee = payee.text if payee is not None else None sline.amount = amt dt = self._find(ntry, 'ValDt') sline.date = self._parse_date(dt) bookdt = self._find(ntry, 'BookgDt') sline.date_user = self._parse_date(bookdt) svcref = self._find(ntry, 'NtryDtls/TxDtls/Refs/AcctSvcrRef') if svcref is None: svcref = self._find(ntry, 'AcctSvcrRef') if svcref is None: svcref = self._find(ntry, 'NtryDtls/TxDtls/Refs/MsgId') if svcref is not None: sline.refnum = svcref.text # Try to find memo from different possible locations rmtinf = self._find(ntry, 'NtryDtls/TxDtls/RmtInf/Ustrd') addinf = self._find(ntry, 'AddtlNtryInf') if rmtinf is not None: sline.memo = rmtinf.text elif addinf is not None: sline.memo = addinf.text return sline
def parse_record(self, row): self.row_num += 1 line = StatementLine() line.date = self.parse_datetime(row[0].value) line.date_user = self.parse_datetime(row[1].value) line.refnum = str(self.row_num) line.memo = row[2].value line.amount = row[3].value line.trntype = self.get_type(line) if self.statement.start_balance is None and self.row_num == 1: self.statement.start_balance = row[4].value - line.amount self.statement.start_date = line.date_user self.statement.end_balance = row[4].value line.id = self.generate_transaction_id(line) if line.id in self.seen: log.warn( "Transaction with duplicate FITID generated:\n%s\n%s\n\n" % (line, self.seen[line.id])) else: self.seen[line.id] = line return line
def _parse_line(self, ntry): sline = StatementLine() crdeb = _find(ntry, 'CdtDbtInd').text amtnode = _find(ntry, 'Amt') amt = self._parse_amount(amtnode) if crdeb == CD_DEBIT: amt = -amt payee = _find(ntry, 'NtryDtls/TxDtls/RltdPties/Cdtr/Nm') else: payee = _find(ntry, 'NtryDtls/TxDtls/RltdPties/Dbtr/Nm') if payee is not None: payee = payee.text sline.payee = payee sline.amount = amt dt = _find(ntry, 'ValDt') sline.date = self._parse_date(dt) bookdt = _find(ntry, 'BookgDt') sline.date_user = self._parse_date(bookdt) svcref = _find(ntry, 'NtryDtls/TxDtls/Refs/AcctSvcrRef') sline.refnum = getattr(svcref, 'text', None) rmtinf = _find(ntry, 'NtryDtls/TxDtls/RmtInf/Ustrd') sline.memo = rmtinf.text if rmtinf.text else '' addtlinf_node = _find(ntry, 'NtryDtls/TxDtls/AddtlTxInf') addtlinf = self._parse_addtlinf(addtlinf_node) if 'VÁSÁRLÁS KÁRTYÁVAL' == addtlinf and not sline.payee: sline.payee = _trim_payee(sline.memo) sline.memo += ' ' + addtlinf return sline
def _parse_line(self, item): sline = StatementLine() accountid = item[u"Számla neve"] currency = item[u"Tranzakció devizaneme"] stmt = self._find_or_create_statement(accountid, currency) sline.date = datetime.strptime(item[u"Értéknap"], self.date_format) sline.date_user = datetime.strptime(item[u"Tranzakció dátuma"], self.date_format) sline.amount = atof(item[u"Tranzakció összege"]) trtype = item[u"Tranzakció típusa"] if trtype == "VÁSÁRLÁS" or "JÓVÁÍRÁS": sline.payee = item[u"Részletek"].strip() else: sline.payee = item[u"Partner neve/Másodlagos azonosító típusa"].strip() sline.memo = item[u"Részletek"].strip() sline.id = generate_transaction_id(sline) sline.assert_valid() stmt.lines.append(sline)