Пример #1
0
class dr3080(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.mainProcess()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(
            self.opts["mf"].dbm,
            ["ctlmes", "ctlmst", "drschn", "drsmst", "drstrn", "tplmst"],
            prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        drsctl = gc.getCtl("drsctl", self.opts["conum"])
        if not drsctl:
            return
        self.chains = drsctl["ctd_chain"]
        self.stpl = drsctl["ctd_tplnam"]
        self.ageing = drsctl["ctd_ageing"]
        self.fromad = drsctl["ctd_emadd"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        if self.chains == "N":
            self.schn = 0
            self.echn = 0
        return True

    def mainProcess(self):
        tpm = {
            "stype":
            "R",
            "tables": ("tplmst", ),
            "cols": (("tpm_tname", "", 0, "Template"), ("tpm_title", "", 0,
                                                        "Title", "Y")),
            "where": [("tpm_type", "=", "S"), ("tpm_system", "=", "DRS")],
            "order":
            "tpm_tname"
        }
        drc = {
            "stype": "R",
            "tables": ("drschn", ),
            "cols":
            (("chm_chain", "", 0, "Num"), ("chm_name", "", 0, "Name", "Y")),
            "where": [("chm_cono", "=", self.opts["conum"])]
        }
        drm = {
            "stype":
            "R",
            "tables": ("drsmst", ),
            "cols":
            (("drm_acno", "", 0, "Acc-Num"), ("drm_name", "", 0, "Name", "Y"),
             ("drm_add1", "", 0, "Address Line 1"))
        }
        if self.chains == "Y":
            drm["where"] = [("drm_cono", "=", self.opts["conum"])]
            drm["whera"] = [["C", "drm_chain", 0, 1]]
        else:
            drm["where"] = [("drm_cono", "=", self.opts["conum"]),
                            ("drm_chain", "=", 0)]
        mss = {
            "stype":
            "R",
            "tables": ("ctlmes", ),
            "cols": (("mss_message", "", 0, "Num"), ("mss_detail", "NA", 50,
                                                     "Details")),
            "where": [("mss_system", "=", "STA")]
        }
        r1s = (("Yes", "Y"), ("No", "N"))
        r2s = (("Yes", "Y"), ("Range", "R"), ("Singles", "S"))
        r3s = (("Number", "N"), ("Name", "M"), ("Postal Code", "P"))
        fld = [[["T", 0, 0, 0], "INA", 20, "Template Name", "", self.stpl, "Y",
                self.doTplNam, tpm, None, None],
               [["T", 0, 1, 0], ("IRB", r1s), 0, "Open Item", "", "Y", "Y",
                self.doOItem, None, None, None],
               [["T", 0, 2, 0], "IUI", 2, "Maximum Pages", "", 1, "Y",
                self.doPages, None, None, None],
               [["T", 0, 3, 0], ("IRB", r2s), 0, "Whole File", "", "S", "Y",
                self.doWhole, None, None, None],
               [["T", 0, 4, 0], "IUI", 3, "From Chain", "", "", "Y",
                self.doChn, drc, None, None],
               [["T", 0, 5, 0], "INA", 7, "From Account", "", "", "Y",
                self.doAcc, drm, None, None],
               [["T", 0, 6, 0], "INA", 3, "To Chain", "", "", "Y", self.doChn,
                drc, None, None],
               [["T", 0, 7, 0], "INA", 7, "To Account", "", "", "Y",
                self.doAcc, drm, None, None],
               [["T", 0, 8, 0], ("IRB", r3s), 0, "Sort Order", "", "N", "Y",
                self.doSort, None, None, None],
               [["T", 0, 9, 0], ("IRB", r1s), 0, "Include Zero Balances", "",
                "N", "Y", self.doZeros, None, None, None],
               [["T", 0, 10, 0], ("IRB", r1s), 0, "Include Negative Balances",
                "", "N", "Y", self.doMinus, None, None, None],
               [["T", 0, 11, 0], ("IRB", r1s), 0, "Include Stopped Accounts",
                "", "N", "Y", self.doStops, None, None, None],
               [["T", 0, 12, 0], ("IRB", r1s), 0, "Include Redundant Accounts",
                "", "N", "Y", self.doRedu, None, None, None],
               [["T", 0, 13,
                 0], ("IRB", r1s), 0, "Include Allocated Transactions", "",
                "N", "Y", self.doAlloc, None, None, None],
               [["T", 0, 14, 0], "ID1", 10, "Statement Date", "", self.sysdtw,
                "Y", self.doDat, None, None, ("efld", )],
               [["T", 0, 15, 0], "IUI", 3, "Message Number", "", "", "Y",
                self.doMessno, mss, None, ("efld", )]]
        if self.chains != "Y":
            del fld[6]
            del fld[4]
            for n, f in enumerate(fld):
                fld[n][0][2] = n
        tnd = ((self.doEnd, "Y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=("N", "V"),
                               mail=("B", "Y"))

    def doTplNam(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("tplmst",
                              where=[("tpm_tname", "=", w),
                                     ("tpm_type", "=", "S"),
                                     ("tpm_system", "=", "DRS")],
                              limit=1)
        if not acc:
            return "Invalid Template Name"
        self.tname = w
        self.sttyp = acc[self.sql.tplmst_col.index("tpm_sttp")]
        if self.sttyp == "N":
            self.oitem = "Y"
            self.pages = 0
            self.df.loadEntry(frt, pag, p + 1, data=self.oitem)
            self.df.loadEntry(frt, pag, p + 2, data=self.pages)
            return "sk2"

    def doOItem(self, frt, pag, r, c, p, i, w):
        self.oitem = w
        if self.oitem == "N":
            self.pages = 0
            self.df.loadEntry(frt, pag, p + 1, data=self.pages)
            return "sk1"

    def doPages(self, frt, pag, r, c, p, i, w):
        self.pages = w

    def doWhole(self, frt, pag, r, c, p, i, w):
        self.whole = w
        if self.whole in ("Y", "S"):
            self.schn = 0
            self.echn = 0
            self.sacc = ""
            self.eacc = ""
            if self.chains == "Y":
                self.df.loadEntry("T", 0, p + 1, data=self.schn)
                self.df.loadEntry("T", 0, p + 2, data=self.sacc)
                self.df.loadEntry("T", 0, p + 3, data=self.echn)
                self.df.loadEntry("T", 0, p + 4, data=self.eacc)
                return "sk4"
            else:
                self.df.loadEntry("T", 0, p + 1, data=self.sacc)
                self.df.loadEntry("T", 0, p + 2, data=self.eacc)
                return "sk2"

    def doChn(self, frt, pag, r, c, p, i, w):
        chk = self.sql.getRec("drschn",
                              cols=["chm_name"],
                              where=[("chm_chain", "=", w)],
                              limit=1)
        if not chk:
            return "Invalid Chain Store"
        if c == 5:
            self.schn = w
        else:
            self.echn = w

    def doAcc(self, frt, pag, r, c, p, i, w):
        if self.chains == "Y" and c == 6:
            chk = self.schn
            self.sacc = w
        elif self.chains == "Y" and c == 8:
            chk = self.echn
            self.eacc = w
        elif c == 5:
            chk = self.schn
            self.sacc = w
        else:
            chk = self.echn
            self.eacc = w
        chk = self.sql.getRec("drsmst",
                              cols=["drm_name"],
                              where=[("drm_cono", "=", self.opts["conum"]),
                                     ("drm_chain", "=", chk),
                                     ("drm_acno", "=", w)],
                              limit=1)
        if not chk:
            return "Invalid Debtors Account"

    def doSort(self, frt, pag, r, c, p, i, w):
        self.sort = w

    def doZeros(self, frt, pag, r, c, p, i, w):
        self.zeros = w

    def doMinus(self, frt, pag, r, c, p, i, w):
        self.minus = w

    def doStops(self, frt, pag, r, c, p, i, w):
        self.stops = w

    def doRedu(self, frt, pag, r, c, p, i, w):
        self.redu = w
        if self.sttyp == "O":
            self.alloc = "Y"
            self.df.loadEntry(frt, pag, p + 1, data=self.alloc)
            return "sk1"

    def doAlloc(self, frt, pag, r, c, p, i, w):
        self.alloc = w

    def doMessno(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("ctlmes",
                                  cols=["mss_detail"],
                                  where=[("mss_system", "=", "STA"),
                                         ("mss_message", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Message Number"
        self.mess = w

    def doDat(self, frt, pag, r, c, p, i, w):
        self.datew = w
        self.dated = self.df.t_disp[pag][0][p]
        self.curdt = int(w / 100)

    def doEnd(self):
        self.df.closeProcess()
        self.emadd = self.df.repeml[2]
        if not self.echn:
            self.echn = 999
        if not self.eacc:
            self.eacc = "zzzzzzz"
        whr = [("drm_cono", "=", self.opts["conum"]),
               ("drm_chain", ">=", self.schn), ("drm_acno", ">=", self.sacc),
               ("drm_chain", "<=", self.echn), ("drm_acno", "<=", self.eacc)]
        if self.stops == "N":
            whr.append(("drm_stop", "<>", "Y"))
        if self.redu == "N":
            whr.append(("drm_stat", "<>", "X"))
        if self.whole == "S":
            recs = getSingleRecords(self.opts["mf"],
                                    "drsmst",
                                    ("drm_chain", "drm_acno", "drm_name"),
                                    where=whr)
        else:
            if self.sort == "N":
                odr = "drm_chain, drm_acno"
            elif self.sort == "M":
                odr = "drm_name"
            else:
                odr = "drm_pcod"
            recs = self.sql.getRec("drsmst", where=whr, order=odr)
        if not recs:
            showError(self.opts["mf"].body, "Error", "No Accounts Selected")
        else:
            self.form = DrawForm(self.opts["mf"].dbm,
                                 self.tname,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"])
            self.doLoadStatic()
            self.form.doNewDetail()
            p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
            for num, rec in enumerate(recs):
                p.displayProgress(num)
                if p.quit:
                    break
                self.doProcess(rec)
            p.closeProgress()
            if p.quit or not self.form.page:
                pass
            elif self.df.repeml[1] == "N" or self.emadd:
                self.df.repeml[2] = self.emadd
                self.doPrint()
        self.opts["mf"].closeLoop()

    def doLoadStatic(self):
        cmc = self.sql.ctlmst_col
        ctm = self.sql.getRec("ctlmst",
                              where=[("ctm_cono", "=", self.opts["conum"])],
                              limit=1)
        for fld in cmc:
            dat = ctm[cmc.index(fld)]
            if fld in self.form.tptp:
                if fld == "ctm_logo":
                    self.form.letterhead(cmc, ctm, fld, dat)
                    continue
                self.form.tptp[fld][1] = dat
        if "letterhead" in self.form.tptp:
            self.form.letterhead(cmc, ctm, "letterhead", None)
        self.form.document_date(self.dated)
        self.form.bank_details(cmc, ctm, 0)

    def doProcess(self, drm):
        dmc = self.sql.drsmst_col
        dtc = self.sql.drstrn_col
        tdc = self.form.sql.tpldet_col
        self.chn = drm[dmc.index("drm_chain")]
        self.acc = drm[dmc.index("drm_acno")]
        eml = drm[dmc.index("drm_acc_email")]
        self.form.account_details("drm", dmc, drm, 1)
        if drm[dmc.index("drm_stames")]:
            self.mesno = drm[dmc.index("drm_stames")]
        else:
            self.mesno = self.mess
        for col in dmc:
            d = "%s_C00" % col
            if d in self.form.newdic:
                dat = drm[dmc.index(col)]
                self.form.newdic[d][tdc.index("tpd_text")] = dat
        bals = Balances(self.opts["mf"], "DRS", self.opts["conum"], self.curdt,
                        (self.chn, self.acc))
        if self.alloc == "Y":
            tt = "A"
        else:
            tt = "Y"
        obal, self.tbal, self.ages, trns = bals.doAllBals(trans=tt)
        if not trns[1]:
            return
        if self.sttyp == "O":
            self.tots = [0.0, 0.0, 0.0]
            cmth = False
            tran = copyList(trns[1])
            for t in tran:
                if t[dtc.index("drt_type")] not in (2, 6) and \
                        t[dtc.index("drt_curdt")] == self.curdt:
                    self.tots[1] = float(ASD(self.tots[1]) + \
                        ASD(t[dtc.index("drt_tramt")]))
                    if t[dtc.index("drt_taxamt")]:
                        self.tots[1] = float(ASD(self.tots[1]) - \
                            ASD(t[dtc.index("drt_taxamt")]))
                        self.tots[2] = float(ASD(self.tots[2]) + \
                            ASD(t[dtc.index("drt_taxamt")]))
                else:
                    self.tots[0] = float(ASD(self.tots[0]) + \
                        ASD(t[dtc.index("drt_tramt")]))
                if t[dtc.index("drt_curdt")] == self.curdt:
                    cmth = True
                elif self.oitem == "N":
                    trns[1].remove(t)
            if self.zeros == "N" and not self.tbal and not cmth:
                return
            if self.minus == "N" and self.tbal < 0:
                return
            if self.oitem == "N" and obal:
                t[trns[0].index("drt_type")] = 3
                t[trns[0].index("drt_ref1")] = "O/Bal"
                t[trns[0].index("drt_batch")] = ""
                t[trns[0].index("drt_trdt")] = (self.curdt * 100) + 1
                t[trns[0].index("drt_ref2")] = ""
                t[trns[0].index("drt_tramt")] = obal
                t[trns[0].index("drt_taxamt")] = 0
                t[trns[0].index("drt_desc")] = "Opening Balance"
                t[trns[0].index("drt_taxind")] = ""
                t[trns[0].index("drt_batind")] = ""
                trns[1].insert(0, t)
            if len(trns[1]) <= self.form.maxlines:
                self.doBody(trns[0], trns[1], tdc)
            else:
                pages = int(len(trns[1]) / self.form.maxlines)
                if len(trns[1]) % self.form.maxlines:
                    pages += 1
                if pages <= self.pages:
                    self.doBody(trns[0], trns[1], tdc)
                else:
                    bal = 0
                    lines = len(
                        trns[1]) - (self.pages * self.form.maxlines) + 1
                    for _ in range(lines):
                        trn = trns[1].pop(0)
                        bal = float(
                            ASD(bal) + ASD(trn[dtc.index("drt_tramt")]))
                    trn[trns[0].index("drt_type")] = 3
                    trn[trns[0].index("drt_ref1")] = "B/FWD"
                    trn[trns[0].index("drt_batch")] = ""
                    trn[trns[0].index("drt_ref2")] = ""
                    trn[trns[0].index("drt_tramt")] = bal
                    trn[trns[0].index("drt_taxamt")] = 0
                    trn[trns[0].index("drt_desc")] = "Balance Brought Forward"
                    trn[trns[0].index("drt_taxind")] = ""
                    trn[trns[0].index("drt_batind")] = ""
                    trns[1].insert(0, trn)
                    self.doBody(trns[0], trns[1], tdc)
        else:
            if self.zeros == "N" and not self.tbal:
                return
            if self.minus == "N" and self.tbal < 0:
                return
            self.doBody(trns[0], trns[1], tdc)
        self.doTotal(tdc)
        self.doTail(tdc)
        if self.df.repeml[1] == "Y" and not self.emadd:
            self.df.repeml[2] = eml
            self.doPrint()

    def doPrint(self):
        if self.df.repeml[1] == "Y" and not self.emadd:
            key = "%s_%s_%s" % (self.opts["conum"], self.chn, self.acc)
        else:
            key = "%s_all_all" % self.opts["conum"]
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            key,
                            ext="pdf")
        self.form.output(pdfnam, "F")
        doPrinter(mf=self.opts["mf"],
                  conum=self.opts["conum"],
                  pdfnam=pdfnam,
                  header="%s Statement for %s as at %s" %
                  (self.opts["conam"], self.acc, self.dated),
                  repprt=self.df.repprt,
                  fromad=self.fromad,
                  repeml=self.df.repeml)
        if self.df.repeml[1] == "Y":
            self.form = DrawForm(self.opts["mf"].dbm,
                                 self.tname,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"])
            self.doLoadStatic()
            self.form.doNewDetail()

    def doBody(self, dtc, drt, tdc):
        page = 0
        count = 0
        rbal = 0
        text = tdc.index("tpd_text")
        for trans in drt:
            if not count:
                page += 1
                count = self.doHeader(page)
            if count == self.form.maxlines:
                page = self.doCfwd(page)
                count = self.doHeader(page)
            for cod in self.form.body:
                if cod == "type_code":
                    c = "drt_type"
                elif cod == "line_paid":
                    c = "paid"
                elif cod == "line_balance":
                    c = "balance"
                else:
                    c = cod
                d = "%s_C%02i" % (cod, count)
                if cod == "type_code":
                    ttyp = trans[dtc.index(c)]
                    self.form.newdic[d][text] = drtrtp[ttyp - 1][0]
                elif self.sttyp == "O" and cod == "running_balance":
                    self.form.newdic[d][text] = rbal
                else:
                    self.form.newdic[d][text] = trans[dtc.index(c)]
                    if self.sttyp == "O" and cod == "drt_tramt":
                        rbal = float(ASD(rbal) + ASD(trans[dtc.index(c)]))
                self.form.doDrawDetail(self.form.newdic[d])
            count += 1
        for x in range(count, self.form.maxlines):
            for cod in self.form.body:
                d = "%s_C%02i" % (cod, x)
                self.form.newdic[d][tdc.index("tpd_text")] = "BLANK"
                self.form.doDrawDetail(self.form.newdic[d])

    def doHeader(self, page):
        self.form.add_page()
        tdc = self.form.sql.tpldet_col
        for key in self.form.newkey:
            nl = copyList(self.form.newdic[key])
            if nl[tdc.index("tpd_place")] != "A":
                continue
            if nl[tdc.index("tpd_detseq")] == "drm_acno_C00":
                nl[tdc.index("tpd_text")] = self.acc
            elif nl[tdc.index("tpd_detseq")] == "page_number_C00":
                nl[tdc.index("tpd_text")] = str(page)
            self.form.doDrawDetail(nl)
        return 0

    def doCfwd(self, page):
        if "carried_forward" in self.form.tptp:
            tdc = self.form.sql.tpldet_col
            line = copyList(self.form.cfwd)
            line[tdc.index("tpd_text")] = "Continued on Page %i" % (page + 1)
            self.form.doDrawDetail(line)
        return page + 1

    def doTotal(self, tdc):
        for c in self.form.total:
            if self.ageing == "N" and c != "total_balance":
                continue
            t = "%s_T00" % c
            if c in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[c])
            elif t in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[t])
            d = "%s_C00" % c
            if d in self.form.newdic:
                line = self.form.newdic[d]
                if c == "120_day_balance":
                    line[tdc.index("tpd_text")] = self.ages[4]
                elif c == "90_day_balance":
                    line[tdc.index("tpd_text")] = self.ages[3]
                elif c == "60_day_balance":
                    line[tdc.index("tpd_text")] = self.ages[2]
                elif c == "30_day_balance":
                    line[tdc.index("tpd_text")] = self.ages[1]
                elif c == "current_balance":
                    line[tdc.index("tpd_text")] = self.ages[0]
                elif c == "total_arrears":
                    line[tdc.index("tpd_text")] = self.tots[0]
                elif c == "month_exclusive":
                    line[tdc.index("tpd_text")] = self.tots[1]
                elif c == "month_tax":
                    line[tdc.index("tpd_text")] = self.tots[2]
                elif c == "total_balance":
                    line[tdc.index("tpd_text")] = self.tbal
                self.form.doDrawDetail(line)

    def doTail(self, tdc):
        for c in self.form.tail:
            if c == "message" and not self.mesno:
                continue
            t = "%s_T00" % c
            if c in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[c])
            elif t in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[t])
            d = "%s_C00" % c
            if d in self.form.newdic:
                if d == "message_C00" and self.mesno:
                    mes = self.sql.getRec("ctlmes",
                                          cols=["mss_detail"],
                                          where=[("mss_system", "=", "STA"),
                                                 ("mss_message", "=",
                                                  self.mesno)],
                                          limit=1)
                    self.form.newdic[d][tdc.index("tpd_text")] = mes[0]
                self.form.doDrawDetail(self.form.newdic[d])

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #2
0
class cr3080(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.mainProcess()
            if "wait" in self.opts:
                self.df.mstFrame.wait_window()
            else:
                self.opts["mf"].startLoop()

    def setVariables(self):
        gc = GetCtl(self.opts["mf"])
        crsctl = gc.getCtl("crsctl", self.opts["conum"])
        if not crsctl:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlctl", "ctlmst", "crsctl", "crsmst", "crstrn", "crsage",
            "gentrn", "tplmst"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.glint = crsctl["ctc_glint"]
        self.bestac = crsctl["ctc_bestac"]
        self.besttp = crsctl["ctc_besttp"]
        self.bankac = crsctl["ctc_bankac"]
        self.tplnam = crsctl["ctc_tplnam"]
        self.fromad = crsctl["ctc_emadd"]
        if self.glint == "Y":
            ctlctl = gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            if gc.chkRec(self.opts["conum"], ctlctl, ["crs_ctl"]):
                return
            self.crsctl = ctlctl["crs_ctl"]
        acc = self.sql.getRec("crstrn",
                              cols=["max(crt_ref1)"],
                              where=[("crt_cono", "=", self.opts["conum"]),
                                     ("crt_type", "=", 5),
                                     ("crt_ref1", "like", "EFT______")],
                              limit=1)
        try:
            self.cats = int(acc[0][3:])
            self.refs = int(acc[0][3:]) + 1
        except:
            self.cats = 0
            self.refs = 1
        self.etotal = 0
        return True

    def mainProcess(self):
        tpm = {
            "stype":
            "R",
            "tables": ("tplmst", ),
            "cols": (("tpm_tname", "", 0, "Template"), ("tpm_title", "", 0,
                                                        "Title", "Y")),
            "where": [("tpm_type", "=", "R"), ("tpm_system", "=", "CRS")],
            "order":
            "tpm_tname"
        }
        crm = {
            "stype":
            "R",
            "tables": ("crsmst", ),
            "cols":
            (("crm_acno", "", 0, "Acc-Num"), ("crm_name", "", 0, "Name", "Y")),
            "where": [("crm_cono", "=", self.opts["conum"]),
                      ("crm_stat", "<>", "X")]
        }
        r1s = (("Yes", "Y"), ("Range", "R"), ("Singles", "S"))
        r2s = (("Yes", "Y"), ("No", "N"))
        r3s = (("Number", "N"), ("Name", "M"), ("Postal Code", "P"))
        r4s = (("Monthly", "M"), ("Daily", "D"))
        fld = ((("T", 0, 0, 0), "INA", 20, "Template Name", "", self.tplnam,
                "Y", self.doTplNam, tpm, None, None),
               (("T", 0, 1, 0), ("IRB", r1s), 0, "Whole File", "", "S", "Y",
                self.doWhole, None, None, None), [["T", 0, 2, 0], "INA", 7,
                                                  "From Account", "", "", "Y",
                                                  self.doAcc, crm, None, None],
               [["T", 0, 3, 0], "INA", 7, "To   Account", "", "", "Y",
                self.doAcc, crm, None,
                None], (("T", 0, 4, 0), ("IRB", r3s), 0, "Sort Order", "", "N",
                        "Y", self.doSort, None, None, None),
               (("T", 0, 5, 0), ("IRB", r4s), 0, "Terms Base", "", "M", "Y",
                self.doFrequency, None, None,
                None), (("T", 0, 6, 0), ("IRB", r2s), 0, "Exceptions", "", "N",
                        "Y", self.doExcepts, None, None, None),
               (("T", 0, 7, 0), "ID1", 10, "Due Date", "", self.sysdtw, "Y",
                self.doDuedat, None, None, ("efld", )),
               (("T", 0, 8, 0), "ID1", 10, "Payment Date", "", self.sysdtw,
                "Y", self.doPaydat, None, None, ("efld", )))
        tnd = ((self.doEnd, "Y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=("N", "V"),
                               mail=("B", "Y"))

    def doTplNam(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("tplmst",
                              where=[("tpm_tname", "=", w),
                                     ("tpm_type", "=", "R"),
                                     ("tpm_system", "=", "CRS")],
                              limit=1)
        if not acc:
            return "Invalid Template Name"
        self.tname = w

    def doWhole(self, frt, pag, r, c, p, i, w):
        self.whole = w
        if self.whole in ("Y", "S"):
            self.sacc = ""
            self.eacc = ""
            self.df.loadEntry("T", 0, p + 1, data=self.sacc)
            self.df.loadEntry("T", 0, p + 2, data=self.eacc)
            return "sk2"

    def doAcc(self, frt, pag, r, c, p, i, w):
        chk = self.sql.getRec("crsmst",
                              cols=["crm_name", "crm_stat"],
                              where=[("crm_cono", "=", self.opts["conum"]),
                                     ("crm_acno", "=", w)],
                              limit=1)
        if not chk:
            return "Invalid Creditors Account"
        if not chk[1] == "X":
            return "Invalid Account, Redundant"
        if c == 3:
            self.sacc = w
        else:
            self.eacc = w

    def doSort(self, frt, pag, r, c, p, i, w):
        self.sort = w

    def doFrequency(self, frt, pag, r, c, p, i, w):
        self.freq = w

    def doExcepts(self, frt, pag, r, c, p, i, w):
        self.excepts = w

    def doDuedat(self, frt, pag, r, c, p, i, w):
        self.duedtw = w
        self.duedtd = self.df.t_disp[pag][0][p]

    def doPaydat(self, frt, pag, r, c, p, i, w):
        self.paydtw = w
        self.paydtd = self.df.t_disp[pag][0][p]
        self.curdt = int(self.paydtw / 100)
        self.batno = "E%s" % self.curdt

    def doEnd(self):
        self.df.closeProcess()
        if self.excepts == "Y":
            self.doExceptions()
        self.emadd = self.df.repeml[2]
        if self.bestac:
            self.export = open(
                os.path.join(
                    self.opts["mf"].rcdic["wrkdir"],
                    "best%03d_%s.txt" % (self.opts["conum"], self.paydtw)),
                "w")
            # Header for BEST
            self.export.write("%1s%4s%-40s%8s%1s%8s%-15s%1s%2s%1s%9s%2s%4s"\
                "\r\n" % ("*", self.bestac, self.opts["conam"], self.paydtw,
                "Y", "", "CREDITORS EFT", "+", self.besttp, 0, "", "01",
                "LIVE"))
        else:
            self.export = None
        if self.whole == "S":
            recs = getSingleRecords(self.opts["mf"],
                                    "crsmst", ("crm_acno", "crm_name"),
                                    where=[("crm_cono", "=",
                                            self.opts["conum"]),
                                           ("crm_termsb", "=", self.freq),
                                           ("crm_pyind", "<>", "N"),
                                           ("crm_stat", "<>", "X")])
        else:
            if not self.eacc:
                self.eacc = "zzzzzzz"
            whr = [("crm_cono", "=", self.opts["conum"]),
                   ("crm_acno", "between", self.sacc, self.eacc),
                   ("crm_termsb", "=", self.freq), ("crm_pyind", "<>", "N"),
                   ("crm_stat", "<>", "X")]
            if self.sort == "N":
                odr = "crm_acno"
            elif self.sort == "M":
                odr = "crm_name"
            else:
                odr = "crm_pcod"
            recs = self.sql.getRec("crsmst", where=whr, order=odr)
            if not recs:
                showError(self.opts["mf"].body, "Error",
                          "No Accounts Selected")
        if recs:
            self.form = DrawForm(self.opts["mf"].dbm,
                                 self.tname,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"])
            self.doLoadStatic()
            self.form.doNewDetail()
            p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
            for num, rec in enumerate(recs):
                p.displayProgress(num)
                if p.quit:
                    self.opts["mf"].dbm.rollbackDbase()
                    break
                self.doProcess(rec)
            p.closeProgress()
            if p.quit or not self.form.page:
                pass
            elif self.df.repeml[1] == "N" or self.emadd:
                self.df.repeml[2] = self.emadd
                self.doPrint()
            if self.bestac:
                # Trailer for BEST
                value = int(round((self.etotal * 100), 0))
                self.export.write("%1s%4s%1s%30s%013u%47s\r\n" % \
                    (2, self.bestac, "T", "", value, ""))
                self.export.close()
                if self.glint == "Y" and self.etotal:
                    # Create total transactions in GL
                    data = [
                        self.opts["conum"], self.crsctl, self.curdt,
                        self.paydtw, 2, self.refno, self.batno, self.etotal,
                        0.0,
                        "Payment EFT%06i to EFT%06i" % (self.refs, self.cats),
                        "", "", 0, self.opts["capnm"], self.sysdtw, 0
                    ]
                    self.sql.insRec("gentrn", data=data)
                    data[1] = self.bankac
                    data[7] = float(ASD(0) - ASD(self.etotal))
                    self.sql.insRec("gentrn", data=data)
                self.opts["mf"].dbm.commitDbase(
                    ask=True,
                    mess="""Would you like to commit all elecronic payments?

If you decide to do this, you must remember to upload the BEST file to the Bank otherwise you are NOT going to Reconcile!""",
                    default="no")
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()

    def doExceptions(self):
        crm = {
            "stype":
            "R",
            "tables": ("crsmst", ),
            "cols":
            (("crm_acno", "", 0, "Acc-Num"), ("crm_name", "", 0, "Name", "Y")),
            "where": [("crm_cono", "=", self.opts["conum"]),
                      ("crm_termsb", "=", self.freq), ("crm_stat", "<>", "X")]
        }
        crt = {
            "stype":
            "R",
            "tables": ("crstrn", ),
            "cols":
            (("crt_ref1", "", 0, "Reference", "Y"), ("crt_type",
                                                     ("XX", crtrtp), 3, "Typ"),
             ("crt_trdt", "", 0, "Date"), ("crt_tramt", "", 0, "    Amount"),
             ("paid", "SD", 13.2,
              "      Paid"), ("balance", "SD", 13.2,
                              "   Balance"), ("crt_paydt", "", 0, "Pay-Date"),
             ("crt_payind", "", 0, "I"), ("crt_payamt", "", 0, "  Pay-Amnt")),
            "wtype":
            "D",
            "where": [],
            "order":
            "crt_ref1"
        }
        types = []
        for x in range(1, len(crtrtp) + 1):
            types.append((x, crtrtp[x - 1][1]))
        typ = {
            "stype": "C",
            "titl": "Select the Required Type",
            "head": ("C", "Type"),
            "data": types
        }
        fld = ((("T", 0, 0,
                 0), "I@crm_acno", 0, "", "", "", "N", self.doExAcNo, crm,
                None, ("notblank", )), (("T", 0, 0, 0), "O@crm_name", 0, ""),
               (("C", 0, 0, 1), "I@crt_type", 0, "", "", "", "N",
                self.doExTrnTyp, typ, None, ("in", (1, 2, 3, 4, 5))),
               (("C", 0, 0, 0), "I@crt_ref1", 0, "", "", "", "N",
                self.doExTrnRef, crt, None, ("notblank", )),
               (("C", 0, 0, 2), "O@crt_trdt", 0, ""), (("C", 0, 0, 3), "OSD",
                                                       13.2, "Balance"),
               (("C", 0, 0, 4), "I@crt_payind", 0, "", "", "", "N",
                self.doExInd, None, None, ("in", ("Y", "N"))),
               (("C", 0, 0, 5), "I@crt_paydt", 0, "", "", "", "N",
                self.doExDte, None, None,
                ("efld", )), (("C", 0, 0, 6), "I@crt_payamt", 0, "", "", "",
                              "N", self.doExAmt, None, None, ("efld", )))
        tnd = ((self.doExEndTop, "n"), )
        txt = (self.doExExitTop, )
        cnd = ((self.doExEndCol, "y"), )
        cxt = (self.doExExitCol, )
        self.ex = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt)
        self.ex.mstFrame.wait_window()

    def doExAcNo(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec(
            "crsmst",
            cols=["crm_name", "crm_termsb", "crm_pyind", "crm_stat"],
            where=[("crm_cono", "=", self.opts["conum"]),
                   ("crm_acno", "=", w)],
            limit=1)
        if not acc:
            return "Invalid Account Number"
        if acc[1] != self.freq:
            return "Invalid Terms Base"
        if acc[2] == "N":
            return "Invalid Payment Indicator"
        if acc[3] == "X":
            return "Invalid Account, Redundant"
        self.exacc = w
        self.ex.loadEntry(frt, pag, p + 1, data=acc[0])

    def doExEndTop(self):
        self.ex.focusField("C", 0, 1)

    def doExExitTop(self):
        self.opts["mf"].dbm.commitDbase(
            ask=True, mess="Would you like to commit these exceptions?")
        self.ex.closeProcess()

    def doExTrnTyp(self, frt, pag, r, c, p, i, w):
        self.extyp = w
        data = []
        # Build the data for the F1 choice selection
        col, dat = getTrn(self.opts["mf"].dbm,
                          "crs",
                          whr=[("crt_cono", "=", self.opts["conum"]),
                               ("crt_acno", "=", self.exacc),
                               ("crt_type", "=", w)],
                          zer="N")
        if dat:
            cols = ("crt_ref1", "crt_type", "crt_trdt", "crt_tramt", "paid",
                    "balance", "crt_paydt", "crt_payind", "crt_payamt")
            for d in dat:
                rec = []
                for cc in cols:
                    rec.append(d[col.index(cc)])
                data.append(rec)
        self.ex.colf[0][1][8]["where"] = data

    def doExTrnRef(self, frt, pag, r, c, p, i, w):
        col = ["crt_trdt", "balance", "crt_payind", "crt_paydt", "crt_payamt"]
        whr = [("crt_cono", "=", self.opts["conum"]),
               ("crt_acno", "=", self.exacc), ("crt_type", "=", self.extyp),
               ("crt_ref1", "=", w)]
        c, d = getTrn(self.opts["mf"].dbm, "crs", whr=whr, lim=1)
        if not d:
            return "Invalid Transaction Number"
        if not d[0][c.index("balance")]:
            return "Transaction Has No Balance"
        self.exref = w
        self.exdte = d[0][c.index("crt_paydt")]
        self.examt = d[0][c.index("crt_payamt")]
        for pos, fld in enumerate(col):
            self.ex.loadEntry(frt, pag, p + 1 + pos, data=d[0][c.index(fld)])

    def doExInd(self, frt, pag, r, c, p, i, w):
        self.exind = w
        if self.exind == "N":
            return "nd"

    def doExDte(self, frt, pag, r, c, p, i, w):
        self.exdte = w

    def doExAmt(self, frt, pag, r, c, p, i, w):
        self.examt = w

    def doExEndCol(self):
        # Update Transaction"
        self.sql.updRec("crstrn",
                        cols=["crt_payind", "crt_paydt", "crt_payamt"],
                        data=[self.exind, self.exdte, self.examt],
                        where=[("crt_cono", "=", self.opts["conum"]),
                               ("crt_acno", "=", self.exacc),
                               ("crt_type", "=", self.extyp),
                               ("crt_ref1", "=", self.exref)])
        self.ex.advanceLine(0)

    def doExExitCol(self):
        self.ex.focusField("T", 0, 1)

    def doLoadStatic(self):
        cmc = self.sql.ctlmst_col
        ctm = self.sql.getRec("ctlmst",
                              where=[("ctm_cono", "=", self.opts["conum"])],
                              limit=1)
        for fld in cmc:
            dat = ctm[cmc.index(fld)]
            if fld in self.form.tptp:
                if fld == "ctm_logo":
                    self.form.letterhead(cmc, ctm, fld, dat)
                    continue
                self.form.tptp[fld][1] = dat
        if "letterhead" in self.form.tptp:
            self.form.letterhead(cmc, ctm, "letterhead", None)
        self.form.document_date(self.duedtd)

    def doProcess(self, crm):
        cmc = self.sql.crsmst_col
        tdc = self.form.sql.tpldet_col
        self.acno = crm[cmc.index("crm_acno")]
        eml = crm[cmc.index("crm_acc_email")]
        self.form.account_details("crm", cmc, crm, 1)
        for col in cmc:
            d = "%s_C00" % col
            if d in self.form.newdic:
                dat = crm[cmc.index(col)]
                self.form.newdic[d][tdc.index("tpd_text")] = dat
        jon = "cra_curdt <= %s" % self.curdt
        whr = [("crt_cono", "=", self.opts["conum"]),
               ("crt_acno", "=", self.acno), ("crt_payind", "=", "Y"),
               ("crt_paydt", "<=", self.duedtw)]
        ctc, crt = getTrn(self.opts["mf"].dbm,
                          "crs",
                          jon=jon,
                          whr=whr,
                          zer="N")
        if not crt:
            return
        bal = 0
        self.pay = 0
        for d in crt:
            if d[ctc.index("balance")] < 0:
                d[ctc.index("crt_payamt")] = d[ctc.index("balance")]
            bal = float(ASD(bal) + ASD(d[ctc.index("balance")]))
            self.pay = float(ASD(self.pay) + ASD(d[ctc.index("crt_payamt")]))
        if self.pay > bal:
            self.pay = bal
        if self.pay > 0:
            self.bname = crm[cmc.index("crm_bname")]
            self.bibt = crm[cmc.index("crm_bibt")]
            self.bacc = crm[cmc.index("crm_bacc")]
            if self.bname and self.bibt and self.bacc:
                self.ptype = "E"  # Electronic
                test = False
                while not test:
                    self.cats += 1
                    self.refno = "EFT%06i" % self.cats
                    # Check if Reference Number Already Exists
                    chk = self.sql.getRec("crstrn",
                                          where=[("crt_cono", "=",
                                                  self.opts["conum"]),
                                                 ("crt_acno", "=", self.acno),
                                                 ("crt_type", "=", 5),
                                                 ("crt_ref1", "=", self.refno)
                                                 ])
                    if not chk:
                        test = True
            else:
                self.ptype = "C"  # Cheque
            self.doBody(ctc, crt, tdc)
            self.doTotal(tdc)
            self.doTail(tdc)
            if self.df.repeml[1] == "Y" and not self.emadd:
                self.df.repeml[2] = eml
                self.doPrint()

    def doPrint(self):
        if self.df.repeml[1] == "Y" and not self.emadd:
            key = "%s_%s" % (self.opts["conum"], self.acno)
        else:
            key = "%s_all" % self.opts["conum"]
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            key,
                            ext="pdf")
        self.form.output(pdfnam, "F")
        doPrinter(mf=self.opts["mf"],
                  conum=self.opts["conum"],
                  pdfnam=pdfnam,
                  header="%s Remittance Advice" % self.opts["conam"],
                  repprt=self.df.repprt,
                  fromad=self.fromad,
                  repeml=self.df.repeml)
        if self.df.repeml[1] == "Y":
            self.form = DrawForm(self.opts["mf"].dbm,
                                 self.tname,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"])
            self.doLoadStatic()
            self.form.doNewDetail()

    def doBody(self, ctc, crt, tdc):
        page = 0
        count = 0
        text = self.form.sql.tpldet_col.index("tpd_text")
        for trans in crt:
            trbal = trans[ctc.index("balance")]
            payamt = trans[ctc.index("crt_payamt")]
            if payamt > trbal:
                payamt = trbal
            trans[ctc.index("balance")] = payamt
            if not count:
                page += 1
                count = self.doHeader(page)
            if count == self.form.maxlines:
                page = self.doCfwd(page)
                count = self.doHeader(page)
            for cod in self.form.body:
                if cod == "type_code":
                    c = "crt_type"
                elif cod == "line_paid":
                    c = "paid"
                elif cod == "line_balance":
                    c = "balance"
                else:
                    c = cod
                d = "%s_C%02i" % (cod, count)
                if cod == "type_code":
                    ttyp = trans[ctc.index(c)]
                    self.form.newdic[d][text] = crtrtp[ttyp - 1][0]
                else:
                    self.form.newdic[d][text] = trans[ctc.index(c)]
                self.form.doDrawDetail(self.form.newdic[d])
            if self.ptype == "E" and self.bestac:
                trtp = trans[ctc.index("crt_type")]
                ref1 = trans[ctc.index("crt_ref1")]
                # Create Ageing Transaction
                self.sql.insRec("crsage",
                                data=[
                                    self.opts["conum"], self.acno, trtp, ref1,
                                    self.curdt, 5, self.refno, payamt, 0
                                ])
            count += 1
        for x in range(count, self.form.maxlines):
            for cod in self.form.body:
                d = "%s_C%02i" % (cod, x)
                self.form.newdic[d][tdc.index("tpd_text")] = "BLANK"
                self.form.doDrawDetail(self.form.newdic[d])

    def doHeader(self, page):
        tdc = self.form.sql.tpldet_col
        self.form.add_page()
        for key in self.form.newkey:
            nl = copyList(self.form.newdic[key])
            if nl[tdc.index("tpd_place")] != "A":
                continue
            if nl[tdc.index("tpd_detseq")] == "crm_acno_C00":
                nl[tdc.index("tpd_text")] = self.acno
            elif nl[tdc.index("tpd_detseq")] == "page_number_C00":
                nl[tdc.index("tpd_text")] = str(page)
            self.form.doDrawDetail(nl)
        return 0

    def doCfwd(self, page):
        if "carried_forward" in self.form.tptp:
            tdc = self.form.sql.tpldet_col
            line = copyList(self.form.cfwd)
            line[tdc.index("tpd_text")] = "Continued on Page %i" % (page + 1)
            self.form.doDrawDetail(line)
        return page + 1

    def doTotal(self, tdc):
        for c in self.form.total:
            t = "%s_T00" % c
            if c in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[c])
            elif t in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[t])
            d = "%s_C00" % c
            if d in self.form.newdic:
                line = self.form.newdic[d]
                if c == "total_payment":
                    line[tdc.index("tpd_text")] = self.pay
                self.form.doDrawDetail(line)
        if self.ptype == "E" and self.bestac:
            value = int(round((self.pay * 100), 0))
            self.export.write("%1s%4s%06u%-7s%019u%1s%1s%011u%-20s%10s"\
                "%-15s%1s\r\n" % (2, self.bestac, self.bibt, self.acno,
                int(self.bacc), "", "1", value, self.bname, "",
                self.opts["conam"][:15], ""))
            self.etotal = float(ASD(self.etotal) + ASD(self.pay))
            # Create Payment and Ageing Transaction
            p = float(ASD(0) - ASD(self.pay))
            self.sql.insRec("crstrn",
                            data=[
                                self.opts["conum"], self.acno, 5, self.refno,
                                self.batno, self.paydtw, "", p, 0.0, 0.0,
                                self.curdt, 0, "", 0.0, "Electronic Payment",
                                "", "", self.opts["capnm"], self.sysdtw, 0
                            ])
            self.sql.insRec("crsage",
                            data=[
                                self.opts["conum"], self.acno, 5, self.refno,
                                self.curdt, 5, self.refno, p, 0
                            ])

    def doTail(self, tdc):
        for c in self.form.tail:
            t = "%s_T00" % c
            if c in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[c])
            elif t in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[t])
            d = "%s_C00" % c
            if d in self.form.newdic:
                line = self.form.newdic[d]
                if c == "eft_message" and self.ptype == "E" and self.bestac:
                    line[tdc.index("tpd_text")] = "ELECTRONIC TRANSFER AT %s "\
                        "REFERENCE %s" % (self.paydtd, self.refno)
                self.form.doDrawDetail(line)

    def doExit(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #3
0
class ln3040(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.mainProcess()
            self.opts["mf"].startLoop()

    def setVariables(self):
        gc = GetCtl(self.opts["mf"])
        lonctl = gc.getCtl("lonctl", self.opts["conum"])
        if not lonctl:
            return
        self.capb = lonctl["cln_capb"]
        self.capf = lonctl["cln_capf"]
        self.lint = lonctl["cln_last"]
        self.stpl = lonctl["cln_tplnam"]
        self.fromad = lonctl["cln_emadd"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.curdt = int(self.sysdtw / 100)
        self.sper = int(self.opts["period"][1][0] / 100)
        self.eper = int(self.opts["period"][2][0] / 100)
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlmes", "ctlmst", "ctlynd", "lonmf1", "lonmf2", "lontrn",
            "tplmst"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        return True

    def mainProcess(self):
        tpm = {
            "stype":
            "R",
            "tables": ("tplmst", ),
            "cols": (("tpm_tname", "", 0, "Template"), ("tpm_title", "", 0,
                                                        "Title", "Y")),
            "where": [("tpm_type", "=", "S"), ("tpm_system", "=", "LON")],
            "order":
            "tpm_tname"
        }
        r1s = (("Yes", "Y"), ("No", "N"))
        r2s = (("Number", "A"), ("Name", "N"))
        fld = ((("T", 0, 0, 0), "INA", 20, "Template Name", "", self.stpl, "Y",
                self.doTplNam, tpm, None, None),
               (("T", 0, 1, 0), "Id2", 7, "Start Period", "", self.sper, "N",
                self.doSPer, None, None,
                None), (("T", 0, 2, 0), "ID2", 7, "End Period", "", self.eper,
                        "N", self.doEPer, None, None,
                        None), (("T", 0, 3, 0), ("IRB", r1s), 0, "Whole File",
                                "", "N", "N", self.doWhole, None, None, None),
               (("T", 0, 4, 0), ("IRB", r2s), 0, "Sort Order", "", "A", "N",
                self.doSort, None, None, None),
               (("T", 0, 5, 0), ("IRB", r1s), 0, "Include Zero Balances", "",
                "N", "N", self.doZeros, None, None, None),
               (("T", 0, 6, 0), ("IRB", r1s), 0, "Include Pending Interest",
                "", "N", "N", self.doPend, None, None, None),
               (("T", 0, 7, 0), ("IRB", r1s), 0, "Interest Totals Only", "",
                "Y", "N", self.doITots, None, None, None))
        tnd = ((self.doEnd, "Y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=("N", "V"),
                               mail=("B", "Y"))

    def doTplNam(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("tplmst",
                              where=[("tpm_tname", "=", w),
                                     ("tpm_type", "=", "S"),
                                     ("tpm_system", "=", "LON")],
                              limit=1)
        if not acc:
            return "Invalid Template Name"
        self.tname = w

    def doSPer(self, frt, pag, r, c, p, i, w):
        self.sperw = w
        self.sperd = self.df.t_disp[pag][0][p]

    def doEPer(self, frt, pag, r, c, p, i, w):
        self.eperw = w
        self.eperd = self.df.t_disp[pag][0][p]
        self.date = CCD(mthendDate((w * 100) + 1), "D1", 10)

    def doWhole(self, frt, pag, r, c, p, i, w):
        self.whole = w

    def doSort(self, frt, pag, r, c, p, i, w):
        self.sort = w

    def doZeros(self, frt, pag, r, c, p, i, w):
        self.zeros = w

    def doPend(self, frt, pag, r, c, p, i, w):
        self.pend = w

    def doITots(self, frt, pag, r, c, p, i, w):
        self.itot = w

    def doEnd(self):
        self.df.closeProcess()
        self.emadd = self.df.repeml[2]
        if self.whole == "N":
            recs = getSingleRecords(self.opts["mf"],
                                    "lonmf1", ("lm1_acno", "lm1_name"),
                                    where=[("lm1_cono", "=",
                                            self.opts["conum"])])
        else:
            whr = [("lm1_cono", "=", self.opts["conum"])]
            if self.sort == "A":
                odr = "lm1_acno"
            else:
                odr = "lm1_name"
            recs = self.sql.getRec("lonmf1", where=whr, order=odr)
        if not recs:
            showError(self.opts["mf"].body, "Error", "No Accounts Selected")
        else:
            self.form = DrawForm(self.opts["mf"].dbm,
                                 self.tname,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"])
            self.doLoadStatic()
            self.form.doNewDetail()
            p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
            for num, rec in enumerate(recs):
                p.displayProgress(num)
                if p.quit:
                    break
                self.doProcess(rec)
            p.closeProgress()
            if p.quit or not self.form.page:
                pass
            elif self.df.repeml[1] == "N" or self.emadd:
                self.df.repeml[2] = self.emadd
                self.doPrint()
        self.opts["mf"].closeLoop()

    def doLoadStatic(self):
        cmc = self.sql.ctlmst_col
        ctm = self.sql.getRec("ctlmst",
                              where=[("ctm_cono", "=", self.opts["conum"])],
                              limit=1)
        for fld in cmc:
            dat = ctm[cmc.index(fld)]
            if fld in self.form.tptp:
                if fld == "ctm_logo":
                    self.form.letterhead(cmc, ctm, fld, dat)
                    continue
                self.form.tptp[fld][1] = dat
        if "letterhead" in self.form.tptp:
            self.form.letterhead(cmc, ctm, "letterhead", None)
        self.form.document_date(self.date.disp)
        self.form.bank_details(cmc, ctm, 0)

    def doProcess(self, lm1):
        l1c = self.sql.lonmf1_col
        tdc = self.form.sql.tpldet_col
        self.acno = lm1[l1c.index("lm1_acno")]
        self.emlto = lm1[l1c.index("lm1_email")]
        self.form.account_details("lm1", l1c, lm1, 1)
        for col in l1c:
            d = "%s_C00" % col
            if d in self.form.newdic:
                dat = lm1[l1c.index(col)]
                self.form.newdic[d][tdc.index("tpd_text")] = dat
        lonmf2 = self.sql.getRec("lonmf2",
                                 where=[("lm2_cono", "=", self.opts["conum"]),
                                        ("lm2_acno", "=", self.acno)],
                                 order="lm2_loan")
        for loan in lonmf2:
            self.doStatement(tdc, loan)

    def doStatement(self, tdc, lm2):
        l2c = self.sql.lonmf2_col
        ltc = copyList(self.sql.lontrn_col)
        self.loan = lm2[l2c.index("lm2_loan")]
        for col in l2c:
            d = "%s_C00" % col
            if d in self.form.newdic:
                dat = lm2[l2c.index(col)]
                self.form.newdic[d][tdc.index("tpd_text")] = dat
        if self.pend == "Y":
            # Raise Pending Interest
            LoanInterest("L",
                         self.opts["mf"].dbm,
                         lm2,
                         update="Y",
                         tdate=self.date.work,
                         batch="Pending",
                         curdt=self.curdt,
                         capnm="")
        # Get Transactions
        whr = [("lnt_cono", "=", self.opts["conum"]),
               ("lnt_acno", "=", self.acno), ("lnt_loan", "=", self.loan),
               ("lnt_curdt", "<=", self.eperw)]
        odr = "lnt_curdt, lnt_trdt, lnt_type, lnt_refno"
        if self.itot == "Y":
            w = whr[:]
            w.append(("lnt_type", "<>", 4))
            trns = self.sql.getRec("lontrn", where=w, order=odr)
            if self.capb == "A":  # Anniversary
                fcap = [lm2[l2c.index("lm2_start")], 0]
                if self.capf == "A":
                    fcap[1] = projectDate(fcap[0], 1, typ="years")
                else:
                    fcap[1] = projectDate(fcap[0], 6, typ="months")
            else:  # Financial
                periods = self.sql.getRec(
                    "ctlynd",
                    cols=["cye_period", "cye_start", "cye_end"],
                    where=[("cye_cono", "=", self.opts["conum"])],
                    order="cye_period")
                fcap = [periods[0][1], periods[0][2]]
                if self.capf == "B":  # Bi-Annual
                    fcap[1] = projectDate(fcap[1], -6, typ="months")
            capdt = [copyList(fcap)]
            while fcap[1] < self.date.work:
                if self.capf == "A":
                    fcap[0] = projectDate(fcap[0], 1, typ="years")
                    fcap[1] = projectDate(fcap[1], 1, typ="years")
                else:
                    fcap[0] = projectDate(fcap[0], 6, typ="months")
                    fcap[1] = projectDate(fcap[1], 6, typ="months")
                if fcap[1] <= self.date.work:
                    capdt.append(copyList(fcap))
            for capd in capdt:
                w = whr[:]
                w.append(("lnt_type", "=", 4))
                w.append(("lnt_trdt", "between", capd[0], capd[1]))
                ints = self.sql.getRec("lontrn", where=w, order=odr)
                if not ints:
                    continue
                ddes = "Dr Int %s to %s"
                cdes = "Cr Int %s to %s"
                dbal = 0
                cbal = 0
                for trn in ints:
                    amt = trn[ltc.index("lnt_tramt")]
                    if amt < 0:
                        cbal = float(ASD(cbal) + ASD(amt))
                    else:
                        dbal = float(ASD(dbal) + ASD(amt))
                if dbal:
                    trn[ltc.index("lnt_tramt")] = dbal
                    trn[ltc.index("lnt_desc")] = ddes % (CCD(
                        int(capd[0] / 100), "D2",
                        7).disp, CCD(int(capd[1] / 100), "D2", 7).disp)
                    trns.append(copyList(trn))
                if cbal:
                    trn[ltc.index("lnt_tramt")] = cbal
                    trn[ltc.index("lnt_desc")] = cdes % (CCD(
                        int(capd[0] / 100), "D2",
                        7).disp, CCD(int(capd[1] / 100), "D2", 7).disp)
                    trns.append(copyList(trn))
            trns = sorted(trns, key=itemgetter(5))
        else:
            trns = self.sql.getRec("lontrn", where=whr, order=odr)
        if not trns:
            return
        self.bal = 0
        self.tots = 0
        if self.sperw:
            obal = 0
            trans = copyList(trns)
            for trn in trans:
                tramt = trn[self.sql.lontrn_col.index("lnt_tramt")]
                if trn[self.sql.lontrn_col.index("lnt_curdt")] < self.sperw:
                    obal = float(ASD(obal) + ASD(tramt))
                    trns.remove(trn)
            trn[ltc.index("lnt_type")] = 3
            trn[ltc.index("lnt_trdt")] = (self.sperw * 100) + 1
            trn[ltc.index("lnt_refno")] = "O/Bal"
            trn[ltc.index("lnt_batch")] = ""
            trn[ltc.index("lnt_tramt")] = obal
            trn[ltc.index("lnt_desc")] = "Opening Balance"
            trn[ltc.index("lnt_batind")] = ""
            trns.insert(0, trn)
        trans = []
        for trn in trns:
            tramt = trn[ltc.index("lnt_tramt")]
            self.tots = float(ASD(self.tots) + ASD(tramt))
            if tramt < 0:
                trn.extend([0, tramt])
            else:
                trn.extend([tramt, 0])
            trans.append(trn)
        ltc.extend(["line_debit", "line_credit"])
        if self.zeros == "N" and not self.tots:
            return
        self.doBody(ltc, trans, tdc)
        self.doTotal(tdc)
        self.doTail(tdc)
        if self.pend == "Y":
            self.opts["mf"].dbm.rollbackDbase()
        if self.df.repeml[1] == "Y" and not self.emadd:
            self.df.repeml[2] = self.emlto
            self.doPrint()

    def doPrint(self):
        if self.df.repeml[1] == "Y" and not self.emadd:
            key = "%s_%s_%s" % (self.opts["conum"], self.acno, self.loan)
        else:
            key = "%s_all_all" % self.opts["conum"]
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            key,
                            ext="pdf")
        self.form.output(pdfnam, "F")
        doPrinter(mf=self.opts["mf"],
                  conum=self.opts["conum"],
                  pdfnam=pdfnam,
                  header="%s Statement at %s" %
                  (self.opts["conam"], self.date.disp),
                  repprt=self.df.repprt,
                  fromad=self.fromad,
                  repeml=self.df.repeml)
        if self.df.repeml[1] == "Y":
            self.form = DrawForm(self.opts["mf"].dbm,
                                 self.tname,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"])
            self.doLoadStatic()
            self.form.doNewDetail()

    def doBody(self, ltc, lnt, tdc):
        page = 0
        count = 0
        text = tdc.index("tpd_text")
        for trans in lnt:
            if not count:
                page += 1
                count = self.doHeader(page)
            if count == self.form.maxlines:
                page = self.doCfwd(page)
                count = self.doHeader(page)
            for cod in self.form.body:
                if cod == "type_code":
                    c = "lnt_type"
                elif cod == "line_paid":
                    c = "paid"
                else:
                    c = cod
                d = "%s_C%02i" % (cod, count)
                if cod == "type_code":
                    ttyp = trans[ltc.index(c)]
                    self.form.newdic[d][text] = lntrtp[ttyp - 1][0]
                elif c in ("line_debit", "line_credit"):
                    tramt = trans[ltc.index(c)]
                    self.bal = float(ASD(self.bal) + ASD(tramt))
                    self.form.newdic[d][text] = trans[ltc.index(c)]
                elif c == "line_balance":
                    self.form.newdic[d][text] = self.bal
                else:
                    self.form.newdic[d][text] = trans[ltc.index(c)]
                self.form.doDrawDetail(self.form.newdic[d])
            count += 1
        for x in range(count, self.form.maxlines):
            for cod in self.form.body:
                d = "%s_C%02i" % (cod, x)
                self.form.newdic[d][tdc.index("tpd_text")] = "BLANK"
                self.form.doDrawDetail(self.form.newdic[d])

    def doHeader(self, page):
        self.form.add_page()
        tdc = self.form.sql.tpldet_col
        for key in self.form.newkey:
            nl = copyList(self.form.newdic[key])
            if nl[tdc.index("tpd_place")] != "A":
                continue
            if nl[tdc.index("tpd_detseq")] == "lm1_acno_C00":
                nl[tdc.index("tpd_text")] = self.acno
            elif nl[tdc.index("tpd_detseq")] == "page_number_C00":
                nl[tdc.index("tpd_text")] = str(page)
            self.form.doDrawDetail(nl)
        return 0

    def doCfwd(self, page):
        if "carried_forward" in self.form.tptp:
            tdc = self.form.sql.tpldet_col
            line = copyList(self.form.cfwd)
            line[tdc.index("tpd_text")] = "Continued on Page %i" % (page + 1)
            self.form.doDrawDetail(line)
        return page + 1

    def doTotal(self, tdc):
        for c in self.form.total:
            t = "%s_T00" % c
            if c in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[c])
            elif t in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[t])
            d = "%s_C00" % c
            if d in self.form.newdic:
                line = self.form.newdic[d]
                if c == "total_balance":
                    line[tdc.index("tpd_text")] = self.tots
                self.form.doDrawDetail(line)

    def doTail(self, tdc):
        for c in self.form.tail:
            t = "%s_T00" % c
            if c in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[c])
            elif t in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[t])
            d = "%s_C00" % c
            if d in self.form.newdic:
                self.form.doDrawDetail(self.form.newdic[d])

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()