ソースを参照

started bank accounts

vnc-console 1 年間 前
コミット
cfd971bac8
1 ファイル変更602 行追加568 行削除
  1. 602 568
      winmentor/dbread.py

+ 602 - 568
winmentor/dbread.py

@@ -1,568 +1,602 @@
-'''
-Created on Jun 21, 2018 @author: levente.marton
-'''
-import os
-import shutil
-import re
-import datetime
-from dataclasses import dataclass
-from pypxlib import Table
-
-@dataclass
-class Company:
-    name: str
-    vat_code: str
-    reg_number: str
-    address: str
-    location: str
-    county: str
-    shortname: str
-    obs: str
-    adm: str
-    admp: str
-    admcnp: str
-    mail: str = None
-    price: int = None
-
-@dataclass
-class Account:
-    clasa: str
-    simbol: str
-    denumire: str
-    soldid: str = None
-    soldic: str = None
-    precedentd: str = None
-    precedentc: str = None
-    curentd: str = None
-    curentc: str = None
-
-    def soldf(self, type_):
-        if type_ == 'd':
-            return round((self.soldid + self.precedentd + self.curentd) -
-                         (self.soldic + self.precedentc + self.curentc))
-        elif type_ == 'c':
-            return round((self.soldic + self.precedentc + self.curentc) -
-                         (self.soldid + self.precedentd + self.curentd))
-
-
-class WinMentor(object):
-    '''
-    Class to read winmentor database
-    '''
-
-    def __init__(self, winment_path=os.getenv('WINMENT', 'c:/winment/data/').replace('\\', '/')):
-        '''
-        Constructor
-        '''
-        self.winment_path = winment_path
-
-    @property
-    def get_winment_path(self):
-        return self.winment_path
-
-    @get_winment_path.setter
-    def set_winment_path(self, value):
-        # self.value = value
-        self.winment_path = value
-        return self.winment_path
-
-    def update_copy(self, db_file) -> str:
-        '''returns the updated version of a .db file
-        :param db_file is a .db from winmentor'''
-        # self._to_file = db_file
-        _, file_name = os.path.split(db_file)
-        dir_list = db_file.split('/')
-        # !!NOTE: if path is ?/winment/data/ then this must be 3 & 5
-        # if is ?/winment/winment/data/ then 4 & 6
-        dir_to_file = dir_list[4]
-        if len(dir_list) != 6:
-            os.makedirs(os.path.join('cash', dir_to_file), exist_ok=True)
-            cashed_copy_mtime = -1
-            if os.path.isfile(os.path.join('./cash/', dir_to_file, file_name)):
-                cashed_copy_mtime = os.stat(os.path.join('./cash/', dir_to_file, file_name)).st_mtime
-            if os.stat(db_file).st_mtime != cashed_copy_mtime:
-                shutil.copy2(db_file, os.path.join('./cash', dir_to_file))
-            return(os.path.join('./cash/', dir_to_file, file_name))
-        else:
-            os.makedirs('cash', exist_ok=True)
-            cashed_copy_mtime = -1
-            if os.path.isfile('./cash/' + file_name):
-                cashed_copy_mtime = os.stat('./cash/' + file_name).st_mtime
-            if os.stat(db_file).st_mtime != cashed_copy_mtime:
-                shutil.copy2(db_file, './cash')
-            return('./cash/' + file_name)
-
-    def make_list(self, db_file, headers) -> list:
-        '''returns a list of lists with elements from a given db file
-        :param db_file is .db file from winmentor
-        :param headers are the fields of the specified db file'''
-        file_name = self.update_copy(db_file)
-        with Table(file_name) as table:
-            m_list = []
-            for row in table:
-                item = []
-                for header in headers:
-                    element = row[header]
-                    if type(element) == datetime.date:
-                        if element < datetime.date(1999, 1, 1):
-                            element = ''
-                    item.append(element)
-                m_list.append(item)
-        return m_list
-
-    def make_sal_list(self, file_1, file_2) -> list:
-        '''returns list with all employees in current month
-        :param file_1 is npers.db from shortname
-        :param file_2 is likisal.db shortname/current_month'''
-        file_name1 = self.update_copy(self.winment_path + file_1)
-        file_name2 = self.update_copy(self.winment_path + file_2)
-        with Table(file_name1) as perss, Table(file_name2) as sals:
-            empl_all = []
-            # for field in perss.fields:
-            for sal in sals:
-                for pers in perss:
-                    # print(pers)
-                    if pers.Cod == sal.Cod:
-                        empl = []
-                        empl.append(pers.Cod)
-                        empl.append(f'{pers.Nume} {pers.Prenume}')
-                        empl.append(pers.DataAngF.strftime('%d-%m-%Y'))
-                        empl.append(sal.VenitBrut)
-                        empl.append(sal.SalRealizat)
-                        empl.append(sal.CO)
-                        empl.append(round(sal.SalOra, 2))
-                        empl.append(sal.ContribAngajat)
-                        empl.append(round(sal.ContribAngajator, 2))
-                        empl.append(sal.VenitNet)
-                        empl.append(sal.Impozit)
-                        empl.append(sal.SalarNet)
-                        empl.append(sal.OreLucrate)
-                        empl.append(sal.ZileLuk)
-                        empl.append(sal.ZileCO)
-                        empl_all.append(empl)
-                        # dict_ = {}
-                        # dict_['Cod'] = pers.Cod
-                        # dict_['Nume'] = f'{pers.Nume} {pers.Prenume}'
-                        # dict_['DataAngF'] = pers.DataAngF.strftime('%d-%m-%Y')
-                        # dict_['VenitBrut'] = sal.VenitBrut
-                        # dict_['SalRealizat'] = sal.SalRealizat
-                        # dict_['CO'] = sal.CO
-                        # dict_['SalOra'] = round(sal.SalOra, 2)
-                        # dict_['ContribAngajat'] = sal.ContribAngajat
-                        # dict_['ContribAngajator'] = round(sal.ContribAngajator, 2)
-                        # dict_['VenitNet'] = sal.VenitNet
-                        # dict_['Impozit'] = sal.Impozit
-                        # dict_['SalarNet'] = sal.SalarNet
-                        # dict_['OreLucrate'] = sal.OreLucrate
-                        # dict_['ZileLuk'] = sal.ZileLuk
-                        # dict_['ZileCO'] = sal.ZileCO
-                        # empl.append(dict_)
-        return empl_all
-
-    def gen_firms(self, db_file, headers) -> list:
-        '''generates company list from firme.db file
-        :param db_file is firme.db from winment/data folder'''
-        file_db = self.update_copy(self.winment_path + db_file)
-        with Table(file_db) as table:
-            for row in table:
-                yield [row[header] for header in headers]
-
-    def firmlist(self, headers, db_file='/firme.db', ban=None) -> list:
-        '''returns company list from firme.db file
-        :param db_file is firme.db from winment/data folder
-        :param list headers is the fields from firme.db file
-        :param list|str ban companies excluded from list'''
-        comp_list = []
-        for a_company in self.gen_firms(db_file, headers):
-            company = Company(
-                name=a_company[0],
-                vat_code=a_company[1],
-                reg_number=a_company[2],
-                address=a_company[3],
-                location=a_company[4],
-                county=a_company[5],
-                shortname=a_company[6],
-                adm=a_company[7],
-                admp=a_company[8],
-                admcnp=a_company[9],
-                obs=a_company[10])
-            comp_list.append(company)
-        if ban:
-            if type(ban) is list:
-                for r in comp_list:
-                    for company_shortname in ban:
-                        if company_shortname == r.shortname:
-                            comp_list.remove(r)
-            else:
-                for r in comp_list:
-                    if r == ban:
-                        comp_list.remove(r)
-        return comp_list
-
-    def filtered_firmlist(self, headers, db_file='/firme.db', ban=None) -> list:
-        '''generates company list from firme.db file
-        :param db_file is firme.db from winment/data folder
-        :param list headers is the fields from firme.db file
-        :param list|str ban companies excluded from list'''
-        if ban:
-            if type(ban) is list:
-                for a_company in self.gen_firms(db_file, headers):
-                    company = Company(
-                        name=a_company[0],
-                        vat_code=a_company[1],
-                        reg_number=a_company[2],
-                        address=a_company[3],
-                        location=a_company[4],
-                        county=a_company[5],
-                        shortname=a_company[6],
-                        adm=a_company[7],
-                        admp=a_company[8],
-                        admcnp=a_company[9],
-                        obs=a_company[10])
-                    if a_company[6] not in ban:
-                        yield [company.name, company.vat_code, company.reg_number,
-                               company.address, company.location, company.county,
-                               company.shortname, company.adm, company.admp,
-                               company.admcnp, company.obs]
-        else:
-            for a_company in self.gen_firms(db_file, headers):
-                company = Company(
-                    name=a_company[0],
-                    vat_code=a_company[1],
-                    reg_number=a_company[2],
-                    address=a_company[3],
-                    location=a_company[4],
-                    county=a_company[5],
-                    shortname=a_company[6],
-                    adm=a_company[7],
-                    admp=a_company[8],
-                    admcnp=a_company[9],
-                    obs=a_company[10])
-                yield [company.name, company.vat_code, company.reg_number,
-                       company.address, company.location, company.county,
-                       company.shortname, company.adm, company.admp,
-                       company.admcnp, company.obs]
-
-    def get_last_month(self, short_name) -> str:
-        '''returns last month of a company in format YYYY_MM
-        :param str short_name is the company shortname'''
-        short_name = self.winment_path + short_name
-        month_folders = [f for f in os.listdir(short_name) if re.match(r'[0-9_]+$', f)]
-        month_folders.reverse()
-        return month_folders[0]
-
-    def corp_list(self, name=None):
-        '''returns company list from actual shortnames from winmwnt/data folder
-        '''
-        dir_list = [f.name for f in os.scandir(self.winment_path) if f.is_dir() and '@' not in f.name]
-        if name:
-            if type(name) is list:
-                for r in name:
-                    dir_list.remove(r)
-            else:
-                dir_list.remove(name)
-        return dir_list
-
-    def verif_corp(self, file_='/firme.db', ban=None):
-        headers = ['Denumire', 'CF', 'J', 'Adresa', 'Oras', 'Judet', 'Prescurtat', 'Obs']
-        corplist = self.make_list(self.winment_path + file_, headers)  # dbRead.make_list(m_path + '/FIRME.DB', headers)
-        if ban:
-            if type(ban) is list:
-                for r in corplist:
-                    for i in ban:
-                        if i == r[6]:
-                            corplist.remove(r)
-            else:
-                for r in corplist:
-                    if r == ban:
-                        corplist.remove(r)
-        return corplist
-
-    def verif_cont(self, file_) -> list:
-        '''returns an account with its values from the balance
-        :param file_ is shortname/ncont.db'''
-        accounts = []
-        headers = ['Clasa', 'Simbol', 'Denumire', 'SoldID', 'SoldIC', 'PrecedentD', 'PrecedentC', 'CurentD', 'CurentC']
-        accountlist = self.make_list(self.winment_path + file_, headers)  # + lunaCurenta
-        for elem in accountlist:
-            account = Account(clasa=elem[0],
-                              simbol=elem[1],
-                              denumire=elem[2],
-                              soldid=elem[3],
-                              soldic=elem[4],
-                              precedentd=elem[5],
-                              precedentc=elem[6],
-                              curentd=elem[7],
-                              curentc=elem[8])
-            accounts.append(account)
-        return accountlist
-
-    def an_inc(self, account_list, boolind, ind2, ind3):
-        '''returns the annual turnover in given year
-        
-        :param int boolind:account class number
-        :param int ind2, ind3:debit or credit position in balance
-        (6-rulaj curent debit, 8-rulaj cumulat debit, index starting from 0)'''
-        tt = 0
-        for account in account_list:
-            # n = len(account[boolind]) == 3 and account[boolind] != '...' and int(account[boolind]) > 700 and int(account[boolind]) < 760
-            n = account[boolind] == 7
-            can = account[1][:2] != '76'
-            # print(account[1][:2])
-            if n and can:
-                tt += int(account[ind2]) + int(account[ind3])
-        return tt
-
-    def divid(self, account_list, account='457') -> int:
-        '''returns dividends/year
-        :param account_list is account from ncont.db'''
-        div_ = 0
-        for acc in account_list:
-            if acc[1][:3] == account:
-                div_ += acc[8] + acc[6]
-        return round(div_)
-
-    def divid_current(self, account_list, account='457') -> int:
-        '''returns dividends from current month
-        :param account_list is account from ncont.db'''
-        div_ = 0
-        for acc in account_list:
-            if acc[1][:3] == account:
-                div_ += acc[8]
-        return round(div_)
-
-    def divid_intermed(self, account_list, account='463') -> int:
-        '''returns dividends from current result/year
-        :param account_list is account from ncont.db'''
-        div_ = 0
-        for acc in account_list:
-            if acc[1][:3] == account:
-                div_ += acc[7] + acc[5]
-        return round(div_)
-
-    def divid_inter_current(self, account_list, account='463') -> int:
-        '''returns dividends from current results in the current month
-        :param account_list is account from ncont.db'''
-        div_ = 0
-        for acc in account_list:
-            if acc[1][:3] == account:
-                div_ += acc[7]
-        return round(div_)
-
-    def spons(self, account_list, account='658.02') -> int:
-        '''returns sponsored money/year
-        :param account_list is account from ncont.db'''
-        spons_ = 0
-        for acc in account_list:
-            if acc[1] == account:
-                spons_ += acc[8] + acc[6]
-        return round(spons_)
-
-    def result(self, account_list, boolind, ind2, ind3) -> int:  # account='121'
-        '''returns the final result in given year
-        :param int boolind:account class number
-        :param int ind2, ind3:debit or credit position in balance
-        (6-rulaj curent debit, 8-rulaj cumulat debit, index starting from 0)'''
-        res_minus = res_plus = 0
-        for r_minus in account_list:
-            p = r_minus[boolind] == 6
-            if p:
-                res_minus += int(r_minus[ind2]) + int(r_minus[ind3])
-        for r_plus in account_list:
-            i = r_plus[boolind] == 7
-            if i:
-                res_plus += int(r_plus[ind2]) + int(r_plus[ind3])
-        return res_plus - res_minus
-
-    def ins_payable(self, account_list, account='431') -> int:
-        '''returns insurences payable in current month
-        :param account_list is account from ncont.db'''
-        ins = 0
-        for acc in account_list:
-            p = acc[1][:3] == account
-            if p:
-                ins += acc[8]
-        return round(ins)
-
-    def CAS_payable(self, account_list, accounts=('431.02', '431.05')) -> int:
-        '''returns CAS payable in current month
-        :param account_list is account from ncont.db'''
-        CAS = 0
-        acc_1, acc_2 = accounts
-        for acc in account_list:
-            p = acc[1] == acc_1
-            d = acc[1] == acc_2
-            if p: CAS += acc[8]
-            if d: CAS += acc[8]
-        return round(CAS)
-
-    def CASS_payable(self, account_list, accounts=('431.04', '431.06')) -> int:
-        '''returns CASS payable in current month
-        :param account_list is account from ncont.db'''
-        CASS = 0
-        acc_1, acc_2 = accounts
-        for acc in account_list:
-            p = acc[1] == acc_1
-            d = acc[1] == acc_2
-            if p: CASS += acc[8]
-            if d: CASS += acc[8]
-        return round(CASS)
-
-    def sal_tax_payable(self, account_list, account='431.44') -> int:
-        '''returns salary tax payable in current month
-        :param account_list is account from ncont.db'''
-        tax = 0
-        for acc in account_list:
-            p = acc[1] == account
-            if p:
-                tax += acc[8]
-        return round(tax)
-
-    def cam_payable(self, account_list, account='436') -> int:
-        '''returns CAM payable in current month
-        :param account_list is account from ncont.db'''
-        cam = 0
-        for acc in account_list:
-            p = acc[1][:3] == account
-            if p:
-                cam += acc[8]
-        return round(cam)
-
-    def vat_payable(self, account_list, accounts=('442.03', '442.04')) -> int:
-        '''returns VAT payable in current month
-        :param account_list is account from ncont.db'''
-        tt = 0
-        acc_1, acc_2 = accounts
-        for acc in account_list:
-            p = acc[1] == acc_1
-            d = acc[1] == acc_2
-            if p:
-                tt += acc[8]
-            elif d:
-                tt -= acc[7] + acc[8]
-        return round(tt)
-
-    def vat_final(self, acc_list, accounts=('442.03', '442.04')) -> int:
-        '''returns VAT final payable in current month
-        :param account_list is account from ncont.db'''
-        tt = 0
-        acc_1, acc_2 = accounts
-        for acc in acc_list:
-            account = Account(clasa=acc[0],
-                              simbol=acc[1],
-                              denumire=acc[2],
-                              soldid=acc[3],
-                              soldic=acc[4],
-                              precedentd=acc[5],
-                              precedentc=acc[6],
-                              curentd=acc[7],
-                              curentc=acc[8])
-            payable = account.simbol == acc_1
-            deductible = account.simbol == acc_2
-            if payable:
-                tt += account.soldf('c')
-            elif deductible:
-                tt -= account.soldf('d')
-        return round(tt)
-
-    def tax_payable(self, account_list, account='441') -> int:
-        '''returns income TAX payable in current month
-        :param account_list is account from ncont.db'''
-        tax = 0
-        for acc in account_list:
-            p = acc[1][:3] == account
-            if p:
-                tax += acc[8]
-        return round(tax)
-
-    def div_tax_payable(self, acc_list, accounts='446.07') -> int:
-        '''returns dividend TAX payable in current month
-        :param account_list is account from ncont.db'''
-        tt = 0
-        # acc_1, acc_2 = accounts
-        for acc in acc_list:
-            account = Account(clasa=acc[0],
-                              simbol=acc[1],
-                              denumire=acc[2],
-                              soldid=acc[3],
-                              soldic=acc[4],
-                              precedentd=acc[5],
-                              precedentc=acc[6],
-                              curentd=acc[7],
-                              curentc=acc[8])
-            payable = account.simbol == accounts
-            # deductible = account.simbol == acc_2
-            if payable:
-                tt += account.curentc
-            # elif deductible:
-            #     tt -= account.soldf('d')
-        return round(tt)
-
-    def advance_final(self, acc_list, accounts='542') -> int:
-        '''returns final dvances/year
-        :param account_list is account from ncont.db'''
-        tt = 0
-        # acc_1, acc_2 = accounts
-        for acc in acc_list:
-            account = Account(clasa=acc[0],
-                              simbol=acc[1],
-                              denumire=acc[2],
-                              soldid=acc[3],
-                              soldic=acc[4],
-                              precedentd=acc[5],
-                              precedentc=acc[6],
-                              curentd=acc[7],
-                              curentc=acc[8])
-            payable = account.simbol[:3] == accounts
-            # deductible = account.simbol == acc_2
-            if payable:
-                tt += account.soldf('d')
-            # elif deductible:
-            #     tt -= account.soldf('d')
-        return round(tt)
-
-    def deb_div(self, acc_list, accounts='461') -> int:
-        '''returns advances transfered to deb. diversi/year
-        :param account_list is account from ncont.db'''
-        tt = 0
-        # acc_1, acc_2 = accounts
-        for acc in acc_list:
-            account = Account(clasa=acc[0],
-                              simbol=acc[1],
-                              denumire=acc[2],
-                              soldid=acc[3],
-                              soldic=acc[4],
-                              precedentd=acc[5],
-                              precedentc=acc[6],
-                              curentd=acc[7],
-                              curentc=acc[8])
-            payable = account.simbol[:3] == accounts
-            # deductible = account.simbol == acc_2
-            if payable:
-                tt += account.soldf('d')
-            # elif deductible:
-            #     tt -= account.soldf('d')
-        return round(tt)
-
-    def credit_final(self, acc_list, accounts='455') -> int:
-        '''returns credited ammount/year
-        :param account_list is account from ncont.db'''
-        tt = 0
-        # acc_1, acc_2 = accounts
-        for acc in acc_list:
-            account = Account(clasa=acc[0],
-                              simbol=acc[1],
-                              denumire=acc[2],
-                              soldid=acc[3],
-                              soldic=acc[4],
-                              precedentd=acc[5],
-                              precedentc=acc[6],
-                              curentd=acc[7],
-                              curentc=acc[8])
-            payable = account.simbol[:3] == accounts
-            # deductible = account.simbol == acc_2
-            if payable:
-                tt += account.soldf('d')
-            # elif deductible:
-            #     tt -= account.soldf('d')
-        return round(tt)
+'''
+Created on Jun 21, 2018 @author: levente.marton
+'''
+import os
+import shutil
+import re
+import datetime
+from dataclasses import dataclass
+from pypxlib import Table
+
+@dataclass
+class Company:
+    name: str
+    vat_code: str
+    reg_number: str
+    address: str
+    location: str
+    county: str
+    shortname: str
+    obs: str
+    adm: str
+    admp: str
+    admcnp: str
+    mail: str = None
+    price: int = None
+
+@dataclass
+class Account:
+    clasa: str
+    simbol: str
+    denumire: str
+    soldid: str = None
+    soldic: str = None
+    precedentd: str = None
+    precedentc: str = None
+    curentd: str = None
+    curentc: str = None
+
+    def soldf(self, type_):
+        if type_ == 'd':
+            return round((self.soldid + self.precedentd + self.curentd) -
+                         (self.soldic + self.precedentc + self.curentc))
+        elif type_ == 'c':
+            return round((self.soldic + self.precedentc + self.curentc) -
+                         (self.soldid + self.precedentd + self.curentd))
+
+
+class WinMentor(object):
+    '''
+    Class to read winmentor database
+    '''
+
+    def __init__(self, winment_path=os.getenv('WINMENT', 'c:/winment/data/').replace('\\', '/')):
+        '''
+        Constructor
+        '''
+        self.winment_path = winment_path
+
+    @property
+    def get_winment_path(self):
+        return self.winment_path
+
+    @get_winment_path.setter
+    def set_winment_path(self, value):
+        # self.value = value
+        self.winment_path = value
+        return self.winment_path
+
+    def update_copy(self, db_file) -> str:
+        '''returns the updated version of a .db file
+        :param db_file is a .db from winmentor'''
+        # self._to_file = db_file
+        _, file_name = os.path.split(db_file)
+        dir_list = db_file.split('/')
+        # !!NOTE: if path is ?/winment/data/ then this must be 3 & 5
+        # if is ?/winment/winment/data/ then 4 & 6
+        dir_to_file = dir_list[4]
+        if len(dir_list) != 6:
+            os.makedirs(os.path.join('cash', dir_to_file), exist_ok=True)
+            cashed_copy_mtime = -1
+            if os.path.isfile(os.path.join('./cash/', dir_to_file, file_name)):
+                cashed_copy_mtime = os.stat(os.path.join('./cash/', dir_to_file, file_name)).st_mtime
+            if os.stat(db_file).st_mtime != cashed_copy_mtime:
+                shutil.copy2(db_file, os.path.join('./cash', dir_to_file))
+            return(os.path.join('./cash/', dir_to_file, file_name))
+        else:
+            os.makedirs('cash', exist_ok=True)
+            cashed_copy_mtime = -1
+            if os.path.isfile('./cash/' + file_name):
+                cashed_copy_mtime = os.stat('./cash/' + file_name).st_mtime
+            if os.stat(db_file).st_mtime != cashed_copy_mtime:
+                shutil.copy2(db_file, './cash')
+            return('./cash/' + file_name)
+
+    def make_list(self, db_file, headers) -> list:
+        '''returns a list of lists with elements from a given db file
+        :param db_file is .db file from winmentor
+        :param headers are the fields of the specified db file'''
+        file_name = self.update_copy(db_file)
+        with Table(file_name) as table:
+            m_list = []
+            for row in table:
+                item = []
+                for header in headers:
+                    element = row[header]
+                    if type(element) == datetime.date:
+                        if element < datetime.date(1999, 1, 1):
+                            element = ''
+                    item.append(element)
+                m_list.append(item)
+        return m_list
+
+    def make_sal_list(self, file_1, file_2) -> list:
+        '''returns list with all employees in current month
+        :param file_1 is npers.db from shortname
+        :param file_2 is likisal.db shortname/current_month'''
+        file_name1 = self.update_copy(self.winment_path + file_1)
+        file_name2 = self.update_copy(self.winment_path + file_2)
+        with Table(file_name1) as perss, Table(file_name2) as sals:
+            empl_all = []
+            # for field in perss.fields:
+            for sal in sals:
+                for pers in perss:
+                    # print(pers)
+                    if pers.Cod == sal.Cod:
+                        empl = []
+                        empl.append(pers.Cod)
+                        empl.append(f'{pers.Nume} {pers.Prenume}')
+                        empl.append(pers.DataAngF.strftime('%d-%m-%Y'))
+                        empl.append(sal.VenitBrut)
+                        empl.append(sal.SalRealizat)
+                        empl.append(sal.CO)
+                        empl.append(round(sal.SalOra, 2))
+                        empl.append(sal.ContribAngajat)
+                        empl.append(round(sal.ContribAngajator, 2))
+                        empl.append(sal.VenitNet)
+                        empl.append(sal.Impozit)
+                        empl.append(sal.SalarNet)
+                        empl.append(sal.OreLucrate)
+                        empl.append(sal.ZileLuk)
+                        empl.append(sal.ZileCO)
+                        empl_all.append(empl)
+                        # dict_ = {}
+                        # dict_['Cod'] = pers.Cod
+                        # dict_['Nume'] = f'{pers.Nume} {pers.Prenume}'
+                        # dict_['DataAngF'] = pers.DataAngF.strftime('%d-%m-%Y')
+                        # dict_['VenitBrut'] = sal.VenitBrut
+                        # dict_['SalRealizat'] = sal.SalRealizat
+                        # dict_['CO'] = sal.CO
+                        # dict_['SalOra'] = round(sal.SalOra, 2)
+                        # dict_['ContribAngajat'] = sal.ContribAngajat
+                        # dict_['ContribAngajator'] = round(sal.ContribAngajator, 2)
+                        # dict_['VenitNet'] = sal.VenitNet
+                        # dict_['Impozit'] = sal.Impozit
+                        # dict_['SalarNet'] = sal.SalarNet
+                        # dict_['OreLucrate'] = sal.OreLucrate
+                        # dict_['ZileLuk'] = sal.ZileLuk
+                        # dict_['ZileCO'] = sal.ZileCO
+                        # empl.append(dict_)
+        return empl_all
+
+    def gen_firms(self, db_file, headers) -> list:
+        '''generates company list from firme.db file
+        :param db_file is firme.db from winment/data folder'''
+        file_db = self.update_copy(self.winment_path + db_file)
+        with Table(file_db) as table:
+            for row in table:
+                yield [row[header] for header in headers]
+
+    def firmlist(self, headers, db_file='/firme.db', ban=None) -> list:
+        '''returns company list from firme.db file
+        :param db_file is firme.db from winment/data folder
+        :param list headers is the fields from firme.db file
+        :param list|str ban companies excluded from list'''
+        comp_list = []
+        for a_company in self.gen_firms(db_file, headers):
+            company = Company(
+                name=a_company[0],
+                vat_code=a_company[1],
+                reg_number=a_company[2],
+                address=a_company[3],
+                location=a_company[4],
+                county=a_company[5],
+                shortname=a_company[6],
+                adm=a_company[7],
+                admp=a_company[8],
+                admcnp=a_company[9],
+                obs=a_company[10])
+            comp_list.append(company)
+        if ban:
+            if type(ban) is list:
+                for r in comp_list:
+                    for company_shortname in ban:
+                        if company_shortname == r.shortname:
+                            comp_list.remove(r)
+            else:
+                for r in comp_list:
+                    if r == ban:
+                        comp_list.remove(r)
+        return comp_list
+
+    def filtered_firmlist(self, headers, db_file='/firme.db', ban=None) -> list:
+        '''generates company list from firme.db file
+        :param db_file is firme.db from winment/data folder
+        :param list headers is the fields from firme.db file
+        :param list|str ban companies excluded from list'''
+        if ban:
+            if type(ban) is list:
+                for a_company in self.gen_firms(db_file, headers):
+                    company = Company(
+                        name=a_company[0],
+                        vat_code=a_company[1],
+                        reg_number=a_company[2],
+                        address=a_company[3],
+                        location=a_company[4],
+                        county=a_company[5],
+                        shortname=a_company[6],
+                        adm=a_company[7],
+                        admp=a_company[8],
+                        admcnp=a_company[9],
+                        obs=a_company[10])
+                    if a_company[6] not in ban:
+                        yield [company.name, company.vat_code, company.reg_number,
+                               company.address, company.location, company.county,
+                               company.shortname, company.adm, company.admp,
+                               company.admcnp, company.obs]
+        else:
+            for a_company in self.gen_firms(db_file, headers):
+                company = Company(
+                    name=a_company[0],
+                    vat_code=a_company[1],
+                    reg_number=a_company[2],
+                    address=a_company[3],
+                    location=a_company[4],
+                    county=a_company[5],
+                    shortname=a_company[6],
+                    adm=a_company[7],
+                    admp=a_company[8],
+                    admcnp=a_company[9],
+                    obs=a_company[10])
+                yield [company.name, company.vat_code, company.reg_number,
+                       company.address, company.location, company.county,
+                       company.shortname, company.adm, company.admp,
+                       company.admcnp, company.obs]
+
+    def get_last_month(self, short_name) -> str:
+        '''returns last month of a company in format YYYY_MM
+        :param str short_name is the company shortname'''
+        short_name = self.winment_path + short_name
+        month_folders = [f for f in os.listdir(short_name) if re.match(r'[0-9_]+$', f)]
+        month_folders.reverse()
+        return month_folders[0]
+
+    def get_bank_accounts(self, short_name, db_file='/nbanca.db'):
+        #.......................................................................
+        # TO DO: put an all parameter to yield all accounts or
+        # just one,
+        # make a named tuple with bank accounts.
+        #.......................................................................
+        headers = ['Codbanca', 'Denumire', 'NrCont']
+        headers2 = ['COD', 'DENUMIRE']
+        short_name = self.winment_path + short_name
+        nbanks = self.update_copy(short_name + '/nbanci.db')
+        file_db = self.update_copy(short_name + db_file)
+        bank_codes = {}
+        with Table(file_db) as table, Table(nbanks) as nbanks:
+            # tables = zip(table, nbanks)
+            for bank in nbanks:
+                data = [bank[header] for header in headers2]
+                bdict = {data[i]: data[i + 1] for i in range(0, len(data), 2)}
+                bank_codes.update(bdict)
+            for row in table:
+                if row.NrCont:
+                    bank_account = [row[header] for header in headers]
+                    bank_account.append(bank_codes[bank_account[0]])
+                    if bank_account[2].startswith(' '):
+                        yield bank_account
+        
+
+    def corp_list(self, name=None):
+        '''returns company list from actual shortnames from winmwnt/data folder
+        '''
+        dir_list = [f.name for f in os.scandir(self.winment_path) if f.is_dir() and '@' not in f.name]
+        if name:
+            if type(name) is list:
+                for r in name:
+                    dir_list.remove(r)
+            else:
+                dir_list.remove(name)
+        return dir_list
+
+    def verif_corp(self, file_='/firme.db', ban=None):
+        headers = ['Denumire', 'CF', 'J', 'Adresa', 'Oras', 'Judet', 'Prescurtat', 'Obs']
+        corplist = self.make_list(self.winment_path + file_, headers)  # dbRead.make_list(m_path + '/FIRME.DB', headers)
+        if ban:
+            if type(ban) is list:
+                for r in corplist:
+                    for i in ban:
+                        if i == r[6]:
+                            corplist.remove(r)
+            else:
+                for r in corplist:
+                    if r == ban:
+                        corplist.remove(r)
+        return corplist
+
+    def verif_cont(self, file_) -> list:
+        '''returns an account with its values from the balance
+        :param file_ is shortname/ncont.db'''
+        accounts = []
+        headers = ['Clasa', 'Simbol', 'Denumire', 'SoldID', 'SoldIC', 'PrecedentD', 'PrecedentC', 'CurentD', 'CurentC']
+        accountlist = self.make_list(self.winment_path + file_, headers)  # + lunaCurenta
+        for elem in accountlist:
+            account = Account(clasa=elem[0],
+                              simbol=elem[1],
+                              denumire=elem[2],
+                              soldid=elem[3],
+                              soldic=elem[4],
+                              precedentd=elem[5],
+                              precedentc=elem[6],
+                              curentd=elem[7],
+                              curentc=elem[8])
+            accounts.append(account)
+        return accountlist
+
+    def an_inc(self, account_list, boolind, ind2, ind3):
+        '''returns the annual turnover in given year
+        
+        :param int boolind:account class number
+        :param int ind2, ind3:debit or credit position in balance
+        (6-rulaj curent debit, 8-rulaj cumulat debit, index starting from 0)'''
+        tt = 0
+        for account in account_list:
+            # n = len(account[boolind]) == 3 and account[boolind] != '...' and int(account[boolind]) > 700 and int(account[boolind]) < 760
+            n = account[boolind] == 7
+            can = account[1][:2] != '76'
+            # print(account[1][:2])
+            if n and can:
+                tt += int(account[ind2]) + int(account[ind3])
+        return tt
+
+    def divid(self, account_list, account='457') -> int:
+        '''returns dividends/year
+        :param account_list is account from ncont.db'''
+        div_ = 0
+        for acc in account_list:
+            if acc[1][:3] == account:
+                div_ += acc[8] + acc[6]
+        return round(div_)
+
+    def divid_current(self, account_list, account='457') -> int:
+        '''returns dividends from current month
+        :param account_list is account from ncont.db'''
+        div_ = 0
+        for acc in account_list:
+            if acc[1][:3] == account:
+                div_ += acc[8]
+        return round(div_)
+
+    def divid_intermed(self, account_list, account='463') -> int:
+        '''returns dividends from current result/year
+        :param account_list is account from ncont.db'''
+        div_ = 0
+        for acc in account_list:
+            if acc[1][:3] == account:
+                div_ += acc[7] + acc[5]
+        return round(div_)
+
+    def divid_inter_current(self, account_list, account='463') -> int:
+        '''returns dividends from current results in the current month
+        :param account_list is account from ncont.db'''
+        div_ = 0
+        for acc in account_list:
+            if acc[1][:3] == account:
+                div_ += acc[7]
+        return round(div_)
+
+    def spons(self, account_list, account='658.02') -> int:
+        '''returns sponsored money/year
+        :param account_list is account from ncont.db'''
+        spons_ = 0
+        for acc in account_list:
+            if acc[1] == account:
+                spons_ += acc[8] + acc[6]
+        return round(spons_)
+
+    def result(self, account_list, boolind, ind2, ind3) -> int:  # account='121'
+        '''returns the final result in given year
+        :param int boolind:account class number
+        :param int ind2, ind3:debit or credit position in balance
+        (6-rulaj curent debit, 8-rulaj cumulat debit, index starting from 0)'''
+        res_minus = res_plus = 0
+        for r_minus in account_list:
+            p = r_minus[boolind] == 6
+            if p:
+                res_minus += int(r_minus[ind2]) + int(r_minus[ind3])
+        for r_plus in account_list:
+            i = r_plus[boolind] == 7
+            if i:
+                res_plus += int(r_plus[ind2]) + int(r_plus[ind3])
+        return res_plus - res_minus
+
+    def ins_payable(self, account_list, account='431') -> int:
+        '''returns insurences payable in current month
+        :param account_list is account from ncont.db'''
+        ins = 0
+        for acc in account_list:
+            p = acc[1][:3] == account
+            if p:
+                ins += acc[8]
+        return round(ins)
+
+    def CAS_payable(self, account_list, accounts=('431.02', '431.05')) -> int:
+        '''returns CAS payable in current month
+        :param account_list is account from ncont.db'''
+        CAS = 0
+        acc_1, acc_2 = accounts
+        for acc in account_list:
+            p = acc[1] == acc_1
+            d = acc[1] == acc_2
+            if p: CAS += acc[8]
+            if d: CAS += acc[8]
+        return round(CAS)
+
+    def CASS_payable(self, account_list, accounts=('431.04', '431.06')) -> int:
+        '''returns CASS payable in current month
+        :param account_list is account from ncont.db'''
+        CASS = 0
+        acc_1, acc_2 = accounts
+        for acc in account_list:
+            p = acc[1] == acc_1
+            d = acc[1] == acc_2
+            if p: CASS += acc[8]
+            if d: CASS += acc[8]
+        return round(CASS)
+
+    def sal_tax_payable(self, account_list, account='431.44') -> int:
+        '''returns salary tax payable in current month
+        :param account_list is account from ncont.db'''
+        tax = 0
+        for acc in account_list:
+            p = acc[1] == account
+            if p:
+                tax += acc[8]
+        return round(tax)
+
+    def cam_payable(self, account_list, account='436') -> int:
+        '''returns CAM payable in current month
+        :param account_list is account from ncont.db'''
+        cam = 0
+        for acc in account_list:
+            p = acc[1][:3] == account
+            if p:
+                cam += acc[8]
+        return round(cam)
+
+    def vat_payable(self, account_list, accounts=('442.03', '442.04')) -> int:
+        '''returns VAT payable in current month
+        :param account_list is account from ncont.db'''
+        tt = 0
+        acc_1, acc_2 = accounts
+        for acc in account_list:
+            p = acc[1] == acc_1
+            d = acc[1] == acc_2
+            if p:
+                tt += acc[8]
+            elif d:
+                tt -= acc[7] + acc[8]
+        return round(tt)
+
+    def vat_final(self, acc_list, accounts=('442.03', '442.04')) -> int:
+        '''returns VAT final payable in current month
+        :param account_list is account from ncont.db'''
+        tt = 0
+        acc_1, acc_2 = accounts
+        for acc in acc_list:
+            account = Account(clasa=acc[0],
+                              simbol=acc[1],
+                              denumire=acc[2],
+                              soldid=acc[3],
+                              soldic=acc[4],
+                              precedentd=acc[5],
+                              precedentc=acc[6],
+                              curentd=acc[7],
+                              curentc=acc[8])
+            payable = account.simbol == acc_1
+            deductible = account.simbol == acc_2
+            if payable:
+                tt += account.soldf('c')
+            elif deductible:
+                tt -= account.soldf('d')
+        return round(tt)
+
+    def tax_payable(self, account_list, account='441') -> int:
+        '''returns income TAX payable in current month
+        :param account_list is account from ncont.db'''
+        tax = 0
+        for acc in account_list:
+            p = acc[1][:3] == account
+            if p:
+                tax += acc[8]
+        return round(tax)
+
+    def div_tax_payable(self, acc_list, accounts='446.07') -> int:
+        '''returns dividend TAX payable in current month
+        :param account_list is account from ncont.db'''
+        tt = 0
+        # acc_1, acc_2 = accounts
+        for acc in acc_list:
+            account = Account(clasa=acc[0],
+                              simbol=acc[1],
+                              denumire=acc[2],
+                              soldid=acc[3],
+                              soldic=acc[4],
+                              precedentd=acc[5],
+                              precedentc=acc[6],
+                              curentd=acc[7],
+                              curentc=acc[8])
+            payable = account.simbol == accounts
+            # deductible = account.simbol == acc_2
+            if payable:
+                tt += account.curentc
+            # elif deductible:
+            #     tt -= account.soldf('d')
+        return round(tt)
+
+    def advance_final(self, acc_list, accounts='542') -> int:
+        '''returns final dvances/year
+        :param account_list is account from ncont.db'''
+        tt = 0
+        # acc_1, acc_2 = accounts
+        for acc in acc_list:
+            account = Account(clasa=acc[0],
+                              simbol=acc[1],
+                              denumire=acc[2],
+                              soldid=acc[3],
+                              soldic=acc[4],
+                              precedentd=acc[5],
+                              precedentc=acc[6],
+                              curentd=acc[7],
+                              curentc=acc[8])
+            payable = account.simbol[:3] == accounts
+            # deductible = account.simbol == acc_2
+            if payable:
+                tt += account.soldf('d')
+            # elif deductible:
+            #     tt -= account.soldf('d')
+        return round(tt)
+
+    def deb_div(self, acc_list, accounts='461') -> int:
+        '''returns advances transfered to deb. diversi/year
+        :param account_list is account from ncont.db'''
+        tt = 0
+        # acc_1, acc_2 = accounts
+        for acc in acc_list:
+            account = Account(clasa=acc[0],
+                              simbol=acc[1],
+                              denumire=acc[2],
+                              soldid=acc[3],
+                              soldic=acc[4],
+                              precedentd=acc[5],
+                              precedentc=acc[6],
+                              curentd=acc[7],
+                              curentc=acc[8])
+            payable = account.simbol[:3] == accounts
+            # deductible = account.simbol == acc_2
+            if payable:
+                tt += account.soldf('d')
+            # elif deductible:
+            #     tt -= account.soldf('d')
+        return round(tt)
+
+    def credit_final(self, acc_list, accounts='455') -> int:
+        '''returns credited ammount/year
+        :param account_list is account from ncont.db'''
+        tt = 0
+        # acc_1, acc_2 = accounts
+        for acc in acc_list:
+            account = Account(clasa=acc[0],
+                              simbol=acc[1],
+                              denumire=acc[2],
+                              soldid=acc[3],
+                              soldic=acc[4],
+                              precedentd=acc[5],
+                              precedentc=acc[6],
+                              curentd=acc[7],
+                              curentc=acc[8])
+            payable = account.simbol[:3] == accounts
+            # deductible = account.simbol == acc_2
+            if payable:
+                tt += account.soldf('d')
+            # elif deductible:
+            #     tt -= account.soldf('d')
+        return round(tt)
+
+if __name__ == '__main__':
+    mentor = WinMentor()
+    # accounts = list(mentor.get_bank_accounts('WEBS'))
+    # account_num = [n for n in accounts[1] if n.startswith(' ')]
+    for account in mentor.get_bank_accounts('WEBS'):
+        # if account[2].startswith(' '):
+        print(account)