Пример #1
0
class cr1010(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):
        self.sql = Sql(
            self.opts["mf"].dbm,
            ["chglog", "ctlnot", "crsmst", "crstrn", "genmst", "strpom"],
            prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        crsctl = gc.getCtl("crsctl", self.opts["conum"])
        if not crsctl:
            return
        self.glint = crsctl["ctc_glint"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        return True

    def mainProcess(self):
        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")]
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        tag = (("Basic-_A", None, ("T", 1, 1), ("T", 0, 1)),
               ("Basic-_B", None, ("T", 1, 1), ("T", 0, 1)))
        r1s = (("Monthly", "M"), ("Daily", "D"))
        r2s = (("Yes", "Y"), ("No", "N"))
        self.fld = [
            (("T",0,0,0),"INA",7,"Acc-Num","Account Number",
                "","Y",self.doAcno,crm,None,("efld",),None,
                "To Automatically Generate Account Numbers for "\
                "New Accounts enter a Blank Account Number."),
            (("T",0,0,0),"INA",30,"Name","",
                "","N",self.doName,None,self.doDelete,("notblank",)),
            (("T",1,0,0),"INA",30,"Address Line 1","",
                "","N",None,None,None,("notblank",)),
            (("T",1,1,0),"INA",30,"Address Line 2","",
                "","N",None,None,None,("efld",)),
            (("T",1,2,0),"INA",30,"Address Line 3","",
                "","N",None,None,None,("efld",)),
            (("T",1,3,0),"INA",4,"Postal Code","",
                "","N",None,None,None,("efld",)),
            (("T",1,4,0),"INA",20,"Telephone Number","",
                "","N",None,None,None,("efld",)),
            (("T",1,5,0),"INA",20,"Fax Number","",
                "","N",None,None,None,("efld",)),
            (("T",1,6,0),"INA",30,"Manager's Name","",
                "","N",None,None,None,("efld",)),
            (("T",1,6,0),"ITX",30,"E-Mail","Manager's E-Mail",
                "","N",None,None,None,("email",)),
            (("T",1,7,0),"INA",30,"Account's Contact","Account's Contact Name",
                "","N",None,None,None,("efld",)),
            (("T",1,7,0),"ITX",30,"E-Mail","Account's E-Mail",
                "","N",None,None,None,("email",)),
            (("T",1,8,0),"INA",30,"Order's Contact","Order's Contact Name",
                "","N",None,None,None,("efld",)),
            (("T",1,8,0),"ITX",30,"E-Mail","Order's E-Mail",
                "","N",None,None,None,("email",)),
            (("T",1,9,0),"Id1",10,"Date Account Opened","",
                self.sysdtw,"N",None,None,None,("efld",)),
            (("T",1,10,0),"INA",10,"V.A.T Number","",
                "","N",None,None,None,("efld",)),
            (("T",2,0,0),("IRB",r1s),0,"Terms Base","",
                "M","N",self.doTermsBase,None,None,None),
            (("T",2,1,0),"IUI",2,"Statement Day","",
                "","N",None,None,None,("between",1,30)),
            (("T",2,2,0),"IUI",3,"Terms","",
                "","N",None,None,None,("between",0,90)),
            (("T",2,3,0),"IUI",7,"Credit Limit","",
                "","N",None,None,None,("efld",)),
            (("T",2,4,0),"IUD",5.2,"Trade Discount","",
                "","N",None,None,None,("efld",)),
            (("T",2,5,0),"IUD",5.2,"Settlement Discount",
                "Settlement Discount","","N",None,None,None,("efld",)),
            (("T",2,6,0),("IRB",r2s),0,"Payment Indicator","",
                "Y","N",None,None,None,None),
            (("T",2,7,0),"INA",20,"Bank Name","",
                "","N",None,None,None,("efld",)),
            (("T",2,8,0),"IUI",8,"Bank Branch","",
                "","N",None,None,None,("efld",)),
            (("T",2,9,0),"INA",16,"Bank Account","",
                "","N",None,None,None,("efld",))]
        if self.glint == "Y":
            self.fld.append((("T", 2, 10, 0), "IUI", 7, "G/L Account Number",
                             "G/L Account Number", "", "N", self.doGlac, glm,
                             None, ("efld", )))
        else:
            self.fld.append((("T", 2, 10, 0), "OUI", 7, "G/L Account Number"))
        but = (("Import", None, self.doImport, 0, ("T", 0, 1), ("T", 0, 2),
                "Import Account Details from a CSV or XLS File."),
               ("Accept", None, self.doAccept, 0, ("T", 1, 1), ("T", 0, 1)),
               ("Print", None, self.doPrint, 0, ("T", 0, 2), ("T", 2, 0)),
               ("Cancel", None, self.doCancel, 0, ("T", 0, 2),
                ("T", 2, 0)), ("Quit", None, self.doQuit, 1, None, None))
        tnd = ((self.doEnd, "N"), (self.doEnd, "N"), (self.doAccept, "Y"))
        txt = (self.doExit, self.doExit, self.doExit)
        self.df = TartanDialog(self.opts["mf"],
                               eflds=self.fld,
                               tags=tag,
                               butt=but,
                               tend=tnd,
                               txit=txt,
                               clicks=self.doClick)
        if "args" in self.opts:
            self.df.doKeyPressed("T", 0, 0, data=self.opts["args"])

    def doClick(self, *opts):
        if self.df.pag == 0:
            return
        self.df.focusField("T", opts[0][0], opts[0][1] + 1)

    def doAcno(self, frt, pag, r, c, p, i, w):
        self.acno = w
        if self.acno:
            self.old = self.sql.getRec("crsmst",
                                       where=[("crm_cono", "=",
                                               self.opts["conum"]),
                                              ("crm_acno", "=", self.acno)],
                                       limit=1)
        if not self.acno or not self.old:
            ok = askQuestion(self.opts["mf"].body,
                             "New Account",
                             "Is This a New Account?",
                             default="no")
            if ok == "no":
                return "Invalid Account Number"
            pw = PwdConfirm(self.opts["mf"],
                            conum=self.opts["conum"],
                            system="CRS",
                            code="NewAcc")
            if pw.flag == "no":
                if "args" in self.opts:
                    return "xt"
                else:
                    return "New Account Creation is Not Allowed"
            self.new = True
        elif self.old[self.sql.crsmst_col.index("crm_stat")] == "X":
            return "Invalid Account, Redundant"
        else:
            self.new = False
            self.df.loadEntry("T", pag, p + 1, data=self.old[2])
            d = 3
            for pge in range(1, self.df.pgs + 1):
                for x in range(0, self.df.topq[pge]):
                    self.df.loadEntry("T", pge, x, data=self.old[d])
                    d = d + 1

    def doName(self, frt, pag, r, c, p, i, w):
        self.name = w
        if self.new and not self.acno:
            for x in range(1, 100):
                self.acno = genAccNum(self.name, x, 7)
                chk = self.sql.getRec("crsmst",
                                      where=[("crm_cono", "=",
                                              self.opts["conum"]),
                                             ("crm_acno", "=", self.acno)],
                                      limit=1)
                if not chk:
                    break
            self.df.loadEntry("T", 0, 0, data=self.acno)

    def doTermsBase(self, frt, pag, r, c, p, i, w):
        if w == "D":
            self.df.loadEntry(frt, pag, p + 1, 0)
            return "sk1"

    def doGlac(self, frt, pag, r, c, p, i, w):
        if w:
            chk = chkGenAcc(self.opts["mf"], self.opts["conum"], w)
            if type(chk) is str:
                return chk

    def doDelete(self):
        trs = self.sql.getRec("crstrn",
                              cols=["count(*)"],
                              where=[("crt_cono", "=", self.opts["conum"]),
                                     ("crt_acno", "=", self.acno)],
                              limit=1)
        if trs[0]:
            return "%s Transactions Exist, Not Deleted" % trs[0]
        pom = self.sql.getRec("strpom",
                              cols=["count(*)"],
                              where=[("pom_cono", "=", self.opts["conum"]),
                                     ("pom_acno", "=", self.acno)],
                              limit=1)
        if pom[0]:
            return "%s Purchase Order Exists, Not Deleted" % pom[0]
        nte = self.sql.getRec("ctlnot",
                              cols=["count(*)"],
                              where=[("not_cono", "=", self.opts["conum"]),
                                     ("not_sys", "=", "CRS"),
                                     ("not_key", "=", self.acno)],
                              limit=1)
        if nte[0]:
            return "%s Notes Exist, Not Deleted" % nte[0]
        self.sql.delRec("crsmst",
                        where=[("crm_cono", "=", self.opts["conum"]),
                               ("crm_acno", "=", self.acno)])
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        self.sql.insRec("chglog", data=["crsmst", "D", "%03i%-7s" % \
            (self.opts["conum"], self.acno), "", dte, self.opts["capnm"],
            "", "", "", 0])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doEnd(self):
        if self.df.pag == 0:
            self.df.focusField("T", 1, 1, clr=self.new)
        elif self.df.pag == 1:
            self.df.selPage("Basic-B")
            self.df.focusField("T", 2, 1, clr=self.new)

    def doAccept(self):
        frt, pag, col, mes = self.df.doCheckFields()
        if mes:
            if pag > 0 and pag != self.df.pag:
                if frt == "T":
                    self.df.last[pag][0] = col + 1
                else:
                    self.df.last[pag][1] = col + 1
                self.df.selPage(self.df.tags[pag - 1][0])
            else:
                self.df.focusField(frt, pag, (col + 1), err=mes)
            return
        data = [self.opts["conum"]]
        for x in range(0, 3):
            for y in range(0, len(self.df.t_work[x][0])):
                data.append(self.df.t_work[x][0][y])
        if self.new:
            data.extend(["N", ""])
            self.sql.insRec("crsmst", data=data)
        else:
            col = self.sql.crsmst_col
            data.append(self.old[col.index("crm_stat")])
            data.append(self.old[col.index("crm_xflag")])
            if data != self.old[:len(data)]:
                self.sql.updRec("crsmst",
                                data=data,
                                where=[("crm_cono", "=", self.opts["conum"]),
                                       ("crm_acno", "=", self.acno)])
                dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
                for num, dat in enumerate(self.old):
                    if dat != data[num]:
                        self.sql.insRec(
                            "chglog",
                            data=[
                                "crsmst", "U",
                                "%03i%-7s" % (self.opts["conum"], self.acno),
                                col[num], dte, self.opts["capnm"],
                                str(dat),
                                str(data[num]), "", 0
                            ])
        if "args" in self.opts:
            self.doQuit()
        else:
            self.opts["mf"].dbm.commitDbase()
            self.df.last[0] = [0, 0]
            self.df.selPage("Basic-A")
            self.df.focusField("T", 0, 1)

    def doPrint(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        TabPrt(self.opts["mf"],
               self.opts["conum"],
               self.opts["conam"],
               name=self.__class__.__name__,
               tabs="crsmst",
               where=[("crm_cono", "=", self.opts["conum"]),
                      ("crm_acno", "=", self.acno)])
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doImport(self):
        self.df.setWidget(self.df.B3, state="disabled")
        self.df.setWidget(self.df.mstFrame, state="hide")
        fi = FileImport(self.opts["mf"], imptab="crsmst", impskp=["crm_cono"])
        sp = ProgressBar(self.opts["mf"].body,
                         typ="Importing Creditor's Accounts",
                         mxs=len(fi.impdat))
        err = None
        for num, line in enumerate(fi.impdat):
            sp.displayProgress(num)
            if not line[0]:
                if not line[1]:
                    err = "Blank Account Number and Blank Name"
                    break
                for x in range(1, 100):
                    line[0] = genAccNum(line[1], x, 7)
                    chk = self.sql.getRec("crsmst",
                                          where=[("crm_cono", "=",
                                                  self.opts["conum"]),
                                                 ("crm_acno", "=", line[0])],
                                          limit=1)
                    if not chk:
                        break
            chk = self.sql.getRec("crsmst",
                                  where=[("crm_cono", "=", self.opts["conum"]),
                                         ("crm_acno", "=", line[0])],
                                  limit=1)
            if chk:
                err = "%s %s Already Exists" % (fi.impcol[0][0], line[0])
                break
            if not line[1]:
                err = "Blank Name"
                break
            if not line[14]:
                line[14] = self.sysdtw
            if not line[16]:
                line[16] = "M"
            if not line[17]:
                line[17] = 30
            if not line[18]:
                line[18] = 30
            if not line[22]:
                line[22] = "Y"
            if self.glint and line[26]:
                chk = self.sql.getRec("genmst",
                                      where=[("glm_cono", "=",
                                              self.opts["conum"]),
                                             ("glm_acno", "=", line[26])],
                                      limit=1)
                if not chk:
                    err = "Invalid General Ledger Account"
                    break
            line.insert(0, self.opts["conum"])
            self.sql.insRec("crsmst", data=line)
        sp.closeProgress()
        if err:
            err = "Line %s: %s" % ((num + 1), err)
            showError(
                self.opts["mf"].body, "Import Error", """%s

Please Correct your Import File and then Try Again.""" % err)
            self.opts["mf"].dbm.rollbackDbase()
        else:
            self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doCancel(self):
        self.opts["mf"].dbm.rollbackDbase()
        self.df.last[0] = [0, 0]
        self.df.selPage("Basic-A")
        self.df.focusField("T", 0, 1)

    def doExit(self):
        if self.df.pag == 0:
            self.doQuit()
        elif self.df.pag == 1:
            self.df.focusField("T", 0, 1)
        else:
            self.df.selPage("Basic-A")

    def doQuit(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #2
0
class dr6020(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            if "args" in opts:
                self.curdt = opts["args"][0]
                for self.chain, self.acno in opts["args"][1]:
                    self.doReAgeAuto()
                self.opts["mf"].dbm.commitDbase()
            else:
                self.dataHeader()
                self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm,
                       ["drsmst", "drschn", "drstrn", "drsage"],
                       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"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.curdt = int(self.sysdtw / 100)
        if "args" not in self.opts:
            self.agevar = tk.BooleanVar()
            self.agevar.set(False)
        return True

    def dataHeader(self):
        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", )}
        if self.chains == "Y":
            drm["cols"] = (("drm_chain", "", 0, "Chn"), ("drm_acno", "", 0,
                                                         "Acc-Num"),
                           ("drm_name", "", 0, "Name",
                            "Y"), ("drm_add1", "", 0, "Address Line 1"))
            drm["where"] = [("drm_cono", "=", self.opts["conum"]),
                            ("drm_stat", "<>", "X")]
            drm["whera"] = [["T", "drm_chain", 0]]
        else:
            drm["cols"] = (("drm_acno", "", 0, "Acc-Num"), ("drm_name", "", 0,
                                                            "Name", "Y"),
                           ("drm_add1", "", 0, "Address Line 1"))
            drm["where"] = [("drm_cono", "=", self.opts["conum"]),
                            ("drm_chain", "=", 0), ("drm_stat", "<>", "X")]
        fld = [[["T", 0, 0, 0], "ID2", 7, "Period", "Current Financial Period",
                self.curdt, "Y", self.doCurdt, None, None, ("efld", )],
               [["T", 0, 1, 0], "INA", 7, "Acc-Num", "Account Number", "", "N",
                self.doAccno, drm, None, ("notblank", )],
               [["T", 0, 1, 0], "ONA", 30, "Name"]]
        if self.chains == "Y":
            fld.insert(1, [["T", 0, 0, 0], "IUI", 3, "Chain", "Chain Store",
                           "", "N", self.doChain, drc, None, ("efld", )])
        else:
            self.chain = 0
        tnd = ((self.endTop, "n"), )
        txt = (self.exitTop, )
        self.but = (("Normal", None, self.doReAgeNormal, 0, None, None,
                     "Only Show Unallocated Transactions"),
                    ("History", None, self.doReAgeHistory, 0, None, None,
                     "Show All Transactions, Including Already Allocated"),
                    ("Automatic", None, self.doReAgeAuto, 0, None, None,
                     "Automatically Re-Age the Account Based on Date"))
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               butt=self.but)

    def doCurdt(self, frt, pag, r, c, p, i, w):
        self.curdt = w

    def doChain(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drschn",
                                  cols=["chm_chain"],
                                  where=[("chm_cono", "=", self.opts["conum"]),
                                         ("chm_chain", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Chain Store"
        self.chain = w

    def doAccno(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("drsmst",
                              cols=["drm_name", "drm_stat"],
                              where=[("drm_cono", "=", self.opts["conum"]),
                                     ("drm_chain", "=", self.chain),
                                     ("drm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        if acc[1] == "X":
            return "Invalid Account, Redundant"
        self.acno = w
        self.key = None
        self.df.loadEntry("T", pag, p + 1, data=acc[0])
        self.opts["mf"].updateStatus("Select Routine")
        for b in range(3):
            wid = getattr(self.df, "B%s" % b)
            self.df.setWidget(wid, "normal")
        self.df.setWidget(self.df.B0, "focus")
        self.agevar.set(True)
        self.df.mstFrame.wait_variable(self.agevar)
        if self.key in ("normal", "history"):
            return "nd"
        elif self.key == "cancel":
            return "nc"

    def doReAgeNormal(self):
        self.key = "normal"
        self.doReAge()

    def doReAgeHistory(self):
        self.key = "history"
        self.doReAge()

    def doReAge(self):
        self.opts["mf"].updateStatus("")
        for b in range(3):
            wid = getattr(self.df, "B%s" % b)
            self.df.setWidget(wid, "disabled")
        col = [
            "drt_trdt", "drt_ref1", "drt_type", "drt_tramt", "paid", "balance"
        ]
        whr = [("drt_cono", "=", self.opts["conum"]),
               ("drt_chain", "=", self.chain), ("drt_acno", "=", self.acno)]
        if self.key == "normal":
            dtc, recs = getTrn(self.opts["mf"].dbm, "drs", whr=whr, zer="N")
        else:
            dtc, recs = getTrn(self.opts["mf"].dbm, "drs", whr=whr)
        if recs:
            data = []
            for rec in recs:
                dat = []
                for c in col:
                    dat.append(rec[dtc.index(c)])
                data.append(dat)
            age = AgeTrans(self.opts["mf"], "drs", data, 0, xits=False)
            if not age.ccl and age.data:
                if age.total.work:
                    while not age.ccl:
                        age.doAllocate()
                        if age.ccl or not age.total.work:
                            break
                if age.ccl:
                    self.key = "cancel"
                    age.data = []
                for tr in age.data:
                    if tr[6]:
                        w = copyList(whr)
                        w.extend([("drt_type", "=", tr[2]),
                                  ("drt_ref1", "=", tr[1])])
                        self.sql.insRec("drsage",
                                        data=[
                                            self.opts["conum"], self.chain,
                                            self.acno, tr[2], tr[1],
                                            self.curdt, tr[2], tr[1], tr[6], 0
                                        ])
            else:
                self.key = "cancel"
        self.agevar.set(False)

    def doReAgeAuto(self):
        self.key = "normal"
        if "args" not in self.opts:
            for b in range(3):
                wid = getattr(self.df, "B%s" % b)
                self.df.setWidget(wid, "disabled")
            self.opts["mf"].updateStatus("Re-Ageing .... Please Wait!")
            self.df.setWidget(self.df.mstFrame, state="hide")
            txt = "Re-Allocating ... Please Wait"
            pb = ProgressBar(self.opts["mf"].body, typ=("G", txt))
            doAutoAge(self.opts["mf"].dbm,
                      "drs",
                      self.opts["conum"],
                      chain=self.chain,
                      acno=self.acno,
                      pbar=pb)
            pb.closeProgress()
            self.df.setWidget(self.df.mstFrame, state="show")
            self.agevar.set(False)
        else:
            doAutoAge(self.opts["mf"].dbm,
                      "drs",
                      self.opts["conum"],
                      chain=self.chain,
                      acno=self.acno,
                      pbar=None)

    def endTop(self):
        self.df.clearEntry("T", 0, 2)
        self.df.clearEntry("T", 0, 3)
        if self.chains == "Y":
            self.df.clearEntry("T", 0, 4)
        self.df.focusField("T", 0, 2)

    def exitTop(self):
        self.opts["mf"].dbm.commitDbase(ask=True)
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #3
0
class si3010(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,
                       ["ctlrep", "drsmst", "slsiv1", "slsiv2"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        slsctl = gc.getCtl("slsctl", self.opts["conum"])
        if not slsctl:
            return
        self.fromad = slsctl["ctv_emadd"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sysdtd = "%i/%02i/%02i" % (t[0], t[1], t[2])
        self.sysdttm = "(Printed on: %i/%02i/%02i at %02i:%02i)" % \
            (t[0], t[1], t[2], t[3], t[4])
        self.slstot = [0, 0, 0, 0]
        self.tot2 = 0
        self.tot3 = 0
        self.tot4 = 0
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Sales Orders Outstanding (%s)" % self.__class__.__name__)
        si1 = {
            "stype":
            "R",
            "tables": ("slsiv1", ),
            "cols":
            (("si1_docno", "", 0, "Order-Num"), ("si1_chain", "", 0, "Chn"),
             ("si1_acno", "", 0, "Drs-Acc"), ("si1_date", "", 0,
                                              "Order-Date")),
            "where": [("si1_cono", "=", self.opts["conum"]),
                      ("si1_invno", "=", "")],
            "whera": [("T", "si1_rtn", 0)]
        }
        r1s = (("Sales", "O"), ("Works", "W"), ("Quotes", "Q"))
        r2s = (("List", "L"), ("Detail", "D"))
        r3s = (("Rep's Name", "R"), ("Delivery Address", "D"))
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "Order Type", "", "O", "Y",
                self.doOrdTyp, None, None, None),
               (("T", 0, 1, 0), ("IRB", r2s), 0, "Report Type", "", "L", "Y",
                self.doRepTyp, None, None,
                None), (("T", 0, 2, 0), ("IRB", r3s), 0, "Content", "", "R",
                        "Y", self.doContent, None, None,
                        None), (("T", 0, 3, 0), "IUI", 9, "From Order Number",
                                "", "", "Y", self.doOrd1, si1, None, None),
               (("T", 0, 4, 0), "IUI", 9, "To   Order Number", "", "", "Y",
                self.doOrd2, si1, None, None))
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=("Y", "V"),
                               mail=("Y", "N"))

    def doOrdTyp(self, frt, pag, r, c, p, i, w):
        self.otype = w

    def doRepTyp(self, frt, pag, r, c, p, i, w):
        self.rtype = w
        if self.rtype == "L":
            self.ord1 = 0
            self.ord2 = 999999999
            self.df.setWidget(self.df.topEntry[0][5][3][0], state="show")
            self.df.setWidget(self.df.topEntry[0][5][4][0], state="show")
        else:
            self.df.loadEntry(frt, pag, p + 1, data="")
            self.df.setWidget(self.df.topEntry[0][5][3][0], state="hide")
            self.df.setWidget(self.df.topEntry[0][5][4][0], state="hide")
            return "sk1"

    def doContent(self, frt, pag, r, c, p, i, w):
        self.content = w
        return "sk2"

    def doOrd1(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("slsiv1",
                                  where=[("si1_cono", "=", self.opts["conum"]),
                                         ("si1_rtn", "=", self.otype),
                                         ("si1_docno", "=", w),
                                         ("si1_invno", "=", "")],
                                  limit=1)
            if not acc:
                return "This is Not an Outstanding Order"
        self.ord1 = w

    def doOrd2(self, frt, pag, r, c, p, i, w):
        if w:
            if w < self.ord1:
                return "Invalid Last Order < First Order"
            acc = self.sql.getRec("slsiv1",
                                  where=[("si1_cono", "=", self.opts["conum"]),
                                         ("si1_rtn", "=", self.otype),
                                         ("si1_docno", "=", w),
                                         ("si1_invno", "=", "")],
                                  limit=1)
            if not acc:
                return "This is Not an Outstanding Order"
            self.ord2 = w
        else:
            self.ord2 = 999999999

    def doEnd(self):
        self.df.closeProcess()
        whr = (("si1_cono", "=", self.opts["conum"]), ("si1_rtn", "=",
                                                       self.otype),
               ("si1_docno", "between", self.ord1, self.ord2), ("si1_invno",
                                                                "=", ""))
        odr = "si1_docno"
        recs = self.sql.getRec("slsiv1", where=whr, order=odr)
        if not recs:
            showError(self.opts["mf"].body, "Selection Error",
                      "No Orders Selected")
        elif self.df.repprt[2] == "export":
            self.exportReport(recs)
        else:
            self.printReport(recs)
        self.closeProcess()

    def exportReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        expnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__, self.opts["conum"])
        self.expheads = [
            "%03u %-30s %s" %
            (self.opts["conum"], self.opts["conam"], self.sysdttm)
        ]
        self.expheads.append("Outstanding Sales Orders Report as at %s" % \
            self.sysdtd)
        self.expcolsh = [[
            "Order-Num", "Order-Date", "Chn", "Acc-Num", "Name", "Rep",
            "Rep-Name", "Job-Num", "Taxable", "Non-Taxable", "Total-Tax",
            "Total-Value"
        ]]
        if self.rtype == "L" and self.content == "D":
            self.expcolsh[0][6] = "Delivery-Address"
        self.expforms = [("Na", 9), ("D1", 10), ("UI", 3), ("NA", 7),
                         ("NA", 30), ("Na", 3), ("NA", 30), ("Na", 7),
                         ("SD", 13.2), ("SD", 13.2), ("SD", 13.2),
                         ("SD", 13.2)]
        self.expdatas = []
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                p.closeProgress()
                return
            if not self.getValues(dat):
                continue
            self.getOrdTot()
            self.expdatas.append([
                "BODY",
                [
                    self.odr.work, self.dte.work, self.chn.work, self.drs.work,
                    self.drsnam, self.rep.work, self.context, self.job.work,
                    self.total_taxable, self.total_nontaxable, self.total_tax,
                    self.total_value
                ]
            ])
        self.expdatas.append(["BLANK"])
        self.expdatas.append(["TOTAL", [""] * 8 + self.slstot])
        p.closeProgress()
        doWriteExport(xtype=self.df.repprt[1],
                      name=expnam,
                      heads=self.expheads,
                      colsh=self.expcolsh,
                      forms=self.expforms,
                      datas=self.expdatas,
                      rcdic=self.opts["mf"].rcdic)

    def printReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        if self.rtype == "L":
            self.head = "%03u %-157s" % (self.opts["conum"],
                                         self.opts["conam"])
        else:
            self.head = "%03u %-86s" % (self.opts["conum"], self.opts["conam"])
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.pglin = 999
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                break
            if not self.getValues(dat):
                continue
            if self.rtype == "D":
                self.printHeader()
            self.printBody()
        if self.rtype == "L":
            t1 = CCD(self.slstot[0], "SD", 13.2)
            t2 = CCD(self.slstot[1], "SD", 13.2)
            t3 = CCD(self.slstot[2], "SD", 13.2)
            t4 = CCD(self.slstot[3], "SD", 13.2)
            self.fpdf.drawText()
            self.fpdf.drawText("%106s %s %s %s %s" %
                               ("", t1.disp, t2.disp, t3.disp, t4.disp))
        p.closeProgress()
        if not p.quit:
            pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                                self.__class__.__name__,
                                self.opts["conum"],
                                ext="pdf")
            self.fpdf.output(pdfnam, "F")
            doPrinter(mf=self.opts["mf"],
                      conum=self.opts["conum"],
                      pdfnam=pdfnam,
                      header=self.tit,
                      repprt=self.df.repprt,
                      fromad=self.fromad,
                      repeml=self.df.repeml)

    def getValues(self, data):
        col = self.sql.slsiv1_col
        self.odr = CCD(data[col.index("si1_docno")], "Na", 9)
        self.si2 = self.sql.getRec("slsiv2",
                                   where=[("si2_cono", "=",
                                           self.opts["conum"]),
                                          ("si2_rtn", "=", self.otype),
                                          ("si2_docno", "=", self.odr.work)],
                                   order="si2_line")
        if not self.si2:
            return
        self.mod = CCD(data[col.index("si1_mode")], "UA", 1)
        self.chn = CCD(data[col.index("si1_chain")], "UI", 3)
        self.drs = CCD(data[col.index("si1_acno")], "NA", 7)
        acc = self.sql.getRec("drsmst",
                              cols=["drm_name"],
                              where=[("drm_cono", "=", self.opts["conum"]),
                                     ("drm_chain", "=", self.chn.work),
                                     ("drm_acno", "=", self.drs.work)],
                              limit=1)
        if not acc:
            self.drsnam = ""
        else:
            self.drsnam = acc[0]
        self.dte = CCD(data[col.index("si1_date")], "D1", 10)
        self.job = CCD(data[col.index("si1_jobno")], "Na", 7)
        self.rep = CCD(data[col.index("si1_rep")], "Na", 3)
        if self.rtype == "L" and self.content == "R":
            acc = self.sql.getRec("ctlrep",
                                  cols=["rep_name"],
                                  where=[("rep_cono", "=", self.opts["conum"]),
                                         ("rep_code", "=", self.rep.work)],
                                  limit=1)
            if not acc:
                self.context = ""
            else:
                self.context = acc[0]
        else:
            self.context = data[col.index("si1_add1")]
        return True

    def printHeader(self):
        self.pageHeading()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText()
        if self.rtype == "L":
            if self.content == "R":
                text = "Rep-Name"
            else:
                text = "Delivery-Address"
            self.fpdf.drawText("%-9s %-10s %-3s %-7s %-30s %-3s %-30s %-7s"\
                "%13s %13s %13s %13s" % ("Order-Num", "Order-Date", "Chn",
                "Acc-Num", "Name", "Rep", text, "Job-Num", "Taxable",
                "Non-Taxable", "Total-Tax", "Total-Value"))
            self.pglin += 3
        else:
            text = "Order Number: %-9s Date: %-10s Salesman: %-3s %-30s" % \
                (self.odr.disp, self.dte.disp, self.rep.disp, self.context)
            self.fpdf.drawText(text)
            self.fpdf.drawText()
            text = "Chain: %-3s  Acc-Num: %-7s  Name: %-30s" % (
                self.chn.disp, self.drs.disp, self.drsnam)
            self.fpdf.drawText(text)
            self.fpdf.drawText()
            self.fpdf.drawText("%-3s %-20s %-30s %-1s %10s  %-1s %11s %-6s" % \
                ("Grp", "Product-Code", "Description", "L", "Qty-Ord", "V",
                "U-Price", "Disc-%"))
            self.pglin += 7
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        if self.otype == "O":
            txt = "Sales"
        elif self.otype == "W":
            txt = "Works"
        else:
            txt = "Quote"
        self.fpdf.drawText("%-37s %-10s" % \
            ("Outstanding %s Documents Report as at" % txt, self.sysdtd))
        self.fpdf.setFont()
        self.pglin = 3

    def printBody(self):
        if self.rtype == "L":
            if self.pglin > self.fpdf.lpp:
                self.printHeader()
            self.getOrdTot()
            v1 = CCD(self.total_taxable, "SD", 13.2)
            v2 = CCD(self.total_nontaxable, "SD", 13.2)
            v3 = CCD(self.total_tax, "SD", 13.2)
            v4 = CCD(self.total_value, "SD", 13.2)
            text = "%s %s %s %s %-30s %s %-30s %s %s %s %s %s" % \
                (self.odr.disp, self.dte.disp, self.chn.disp, self.drs.disp,
                self.drsnam, self.rep.disp, self.context, self.job.disp,
                v1.disp, v2.disp, v3.disp, v4.disp)
            self.fpdf.drawText(text)
            self.pglin += 1
        else:
            col = self.sql.slsiv2_col
            for dat in self.si2:
                grp = CCD(dat[col.index("si2_group")], "UA", 3)
                cod = CCD(dat[col.index("si2_code")], "NA", 20)
                des = CCD(dat[col.index("si2_desc")], "NA", 30)
                loc = CCD(dat[col.index("si2_loc")], "UA", 1)
                qty = CCD(dat[col.index("si2_qty")], "SD", 11.2)
                vat = CCD(dat[col.index("si2_vat_code")], "UA", 1)
                prc = CCD(dat[col.index("si2_price")], "UD", 11.2)
                dis = CCD(dat[col.index("si2_disc_per")], "UD", 6.2)
                if self.pglin > self.fpdf.lpp:
                    self.printHeader()
                self.fpdf.drawText("%s %s %s %s %s %s %s %s" %
                                   (grp.disp, cod.disp, des.disp, loc.disp,
                                    qty.disp, vat.disp, prc.disp, dis.disp))
                self.pglin += 1

    def getOrdTot(self):
        self.total_taxable = 0
        self.total_nontaxable = 0
        self.total_tax = 0
        self.total_value = 0
        col = self.sql.slsiv2_col
        for dat in self.si2:
            dis = CCD(dat[col.index("si2_disc_per")], "UD", 6.2)
            qty = CCD(dat[col.index("si2_qty")], "SD", 13.2)
            pri = CCD(dat[col.index("si2_price")], "UD", 12.2)
            vat = CCD(dat[col.index("si2_vat_rate")], "UD", 6.2)
            excpri = round((pri.work * 1), 2)
            incrat = float(ASD(100.0) + ASD(vat.work))
            incpri = round((pri.work * incrat / 100.0), 4)
            net = float(ASD(100.0) - ASD(dis.work))
            excamt = round((qty.work * excpri * net / 100.0), 2)
            incamt = round((qty.work * incpri * net / 100.0), 2)
            vatamt = float(ASD(incamt) - ASD(excamt))
            if excamt == incamt:
                self.total_nontaxable = float(ASD(self.total_nontaxable) + \
                    ASD(excamt))
            else:
                self.total_taxable = float(ASD(self.total_taxable) + \
                    ASD(excamt))
            self.total_tax = float(ASD(self.total_tax) + ASD(vatamt))
            self.total_value = float(ASD(self.total_value) + ASD(incamt))
        self.slstot[0] = float(ASD(self.slstot[0]) + ASD(self.total_taxable))
        self.slstot[1] = float(
            ASD(self.slstot[1]) + ASD(self.total_nontaxable))
        self.slstot[2] = float(ASD(self.slstot[2]) + ASD(self.total_tax))
        self.slstot[3] = float(ASD(self.slstot[3]) + ASD(self.total_value))

    def doExit(self):
        self.df.closeProcess()
        self.closeProcess()

    def closeProcess(self):
        self.opts["mf"].closeLoop()
Пример #4
0
class cr4010(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):
        self.sql = Sql(self.opts["mf"].dbm, ["crsmst", "crstrn", "strpom"],
            prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        crsctl = gc.getCtl("crsctl", self.opts["conum"])
        if not crsctl:
            return
        self.fromad = crsctl["ctc_emadd"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.curdt = int(self.sysdtw / 100)
        self.paidup = "N"
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
            "Creditors Interrogation (%s)" % self.__class__.__name__)
        crm = {
            "stype": "R",
            "tables": ("crsmst",),
            "cols": (
                ("crm_acno", "", 0, "Acc-Num"),
                ("crm_name", "", 0, "Name", "Y")),
            "where": [("crm_cono", "=", self.opts["conum"])]}
        tag = (
            ("Basic-_A", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("Basic-_B", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("Balances", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("History", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("Trans", self.doTrans1, ("T",0,2), ("T",0,1)),
            ("Orders", self.doOrders, ("T",0,2), ("T",0,1)))
        r1s = (("No","N"),("Yes","Y"))
        fld = (
            (("T",0,0,0),"INA",7,"Acc-Num","Account Number",
                "","N",self.doAccNum,crm,None,None),
            (("T",0,0,0),"ONA",30,"Name"),
            (("T",1,0,0),"ONA",30,"Address Line 1"),
            (("T",1,1,0),"ONA",30,"Address Line 2"),
            (("T",1,2,0),"ONA",30,"Address Line 3"),
            (("T",1,3,0),"ONA",4,"Postal Code"),
            (("T",1,4,0),"ONA",20,"Telephone"),
            (("T",1,5,0),"ONA",20,"Fax"),
            (("T",1,6,0),"ONA",30,"Manager"),
            (("T",1,6,0),"OTX",30,"E-Mail"),
            (("T",1,7,0),"ONA",30,"Accounts"),
            (("T",1,7,0),"OTX",30,"E-Mail"),
            (("T",1,8,0),"ONA",30,"Orders"),
            (("T",1,8,0),"OTX",30,"E-Mail"),
            (("T",1,9,0),"Od1",10,"Date Opened"),
            (("T",1,10,0),"ONA",10,"V.A.T. Number"),
            (("T",2,0,0),"OUA",1,"Terms Base"),
            (("T",2,1,0),"OUI",2,"Statement Day"),
            (("T",2,2,0),"OUI",3,"Terms"),
            (("T",2,3,0),"OUI",5,"Credit Limit"),
            (("T",2,4,0),"OUD",5.2,"Trade Discount"),
            (("T",2,5,0),"OUD",5.2,"Settlement Discount"),
            (("T",2,6,0),"OUA",1,"Payment Indicator"),
            (("T",2,7,0),"OUA",20,"Bank Name"),
            (("T",2,8,0),"OUI",8,"Bank Branch"),
            (("T",2,9,0),"OUA",16,"Bank Account"),
            (("T",2,10,0),"OUI",7,"G/L Account"),
            (("T",2,11,0),"OUA",1,"Status"),
            (("T",3,0,0),"Od1",10,"Date Last Purchased"),
            (("T",3,1,0),"Od1",10,"Date Last Paid"),
            (("T",3,2,0),"OSD",13.2,"Total Balance"),
            (("T",3,3,0),"OSD",13.2,"Current"),
            (("T",3,4,0),"OSD",13.2,"30 Days"),
            (("T",3,5,0),"OSD",13.2,"60 Days"),
            (("T",3,6,0),"OSD",13.2,"90 Days"),
            (("T",3,7,0),"OSD",13.2,"120 Days"),
            (("C",4,0,0),"OSD",13.2,"Purchases","","","N",
                None,None,None,None,("Months",13)),
            (("C",4,0,1),"OSD",13.2,"Payments"),
            (("T",5,0,0),("IRB",r1s),0,"History", "",
                "N","N",self.doTrans2,None,None,None))
        but = (
            ("Clear",None,self.doClear,0,("T",0,0),("T",0,1)),
            ("Notes",None,self.doNotes,0,("T",0,0),("T",0,1)),
            ("Print",None,self.doPrint,0,("T",0,0),("T",0,1)),
            ("Quit",None,self.doExit,1,None,None))
        tnd = ((self.doEndTop, "N"), None, None, None, None, None)
        txt = (self.doExit, None, None, None, None, self.doExit)
        self.df = TartanDialog(self.opts["mf"], title=self.tit, tags=tag,
            eflds=fld, butt=but, tend=tnd, txit=txt)
        yer = int(self.sysdtw / 10000)
        mon = int((self.sysdtw % 10000) / 100)
        self.hist_tit = []
        for x in range(1, 14):
            if x == 13:
                txt = "Last 12 Month Total"
                self.df.colLabel[4][x-1].configure(text=txt)
                self.hist_tit.append(txt)
            else:
                nam = mthnam[mon][1]
                nam = nam + (" " * (15-len(nam))) + str(yer)
                self.df.colLabel[4][x-1].configure(text=nam)
                self.hist_tit.append(nam)
            if x != 13:
                mon = mon - 1
                if mon == 0:
                    mon = mon + 12
                    yer = yer - 1

    def doAccNum(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("crsmst", where=[("crm_cono", "=",
            self.opts["conum"]), ("crm_acno", "=", w)], limit=1)
        if not acc:
            return "Invalid Account Number"
        self.acno = w
        self.name = acc[self.sql.crsmst_col.index("crm_name")]
        self.df.loadEntry("T",0, 1, data=self.name)
        seq = 3
        for x in range(0, self.df.topq[1]):
            self.df.loadEntry("T", 1, x, data=acc[seq])
            seq += 1
        for x in range(0, self.df.topq[2]):
            self.df.loadEntry("T", 2, x, data=acc[seq])
            seq += 1
        self.loadBalances()
        self.opts["mf"].updateStatus("")

    def doEndTop(self):
        self.df.last[0] = [0, 0]
        self.df.setWidget(self.df.topEntry[0][0], state="disabled")

    def loadBalances(self):
        bals = Balances(self.opts["mf"], "CRS", self.opts["conum"],
            int(self.sysdtw / 100), (self.acno,))
        obal, tbal, ages = bals.doAllBals()
        this, hist = bals.doCrsDrsHist()
        self.purch = hist[0]
        self.pays = hist[1]
        last = self.sql.getRec("crstrn", cols=["max(crt_trdt)"],
            where=[("crt_cono", "=", self.opts["conum"]), ("crt_acno", "=",
            self.acno), ("crt_type", "=", 1)], limit=1)
        if not last or not last[0]:
            lastpurd = 0
        else:
            lastpurd = last[0]
        last = self.sql.getRec("crstrn", cols=["max(crt_trdt)"],
            where=[("crt_cono", "=", self.opts["conum"]), ("crt_acno", "=",
            self.acno), ("crt_type", "=", 5)], limit=1)
        if not last or not last[0]:
            lastpayd = 0
        else:
            lastpayd = last[0]
        for x in range(0, 8):
            if x == 0:
                data = lastpurd
            elif x == 1:
                data = lastpayd
            elif x == 2:
                data = tbal
            else:
                data = ages[x-3]
            self.df.loadEntry("T", 3, x, data=data)
        p = 0
        for x in range(0, 13):
            i = 0
            self.df.loadEntry("C", 4, p, data=self.purch[x])
            p = p + 1
            i = i + 1
            pay = float(ASD(0) - ASD(self.pays[x]))
            self.df.loadEntry("C", 4, p, data=pay)
            p = p + 1
            i = i + 1

    def doTagSelect(self):
        self.opts["mf"].updateStatus("")

    def doTrans1(self):
        self.df.focusField("T", 5, 1)

    def doTrans2(self, frt, pag, r, c, p, i, w):
        self.paidup = w
        whr = [
            ("crt_cono", "=", self.opts["conum"]),
            ("crt_acno", "=", self.acno)]
        if self.paidup == "Y":
            col, recs = getTrn(self.opts["mf"].dbm, "crs", whr=whr)
        else:
            col, recs = getTrn(self.opts["mf"].dbm, "crs", dte=self.curdt,
                whr=whr)
        if recs:
            data = []
            for dat in recs:
                data.append([
                    dat[col.index("crt_trdt")],
                    dat[col.index("crt_curdt")],
                    dat[col.index("crt_batch")],
                    dat[col.index("crt_type")],
                    dat[col.index("crt_ref1")],
                    dat[col.index("crt_tramt")],
                    dat[col.index("paid")],
                    dat[col.index("balance")],
                    dat[col.index("crt_desc")]])
            tit = "Transactions for Account: %s - %s" % (self.acno, self.name)
            col = (
                ("crt_trdt", "Date", 10, "D1", "N"),
                ("crt_curdt", "Curr-Dt", 7, "D2", "N"),
                ("crt_batch", "Batch", 7, "Na", "N"),
                ("crt_type", "Typ", 3, ("XX", crtrtp), "N"),
                ("crt_ref1", "Reference", 9, "Na", "Y"),
                ("crt_tramt", "Amount", 13.2, "SD", "N"),
                ("alloc", "Allocated", 13.2, "SD", "N"),
                ("balan", "Balance", 13.2, "SD", "N"),
                ("crt_desc", "Details", 30, "NA", "N"))
            state = self.df.disableButtonsTags()
            while True:
                rec = SelectChoice(self.df.nb.Page4, tit, col, data)
                # Display all transaction details
                if rec.selection:
                    self.df.setWidget(self.df.mstFrame, state="hide")
                    whr = [
                        ("crt_cono", "=", self.opts["conum"]),
                        ("crt_acno", "=", self.acno),
                        ("crt_type", "=", rec.selection[4]),
                        ("crt_ref1", "=", rec.selection[5])]
                    TabPrt(self.opts["mf"], tabs="crstrn", where=whr,
                        pdia=False)
                    self.df.setWidget(self.df.mstFrame, state="show")
                else:
                    break
            self.df.enableButtonsTags(state=state)
        self.doTrans1()

    def doOrders(self):
        col = self.sql.strpom_col
        whr = [
            ("pom_cono", "=", self.opts["conum"]),
            ("pom_acno", "=", self.acno),
            ("pom_delno", "<>", "cancel"),
            ("pom_deldt", "=", 0)]
        recs = self.sql.getRec("strpom", where=whr, order="pom_date")
        if recs:
            data = []
            for dat in recs:
                data.append([
                    dat[col.index("pom_date")],
                    dat[col.index("pom_ordno")],
                    dat[col.index("pom_cusord")],
                    dat[col.index("pom_jobnum")],
                    dat[col.index("pom_contact")]])
            tit = "Orders for Account: %s - %s" % (self.acno, self.name)
            col = (
                ("pom_date", "   Date", 10, "D1", "N"),
                ("pom_ordno", "Doc-Numbr", 9, "UI", "N"),
                ("pom_cusord", "Cust-Ord-Num", 15, "Na"),
                ("pom_jobnum", "Job-Num", 7, "Na"),
                ("pom_contact", "Contact", 30, "NA"))
            state = self.df.disableButtonsTags()
            while True:
                rec = SelectChoice(self.df.nb.Page6, tit, col, data)
                # Attempt to display the document
                if rec.selection:
                    self.df.setWidget(self.df.mstFrame, state="hide")
                    try:
                        doc = int(rec.selection[2])
                        PrintOrder(self.opts["mf"], self.opts["conum"],
                            self.opts["conam"], doc, repprt=["N", "V",
                            "view"], copy="y")
                    except:
                        pass
                    self.df.setWidget(self.df.mstFrame, state="show")
                else:
                    break
            self.df.enableButtonsTags(state=state)

    def doNotes(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        NotesCreate(self.opts["mf"], self.opts["conum"], self.opts["conam"],
            self.opts["capnm"], "CRS", self.acno)
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doClear(self):
        self.df.selPage("Basic-A")
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        mess = "Select the Required Print Option."
        butt = (
            ("Information", "I"),
            ("Transactions", "T"),
            ("Both", "B"),
            ("None", "N"))
        self.doPrintOption(askChoice(self.opts["mf"].body, "Print Options",
            mess, butt=butt))
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doPrintOption(self, opt):
        if opt == "N":
            return
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        if opt in ("I", "B"):
            table = "crsmst"
            whr = [
                ("crm_cono", "=", self.opts["conum"]),
                ("crm_acno", "=", self.acno)]
            rp = TabPrt(self.opts["mf"], self.opts["conum"], self.opts["conam"],
                name=self.__class__.__name__, tabs=table, where=whr,
                keys=[self.acno])
            repprt = rp.repprt
            repeml = rp.repeml
            xits = rp.xits
        else:
            repprt = None
            repeml = None
            xits = False
        if opt in ("T", "B") and not xits:
            heads = ["Creditor's Transactions",
                "Account: %s  Name: %s" % (self.acno, self.name)]
            whr = [
                ("crt_cono", "=", self.opts["conum"]),
                ("crt_acno", "=", self.acno)]
            if self.paidup == "Y":
                col, recs = getTrn(self.opts["mf"].dbm, "crs", whr=whr)
            else:
                col, recs = getTrn(self.opts["mf"].dbm, "crs",
                    dte=self.curdt, whr=whr)
            cols = []
            data = []
            dic = self.sql.crstrn_dic
            for num, rec in enumerate(recs):
                dat = []
                for nam in ["crt_ref1", "crt_trdt", "crt_type",
                        "crt_tramt", "paid", "balance", "crt_desc"]:
                    if not num:
                        if nam == "paid":
                            cols.append(["paid", "SD", 13.2, "Paid"])
                        elif nam == "balance":
                            cols.append(["balance", "SD", 13.2, "Balance"])
                        else:
                            cols.append([nam, dic[nam][2], dic[nam][3],
                                dic[nam][5]])
                    dat.append(rec[col.index(nam)])
                data.append(dat)
            if repprt:
                prtdia = False
            else:
                prtdia = (("Y","V"),("Y","N"))
            rp = RepPrt(self.opts["mf"], conum=self.opts["conum"],
                conam=self.opts["conam"], name=self.__class__.__name__,
                ttype="D", tables=data, heads=heads, cols=cols,
                trtp=["crt_type", crtrtp], prtdia=prtdia, repprt=repprt,
                repeml=repeml, fromad=self.fromad)
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doExit(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #5
0
class gl4010(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,
                       ["genmst", "genbal", "genbud", "gentrn"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        t = time.localtime()
        self.sysdtd = "%i/%02i/%02i" % (t[0], t[1], t[2])
        self.i_per = int(self.opts["period"][1][0] / 100)
        self.e_per = int(self.opts["period"][2][0] / 100)
        df = self.e_per - self.i_per - 87
        if df > 12:
            self.d_per = df - 12
            yr = int(self.i_per / 100)
            mt = int(self.i_per % 100)
            for _ in range(self.d_per):
                mt += 1
                if mt > 12:
                    mt -= 12
                    yr += 1
            self.s_per = (yr * 100) + mt
        else:
            self.d_per = 0
            self.s_per = self.i_per
        self.d_pyr = 0
        if self.opts["period"][0]:
            s, e, f = getPeriods(self.opts["mf"], self.opts["conum"],
                                 (self.opts["period"][0] - 1))
            if (s, e, f) == (None, None, None):
                return
            self.s_lyr = s.work
            self.i_pyr = int(s.work / 100)
            self.e_pyr = int(e.work / 100)
            df = self.e_pyr - self.i_pyr - 87
            if df > 12:
                self.d_pyr = df - 12
                yr = int(self.i_pyr / 100)
                mt = self.i_pyr % 100
                for _ in range(self.d_pyr):
                    mt += 1
                    if mt > 12:
                        mt -= 12
                        yr += 1
                self.s_pyr = (yr * 100) + mt
            else:
                self.s_pyr = self.i_pyr
        self.trnper = 0
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "General Ledger Interrogation (%s)" %
                    self.__class__.__name__)
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])],
            "order":
            "glm_acno"
        }
        fld = ((("T", 0, 0, 0, 7), "IUI", 7, "Acc-Num", "Account Number", "",
                "N", self.doAccNum, glm, None, None), (("T", 0, 0, 0), "ONA",
                                                       30, "Description"),
               (("T", 0, 0, 0), "OUA", 1, "Type"), (("T", 0, 0, 0), "OUA", 1,
                                                    "Indicator"),
               (("C", 1, 0, 0), "OSD", 13.2, "Actual", "", "", "N", None, None,
                None, None, ("Months", 14)), (("C", 1, 0, 1), "OSD", 13.2,
                                              "Budget"),
               (("C", 1, 0, 2), "OSD", 13.2,
                "Variance"), (("C", 1, 0, 3), "OSD", 13.2, "Last-Year"),
               (("T", 2, 0, 0), "Id2", 7, "Period (YYYYMM)",
                "Financial Period (0=All)", self.trnper, "Y", self.doPeriod,
                None, None, None))
        tag = (("Balances", self.doBals, ("T", 0, 2), ("T", 0, 1)),
               ("Transactions", self.doTrans1, ("T", 0, 2), ("T", 0, 1)))
        but = (("Clear", None, self.doClear, 0, ("T", 0, 0), ("T", 0, 1)),
               ("Notes", None, self.doNotes, 0, ("T", 0, 0), ("T", 0, 1)),
               ("Print", None, self.doPrint, 1, ("T", 0, 0),
                ("T", 0, 1)), ("Quit", None, self.doExit, 1, None, None))
        tnd = ((self.doTopEnd, "N"), None, (self.doTrans2, "N"))
        txt = (self.doExit, None, self.doExit)
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               tags=tag,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)
        mon = self.s_per % 100
        yer = int(self.s_per / 100)
        for x in range(14):
            if x == 0:
                txt = "Opening Balance"
                self.df.colLabel[1][x].configure(text=txt)
            elif x == 13:
                txt = "Closing Balance"
                self.df.colLabel[1][x].configure(text=txt)
            else:
                nam = mthnam[mon][1]
                nam = nam + (" " * (11 - len(nam))) + str(yer)
                self.df.colLabel[1][x].configure(text=nam)
            if x not in (0, 13):
                mon = mon + 1
                if mon > 12:
                    mon = mon - 12
                    yer = yer + 1
        txt = "Closing Balance"
        self.df.colLabel[1][13].configure(text=txt)

    def doAccNum(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("genmst",
                              cols=["glm_desc", "glm_type", "glm_ind"],
                              where=[("glm_cono", "=", self.opts["conum"]),
                                     ("glm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account"
        self.acno = w
        self.desc = acc[0]
        for x in range(1, self.df.topq[pag]):
            self.df.loadEntry(frt, pag, p + x, data=acc[x - 1])
        if self.opts["period"][0]:
            gp = self.sql.getRec("genbal",
                                 cols=["glo_cyr"],
                                 where=[("glo_cono", "=", self.opts["conum"]),
                                        ("glo_acno", "=", self.acno),
                                        ("glo_trdt", "=", self.s_lyr)])
        gc = self.sql.getRec("genbal",
                             cols=["glo_cyr"],
                             where=[("glo_cono", "=", self.opts["conum"]),
                                    ("glo_acno", "=", self.acno),
                                    ("glo_trdt", "=",
                                     self.opts["period"][1][0])])
        gt = self.sql.getRec("gentrn",
                             cols=["glt_type", "glt_curdt", "glt_tramt"],
                             where=[("glt_cono", "=", self.opts["conum"]),
                                    ("glt_acno", "=", self.acno),
                                    ("glt_curdt", "between", self.i_per,
                                     self.e_per)])
        gb = self.sql.getRec("genbud",
                             cols=["glb_curdt", "glb_tramt"],
                             where=[("glb_cono", "=", self.opts["conum"]),
                                    ("glb_acno", "=", self.acno),
                                    ("glb_curdt", "between", self.i_per,
                                     self.e_per)])
        if self.opts["period"][0]:
            gl = self.sql.getRec("gentrn",
                                 cols=["glt_curdt", "glt_tramt"],
                                 where=[("glt_cono", "=", self.opts["conum"]),
                                        ("glt_acno", "=", self.acno),
                                        ("glt_curdt", "between", self.i_pyr,
                                         self.e_pyr)])
        act = [0] * 14
        bud = [0] * 14
        lyr = [0] * 14
        adc = []
        adl = []
        if self.d_per:
            # Current period more than 12 months
            sy = sy = int(self.i_per / 100)
            sm = self.i_per % 100
            for _ in range(self.d_per):
                adc.append(sm)
                sm += 1
                if sm > 12:
                    sy += 1
                    sm = 1
        elif self.d_pyr:
            # Previous period more than 12 months
            sy = sy = int(self.i_pyr / 100)
            sm = self.i_pyr % 100
            for _ in range(self.d_pyr):
                adl.append(sm)
                sm += 1
                if sm > 12:
                    sy += 1
                    sm = 1
        if gc:
            self.obal = gc[0][0]
            act[0] = float(ASD(act[0]) + ASD(self.obal))
            act[13] = float(ASD(act[13]) + ASD(self.obal))
            if self.opts["period"][0] and gp:
                lyr[0] = float(ASD(lyr[0]) + ASD(float(gp[0][0])))
                lyr[13] = float(ASD(lyr[13]) + ASD(float(gp[0][0])))
        else:
            self.obal = 0
        yre = self.e_per % 100
        if gt:
            for x, t in enumerate(gt):
                cyr = int(t[1] / 100)
                mon = t[1] % 100
                if adc and cyr == sy and mon in adc:
                    col = 1
                else:
                    col = mon - yre
                    if col <= 0:
                        col = col + 12
                act[col] = float(ASD(act[col]) + ASD(float(t[2])))
                act[13] = float(ASD(act[13]) + ASD(float(t[2])))
        if gb:
            for x, t in enumerate(gb):
                mon = int(str(t[0])[4:6])
                col = mon - yre
                if col <= 0:
                    col = col + 12
                bud[col] = float(ASD(bud[col]) + ASD(float(t[1])))
                bud[13] = float(ASD(bud[13]) + ASD(float(t[1])))
        if self.opts["period"][0] and gl:
            for x, t in enumerate(gl):
                cyr = int(t[0] / 100)
                mon = t[0] % 100
                if adl and cyr == sy and mon in adl:
                    col = 1
                else:
                    col = mon - yre
                    if col <= 0:
                        col = col + 12
                lyr[col] = float(ASD(lyr[col]) + ASD(float(t[1])))
                lyr[13] = float(ASD(lyr[13]) + ASD(float(t[1])))
        p = 0
        for x in range(14):
            i = 0
            self.df.loadEntry("C", 1, p, data=act[x])
            p = p + 1
            i = i + 1
            self.df.loadEntry("C", 1, p, data=bud[x])
            p = p + 1
            i = i + 1
            data = float(ASD(bud[x]) - ASD(act[x]))
            self.df.loadEntry("C", 1, p, data=data)
            p = p + 1
            i = i + 1
            self.df.loadEntry("C", 1, p, data=lyr[x])
            p = p + 1
        self.df.last[0] = [0, 0]
        self.opts["mf"].updateStatus("")

    def doBals(self):
        self.opts["mf"].updateStatus("")

    def doTrans1(self):
        self.df.focusField("T", 2, 1)

    def doTrans2(self):
        tit = "Transactions for Account: %s - %s" % (self.acno, self.desc)
        gtt = ["gentrn"]
        gtc = (("glt_trdt", "", 0,
                "   Date"), ("glt_refno", "", 0, "Reference",
                             "Y"), ("glt_type", ("XX", gltrtp), 3, "Typ"),
               ("glt_batch", "", 0, "Batch"), ("glt_tramt", "", 0,
                                               "       Debit"),
               ("glt_tramt", "", 0, "      Credit"), ("balance", "SD", 13.2,
                                                      "     Balance"),
               ("glt_desc", "", 0, "Remarks"), ("glt_seq", "", 0, "Sequence"))
        mthno, acctot = self.getObal()
        if mthno.work == 0:
            d = self.opts["period"][1][0]
        else:
            d = (self.trnper * 100) + 1
        if acctot:
            if acctot < 0:
                dr = 0
                cr = acctot
            else:
                dr = acctot
                cr = 0
            data = [[d, "B/Fwd", 4, "", dr, cr, acctot, "Opening Balance", 0]]
        else:
            data = []
        trn = self.getTrans()
        if trn:
            col = self.sql.gentrn_col
            for rec in trn:
                acctot = float(ASD(acctot) + ASD(rec[col.index("glt_tramt")]))
                if rec[col.index("glt_tramt")] < 0:
                    dr = 0
                    cr = rec[col.index("glt_tramt")]
                else:
                    dr = rec[col.index("glt_tramt")]
                    cr = 0
                data.append([
                    rec[col.index("glt_trdt")], rec[col.index("glt_refno")],
                    rec[col.index("glt_type")], rec[col.index("glt_batch")],
                    dr, cr, acctot, rec[col.index("glt_desc")],
                    rec[col.index("glt_seq")]
                ])
        state = self.df.disableButtonsTags()
        while True:
            rec = SRec(self.opts["mf"],
                       screen=self.df.nb.Page2,
                       title=tit,
                       tables=gtt,
                       cols=gtc,
                       where=data,
                       wtype="D",
                       sort=False)
            # Display all transaction details
            if rec.selection:
                self.df.setWidget(self.df.mstFrame, state="hide")
                whr = [("glt_seq", "=", rec.selection[8])]
                TabPrt(self.opts["mf"], tabs="gentrn", where=whr, pdia=False)
                self.df.setWidget(self.df.mstFrame, state="show")
            else:
                break
        self.df.enableButtonsTags(state=state)
        self.doTrans1()

    def doNotes(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        NotesCreate(self.opts["mf"], self.opts["conum"], self.opts["conam"],
                    self.opts["capnm"], "GEN", self.acno)
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doTopEnd(self):
        self.df.last[0] = [0, 0]
        self.df.setWidget(self.df.topEntry[0][0], state="disabled")

    def doClear(self):
        self.df.selPage("Balances")
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        self.df.setWidget(self.df.mstFrame, state="hide")
        tit = ("Printer/Email Selection", )
        r1s = (("Info", "I"), ("Trans", "T"))
        fld = ((("T", 0, 1, 0), ("IRB", r1s), 0, "Selection", "", "I", "N",
                self.doPrtSel, None, None, None),
               (("T", 0, 2,
                 0), "Id2", 7, "Period (YYYYMM)", "Financial Period (0=All)",
                self.trnper, "Y", self.doPeriod, None, None, None))
        self.pr = TartanDialog(self.opts["mf"],
                               tops=True,
                               title=tit,
                               eflds=fld,
                               tend=((self.doPrtEnd, "y"), ),
                               txit=(self.doPrtExit, ),
                               view=("Y", "V"),
                               mail=("Y", "N"))
        self.pr.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField("T", 2, 1)

    def doPrtSel(self, frt, pag, r, c, p, i, w):
        self.sel = w
        for x in (2, 3):
            if bool(self.sel == "I"):
                self.pr.setWidget(self.pr.topEntry[0][2][x][0], state="hide")
            else:
                self.pr.setWidget(self.pr.topEntry[0][2][x][0], state="show")
        if self.sel == "I":
            return "sk1"

    def doPrtEnd(self):
        self.pr.closeProcess()
        self.head = "%03u %-99s" % (self.opts["conum"], self.opts["conam"])
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.pgnum = 0
        self.pglin = 999
        self.num = self.df.t_disp[0][0][0]
        self.dsc = self.df.t_disp[0][0][1]
        atype = self.df.t_disp[0][0][2]
        ind = self.df.t_disp[0][0][3]
        if self.pr.t_work[0][0][0] == "I":
            self.pageHeading()
            self.fpdf.drawText("%-8s %-12s %-6s %-35s %-6s %-7s %-11s %s" % \
                ("Acc No:", self.num, "Desc:", self.dsc, "Type:", atype,
                "Indicator:", ind))
            self.fpdf.drawText()
            self.fpdf.drawText("%-21s %-20s %-18s %-19s %-18s" % \
                ("", "Actual", "Budget", "Variance", "Last Year"))
            self.fpdf.drawText()
            m = self.s_per % 100
            for x in range(14):
                if x == 0:
                    mon = "Opening"
                elif x == 13:
                    mon = "Closing"
                else:
                    mon = mthnam[m][1]
                    m = m + 1
                    if m > 12:
                        m = m - 12
                act = self.df.c_disp[1][x][0]
                bud = self.df.c_disp[1][x][1]
                var = self.df.c_disp[1][x][2]
                lyr = self.df.c_disp[1][x][3]
                self.fpdf.drawText("%-15s %-20s %-20s %-20s %-20s" %
                                   (mon, act, bud, var, lyr))
                if x in (0, 12):
                    self.fpdf.drawText()
            pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                                self.__class__.__name__,
                                self.opts["conum"],
                                ext="pdf")
            self.fpdf.output(pdfnam, "F")
            doPrinter(mf=self.opts["mf"],
                      conum=self.opts["conum"],
                      pdfnam=pdfnam,
                      header=self.tit,
                      repprt=self.pr.repprt,
                      repeml=self.pr.repeml)
        else:
            trn = self.getTrans()
            if trn:
                heads = ["General Ledger Interrogation as at %s" % self.sysdtd]
                mthno, acctot = self.getObal()
                if mthno.work == 0:
                    x = "(For all months)"
                    d = self.opts["period"][1][0]
                else:
                    x = "(For month " + mthno.disp + ")"
                    d = (self.trnper * 100) + 1
                heads.append("Account %s %s %s" % (self.num, self.dsc, x))
                cols = [["glt_trdt", "D1", 10, "   Date"],
                        ["glt_refno", "Na", 9, "Reference"],
                        ["glt_type", "NA", 3, "Typ"],
                        ["glt_batch", "Na", 7, "BatchNo"],
                        ["debit", "SD", 13.2, "       Debit "],
                        ["credit", "SD", 13.2, "      Credit "],
                        ["balance", "SD", 13.2, "     Balance "],
                        ["glt_desc", "NA", 30, "Remarks"]]
                if acctot:
                    if acctot < 0:
                        dr = 0
                        cr = acctot
                    else:
                        dr = acctot
                        cr = 0
                    data = [(d, "B/Fwd", "", "", dr, cr, acctot,
                             "Opening Balance")]
                else:
                    data = []
                col = self.sql.gentrn_col
                for num, rec in enumerate(trn):
                    trdt = rec[col.index("glt_trdt")]
                    refno = rec[col.index("glt_refno")]
                    trtp = gltrtp[(rec[col.index("glt_type")]) - 1][0]
                    batch = rec[col.index("glt_batch")]
                    tramt = rec[col.index("glt_tramt")]
                    if tramt < 0:
                        debit = 0
                        credit = tramt
                    else:
                        debit = tramt
                        credit = 0
                    detail = rec[col.index("glt_desc")]
                    acctot = float(ASD(acctot) + ASD(tramt))
                    data.append((trdt, refno, trtp, batch, debit, credit,
                                 acctot, detail))
                RepPrt(self.opts["mf"],
                       name=self.__class__.__name__,
                       conum=self.opts["conum"],
                       conam=self.opts["conam"],
                       tables=data,
                       heads=heads,
                       cols=cols,
                       ttype="D",
                       repprt=self.pr.repprt,
                       repeml=self.pr.repeml)

    def doPrtExit(self):
        self.pr.closeProcess()

    def doPeriod(self, frt, pag, r, c, p, i, w):
        if w != 0 and (w < self.i_per or w > self.e_per):
            return "Invalid Period"
        self.trnper = w

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.pgnum += 1
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        self.fpdf.drawText("%-34s %-10s %51s %5s" % \
            ("General Ledger Interrogation as at", self.sysdtd,
            "Page", self.pgnum))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 4

    def getObal(self):
        acbal = self.obal
        if self.trnper:
            o = self.sql.getRec("gentrn",
                                cols=["round(sum(glt_tramt), 2)"],
                                where=[("glt_cono", "=", self.opts["conum"]),
                                       ("glt_acno", "=", self.acno),
                                       ("glt_curdt", ">=", self.i_per),
                                       ("glt_curdt", "<", self.trnper)],
                                limit=1)
            if o[0]:
                acbal = float(ASD(acbal) + ASD(o[0]))
        mthno = CCD(self.trnper % 100, "UI", 2.0)
        return mthno, acbal

    def getTrans(self):
        odr = "glt_acno, glt_curdt, glt_trdt, glt_type, glt_refno, glt_batch"
        if not self.trnper:
            whr = [("glt_cono", "=", self.opts["conum"]),
                   ("glt_acno", "=", self.acno),
                   ("glt_curdt", "between", self.i_per, self.e_per)]
        else:
            whr = [("glt_cono", "=", self.opts["conum"]),
                   ("glt_acno", "=", self.acno),
                   ("glt_curdt", "=", self.trnper)]
        return self.sql.getRec("gentrn", where=whr, order=odr)

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #6
0
class gl1010(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"])
        ctlsys = gc.getCtl("ctlsys")
        if not ctlsys:
            return
        self.gldep = ctlsys["sys_gl_dep"]
        self.gldig = ctlsys["sys_gl_dig"]
        ctlmst = gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        self.taxdf = ctlmst["ctm_taxdf"]
        if not self.taxdf:
            self.taxdf = "N"
        self.mods = []
        for x in range(0, len(ctlmst["ctm_modules"].rstrip()), 2):
            self.mods.append(ctlmst["ctm_modules"][x:x + 2])
        tabs = [
            "ctlctl", "ctldep", "ctlvmf", "genmst", "genbal", "genbud",
            "genrpt", "gentrn", "chglog"
        ]
        if "CR" in self.mods:
            tabs.append("crsctl")
        if "DR" in self.mods:
            tabs.append("drsctl")
        if "ST" in self.mods:
            tabs.extend(["strctl", "strloc"])
        if "SI" in self.mods:
            tabs.append("slsctl")
        self.sql = Sql(self.opts["mf"].dbm, tabs, prog=self.__class__.__name__)
        if self.sql.error:
            return
        chk = self.sql.getRec("genmst",
                              cols=["count(*)"],
                              where=[("glm_cono", "=", self.opts["conum"])],
                              limit=1)
        if chk[0]:
            self.newgen = False
        else:
            self.newgen = True
        if "args" in self.opts:
            self.acno = None
        return True

    def mainProcess(self):
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        vat = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "Acc-Num"), ("vtm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        r1s = (("Profit & Loss", "P"), ("Balance Sheet", "B"))
        r2s = (("Yes", "Y"), ("No", "N"))
        fld = [(("T", 0, 0, 0), "IUI", 7, "Acc-Num", "Account Number", "", "Y",
                self.doAccNum, glm, None, ("notzero", )),
               (("T", 0, 1, 0), ("IRB", r1s), 0, "Account Type", "", "P", "N",
                self.doTypCod, None, self.doDelete, None),
               (("T", 0, 2,
                 0), "INA", 30, "Description", "Account Description", "", "N",
                None, None, None, ("notblank", )),
               (("T", 0, 3, 0), ("IRB", r2s), 0, "Allow Postings", "", "Y",
                "N", None, None, None, None),
               [("T", 0, 4, 0), "IUA", 1, "Tax Default", "", "", "N",
                self.doVatCod, vat, None, ("notblank", )]]
        but = [
            ("Import",None,self.doImport,0,("T",0,1),("T",0,2),
                "Import a Chart of Accounts from a CSV or XLS file "\
                "having the following fields: Account Number, "\
                "Account Type (P/B), Description, Direct Postings (Y/N), "\
                "VAT Code"),
            ["Populate",None,self.doPopulate,0,("T",0,1),("T",0,2),
                "Generate a Chart of Accounts with Accompanying Control "\
                "Records and Financial Statement Report. This Only Applies "\
                "to Unpopulated (NEW) Ledgers."],
            ("Accept",None,self.doAccept,0,(("T",0,2),("T",0,5)),
                (("T",0,0),("T",0,1))),
            ("Cancel",None,self.doCancel,0,(("T",0,2),("T",0,5)),
                (("T",0,0),("T",0,1))),
            ("Quit",None,self.doQuit,1,None,None,"",1,4)]
        tnd = ((self.doEnd, "y"), )
        txt = (self.doQuit, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)
        if not self.newgen:
            self.df.butt[1][4] = None
            self.df.butt[1][5] = None
            self.df.setWidget(self.df.B1, state="disabled")

    def doAccNum(self, frt, pag, r, c, p, i, w):
        self.acno = w
        self.old = self.sql.getRec("genmst",
                                   where=[("glm_cono", "=",
                                           self.opts["conum"]),
                                          ("glm_acno", "=", self.acno)],
                                   limit=1)
        if not self.old:
            self.new = True
            if self.gldep == "Y":
                err = self.doCheckDep(self.acno)
                if err:
                    return err
        elif "args" in self.opts:
            showError(self.opts["mf"].body, "Error",
                      "Only a New Account is Allowed")
            return "rf"
        else:
            self.new = False
            for x in range(0, self.df.topq[pag]):
                self.df.loadEntry(frt, pag, p + x, data=self.old[x + 1])

    def doTypCod(self, frt, pag, r, c, p, i, w):
        if self.new:
            if w == "P":
                self.df.topf[pag][4][5] = self.taxdf
            else:
                self.df.topf[pag][4][5] = "N"
        elif not self.df.topf[pag][4][5]:
            self.df.topf[pag][4][5] = "N"

    def doVatCod(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("ctlvmf",
                              cols=["vtm_desc"],
                              where=[("vtm_cono", "=", self.opts["conum"]),
                                     ("vtm_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid VAT Code"

    def doDelete(self):
        t = self.sql.getRec("gentrn",
                            cols=["count(*)"],
                            where=[("glt_cono", "=", self.opts["conum"]),
                                   ("glt_acno", "=", self.acno)],
                            limit=1)
        if t[0]:
            return "Transactions Exist, Not Deleted"
        self.sql.delRec("genmst",
                        where=[("glm_cono", "=", self.opts["conum"]),
                               ("glm_acno", "=", self.acno)])
        self.sql.delRec("genbal",
                        where=[("glo_cono", "=", self.opts["conum"]),
                               ("glo_acno", "=", self.acno)])
        self.sql.delRec("genbud",
                        where=[("glb_cono", "=", self.opts["conum"]),
                               ("glb_acno", "=", self.acno)])
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        self.sql.insRec("chglog",
                        data=[
                            "genmst", "D",
                            "%03i%07i" % (self.opts["conum"], self.acno), "",
                            dte, self.opts["capnm"], "", "", "", 0
                        ])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doEnd(self):
        if self.newgen:
            self.df.butt[1][4] = None
            self.df.butt[1][5] = None
        data = [
            self.opts["conum"], self.acno, self.df.t_work[0][0][1],
            self.df.t_work[0][0][2], self.df.t_work[0][0][3],
            self.df.t_work[0][0][4]
        ]
        if self.new:
            self.sql.insRec("genmst", data=data)
        elif data != self.old[:len(data)]:
            col = self.sql.genmst_col
            data.append(self.old[col.index("glm_xflag")])
            self.sql.updRec("genmst",
                            data=data,
                            where=[("glm_cono", "=", self.opts["conum"]),
                                   ("glm_acno", "=", self.acno)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.old):
                if dat != data[num]:
                    self.sql.insRec(
                        "chglog",
                        data=[
                            "genmst", "U",
                            "%03i%07i" % (self.opts["conum"], self.acno),
                            col[num], dte, self.opts["capnm"],
                            str(dat),
                            str(data[num]), "", 0
                        ])
        self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.B3, state="disabled")
        if "args" in self.opts:
            self.doQuit()
        else:
            self.df.focusField("T", 0, 1)

    def doAccept(self):
        frt, pag, col, mes = self.df.doCheckFields()
        if mes:
            self.df.focusField(frt, pag, (col + 1), err=mes)
        else:
            self.df.doEndFrame("T", 0, cnf="N")

    def doImport(self):
        self.df.setWidget(self.df.B3, state="disabled")
        self.df.setWidget(self.df.mstFrame, state="hide")
        fi = FileImport(self.opts["mf"], imptab="genmst", impskp=["glm_cono"])
        sp = ProgressBar(self.opts["mf"].body,
                         typ="Importing Chart of Accounts",
                         mxs=len(fi.impdat))
        err = None
        for num, line in enumerate(fi.impdat):
            sp.displayProgress(num)
            chk = self.sql.getRec("genmst",
                                  where=[("glm_cono", "=", self.opts["conum"]),
                                         ("glm_acno", "=", line[0])],
                                  limit=1)
            if chk:
                err = "%s %s Already Exists" % (fi.impcol[0][0], line[0])
                break
            if self.gldep == "Y":
                err = self.doCheckDep(line[0])
                if err:
                    break
            if line[1] not in ("B", "P"):
                err = "Invalid %s %s, Only B or P" % (fi.impcol[1][0], line[1])
                break
            if not line[2]:
                err = "Blank Description"
                break
            if line[3] not in ("Y", "N"):
                err = "Invalid %s %s" % (fi.impcol[3][0], line[3])
                break
            chk = self.sql.getRec("ctlvmf",
                                  where=[("vtm_cono", "=", self.opts["conum"]),
                                         ("vtm_code", "=", line[4])],
                                  limit=1)
            if not chk:
                err = "%s %s Does Not Exist" % (fi.impcol[4][0], line[4])
                break
            line.insert(0, self.opts["conum"])
            self.sql.insRec("genmst", data=line)
        sp.closeProgress()
        if err:
            err = "Line %s: %s" % ((num + 1), err)
            showError(
                self.opts["mf"].body, "Import Error", """%s

Please Correct your Import File and then Try Again.""" % err)
            self.opts["mf"].dbm.rollbackDbase()
        else:
            self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doCheckDep(self, acno):
        dep = int(acno / (10**(7 - self.gldig)))
        acc = int(acno % (10**(7 - self.gldig)))
        if dep:
            chk = self.sql.getRec("ctldep",
                                  where=[("dep_cono", "=", self.opts["conum"]),
                                         ("dep_code", "=", dep)],
                                  limit=1)
            if not chk:
                return "Invalid Department Number (%s)" % dep
            chk = self.sql.getRec("genmst",
                                  where=[("glm_cono", "=", self.opts["conum"]),
                                         ("glm_acno", "=", acc)],
                                  limit=1)
            if chk:
                return "This Account Number (%s) is in Use" % acc

    def doPopulate(self):
        if not self.newgen:
            showError(self.opts["mf"].body, "Populate Error",
                      "You Cannot Populate with Existing Accounts")
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)
            return
        if self.gldep == "Y":
            showError(self.opts["mf"].body, "Populate Error",
                      "You Cannot Populate with Departments Enabled")
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)
            return
        self.igcrs = "N"
        self.igdrs = "N"
        self.igstr = "N"
        self.df.setWidget(self.df.B3, state="disabled")
        self.df.setWidget(self.df.mstFrame, state="hide")
        tit = ("Integrate Subsiduary Ledgers", )
        r1s = (("Yes", "Y"), ("No", "N"))
        fld = []
        col = 0
        if "CR" in self.mods:
            fld.append((("T", 0, col, 0), ("IRB", r1s), 0, "Creditor's Ledger",
                        "Creditor's Ledger", "N", "N", self.doIgCrs, None,
                        None, None, None))
            col += 1
        if "DR" in self.mods:
            fld.append((("T", 0, col, 0), ("IRB", r1s), 0, "Debtor's Ledger",
                        "Debtor's Ledger", "N", "N", self.doIgDrs, None, None,
                        None, None))
            col += 1
        if "ST" in self.mods:
            fld.append((("T", 0, col, 0), ("IRB", r1s), 0, "Stores's Ledger",
                        "Stores's Ledger", "N", "N", self.doIgStr, None, None,
                        None, None))
        if fld:
            self.ig = TartanDialog(self.opts["mf"],
                                   title=tit,
                                   tops=True,
                                   eflds=fld,
                                   tend=((self.doIgEnd, "y"), ),
                                   txit=(self.doIgExit, ))
            self.ig.mstFrame.wait_window()
            if self.igexit:
                self.doQuit()
                return
        sp = SplashScreen(self.opts["mf"].body,
                          "Populating Records\n\nPlease Wait ...")
        # genmst
        genmst = datdic["genmst"]
        for dat in genmst:
            dat.insert(0, self.opts["conum"])
            dat.append("Y")
            if dat[2] == "B":
                dat.append("N")
            else:
                dat.append(self.taxdf)
            self.sql.insRec("genmst", data=dat)
        # genrpt
        genrpt = datdic["genrpt"]
        for dat in genrpt:
            dat.insert(0, self.opts["conum"])
            self.sql.insRec("genrpt", data=dat)
        # ctlctl
        crsctl = 0
        drsctl = 0
        stksoh = 0
        ctlctl = datdic["ctlctl"]
        for dat in ctlctl:
            if dat[0] in ("crs_ctl", "dis_rec"):
                if self.igcrs != "Y":
                    continue
                if dat[0] == "crs_ctl":
                    crsctl = int(dat[2])
            elif dat[0] in ("drs_ctl", "dis_all"):
                if self.igdrs != "Y":
                    continue
                if dat[0] == "drs_ctl":
                    drsctl = int(dat[2])
            elif dat[0] in ("stk_soh", "stk_susp"):
                if self.igstr != "Y":
                    continue
                if dat[0] == "stk_soh":
                    stksoh = int(dat[2])
            elif dat[0] in ("wag_ctl", "wag_slc", "wag_sli"):
                continue
            dat.insert(0, self.opts["conum"])
            self.sql.insRec("ctlctl", data=dat)
        if "CR" in self.mods:
            chk = self.sql.getRec("crsctl",
                                  where=[("ctc_cono", "=", self.opts["conum"])
                                         ])
            if not chk:
                self.sql.insRec("crsctl",
                                data=[
                                    self.opts["conum"], self.igcrs, "E", "", 0,
                                    0, "remittance_advice", ""
                                ])
            else:
                self.sql.updRec("crsctl",
                                cols=["ctc_glint"],
                                data=[self.igcrs],
                                where=[("ctc_cono", "=", self.opts["conum"])])
            if self.igcrs == "Y" and crsctl:
                self.sql.updRec("genmst",
                                cols=["glm_ind"],
                                data=["N"],
                                where=[("glm_cono", "=", self.opts["conum"]),
                                       ("glm_acno", "=", crsctl)])
        if "DR" in self.mods:
            chk = self.sql.getRec("drsctl",
                                  where=[("ctd_cono", "=", self.opts["conum"])
                                         ])
            if not chk:
                self.sql.insRec("drsctl",
                                data=[
                                    self.opts["conum"], self.igdrs, "E", "N",
                                    "statement_normal", "Y", ""
                                ])
            else:
                self.sql.updRec("drsctl",
                                cols=["ctd_glint"],
                                data=[self.igdrs],
                                where=[("ctd_cono", "=", self.opts["conum"])])
            if self.igdrs == "Y" and drsctl:
                self.sql.updRec("genmst",
                                cols=["glm_ind"],
                                data=["N"],
                                where=[("glm_cono", "=", self.opts["conum"]),
                                       ("glm_acno", "=", drsctl)])
        if "ST" in self.mods:
            chk = self.sql.getRec("strctl",
                                  where=[("cts_cono", "=", self.opts["conum"])
                                         ])
            if not chk:
                self.sql.insRec("strctl",
                                data=[
                                    self.opts["conum"], self.igstr, "N", 1,
                                    "N", "purchase_order", ""
                                ])
            else:
                self.sql.updRec("strctl",
                                cols=["cts_glint"],
                                data=[self.igstr],
                                where=[("cts_cono", "=", self.opts["conum"])])
            chk = self.sql.getRec("strloc",
                                  where=[("srl_cono", "=", self.opts["conum"])
                                         ])
            if not chk:
                self.sql.insRec("strloc",
                                data=[
                                    self.opts["conum"], "1",
                                    "Location Number One", "", "", "", ""
                                ])
            if self.igstr == "Y" and stksoh:
                self.sql.updRec("genmst",
                                cols=["glm_ind"],
                                data=["N"],
                                where=[("glm_cono", "=", self.opts["conum"]),
                                       ("glm_acno", "=", stksoh)])
        if "SI" in self.mods:
            chk = self.sql.getRec("slsctl",
                                  where=[("ctv_cono", "=", self.opts["conum"])
                                         ])
            if not chk:
                self.sql.insRec(
                    "slsctl",
                    data=[self.opts["conum"], "Y", "Y", "sales_document", ""])
        sp.closeSplash()
        self.df.butt[1][4] = None
        self.df.butt[1][5] = None
        self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doIgCrs(self, frt, pag, r, c, p, i, w):
        self.igcrs = w

    def doIgDrs(self, frt, pag, r, c, p, i, w):
        self.igdrs = w

    def doIgStr(self, frt, pag, r, c, p, i, w):
        self.igstr = w

    def doIgEnd(self):
        self.igexit = False
        self.ig.closeProcess()

    def doCancel(self):
        self.opts["mf"].dbm.rollbackDbase()
        self.df.last[0] = [0, 0]
        self.df.focusField("T", 0, 1)

    def doIgExit(self):
        self.igexit = True
        self.ig.closeProcess()

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

    def setVariables(self):
        # Check for Valid Posting Routine
        if self.opts["rtn"] != 5:
            mes = "Invalid Routine %s" % str(self.opts["rtn"])
            showError(self.opts["mf"].body, "Control Error", mes)
            return
        tabs = ["ctlvmf", "memmst", "memtrn"]
        self.gc = GetCtl(self.opts["mf"])
        memctl = self.gc.getCtl("memctl", self.opts["conum"])
        if not memctl:
            return
        self.glint = memctl["mcm_glint"]
        if self.glint == "Y":
            ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = ["mem_ctl", "vat_ctl", "dis_all"]
            if self.gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.memctl = ctlctl["mem_ctl"]
            self.dis_all = ctlctl["dis_all"]
            tabs.extend(["genmst", "gentrn"])
        # Setup SQL Object
        self.sql = Sql(self.opts["mf"].dbm, tabs, prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.bh = Batches(self.opts["mf"],
                          self.opts["conum"],
                          self.opts["conam"],
                          self.opts["period"],
                          "MEM",
                          self.opts["rtn"],
                          glint=self.glint)
        self.bh.doBatchHeader()
        if not self.bh.batno:
            return
        self.bh.batval = float(ASD(0) - ASD(self.bh.batval))
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        ctlmst = self.gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        self.taxdf = ctlmst["ctm_taxdf"]
        self.glt = 4
        self.agevar = tk.BooleanVar()
        self.agevar.set(False)
        return True

    def drawDialog(self):
        mlm = {
            "stype":
            "R",
            "tables": ("memmst", ),
            "cols":
            (("mlm_memno", "", 0, "Mem-No"), ("mlm_oldno", "", 0, "Old-No"),
             ("mlm_gender", "", 0, "G"), ("mlm_state", "", 0, "S"),
             ("mlm_surname", "", 0, "Surname", "Y"), ("mlm_names", "", 0,
                                                      "Names", "F")),
            "where": [("mlm_cono", "=", self.opts["conum"])],
            "order":
            "mlm_surname, mlm_names",
            "sort":
            False
        }
        tag = (("Deposit", None, None, None, False), ("Allocation", None, None,
                                                      None, False))
        fld = ((("T", 0, 0, 0), "OUI", 9, "Batch %s Quantity" % self.bh.batno),
               (("T", 0, 0, 0), "OSD", 13.2, "Value"),
               (("C", 1, 0, 0), "INa", 9, "Reference", "Reference Number One",
                "i", "Y", self.doRefno, None, None, ("efld", )),
               (("C", 1, 0, 1), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 2), "ISD", 13.2, "Amount", "Transaction Amount",
                "", "N", self.doTrnAmt, None, None, ("notzero", )),
               (("C", 1, 0, 3), "INA", 30, "Details", "Deposit Details", "",
                "N", self.doTrnDet, None, None,
                None), (("T", 2, 0, 0), "OSD", 13.2, "Unallocated Balance"),
               (("C", 2, 0, 0), "IUI", 6, "Mem-No", "Member Number", "r", "N",
                self.doMemAcc, mlm, None, ("notblank", )), (("C", 2, 0, 1),
                                                            "ONA", 30, "Name"),
               (("C", 2, 0, 2), "ISD", 13.2, "Receipt", "Receipt Amount", "",
                "N", self.doAllAmt, None, None, ("efld", )),
               (("C", 2, 0, 3), "ISD", 13.2, "Discount", "Discount Amount",
                "", "N", self.doDisAmt, None, None, ("efld", ), None,
                "Discount Amount to be Added to the Receipt Amount."),
               (("C", 2, 0, 4), "OSD", 13.2, "Total-Amount"))
        but = (
            ("Age _Normal",None,self.doAgeNormal,0,None,None,
                "Only Show Unallocated Transactions",1),
            ("Age _History",None,self.doAgeHistory,0,None,None,
                "Show All Transactions Including Already Allocated",1),
            ("Age _Automatic",None,self.doAgeAuto,0,None,None,
                "Automatically Allocate the Amount Starting With the "\
                "Oldest Unallocated One",1),
            ("Age _Current",None,self.doAgeCurrent,0,None,None,
                "Leave the Transaction Unallocated",1),
            ("Cancel",None,self.doCancel,0,("C",2,1),("C",1,1),"",1))
        txt = (None, None, None)
        cnd = [None, (self.endPage1, "y"), (self.endPage2, "y")]
        cxt = [None, self.exitPage1, self.exitPage2]
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tags=tag,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)
        self.df.focusField("C", 1, 1)

    def doRefno(self, frt, pag, r, c, p, i, w):
        if not w:
            trns = self.sql.getRec("memtrn",
                                   cols=["mlt_refno"],
                                   where=[("mlt_cono", "=",
                                           self.opts["conum"]),
                                          ("mlt_refno", "like", "R________")],
                                   order="mlt_refno desc")
            auto = False
            for trn in trns:
                try:
                    w = "R%08i" % (int(trn[0][1:]) + 1)
                    auto = True
                    break
                except:
                    pass
            if not auto:
                w = "R00000001"
            self.df.loadEntry(frt, pag, p, data=w)
        chk = self.sql.getRec("memtrn",
                              cols=["mlt_memno"],
                              where=[("mlt_cono", "=", self.opts["conum"]),
                                     ("mlt_type", "=", self.opts["rtn"]),
                                     ("mlt_refno", "=", w)])
        if chk:
            return "A Transaction with this Number Already Exists"
        self.refno = w

    def doTrnDat(self, frt, pag, r, c, p, i, w):
        if w < self.opts["period"][1][0] or w > self.opts["period"][2][0]:
            return "Invalid Date, Not in Financial Period"
        if self.bh.multi == "N" and int(w / 100) > self.bh.curdt:
            return "Invalid Date, After Batch Period"
        self.trndat = w

    def doTrnAmt(self, frt, pag, r, c, p, i, w):
        self.trnamt = w

    def doTrnDet(self, frt, pag, r, c, p, i, w):
        self.trndet = w
        self.allocated = float(0.00)

    def endPage1(self):
        self.batupd = False
        self.updateTables1()
        self.updateBatch()
        self.agecan = False
        self.allocated = float(0.0)
        self.df.selPage("Allocation")
        self.df.loadEntry("T", 2, 0, data=self.trnamt)
        self.df.focusField("C", 2, 1)

    def updateTables1(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trndat / 100)
        else:
            self.curdt = self.bh.curdt
        if self.glint == "Y":
            # General Ledger Control Transaction (Bank)
            data = (self.opts["conum"], self.bh.acc, self.curdt, self.trndat,
                    self.glt, self.refno, self.bh.batno, self.trnamt, 0.00,
                    self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)

    def exitPage1(self):
        self.df.closeProcess()
        self.bh.doBatchTotal()
        self.opts["mf"].closeLoop()

    def doMemAcc(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("memmst",
                              cols=["mlm_title", "mlm_initial", "mlm_surname"],
                              where=[("mlm_cono", "=", self.opts["conum"]),
                                     ("mlm_memno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Member Number"
        self.memno = w
        self.name = "%s, %s %s" % (acc[2], acc[0], acc[1])
        self.df.loadEntry("C", pag, p + 1, data=self.name)
        self.allref = self.refno
        while self.sql.getRec("memtrn",
                              cols=["mlt_batch"],
                              where=[("mlt_cono", "=", self.opts["conum"]),
                                     ("mlt_memno", "=", self.memno),
                                     ("mlt_type", "=", self.opts["rtn"]),
                                     ("mlt_refno", "=", self.allref)]):
            self.doGetAnotherRef()

    def doGetAnotherRef(self):
        tit = ("Duplicate Reference Number", )
        fld = ((("T", 0, 0, 0), "ONa", 9, "Old Reference", "", self.allref,
                "N", None, None, None, None),
               (("T", 0, 1, 0), "INa", 9, "New Reference", "", "", "N",
                self.doRefNew, None, None, ("notblank", )))
        tnd = ((self.doRefEnd, "n"), )
        txt = (self.doRefExit, )
        state = self.df.disableButtonsTags()
        self.tf = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=tnd,
                               txit=txt)
        self.tf.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)

    def doRefExit(self):
        self.tf.focusField("T", 0, 2)

    def doRefNew(self, frt, pag, r, c, p, i, w):
        self.allref = w

    def doRefEnd(self):
        self.tf.closeProcess()

    def doAllAmt(self, frt, pag, r, c, p, i, w):
        if w == 0:
            self.allamt = float(ASD(self.trnamt) - ASD(self.allocated))
            self.df.loadEntry(frt, pag, p, data=self.allamt)
        else:
            self.allamt = w

    def doDisAmt(self, frt, pag, r, c, p, i, w):
        if self.allamt < 0 and w > 0:
            ok = self.checkSign()
        elif self.allamt > 0 and w < 0:
            ok = self.checkSign()
        else:
            ok = "yes"
        if ok != "yes":
            return "Invalid Discount Amount (Sign Error)"
        self.disamt = w
        totamt = float(ASD(self.allamt) + ASD(self.disamt))
        self.df.loadEntry(frt, pag, p + 1, data=totamt)

    def checkSign(self):
        return askQuestion(self.opts["mf"].body, "Check Sign",
            "The Sign of the Discount Amount is not the same as the Sign "\
            "of the Receipt Amount, Is This Correct?")

    def endPage2(self):
        self.amt = float(ASD(0) - ASD(self.allamt))
        self.dis = float(ASD(0) - ASD(self.disamt))
        state = self.df.disableButtonsTags()
        self.opts["mf"].updateStatus("Choose an Ageing Option")
        for x in range(0, 5):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, "normal")
        self.df.setWidget(self.df.B0, "focus")
        self.agevar.set(True)
        self.df.mstFrame.wait_variable(self.agevar)
        self.df.enableButtonsTags(state=state)
        if self.agecan:
            self.doCancel()
            return
        # Members Ledger Transaction
        data = [
            self.opts["conum"], self.memno, self.opts["rtn"], self.allref,
            self.bh.batno, self.trndat, self.amt, 0.00, self.curdt, "", 0,
            self.trndet, "", "N", self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("memtrn", data=data)
        if self.dis:
            data = [
                self.opts["conum"], self.memno, 6, self.allref, self.bh.batno,
                self.trndat, self.dis, 0.00, self.curdt, "", 0, self.trndet,
                "", "N", self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("memtrn", data=data, unique="mlt_refno")
        self.allocated = float(ASD(self.allocated) + ASD(self.allamt))
        if self.glint == "Y":
            # General Ledger Control Transaction (Members)
            amt = float(ASD(self.amt) + ASD(self.dis))
            data = (self.opts["conum"], self.memctl, self.curdt, self.trndat,
                    self.glt, self.allref, self.bh.batno, amt, 0.00,
                    self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)
            # General Ledger Control Transaction (Discount)
            if self.disamt:
                data = (self.opts["conum"], self.dis_all, self.curdt,
                        self.trndat, self.glt, self.allref, self.bh.batno,
                        self.disamt, 0.00, self.trndet, "N", "", 0,
                        self.opts["capnm"], self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)
        if self.allocated == self.trnamt:
            self.opts["mf"].dbm.commitDbase()
            self.df.clearFrame("C", 2)
            self.df.selPage("Deposit")
            self.df.advanceLine(1)
        else:
            bal = float(ASD(self.trnamt) - ASD(self.allocated))
            self.df.loadEntry("T", 2, 0, data=bal)
            self.df.advanceLine(2)

    def doAgeNormal(self):
        self.doAgeing("N")

    def doAgeHistory(self):
        self.doAgeing("H")

    def doAgeAuto(self):
        self.doAgeing("O")

    def doAgeCurrent(self):
        self.doAgeing("C")

    def doAgeing(self, atype):
        # Disable All Ageing Buttons
        for x in range(0, 4):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, "disabled")
        self.opts["mf"].updateStatus("Select Transaction to Allocate Against")
        age = AgeAll(self.opts["mf"],
                     system="mem",
                     agetyp=atype,
                     agekey=[
                         self.opts["conum"], self.memno, self.opts["rtn"],
                         self.allref, self.curdt, self.amt, self.dis
                     ])
        self.agecan = age.cancel
        self.agevar.set(False)

    def doCancel(self):
        if self.agecan:
            ok = "yes"
        else:
            ok = askQuestion(
                self.opts["mf"].body,
                head="Cancel",
                mess="Are You Certain You Want to Cancel This Entry?")
        if ok == "yes":
            self.opts["mf"].dbm.rollbackDbase()
            if self.batupd:
                self.updateBatch(rev=True)
            self.df.clearFrame("C", 2)
            self.df.selPage("Deposit")
            row = int((self.df.last[1][1] - 1) / self.df.colq[1])
            col = (row * self.df.colq[1]) + 1
            self.df.focusField("C", 1, col)

    def updateBatch(self, rev=False):
        if rev:
            self.bh.batqty -= 1
            self.bh.batval = float(ASD(self.bh.batval) - ASD(self.trnamt))
        else:
            self.batupd = True
            self.bh.batqty += 1
            self.bh.batval = float(ASD(self.bh.batval) + ASD(self.trnamt))
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)

    def exitPage2(self):
        self.df.focusField("C", 2, self.df.col)
Пример #8
0
class st2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.exit = False
            self.selectPrinter()
            if not self.exit:
                self.mainProcess()
                self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlmst", "ctlmes", "ctlvrf", "ctlrep", "crsmst", "gentrn",
            "strgrp", "strloc", "strmf1", "strmf2", "strpom", "strpot",
            "strtrn", "strgmu", "strcmu", "tplmst"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        ctlmst = gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        mods = []
        for x in range(0, len(ctlmst["ctm_modules"].rstrip()), 2):
            mods.append(ctlmst["ctm_modules"][x:x + 2])
        if "CR" not in mods:
            showError(
                self.opts["mf"].body, "System Error",
                "This module requires you to have a Creditor's Activated")
            return
        strctl = gc.getCtl("strctl", self.opts["conum"])
        if not strctl:
            return
        self.stgl = strctl["cts_glint"]
        self.locs = strctl["cts_locs"]
        self.plevs = strctl["cts_plevs"]
        self.dtpl = strctl["cts_tplnam"]
        if self.stgl == "Y":
            ctlctl = gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = ["stk_soh", "stk_susp"]
            if gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.soh = ctlctl["stk_soh"]
            self.ssp = ctlctl["stk_susp"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        return True

    def selectPrinter(self):
        tit = ("Printer Selection", )
        tpm = {
            "stype":
            "R",
            "tables": ("tplmst", ),
            "cols": (("tpm_tname", "", 0, "Template"), ("tpm_title", "", 0,
                                                        "Title", "Y")),
            "where": [("tpm_type", "=", "O"), ("tpm_system", "=", "STR")],
            "order":
            "tpm_tname"
        }
        fld = ((("T", 0, 0, 0), "INA", 20, "Template Name", "", self.dtpl, "N",
                self.doTplNam, tpm, None, None),
               (("T", 0, 1, 0), "ID1", 10, "Order Date", "", self.sysdtw, "N",
                self.doOrdDate, None, None, ("efld", )))
        self.pr = TartanDialog(self.opts["mf"],
                               tops=True,
                               title=tit,
                               eflds=fld,
                               tend=((self.doPrtEnd, "y"), ),
                               txit=(self.doPrtExit, ),
                               view=("N", "P"),
                               mail=("N", "Y", "Y"))
        self.opts["mf"].startLoop()

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

    def doOrdDate(self, frt, pag, r, c, p, i, w):
        if w < self.opts["period"][1][0] or w > self.opts["period"][2][0]:
            return "Invalid Date, Not In Financial Period"
        self.trdt = w
        self.trdd = self.pr.t_disp[0][0][1]
        self.curdt = int(self.trdt / 100)
        self.batch = "S%s" % self.curdt

    def doPrtEnd(self):
        self.doPrtClose()

    def doPrtExit(self):
        self.exit = True
        self.doPrtClose()

    def doPrtClose(self):
        self.pr.closeProcess()
        self.opts["mf"].closeLoop()

    def mainProcess(self):
        doc = {
            "stype":
            "R",
            "tables": ("strpom", "crsmst"),
            "cols":
            (("pom_ordno", "", 0, "Ord-Num"), ("pom_acno", "", 0, "Acc-Num"),
             ("crm_name", "", 0, "Name", "Y")),
            "where": [("pom_cono", "=", self.opts["conum"]),
                      ("crm_cono=pom_cono", ), ("crm_acno=pom_acno", ),
                      ("pom_delno", "=", "")]
        }
        loc = {
            "stype":
            "R",
            "tables": ("strloc", ),
            "cols":
            (("srl_loc", "", 0, "L"), ("srl_desc", "", 0, "Description", "Y")),
            "where": [("srl_cono", "=", self.opts["conum"])]
        }
        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")],
            "index":
            0
        }
        odr = {
            "stype": "R",
            "tables": ("ctlrep", ),
            "cols": [("rep_code", "", 0, "Ord"),
                     ("rep_name", "", 0, "Name", "Y")],
            "where": [("rep_cono", "=", self.opts["conum"])],
            "index": 0
        }
        grp = {
            "stype":
            "R",
            "tables": ("strgrp", ),
            "cols": (("gpm_group", "", 0, "Grp"), ("gpm_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("gpm_cono", "=", self.opts["conum"])]
        }
        cod = {
            "stype":
            "R",
            "tables": ("strmf1", ),
            "cols": (("st1_code", "", 0, "Product-Code"),
                     ("st1_desc", "", 0, "Description", "Y")),
            "where": [("st1_cono", "=", self.opts["conum"]),
                      ("st1_type", "not", "in", ("R", "X")),
                      ("st1_value_ind", "<>", "N")],
            "whera": [("C", "st1_group", 0)],
            "order":
            "st1_group, st1_code"
        }
        r1s = (("New", "N"), ("Amend", "A"), ("Receive", "R"), ("Cancel", "C"))
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "Action", "", "N", "Y",
                self.doActTyp, None, None,
                None), (("T", 0, 1, 0), "IUI", 9, "Ord-No", "Order Number", "",
                        "N", self.doOrdNum, doc, None, ("notblank", )),
               (("T", 0, 2, 0), "IUA", 1, "Loc", "Location Code", "1", "N",
                self.doLoc, loc, None, None), (("T", 0, 2, 0), "ONA", 30, ""),
               (("T", 0, 3, 0), "INA", 7, "Acc-No", "Account Number", "", "N",
                self.doCrsAcc, crm, None, None), (("T", 0, 3, 0), "ONA", 30,
                                                  ""),
               (("T", 0, 4, 0), "INa", 3, "Ord-By", "Ordered By", "", "N",
                self.doOrdBy, odr, None, None), (("T", 0, 4, 0), "ONA", 30,
                                                 ""),
               (("T", 0, 5, 0), "INa", 7, "Del-No", "Delivery Note Number", "",
                "N", self.doDelNum, None, None, ("notblank", )),
               (("T", 0, 5, 0), "ID1", 10, "Date", "Delivery Date", self.trdt,
                "N", self.doDelDate, None, None,
                ("efld", )), (("C", 0, 0, 0), "INA", 3, "Grp", "Product Group",
                              "", "Y", self.doGrp, grp, None, None),
               (("C", 0, 0, 1), "INA", 20, "Product-Code", "", "", "N",
                self.doCod, cod, None,
                None), (("C", 0, 0, 2), "INA", (20, 30), "Description", "", "",
                        "N", self.doDes, None, None,
                        None), (("C", 0, 0, 3), "ISD", 11.2, "Quantity", "", 1,
                                "N", self.doQty, None, None, ("notzero", )),
               (("C", 0, 0, 4), "IUA", 1, "V", "V.A.T. Code", "I", "N",
                self.doVat, None, None, ("notblank", )),
               (("C", 0, 0, 5), "IUD", 10.2, "Price", "Exclusive Price", "",
                "N", self.doPri, None, None,
                None), (("C", 0, 0, 6), "IUD", 6.2, "Dis-%", "Trade Discount",
                        "", "N", self.doDis, None, None,
                        None), (("C", 0, 0, 7), "OSD", 10.2, "Value"))
        self.row = (15, )
        self.but = (("Cancel", None, self.doCancel, 1, ("C", 0, 1),
                     ("T", 0, 1)), ("DelAdd", None, self.doDelAdd, 1,
                                    ("C", 0, 1), ("T", 0, 1)),
                    ("Ribbon", None, self.doRibbon, 1, ("C", 0, 1),
                     ("T", 0, 1)), ("Message", None, self.doMessag, 1,
                                    ("C", 0, 1), ("T", 0, 1)),
                    ("Edit", None, self.doEdit, 0, ("C", 0, 1), ("C", 0, 2)),
                    ("Reprint", None, self.doReprnt, 0, ("T", 0, 1),
                     ("T", 0, 2)), ("CrsMaint", None, self.doCrsMaint, 0,
                                    ("T", 0, 5), ("T", 0, 6)),
                    ("CrsQuery", None, self.doCrsQuery, 1, None,
                     None), ("StrMaint", None, self.doStrMaint, 0, ("C", 0, 1),
                             (("T", 0, 1), ("C", 0, 2))),
                    ("StrQuery", None, self.doStkQuery, 1, None,
                     None), ("Exit", None, self.doTopExit, 0, ("T", 0, 1),
                             (("T", 0, 2), ("T", 0, 3),
                              ("T", 0, 5)), "Exit Purchase Orders"),
                    ("Accept", None, self.doAccept, 0, ("C", 0, 1),
                     (("T", 0, 1), ("C", 0, 2))))
        tnd = ((self.doTopEnd, "n"), )
        txt = (self.doTopExit, )
        cnd = ((self.doColEnd, "n"), )
        cxt = (None, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               rows=self.row,
                               butt=self.but,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               vport=True)

    def doActTyp(self, frt, pag, r, c, p, i, w):
        # Initialise Action Variables
        self.acttyp = w
        # Initialise Variables
        self.dnum = ""
        self.onum = ""
        self.jnum = ""
        self.dadd = ""
        self.cnam = ""
        self.vatn = ""
        self.ribbon = None
        ctl = self.sql.getRec("ctlmst",
                              where=[("ctm_cono", "=", self.opts["conum"])],
                              limit=1)
        self.deladd = [
            ctl[self.sql.ctlmst_col.index("ctm_sadd1")],
            ctl[self.sql.ctlmst_col.index("ctm_sadd2")],
            ctl[self.sql.ctlmst_col.index("ctm_sadd3")],
            ctl[self.sql.ctlmst_col.index("ctm_spcode")]
        ]
        self.message = ""
        for x in (1, 2, 3):
            if self.acttyp == "R":
                self.df.butt[x][1] = 0
                self.df.butt[x][2] = None
            else:
                self.df.butt[x][1] = 1
                self.df.butt[x][2] = ["C", 0, 1]
        if self.acttyp == "N":
            # Location default
            if self.locs == "N":
                self.loc = "1"
                self.df.loadEntry(frt, pag, p + 2, data=self.loc)
                self.df.loadEntry(frt, pag, p + 3, data="Location One")
                return "sk3"
            return "sk1"

    def doOrdNum(self, frt, pag, r, c, p, i, w):
        strpom = self.sql.getRec("strpom",
                                 where=[("pom_cono", "=", self.opts["conum"]),
                                        ("pom_ordno", "=", w)],
                                 limit=1)
        if not strpom:
            return "Invalid Document"
        if strpom[self.sql.strpom_col.index("pom_delno")] == "cancel":
            if self.acttyp == "C":
                return "Already Cancelled"
            ok = askQuestion(
                self.opts["mf"].body,
                "Cancelled",
                "This order was Cancelled.\n\nDo you want to Reinstate It?",
                default="no")
            if ok == "no":
                return "Order Cancelled"
            self.sql.updRec("strpom",
                            cols=["pom_delno"],
                            data=[""],
                            where=[("pom_cono", "=", self.opts["conum"]),
                                   ("pom_ordno", "=", w)])
            strpom[self.sql.strpom_col.index("pom_delno")] = ""
        elif strpom[self.sql.strpom_col.index("pom_delno")]:
            return "Order Already Received"
        self.ordno = CCD(w, "UI", 9.0).work
        self.othno = CCD(w, "Na", 9.0).work
        self.loc = strpom[self.sql.strpom_col.index("pom_loc")]
        self.acno = strpom[self.sql.strpom_col.index("pom_acno")]
        self.cnam = strpom[self.sql.strpom_col.index("pom_contact")]
        self.vatn = strpom[self.sql.strpom_col.index("pom_vatno")]
        self.ordby = strpom[self.sql.strpom_col.index("pom_ordby")]
        self.ribbon = ["", "", self.cnam, self.vatn]
        self.df.loadEntry(frt, pag, p + 1, data=self.loc)
        self.doLoc(frt, pag, r, c + 1, p + 1, i + 1, self.loc)
        self.df.loadEntry(frt, pag, p + 3, data=self.acno)
        self.doCrsAcc(frt, pag, r, c + 3, p + 3, i + 3, self.acno)
        self.df.loadEntry(frt, pag, p + 5, data=self.ordby)
        self.doOrdBy(frt, pag, r, c + 5, p + 5, i + 5, self.ordby)
        if self.acttyp == "R":
            return "sk6"
        else:
            return "nd"

    def doLoc(self, frt, pag, r, c, p, i, w):
        desc = self.sql.getRec("strloc",
                               cols=["srl_desc"],
                               where=[("srl_cono", "=", self.opts["conum"]),
                                      ("srl_loc", "=", w)],
                               limit=1)
        if not desc:
            return "Invalid Location"
        self.loc = w
        self.df.loadEntry(frt, pag, p + 1, data=desc[0])

    def doCrsAcc(self, frt, pag, r, c, p, i, w):
        self.crsmst = self.sql.getRec("crsmst",
                                      where=[("crm_cono", "=",
                                              self.opts["conum"]),
                                             ("crm_acno", "=", w)],
                                      limit=1)
        if not self.crsmst:
            return "Invalid Account"
        if self.crsmst[self.sql.crsmst_col.index("crm_stat")] == "X":
            return "Invalid Account, Redundant"
        self.acno = w
        self.name = self.crsmst[self.sql.crsmst_col.index("crm_name")]
        self.df.loadEntry(frt, pag, p + 1, data=self.name)

    def doOrdBy(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("ctlrep",
                              cols=["rep_name"],
                              where=[("rep_cono", "=", self.opts["conum"]),
                                     ("rep_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Code"
        self.ordby = w
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        return "sk3"

    def doDelNum(self, frt, pag, r, c, p, i, w):
        self.delno = w

    def doDelDate(self, frt, pag, r, c, p, i, w):
        self.deldt = w

    def doTopEnd(self):
        if self.acttyp == "N":
            # Get and Display Next Document Number
            ordno = self.sql.getRec("strpom",
                                    cols=["max(pom_ordno)"],
                                    where=[("pom_cono", "=",
                                            self.opts["conum"])],
                                    limit=1)
            if not ordno[0]:
                self.ordno = CCD(1, "UI", 9).work
                self.othno = CCD(1, "Na", 9).work
            else:
                self.ordno = CCD((int(ordno[0]) + 1), "UI", 9).work
                self.othno = CCD((int(ordno[0]) + 1), "Na", 9).work
            self.df.loadEntry(self.df.frt, self.df.pag, 1, data=self.ordno)
            # Create Document Transaction (Head)
            self.dad1, self.dad2, self.dad3, self.dad4 = "", "", "", ""
            data = [
                self.opts["conum"], self.ordno, self.loc, self.trdt, self.acno,
                self.dad1, self.dad2, self.dad3, self.dad4, "", "", "", "",
                self.ordby, "", "", 0, self.opts["capnm"], self.sysdtw
            ]
            # Write and Commit Header
            self.sql.insRec("strpom", data=data)
            self.opts["mf"].dbm.commitDbase()
            # Clear Totals
            self.doClearTots()
        elif self.acttyp == "C":
            self.doReadLoadStr()
            ok = askQuestion(self.opts["mf"].body,
                             "Cancel",
                             "Are You Sure This Order Must be Cancelled?",
                             default="no")
            if ok == "yes":
                # Print Cancellation
                self.df.setWidget(self.df.mstFrame, state="hide")
                PrintOrder(self.opts["mf"],
                           self.opts["conum"],
                           self.opts["conam"],
                           self.ordno,
                           tname=self.tname,
                           repprt=self.pr.repprt,
                           repeml=self.pr.repeml,
                           copy=self.acttyp.lower())
                self.df.setWidget(self.df.mstFrame, state="show")
                # Update Deletetion
                self.sql.updRec("strpom",
                                cols=["pom_delno"],
                                data=["cancel"],
                                where=[("pom_cono", "=", self.opts["conum"]),
                                       ("pom_ordno", "=", self.ordno)])
                self.opts["mf"].dbm.commitDbase()
            # Clear totals and focus
            self.doClearTots()
            self.df.focusField("T", 0, 1)
        else:
            self.doReadLoadStr()
            self.amend = False

    def doReadLoadStr(self):
        self.doClearTots()
        data = self.sql.getRec("strpot",
                               where=[("pot_cono", "=", self.opts["conum"]),
                                      ("pot_ordno", "=", self.ordno)],
                               order="pot_group, pot_code")
        if not data:
            return
        for seq, line in enumerate(data):
            self.doExtData(line)
            if seq >= self.row[0]:
                self.df.scrollScreen(0)
                pos = (self.row[0] - 1) * 9
            else:
                pos = seq * 9
            # Load Values
            self.df.loadEntry("C", 0, pos, data=self.grp)
            self.df.loadEntry("C", 0, pos + 1, data=self.code)
            self.df.loadEntry("C", 0, pos + 2, data=self.desc)
            self.df.loadEntry("C", 0, pos + 3, data=self.qty)
            self.df.loadEntry("C", 0, pos + 5, data=self.vatcod)
            self.df.loadEntry("C", 0, pos + 6, data=self.price)
            self.df.loadEntry("C", 0, pos + 7, data=self.disrat)
            self.df.loadEntry("C", 0, pos + 8, data=self.excamt)
            self.vattot = float(ASD(self.vattot) + ASD(self.vatamt))
            self.ordtot = float(ASD(self.ordtot) + ASD(self.excamt))
            self.inctot = float(ASD(self.inctot) + ASD(self.incamt))
        if seq >= (self.row[0] - 1):
            self.df.scrollScreen(0)
        else:
            self.df.focusField("C", 0, pos + 10)
        self.df.setViewPort("O", self.inctot)

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

    def doClearTots(self):
        self.vattot = 0
        self.ordtot = 0
        self.inctot = 0
        self.df.clearFrame("C", 0)
        self.df.focusField("C", 0, 1)
        self.df.setViewPort(None, 0)

    def doGrp(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("strgrp",
                              where=[("gpm_cono", "=", self.opts["conum"]),
                                     ("gpm_group", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Group Code"
        self.grp = w

    def doCod(self, frt, pag, r, c, p, i, w):
        strmf1 = self.sql.getRec("strmf1",
                                 where=[("st1_cono", "=", self.opts["conum"]),
                                        ("st1_group", "=", self.grp),
                                        ("st1_code", "=", w)],
                                 limit=1)
        if not strmf1:
            return "Invalid Code"
        if strmf1[self.sql.strmf1_col.index("st1_type")] == "R":
            return "Invalid Code (Recipe)"
        if strmf1[self.sql.strmf1_col.index("st1_type")] == "X":
            return "Invalid Code (Redundant)"
        if strmf1[self.sql.strmf1_col.index("st1_value_ind")] == "N":
            return "Invalid Code (Value Indicator)"
        self.vatcod = strmf1[self.sql.strmf1_col.index("st1_vatcode")]
        strmf2 = self.sql.getRec("strmf2",
                                 where=[("st2_cono", "=", self.opts["conum"]),
                                        ("st2_group", "=", self.grp),
                                        ("st2_code", "=", w),
                                        ("st2_loc", "=", self.loc)],
                                 limit=1)
        if not strmf2:
            return "Invalid Location"
        odt = self.sql.getRec("strpot",
                              cols=["count(*)"],
                              where=[("pot_cono", "=", self.opts["conum"]),
                                     ("pot_ordno", "=", self.ordno),
                                     ("pot_group", "=", self.grp),
                                     ("pot_code", "=", w)],
                              limit=1)
        if odt[0]:
            return "This Item is Already On This Order"
        odq = self.sql.getRec(tables=["strpom", "strpot"],
                              cols=["sum(pot_qty)"],
                              where=[("pom_cono", "=", self.opts["conum"]),
                                     ("pom_loc", "=", self.loc),
                                     ("pom_delno", "=", ""),
                                     ("pot_cono", "=", self.opts["conum"]),
                                     ("pot_ordno=pom_ordno", ),
                                     ("pot_group", "=", self.grp),
                                     ("pot_code", "=", w)],
                              limit=1)
        if odq[0]:
            state = self.df.disableButtonsTags()
            cf = PwdConfirm(self.opts["mf"],
                            conum=self.opts["conum"],
                            system="STR",
                            code="DupOrd",
                            desc="%s of this Item is Already On Order" %
                            odq[0])
            self.df.enableButtonsTags(state=state)
            if cf.flag == "no":
                return "rf"
        self.code = w
        desc = strmf1[self.sql.strmf1_col.index("st1_desc")]
        self.uoi = strmf1[self.sql.strmf1_col.index("st1_uoi")]
        self.df.loadEntry(frt, pag, p + 1, data=desc)

    def doDes(self, frt, pag, r, c, p, i, w):
        self.desc = w

    def doQty(self, frt, pag, r, c, p, i, w):
        self.qty = w
        self.df.loadEntry(frt, pag, p + 1, data=self.vatcod)

    def doVat(self, frt, pag, r, c, p, i, w):
        self.vatrte = getVatRate(self.sql, self.opts["conum"], w, self.trdt)
        if self.vatrte is None:
            return "Invalid V.A.T Code"
        self.vatcod = w
        # Last Cost Price
        lcost = getCost(self.sql,
                        self.opts["conum"],
                        self.grp,
                        self.code,
                        loc=self.loc,
                        qty=1,
                        ind="L")
        self.df.loadEntry(frt, pag, p + 1, data=lcost)

    def doPri(self, frt, pag, r, c, p, i, w):
        self.price = w
        self.inc = round((self.price * (self.vatrte + 100.0) / 100.0), 4)
        self.exc = round((self.price * 1), 2)
        dis = self.crsmst[self.sql.crsmst_col.index("crm_trdis")]
        self.df.loadEntry(frt, pag, p + 1, data=dis)

    def doDis(self, frt, pag, r, c, p, i, w):
        self.disrat = w
        dis = float(ASD(100) - ASD(self.disrat))
        self.excamt = round((self.qty * self.exc * dis / 100.0), 2)
        self.incamt = round((self.qty * self.inc * dis / 100.0), 2)
        self.vatamt = float(ASD(self.incamt) - ASD(self.excamt))
        self.df.loadEntry(frt, pag, p + 1, data=self.excamt)
        self.vattot = float(ASD(self.vattot) + ASD(self.vatamt))
        self.ordtot = float(ASD(self.ordtot) + ASD(self.excamt))
        self.inctot = float(ASD(self.inctot) + ASD(self.incamt))
        self.df.setViewPort("O", self.inctot)

    def doColEnd(self):
        # Create Purchase Order Transaction (Body)
        data = [
            self.opts["conum"], self.ordno, self.grp, self.code, self.uoi,
            self.desc, self.qty, self.price, self.disrat, self.vatcod,
            self.vatrte, self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("strpot", data=data)
        if self.acttyp == "A":
            self.amend = True
        self.df.advanceLine(0)

    def doCrsQuery(self):
        callModule(self.opts["mf"],
                   self.df,
                   "cr4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])

    def doStkQuery(self):
        callModule(self.opts["mf"],
                   self.df,
                   "st4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=self.opts["period"],
                   user=self.opts["capnm"])

    def doDelAdd(self):
        tit = ("Delivery Address", )
        fld = ((("T", 0, 0, 0), "INA", 30, "Address-1", "Address Line 1", "",
                "N", None, None, None,
                None), (("T", 0, 1, 0), "INA", 30, "Address-2",
                        "Address Line 2", "", "N", None, None, None, None),
               (("T", 0, 2, 0), "INA", 30, "Address-3", "Address Line 3", "",
                "N", None, None, None, None),
               (("T", 0, 3, 0), "INA", 30, "Address-4", "Address Line 4", "",
                "N", None, None, None, None))
        state = self.df.disableButtonsTags()
        self.da = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doDelEnd, "n"), ),
                               txit=(self.doDelExit, ),
                               focus=False)
        for x in range(0, len(self.deladd)):
            self.da.loadEntry("T", 0, 0 + x, data=self.deladd[x])
        self.da.focusField("T", 0, 1, clr=False)
        self.da.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doDelEnd(self):
        self.deladd = []
        for x in range(0, self.da.topq[0]):
            self.deladd.append(self.da.t_work[0][0][x])
        self.doDelExit()

    def doDelExit(self):
        self.da.closeProcess()

    def doMessag(self):
        tit = ("Order Message", )
        cod = {
            "stype":
            "R",
            "tables": ("ctlmes", ),
            "cols": [("mss_message", "", 0, "Cod"),
                     ("mss_detail", "", 60, "Details")],
            "where": [("mss_system", "=", "STR")],
            "screen":
            self.df.mstFrame
        }
        fld = ((("T", 0, 0, 0), "IUI", 3, "Message Code", "", "", "N",
                self.doMesCod, cod, None, None),
               (("T", 0, 1, 0), "ITv", (30, 6), "Message", "", self.message,
                "N", None, None, None, None))
        but = (("Accept", None, self.doMesEnd, 0, ("T", 0, 1), ("T", 0, 0)), )
        state = self.df.disableButtonsTags()
        self.mg = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doMesEnd, "n"), ),
                               txit=(self.doMesExit, ),
                               butt=but)
        self.mg.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doMesCod(self, frt, pag, r, c, p, i, w):
        if w:
            mess = self.sql.getRec("ctlmes",
                                   where=[("mss_system", "=", "STR"),
                                          ("mss_message", "=", w)],
                                   limit=1)
            if not mess:
                return "Invalid Message Code"
            self.message = mess[self.sql.ctlmse_col.index("mss_detail")]
            self.mg.loadEntry(frt, pag, p + 1, data=self.message)

    def doMesEnd(self):
        wid, self.message = self.mg.getEntry("T", 0, 1)
        self.doMesExit()

    def doMesExit(self):
        self.mg.closeProcess()

    def doEdit(self):
        # Display document items and allow editing of desc, qty and price
        recs = self.sql.getRec("strpot",
                               where=[("pot_cono", "=", self.opts["conum"]),
                                      ("pot_ordno", "=", self.ordno)],
                               order="pot_group, pot_code")
        if recs:
            data = []
            for l in recs:
                qty = CCD(l[self.sql.strpot_col.index("pot_qty")], "SD", 11.2)
                prc = CCD(l[self.sql.strpot_col.index("pot_price")], "UD",
                          10.2)
                dis = CCD(l[self.sql.strpot_col.index("pot_disper")], "UD",
                          6.2)
                data.append([
                    l[self.sql.strpot_col.index("pot_group")],
                    l[self.sql.strpot_col.index("pot_code")],
                    l[self.sql.strpot_col.index("pot_desc")], qty.disp,
                    l[self.sql.strpot_col.index("pot_vatcod")], prc.disp,
                    dis.disp
                ])
            head = ("Grp", "Product-Code", "Description", "Quantity", "V",
                    "Price", "Disc-%")
            lin = {
                "stype":
                "C",
                "head":
                head,
                "typs": (("NA", 3), ("NA", 20), ("NA", 30), ("SD", 11.2),
                         ("UA", 1), ("UD", 10.2), ("UD", 6.2)),
                "data":
                data
            }
            state = self.df.disableButtonsTags()
            chg = self.df.selChoice(lin)
            if chg and chg.selection:
                self.change = chg.selection
                self.doChanges()
            self.df.enableButtonsTags(state=state)
        self.df.focusField("C", 0, self.df.col)

    def doChanges(self):
        tit = ("Change Items", )
        fld = ((("T", 0, 1, 0), "ONA", 3, "Group"), (("T", 0, 2, 0), "ONA", 20,
                                                     "Code"),
               (("T", 0, 3, 0), "INA", 30, "Description", "", "", "N",
                self.doChgDes, None, None, ("notblank", )),
               (("T", 0, 4, 0), "ISD", 11.2, "Quantity", "", "", "N",
                self.doChgQty, None, None, ("notzero", )),
               (("T", 0, 5, 0), "IUD", 10.2, "Selling Price", "", "", "N",
                self.doChgPrc, None, None, ("notzero", )),
               (("T", 0, 6, 0), "IUD", 6.2, "Discount Percent", "", "", "N",
                self.doChgDis, None, None, ("efld", )))
        but = (("Delete", None, self.doChgDel, 1, None, None), )
        tnd = ((self.doChgEnd, "n"), )
        txt = (self.doChgExit, )
        self.cg = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)
        self.cg.loadEntry("T", 0, 0, data=self.change[0])
        self.cg.loadEntry("T", 0, 1, data=self.change[1])
        self.cg.loadEntry("T", 0, 2, data=self.change[2])
        self.cg.loadEntry("T", 0, 3, data=self.change[3])
        self.cg.loadEntry("T", 0, 4, data=self.change[5])
        self.cg.loadEntry("T", 0, 5, data=self.change[6])
        self.cg.focusField("T", 0, 3, clr=False)
        self.cg.mstFrame.wait_window()

    def doChgDes(self, frt, pag, r, c, p, i, w):
        self.desc = w

    def doChgQty(self, frt, pag, r, c, p, i, w):
        self.qty = w

    def doChgPrc(self, frt, pag, r, c, p, i, w):
        self.price = w

    def doChgDis(self, frt, pag, r, c, p, i, w):
        self.disrat = w

    def doChgDel(self):
        grp = self.change[0]
        cod = self.change[1]
        self.sql.delRec("strpot",
                        where=[("pot_cono", "=", self.opts["conum"]),
                               ("pot_ordno", "=", self.ordno),
                               ("pot_group", "=", grp),
                               ("pot_code", "=", cod)])
        if self.acttyp == "A":
            self.amend = True
        self.doChgExit(loader=True)

    def doChgEnd(self):
        grp = self.change[0]
        cod = self.change[1]
        col = ["pot_desc", "pot_qty", "pot_price", "pot_disper"]
        dat = [self.desc, self.qty, self.price, self.disrat]
        whr = [("pot_cono", "=", self.opts["conum"]),
               ("pot_ordno", "=", self.ordno), ("pot_group", "=", grp),
               ("pot_code", "=", cod)]
        self.sql.updRec("strpot", cols=col, data=dat, where=whr)
        if self.acttyp == "A":
            self.amend = True
        self.doChgExit(loader=True)

    def doChgExit(self, loader=False):
        self.cg.closeProcess()
        if loader:
            self.doReadLoadStr()

    def doReprnt(self):
        tit = ("Reprint Orders", )
        odr = {
            "stype":
            "R",
            "tables": ("strpom", "crsmst"),
            "cols": [("pom_ordno", "", 0, "Doc-Num"),
                     ("pom_date", "", 0, "Date"),
                     ("pom_acno", "", 0, "Acc-Num"),
                     ("crm_name", "", 0, "Name", "Y")],
            "where": [("pom_cono", "=", self.opts["conum"]),
                      ("pom_cono=crm_cono", ), ("pom_acno=crm_acno", )],
            "screen":
            self.opts["mf"].body
        }
        r1s = (("Copies", "C"), ("Originals", "O"))
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "Document Mode", "", "C", "N",
                self.doMode, None, None, None),
               (("T", 0, 1, 0), "IUI", 9, "From Number",
                "From Document Number", "", "N", self.doOrd, odr, None,
                ("notzero", )), [("T", 0, 2, 0), "IUI", 9, "To   Number",
                                 "To Document Number", "", "N", None, odr,
                                 None, ("notzero", )])
        state = self.df.disableButtonsTags()
        self.rp = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doReprntEnd, "n"), ),
                               txit=(self.doReprntExit, ),
                               view=("N", "V"),
                               mail=("B", "Y"))
        self.rp.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doMode(self, frt, pag, r, c, p, i, w):
        if w == "C":
            self.copy = "y"
        else:
            self.copy = "n"

    def doOrd(self, frt, pag, r, c, p, i, w):
        self.rp.topf[pag][2][5] = w

    def doReprntEnd(self):
        self.rp.closeProcess()
        self.df.setWidget(self.df.mstFrame, state="hide")
        frm = self.rp.t_work[0][0][1]
        if not self.rp.t_work[0][0][2]:
            to = frm
        else:
            to = self.rp.t_work[0][0][2]
        odr = self.sql.getRec("strpom",
                              cols=["pom_ordno"],
                              where=[("pom_cono", "=", self.opts["conum"]),
                                     ("pom_ordno", ">=", frm),
                                     ("pom_ordno", "<=", to)])
        if odr:
            PrintOrder(self.opts["mf"],
                       self.opts["conum"],
                       self.opts["conam"],
                       odr,
                       tname=self.tname,
                       repprt=self.rp.repprt,
                       repeml=self.rp.repeml,
                       copy=self.copy)
        self.df.setWidget(self.df.mstFrame, state="show")

    def doReprntExit(self):
        self.rp.closeProcess()

    def doCrsMaint(self):
        state = self.df.disableButtonsTags()
        cf = PwdConfirm(self.opts["mf"],
                        conum=self.opts["conum"],
                        system="STR",
                        code="NewCrs")
        if cf.flag == "yes":
            callModule(self.opts["mf"],
                       self.df,
                       "cr1010",
                       coy=(self.opts["conum"], self.opts["conam"]),
                       period=None,
                       user=self.opts["capnm"])
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doStrMaint(self):
        state = self.df.disableButtonsTags()
        cf = PwdConfirm(self.opts["mf"],
                        conum=self.opts["conum"],
                        system="STR",
                        code="NewStr")
        if cf.flag == "yes":
            callModule(self.opts["mf"],
                       self.df,
                       "st1010",
                       coy=(self.opts["conum"], self.opts["conam"]),
                       period=None,
                       user=self.opts["capnm"])
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doAccept(self):
        self.df.setWidget(self.df.B11, "disabled")
        if self.df.col == 1:
            self.doCancel()
        else:
            # Update Tables
            self.doUpdateTables()
            # Commit Transaction
            self.opts["mf"].dbm.commitDbase()
            # Print Document
            if self.acttyp == "N" or (self.acttyp == "A" and self.amend):
                self.df.setWidget(self.df.mstFrame, state="hide")
                PrintOrder(self.opts["mf"],
                           self.opts["conum"],
                           self.opts["conam"],
                           self.ordno,
                           tname=self.tname,
                           repprt=self.pr.repprt,
                           repeml=self.pr.repeml,
                           copy=self.acttyp.lower())
                self.df.setWidget(self.df.mstFrame, state="show")
            self.df.focusField("T", 0, 1)

    def doRibbon(self):
        tit = ("Ribbon Line", )
        fld = ((("T", 0, 0, 0), "INA", 30, "Customer Order", "", self.cnam,
                "N", None, None, None, None),
               (("T", 0, 1,
                 0), "INA", 30, "Job Number", "", self.cnam, "N", None, None,
                None, None), (("T", 0, 2, 0), "INA", 30, "Contact Person", "",
                              self.cnam, "N", None, None, None, None),
               (("T", 0, 3, 0), "INA", 10, "VAT Number", "", self.vatn, "N",
                self.doVatNum, None, None, None))
        state = self.df.disableButtonsTags()
        self.rb = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doRibEnd, "n"), ),
                               txit=(self.doRibExit, ),
                               focus=False)
        if self.ribbon:
            self.rb.loadEntry("T", 0, 0, data=self.ribbon[0])
            self.rb.loadEntry("T", 0, 1, data=self.ribbon[1])
            self.rb.loadEntry("T", 0, 2, data=self.ribbon[2])
            self.rb.loadEntry("T", 0, 3, data=self.ribbon[3])
        self.rb.focusField("T", 0, 1)
        self.rb.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doVatNum(self, frt, pag, r, c, p, i, w):
        if self.ordtot >= 1000.00 and not w:
            return "Invalid VAT Number"

    def doRibEnd(self):
        self.ribbon = []
        for x in range(0, self.rb.topq[0]):
            self.ribbon.append(self.rb.t_work[0][0][x])
        self.doRibExit()

    def doRibExit(self):
        self.rb.closeProcess()

    def doUpdateTables(self):
        # Update strpom with ribbon, delivery and message details
        whr = [("pom_cono", "=", self.opts["conum"]),
               ("pom_ordno", "=", self.ordno), ("pom_acno", "=", self.acno)]
        if self.ribbon:
            self.sql.updRec(
                "strpom",
                cols=["pom_cusord", "pom_jobnum", "pom_contact", "pom_vatno"],
                data=[
                    self.ribbon[0], self.ribbon[1], self.ribbon[2],
                    self.ribbon[3]
                ],
                where=whr)
            if not self.vatn:
                self.sql.updRec("crsmst",
                                cols=["crm_vatno"],
                                data=[self.ribbon[1]],
                                where=[("crm_cono", "=", self.opts["conum"]),
                                       ("crm_acno", "=", self.acno)])
        if self.deladd:
            self.sql.updRec(
                "strpom",
                cols=["pom_add1", "pom_add2", "pom_add3", "pom_add4"],
                data=[
                    self.deladd[0], self.deladd[1], self.deladd[2],
                    self.deladd[3]
                ],
                where=whr)
        if self.message:
            self.sql.updRec("strpom",
                            cols=["pom_mess"],
                            data=[self.message],
                            where=whr)
        if self.acttyp != "R":
            return
        # Receipt of Order
        # Create Stores Transactions and update strpot lines
        trn = self.sql.getRec("strpot",
                              where=[("pot_cono", "=", self.opts["conum"]),
                                     ("pot_ordno", "=", self.ordno)],
                              order="pot_group, pot_code")
        if not trn:
            return
        for line in trn:
            self.doExtData(line)
            curdt = int(self.deldt / 100)
            # Update strpom record
            self.sql.updRec("strpom",
                            cols=["pom_delno", "pom_deldt"],
                            data=[self.delno, self.deldt],
                            where=[("pom_cono", "=", self.opts["conum"]),
                                   ("pom_ordno", "=", self.ordno)])
            # Write strtrn record
            data = [
                self.opts["conum"], self.grp, self.code, self.loc, self.deldt,
                1, self.othno, self.batch, self.delno, self.qty, self.excamt,
                0, curdt, self.name, 0, self.acno, "", "STR", self.disrat, "",
                self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("strtrn", data=data)
            # If Integrated Create GL Transaction (SOH and Recon Accounts)
            if self.stgl == "Y" and self.excamt:
                # Stock on Hand Control
                data = (self.opts["conum"], self.soh, curdt, self.deldt, 5,
                        self.othno, self.batch, self.excamt, 0, self.name, "",
                        "", 0, self.opts["capnm"], self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)
                cst = float(ASD(0) - ASD(self.excamt))
                # Stock Reconciliation Control
                data = (self.opts["conum"], self.ssp, curdt, self.deldt, 5,
                        self.othno, self.batch, cst, 0, self.name, "", "", 0,
                        self.opts["capnm"], self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)

    def doExtData(self, line):
        self.grp = line[self.sql.strpot_col.index("pot_group")]
        self.code = line[self.sql.strpot_col.index("pot_code")]
        self.uoi = line[self.sql.strpot_col.index("pot_uoi")]
        self.desc = line[self.sql.strpot_col.index("pot_desc")]
        self.qty = line[self.sql.strpot_col.index("pot_qty")]
        self.price = line[self.sql.strpot_col.index("pot_price")]
        self.disrat = line[self.sql.strpot_col.index("pot_disper")]
        self.vatcod = line[self.sql.strpot_col.index("pot_vatcod")]
        self.vatrte = line[self.sql.strpot_col.index("pot_vatrat")]
        # Calculate Values
        rat = float(ASD(100) + ASD(self.vatrte))
        inc = round((self.price * rat / 100.0), 4)
        exc = round((self.price * 1), 2)
        dis = float(ASD(100) - ASD(self.disrat))
        self.excamt = round((self.qty * exc * dis / 100.0), 2)
        self.incamt = round((self.qty * inc * dis / 100.0), 2)
        self.vatamt = float(ASD(self.incamt) - ASD(self.excamt))

    def doCancel(self):
        self.opts["mf"].dbm.rollbackDbase()
        if self.acttyp == "N":
            self.sql.updRec("strpom",
                            cols=["pom_delno"],
                            data=["cancel"],
                            where=[("pom_cono", "=", self.opts["conum"]),
                                   ("pom_ordno", "=", self.ordno),
                                   ("pom_acno", "=", self.acno)])
            self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)
Пример #9
0
class cr2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        # Check for Valid Posting Routine
        if self.opts["rtn"] not in (1, 2, 3, 4, 5):
            showError(self.opts["mf"].body, "Control Error",
                "Invalid Routine %s, Only 1 - 5 Are Allowed" % \
                str(self.opts["rtn"]))
            return
        # Create SQL Object
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlmst", "ctlvmf", "ctlvrf", "ctlvtf", "crsmst", "crstrn",
            "genint", "genmst", "gentrn", "lonmf1", "lonmf2", "lonrte",
            "lontrn", "wagedc", "wagmst", "waglmf", "wagltf"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        # Check for Company record
        self.gc = GetCtl(self.opts["mf"])
        self.allcoy = self.opts["conum"]
        self.allnam = self.opts["conam"]
        ctlmst = self.gc.getCtl("ctlmst", self.allcoy)
        if not ctlmst:
            return
        self.taxdf = ctlmst["ctm_taxdf"]
        # Check for Intercompany Facility
        if not self.sql.getRec("ctlmst",
                               cols=["count(*)"],
                               where=[("ctm_cono", "<>", self.opts["conum"])],
                               limit=1)[0]:
            self.incoac = False
        else:
            rec = self.sql.getRec("genint",
                                  cols=["cti_inco"],
                                  where=[("cti_cono", "=", self.opts["conum"])
                                         ])
            if rec:
                self.incoac = [self.opts["conum"]]
                [self.incoac.append(coy[0]) for coy in rec]
            else:
                self.incoac = False
        # Get Enabled Modules
        self.lonmod = False
        self.lonpag = None
        self.slnmod = False
        self.slnpag = None
        for x in range(0, len(ctlmst["ctm_modules"].rstrip()), 2):
            if ctlmst["ctm_modules"][x:x + 2] == "LN":
                self.lonmod = True
            elif ctlmst["ctm_modules"][x:x + 2] == "SL":
                self.slnmod = True
        # Rest of Controls
        crsctl = self.gc.getCtl("crsctl", self.opts["conum"])
        if not crsctl:
            return
        self.glint = crsctl["ctc_glint"]
        self.glinp = crsctl["ctc_glinp"]
        if self.glint == "Y":
            self.ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not self.ctlctl:
                return
            ctls = ["crs_ctl", "vat_ctl", "dis_rec"]
            if self.gc.chkRec(self.opts["conum"], self.ctlctl, ctls):
                return
            self.crsctl = self.ctlctl["crs_ctl"]
            self.disrec = self.ctlctl["dis_rec"]
        # Batch Header
        self.batchHeader()
        if not self.bh.batno:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        if self.opts["rtn"] == 1:
            self.glt = 5
        elif self.opts["rtn"] == 2:
            self.glt = 6
        elif self.opts["rtn"] == 3:
            self.glt = 4
        elif self.opts["rtn"] == 4:
            self.glt = 5
        elif self.opts["rtn"] == 5:
            self.glt = 2
        self.agevar = tk.BooleanVar()
        self.othvar = tk.BooleanVar()
        self.agevar.set(False)
        self.othvar.set(False)
        return True

    def batchHeader(self):
        self.bh = Batches(self.opts["mf"],
                          self.opts["conum"],
                          self.opts["conam"],
                          self.opts["period"],
                          "CRS",
                          self.opts["rtn"],
                          glint=self.glint)
        self.bh.doBatchHeader()
        if not self.bh.batno:
            return

    def drawDialog(self):
        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")]
        }
        coy = {
            "stype": "R",
            "tables": ("ctlmst", ),
            "cols":
            (("ctm_cono", "", 0, "Coy"), ("ctm_name", "", 0, "Name", "Y"))
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "whera": [("C", "glm_cono", 0, 2)]
        }
        vtm = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "C"), ("vtm_desc", "", 0,
                                                "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        if self.opts["rtn"] in (1, 4) and self.lonmod:
            lm1 = {
                "stype":
                "R",
                "tables": ("lonmf1", ),
                "cols": (("lm1_acno", "", 0, "Acc-Num"), ("lm1_name", "", 0,
                                                          "Name", "Y")),
                "whera": [("C", "lm1_cono", 0, 2)]
            }
            lm2 = {
                "stype":
                "R",
                "tables": ("lonmf2", ),
                "cols": (("lm2_loan", "", 0, "Ln"), ("lm2_desc", "", 0,
                                                     "Description", "Y")),
                "whera": [("C", "lm2_cono", 0, 2), ("C", "lm2_acno", 0)]
            }
        if self.opts["rtn"] in (1, 4) and self.slnmod:
            wgm = {
                "stype":
                "R",
                "tables": ("wagmst", ),
                "cols": (("wgm_empno", "", 0, "EmpNo"), ("wgm_sname", "", 0,
                                                         "Surname", "Y"),
                         ("wgm_fname", "", 0, "Names")),
                "whera": [("C", "wgm_cono", 0, 2)]
            }
            lnm = {
                "stype":
                "R",
                "tables": ("waglmf", ),
                "cols": (("wlm_loan", "", 0, "Ln"), ("wlm_desc", "", 0,
                                                     "Description", "Y")),
                "where": [("wlm_cono", "=", self.opts["conum"])],
                "whera": [("C", "wgm_cono", 0, 2), ("C", "wlm_empno", 0)]
            }
            ced = {
                "stype":
                "R",
                "tables": ("wagedc", ),
                "cols": (("ced_type", "", 0, "T"), ("ced_code", "", 0, "Cde"),
                         ("ced_desc", "", 0, "Description", "Y")),
                "where": [("ced_type", "=", "D")],
                "whera": [("C", "wgm_cono", 0, 2)],
                "index":
                1
            }
        viw = {
            "stype":
            "R",
            "tables": ("crstrn", ),
            "cols": (("crt_acno", "", 0, ""), ("crt_ref1", "", 0, ""),
                     ("crt_trdt", "", 0, ""), ("crt_tramt", "", 0,
                                               ""), ("crt_taxamt", "", 0, "")),
            "where": [("crt_cono", "=", self.opts["conum"]),
                      ("crt_type", "=", self.opts["rtn"]),
                      ("crt_batch", "=", self.bh.batno)],
            "order":
            "crt_seq",
            "comnd":
            self.doView
        }
        fld = [(("T", 0, 0, 0), "OUI", 9, "Batch %s Quantity" % self.bh.batno),
               (("T", 0, 0, 0), "OSD", 13.2, "Value"),
               (("C", 1, 0, 0), "INA", 7, "Acc-Num", "Account Number", "r",
                "Y", self.doCrsAcc, crm, None, None),
               [("C", 1, 0, 1), "ONA", 10, "Name"],
               (("C", 1, 0, 2), "INa", 9, "Reference", "Reference Number One",
                "i", "N", self.doRef1, None, None, ("notblank", )),
               (("C", 1, 0, 3), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 4), "ISD", 13.2, "Amount", "Transaction Amount",
                "", "N", self.doTrnAmt, None, None, None)]
        if self.opts["rtn"] in (2, 5):
            fld[3][2] = 22
            fld.extend([
                (("C", 1, 0, 5), "ISD", 13.2, "Discount", "Discount Amount",
                 "", "N", self.doDisAmt, None, None, None, None,
                 "Discount Amount to be Added to the Transaction Amount."),
                (("C", 1, 0, 6), "OSD", 13.2, "Total-Amount"),
                [("C", 1, 0, 7), "INA", (22, 30), "Details",
                 "Transaction Details", "", "N", self.doTrnDet, None, None,
                 None]
            ])
        elif self.glint == "Y":
            if self.glinp == "E":
                tx1 = "Exc-Amount"
                tx2 = "Exclusive Amount"
            else:
                tx1 = "Inc-Amount"
                tx2 = "Inclusive Amount"
            fld[3][2] = 30
            fld.extend([(("C", 1, 0, 5), "INA", (27, 30), "Details",
                         "Transaction Details", "", "N", self.doTrnDet, None,
                         None, None),
                        [("T", 2, 0, 0), "OSD", 13.2, "Unallocated Balance"],
                        [("C", 2, 0, 0), "IUI", 3, "Coy", "Company Number",
                         self.opts["conum"], "N", self.doCoyNum, coy, None,
                         None],
                        (("C", 2, 0, 1), "IUI", 7, "Acc-Num", "Account Number",
                         "", "N", self.doGenAcc, glm, None, None),
                        (("C", 2, 0, 2), "ONA", 19, "Description"),
                        (("C", 2, 0, 3), "IUA", 1, "V", "V.A.T Code", "", "N",
                         self.doVatCode2, vtm, None, ("notblank", )),
                        (("C", 2, 0, 4), "ISD", 13.2, tx1, tx2, "", "N",
                         self.doAllAmt, None, None, ("efld", )),
                        (("C", 2, 0, 5), "ISD", 13.2, "V.A.T", "V.A.T Amount",
                         "", "N", self.doAllVat, None, None, None),
                        (("C", 2, 0, 6), "INA", (26, 30), "Details", "",
                         "", "N", self.doAllDet, None, None, ("notblank", ))])
            if not self.incoac:
                fld[9][1] = "OUI"
            nxt = 3
            if self.opts["rtn"] in (1, 4) and self.lonmod:
                fld.extend([
                    (("T", nxt, 0, 0), "OSD", 13.2, "Unallocated Balance"),
                    (("C", nxt, 0, 0), "IUA", 7, "Acc-Num", "Account Number",
                     0, "N", self.doLonAcc, lm1, None, None),
                    (("C", nxt, 0, 1), "ONA", 30, "Name"),
                    (("C", nxt, 0, 2), "IUI", 2, "Ln", "Loan Number", "", "N",
                     self.doLonNum, lm2, None, None),
                    (("C", nxt, 0, 3), "INA", 30, "Description", "", "", "N",
                     self.doLonDes, None, None, ("notblank", )),
                    (("C", nxt, 0, 4), "ISD", 13.2, "Amount", "", "", "N",
                     self.doLonAmt, None, None, ("efld", )),
                    (("C", nxt, 0, 5), "IUD", 6.2, "DRte-%", "Debit Rate", "",
                     "N", self.doLonDri, None, None, None),
                    (("C", nxt, 0, 6), "IUD", 6.2, "CRte-%", "Credit Rate", "",
                     "N", self.doLonDri, None, None, None),
                    (("C", nxt, 0, 7), "IUI", 3, "Mth", "Period in Months", "",
                     "N", self.doLonMth, None, None, ("efld", )),
                    (("C", nxt, 0, 8), "OUD", 12.2, "Repayment")
                ])
                self.lonpag = nxt
                nxt += 1
            if self.opts["rtn"] in (1, 4) and self.slnmod:
                fld.extend([
                    (("T", nxt, 0, 0), "OSD", 13.2, "Unallocated Balance"),
                    (("C", nxt, 0, 0), "IUI", 5, "EmpNo", "Employee Number", 0,
                     "N", self.doEmpNum, wgm, None, None),
                    (("C", nxt, 0, 1), "ONA", 20, "Name"),
                    (("C", nxt, 0, 2), "IUI", 2, "Ln", "Loan Number", "", "N",
                     self.doSlnNum, lnm, None, None),
                    (("C", nxt, 0, 3), "INA", 20, "Description", "", "", "N",
                     self.doSlnDes, None, None, ("notblank", )),
                    (("C", nxt, 0, 4), "ISD", 13.2, "Amount", "", "", "N",
                     self.doSlnAmt, None, None, ("efld", )),
                    (("C", nxt, 0, 5), "IUI", 3, "Cde", "Deduction Code", "",
                     "N", self.doSlnCod, ced, None, ("efld", )),
                    (("C", nxt, 0, 6), "ONA", 20, "Description"),
                    (("C", nxt, 0, 7), "IUD", 6.2, "Intr-%", "Interest Rate",
                     "", "N", self.doSlnInt, None, None, None),
                    (("C", nxt, 0,
                      8), "IUD", 13.2, "Ded-Amt", "Deduction Amount", "", "N",
                     self.doSlnDed, None, None, ("efld", ))
                ])
                self.slnpag = nxt
        else:
            fld[3][2] = 20
            fld.extend([(("C", 1, 0,
                          5), "IUA", 1, "V", "V.A.T Code", self.taxdf, "N",
                         self.doVatCode1, vtm, None, ("notblank", )),
                        (("C", 1, 0, 6), "ISD", 13.2, "V.A.T", "V.A.T Amount",
                         "", "N", self.doVatAmt, None, None, None),
                        [("C", 1, 0, 7), "INA", (18, 30), "Details",
                         "Transaction Details", "", "N", self.doTrnDet, None,
                         None, None]])
        but = (
            ("Interrogate",None,self.queryCrs,0,("C",1,1),("C",1,2),
                "Interrogate Creditors Records",1),
            ("View Entries",viw,None,0,("C",1,1),("C",1,2),
                "View Batch Transactions",1),
            ("Maintain",None,self.maintainCrs,0,("C",1,1),("C",1,2),
                "Maintain Creditors Records",1),
            ("Canc_el",None,self.doCancel,0,("C",2,1),("C",1,1),
                "Cancel the Entry",1),
            ("Age _Normal",None,self.doAgeNormal,0,None,None,
                "Only Show Unallocated Transactions",2),
            ("Age _History",None,self.doAgeHistory,0,None,None,
                "Show All Transactions Including Already Allocated",2),
            ("Age _Automatic",None,self.doAgeAuto,0,None,None,
                "Automatically Allocate the Amount Starting With the "\
                "Oldest Unallocated Transaction",2),
            ("Age _Current",None,self.doAgeCurrent,0,None,None,
                "Leave the Transaction Unallocated",2))
        tag = [("Transaction", None, None, None, False)]
        cnd = [(None, "n"), (self.endPage1, "y")]
        cxt = [None, self.exitPage1]
        if self.opts["rtn"] not in (2, 5) and self.glint == "Y":
            tag.append(("Allocation", None, None, None, False))
            cnd.append((self.endPage2, "y"))
            cxt.append(self.exitPage2)
            if self.opts["rtn"] in (1, 4) and self.lonmod:
                tag.append(("LON", None, None, None, False))
                cnd.append((self.endLon, "y"))
                cxt.append(self.exitLon)
            if self.opts["rtn"] in (1, 4) and self.slnmod:
                tag.append(("SLN", None, None, None, False))
                cnd.append((self.endSln, "y"))
                cxt.append(self.exitSln)
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tags=tag,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)
        self.df.focusField("C", 1, 1)

    def doView(self, *event):
        self.df.focusField("C", 1, 1)

    def doCrsAcc(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("crsmst",
                              cols=[
                                  "crm_name", "crm_terms", "crm_vatno",
                                  "crm_termsb", "crm_stday", "crm_pydis",
                                  "crm_glac", "crm_stat"
                              ],
                              where=[("crm_cono", "=", self.opts["conum"]),
                                     ("crm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        if acc[7] == "X":
            return "Invalid Account, Redundant"
        self.cracno = w
        self.name = acc[0]
        self.term = acc[1]
        self.vatn = acc[2]
        self.base = acc[3]
        self.stdt = acc[4]
        self.pdis = acc[5]
        self.glac = acc[6]
        self.popv = False
        self.df.loadEntry(frt, pag, p + 1, data=self.name)

    def doRef1(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("crstrn",
                              cols=["crt_batch"],
                              where=[("crt_cono", "=", self.opts["conum"]),
                                     ("crt_acno", "=", self.cracno),
                                     ("crt_type", "=", self.opts["rtn"]),
                                     ("crt_ref1", "=", w)],
                              limit=1)
        if acc:
            return "Transaction Already Exists"
        self.trnref = w

    def doTrnDat(self, frt, pag, r, c, p, i, w):
        if w < self.opts["period"][1][0] or w > self.opts["period"][2][0]:
            return "Invalid Date, Not in Financial Period"
        if self.bh.multi == "N" and int(w / 100) > self.bh.curdt:
            return "Invalid Date, After Batch Period"
        self.trndat = w

    def doTrnAmt(self, frt, pag, r, c, p, i, w):
        self.trnamt = w
        if self.glint == "Y" or self.opts["rtn"] in (2, 5):
            self.vatcode = "N"
            self.vatamt = 0
        if self.opts["rtn"] not in (2, 5) and self.glint == "N":
            if not self.vatn:
                self.df.loadEntry(frt, pag, p + 1, data="N")
            else:
                self.df.loadEntry(frt, pag, p + 1, data=self.taxdf)

    def doVatCode1(self, frt, pag, r, c, p, i, w):
        vrte = getVatRate(self.sql, self.opts["conum"], w, self.trndat)
        if vrte is None:
            return "Invalid V.A.T Code"
        if vrte and not self.vatn:
            ok = askQuestion(self.opts["mf"].window, "VAT Number",
                "This Account Does Not Have a VAT Number.\n\nMust "\
                "it be Populated?", default="yes")
            if ok == "yes":
                self.vatn = w
                self.popv = True
        self.vatcode = w
        self.vatamt = round((self.trnamt * vrte / (vrte + 100)), 2)
        self.df.loadEntry(frt, pag, p + 1, data=self.vatamt)
        if not self.vatamt:
            return "sk1"

    def doVatAmt(self, frt, pag, r, c, p, i, w):
        if self.trnamt < 0 and w > 0:
            self.vatamt = float(ASD(0) - ASD(w))
        elif self.trnamt > 0 and w < 0:
            self.vatamt = float(ASD(0) - ASD(w))
        else:
            self.vatamt = w
        self.df.loadEntry(frt, pag, p, data=self.vatamt)

    def doDisAmt(self, frt, pag, r, c, p, i, w):
        if self.trnamt < 0 and w > 0:
            self.disamt = float(ASD(0) - ASD(w))
        elif self.trnamt > 0 and w < 0:
            self.disamt = float(ASD(0) - ASD(w))
        else:
            self.disamt = w
        self.df.loadEntry(frt, pag, p, data=self.disamt)
        totamt = float(ASD(self.trnamt) + ASD(self.disamt))
        self.df.loadEntry(frt, pag, p + 1, data=totamt)

    def doTrnDet(self, frt, pag, r, c, p, i, w):
        self.trndet = w
        if self.opts["rtn"] not in (2, 5) and self.glint == "Y":
            self.df.colf[2][6][5] = w
        self.allocated = float(0.00)

    def endPage1(self):
        self.cancel = False
        self.agecan = False
        self.batupd = False
        self.updateTables1()
        if self.cancel:
            return
        else:
            self.updateBatch()
            if self.trnamt == 0:
                self.df.advanceLine(1)
            else:
                self.allocated = float(0.0)
                if self.opts["rtn"] in (2, 5) or self.glint == "N":
                    self.doCrsTrn()
                    self.opts["mf"].dbm.commitDbase()
                    self.df.selPage("Transaction")
                    self.df.advanceLine(1)
                else:
                    self.df.selPage("Allocation")
                    self.df.loadEntry("T", 2, 0, data=self.trnamt)
                    self.df.focusField("C", 2, 1)

    def updateTables1(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trndat / 100)
        else:
            self.curdt = self.bh.curdt
        self.amt = self.trnamt
        self.vat = self.vatamt
        if self.opts["rtn"] == 1:  # Invoices
            self.recon = 0
            self.dis = 0.00
            self.per = self.pdis
        elif self.opts["rtn"] == 2:  # Receipts
            if self.trnamt == 0:
                self.recon = self.curdt
            else:
                self.recon = 0
            self.vat = 0.00
            self.dis = self.disamt
            self.per = 0.00
        elif self.opts["rtn"] == 3:  # Journals
            self.recon = 0
            self.dis = 0.00
            self.per = 0.00
        elif self.opts["rtn"] == 4:  # Credit Notes
            self.recon = 0
            self.amt = float(ASD(0) - ASD(self.amt))
            self.vat = float(ASD(0) - ASD(self.vat))
            self.dis = 0.00
            self.per = self.pdis
        elif self.opts["rtn"] == 5:  # Payments
            if self.trnamt == 0:
                self.recon = self.curdt
            else:
                self.recon = 0
            self.amt = float(ASD(0) - ASD(self.amt))
            self.vat = 0.00
            self.dis = float(ASD(0) - ASD(self.disamt))
            self.per = 0.00
        if self.opts["rtn"] == 1:
            self.doAgeCurrent()
        else:
            state = self.df.disableButtonsTags()
            self.opts["mf"].updateStatus("Choose an Ageing Option")
            for x in range(4, 8):
                if self.opts["rtn"] == 3 and x == 6:
                    continue
                wid = getattr(self.df, "B%s" % x)
                self.df.setWidget(wid, "normal")
            self.df.setWidget(self.df.B4, "focus")
            self.agevar.set(True)
            self.df.mstFrame.wait_variable(self.agevar)
            self.df.enableButtonsTags(state=state)
            if self.agecan:
                self.doCancel()
                return
        if self.glint == "N":
            return
        # General Ledger Control Transaction (Creditors)
        val = float(ASD(0) - ASD(self.amt) - ASD(self.dis))
        data = (self.opts["conum"], self.crsctl, self.curdt, self.trndat,
                self.glt, self.trnref, self.bh.batno, val, 0.00, self.trndet,
                "N", "", self.recon, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        # General Ledger Control Transaction (Bank)
        if self.opts["rtn"] in (2, 5):
            data = (self.opts["conum"], self.bh.acc, self.curdt, self.trndat,
                    self.glt, self.trnref, self.bh.batno, self.amt, 0.00,
                    self.trndet, "N", "", self.recon, self.opts["capnm"],
                    self.sysdtw, 0)
            self.sql.insRec("gentrn", data=data)
            # General Ledger Control Transaction (Discount)
            if self.dis:
                data = (self.opts["conum"], self.disrec, self.curdt,
                        self.trndat, self.glt, self.trnref, self.bh.batno,
                        self.dis, 0.00, self.trndet, "N", "", self.recon,
                        self.opts["capnm"], self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)

    def doAgeNormal(self):
        self.doAgeing("N")

    def doAgeHistory(self):
        self.doAgeing("H")

    def doAgeAuto(self):
        self.doAgeing("O")

    def doAgeCurrent(self):
        self.doAgeing("C")

    def doAgeing(self, atype):
        # Disable All Ageing Buttons
        for x in range(4, 8):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, "disabled")
        self.opts["mf"].updateStatus("Select Transaction to Allocate Against")
        age = AgeAll(self.opts["mf"],
                     system="crs",
                     agetyp=atype,
                     agekey=[
                         self.opts["conum"], self.cracno, self.opts["rtn"],
                         self.trnref, self.curdt, self.amt, self.dis
                     ])
        self.agecan = age.cancel
        if self.agevar.get():
            self.agevar.set(False)

    def exitPage1(self):
        self.df.closeProcess()
        self.bh.doBatchTotal()
        self.opts["mf"].closeLoop()

    def doCoyNum(self, frt, pag, r, c, p, i, w):
        nam = self.sql.getRec("ctlmst",
                              cols=["ctm_name"],
                              where=[("ctm_cono", "=", w)],
                              limit=1)
        if not nam:
            return "Invalid Company, Missing"
        if self.incoac and w not in self.incoac:
            return "Invalid Company, No Intercompany Record 1"
        if w != self.opts["conum"]:
            acc = self.sql.getRec("genint",
                                  where=[("cti_cono", "=", w),
                                         ("cti_inco", "=", self.opts["conum"])
                                         ],
                                  limit=1)
            if not acc:
                return "Invalid Company, No Intercompany Record 2"
        self.ctlctl = self.gc.getCtl("ctlctl", w)
        if not self.ctlctl:
            return "rf"
        self.allcoy = w
        self.allnam = nam[0]
        self.df.loadEntry(frt, pag, p + 1, data=self.glac)

    def doGenAcc(self, frt, pag, r, c, p, i, w):
        ctl = True
        self.loan = False
        if "lon_ctl" in self.ctlctl and w == self.ctlctl["lon_ctl"]:
            self.loan = "other"
        elif "wag_slc" in self.ctlctl and w == self.ctlctl["wag_slc"]:
            self.loan = "staff"
        if self.loan:
            ctl = False
        chk = chkGenAcc(self.opts["mf"], self.allcoy, w, ctl=ctl)
        if type(chk) is str:
            return chk
        if not self.vatn:
            self.taxgl = "N"
        elif not chk[2]:
            self.taxgl = self.taxdf
        else:
            self.taxgl = chk[2]
        self.genacc = w
        self.df.loadEntry(frt, pag, p + 1, data=chk[0])
        self.df.loadEntry(frt, pag, p + 2, data=self.taxgl)

    def doVatCode2(self, frt, pag, r, c, p, i, w):
        ctlctl = self.gc.getCtl("ctlctl", self.allcoy, error=False)
        if not ctlctl:
            return "Missing ctlctl Record for Company"
        if self.gc.chkRec(self.allcoy, ctlctl, ["vat_ctl"]):
            return "Missing or Invalid Control Record"
        self.convat = ctlctl["vat_ctl"]
        self.vatrte = getVatRate(self.sql, self.allcoy, w, self.trndat)
        if self.vatrte is None:
            return "Invalid V.A.T Code"
        if self.vatrte and not self.vatn:
            ok = askQuestion(self.opts["mf"].window, "VAT Number",
                "This Account Does Not Have a VAT Number.\n\nMust "\
                "it be Populated?", default="yes")
            if ok == "yes":
                self.vatn = w
                self.popv = True
        self.vatcode = w

    def doAllAmt(self, frt, pag, r, c, p, i, w):
        if not w:
            incamt = float(ASD(self.trnamt) - ASD(self.allocated))
        elif self.glinp == "E":
            incamt = round((w * (100 + self.vatrte) / 100), 2)
        else:
            incamt = w
        self.allamt = round((incamt * 100 / (100 + self.vatrte)), 2)
        self.allvat = float(ASD(incamt) - ASD(self.allamt))
        if self.glinp == "E":
            self.df.loadEntry(frt, pag, p, data=self.allamt)
        else:
            self.df.loadEntry(frt, pag, p, data=incamt)
        self.df.loadEntry(frt, pag, p + 1, data=self.allvat)
        if not self.allvat:
            self.df.loadEntry(frt, pag, p + 2, data=self.name)
            return "sk1"

    def doAllVat(self, frt, pag, r, c, p, i, w):
        if (self.allamt < 0 and w > 0) or (self.allamt > 0 and w < 0):
            w = float(ASD(0) - ASD(w))
        if self.glinp == "I" and w != self.allvat:
            self.allamt = float(ASD(self.allamt) + ASD(self.allvat) - ASD(w))
        self.allvat = w
        self.df.loadEntry(frt, pag, p, data=self.allvat)
        self.df.loadEntry(frt, pag, p + 1, data=self.name)

    def doAllDet(self, frt, pag, r, c, p, i, w):
        self.alldet = w

    def doCancel(self):
        if self.agecan:
            ok = "yes"
        else:
            ok = askQuestion(
                self.opts["mf"].body,
                head="Cancel",
                mess="Are You Certain You Want to Cancel This Entry?")
        if ok == "yes":
            self.cancel = True
            self.opts["mf"].dbm.rollbackDbase()
            if self.batupd:
                self.updateBatch(rev=True)
            for pg in range(self.df.pgs, 1, -1):
                self.df.clearFrame("C", pg)
            self.df.selPage("Transaction")
            row = int((self.df.last[1][1] - 1) / self.df.colq[1])
            col = (row * self.df.colq[1]) + 1
            self.df.focusField("C", 1, col)
            if self.othvar.get():
                self.othvar.set(False)

    def endPage2(self):
        self.updateTables2()
        if self.loan and self.loan == "other":
            self.othtot = self.allamt
            self.df.selPage("LON")
            self.df.loadEntry("T", self.lonpag, 0, data=self.othtot)
            self.df.focusField("C", self.lonpag, 1)
            self.othvar.set(True)
            self.df.mstFrame.wait_variable(self.othvar)
            if self.cancel:
                return
        elif self.loan and self.loan == "staff":
            self.othtot = self.allamt
            self.df.selPage("SLN")
            self.df.loadEntry("T", self.slnpag, 0, data=self.othtot)
            self.df.focusField("C", self.slnpag, 1)
            self.othvar.set(True)
            self.df.mstFrame.wait_variable(self.othvar)
            if self.cancel:
                return
        self.allocated = float(ASD(self.allocated) + ASD(self.allamt) + \
            ASD(self.allvat))
        if self.allocated == self.trnamt:
            self.doCrsTrn()
            self.opts["mf"].dbm.commitDbase()
            self.df.clearFrame("C", 2)
            self.df.selPage("Transaction")
            self.df.advanceLine(1)
        else:
            bal = float(ASD(self.trnamt) - ASD(self.allocated))
            self.df.loadEntry("T", 2, 0, data=bal)
            self.df.advanceLine(2)

    def updateTables2(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trndat / 100)
        else:
            self.curdt = self.bh.curdt
        if self.opts["rtn"] == 1:  # Invoices
            self.debit()
        elif self.opts["rtn"] == 3:  # Journals
            self.debit()
        elif self.opts["rtn"] == 4:  # Credit Notes
            self.credit()

    def debit(self):
        amt = self.allamt
        vat = self.allvat
        self.restDebitCredit(amt, vat)

    def credit(self):
        amt = float(ASD(0) - ASD(self.allamt))
        vat = float(ASD(0) - ASD(self.allvat))
        self.restDebitCredit(amt, vat)

    def restDebitCredit(self, amt, vat):
        # VAT Transaction (ctlvtf)
        data = (self.allcoy, self.vatcode, "I", self.curdt, "C",
                self.opts["rtn"], self.bh.batno, self.trnref, self.trndat,
                self.cracno, self.alldet, amt, vat, 0, self.opts["capnm"],
                self.sysdtw, 0)
        self.sql.insRec("ctlvtf", data=data)
        if self.glint == "N":
            return
        # General Ledger Transaction (Expense)
        data = (self.allcoy, self.genacc, self.curdt, self.trndat, self.glt,
                self.trnref, self.bh.batno, amt, vat, self.alldet,
                self.vatcode, "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        # General Ledger Transaction (Intercompany)
        if self.allcoy != self.opts["conum"]:
            # General Ledger Transaction (Intercompany From)
            acc = self.sql.getRec("genint",
                                  cols=["cti_acno"],
                                  where=[("cti_cono", "=", self.opts["conum"]),
                                         ("cti_inco", "=", self.allcoy)],
                                  limit=1)[0]
            val = float(ASD(amt) + ASD(vat))
            data = (self.opts["conum"], acc, self.curdt, self.trndat, self.glt,
                    self.trnref, self.bh.batno, val, 0.00, self.alldet, "N",
                    "", 0, self.opts["capnm"], self.sysdtw, 0)
            self.sql.insRec("gentrn", data=data)
            # General Ledger Transaction (Intercompany To)
            acc = self.sql.getRec("genint",
                                  cols=["cti_acno"],
                                  where=[("cti_cono", "=", self.allcoy),
                                         ("cti_inco", "=", self.opts["conum"])
                                         ],
                                  limit=1)[0]
            val = float(ASD(0) - ASD(amt) - ASD(vat))
            data = (self.allcoy, acc, self.curdt, self.trndat, self.glt,
                    self.trnref, self.bh.batno, val, 0.00, self.alldet, "N",
                    "", 0, self.opts["capnm"], self.sysdtw, 0)
            self.sql.insRec("gentrn", data=data)
        if vat:
            # General Ledger Control Transaction (V.A.T.)
            data = (self.allcoy, self.convat, self.curdt, self.trndat,
                    self.glt, self.trnref, self.bh.batno, vat, 0.00,
                    self.alldet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)
        self.vat = float(ASD(self.vat) + ASD(vat))

    def exitPage2(self):
        self.df.focusField("C", 2, self.df.col)

    def doCrsTrn(self):
        # Creditors Master File
        if self.popv:
            self.sql.updRec("crsmst",
                            cols=["crm_vatno"],
                            data=["Unknown"],
                            where=[("crm_cono", "=", self.opts["conum"]),
                                   ("crm_acno", "=", self.cracno)])
        # Creditors Ledger Transaction
        paydt = paymentDate(self.base, self.stdt, self.term, self.trndat)
        data = [
            self.opts["conum"], self.cracno, self.opts["rtn"], self.trnref,
            self.bh.batno, self.trndat, "", self.amt, self.vat, self.per,
            self.curdt, paydt, "Y", self.amt, self.trndet, self.vatcode, "N",
            self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("crstrn", data=data)
        if not self.dis:
            return
        data = [
            self.opts["conum"], self.cracno, 6, self.trnref, self.bh.batno,
            self.trndat, "", self.dis, self.vat, 0, self.curdt, paydt, "Y",
            self.dis, self.trndet, self.vatcode, "N", self.opts["capnm"],
            self.sysdtw, 0
        ]
        self.sql.insRec("crstrn", data=data)

    def updateBatch(self, rev=False):
        if rev:
            self.bh.batqty = self.bh.batqty - 1
            self.bh.batval = float(ASD(self.bh.batval) - ASD(self.trnamt))
        else:
            self.batupd = True
            self.bh.batqty = self.bh.batqty + 1
            self.bh.batval = float(ASD(self.bh.batval) + ASD(self.trnamt))
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)

    def queryCrs(self):
        callModule(self.opts["mf"],
                   self.df,
                   "cr4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])

    def maintainCrs(self):
        callModule(self.opts["mf"],
                   self.df,
                   "cr1010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])

    def doLonAcc(self, frt, pag, r, c, p, i, w):
        newacc = False
        if not w and self.opts["rtn"] == 1:
            yn = askQuestion(self.opts["mf"].body,
                             "New Account",
                             "Is This a New Account?",
                             default="no")
            if yn == "no":
                return "Invalid Account Number"
            newacc = True
            w = callModule(self.opts["mf"],
                           self.df,
                           "ln1010",
                           coy=(self.allcoy, self.allnam),
                           user=self.opts["capnm"],
                           args="auto",
                           ret="acno")
            self.df.loadEntry(frt, pag, p, data=w)
        acc = self.sql.getRec("lonmf1",
                              cols=["lm1_name"],
                              where=[("lm1_cono", "=", self.allcoy),
                                     ("lm1_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        self.lonacc = w
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        if newacc:
            self.lonnum = 1
            self.newlon = True
            self.df.loadEntry(frt, pag, p + 2, data=self.lonnum)
            return "sk2"

    def doLonNum(self, frt, pag, r, c, p, i, w):
        if not w and self.opts["rtn"] == 1:
            ok = askQuestion(self.opts["mf"].body,
                             head="New Loan",
                             mess="Is This a New Loan?",
                             default="no")
            if ok == "yes":
                self.newlon = True
                self.lonnum = getNextCode(self.sql,
                                          "lonmf2",
                                          "lm2_loan",
                                          where=[
                                              ("lm2_cono", "=", self.allcoy),
                                              ("lm2_acno", "=", self.lonacc)
                                          ],
                                          start=1,
                                          last=9999999)
                self.df.loadEntry(frt, pag, p, data=self.lonnum)
            else:
                return "Invalid Loan Number"
        else:
            self.lonmf2 = self.sql.getRec("lonmf2",
                                          where=[
                                              ("lm2_cono", "=", self.allcoy),
                                              ("lm2_acno", "=", self.lonacc),
                                              ("lm2_loan", "=", w)
                                          ],
                                          limit=1)
            if not self.lonmf2:
                return "Invalid Loan Number"
            self.lonnum = w
            self.newlon = False
            self.londes = self.lonmf2[self.sql.lonmf2_col.index("lm2_desc")]
            self.londat = self.lonmf2[self.sql.lonmf2_col.index("lm2_start")]
            self.lonmth = self.lonmf2[self.sql.lonmf2_col.index("lm2_pmths")]
            self.lonpay = self.lonmf2[self.sql.lonmf2_col.index("lm2_repay")]
            if self.lonmth:
                return "Invalid Entry, Fixed Loan"
            self.df.loadEntry(frt, pag, p + 1, data=self.londes)
            return "sk1"

    def doLonDes(self, frt, pag, r, c, p, i, w):
        self.londes = w

    def doLonAmt(self, frt, pag, r, c, p, i, w):
        self.lonamt = w
        if not self.lonamt:
            self.lonamt = self.othtot
        self.df.loadEntry(frt, pag, p, data=self.lonamt)
        if not self.newlon:
            self.newdri = 0
            return "nd"

    def doLonDri(self, frt, pag, r, c, p, i, w):
        self.newdri = w

    def doLonCri(self, frt, pag, r, c, p, i, w):
        self.newcri = w

    def doLonMth(self, frt, pag, r, c, p, i, w):
        self.lonmth = w
        if self.lonmth:
            rte = (self.newdri / 1200.0)
            self.lonpay = round(
                ((self.lonamt * rte) * ((1 + rte)**w)) / (((1 + rte)**w) - 1),
                2)
        else:
            self.lonpay = 0
        self.df.loadEntry(frt, pag, p + 1, data=self.lonpay)

    def endLon(self):
        if self.opts["rtn"] == 4:
            tramt = float(ASD(0.0) - ASD(self.lonamt))
        else:
            tramt = self.lonamt
        self.othtot = float(ASD(self.othtot) - ASD(self.lonamt))
        if self.newlon:
            # Loans Rate
            self.sql.insRec("lonrte",
                            data=[
                                self.allcoy, self.lonacc, self.lonnum,
                                self.trndat, self.newdri, self.newcri
                            ])
            # Loans Ledger Masterfile
            self.sql.insRec("lonmf2",
                            data=[
                                self.allcoy, self.lonacc, self.lonnum,
                                self.londes, self.trndat, self.lonmth,
                                self.lonpay, 0
                            ])
            self.othrtn = 2
        else:
            self.othrtn = 3
        # Loans Ledger Transaction
        data = [
            self.allcoy, self.lonacc, self.lonnum, self.bh.batno, self.othrtn,
            self.trndat, self.trnref, tramt, self.curdt, self.alldet, "",
            self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("lontrn", data=data)
        if self.othtot:
            self.df.loadEntry("T", self.lonpag, 0, data=self.othtot)
            self.df.advanceLine(self.lonpag)
        else:
            self.othvar.set(False)

    def exitLon(self):
        self.df.focusField("C", self.lonpag, self.df.col)

    def doEmpNum(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("wagmst",
                              cols=["wgm_sname", "wgm_fname"],
                              where=[("wgm_cono", "=", self.allcoy),
                                     ("wgm_empno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Employee Number"
        self.empnum = w
        empnam = "%s, %s" % (acc[0], acc[1].split()[0])
        self.df.loadEntry(frt, pag, p + 1, data=empnam)

    def doSlnNum(self, frt, pag, r, c, p, i, w):
        if not w and self.opts["rtn"] == 1:
            ok = askQuestion(self.opts["mf"].body,
                             head="New Loan",
                             mess="Is This a New Loan?",
                             default="no")
            if ok == "yes":
                self.newsln = True
                self.slnnum = getNextCode(self.sql,
                                          "waglmf",
                                          "wlm_loan",
                                          where=[
                                              ("wlm_cono", "=", self.allcoy),
                                              ("wlm_empno", "=", self.empnum)
                                          ],
                                          start=1,
                                          last=9999999)
                self.df.loadEntry(frt, pag, p, data=self.slnnum)
            else:
                return "Invalid Loan Number"
        else:
            acc = self.sql.getRec("waglmf",
                                  where=[("wlm_cono", "=", self.allcoy),
                                         ("wlm_empno", "=", self.empnum),
                                         ("wlm_loan", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Loan Number"
            self.slnnum = w
            self.newsln = False
            self.slndes = acc[self.sql.waglmf_col.index("wlm_desc")]
            self.slncod = acc[self.sql.waglmf_col.index("wlm_code")]
            self.slnrte = acc[self.sql.waglmf_col.index("wlm_rate")]
            self.slndat = acc[self.sql.waglmf_col.index("wlm_start")]
            self.slnded = acc[self.sql.waglmf_col.index("wlm_repay")]
            self.df.loadEntry(frt, pag, p + 1, data=self.slndes)
            return "sk1"

    def doSlnDes(self, frt, pag, r, c, p, i, w):
        self.slndes = w

    def doSlnAmt(self, frt, pag, r, c, p, i, w):
        self.slnamt = w
        if not self.slnamt:
            self.slnamt = self.othtot
        self.df.loadEntry(frt, pag, p, data=self.slnamt)
        if not self.newsln:
            self.df.loadEntry(frt, pag, p + 1, data=self.slncod)

    def doSlnCod(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("wagedc",
                              cols=["ced_desc"],
                              where=[("ced_cono", "=", self.allcoy),
                                     ("ced_type", "=", "D"),
                                     ("ced_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Code"
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        self.slncod = w
        if not self.newsln:
            self.newrte = 0
            self.slnded = 0
            return "nd"

    def doSlnInt(self, frt, pag, r, c, p, i, w):
        self.newrte = w
        if not self.newsln:
            self.df.loadEntry(frt, pag, p + 2, data=self.slnded)

    def doSlnDed(self, frt, pag, r, c, p, i, w):
        self.slnded = w

    def endSln(self):
        if self.opts["rtn"] == 4:
            tramt = float(ASD(0.0) - ASD(self.slnamt))
        else:
            tramt = self.slnamt
        self.othtot = float(ASD(self.othtot) - ASD(self.slnamt))
        if self.newsln:
            # Staff Loans Ledger Masterfile
            self.sql.insRec("waglmf",
                            data=[
                                self.allcoy, self.empnum, self.slnnum,
                                self.slndes, self.slncod, self.newrte,
                                self.trndat, self.slnded
                            ])
            self.othrtn = 2
        else:
            self.othrtn = 3
        # Staff Loans Ledger Transaction
        data = [
            self.allcoy, self.empnum, self.slnnum, self.bh.batno, self.othrtn,
            self.trndat, self.trnref, tramt, tramt, self.slnded, self.newrte,
            self.curdt, self.alldet, "", self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("wagltf", data=data)
        if self.othtot:
            self.df.loadEntry("T", self.slnpag, 0, data=self.othtot)
            self.df.advanceLine(self.slnpag)
        else:
            self.othvar.set(False)

    def exitSln(self):
        self.df.focusField("C", self.slnpag, self.df.col)
Пример #10
0
class cr6030(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.dataHeader()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["crsmst", "crstrn", "chglog"],
            prog=self.__class__.__name__)
        if self.sql.error:
            return
        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.curdt = int(self.sysdtw / 100)
        return True

    def dataHeader(self):
        self.crm = {
            "stype": "R",
            "tables": ("crsmst",),
            "cols": [
                ("crm_acno", "", 0, "Acc-Num"),
                ("crm_name", "", 0, "Name", "Y")],
            "where": [],
            "index": 0}
        fld = [
            (("T",0,0,0),"INA",7,"Acc-Num","Account Number",
                "","N",self.doAcno,self.crm,None,("notblank",)),
            (("T",0,1,0),"ONA",30,"Name")]
        but = (
            ("Generate",None,self.doGenerate,1,None,(("T",0,1),("T",0,2)),
                "Mark zero items, which have been inactive, as redundant"),
            ("Create",None,self.doCreate,1,None,(("T",0,1),("T",0,2)),
                "Mark a zero item as redundant"),
            ("Restore",None,self.doRestore,1,None,(("T",0,1),("T",0,2)),
                "Mark a redundant item as normal"),
            ("Exit",None,self.exitPage,1,None,(("T",0,1),("T",0,2))))
        tnd = ((self.endPage, "y"),)
        txt = (self.exitPage,)
        self.df = TartanDialog(self.opts["mf"], eflds=fld,
            butt=but, tend=tnd, txit=txt, focus=False)
        self.df.setWidget(self.df.B0, state="normal")
        self.df.setWidget(self.df.B1, state="normal")
        self.df.setWidget(self.df.B2, state="normal")
        self.df.setWidget(self.df.B3, state="normal")

    def doGenerate(self):
        tit = "Generate Redundant Accounts"
        fld = (
            (("T",0,0,0),"IUI",2,"Months Inactive","",
                24,"Y",self.doMonths,None,None,("efld",)),)
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        self.mt = TartanDialog(self.opts["mf"], title=tit, tops=True,
            eflds=fld, tend=((self.doMthEnd, "y"),), txit=(self.doMthExit,))
        self.mt.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doMonths(self, frt, pag, r, c, p, i, w):
        months = w
        yr = int(self.curdt / 100)
        mt = self.curdt % 100
        for mth in range(months):
            mt -= 1
            if not mt:
                mt = 12
                yr -= 1
        self.startp = (yr * 100) + mt

    def doMthEnd(self):
        self.mt.closeProcess()
        whr = [
            ("crm_cono", "=", self.opts["conum"]),
            ("crm_stat", "=", "N")]
        msts = self.sql.getRec("crsmst", cols=["crm_acno",
            "crm_opened"], where=whr, order="crm_acno")
        chgs = []
        for mst in msts:
            whr = [
                ("crt_cono", "=", self.opts["conum"]),
                ("crt_acno", "=", mst[0])]
            rec = self.sql.getRec("crstrn", cols=["max(crt_curdt)",
                "sum(crt_tramt)"], where=whr, limit=1)
            if rec[0] and rec[0] < self.startp and not rec[1]:
                chgs.append(mst[0])
            elif not rec[0] and int(mst[1] / 100) < self.startp:
                chgs.append(mst[0])
        if not chgs:
            showError(self.opts["mf"].body, "Processing Error",
                "No New Redundant Accounts")
        else:
            self.cnt = 0
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            p = ProgressBar(self.opts["mf"].body, mxs=len(chgs),
                typ="Flagging Redundant Accounts")
            for num, rec in enumerate(chgs):
                p.displayProgress(num)
                self.sql.updRec("crsmst", cols=["crm_stat"], data=["X"],
                    where=[("crm_cono", "=", self.opts["conum"]),
                    ("crm_acno", "=", rec)])
                key = "%03i%-7s" % (self.opts["conum"], rec)
                self.sql.insRec("chglog", data=["crsmst", "U", key,
                    "crm_stat", dte, self.opts["capnm"], "N", "X", "", 0])
            p.closeProgress()
            mess = """%s Accounts Will be Flagged as Redundant.

Would you like to COMMIT these Changes?""" % len(chgs)
            self.opts["mf"].dbm.commitDbase(ask=True, mess=mess, default="no")

    def doMthExit(self):
        self.mt.closeProcess()

    def doCreate(self):
        self.flag = "C"
        self.crm["where"] = [
            ("crm_cono", "=", self.opts["conum"]),
            ("crm_stat", "<>", "X")]
        self.df.focusField("T", 0, 1)

    def doRestore(self):
        self.flag = "R"
        self.crm["where"] = [
            ("crm_cono", "=", self.opts["conum"]),
            ("crm_stat", "=", "X")]
        self.df.focusField("T", 0, 1)

    def doAcno(self, frt, pag, r, c, p, i, w):
        if self.flag == "C":
            typ = "<>"
        else:
            typ = "="
        chk = self.sql.getRec("crsmst", where=[("crm_cono",
            "=", self.opts["conum"]), ("crm_acno", "=", w),
            ("crm_stat", typ, "X")], limit=1)
        if not chk:
            return "Invalid Code"
        if self.flag == "C":
            bal = self.sql.getRec("crstrn", cols=["sum(crt_tramt)"],
                where=[("crt_cono", "=", self.opts["conum"]),
                ("crt_acno", "=", w)], limit=1)
            if bal[0]:
                return "Balance Exists"
        self.acno = w
        name = chk[self.sql.crsmst_col.index("crm_name")]
        self.df.loadEntry(frt, pag, p+1, data=name)

    def endPage(self):
        if self.flag == "C":
            old = "N"
            new = "X"
        else:
            old = "X"
            new = "N"
        self.sql.updRec("crsmst", cols=["crm_stat"], data=[new],
            where=[("crm_cono", "=", self.opts["conum"]),
            ("crm_acno", "=", self.acno)])
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        key = "%03i%-7s" % (self.opts["conum"], self.acno)
        self.sql.insRec("chglog", data=["crsmst", "U", key, "crm_stat",
            dte, self.opts["capnm"], old, new, 0])
        self.opts["mf"].dbm.commitDbase()
        self.df.clearFrame("T", 0)
        self.flag = ""

    def exitPage(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #11
0
class scc110(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, ["ctlmst", "scpclb", "scpmem"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        return True

    def mainProcess(self):
        clb = {
            "stype": "R",
            "tables": ("scpclb", ),
            "cols":
            (("scc_club", "", 0, "Cod"), ("scc_name", "", 0, "Name", "Y")),
            "order": "scc_name"
        }
        fld = ((("T", 0, 0, 0), "I@scc_club", 0, "", "", "", "Y",
                self.doClbCod, clb, None, ("efld", )),
               (("T", 0, 1, 0), "I@scc_name", 0, "", "", "", "N", self.doName,
                None, self.doDelete, ("notblank", )))
        but = (("Import", None, self.doImport, 0, ("T", 0, 1), ("T", 0, 2),
                "Import Clubs from a CSV or XLS File.", 1), )
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               tops=False,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)

    def doClbCod(self, frt, pag, r, c, p, i, w):
        if not w:
            self.club = getNextCode(self.sql, "scpclb", "scc_club", last=999)
            self.df.loadEntry(frt, pag, p, data=self.club)
        else:
            self.club = w
        self.old = self.sql.getRec("scpclb",
                                   where=[("scc_club", "=", self.club)],
                                   limit=1)
        if not self.old:
            self.newclb = True
        else:
            self.newclb = False
            for num, fld in enumerate(self.old[:-1]):
                self.df.loadEntry(frt, pag, num, data=fld)

    def doName(self, frt, pag, r, c, p, i, w):
        if self.newclb and self.sql.getRec("scpclb",
                                           where=[("scc_name", "ilike", w)]):
            return "A Club with this Name Already Exists"

    def doDelete(self):
        if self.newclb:
            return
        error = False
        for tab in (("scpmem", "scm_cono", "scm_ccod"), ):
            chk = self.sql.getRec(tables=tab[0],
                                  where=[(tab[1], "=", self.opts["conum"]),
                                         (tab[2], "=", self.club)],
                                  limit=1)
            if chk:
                error = True
                break
        if error:
            return "There are Entries for this Club, Not Deleted"
        self.sql.delRec("scpclb", where=[("scc_club", "=", self.club)])
        self.opts["mf"].dbm.commitDbase()

    def doImport(self):
        self.df.setWidget(self.df.mstFrame, state="hide")
        fi = FileImport(self.opts["mf"], imptab="scpclb", impskp=[])
        sp = ProgressBar(self.opts["mf"].body,
                         typ="Importing Club Records",
                         mxs=len(fi.impdat))
        err = None
        for num, line in enumerate(fi.impdat):
            sp.displayProgress(num)
            chk = self.sql.getRec("scpclb",
                                  where=[("scc_club", "=", line[0])],
                                  limit=1)
            if chk:
                err = "%s %s Already Exists" % (fi.impcol[0][0], line[0])
                break
            if not line[1]:
                err = "Blank Name"
                break
            self.sql.insRec("scpclb", data=line)
        sp.closeProgress()
        if err:
            err = "Line %s: %s" % ((num + 1), err)
            showError(
                self.opts["mf"].body, "Import Error", """%s

Please Correct your Import File and then Try Again.""" % err)
            self.opts["mf"].dbm.rollbackDbase()
        else:
            self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doEnd(self):
        data = self.df.t_work[0][0][:]
        if self.newclb:
            self.sql.insRec("scpclb", data=data)
        elif data != self.old[:len(data)]:
            col = self.sql.scpclb_col
            data.append(self.old[col.index("scc_xflag")])
            self.sql.updRec("scpclb",
                            data=data,
                            where=[("scc_club", "=", self.club)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #12
0
class bc2040(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, ["bwlcmp", "bwltab",
            "bwlent", "bwltyp", "bwlgme"], prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        bwlctl = gc.getCtl("bwlctl", self.opts["conum"])
        if not bwlctl:
            return
        self.nstart = bwlctl["ctb_nstart"]
        self.dbase = bwlctl["ctb_dbase"]
        return True

    def mainProcess(self):
        com = {
            "stype": "R",
            "tables": ("bwlcmp",),
            "cols": (
                ("bcm_code", "", 0, "Cod"),
                ("bcm_name", "", 0, "Name", "Y"),
                ("bcm_date", "", 0, "Date")),
            "where": [("bcm_cono", "=", self.opts["conum"])]}
        typ = {
            "stype": "R",
            "tables": ("bwltyp",),
            "cols": (
                ("bct_code", "", 0, "Cod"),
                ("bct_desc", "", 0, "Description", "Y")),
            "where": [("bct_cono", "=", self.opts["conum"])]}
        sk1 = {
            "stype": "R",
            "tables": ("bwltab",),
            "cols": (
                ("btb_tab", "", 0, "Cod"),
                ("btb_surname", "", 0, "Surname", "Y"),
                ("btb_names", "", 0, "Names")),
            "where": [("btb_cono", "=", self.opts["conum"])],
            "order": "btb_surname"}
        sk2 = {
            "stype": "R",
            "tables": ("bwlent", "bwltab"),
            "cols": (
                ("btb_tab", "", 0, "Cod"),
                ("btb_surname", "", 0, "Surname", "Y"),
                ("btb_names", "", 0, "Names"),
                ("bce_tcod", "", 0, "T"),
                ("bce_paid", "", 0, "P")),
            "where": [
                ("btb_cono", "=", self.opts["conum"]),
                ("btb_tab=bce_scod",)],
            "whera": [("T", "bce_ccod", 0, 0)],
            "order": "btb_surname"}
        fld = (
            (("T",0,0,0),"I@bcm_code",0,"Code","Competition Code",
                "","Y",self.doCmpCod,com,None,("efld",)),
            (("T",0,0,0),"I@bcm_name",0,"Name","",
                "","N",self.doCmpNam,None,self.doDelCmp,("notblank",)),
            (("T",0,0,0),"I@bcm_date",0,"Date","",
                "","N",None,None,None,("efld",)),
            (("T",0,0,0),"I@bcm_type",0,"Type","",
                "","N",self.doCmpTyp,typ,None,("efld",)),
            (("C",0,0,0),"I@btb_tab",0,"P-Code","Player's Code",
                "","Y",self.doSkpCod,sk1,None,("efld",)),
            (("C",0,0,1),"ONA",30,"Name","",
                "","N",None,None,None,("notblank",)),
            (("C",0,0,2),"I@bce_tcod",0,"T","Team Code (H or V)",
                "H","n",self.doTeam,None,None,("in", ("H","V"))),
            (("C",0,0,4),"I@bce_paid",0,"","Paid Flag (Y or N)",
                "N","N",self.doPaid,None,self.doDelSkp,("in", ("Y","N"))))
        but = (("Entered Players",sk2,None,0,("C",0,1),("T",0,1)),)
        tnd = ((self.doEnd,"y"),)
        txt = (self.doExit,)
        cnd = ((self.doEnd,"n"),)
        cxt = (self.doExit,)
        self.df = TartanDialog(self.opts["mf"], tops=False,
            eflds=fld, butt=but, tend=tnd, txit=txt, cend=cnd, cxit=cxt)

    def doCmpCod(self, frt, pag, r, c, p, i, w):
        self.erase = False
        self.skips = []
        if not w:
            self.ccod = getNextCode(self.sql, "bwlcmp", "bcm_code",
                where=[("bcm_cono", "=", self.opts["conum"])], last=999)
            self.df.loadEntry(frt, pag, p, data=self.ccod)
        else:
            self.ccod = w
        self.cmp = self.sql.getRec("bwlcmp", where=[("bcm_cono", "=",
            self.opts["conum"]), ("bcm_code", "=", self.ccod)], limit=1)
        if not self.cmp:
            ok = askQuestion(self.opts["mf"].body, head="New Competition",
                mess="Is This a New Competition?", default="no")
            if ok == "no":
                return "rf"
            self.newcmp = True
        else:
            if self.cmp[self.sql.bwlcmp_col.index("bcm_poff")]:
                showError(self.opts["mf"].body, "Complete",
                    "This Sectional Competition Has Been Completed.")
                return "rf"
            gme = self.sql.getRec("bwlgme", cols=["count(*)"],
                where=[("bcg_cono", "=", self.opts["conum"]), ("bcg_ccod", "=",
                self.ccod), ("bcg_ocod", "<>", 0)], limit=1)
            if gme[0]:
                ok = askQuestion(self.opts["mf"].body, "Error",
                    """This Competition Has Already Been Drawn.

Do You Want to Erase All Draws and Results?""", default="no")
                if ok == "no":
                    return "rf"
                self.erase = True
            self.newcmp = False
            for num, fld in enumerate(self.cmp[1:-2]):
                self.df.loadEntry(frt, pag, p+num, data=fld)
            ent = self.sql.getRec("bwlent", cols=["bce_scod"],
                where=[("bce_cono", "=", self.opts["conum"]),
                ("bce_ccod", "=", self.ccod)])
            for e in ent:
                self.skips.append(e[0])

    def doDelCmp(self):
        if self.newcmp:
            showError(self.opts["mf"].body, "Delete", "New Competition")
            return
        if self.skips:
            ok = askQuestion(self.opts["mf"].body, "Delete", "Entries Exist "\
                "for this Competition, Are You Sure it must be Deleted?",
                default="no")
            if ok == "no":
                return
        self.sql.delRec("bwlcmp", where=[("bcm_cono", "=", self.opts["conum"]),
            ("bcm_code", "=", self.ccod)])
        if self.skips:
            self.sql.delRec("bwlent", where=[("bce_cono",
                "=", self.opts["conum"]), ("bce_ccod", "=", self.ccod)])
            self.sql.delRec("bwlgme", where=[("bcg_cono",
                "=", self.opts["conum"]), ("bcg_ccod", "=", self.ccod)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doCmpNam(self, frt, pag, r, c, p, i, w):
        self.cmpnam = w

    def doCmpTyp(self, frt, pag, r, c, p, i, w):
        if not w:
            ok = askQuestion(self.opts["mf"].body, head="New Type",
                mess="Is This a New Competition Type?")
            if ok == "yes":
                w = getNextCode(self.sql, "bwltyp", "bct_code",
                    where=[("bct_cono", "=", self.opts["conum"])], last=99)
                w = callModule(self.opts["mf"], self.df, "bc1040",
                    coy=(self.opts["conum"], self.opts["conam"]), args=w,
                    ret="ctype")
                self.df.loadEntry(frt, pag, p, data=w)
        self.typ = self.sql.getRec("bwltyp", where=[("bct_cono", "=",
            self.opts["conum"]), ("bct_code", "=", w)], limit=1)
        if not self.typ:
            return "Invalid Competition Type"
        self.cfmat = self.typ[self.sql.bwltyp_col.index("bct_cfmat")]
        self.tsize = self.typ[self.sql.bwltyp_col.index("bct_tsize")]

    def doSkpCod(self, frt, pag, r, c, p, i, w):
        if not w:
            ok = askQuestion(self.opts["mf"].body, head="New Non-Member",
                mess="Is This a New Non-Member Player?", default="yes")
            if ok == "no":
                return "Invalid Skip Code"
            cod = self.doNewCode()
            if not cod:
                return "Invalid Skip Code"
            self.df.loadEntry(frt, pag, p, data=cod)
        else:
            cod = w
        if cod not in self.skips:
            self.skips.append(cod)
        self.scod = cod
        chk = self.sql.getRec("bwltab", cols=["btb_surname",
            "btb_names"], where=[("btb_cono", "=", self.opts["conum"]),
            ("btb_tab", "=", self.scod)], limit=1)
        if not chk:
            return "Invalid Player Code"
        self.df.loadEntry(frt, pag, p+1, data=self.getName(chk))
        ent = self.sql.getRec("bwlent", cols=["bce_tcod",
            "bce_paid"], where=[("bce_cono", "=", self.opts["conum"]),
            ("bce_ccod", "=", self.ccod), ("bce_scod", "=", self.scod)],
            limit=1)
        if ent:
            self.newent = False
            self.df.loadEntry(frt, pag, p+2, data=ent[0])
            self.df.loadEntry(frt, pag, p+3, data=ent[1])
        else:
            self.newent = True
        if self.cfmat == "X":
            if self.scod < self.nstart:
                self.tcod = "H"
            else:
                self.tcod = "V"
            self.df.loadEntry(frt, pag, p+2, data=self.tcod)
        else:
            self.tcod = ""
            return "sk2"

    def doTeam(self, frt, pag, r, c, p, i, w):
        self.tcod = w

    def doNewCode(self):
        r1s = (("Male","M"), ("Female","F"))
        r2s = (("Skip",4), ("Third",3), ("Second",2), ("Lead",1))
        fld = (
            (("T",0,0,0),("IRB",r1s),0,"Gender","",
                "M","Y",None,None,None,None),
            (("T",0,1,0),"I@btb_surname",0,"","",
                "","Y",None,None,None,("notblank",)),
            (("T",0,2,0),"I@btb_names",0,"","",
                "","Y",None,None,None,("notblank",)),
            (("T",0,3,0),"I@btb_home",0,"","",
                "","Y",None,None,None,("efld",)),
            (("T",0,4,0),"I@btb_work",0,"","",
                "","Y",None,None,None,("efld",)),
            (("T",0,5,0),"I@btb_cell",0,"","",
                "","Y",None,None,None,("efld",)),
            (("T",0,6,0),"I@btb_mail",0,"","",
                "","Y",self.doNMail,None,None,("efld",)),
            (("T",0,7,0),("IRB",r2s),0,"Position","",
                4,"Y",self.doNPos,None,None,None),
            (("T",0,8,0),"I@btb_rate1",0,"Rating","",
                "","Y",None,None,None,("efld",)))
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        self.new = TartanDialog(self.opts["mf"], eflds=fld,
            tend=((self.doNEnd,"y"),), txit=(self.doNExit,))
        self.new.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state)
        return self.newcod

    def doNMail(self, frt, pag, r, c, p, i, w):
        if self.cfmat in ("T", "K", "R", "X"):
            if self.dbase in ("C", "P"):
                self.new.loadEntry(frt, pag, p+1, data=4)
            else:
                self.new.loadEntry(frt, pag, p+1, data=0)
            if self.dbase in ("C", "R"):
                self.new.loadEntry(frt, pag, p+2, data=5)
            else:
                self.new.loadEntry(frt, pag, p+2, data=0)
            return "sk2"
        if self.dbase == "R":
            self.new.loadEntry(frt, pag, p+1, data=0)
            return "sk1"

    def doNPos(self, frt, pag, r, c, p, i, w):
        if self.dbase == "P":
            self.new.loadEntry(frt, pag, p+1, data=0)
            return "sk1"

    def doNEnd(self):
        self.new.closeProcess()
        self.newcod = getNextCode(self.sql, "bwltab", "btb_tab",
            where=[("btb_cono", "=", self.opts["conum"])],
            start=self.nstart, last=900000)
        data = [self.opts["conum"], self.newcod, 0]
        data.extend(self.new.t_work[0][0][1:3])
        data.extend([self.new.t_work[0][0][0], "", "", "", ""])
        data.extend(self.new.t_work[0][0][3:])
        data.extend(self.new.t_work[0][0][7:])
        data.append(0)
        self.sql.insRec("bwltab", data=data)

    def doNExit(self):
        self.new.closeProcess()
        self.newcod = None

    def getName(self, chk):
        name = chk[0]
        if chk[1]:
            name += ","
            for i in chk[1].split():
                name = "%s %s" % (name, i)
        return name.upper()

    def doPaid(self, frt, pag, r, c, p, i, w):
        self.paid = w

    def doDelSkp(self):
        self.sql.delRec("bwlent", where=[("bce_cono", "=",
            self.opts["conum"]), ("bce_ccod", "=", self.ccod),
            ("bce_scod", "=", self.scod)])
        self.sql.delRec("bwlgme", where=[("bcg_cono", "=",
            self.opts["conum"]), ("bcg_ccod", "=", self.ccod),
            ("bcg_scod", "=", self.scod)])
        self.loadButton()

    def doEnd(self):
        if self.df.frt == "T":
            data = [self.opts["conum"]] + self.df.t_work[0][0] + [0]
            if self.newcmp:
                self.sql.insRec("bwlcmp", data=data)
            else:
                if self.erase:
                    self.sql.delRec("bwlgme", where=[("bcg_cono", "=",
                        self.opts["conum"]), ("bcg_ccod", "=", self.ccod)])
                    if self.cfmat in ("D", "K"):
                        self.sql.delRec("bwltms", where=[("btd_cono", "=",
                            self.opts["conum"]), ("btd_ccod", "=", self.ccod)])
                        self.sql.delRec("bwlrnd", where=[("bcr_cono", "=",
                            self.opts["conum"]), ("bcr_ccod", "=", self.ccod)])
                    if self.cfmat in ("T", "X"):
                        recs = self.sql.getRec("bwlent",
                            cols=["bce_scod"], where=[("bce_cono",
                            "=", self.opts["conum"]), ("bce_ccod",
                            "=", self.ccod)], order="bce_scod")
                        skips = []
                        for rec in recs:
                            skips.append(rec[0])
                        self.doPopulate(skips)
                data.append(self.cmp[self.sql.bwlcmp_col.index("bcm_xflag")])
                self.sql.updRec("bwlcmp", data=data, where=[("bcm_cono", "=",
                    self.opts["conum"]), ("bcm_code", "=", self.ccod)])
            self.loadButton()
            self.df.focusField("C", 0, 1)
        else:
            if self.newent:
                self.sql.insRec("bwlent", data=[self.opts["conum"], self.ccod,
                    self.scod, self.tcod, self.paid])
                if self.cfmat in ("T", "X"):
                    self.doPopulate([self.scod])
            else:
                self.sql.updRec("bwlent", cols=["bce_tcod", "bce_paid"],
                    data=[self.tcod, self.paid], where=[("bce_cono", "=",
                    self.opts["conum"]), ("bce_ccod", "=", self.ccod),
                    ("bce_scod", "=", self.scod)])
            self.loadButton()
            self.df.advanceLine(0)

    def doPopulate(self, scods):
        # Populate bwlgme records
        num = self.typ[self.sql.bwltyp_col.index("bct_games")]
        dgm = self.typ[self.sql.bwltyp_col.index("bct_drawn")]
        for scod in scods:
            data = [self.opts["conum"], self.ccod, scod, 0, "",
                0, 0, "", 0, 0, 0, 0, 0, 0, 0, "", 0, 0]
            for x in range(0, dgm):
                data[3] = x + 1
                data[4] = "D"
                self.sql.insRec("bwlgme", data=data)
            for x in range(dgm, num):
                data[3] = x + 1
                data[4] = "S"
                self.sql.insRec("bwlgme", data=data)

    def loadButton(self):
        rec = self.sql.getRec("bwlent", cols=["count(*)"],
            where=[("bce_cono", "=", self.opts["conum"]), ("bce_ccod", "=",
            self.ccod)], limit=1)
        self.df.B0.setLabel("Entered Players (%s)" % int(rec[0]), udl=0)

    def doExit(self):
        if self.df.frt == "C":
            self.opts["mf"].dbm.commitDbase()
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #13
0
class sc2010(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, [
            "scpcmp", "scpmem", "scpclb", "scpsec", "scprnd", "scpent",
            "scpgme"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.img = None
        self.newent = False
        return True

    def mainProcess(self):
        com = {
            "stype":
            "R",
            "tables": ("scpcmp", ),
            "cols":
            (("scp_ccod", "", 0, "Cod"), ("scp_name", "", 0, "Name", "Y"),
             ("scp_tsiz", "", 0, "S"), ("scp_fmat", "", 0, "F")),
            "where": [("scp_cono", "=", self.opts["conum"])]
        }
        fmt = {
            "stype": "C",
            "titl": "Select the Required Format",
            "head": ("C", "Format"),
            "data": [("R", "Round Robin"), ("K", "Knockout")]
        }
        log = {"stype": "F", "types": "fle", "ftype": (("Image", "*"), )}
        sk1 = {
            "stype":
            "R",
            "tables": ("scpmem", ),
            "cols":
            (("scm_scod", "", 0, "Cod"), ("scm_surname", "", 0, "Surname",
                                          "Y"), ("scm_names", "", 0, "Names")),
            "where": [("scm_cono", "=", self.opts["conum"])],
            "order":
            "scm_surname"
        }
        sk2 = {
            "stype":
            "R",
            "tables": ("scpent", "scpmem"),
            "cols":
            (("scm_scod", "", 0, "Cod"), ("scm_surname", "", 0, "Surname",
                                          "Y"), ("scm_names", "", 0, "Names")),
            "where": [("scm_cono", "=", self.opts["conum"]),
                      ("scm_scod=sce_scod", )],
            "whera": [("T", "sce_ccod", 0, 0)],
            "order":
            "scm_surname",
            "butt": [("Delete", self.doDelete, True),
                     ("Print All", self.doPrint)]
        }
        r1s = (("Male", "M"), ("Female", "F"), ("Both", "B"))
        r2s = (("Fours", "4"), ("Trips", "3"), ("Pairs", "2"), ("Singles",
                                                                "1"))
        r3s = (("Knockout", "K"), ("Round-Robin", "R"))
        fld = ((("T", 0, 0, 0), "I@scp_ccod", 0, "Code", "Competition Code",
                "", "Y", self.doCmpCod, com, None, ("efld", )),
               (("T", 0, 0, 0), "I@scp_name", 0, "Name", "Competition Name",
                "", "N", self.doCmpNam, None, None, ("notblank", )),
               (("T", 0, 1, 0), ("IRB", r1s), 0, "Gender", "", "M", "N",
                self.doCmpSex, None, None,
                None), (("T", 0, 2, 0), ("IRB", r2s), 0, "Team Size", "", "4",
                        "N", self.doCmpSiz, None, None,
                        None), (("T", 0, 3, 0), ("IRB", r3s), 0, "Format", "",
                                "K", "N", self.doCmpTyp, fmt, None, None),
               (("T", 0, 4, 0), "I@scp_logo", 0, "Logo", "Sponsor's Logo", "",
                "N", self.doCmpLogo, log, None, ("fle", "blank")),
               (("C", 0, 0, 0), "I@scm_scod", 0, "Skip  ", "", "", "Y",
                self.doSkpCod, sk1, None, ("efld", )), (("C", 0, 0, 1), "ONA",
                                                        30, "Name"),
               (("C", 0, 0, 2), "I@scm_scod", 0, "Lead  ", "", "", "n",
                self.doSkpCod, sk1, None, ("efld", )), (("C", 0, 0, 3), "ONA",
                                                        30, "Name"))
        but = (("Entered Players", sk2, None, 0, ("C", 0, 1), ("T", 0, 1)), )
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        cnd = ((self.doEnd, "n"), )
        cxt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               tops=False,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt)

    def doCmpCod(self, frt, pag, r, c, p, i, w):
        self.skips = []
        self.parts = []
        nxtcod = getNextCode(self.sql,
                             "scpcmp",
                             "scp_ccod",
                             where=[("scp_cono", "=", self.opts["conum"])],
                             last=999)
        if not w or w > nxtcod:
            self.ccod = nxtcod
            self.df.loadEntry(frt, pag, p, data=self.ccod)
        else:
            self.ccod = w
        self.old = self.sql.getRec("scpcmp",
                                   where=[("scp_cono", "=",
                                           self.opts["conum"]),
                                          ("scp_ccod", "=", self.ccod)],
                                   limit=1)
        if not self.old:
            ok = askQuestion(self.opts["mf"].body,
                             head="New Competition",
                             mess="Is This a New Competition?",
                             default="no")
            if ok == "no":
                return "rf"
            self.newcmp = True
        else:
            state = self.old[self.sql.scpcmp_col.index("scp_state")]
            if state > 1:
                return "This Competition Has Already Started"
            if state == 1:
                ok = askQuestion(self.opts["mf"].window,
                                 "Already Drawn",
                                 """This Competition Has Already Been Drawn.

Do You Want to Modify and Redraw It?""",
                                 default="no")
                if ok == "no":
                    return "rf"
                self.sql.updRec("scpcmp",
                                cols=["scp_state"],
                                data=[0],
                                where=[("scp_cono", "=", self.opts["conum"]),
                                       ("scp_ccod", "=", self.ccod)])
                self.sql.delRec("scpgme",
                                where=[("scg_cono", "=", self.opts["conum"]),
                                       ("scg_ccod", "=", self.ccod)])
                self.sql.delRec("scprnd",
                                where=[("scr_cono", "=", self.opts["conum"]),
                                       ("scr_ccod", "=", self.ccod)])
                self.sql.delRec("scpsec",
                                where=[("scs_cono", "=", self.opts["conum"]),
                                       ("scs_ccod", "=", self.ccod)])
            self.newcmp = False
            self.cmpnam = self.old[self.sql.scpcmp_col.index("scp_name")]
            self.tsex = self.old[self.sql.scpcmp_col.index("scp_tsex")]
            self.tsiz = self.old[self.sql.scpcmp_col.index("scp_tsiz")]
            self.fmat = self.old[self.sql.scpcmp_col.index("scp_fmat")]
            self.logo = self.old[self.sql.scpcmp_col.index("scp_logo")]
            self.df.loadEntry(frt, pag, p + 1, data=self.cmpnam)
            self.df.loadEntry(frt, pag, p + 2, data=str(self.tsex))
            self.df.loadEntry(frt, pag, p + 3, data=str(self.tsiz))
            self.df.loadEntry(frt, pag, p + 4, data=self.fmat)
            self.df.loadEntry(frt, pag, p + 5, data=self.logo)

    def doCmpNam(self, frt, pag, r, c, p, i, w):
        self.cmpnam = w

    def doCmpSex(self, frt, pag, r, c, p, i, w):
        self.tsex = w

    def doCmpSiz(self, frt, pag, r, c, p, i, w):
        self.tsiz = int(w)

    def doCmpTyp(self, frt, pag, r, c, p, i, w):
        self.fmat = w

    def doCmpLogo(self, frt, pag, r, c, p, i, w):
        if w and not os.path.isfile(w):
            return "Invalid Logo Path"
        self.logo = w
        try:
            if self.img:
                self.img.destroyImage()
            self.img = ShowImage(self.df.topPage0,
                                 self.logo,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"],
                                 msiz=100)
        except:
            pass

    def doSkpCod(self, frt, pag, r, c, p, i, w):
        if not w:
            ok = askQuestion(self.opts["mf"].body,
                             head="New Player",
                             mess="Is This a New Player?",
                             default="yes")
            if ok == "no":
                return "Invalid Code"
            cod = getNextCode(self.sql,
                              "scpmem",
                              "scm_scod",
                              where=[("scm_cono", "=", self.opts["conum"])],
                              last=899999)
            callModule(self.opts["mf"],
                       self.df,
                       "sc1010",
                       coy=[self.opts["conum"], self.opts["conam"]],
                       args=(cod, ))
            self.df.loadEntry(frt, pag, p, data=cod)
        else:
            cod = w
        if i == 0:
            if cod in self.parts:
                return "Invalid Skip, Already a Partner"
            self.skips.append(cod)
            self.scod = cod
        else:
            if cod in self.skips:
                return "Invalid Partner, Already a Skip"
            self.parts.append(cod)
            self.pcod = cod
        chk = self.sql.getRec("scpmem",
                              cols=["scm_surname", "scm_names", "scm_gender"],
                              where=[("scm_cono", "=", self.opts["conum"]),
                                     ("scm_scod", "=", cod)],
                              limit=1)
        if not chk:
            return "Invalid Player Code"
        if self.tsex in ("M", "F") and chk[2] != self.tsex:
            return "Invalid Gender"
        self.df.loadEntry(frt, pag, p + 1, data=self.getName(chk=chk))
        if i == 0:
            ent = self.sql.getRec("scpent",
                                  cols=["sce_pcod"],
                                  where=[("sce_cono", "=", self.opts["conum"]),
                                         ("sce_ccod", "=", self.ccod),
                                         ("sce_scod", "=", self.scod)],
                                  limit=1)
            if ent:
                self.newent = False
                if ent[0]:
                    ptr = self.sql.getRec("scpmem",
                                          cols=["scm_surname", "scm_names"],
                                          where=[("scm_cono", "=",
                                                  self.opts["conum"]),
                                                 ("scm_scod", "=", ent[0])],
                                          limit=1)
                    self.df.loadEntry(frt, pag, p + 2, data=ent[0])
                    self.df.loadEntry(frt,
                                      pag,
                                      p + 3,
                                      data=self.getName(chk=ptr))
            else:
                self.newent = True
            if self.tsiz != 2:
                self.pcod = 0
                return "sk3"

    def getName(self, scod=None, chk=None):
        if scod:
            chk = self.sql.getRec(
                "scpmem",
                cols=["scm_surname", "scm_names", "scm_gender"],
                where=[("scm_cono", "=", self.opts["conum"]),
                       ("scm_scod", "=", scod)],
                limit=1)
        name = "%s," % chk[0]
        init = chk[1].split()
        for i in init:
            name = "%s %s" % (name, i.upper())
        return name

    def doDelete(self, args=None):
        self.scod = args[1]
        self.sql.delRec("scpent",
                        where=[("sce_cono", "=", self.opts["conum"]),
                               ("sce_ccod", "=", self.ccod),
                               ("sce_scod", "=", self.scod)])
        self.sql.delRec("scpgme",
                        where=[("scg_cono", "=", self.opts["conum"]),
                               ("scg_ccod", "=", self.ccod),
                               ("scg_scod", "=", self.scod)])
        self.loadButton()
        self.doLoadEntries()

    def doEnd(self):
        if self.df.frt == "T":
            data = [self.opts["conum"]] + self.df.t_work[0][0] + \
                [0,0,"","","",0,0,""]
            if self.newcmp:
                self.sql.insRec("scpcmp", data=data)
            elif data != self.old[:len(data)]:
                col = self.sql.scpcmp_col
                data.append(self.old[col.index("scp_xflag")])
                self.sql.updRec("scpcmp",
                                data=data,
                                where=[("scp_cono", "=", self.opts["conum"]),
                                       ("scp_ccod", "=", self.ccod)])
            self.loadButton()
            if self.newcmp:
                self.df.focusField("C", 0, 1)
            else:
                self.doLoadEntries()
        else:
            if self.newent:
                self.sql.insRec(
                    "scpent",
                    data=[self.opts["conum"], self.ccod, self.scod, self.pcod])
                self.df.advanceLine(0)
            else:
                self.sql.updRec("scpent",
                                cols=["sce_scod", "sce_pcod"],
                                data=[self.scod, self.pcod],
                                where=[("sce_cono", "=", self.opts["conum"]),
                                       ("sce_ccod", "=", self.ccod),
                                       ("sce_scod", "=", self.scod)])
                self.doLoadEntries()
            self.loadButton()

    def doLoadEntries(self):
        self.skips = []
        ents = self.sql.getRec("scpent",
                               cols=["sce_scod", "sce_pcod"],
                               where=[("sce_cono", "=", self.opts["conum"]),
                                      ("sce_ccod", "=", self.ccod)])
        self.df.clearFrame("C", 0)
        self.df.focusField("C", 0, 1)
        for num, ent in enumerate(ents):
            self.skips.append(ent[0])
            self.df.loadEntry("C", 0, self.df.pos, data=ent[0])
            self.df.loadEntry("C",
                              0,
                              self.df.pos + 1,
                              data=self.getName(ent[0]))
            if ent[1]:
                self.parts.append(ent[1])
                self.df.loadEntry("C", 0, self.df.pos + 2, data=ent[1])
                self.df.loadEntry("C",
                                  0,
                                  self.df.pos + 3,
                                  data=self.getName(ent[1]))
            self.df.advanceLine(0)

    def loadButton(self):
        rec = self.sql.getRec("scpent",
                              cols=["count(*)"],
                              where=[("sce_cono", "=", self.opts["conum"]),
                                     ("sce_ccod", "=", self.ccod)],
                              limit=1)
        self.df.B0.setLabel("Entered Players (%s)" % int(rec[0]), udl=0)

    def doPrint(self):
        self.df.setWidget(self.df.mstFrame, state="hide")
        hdr = ["Skips Entered for the %s" % self.cmpnam]
        tab = ["scpent", "scpmem"]
        col = [
            "scm_scod", "scm_surname", "scm_names", "scm_phone",
            ["scm_email", "TX", 30, "Email-Address"]
        ]
        whr = [("sce_ccod", "=", self.ccod), ("scm_scod=sce_scod", )]
        odr = "scm_surname"
        RepPrt(self.opts["mf"],
               name=self.__class__.__name__,
               heads=hdr,
               tables=tab,
               cols=col,
               where=whr,
               order=odr,
               prtdia=(("Y", "V"), ("Y", "N")))
        self.df.setWidget(self.df.mstFrame, state="show")

    def doExit(self):
        if self.df.frt == "C":
            chk = self.sql.getRec("scpent",
                                  where=[("sce_cono", "=", self.opts["conum"]),
                                         ("sce_ccod", "=", self.ccod)])
            if chk:
                self.opts["mf"].dbm.commitDbase()
            else:
                self.opts["mf"].dbm.rollbackDbase()
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #14
0
class glc110(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["ctlctl", "genmst"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        # -------------------------------
        # General Ledger Control Records
        # -------------------------------
        # Get Company Details
        gc = GetCtl(self.opts["mf"])
        ctlmst = gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        # Standard Controls
        self.glctrl = [("bank_1", "Bank Control 1"),
                       ("bank_2", "Bank Control 2"),
                       ("bank_3", "Bank Control 3"),
                       ("bank_4", "Bank Control 4"),
                       ("bank_5", "Bank Control 5"),
                       ("bank_6", "Bank Control 6"),
                       ("bank_7", "Bank Control 7"),
                       ("bank_8", "Bank Control 8"),
                       ("bank_9", "Bank Control 9"),
                       ("bank_10", "Bank Control 10"),
                       ("p_cash", "Petty Cash Control"),
                       ("crs_ctl", "Creditors Control"),
                       ("drs_ctl", "Debtors Control"),
                       ("ret_inc", "Retained Income"),
                       ("vat_ctl", "VAT Control")]
        # Check for Integrated Systems
        mod = []
        for x in range(0, len(ctlmst["ctm_modules"].rstrip()), 2):
            mod.append(ctlmst["ctm_modules"][x:x + 2])
        # Load Systems Integration
        if mod.count("AR"):
            assctl = gc.getCtl("assctl", self.opts["conum"], error=False)
            if assctl and assctl["cta_glint"] == "Y":
                self.glctrl.extend([("ass_sls", "Sale of Assets")])
        if mod.count("BK"):
            bkmctl = gc.getCtl("bkmctl", self.opts["conum"], error=False)
            if bkmctl and bkmctl["cbk_glint"] == "Y":
                self.glctrl.extend([("bkm_ctl", "Bookings Control"),
                                    ("bkm_chq", "Cheques Received"),
                                    ("bkm_csh", "Cash Received"),
                                    ("bkm_ccg", "Cancellation Fee")])
                if not mod.count("DR"):
                    self.glctrl.extend([("dis_all", "Discount Allowed")])
        if mod.count("CR"):
            crsctl = gc.getCtl("crsctl", self.opts["conum"], error=False)
            if crsctl and crsctl["ctc_glint"] == "Y":
                self.glctrl.extend([("dis_rec", "Discount Received")])
        if mod.count("CS"):
            cshctl = gc.getCtl("cshctl", self.opts["conum"], error=False)
            if cshctl and cshctl["ccc_glint"] == "Y":
                self.glctrl.extend([("csh_ctl", "Cash Control")])
        if mod.count("DR"):
            drsctl = gc.getCtl("drsctl", self.opts["conum"], error=False)
            if drsctl and drsctl["ctd_glint"] == "Y":
                self.glctrl.extend([("dis_all", "Discount Allowed")])
        if mod.count("LN"):
            lonctl = gc.getCtl("lonctl", self.opts["conum"], error=False)
            if lonctl and lonctl["cln_glint"] == "Y":
                self.glctrl.extend([("lon_ctl", "Loans Control"),
                                    ("int_pay", "Interest Paid"),
                                    ("int_rec", "Interest Received")])
        if mod.count("ML"):
            memctl = gc.getCtl("memctl", self.opts["conum"], error=False)
            if memctl and memctl["mcm_glint"] == "Y":
                self.glctrl.extend([("mem_ctl", "Members Control"),
                                    ("mem_pen", "Members Penalties")])
        if mod.count("RC"):
            rcactl = gc.getCtl("rcactl", self.opts["conum"], error=False)
            if rcactl and rcactl["cte_glint"] == "Y":
                self.glctrl.extend([("rca_com", "Commission Raised"),
                                    ("rca_dep", "Deposits Control"),
                                    ("rca_fee", "Contract Fees"),
                                    ("rca_own", "Owners Control"),
                                    ("rca_orx", "Owners Charges"),
                                    ("rca_tnt", "Tenants Control"),
                                    ("rca_trx", "Tenants Charges")])
        if mod.count("ST"):
            strctl = gc.getCtl("strctl", self.opts["conum"], error=False)
            if strctl and strctl["cts_glint"] == "Y":
                self.glctrl.extend([("stk_soh", "Stock on Hand"),
                                    ("stk_susp", "Stock Reconciliation")])
        if mod.count("WG") or mod.count("SL"):
            wagctl = gc.getCtl("wagctl", self.opts["conum"], error=False)
            if wagctl and wagctl["ctw_glint"] == "Y":
                self.glctrl.extend([("wag_ctl", "Salaries Control"),
                                    ("wag_slc", "Staff Loans Control"),
                                    ("wag_sli", "Staff Loans Interest")])
        return True

    def drawDialog(self):
        ctl = {
            "stype": "C",
            "titl": "Select Control",
            "head": ("Code", "Description"),
            "typs": (("NA", 10), ("NA", 30)),
            "data": self.glctrl
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        r1s = (("None", "N"), ("OFX", "O"), ("QIF", "Q"), ("S/Bank Online",
                                                           "S"))
        r2s = (("None", "N"), ("CCYYMMDD", "A"), ("DDMMCCYY", "B"),
               ("MMDD(CC)YY", "C"))
        fld = ((("T", 0, 0, 0), "INA", 10, "Code", "Control Code", "", "Y",
                self.doCode, ctl, None, None), (("T", 0, 0, 25), "ONA", 30,
                                                "Description"),
               (("T", 0, 1, 0), "IUI", 7, "G/L Acc-Num", "G/L Account Number",
                "", "N", self.doAccNum, glm, self.doDelete,
                ("notzero", )), (("T", 0, 1, 25), "ONA", 30, "Description"),
               (("T", 0, 2, 0), "INA", 16, "Bank Account",
                "Bank Account Number", "", "N", self.doImpBnk, None, None,
                ("efld", )), (("T", 0, 3, 0), ("IRB", r1s), 0, "Import Format",
                              "", "N", "N", self.doImpFmt, None, None, None),
               (("T", 0, 4, 0), ("IRB", r2s), 0, "Date Format", "", "A", "N",
                self.doDteFmt, None, None, None))
        but = (("Accept", None, self.doAccept, 0, ("T", 0, 3), ("T", 0, 0)),
               ("Cancel", None, self.doCancel, 0, ("T", 0, 3), ("T", 0, 0)),
               ("Print", None, self.doPrint, 0, ("T", 0, 1),
                ("T", 0, 2)), ("Quit", None, self.doExit, 1, None, None))
        tnd = ((self.doEnd, "Y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)

    def doCode(self, frt, pag, r, c, p, i, w):
        self.code = w
        d1 = ""
        for ctl in self.glctrl:
            if self.code in ctl:
                d1 = ctl[1]
                break
        if not d1:
            return "Invalid Control Code"
        self.df.loadEntry(frt, pag, p + 1, data=d1)
        self.acc = self.sql.getRec("ctlctl",
                                   where=[("ctl_cono", "=",
                                           self.opts["conum"]),
                                          ("ctl_code", "=", self.code)],
                                   limit=1)
        if not self.acc:
            self.new = "y"
        else:
            self.new = "n"
            col = self.sql.ctlctl_col
            desc = self.readAcno(self.acc[col.index("ctl_conacc")])
            if not desc:
                desc = [""]
            self.df.loadEntry(frt,
                              pag,
                              p + 2,
                              data=self.acc[col.index("ctl_conacc")])
            self.df.loadEntry(frt, pag, p + 3, data=desc[0])
            self.df.loadEntry(frt,
                              pag,
                              p + 4,
                              data=self.acc[col.index("ctl_bankac")])
            self.df.loadEntry(frt,
                              pag,
                              p + 5,
                              data=self.acc[col.index("ctl_impfmt")])
            self.df.loadEntry(frt,
                              pag,
                              p + 6,
                              data=self.acc[col.index("ctl_dtefmt")])

    def doDelete(self):
        self.sql.delRec("ctlctl",
                        where=[("ctl_cono", "=", self.opts["conum"]),
                               ("ctl_code", "=", self.code)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doAccNum(self, frt, pag, r, c, p, i, w):
        desc = self.readAcno(w)
        if not desc:
            return "Invalid Account Number"
        self.df.loadEntry(frt, pag, p + 1, data=desc[0])
        if self.code[:4] != "bank":
            self.impfmt = "N"
            self.bankac = ""
            self.dtefmt = "N"
            return "nd"

    def readAcno(self, acno):
        self.acno = acno
        acc = self.sql.getRec("genmst",
                              cols=["glm_desc"],
                              where=[("glm_cono", "=", self.opts["conum"]),
                                     ("glm_acno", "=", self.acno)],
                              limit=1)
        return acc

    def doImpBnk(self, frt, pag, r, c, p, i, w):
        self.bankac = w
        if not self.bankac:
            self.impfmt = "N"
            self.dtefmt = "N"
            self.df.loadEntry(frt, pag, p + 1, data=self.impfmt)
            self.df.loadEntry(frt, pag, p + 2, data=self.dtefmt)
            return "sk2"

    def doImpFmt(self, frt, pag, r, c, p, i, w):
        self.impfmt = w
        if self.impfmt == "N":
            self.dtefmt = "N"
            self.df.loadEntry(frt, pag, p + 1, data=self.dtefmt)
            return "nd"
        self.df.loadEntry(frt, pag, p + 1, data="A")

    def doDteFmt(self, frt, pag, r, c, p, i, w):
        if w not in ("A", "B", "C"):
            return "Invalid Date Format"
        self.dtefmt = w

    def doEnd(self):
        data = [
            self.opts["conum"], self.code, self.df.t_work[0][0][1], self.acno,
            self.bankac, self.impfmt, self.dtefmt
        ]
        if self.new == "y":
            self.sql.insRec("ctlctl", data=data)
        elif data != self.acc[:len(data)]:
            col = self.sql.ctlctl_col
            data.append(self.acc[col.index("ctl_xflag")])
            self.sql.updRec("ctlctl",
                            data=data,
                            where=[("ctl_cono", "=", self.opts["conum"]),
                                   ("ctl_code", "=", self.code)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doAccept(self):
        frt, pag, col, mes = self.df.doCheckFields()
        if mes:
            self.df.focusField(frt, pag, (col + 1), err=mes)
        else:
            self.df.doEndFrame("T", 0, cnf="N")

    def doCancel(self):
        self.opts["mf"].dbm.rollbackDbase()
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        table = ["ctlctl"]
        heads = ["General Ledger Control Accounts"]
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, "hide")
        RepPrt(self.opts["mf"],
               name="glc110",
               tables=table,
               heads=heads,
               where=[("ctl_cono", "=", self.opts["conum"])],
               order="ctl_code",
               prtdia=(("Y", "V"), ("Y", "N")))
        self.df.setWidget(self.df.mstFrame, "show")
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #15
0
class dr3050(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):
        self.sql = Sql(self.opts["mf"].dbm,
                       ["drsact", "drstyp", "drsmst", "drstrn"],
                       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.fromad = drsctl["ctd_emadd"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sysdttm = "(Printed on: %i/%02i/%02i at %02i:%02i) %6s" % (
            t[0], t[1], t[2], t[3], t[4], self.__class__.__name__)
        self.head = "%03u %-30s" % (self.opts["conum"], self.opts["conam"])
        self.colsh = [
            "Chn", "Acc-Num", "Name", "Cr-Balance", "Tot-Balance", "Current",
            "30-Days", "60-Days", "90-Days", "Over-90-Days"
        ]
        self.forms = [("UI", 3), ("NA", 7), ("NA", 30)] + [("SD", 13.2)] * 7
        self.gtots = [0] * 7
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Debtors Age Analysis (%s)" % self.__class__.__name__)
        dra = {
            "stype":
            "R",
            "tables": ("drsact", ),
            "cols": (("dac_code", "", 0, "Cod"), ("dac_desc", "", 0,
                                                  "Description", "Y"))
        }
        drt = {
            "stype":
            "R",
            "tables": ("drstyp", ),
            "cols": (("dtp_code", "", 0, "Cod"), ("dtp_desc", "", 0,
                                                  "Description", "Y"))
        }
        r1s = (("Agedt", "A"), ("Curdt", "C"))
        r2s = (("Yes", "Y"), ("No", "N"))
        r3s = (("Yes", "Y"), ("No", "N"), ("Only", "O"))
        if "args" in self.opts and "noprint" in self.opts["args"]:
            var = self.opts["args"]["work"][0]
            view = None
            mail = None
        else:
            var = ["A", "", "N", "", "", 0, "Y", "Y"]
            view = ("Y", "V")
            mail = ("Y", "N")
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "Base", "", var[0], "Y",
                self.doBase, None, None, None),
               (("T", 0, 1, 0), "ID2", 7, "Cut-Off Period", "",
                int(self.sysdtw / 100), "N", self.doCutOff, None, None,
                None), (("T", 0, 2, 0), ("IRB", r2s), 0, "Totals Only", "",
                        var[2], "N", self.doTots, None, None, None),
               (("T", 0, 3, 0), "IUA", 3, "Business Activity", "", var[3], "N",
                self.doDrsAct, dra, None,
                None), (("T", 0, 4, 0), "IUA", 3, "Business Type", "", var[4],
                        "N", self.doDrsTyp, drt, None, None),
               (("T", 0, 5, 0), "IUI", 7, "Lower Balance Limit", "", var[5],
                "N", self.doLimit, None, None, None),
               (("T", 0, 6, 0), ("IRB", r3s), 0, "Include Credit Balances", "",
                var[6], "N", self.doCredit, None, None, None),
               (("T", 0, 7, 0), ("IRB", r2s), 0, "Ignore Zero Balances", "",
                var[7], "N", self.doZero, None, None, None))
        tnd = ((self.doEnd, "Y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=view,
                               mail=mail)

    def doBase(self, frt, pag, r, c, p, i, w):
        self.base = w

    def doCutOff(self, frt, pag, r, c, p, i, w):
        self.cutoff = w
        self.opts["period"] = self.df.t_disp[pag][r][p]

    def doTots(self, frt, pag, r, c, p, i, w):
        self.totsonly = w
        if self.totsonly == "Y":
            if "args" not in self.opts or "noprint" not in self.opts["args"]:
                self.df.setWidget(self.df.topEntry[0][8][3][0], state="hide")
                self.df.setWidget(self.df.topEntry[0][8][4][0], state="hide")
            self.drsact = "All"
            self.df.loadEntry(frt, pag, p + 1, data=self.drsact)
            self.drstyp = "All"
            self.df.loadEntry(frt, pag, p + 2, data=self.drstyp)
            self.limit = 0
            self.df.loadEntry(frt, pag, p + 3, data=self.limit)
            self.credit = "Y"
            self.df.loadEntry(frt, pag, p + 4, data=self.credit)
            self.zero = "Y"
            self.df.loadEntry(frt, pag, p + 5, data=self.zero)
            return "sk5"
        elif "args" in self.opts and "noprint" in self.opts["args"]:
            pass
        else:
            self.df.setWidget(self.df.topEntry[0][8][3][0], state="show")
            self.df.setWidget(self.df.topEntry[0][8][4][0], state="show")

    def doDrsAct(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drsact",
                                  where=[("dac_code", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Account Activity"
            self.drsact = w
        else:
            self.drsact = "All"

    def doDrsTyp(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drstyp",
                                  where=[("dtp_code", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Account Activity"
            self.drstyp = w
        else:
            self.drstyp = "All"

    def doLimit(self, frt, pag, r, c, p, i, w):
        self.limit = w
        if self.limit:
            self.credit = "N"
            self.df.loadEntry(frt, pag, p + 1, data=self.limit)
            self.zero = "Y"
            self.df.loadEntry(frt, pag, p + 3, data=self.zero)
            return "sk2"

    def doCredit(self, frt, pag, r, c, p, i, w):
        self.credit = w
        if self.credit == "O":
            self.zero = "Y"
            self.df.loadEntry(frt, pag, p + 1, data=self.zero)
            return "sk1"

    def doZero(self, frt, pag, r, c, p, i, w):
        self.zero = w

    def doEnd(self):
        self.df.closeProcess()
        whr = [("drm_cono", "=", self.opts["conum"])]
        if self.drsact != "All":
            whr.append(("drm_bus_activity", "=", self.drsact))
        if self.drstyp != "All":
            whr.append(("drm_bus_type", "=", self.drstyp))
        odr = "drm_chain, drm_acno"
        recs = self.sql.getRec("drsmst",
                               cols=["drm_chain", "drm_acno", "drm_name"],
                               where=whr,
                               order=odr)
        if not recs:
            showError(self.opts["mf"].body, "Selection Error",
                      "No Records Selected")
        elif self.df.repprt[2] == "export":
            self.exportReport(recs)
        else:
            self.printReport(recs)
        if "args" in self.opts and "noprint" in self.opts["args"]:
            self.t_work = [self.df.t_work[0][0]]
        self.closeProcess()

    def exportReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        expnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__, self.opts["conum"])
        self.expheads = [self.head + " %s" % self.sysdttm]
        self.expheads.append("Debtor's Age Analaysis up to %s" %
                             self.opts["period"])
        self.expheads.append("Options: Activity %s Type %s Low-Bal %s "\
            "Cr-Bals %s Ignore-Zeros %s" % (self.drsact, self.drstyp,
            self.limit, self.credit, self.zero))
        self.expcolsh = [self.colsh]
        self.expforms = self.forms
        self.expdatas = []
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                p.closeProgress()
                return
            vals = self.getValues(dat)
            if not vals:
                continue
            line = ["BODY", [vals[0].work, vals[1].work, vals[2].work]]
            for val in vals[3:]:
                line[1].append(val.work)
            self.expdatas.append(line)
        p.closeProgress()
        self.grandTotal()
        doWriteExport(xtype=self.df.repprt[1],
                      name=expnam,
                      heads=self.expheads,
                      colsh=self.expcolsh,
                      forms=self.expforms,
                      datas=self.expdatas,
                      rcdic=self.opts["mf"].rcdic)

    def printReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        chrs = len(self.colsh)
        for f in self.forms:
            chrs += int(f[1])
        if f[0][0].lower() == "s":
            chrs -= 2
        else:
            chrs -= 1
        self.head1 = self.head
        self.head2 = "Debtor's Age Analysis up to %s" % self.opts["period"]
        pad = chrs - len(self.head2)
        self.head2 = self.head2 + (" " * pad)
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            self.opts["conum"],
                            ext="pdf")
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head2)
        self.pglin = 999
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                if self.fpdf.page:
                    self.fpdf.drawText()
                    self.fpdf.drawText("Print Job ABORTED")
                break
            vals = self.getValues(dat)
            if not vals:
                continue
            if self.totsonly != "Y":
                if self.pglin > self.fpdf.lpp:
                    self.pageHeading()
                self.fpdf.drawText("%s %s %s %s %s %s %s %s %s %s" % \
                    (vals[0].disp, vals[1].disp, vals[2].disp, vals[3].disp,
                    vals[4].disp, vals[5].disp, vals[6].disp, vals[7].disp,
                    vals[8].disp, vals[9].disp))
                self.pglin += 1
        p.closeProgress()
        if p.quit:
            return
        if self.totsonly == "Y":
            self.pageHeading()
        if self.fpdf.page:
            self.grandTotal()
            if "args" not in self.opts or "noprint" not in self.opts["args"]:
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"],
                          conum=self.opts["conum"],
                          pdfnam=pdfnam,
                          header=self.tit,
                          repprt=self.df.repprt,
                          fromad=self.fromad,
                          repeml=self.df.repeml)

    def getValues(self, data):
        chn = CCD(data[0], "UI", 3)
        acc = CCD(data[1], "NA", 7)
        name = CCD(data[2], "NA", 30)
        if self.base == "A":
            bals = Balances(self.opts["mf"],
                            "DRS",
                            self.opts["conum"],
                            self.cutoff,
                            keys=(data[0], data[1]))
            obal, cbal, ages = bals.doAllBals()
        else:
            pers = []
            yr = int(self.cutoff / 100)
            mt = int(self.cutoff % 100)
            for x in range(4):
                pers.append((yr * 100) + mt)
                mt -= 1
                if not mt:
                    yr -= 1
                    mt = 12
            cbal = 0
            ages = [0, 0, 0, 0, 0]
            bals = self.sql.getRec("drstrn",
                                   cols=["drt_curdt", "sum(drt_tramt)"],
                                   where=[("drt_cono", "=",
                                           self.opts["conum"]),
                                          ("drt_chain", "=", chn.work),
                                          ("drt_acno", "=", acc.work),
                                          ("drt_curdt", "<=", pers[0])],
                                   group="drt_curdt",
                                   order="drt_curdt")
            for bal in bals:
                try:
                    idx = pers.index(bal[0])
                except:
                    idx = 4
                ages[idx] = float(ASD(ages[idx]) + ASD(bal[1]))
                cbal = float(ASD(cbal) + ASD(bal[1]))
        bal = CCD(cbal, "SD", 13.2)
        if self.limit and bal.work < self.limit:
            return
        if self.zero == "Y" and not bal.work:
            return
        if self.credit == "N" and bal.work < 0:
            return
        if self.credit == "O" and bal.work >= 0:
            return
        cur = CCD(ages[0], "SD", 13.2)
        d30 = CCD(ages[1], "SD", 13.2)
        d60 = CCD(ages[2], "SD", 13.2)
        d90 = CCD(ages[3], "SD", 13.2)
        d120 = CCD(ages[4], "SD", 13.2)
        if bal.work < 0:
            deb = CCD(bal.work, "SD", 13.2)
        else:
            deb = CCD(0, "SD", 13.2)
        self.gtots[0] = float(ASD(self.gtots[0]) + ASD(deb.work))
        self.gtots[1] = float(ASD(self.gtots[1]) + ASD(bal.work))
        self.gtots[2] = float(ASD(self.gtots[2]) + ASD(cur.work))
        self.gtots[3] = float(ASD(self.gtots[3]) + ASD(d30.work))
        self.gtots[4] = float(ASD(self.gtots[4]) + ASD(d60.work))
        self.gtots[5] = float(ASD(self.gtots[5]) + ASD(d90.work))
        self.gtots[6] = float(ASD(self.gtots[6]) + ASD(d120.work))
        return (chn, acc, name, deb, bal, cur, d30, d60, d90, d120)

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head1)
        self.fpdf.drawText()
        self.fpdf.drawText(self.head2)
        self.fpdf.drawText()
        self.fpdf.drawText(
            "(%s%-3s%3s%6s%-3s%3s%9s%-8s%3s%13s%1s%3s%17s%s)" %
            ("Options: Activity: ", self.drsact, "", "Type: ", self.drstyp, "",
             "Low-Bal: ", self.limit, "", "Cr-Bals: ", self.credit, "",
             "Ignore-Zero-Bal: ", self.zero))
        self.fpdf.drawText()
        self.fpdf.drawText("%-3s %-7s %-30s %-13s %-13s %-13s %-13s %-13s "\
            "%-13s %-13s" % ("Chn", "Acc-Num", "Name", "  Cr-Balance",
            " Tot-Balance", "     Current", "     30-Days", "     60-Days",
            "     90-Days", "Over-90-Days"))
        self.fpdf.drawText("%s" % (self.fpdf.suc * len(self.head2)))
        self.fpdf.setFont()
        self.pglin = 8

    def grandTotal(self):
        if self.df.repprt[2] == "export":
            self.expdatas.append(["ULINES"])
            self.expdatas.append(
                ["TOTAL", ["", "", "Grand Totals"] + self.gtots])
            self.expdatas.append(["ULINED"])
            return
        ldic = {}
        for x in range(0, 7):
            ldic["t%s" % x] = CCD(self.gtots[x], "SD", 13.2)
            if self.gtots[1] == 0:
                ldic["p%s" % x] = CCD(0, "SD", 13.2)
            else:
                ldic["p%s" % x] = CCD(
                    round((self.gtots[x] / self.gtots[1] * 100), 2), "OSD",
                    13.2)
        self.fpdf.drawText()
        self.fpdf.drawText("%-11s %-30s %13s %13s %13s %13s %13s %13s %13s" %
                           (" ", "Grand Totals", ldic["t0"].disp,
                            ldic["t1"].disp, ldic["t2"].disp, ldic["t3"].disp,
                            ldic["t4"].disp, ldic["t5"].disp, ldic["t6"].disp))
        self.fpdf.drawText()
        self.fpdf.drawText("%-11s %-30s %13s %13s %13s %13s %13s %13s %13s" %
                           (" ", "Percentages", ldic["p0"].disp,
                            ldic["p1"].disp, ldic["p2"].disp, ldic["p3"].disp,
                            ldic["p4"].disp, ldic["p5"].disp, ldic["p6"].disp))

    def doExit(self):
        self.df.closeProcess()
        self.closeProcess()

    def closeProcess(self):
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #16
0
class dr1010(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):
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlmes", "ctlrep", "chglog", "ctlnot", "slsiv1", "drsact",
            "drschn", "drsdel", "drsmst", "drstrn", "drstyp"
        ],
                       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"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        return True

    def mainProcess(self):
        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"] = [["T", "drm_chain", 0]]
        else:
            drm["where"] = [("drm_cono", "=", self.opts["conum"]),
                            ("drm_chain", "=", 0)]
        drm["where"].append(("drm_stat", "<>", "X"))
        dlm = {
            "stype":
            "R",
            "tables": ("drsdel", ),
            "cols": (("del_code", "", 0, "Del-Cod"), ("del_add1", "", 0,
                                                      "Address", "Y"))
        }
        rpm = {
            "stype": "R",
            "tables": ("ctlrep", ),
            "cols":
            (("rep_code", "", 0, "Rep"), ("rep_name", "", 0, "Name", "Y")),
            "where": [("rep_cono", "=", self.opts["conum"])]
        }
        act = {
            "stype":
            "R",
            "tables": ("drsact", ),
            "cols": (("dac_code", "", 0, "Cod"), ("dac_desc", "", 0,
                                                  "Description", "Y"))
        }
        typ = {
            "stype":
            "R",
            "tables": ("drstyp", ),
            "cols": (("dtp_code", "", 0, "Cod"), ("dtp_desc", "", 0,
                                                  "Description", "Y"))
        }
        msi = {
            "stype":
            "R",
            "tables": ("ctlmes", ),
            "cols": (("mss_message", "", 0, "Num"), ("mss_detail", "NA", 50,
                                                     "Details", "Y")),
            "where": [("mss_system", "=", "INV")]
        }
        mss = {
            "stype":
            "R",
            "tables": ("ctlmes", ),
            "cols": (("mss_message", "", 0, "Num"), ("mss_detail", "NA", 50,
                                                     "Details", "Y")),
            "where": [("mss_system", "=", "STA")]
        }
        tag = (("Basic-_A", None, ("T", 1, 1), ("T", 0, 1)),
               ("Basic-_B", None, ("T", 1, 1), ("T", 0, 1)))
        r1s = (("Yes", "Y"), ("No", "N"))
        r2s = (("New", "N"), ("Good", "G"), ("Fair", "F"), ("Poor", "P"),
               ("Bad", "B"))
        self.fld = [
            [("T",0,0,0),"IUI",3,"Chain Store","",
                "","Y",self.doChain,drc,None,("efld",)],
            [("T",0,0,14),"INA",7,"Acc-Num","Account Number",
                "","N",self.doAcno,drm,None,("efld",),None,
                "To Automatically Generate Account Numbers for "\
                "New Accounts enter a Blank Account Number."],
            (("T",0,0,30),"INA",30,"Name","",
                "","N",self.doName,None,self.doDelete,("notblank",)),
            [("T",0,0,0),"INA",7,"Acc-Num","Account Number",
                "","Y",self.doAcno,drm,None,("efld",),None,
                "To Automatically Generate Account Numbers for "\
                "New Accounts enter a Blank Account Number."],
            (("T",0,0,14),"INA",30,"Name","",
                "","N",self.doName,None,self.doDelete,("notblank",)),
            (("T",1,0,0),"INA",30,"Address Line 1","",
                "","N",None,None,None,("notblank",)),
            (("T",1,1,0),"INA",30,"Address Line 2","",
                "","N",None,None,None,("efld",)),
            (("T",1,2,0),"INA",30,"Address Line 3","",
                "","N",None,None,None,("efld",)),
            (("T",1,3,0),"INA",4,"Postal Code","",
                "","N",None,None,None,("efld",)),
            (("T",1,4,0),"INA",20,"Telephone","",
                "","N",None,None,None,("efld",)),
            (("T",1,5,0),"INA",20,"Fax","",
                "","N",None,None,None,("efld",)),
            (("T",1,6,0),"INA",30,"Manager","Manager's Name",
                "","N",None,None,None,("efld",)),
            (("T",1,6,47),"ITX",30,"E-Mail","Manager's E-Mail Address",
                "","N",None,None,None,("email",)),
            (("T",1,7,0),"INA",30,"Accounts","Accounts Contact",
                "","N",None,None,None,("efld",)),
            (("T",1,7,47),"ITX",30,"E-Mail","Accounts E-Mail Address",
                "","N",None,None,None,("email",)),
            (("T",1,8,0),"INA",30,"Sales","Sales Contact",
                "","N",None,None,None,("efld",)),
            (("T",1,8,47),"ITX",30,"E-Mail","Sales E-Mail Address",
                "","N",None,None,None,("email",)),
            (("T",1,9,0),"Id1",10,"Date Opened","Date Account Opened",
                self.sysdtw,"N",None,None,None,("efld",)),
            (("T",1,10,0),"Id1",10,"Date Registered","",
                "","N",None,None,None,("efld",)),
            (("T",1,11,0),"INA",10,"V.A.T Number","",
                "","N",None,None,None,("efld",)),
            (("T",1,12,0),"INa",7,"Delivery Code","",
                "","N",self.doDelivery,dlm,None,("efld",)),
            (("T",1,13,0),"INa",3,"Rep Code","",
                "","N",self.doRep,rpm,None,("efld",)),
            (("T",1,13,20),"ONA",26,""),
            (("T",1,14,0),"IUA",3,"Business Activity","",
                "","N",self.doBusAct,act,None,("efld",)),
            (("T",1,14,20),"ONA",26,""),
            (("T",1,15,0),"IUA",3,"Business Type","",
                "","N",self.doBusTyp,typ,None,("efld",)),
            (("T",1,15,20),"ONA",26,""),
            (("T",2,0,0),"IUI",1,"Price Level","",
                "","N",None,None,None,("efld",)),
            (("T",2,1,0),"IUD",5.2,"Discount Percentage","",
                "","N",None,None,None,("efld",)),
            (("T",2,2,0),"IUD",5.2,"Interest Percentage","",
                "","N",None,None,None,("efld",)),
            (("T",2,3,0),"IUI",3,"Referral Terms","",
                "","N",None,None,None,("efld",)),
            (("T",2,4,0),"IUI",3,"Rejected Terms","",
                "","N",None,None,None,("efld",)),
            (("T",2,5,0),"IUI",5,"Credit Limit","",
                "","N",None,None,None,("efld",)),
            (("T",2,6,0),("IRB",r1s),0,"Stop Indicator","",
                "N","N",None,None,None,None),
            (("T",2,7,0),"IUI",3,"Invoice Message","",
                "","N",self.doImes,msi,None,("efld",)),
            (("T",2,7,22),"ONA",50,""),
            (("T",2,8,0),"IUI",3,"Statement Message","",
                "","N",self.doSmes,mss,None,("efld",)),
            (("T",2,8,22),"ONA",50,""),
            (("T",2,9,0),("IRB",r2s),0,"Credit Rating","",
                "N","N",None,None,None,None)]
        but = (("Import", None, self.doImport, 0, ("T", 0, 1), ("T", 0, 2),
                "Import Account Details from a CSV or XLS File."),
               ("Accept", None, self.doAccept, 0, ("T", 1, 1), ("T", 0, 1)),
               ("Print", None, self.doPrint, 0, ("T", 1, 1), ("T", 0, 1)),
               ("Cancel", None, self.doCancel, 0, ("T", 1, 1),
                ("T", 0, 1)), ("Quit", None, self.doExit1, 1, None, None))
        tnd = ((self.doEnd1, "N"), (self.doEnd2, "N"), (self.doAccept, "Y"))
        txt = (self.doExit1, self.doExit2, self.doExit3)
        if self.chains == "Y":
            del self.fld[3]
            del self.fld[3]
        else:
            del self.fld[0]
            del self.fld[0]
            del self.fld[0]
            self.chain = 0
        self.df = TartanDialog(self.opts["mf"],
                               eflds=self.fld,
                               tags=tag,
                               butt=but,
                               tend=tnd,
                               txit=txt,
                               clicks=self.doClick)
        if "args" in self.opts:
            if self.chains == "Y":
                self.df.doKeyPressed("T", 0, 0, data=self.opts["args"][0])
                self.df.doKeyPressed("T", 0, 1, data=self.opts["args"][1])
            else:
                self.chain = self.opts["args"][0]
                self.df.doKeyPressed("T", 0, 0, data=self.opts["args"][1])

    def doClick(self, *opts):
        if self.df.pag == 0:
            return
        self.df.focusField("T", opts[0][0], opts[0][1] + 1)

    def doChain(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drschn",
                                  where=[("chm_cono", "=", self.opts["conum"]),
                                         ("chm_chain", "=", self.chain)],
                                  limit=1)
            if not acc:
                return "Invalid Chain Store"
        self.chain = w

    def doAcno(self, frt, pag, r, c, p, i, w):
        self.acno = w
        if self.acno:
            self.old = self.sql.getRec("drsmst",
                                       where=[("drm_cono", "=",
                                               self.opts["conum"]),
                                              ("drm_chain", "=", self.chain),
                                              ("drm_acno", "=", self.acno)],
                                       limit=1)
        if not self.acno or not self.old:
            ok = askQuestion(self.opts["mf"].body,
                             "New Account",
                             "Is This a New Account?",
                             default="no")
            if ok == "no":
                return "Invalid Account Number"
            pw = PwdConfirm(self.opts["mf"],
                            conum=self.opts["conum"],
                            system="DRS",
                            code="NewAcc")
            if pw.flag == "no":
                if "args" in self.opts:
                    return "xt"
                else:
                    return "New Account Creation is Not Allowed"
            self.new = True
        elif self.old[self.sql.drsmst_col.index("drm_stat")] == "X":
            return "Invalid Account, Redundant"
        else:
            self.new = False
            self.df.loadEntry("T", pag, p + 1, data=self.old[3])
            d = 4
            for pg in range(1, self.df.pgs + 1):
                for x in range(0, self.df.topq[pg]):
                    if pg == 1 and x in (17, 19, 21):
                        continue
                    if pg == 2 and x in (8, 10):
                        continue
                    if pg == 2 and x == 11 and not self.old[d]:
                        data = "N"
                    else:
                        data = self.old[d]
                    self.df.loadEntry("T", pg, x, data=data)
                    d += 1
            self.loadRep()
            self.loadAct()
            self.loadTyp()
            self.loadInvMess()
            self.loadStaMess()

    def loadRep(self):
        acc = self.sql.getRec("ctlrep",
                              cols=["rep_name"],
                              where=[("rep_cono", "=", self.opts["conum"]),
                                     ("rep_code", "=",
                                      self.df.t_work[1][0][16])],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, 17, data=acc[0])

    def loadAct(self):
        acc = self.sql.getRec("drsact",
                              cols=["dac_desc"],
                              where=[("dac_code", "=",
                                      self.df.t_work[1][0][18])],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, 19, data=acc[0])

    def loadTyp(self):
        acc = self.sql.getRec("drstyp",
                              cols=["dtp_desc"],
                              where=[("dtp_code", "=",
                                      self.df.t_work[1][0][20])],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, 21, data=acc[0])

    def loadInvMess(self):
        acc = self.sql.getRec("ctlmes",
                              cols=["mss_detail"],
                              where=[("mss_system", "=", "INV"),
                                     ("mss_message", "=",
                                      self.df.t_work[2][0][7])],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 2, 8, data=acc[0])

    def loadStaMess(self):
        acc = self.sql.getRec("ctlmes",
                              cols=["mss_detail"],
                              where=[("mss_system", "=", "STA"),
                                     ("mss_message", "=",
                                      self.df.t_work[2][0][9])],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 2, 10, data=acc[0])

    def doName(self, frt, pag, r, c, p, i, w):
        self.name = w
        if self.new and not self.acno:
            for x in range(1, 100):
                self.acno = genAccNum(self.name, x, 7)
                chk = self.sql.getRec("drsmst",
                                      where=[("drm_cono", "=",
                                              self.opts["conum"]),
                                             ("drm_chain", "=", self.chain),
                                             ("drm_acno", "=", self.acno)],
                                      limit=1)
                if not chk:
                    break
            self.df.loadEntry("T", 0, 0, data=self.acno)

    def doDelivery(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drsdel",
                                  where=[("del_code", "=", w)],
                                  limit=1)
            if not acc:
                ok = askQuestion(self.opts["mf"].body, head="Delivery Address",
                    mess="This Delivery Address Does Not Exist, Would "\
                    "You Like to Create It Now?", default="no")
                if ok == "no":
                    return "rf"
                callModule(self.opts["mf"],
                           self.df,
                           "drc410",
                           coy=(self.opts["conum"], self.opts["conam"]),
                           period=None,
                           user=None,
                           args=w)
                acc = self.sql.getRec("drsdel",
                                      where=[("del_code", "=", w)],
                                      limit=1)
                if not acc:
                    return "rf"

    def doRep(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("ctlrep",
                                  cols=["rep_name"],
                                  where=[("rep_cono", "=", self.opts["conum"]),
                                         ("rep_code", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Rep"
            self.df.loadEntry("T", 1, p + 1, data=acc[0])

    def doBusAct(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drsact",
                                  cols=["dac_desc"],
                                  where=[("dac_code", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Business Activity"
            self.df.loadEntry("T", 1, p + 1, data=acc[0])

    def doBusTyp(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drstyp",
                                  cols=["dtp_desc"],
                                  where=[("dtp_code", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Business Type"
            self.df.loadEntry("T", 1, p + 1, data=acc[0])

    def doImes(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("ctlmes",
                                  cols=["mss_detail"],
                                  where=[("mss_system", "=", "INV"),
                                         ("mss_message", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Invoice Message"
            self.df.loadEntry("T", 2, p + 1, data=acc[0])

    def doSmes(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 Statement Message"
            self.df.loadEntry("T", 2, p + 1, data=acc[0])

    def doDelete(self):
        trs = self.sql.getRec("drstrn",
                              cols=["count(*)"],
                              where=[("drt_cono", "=", self.opts["conum"]),
                                     ("drt_chain", "=", self.chain),
                                     ("drt_acno", "=", self.acno)],
                              limit=1)
        if trs[0]:
            return "%s Transactions Exist, Not Deleted" % trs[0]
        iv1 = self.sql.getRec("slsiv1",
                              cols=["count(*)"],
                              where=[("si1_cono", "=", self.opts["conum"]),
                                     ("si1_chain", "=", self.chain),
                                     ("si1_acno", "=", self.acno)],
                              limit=1)
        if iv1[0]:
            return "%s Sales Document Exists, Not Deleted" % iv1[0]
        key = "%03i%s" % (self.chain, self.acno)
        nte = self.sql.getRec("ctlnot",
                              cols=["count(*)"],
                              where=[("not_cono", "=", self.opts["conum"]),
                                     ("not_sys", "=", "DRS"),
                                     ("not_key", "=", key)],
                              limit=1)
        if nte[0]:
            return "%s Notes Exist, Not Deleted" % nte[0]
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        self.sql.delRec("drsmst",
                        where=[("drm_cono", "=", self.opts["conum"]),
                               ("drm_chain", "=", self.chain),
                               ("drm_acno", "=", self.acno)])
        self.sql.insRec("chglog", data=["drsmst", "D", "%03i%03i%-7s" % \
            (self.opts["conum"], self.chain, self.acno), "", dte,
            self.opts["capnm"], "", "", "", 0])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doEnd1(self):
        self.df.focusField("T", 1, 1, clr=self.new)

    def doEnd2(self):
        self.df.selPage("Basic-B")
        self.df.focusField("T", 2, 1, clr=self.new)

    def doAccept(self):
        frt, pag, col, mes = self.df.doCheckFields()
        if mes:
            if pag > 0 and pag != self.df.pag:
                if frt == "T":
                    self.df.last[pag][0] = col + 1
                else:
                    self.df.last[pag][1] = col + 1
                self.df.selPage(self.df.tags[pag - 1][0])
            else:
                self.df.focusField(frt, pag, (col + 1), err=mes)
        else:
            data = [self.opts["conum"], self.chain]
            if self.chains == "Y":
                f = 1
            else:
                f = 0
            for x in range(f, f + 2):
                data.append(self.df.t_work[0][0][x])
            for x in range(0, len(self.df.t_work[1][0])):
                if x in (17, 19, 21):
                    continue
                data.append(self.df.t_work[1][0][x])
            for x in range(0, len(self.df.t_work[2][0])):
                if x in (8, 10):
                    continue
                data.append(self.df.t_work[2][0][x])
            if self.new:
                data.extend(["N", ""])
                self.sql.insRec("drsmst", data=data)
            else:
                col = self.sql.drsmst_col
                data.append(self.old[col.index("drm_stat")])
                data.append(self.old[col.index("drm_xflag")])
                if data != self.old:
                    self.sql.updRec("drsmst",
                                    data=data,
                                    where=[("drm_cono", "=",
                                            self.opts["conum"]),
                                           ("drm_chain", "=", self.chain),
                                           ("drm_acno", "=", self.acno)])
                    dte = int("%04i%02i%02i%02i%02i%02i" %
                              time.localtime()[:-3])
                    for num, dat in enumerate(self.old):
                        if dat != data[num]:
                            self.sql.insRec(
                                "chglog",
                                data=[
                                    "drsmst", "U",
                                    "%03i%03i%-7s" % (self.opts["conum"],
                                                      self.chain, self.acno),
                                    col[num], dte, self.opts["capnm"],
                                    str(dat),
                                    str(data[num]), "", 0
                                ])
            if "args" in self.opts:
                self.doExit1()
            else:
                self.opts["mf"].dbm.commitDbase()
                self.df.last[0] = [0, 0]
                self.df.selPage("Basic-A")
                self.df.focusField("T", 0, 1)

    def doImport(self):
        self.df.setWidget(self.df.B3, state="disabled")
        self.df.setWidget(self.df.mstFrame, state="hide")
        fi = FileImport(self.opts["mf"], imptab="drsmst", impskp=["drm_cono"])
        sp = ProgressBar(self.opts["mf"].body,
                         typ="Importing Debtor's Accounts",
                         mxs=len(fi.impdat))
        err = None
        for num, line in enumerate(fi.impdat):
            sp.displayProgress(num)
            if not line[1]:
                if not line[2]:
                    err = "Blank Account Number and Blank Name"
                    break
                for x in range(1, 100):
                    line[1] = genAccNum(line[2], x, 7)
                    chk = self.sql.getRec("drsmst",
                                          where=[("drm_cono", "=",
                                                  self.opts["conum"]),
                                                 ("drm_chain", "=", line[0]),
                                                 ("drm_acno", "=", line[1])],
                                          limit=1)
                    if not chk:
                        break
            chk = self.sql.getRec("drsmst",
                                  where=[("drm_cono", "=", self.opts["conum"]),
                                         ("drm_chain", "=", line[0]),
                                         ("drm_acno", "=", line[1])],
                                  limit=1)
            if chk:
                err = "%s %s %s %s Already Exists" % (fi.impcol[0][0], line[0],
                                                      fi.impcol[1][0], line[1])
                break
            if not line[2]:
                err = "Blank Name"
                break
            if not line[15]:
                line[15] = self.sysdtw
            if not line[28]:
                line[28] = "N"
            if not line[31]:
                line[31] = "N"
            line.insert(0, self.opts["conum"])
            self.sql.insRec("drsmst", data=line)
        sp.closeProgress()
        if err:
            err = "Line %s: %s" % ((num + 1), err)
            showError(
                self.opts["mf"].body, "Import Error", """%s

Please Correct your Import File and then Try Again.""" % err)
            self.opts["mf"].dbm.rollbackDbase()
        else:
            self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doPrint(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        TabPrt(self.opts["mf"],
               self.opts["conum"],
               self.opts["conam"],
               name=self.__class__.__name__,
               tabs="drsmst",
               where=[("drm_cono", "=", self.opts["conum"]),
                      ("drm_chain", "=", self.chain),
                      ("drm_acno", "=", self.acno)])
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doCancel(self):
        self.opts["mf"].dbm.rollbackDbase()
        self.df.last[0] = [0, 0]
        self.df.selPage("Basic-A")
        self.df.focusField("T", 0, 1)

    def doExit1(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()

    def doExit2(self):
        self.df.focusField("T", 0, 1)

    def doExit3(self):
        self.df.selPage("Basic-A")
Пример #17
0
class rt3020(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, ["ctlmst", "rtlmst", "rtltrn"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        rtlctl = gc.getCtl("rtlctl", self.opts["conum"])
        if not rtlctl:
            return
        self.fromad = rtlctl["ctr_emadd"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sysdttm = "(Printed on: %i/%02i/%02i at %02i:%02i)" % \
            (t[0], t[1], t[2], t[3], t[4])
        self.colsh = [
            "TP", "BatchNo", "Prm-Cod", "Acc-Num", "Name", "Reference", "Date",
            "Debits", "Credits", "Tax-Amount", "T", "Remarks"
        ]
        self.forms = [("UI", 2, False, False, True), ("Na", 7), ("NA", 7),
                      ("NA", 7), ("NA", 30), ("Na", 9), ("D1", 10),
                      ("SD", 13.2), ("SD", 13.2), ("SD", 13.2), ("UA", 1),
                      ("NA", 30)]
        self.s_per = int(self.opts["period"][1][0] / 100)
        self.e_per = int(self.opts["period"][2][0] / 100)
        self.gqt = [0] * (len(rttrtp) + 1)
        self.gdr = [0] * (len(rttrtp) + 1)
        self.gcr = [0] * (len(rttrtp) + 1)
        self.gvt = [0] * (len(rttrtp) + 1)
        self.totind = "N"
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Rental's Ledger Audit Trail (%s)" %
                    self.__class__.__name__)
        data = ["All Types"]
        for typ in rttrtp:
            data.append(typ[1])
        btt = {"stype": "C", "titl": "Valid Types", "data": data, "retn": "I"}
        btm = {
            "stype":
            "R",
            "tables": ("rtltrn", ),
            "cols": (("rtt_batch", "", 0,
                      "Bat-Num"), ("rtt_type", ("xx", rttrtp), 20, "Type"),
                     ("rtt_curdt", "", 0, "Cur-Dat")),
            "where": [],
            "group":
            "rtt_batch, rtt_type, rtt_curdt",
            "order":
            "rtt_type, rtt_curdt, rtt_batch"
        }
        r1s = (("Financial", "F"), ("Capture", "C"))
        r2s = (("Yes", "Y"), ("No", "N"))
        fld = [(("T", 0, 0, 0), ("IRB", r1s), 0, "Period Type", "", "F", "Y",
                self.doPtyp, None, None, None),
               (("T", 0, 1, 0), "Id2", 7, "Starting Period", "", self.s_per,
                "Y", self.doStartPer, None, None, ("efld", )),
               (("T", 0, 2, 0), "Id2", 7, "Ending Period", "", self.e_per, "Y",
                self.doEndPer, None, None, ("efld", )),
               (("T", 0, 3, 0), "Id1", 10, "Starting Date", "", self.sysdtw,
                "Y", self.doStartDat, None, None, ("efld", )),
               (("T", 0, 4, 0), "Id1", 10, "Ending Date", "", self.sysdtw, "Y",
                self.doEndDat, None, None, ("efld", )),
               (("T", 0, 5, 0), "IUI", 1, "Type", "Transaction Type", "", "Y",
                self.doBatTyp, btt, None, None),
               (("T", 0, 6, 0), "INa", 7, "Batch Number", "", "", "Y",
                self.doBatNum, btm, None, None),
               (("T", 0, 7, 0), ("IRB", r2s), 0, "Totals Only", "", "Y", "Y",
                self.doTots, None, None, None)]
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=("Y", "V"),
                               mail=("Y", "N"))

    def doPtyp(self, frt, pag, r, c, p, i, w):
        self.ptyp = w
        if self.ptyp == "C":
            return "sk2"

    def doStartPer(self, frt, pag, r, c, p, i, w):
        if not w:
            w = self.s_per
        elif w < self.s_per or w > self.e_per:
            return "Invalid Period"
        self.sperw = w
        self.df.loadEntry(frt, pag, p, data=self.sperw)
        self.sperd = self.df.t_disp[pag][0][i]

    def doEndPer(self, frt, pag, r, c, p, i, w):
        if not w:
            w = self.e_per
        elif w < self.sperw or w > self.e_per:
            return "Invalid Period"
        self.eperw = w
        self.df.loadEntry(frt, pag, p, self.eperw)
        self.eperd = self.df.t_disp[pag][0][i]
        return "sk2"

    def doStartDat(self, frt, pag, r, c, p, i, w):
        self.sdatw = w
        self.df.loadEntry(frt, pag, p, data=self.sdatw)
        self.sperd = self.df.t_disp[pag][0][i]

    def doEndDat(self, frt, pag, r, c, p, i, w):
        if w < self.sdatw:
            return "Invalid Date"
        self.edatw = w
        self.df.loadEntry(frt, pag, p, self.edatw)
        self.eperd = self.df.t_disp[pag][0][i]

    def doBatTyp(self, frt, pag, r, c, p, i, w):
        if w > len(rttrtp):
            return "Invalid Batch Type"
        self.btyp = w
        self.whr = [("rtt_cono", "=", self.opts["conum"])]
        if self.ptyp == "F":
            self.whr.append(("rtt_curdt", "between", self.sperw, self.eperw))
        else:
            self.whr.append(("rtt_capdt", "between", self.sdatw, self.edatw))
        if self.btyp:
            self.whr.append(("rtt_type", "=", self.btyp))
        self.df.topf[pag][i + 1][8]["where"] = self.whr

    def doBatNum(self, frt, pag, r, c, p, i, w):
        self.batch = w

    def doTots(self, frt, pag, r, c, p, i, w):
        self.totsonly = w
        if self.totsonly == "Y":
            self.df.setWidget(self.df.topEntry[0][8][3][0], state="hide")
            self.df.setWidget(self.df.topEntry[0][8][4][0], state="hide")
        else:
            self.df.setWidget(self.df.topEntry[0][8][3][0], state="show")
            self.df.setWidget(self.df.topEntry[0][8][4][0], state="show")

    def doEnd(self):
        self.df.closeProcess()
        jon = "left outer join rtlmst on rtt_cono=rtm_cono and "\
            "rtt_code=rtm_code and rtt_acno=rtm_acno"
        col = [
            "rtt_code", "rtt_acno", "rtt_trdt", "rtt_type", "rtt_refno",
            "rtt_batch", "rtt_tramt", "rtt_taxamt", "rtt_desc", "rtt_taxind",
            "rtm_name"
        ]
        odr = "rtt_type, rtt_batch, rtt_trdt, rtt_refno"
        recs = self.sql.getRec("rtltrn",
                               join=jon,
                               cols=col,
                               where=self.whr,
                               order=odr)
        if not recs:
            showError(self.opts["mf"].body, "Transaction Error",
                      "No Transactions Selected")
        elif self.df.repprt[2] == "export":
            self.exportReport(recs)
        else:
            self.printReport(recs)
        self.closeProcess()

    def exportReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        expnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__, self.opts["conum"])
        self.expheads = [
            "%03u %-30s %s" %
            (self.opts["conum"], self.opts["conam"], self.sysdttm)
        ]
        self.expheads.append("Rental's Ledger Audit Trail for Period "\
            "%s to %s" % (self.sperd, self.eperd))
        self.expcolsh = [self.colsh]
        self.expforms = self.forms
        self.expdatas = []
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                p.closeProgress()
                return
            vals = self.getValues(dat)
            if not vals:
                continue
            code, acno, trdt, trtp, refno, batch, debit, credit, taxamt, \
                detail, taxind, name = vals
            line = [
                "BODY",
                [
                    trtp.work, batch.work, code.work, acno.work, name.work,
                    refno.work, trdt.work, debit.work, credit.work,
                    taxamt.work, taxind.work, detail.work
                ]
            ]
            self.expdatas.append(line)
        p.closeProgress()
        self.grandTotal()
        doWriteExport(xtype=self.df.repprt[1],
                      name=expnam,
                      heads=self.expheads,
                      colsh=self.expcolsh,
                      forms=self.expforms,
                      datas=self.expdatas,
                      rcdic=self.opts["mf"].rcdic)

    def printReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        if self.totsonly == "Y":
            self.head = "%03u %-87s" % (self.opts["conum"], self.opts["conam"])
        else:
            self.head = "%03u %-133s" % (self.opts["conum"],
                                         self.opts["conam"])
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            self.opts["conum"],
                            ext="pdf")
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.bqty = 0
        self.bdrs = 0
        self.bcrs = 0
        self.bvat = 0
        self.tqty = 0
        self.tdrs = 0
        self.tcrs = 0
        self.tvat = 0
        self.trtp = 0
        self.pglin = 999
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                break
            vals = self.getValues(dat)
            if not vals:
                continue
            code, acno, trdt, trtp, refno, batch, debit, credit, taxamt, \
                detail, taxind, name = vals
            if not self.trtp:
                self.trtp = trtp.work
                self.batch = batch.work
            if trtp.work != self.trtp:
                self.batchTotal()
                self.typeTotal()
                self.trtp = trtp.work
                self.batch = batch.work
                self.pglin = 999
            if batch.work != self.batch:
                self.batchTotal()
                self.batch = batch.work
                if self.totsonly != "Y":
                    self.typeHeading()
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
            if self.totsonly != "Y":
                self.fpdf.drawText(
                    "%s %s %s %s %s %s %s %s %s %s" %
                    (code.disp, acno.disp, name.disp, refno.disp, trdt.disp,
                     debit.disp, credit.disp, taxamt.disp, taxind.disp,
                     detail.disp))
                self.pglin += 1
            # Batch Totals
            self.bqty += 1
            self.bdrs = float(ASD(self.bdrs) + ASD(debit.work))
            self.bcrs = float(ASD(self.bcrs) + ASD(credit.work))
            self.bvat = float(ASD(self.bvat) + ASD(taxamt.work))
            # Type Totals
            self.tqty += 1
            self.tdrs = float(ASD(self.tdrs) + ASD(debit.work))
            self.tcrs = float(ASD(self.tcrs) + ASD(credit.work))
            self.tvat = float(ASD(self.tvat) + ASD(taxamt.work))
        p.closeProgress()
        if self.fpdf.page and not p.quit:
            self.batchTotal()
            self.typeTotal()
            self.grandTotal()
            self.fpdf.output(pdfnam, "F")
            doPrinter(mf=self.opts["mf"],
                      conum=self.opts["conum"],
                      pdfnam=pdfnam,
                      header=self.tit,
                      repprt=self.df.repprt,
                      fromad=self.fromad,
                      repeml=self.df.repeml)

    def getValues(self, data):
        code = CCD(data[0], "NA", 7)
        acno = CCD(data[1], "NA", 7)
        trdt = CCD(data[2], "D1", 10)
        trtp = CCD(data[3], "UI", 2)
        refno = CCD(data[4], "Na", 9)
        batch = CCD(data[5], "Na", 7)
        if data[6] < 0:
            debit = CCD(0, "SD", 13.2)
            credit = CCD(data[6], "SD", 13.2)
        else:
            debit = CCD(data[6], "SD", 13.2)
            credit = CCD(0, "SD", 13.2)
        taxamt = CCD(data[7], "SD", 13.2)
        detail = CCD(data[8], "NA", 30)
        taxind = CCD(data[9], "NA", 1)
        name = CCD(data[10], "NA", 30)
        self.gqt[trtp.work - 1] = self.gqt[trtp.work - 1] + 1
        self.gdr[trtp.work - 1] = float(ASD(self.gdr[trtp.work - 1]) + \
            ASD(debit.work))
        self.gcr[trtp.work - 1] = float(ASD(self.gcr[trtp.work - 1]) + \
            ASD(credit.work))
        self.gvt[trtp.work - 1] = float(ASD(self.gvt[trtp.work - 1]) + \
            ASD(taxamt.work))
        return (code, acno, trdt, trtp, refno, batch, debit, credit, taxamt,
                detail, taxind, name)

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        self.fpdf.drawText("%-38s %-7s %-2s %-7s" % \
            ("Rental's Ledger Audit Trail for Period",
            self.sperd, "to", self.eperd))
        self.fpdf.drawText()
        self.pglin = 4
        if self.totind == "N":
            self.typeHeading()
        else:
            self.fpdf.drawText("%-14s" % "Totals Summary")
            self.fpdf.drawText()
            if self.totsonly == "Y":
                self.fpdf.drawText("%-27s%-8s  %-13s %-13s %-13s %-13s" % \
                    ("Document Type", "Quantity", "      Debits",
                    "     Credits", "  Difference", "      V.A.T."))
            else:
                self.fpdf.drawText("%-34s%-8s  %-13s %-13s %-13s %-13s" % \
                    ("Document Type", "Quantity", "      Debits",
                    "     Credits", "  Difference", "      V.A.T."))
            self.fpdf.underLine(txt=self.head)
            self.fpdf.setFont()
            self.pglin += 4

    def typeHeading(self):
        if self.totsonly != "Y":
            batch = self.batch
        else:
            batch = "Various"
        if self.fpdf.lpp - self.pglin < 7:
            self.pageHeading()
            return
        self.fpdf.setFont(style="B")
        self.fpdf.drawText("%-7s %7s %-10s %3s" % \
            ("Batch", batch, "    Type", rttrtp[self.trtp - 1][1]))
        self.fpdf.drawText()
        if self.totsonly == "Y":
            self.fpdf.drawText("%-36s %-13s %-13s %-13s %-13s" % \
                ("Details", "      Debits", "     Credits", "  Difference",
                "      V.A.T."))
        else:
            self.fpdf.drawText("%-7s %-7s %-30s %-9s %-10s %-13s %-13s %-13s "\
                "%-1s %-30s" % ("Prm-Num", "Acc-Num", "Name", "Reference",
                "   Date", "      Debits", "     Credits", "  Tax-Amount",
                "T", "Remarks"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin += 4

    def batchTotal(self):
        j = CCD(self.bdrs, "SD", 13.2)
        k = CCD(self.bcrs, "SD", 13.2)
        l = CCD(float(ASD(j.work) + ASD(k.work)), "SD", 13.2)
        m = CCD(self.bvat, "SD", 13.2)
        if self.totsonly == "Y":
            self.fpdf.drawText("%-36s %13s %13s %13s %13s" % \
                ("Batch " + self.batch + " Totals", j.disp,
                k.disp, l.disp, m.disp))
            self.pglin += 1
        else:
            self.fpdf.drawText()
            self.fpdf.drawText("%-15s %-51s %13s %13s %13s" %
                               (" ", "Batch " + self.batch + " Totals", j.disp,
                                k.disp, m.disp))
            self.fpdf.drawText()
            self.pglin += 3
        self.bqty = 0
        self.bcrs = 0
        self.bdrs = 0
        self.bvat = 0

    def typeTotal(self):
        j = CCD(self.tdrs, "SD", 13.2)
        k = CCD(self.tcrs, "SD", 13.2)
        l = CCD(float(ASD(j.work) + ASD(k.work)), "SD", 13.2)
        m = CCD(self.tvat, "SD", 13.2)
        if self.totsonly == "Y":
            self.fpdf.drawText()
            self.fpdf.drawText("%-36s %13s %13s %13s %13s" % \
                ("Type Totals", j.disp, k.disp, l.disp, m.disp))
            self.pglin += 2
        else:
            self.fpdf.drawText("%-15s %-51s %13s %13s %13s" % \
            (" ", "Type-Totals", j.disp, k.disp, m.disp))
            self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1
        self.tqty = 0
        self.tcrs = 0
        self.tdrs = 0
        self.tvat = 0

    def grandTotal(self):
        tot = [0, 0, 0, 0, 0]
        if self.df.repprt[2] == "export":
            for x in range(0, len(rttrtp)):
                tot[0] = float(ASD(tot[0]) + ASD(self.gdr[x]))
                tot[1] = float(ASD(tot[1]) + ASD(self.gcr[x]))
                tot[2] = float(ASD(tot[2]) + ASD(self.gvt[x]))
            self.expdatas.append(["ULINES"])
            self.expdatas.append([
                "TOTAL",
                [
                    "", "", "", "", "Grand Totals", "", "", tot[0], tot[1],
                    tot[2], ""
                ]
            ])
            self.expdatas.append(["ULINED"])
            return
        self.totind = "Y"
        self.pageHeading()
        for x, t in enumerate(rttrtp):
            qt = CCD(self.gqt[x], "SI", 8)
            dr = CCD(self.gdr[x], "SD", 13.2)
            cr = CCD(self.gcr[x], "SD", 13.2)
            df = float(ASD(dr.work) + ASD(cr.work))
            df = CCD(df, "SD", 13.2)
            vt = CCD(self.gvt[x], "SD", 13.2)
            if self.totsonly == "Y":
                self.fpdf.drawText("%-27s %s %s %s %s %s" % \
                (t[1], qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
            else:
                self.fpdf.drawText("%-34s %s %s %s %s %s" % \
                (t[1], qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
            tot[0] = tot[0] + qt.work
            tot[1] = float(ASD(tot[1]) + ASD(dr.work))
            tot[2] = float(ASD(tot[2]) + ASD(cr.work))
            tot[3] = float(ASD(tot[3]) + ASD(df.work))
            tot[4] = float(ASD(tot[4]) + ASD(vt.work))
        self.fpdf.drawText()
        qt = CCD(tot[0], "SI", 8)
        dr = CCD(tot[1], "SD", 13.2)
        cr = CCD(tot[2], "SD", 13.2)
        df = CCD(tot[3], "SD", 13.2)
        vt = CCD(tot[4], "SD", 13.2)
        if self.totsonly == "Y":
            self.fpdf.drawText("%-27s %s %s %s %s %s" % \
            ("Grand Totals", qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
        else:
            self.fpdf.drawText("%-34s %s %s %s %s %s" % \
            ("Grand Totals", qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
        self.fpdf.drawText()

    def doExit(self):
        self.df.closeProcess()
        self.closeProcess()

    def closeProcess(self):
        self.opts["mf"].closeLoop()
Пример #18
0
class bc1010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.mainProcess()
            if "args" in self.opts:
                self.tabcvt = False
                self.gentab = False
                self.newtab = True
                self.tab = self.opts["args"]
                self.df.loadEntry("T", 0, 0, data=self.tab)
                self.df.topf[0][0][1] = "OUI"
                self.df.topf[0][1][1] = "OUI"
                self.df.focusField("T", 0, 2)
            if "wait" in self.opts:
                self.df.mstFrame.wait_window()
            else:
                self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, [
            "chglog", "bwlent", "bwlgme", "bwltab", "bwldrt", "bwlflm",
            "bwlflt", "memmst", "memkon", "memadd", "memcat"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            if self.sql.error == ["memmst", "memkon"]:
                self.memmst = False
            else:
                return
        else:
            self.memmst = True
        gc = GetCtl(self.opts["mf"])
        bwlctl = gc.getCtl("bwlctl", self.opts["conum"])
        if not bwlctl:
            return
        self.mlint = bwlctl["ctb_mlint"]
        self.samen = bwlctl["ctb_samen"]
        self.mscat = bwlctl["ctb_mscat"]
        self.mstart = bwlctl["ctb_mstart"]
        self.fstart = bwlctl["ctb_fstart"]
        self.nstart = bwlctl["ctb_nstart"]
        self.dbase = bwlctl["ctb_dbase"]
        self.order = bwlctl["ctb_order"]
        self.mixed = bwlctl["ctb_mixed"]
        self.fromad = bwlctl["ctb_emadd"]
        self.keys = (("bwltab", "btb_cono", "btb_tab"), ("bwldrt", "bdt_cono",
                                                         "bdt_tab"),
                     ("bwlent", "bce_cono", "bce_scod"), ("bwlflt", "bft_cono",
                                                          "bft_player"),
                     ("bwlgme", "bcg_cono", "bcg_scod"), ("bwldrt", "bdt_cono",
                                                          "bdt_team1"),
                     ("bwldrt", "bdt_cono",
                      "bdt_team2"), ("bwldrt", "bdt_cono", "bdt_team3"),
                     ("bwlflt", "bft_cono", "bft_skip"), ("bwlgme", "bcg_cono",
                                                          "bcg_ocod"))
        return True

    def mainProcess(self):
        tab = {
            "stype":
            "R",
            "tables": ("bwltab", ),
            "cols": [("btb_tab", "", 0, "Tab"),
                     ("btb_surname", "", 0, "Surname", "Y"),
                     ("btb_names", "", 0, "Names"),
                     ("btb_bsano", "", 0, "BSA-No")],
            "where": [("btb_cono", "=", self.opts["conum"])],
            "order":
            "btb_surname"
        }
        if self.mlint == "N":
            mlm = None
        else:
            tab["cols"].insert(3, ("btb_memno", "", 0, "Mem-No"))
            mlm = {
                "stype":
                "R",
                "tables": ("memmst", ),
                "cols":
                (("mlm_memno", "", 0,
                  "Mem-No"), ("mlm_oldno", "", 0,
                              "Old-No"), ("mlm_idnum", "", 0, "Identity-Numb"),
                 ("mlm_gender", "", 0, "G"), ("mlm_state", "", 0, "S"),
                 ("mlm_surname", "", 0, "Surname", "Y"), ("mlm_names", "", 0,
                                                          "Names", "F")),
                "where": [("mlm_cono", "=", self.opts["conum"])],
                "order":
                "mlm_surname, mlm_names"
            }
        r1s = (("Male", "M"), ("Female", "F"))
        if self.dbase == "R":
            r2s = (("None", "0"), )
        else:
            r2s = (("Skip", "4"), ("Third", "3"), ("Second", "2"), ("Lead",
                                                                    "1"))
        fld = [(("T", 0, 0,
                 0), "I@btb_tab", 0, "", "", "", "Y", self.doTab, tab, None,
                ("efld", ), None, "Note: Tab numbers Must be Unique."),
               [("T", 0, 1, 0), "I@btb_memno", 0, "", "", "", "N",
                self.doMember, mlm, self.doDelete, ("efld", )],
               (("T", 0, 2, 0), "I@btb_surname", 0, "", "", "", "N",
                self.doSurname, None, self.doDelete, ("notblank", )),
               (("T", 0, 3, 0), "I@btb_names", 0, "", "", "", "N",
                self.doNames, None, None, ("efld", )),
               (("T", 0, 4, 0), ("IRB", r1s), 0, "Gender", "", "M", "N",
                self.doGender, None, None, None),
               (("T", 0, 5, 0), "I@btb_add1", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 6, 0), "I@btb_add2", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 7, 0), "I@btb_add3", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 8, 0), "I@btb_pcod", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 9, 0), "I@btb_home", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 10, 0), "I@btb_work", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 11, 0), "I@btb_cell", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 12, 0), "I@btb_mail", 0, "", "", "", "N",
                self.doEmail, None, None, ("efld", )),
               (("T", 0, 13, 0), ("IRB", r2s), 0, "Position - Primary", "",
                "1", "N", self.doPos, None, self.doDelete, None),
               (("T", 0, 14, 0), "I@btb_rate1", 0, "", "", "", "N",
                self.doRate, None, None, ("efld", )),
               (("T", 0, 15, 0), ("IRB", r2s), 0, "Position - Mixed", "", "1",
                "N", self.doPos, None, None, None),
               (("T", 0, 16, 0), "I@btb_rate2", 0, "", "", "", "N", None, None,
                None, ("efld", )),
               (("T", 0, 17, 0), "I@btb_bsano", 0, "", "", "", "N", None, None,
                None, ("efld", ))]
        if self.mlint == "N":
            fld[1] = [("T", 0, 1, 0), "O@btb_memno", 0, ""]
        if self.mlint == "Y":
            but = []
        else:
            but = [("Import", None, self.doImport, 0, ("T", 0, 1),
                    (("T", 0, 2), ("T", 0, 3)),
                    "Import Tabs and/or Ratings from a CSV or XLS File.")]
        but.extend([("Accept", None, self.doEnd, 0, ("T", 0, 3), ("T", 0, 0),
                     "Accept All Fields and Continue"),
                    ("Convert", None, self.doConvert, 0, ("T", 0, 3),
                     ("T", 0, 4), "Convert a Visitor's Tab to a Member's Tab"),
                    ("Print", None, self.doPrint, 1, None, None)])
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               tops=False,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt,
                               clicks=self.doClick)

    def doClick(self, *opts):
        if self.df.col == 1:
            return
        self.df.focusField("T", opts[0][0], opts[0][1] + 1)

    def doTab(self, frt, pag, r, c, p, i, w):
        self.tab = w
        self.newvis = False
        self.tabcvt = False
        self.tabchg = False
        if not self.tab:
            if self.mlint == "Y" and self.samen == "Y":
                ok = askQuestion(self.opts["mf"].body,
                                 "New Tab",
                                 "Is this TAB for a Visitor",
                                 default="no")
                if ok == "no":
                    return "New Member, Please Create in Ledger"
                self.newvis = True
            self.gentab = True
            self.newtab = True
        else:
            self.gentab = False
            self.oldtab = self.sql.getRec("bwltab",
                                          where=[("btb_cono", "=",
                                                  self.opts["conum"]),
                                                 ("btb_tab", "=", self.tab)],
                                          limit=1)
            if not self.oldtab:
                self.newtab = True
            else:
                self.newtab = False
                for num, fld in enumerate(self.oldtab[1:-1]):
                    if num == 2:
                        self.snam = fld
                    elif num == 3:
                        self.fnam = fld
                    elif num == 4:
                        self.gender = fld
                    elif num in (13, 15):
                        fld = str(fld)
                        if num == 13:
                            self.pos1 = fld
                    self.df.loadEntry(frt, pag, num, data=fld)
        if self.tab and self.mlint == "Y":
            if self.oldtab:
                memno = self.oldtab[self.sql.bwltab_col.index("btb_memno")]
            elif self.tab < self.nstart and self.samen == "Y":
                memno = self.tab
            else:
                memno = 0
        else:
            memno = 0
        if memno:
            chk = self.doLoadMember(memno)
            if chk:
                return chk
            if self.dbase == "R":
                return "sk13"
            return "sk12"
        if self.newvis or self.tab >= self.nstart:
            return "sk1"

    def doMember(self, frt, pag, r, c, p, i, w):
        if w:
            if self.newtab or not self.oldtab[2]:
                chk = self.sql.getRec("bwltab",
                                      where=[("btb_cono", "=",
                                              self.opts["conum"]),
                                             ("btb_memno", "=", w)],
                                      limit=1)
                if chk:
                    return "Member Already Has a TAB"
            chk = self.doLoadMember(w)
            if chk:
                return chk
            if self.newtab and not self.tab:
                chk = self.getNextTab()
                if not chk:
                    return "Invalid Membership Number"
            if self.dbase == "R":
                return "sk12"
            return "sk11"
        elif self.tab and self.tab < self.nstart and self.mlint == "Y":
            return "Invalid Membership Number"

    def doLoadMember(self, memno):
        # Check member
        acc = self.sql.getRec("memmst",
                              cols=["mlm_surname", "mlm_names", "mlm_gender"],
                              where=[("mlm_cono", "=", self.opts["conum"]),
                                     ("mlm_memno", "=", memno)],
                              limit=1)
        if not acc:
            return "Member %s Does Not Exist" % memno
        # Check category
        if self.mscat:
            cat = self.sql.getRec("memcat",
                                  where=[("mlc_cono", "=", self.opts["conum"]),
                                         ("mlc_memno", "=", memno),
                                         ("mlc_type", "=", "C"),
                                         ("mlc_code", "=", self.mscat)],
                                  limit=1)
            if not cat:
                return "Member %s is Not in the Bowls Category" % memno
        self.snam = acc[0]
        self.fnam = acc[1]
        self.gender = acc[2]
        self.df.loadEntry("T", 0, 1, data=memno)
        self.df.loadEntry("T", 0, 2, data=self.snam)
        self.df.loadEntry("T", 0, 3, data=self.fnam)
        self.df.loadEntry("T", 0, 4, data=self.gender)
        for typ in ("A", "P"):
            ad = self.sql.getRec(
                "memadd",
                cols=["mla_add1", "mla_add2", "mla_add3", "mla_code"],
                where=[("mla_cono", "=", self.opts["conum"]),
                       ("mla_memno", "=", memno), ("mla_type", "=", typ)],
                limit=1)
            if ad:
                break
        if ad:
            self.df.loadEntry("T", 0, 5, data=ad[0])
            self.df.loadEntry("T", 0, 6, data=ad[1])
            self.df.loadEntry("T", 0, 7, data=ad[2])
            self.df.loadEntry("T", 0, 8, data=ad[3])
        for num, cod in enumerate((1, 2, 3, 5)):
            kk = self.sql.getRec("memkon",
                                 cols=["mlk_detail"],
                                 where=[("mlk_cono", "=", self.opts["conum"]),
                                        ("mlk_memno", "=", memno),
                                        ("mlk_code", "=", cod)],
                                 limit=1)
            if kk:
                self.df.loadEntry("T", 0, num + 9, data=kk[0])

    def doSurname(self, frt, pag, r, c, p, i, w):
        self.sname = w

    def doNames(self, frt, pag, r, c, p, i, w):
        if self.newtab:
            chk = self.sql.getRec("bwltab",
                                  where=[("btb_cono", "=", self.opts["conum"]),
                                         ("btb_surname", "=", self.sname,
                                          "and", "btb_names", "=", w)],
                                  limit=1)
            if chk:
                tab = chk[self.sql.bwltab_col.index("btb_tab")]
                self.doTab(frt, pag, 0, 1, 0, 0, tab)
                return "ff3"
            if self.mstart < self.fstart and self.tab >= self.fstart:
                self.df.loadEntry(frt, pag, p + 1, data="F")
            elif self.fstart < self.mstart and self.tab < self.mstart:
                self.df.loadEntry(frt, pag, p + 1, data="F")
            return
        if self.sname != self.snam or w != self.fnam:
            but = [("Amendment", "A"), ("Re-Issue", "R"), ("Neither", "N")]
            ok = askChoice(self.opts["mf"].body,
                           "Name Change",
                           "Please Select the Reason for the Name Change",
                           butt=but,
                           default="Neither")
            if ok == "N":
                return "ff3"
            if ok == "R":
                self.tabchg = True
                for x in range(1, 15):
                    self.df.clearEntry(frt, pag, c + x)

    def doGender(self, frt, pag, r, c, p, i, w):
        self.gender = w
        if self.gentab:
            chk = self.getNextTab()
            if not chk:
                return "ff2|Invalid Membership Number"
        if self.tab < self.nstart:
            if self.mstart < self.fstart:
                if self.gender == "M" and self.tab >= self.fstart:
                    return "ff5|Invalid Gender for Tab Number"
                elif self.gender == "F" and self.tab < self.fstart:
                    return "ff5|Invalid Gender for Tab Number"
            else:
                if self.gender == "F" and self.tab >= self.mstart:
                    return "ff5|Invalid Gender for Tab Number"
                elif self.gender == "M" and self.tab < self.mstart:
                    return "ff5|Invalid Gender for Tab Number"

    def doEmail(self, frt, pag, r, c, p, i, w):
        if self.dbase in ("C", "P") and self.df.t_work[0][0][13] == "0":
            self.df.t_work[0][0][13] = "1"
        if self.dbase == "R":
            self.pos1 = "0"
            self.df.loadEntry(frt, pag, p + 1, data="")
            self.df.loadEntry(frt, pag, p + 1, data="")
            return "sk1"

    def doPos(self, frt, pag, r, c, p, i, w):
        if p == 13:
            self.pos1 = w
            self.df.loadEntry(frt, pag, p + 2, data=w)
        if self.dbase == "P":
            self.df.loadEntry(frt, pag, p + 1, data="")
            if p == 13:
                self.df.loadEntry(frt, pag, p + 3, data="")
            if self.mixed == "N":
                return "sk3"
            else:
                return "sk1"

    def doRate(self, frt, pag, r, c, p, i, w):
        self.df.loadEntry(frt, pag, p + 1, data=self.pos1)
        self.df.loadEntry(frt, pag, p + 2, data=w)
        if self.dbase == "R":
            self.df.loadEntry(frt, pag, p + 1, data="")
            if self.mixed == "N":
                return "sk2"
            else:
                return "sk1"
        if self.mixed == "N":
            return "sk2"

    def getNextTab(self):
        if self.newvis:
            ok = "yes"
        else:
            ok = askQuestion(self.opts["mf"].body,
                             "Type",
                             "Is this TAB for a Visitor",
                             default="no")
        if ok == "no":
            if self.samen == "Y":
                return
            if self.gender == "M":
                start = self.mstart
                if self.mstart < self.fstart:
                    last = self.fstart
                else:
                    last = self.nstart
            else:
                start = self.fstart
                if self.mstart < self.fstart:
                    last = self.nstart
                else:
                    last = self.mstart
        else:
            start = self.nstart
            last = 900000
        self.tab = getNextCode(self.sql,
                               "bwltab",
                               "btb_tab",
                               where=[("btb_cono", "=", self.opts["conum"])],
                               start=start,
                               last=last)
        self.df.loadEntry("T", 0, 0, data=self.tab)
        return True

    def doDelete(self):
        if self.newtab:
            return
        error = False
        for key in self.keys:
            if key[0] == "bwltab":
                continue
            chk = self.sql.getRec(tables=key[0],
                                  where=[(key[1], "=", self.opts["conum"]),
                                         (key[2], "=", self.tab)],
                                  limit=1)
            if chk:
                error = True
                break
        if error:
            if self.tab < self.nstart:
                # Member
                ok = askQuestion(self.opts["mf"].body,
                                 "Convert",
                                 "Convert this Member to a Visitor",
                                 default="yes")
                if ok == "no":
                    return "Not Deleted nor Converted"
                tab = getNextCode(self.sql,
                                  "bwltab",
                                  "btb_tab",
                                  where=[("btb_cono", "=", self.opts["conum"])
                                         ],
                                  start=self.nstart,
                                  last=900000)
                for key in self.keys:
                    self.sql.updRec(key[0],
                                    cols=[key[2]],
                                    data=[tab],
                                    where=[(key[1], "=", self.opts["conum"]),
                                           (key[2], "=", self.tab)])
            else:
                # Visitor
                chk = self.sql.getRec("bwlent",
                                      where=[("bce_cono", "=",
                                              self.opts["conum"]),
                                             ("bce_scod", "=", self.tab)])
                if chk:
                    return "There is History for this Player, Not Deleted"
                self.sql.delRec("bwltab",
                                where=[("btb_cono", "=", self.opts["conum"]),
                                       ("btb_tab", "=", self.tab)])
        else:
            self.sql.delRec("bwltab",
                            where=[("btb_cono", "=", self.opts["conum"]),
                                   ("btb_tab", "=", self.tab)])
        self.opts["mf"].dbm.commitDbase()

    def doConvert(self):
        titl = "Enter Member's Tab Number"
        ent = SimpleDialog(parent=self.df.window,
                           title=titl,
                           cols=(("a", "Tab Number          ", 6, "UI",
                                  "Tab"), ))
        ent.sframe.wait_window()
        try:
            self.merge = False
            if self.gender == "M":
                start = self.mstart
                if self.mstart < self.fstart:
                    last = self.fstart - 1
                else:
                    last = self.nstart - 1
            else:
                start = self.fstart
                if self.mstart < self.fstart:
                    last = self.nstart - 1
                else:
                    last = self.mstart - 1
            tab = ent.data[0]
            if not tab:
                tab = getNextCode(self.sql,
                                  "bwltab",
                                  "btb_tab",
                                  where=[("btb_cono", "=", self.opts["conum"])
                                         ],
                                  start=start,
                                  last=last)
            if tab < start or tab > last:
                showInfo(self.opts["mf"].body, "Error",
                         "Invalid Tab Number for Gender")
                raise Exception
            chk = self.sql.getRec("bwltab",
                                  where=[("btb_cono", "=", self.opts["conum"]),
                                         ("btb_tab", "=", tab)],
                                  limit=1)
            if chk:
                ok = askQuestion(
                    self.opts["mf"].body, "Invalid",
                    "This Tab is Already Allocated, Do You Want to Merge?")
                if ok == "no":
                    raise Exception
                self.merge = True
            self.tabcvt = True
            self.old = self.tab
            self.tab = tab
            self.df.loadEntry(self.df.frt, self.df.pag, 0, data=self.tab)
            self.df.focusField(self.df.frt, self.df.pag, 6)
        except:
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doPrint(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        if self.mlint == "Y":
            self.colsd = [["Membership Number", "N", "btb_memno"]]
        else:
            self.colsd = []
        self.colsd.extend([["Surname & Initials", "Y", "name"],
                           ["Surname", "N", "btb_surname"],
                           ["First Names", "N", "btb_names"],
                           ["Gender", "N", "btb_gender"],
                           ["Address", "N", "address"],
                           ["Telephone - Home", "N", "btb_home"],
                           ["Telephone - Work", "N", "btb_work"],
                           ["Telephone - Cell", "N", "btb_cell"],
                           ["Email Address", "N", "btb_mail"],
                           ["Ratings", "N", "ratings"],
                           ["BSA Number", "N", "btb_bsano"],
                           ["Order", "T", "order"]])
        r1s = (("Members", "M"), ("Guests", "G"), ("All", "A"))
        r2s = (("Males", "M"), ("Females", "F"), ("All", "A"))
        r3s = (("Yes", "Y"), ("No", "N"))
        r4s = (("Tab", "T"), ("Surname", "S"), ("Rating", "R"))
        fld = [(("T", 0, 0, 0), ("IRB", r1s), 0, "Tab Group", "", "M", "Y",
                self.doCGroup, None, None, None),
               (("T", 0, 1, 0), ("IRB", r2s), 0, "Gender", "", "A", "Y",
                self.doCGender, None, None, None)]
        idx = 1
        for dat in self.colsd:
            idx += 1
            if dat == self.colsd[-1]:
                rb = r4s
            else:
                rb = r3s
            fld.append((("T", 0, idx, 0), ("IRB", rb), 0, dat[0], "", dat[1],
                        "N", self.doCField, None, None, None))
        tnd = ((self.doCEnd, "Y"), )
        txt = (self.doCExit, )
        self.pr = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=("Y", "V"),
                               mail=("Y", "Y"))
        self.pr.mstFrame.wait_window()
        if self.cols:
            cols = []
            dic = self.sql.bwltab_dic
            for col in self.cols:
                if col == "name":
                    cols.append(["name", "NA", 30, "Name"])
                elif col == "address":
                    cols.append([
                        "btb_add1", dic["btb_add1"][2], dic["btb_add1"][3],
                        dic["btb_add1"][5]
                    ])
                    cols.append([
                        "btb_add2", dic["btb_add2"][2], dic["btb_add2"][3],
                        dic["btb_add2"][5]
                    ])
                    cols.append([
                        "btb_add3", dic["btb_add3"][2], dic["btb_add3"][3],
                        dic["btb_add3"][5]
                    ])
                    cols.append([
                        "btb_pcod", dic["btb_pcod"][2], dic["btb_pcod"][3],
                        dic["btb_pcod"][5]
                    ])
                elif col == "ratings":
                    if self.dbase == "P":
                        cols.append([
                            "btb_pos1", dic["btb_pos1"][2], dic["btb_pos1"][3],
                            dic["btb_pos1"][5]
                        ])
                        cols.append([
                            "btb_pos2", dic["btb_pos2"][2], dic["btb_pos2"][3],
                            dic["btb_pos2"][5]
                        ])
                    elif self.dbase == "R":
                        cols.append([
                            "btb_rate1", dic["btb_rate1"][2],
                            dic["btb_rate1"][3], dic["btb_rate1"][5]
                        ])
                        cols.append([
                            "btb_rate2", dic["btb_rate2"][2],
                            dic["btb_rate2"][3], dic["btb_rate2"][5]
                        ])
                    else:
                        cols.append([
                            "btb_pos1", dic["btb_pos1"][2], dic["btb_pos1"][3],
                            dic["btb_pos1"][5]
                        ])
                        cols.append([
                            "btb_rate1", dic["btb_rate1"][2],
                            dic["btb_rate1"][3], dic["btb_rate1"][5]
                        ])
                        cols.append([
                            "btb_pos2", dic["btb_pos2"][2], dic["btb_pos2"][3],
                            dic["btb_pos2"][5]
                        ])
                        cols.append([
                            "btb_rate2", dic["btb_rate2"][2],
                            dic["btb_rate2"][3], dic["btb_rate2"][5]
                        ])
                else:
                    cols.append([col, dic[col][2], dic[col][3], dic[col][5]])
            whr = [("btb_cono", "=", self.opts["conum"])]
            if self.cgroup == "M":
                whr.append(("btb_tab", "<", self.nstart))
            elif self.cgroup == "G":
                whr.append(("btb_tab", ">=", self.nstart))
            if self.cgender in ("F", "M"):
                whr.append(("btb_gender", "=", self.cgender))
            if self.odr == "T":
                odr = "btb_tab"
            elif self.odr == "S":
                odr = "btb_surname, btb_names"
            else:
                odr = "btb_pos1 desc, btb_rate1 desc, btb_surname, btb_names"
            recs = self.sql.getRec("bwltab", where=whr, order=odr)
            data = []
            btc = self.sql.bwltab_col
            for rec in recs:
                dat = []
                for col in self.cols:
                    if col == "name":
                        snam = rec[btc.index("btb_surname")]
                        fnam = rec[btc.index("btb_names")]
                        if fnam:
                            fnam = fnam.split()
                            for num, nam in enumerate(fnam):
                                if not num:
                                    init = nam[0].upper()
                                else:
                                    init = "%s %s" % (init, nam[0].upper())
                            dat.append("%s, %s" % (snam, init))
                        else:
                            dat.append(snam)
                    elif col == "address":
                        dat.append(rec[btc.index("btb_add1")])
                        dat.append(rec[btc.index("btb_add2")])
                        dat.append(rec[btc.index("btb_add3")])
                        dat.append(rec[btc.index("btb_pcod")])
                    elif col == "ratings":
                        if self.dbase == "P":
                            dat.append(rec[btc.index("btb_pos1")])
                            dat.append(rec[btc.index("btb_pos2")])
                        elif self.dbase == "R":
                            dat.append(rec[btc.index("btb_rate1")])
                            dat.append(rec[btc.index("btb_rate2")])
                        else:
                            dat.append(rec[btc.index("btb_pos1")])
                            dat.append(rec[btc.index("btb_rate1")])
                            dat.append(rec[btc.index("btb_pos2")])
                            dat.append(rec[btc.index("btb_rate2")])
                    else:
                        dat.append(rec[btc.index(col)])
                data.append(dat)
            tit = "Tabs Lising for"
            if self.cgroup == "A":
                tit = "%s Members and Guests" % tit
            elif self.cgroup == "M":
                tit = "%s Members Only" % tit
            else:
                tit = "%s Guests Only" % tit
            if self.cgender == "A":
                tit = "%s (All Genders)" % tit
            elif self.cgender == "M":
                tit = "%s (Males Only)" % tit
            else:
                tit = "%s (Females Only)" % tit
            RepPrt(self.opts["mf"],
                   name=self.__class__.__name__,
                   conum=self.opts["conum"],
                   conam=self.opts["conam"],
                   heads=[tit],
                   ttype="D",
                   tables=data,
                   cols=cols,
                   repprt=self.pr.repprt,
                   repeml=self.pr.repeml,
                   fromad=self.fromad)
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        self.df.window.focus_force()
        self.df.focusField("T", 0, 1)

    def doCGroup(self, frt, pag, r, c, p, i, w):
        self.cgroup = w

    def doCGender(self, frt, pag, r, c, p, i, w):
        self.cgender = w

    def doCField(self, frt, pag, r, c, p, i, w):
        if self.mlint == "N":
            idx = 2
        else:
            idx = 3
        if p == idx and w == "Y":
            self.pr.loadEntry(frt, pag, p + 1, data="N")
            self.pr.loadEntry(frt, pag, p + 2, data="N")
            return "sk2"

    def doCEnd(self):
        self.pr.closeProcess()
        self.cols = ["btb_tab"]
        if self.pr.repeml[0] == "N":
            end = -2
        else:
            end = -4
        for num, dat in enumerate(self.pr.t_work[0][0][2:end]):
            if dat == "Y":
                self.cols.append(self.colsd[num][2])
            elif dat in ("T", "S", "R"):
                self.odr = dat

    def doCExit(self):
        self.cols = []
        self.pr.closeProcess()

    def doEnd(self):
        if self.tabcvt:
            # Conversion to Member
            for key in self.keys:
                if key[0] == "bwltab" and self.merge:
                    self.sql.delRec(key[0],
                                    where=[(key[1], "=", self.opts["conum"]),
                                           (key[2], "=", self.old)])
                    continue
                self.sql.updRec(key[0],
                                cols=[key[2]],
                                data=[self.tab],
                                where=[(key[1], "=", self.opts["conum"]),
                                       (key[2], "=", self.old)])
        # Continue
        cols = []
        for x in range(18):
            cols.append(x)
        if self.dbase == "R":
            cols.remove(13)
            cols.remove(15)
        flds = ("T", 0, cols)
        frt, pag, col, mes = self.df.doCheckFields(flds)
        if mes:
            self.df.focusField(frt, pag, (col + 1), err=mes)
            return
        tabdat = [self.opts["conum"]] + self.df.t_work[0][0]
        if self.newtab:
            self.sql.insRec("bwltab", data=tabdat)
        elif self.tabchg:
            tabdat.append("")
            self.doTabChg(tabdat)
        elif tabdat != self.oldtab[:len(tabdat)]:
            col = self.sql.bwltab_col
            tabdat.append(self.oldtab[col.index("btb_xflag")])
            self.sql.updRec("bwltab",
                            data=tabdat,
                            where=[("btb_cono", "=", self.opts["conum"]),
                                   ("btb_tab", "=", self.tab)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.oldtab):
                if dat != tabdat[num]:
                    self.sql.insRec(
                        "chglog",
                        data=[
                            "bwltab", "U",
                            "%03i%06s" % (self.opts["conum"], self.tab),
                            col[num], dte, self.opts["capnm"],
                            str(dat),
                            str(tabdat[num]), "", 0
                        ])
        self.opts["mf"].dbm.commitDbase()
        if "args" in self.opts:
            self.doExit()
        else:
            self.df.focusField("T", 0, 1)

    def doTabChg(self, tabdat):
        code = getNextCode(self.sql,
                           "bwltab",
                           "btb_tab",
                           where=[("btb_cono", "=", self.opts["conum"])],
                           start=self.nstart,
                           last=900000)
        tables = (("bwldrt", "bdt_cono", "bdt_tab", "bdt_team1", "bdt_team2",
                   "bdt_team3"), ("bwlent", "bce_cono", "bce_scod"),
                  ("bwlflm", "bfm_cono", "bfm_captain"),
                  ("bwlflt", "bft_cono", "bft_skip", "bft_player"),
                  ("bwlgme", "bcg_cono", "bcg_scod",
                   "bcg_ocod"), ("bwltab", "btb_cono", "btb_tab"))
        for tab in tables:
            for col in tab[2:]:
                self.sql.updRec(tab[0],
                                cols=[col],
                                data=[code],
                                where=[(tab[1], "=", self.opts["conum"]),
                                       (col, "=", self.tab)])
        self.sql.insRec("bwltab", data=tabdat)

    def doImport(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        tit = ("Import Details", )
        r1s = (("Ratings Only", "R"), ("All Fields", "A"))
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "Details", "", "R", "N",
                self.doImpDet, None, None, None), )
        self.ip = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doImpEnd, "y"), ),
                               txit=(self.doImpExit, ))
        self.ip.mstFrame.wait_window()
        # Populate
        if self.impdet is None:
            self.df.setWidget(self.df.mstFrame, state="show")
            self.df.enableButtonsTags(state=state)
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)
            return
        fi = FileImport(self.opts["mf"], imptab="bwltab", impskp=self.impskp)
        sp = ProgressBar(self.opts["mf"].body,
                         typ="Importing Ratings",
                         mxs=len(fi.impdat))
        err = None
        for num, line in enumerate(fi.impdat):
            sp.displayProgress(num)
            if self.mixed == "N":
                line.extend([0, ""])
            chk = self.sql.getRec("bwltab",
                                  where=[("btb_cono", "=", self.opts["conum"]),
                                         ("btb_tab", "=", line[0])],
                                  limit=1)
            if not chk:
                if self.impdet == "R":
                    err = "%s %s Does Not Exist" % (fi.impcol[0][0], line[0])
                    break
                line.insert(0, self.opts["conum"])
                if self.mlint == "N":
                    line.insert(2, 0)
                self.sql.insRec("bwltab", data=line)
            else:
                tmp = ["btb_pos1", "btb_rate1", "btb_pos2", "btb_rate2"]
                if self.impdet == "R":
                    cols = tmp
                else:
                    cols = [
                        "btb_surname", "btb_names", "btb_gender", "btb_add1",
                        "btb_add2", "btb_add3", "btb_pcod", "btb_home",
                        "btb_work", "btb_cell", "btb_mail"
                    ] + tmp + ["btb_bsano"]
                self.sql.updRec("bwltab",
                                cols=cols,
                                data=line[1:],
                                where=[("btb_cono", "=", self.opts["conum"]),
                                       ("btb_tab", "=", line[0])])
        sp.closeProgress()
        if err:
            err = "Line %s: %s" % ((num + 1), err)
            showError(
                self.opts["mf"].body, "Import Error", """%s

Please Correct your Import File and then Try Again.""" % err)
            self.opts["mf"].dbm.rollbackDbase()
        else:
            self.opts["mf"].dbm.commitDbase()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doImpDet(self, frt, pag, r, c, p, i, w):
        self.impdet = w

    def doImpEnd(self):
        self.impskp = ["btb_cono"]
        if self.mlint == "N":
            self.impskp.append("btb_memno")
        if self.impdet == "R":
            self.impskp.extend([
                "btb_surname", "btb_names", "btb_gender", "btb_add1",
                "btb_add2", "btb_add3", "btb_pcod", "btb_home", "btb_work",
                "btb_cell", "btb_mail", "btb_bsano"
            ])
        if self.mixed == "N":
            self.impskp.extend(["btb_pos2", "btb_rate2"])
        self.impskp.append("btb_xflag")
        self.ip.closeProcess()

    def doImpExit(self):
        self.impdet = None
        self.ip.closeProcess()

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

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["strmf1", "strtrn", "chglog"],
            prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        strctl = gc.getCtl("strctl", self.opts["conum"])
        if not strctl:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.curdt = int(self.sysdtw / 100)
        return True

    def dataHeader(self):
        grp = {
            "stype": "R",
            "tables": ("strgrp",),
            "cols": (
                ("gpm_group", "", 0, "Grp"),
                ("gpm_desc", "", 0, "Description", "Y")),
            "where": [("gpm_cono", "=", self.opts["conum"])]}
        self.stm = {
            "stype": "R",
            "tables": ("strmf1",),
            "cols": (
                ("st1_code", "", 0, "Product Code"),
                ("st1_desc", "", 0, "Description", "Y")),
            "where": [],
            "whera": [["T", "st1_group", 0, 0]],
            "index": 0}
        fld = [
            (("T",0,0,0),"INA",3,"Group","Product Group",
                "","Y",self.doGroup,grp,None,("notblank",)),
            (("T",0,1,0),"INA",20,"Code","Product Code",
                "","N",self.doCode,self.stm,None,("notblank",)),
            (("T",0,2,0),"ONA",30,"Description")]
        but = (
            ("Generate",None,self.doGenerate,1,None,(("T",0,1),("T",0,2)),
                "Mark zero items, which have been inactive, as redundant"),
            ("Create",None,self.doCreate,1,None,(("T",0,1),("T",0,2)),
                "Mark a zero item as redundant"),
            ("Restore",None,self.doRestore,1,None,(("T",0,1),("T",0,2)),
                "Mark a redundant item as normal"),
            ("Exit",None,self.exitPage,1,None,(("T",0,1),("T",0,2))))
        tnd = ((self.endPage, "y"),)
        txt = (self.exitPage,)
        self.df = TartanDialog(self.opts["mf"], eflds=fld,
            butt=but, tend=tnd, txit=txt, focus=False)
        self.df.setWidget(self.df.B0, state="normal")
        self.df.setWidget(self.df.B1, state="normal")
        self.df.setWidget(self.df.B2, state="normal")
        self.df.setWidget(self.df.B3, state="normal")

    def doGenerate(self):
        tit = "Generate Redundant Items"
        fld = (
            (("T",0,0,0),"IUI",3,"Months Inactive","",
                24,"Y",self.doMonths,None,None,("efld",)),)
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        self.mt = TartanDialog(self.opts["mf"], title=tit, tops=True,
            eflds=fld, tend=((self.doMthEnd, "y"),), txit=(self.doMthExit,))
        self.mt.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doMonths(self, frt, pag, r, c, p, i, w):
        months = w
        yr = int(self.curdt / 100)
        mt = self.curdt % 100
        for mth in range(months):
            mt -= 1
            if not mt:
                mt = 12
                yr -= 1
        self.startp = (yr * 100) + mt

    def doMthEnd(self):
        self.mt.closeProcess()
        whr = [
            ("st1_cono", "=", self.opts["conum"]),
            ("st1_type", "=", "N"),
            ("stt_cono=st1_cono",),
            ("stt_group=st1_group",),
            ("stt_code=st1_code",)]
        accs = self.sql.getRec(tables=["strmf1", "strtrn"], cols=["st1_group",
            "st1_code", "max(stt_curdt)", "sum(stt_qty)", "sum(stt_cost)"],
            where=whr, order="st1_group, st1_code")
        chgs = []
        for acc in accs:
            if acc[2] < self.startp and not acc[3] and not acc[4]:
                chgs.append(acc[:2])
        if not chgs:
            showError(self.opts["mf"].body, "Processing Error",
                "No Redundant Records")
        else:
            self.cnt = 0
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            p = ProgressBar(self.opts["mf"].body, mxs=len(chgs),
                typ="Redundant Items")
            for num, rec in enumerate(chgs):
                p.displayProgress(num)
                self.sql.updRec("strmf1", cols=["st1_type"], data=["X"],
                    where=[("st1_cono", "=", self.opts["conum"]),
                    ("st1_group", "=", rec[0]), ("st1_code", "=", rec[1])])
                key = "%03i%-3s%-20s" % (self.opts["conum"], rec[0], rec[1])
                self.sql.insRec("chglog", data=["strmf1", "U", key,
                    "st1_type", dte, self.opts["capnm"], "N", "X", "", 0])
            p.closeProgress()
            mess = """%s Items Will be Marked as Redundant.

Would you like to COMMIT these Changes?""" % len(chgs)
            self.opts["mf"].dbm.commitDbase(ask=True, mess=mess)

    def doMthExit(self):
        self.mt.closeProcess()

    def doCreate(self):
        self.flag = "C"
        self.stm["where"] = [
                ("st1_cono", "=", self.opts["conum"]),
                ("st1_type", "<>", "X")]
        self.df.focusField("T", 0, 1)

    def doRestore(self):
        self.flag = "R"
        self.stm["where"] = [
                ("st1_cono", "=", self.opts["conum"]),
                ("st1_type", "=", "X")]
        self.df.focusField("T", 0, 1)

    def doGroup(self, frt, pag, r, c, p, i, w):
        if self.flag == "C":
            chk = self.sql.getRec("strmf1", where=[("st1_cono",
                "=", self.opts["conum"]), ("st1_group", "=", w),
                ("st1_type", "<>", "X")], limit=1)
        else:
            chk = self.sql.getRec("strmf1", where=[("st1_cono",
                "=", self.opts["conum"]), ("st1_group", "=", w),
                ("st1_type", "=", "X")], limit=1)
        if not chk:
            return "Invalid Group"
        self.grp = w

    def doCode(self, frt, pag, r, c, p, i, w):
        whr = [
            ("st1_cono", "=", self.opts["conum"]),
            ("st1_group", "=", self.grp),
            ("st1_code", "=", w)]
        if self.flag == "C":
            err = "Invalid, Not Normal"
            whr.append(("st1_type", "=", "N"))
        else:
            err = "Invalid, Not Redundant"
            whr.append(("st1_type", "=", "X"))
        chk = self.sql.getRec("strmf1", where=whr, limit=1)
        if not chk:
            return err
        if self.flag == "C":
            qty = self.sql.getRec("strtrn", cols=["sum(stt_qty)"],
                where=[("stt_cono", "=", self.opts["conum"]),
                ("stt_group", "=", self.grp), ("stt_code", "=", w)],
                limit=1)
            if qty[0]:
                return "Balance Exists"
        self.cod = w
        desc = chk[self.sql.strmf1_col.index("st1_desc")]
        self.df.loadEntry(frt, pag, p+1, data=desc)

    def endPage(self):
        if self.flag == "C":
            old = "N"
            new = "X"
        else:
            old = "X"
            new = "N"
        self.sql.updRec("strmf1", cols=["st1_type"], data=[new],
            where=[("st1_cono", "=", self.opts["conum"]),
            ("st1_group", "=", self.grp), ("st1_code", "=", self.cod)])
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        key = "%03i%-3s%-20s" % (self.opts["conum"], self.grp, self.cod)
        self.sql.insRec("chglog", data=["strmf1", "U", key,
            "st1_type", dte, self.opts["capnm"], old, new, "", 0])
        self.opts["mf"].dbm.commitDbase()
        self.df.clearFrame("T", 0)
        self.flag = ""

    def exitPage(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #20
0
class rt4010(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):
        self.sql = Sql(self.opts["mf"].dbm,
                       ["rtlprm", "rtlmst", "rtlcon", "rtltrn"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        rtlctl = gc.getCtl("rtlctl", self.opts["conum"])
        if not rtlctl:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sysdtd = "%i/%02i/%02i" % (t[0], t[1], t[2])
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Rental Ledger Interrogation (%s)" %
                    self.__class__.__name__)
        prm = {
            "stype":
            "R",
            "tables": ("rtlprm", ),
            "cols": (("rtp_code", "", 0, "Prm-Code"), ("rtp_desc", "", 0,
                                                       "Description", "Y")),
            "where": [("rtp_cono", "=", self.opts["conum"])]
        }
        acc = {
            "stype":
            "R",
            "tables": ("rtlmst", ),
            "cols":
            (("rtm_acno", "", 0, "Acc-Num"), ("rtm_name", "", 0, "Name", "Y")),
            "where": [("rtm_cono", "=", self.opts["conum"])],
            "whera": (("T", "rtm_code", 0, 0), )
        }
        seq = {
            "stype":
            "R",
            "tables": ("rtlcon", ),
            "cols":
            (("rtc_cnum", "", 0, "Acc-Num"), ("rtc_payind", "", 0, "F"),
             ("rtc_start", "", 0, "Start-Date"), ("rtc_period", "", 0, "Per")),
            "where": [("rtc_cono", "=", self.opts["conum"])],
            "whera": [["T", "rtc_code", 0, 0], ["T", "rtc_acno", 1, 0]]
        }
        tag = (("Premises", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Tenant", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Balances", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Transactions", self.doTrans1, ("T", 0, 0), ("T", 0, 1)))
        fld = ((("T", 0, 0, 0), "INA", 7, "Premises", "Premises Code", "", "Y",
                self.doPremises, prm, None, ("notblank", )),
               (("T", 0, 0, 0), "INA", 7, "Account", "Account Code", "", "N",
                self.doAccount, acc, None,
                ("notblank", )), (("T", 0, 0, 0), "ONA", 30, "Name"),
               (("T", 1, 0, 0), "ONA", 30,
                "Description"), (("T", 1, 1, 0), "ONA", 30, "Address-1"),
               (("T", 1, 2, 0), "ONA", 30,
                "Address-2"), (("T", 1, 3, 0), "ONA", 30, "Address-3"),
               (("T", 1, 4, 0), "ONA", 4,
                "Postal Code"), (("T", 2, 0, 0), "ONA", 30, "Address-1"),
               (("T", 2, 1, 0), "ONA", 30,
                "Address-2"), (("T", 2, 2, 0), "ONA", 30, "Address-3"),
               (("T", 2, 3, 0), "ONA", 4,
                "Postal Code"), (("T", 2, 4, 0), "ONA", 20,
                                 "Telephone Number"), (("T", 2, 5, 0), "OTX",
                                                       50, "E-Mail Address"),
               (("T", 2, 6, 0), "OUA", 1,
                "VAT Indicator"), (("T", 2, 7, 0), "ONA", 10, "VAT Number"),
               (("T", 2, 8, 0), "OUA", 1,
                "Payment Frequency"), (("T", 2, 9, 0), "OD1", 10,
                                       "Start Date"), (("T", 2, 10, 0), "OUI",
                                                       3, "Number of Periods"),
               (("T", 2, 11, 0), "OUD", 12.2,
                "Rental Amount"), (("T", 2, 12, 0), "OUA", 1, "Status"),
               (("C", 3, 0, 0), "OSD", 13.2, "Value", "", "", "N", None, None,
                None, None, ("Details", 5)), (("T", 4, 0, 0), "IUI", 3,
                                              "Sequence Number", "", "N", "N",
                                              self.doTrans2, seq, None, None))
        but = (("Clear", None, self.doClear, 0, ("T", 0, 0), ("T", 0, 1)),
               ("Notes", None, self.doNotes, 0, ("T", 0, 0), ("T", 0, 1)),
               ("Print", None, self.doPrint, 0, ("T", 0, 0),
                ("T", 0, 1)), ("Quit", None, self.doExit, 1, None, None))
        tnd = ((self.doEndTop, "N"), None, None, None, None)
        txt = (self.doExit, None, None, None, self.doExit)
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               tags=tag,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)
        self.df.colLabel[3][0].configure(text="Rentals ")
        self.df.colLabel[3][1].configure(text="Receipts")
        self.df.colLabel[3][2].configure(text="Payments")
        self.df.colLabel[3][3].configure(text="Journals")
        self.df.colLabel[3][4].configure(text="Balance ")

    def doPremises(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("rtlprm",
                              where=[("rtp_cono", "=", self.opts["conum"]),
                                     ("rtp_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Premises"
        self.code = w
        for num, fld in enumerate(acc):
            if num < 2 or num > 6:
                continue
            self.df.loadEntry("T", 1, (num - 2), data=fld)

    def doAccount(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("rtlmst",
                              where=[("rtm_cono", "=", self.opts["conum"]),
                                     ("rtm_code", "=", self.code),
                                     ("rtm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account"
        self.acno = w
        self.name = acc[self.sql.rtlmst_col.index("rtm_name")]
        con = self.sql.getRec("rtlcon",
                              where=[("rtc_cono", "=", self.opts["conum"]),
                                     ("rtc_code", "=", self.code),
                                     ("rtc_acno", "=", self.acno)],
                              order="rtc_cnum")
        if not con:
            return "Invalid Contract"
        self.df.loadEntry(frt, pag, p + 1, data=acc[3])
        for num, fld in enumerate(acc[4:]):
            self.df.loadEntry("T", 2, num, data=fld)
        self.cnum = con[-1:][0][3]
        self.df.topf[4][0][5] = self.cnum
        for num, fld in enumerate(con[-1:][0][4:-1]):
            self.df.loadEntry("T", 2, num + 8, data=fld)
        self.loadBalances()
        self.opts["mf"].updateStatus("")

    def doEndTop(self):
        self.df.last[0] = [0, 0]
        self.df.setWidget(self.df.topEntry[0][0], state="disabled")

    def loadBalances(self):
        rtl = 0
        rec = 0
        pmt = 0
        jnl = 0
        bal = self.sql.getRec("rtltrn",
                              cols=["rtt_type", "round(sum(rtt_tramt), 2)"],
                              where=[("rtt_cono", "=", self.opts["conum"]),
                                     ("rtt_code", "=", self.code),
                                     ("rtt_acno", "=", self.acno)],
                              group="rtt_type",
                              order="rtt_type")
        if bal:
            for a in bal:
                if a[0] == 1:
                    rtl = a[1]
                if a[0] == 2:
                    rec = a[1]
                if a[0] == 3:
                    pmt = a[1]
                if a[0] == 4:
                    jnl = a[1]
        bal = float(ASD(rtl) + ASD(rec) + ASD(pmt) + ASD(jnl))
        self.df.loadEntry("C", 3, 0, data=rtl)
        self.df.loadEntry("C", 3, 1, data=rec)
        self.df.loadEntry("C", 3, 2, data=pmt)
        self.df.loadEntry("C", 3, 3, data=jnl)
        self.df.loadEntry("C", 3, 4, data=bal)
        self.trn = self.sql.getRec("rtltrn",
                                   where=[("rtt_cono", "=",
                                           self.opts["conum"]),
                                          ("rtt_code", "=", self.code),
                                          ("rtt_acno", "=", self.acno)],
                                   order="rtt_trdt, rtt_type")

    def doTagSelect(self):
        self.opts["mf"].updateStatus("")

    def doTrans1(self):
        self.df.focusField("T", 4, 1)

    def doTrans2(self, frt, pag, r, c, p, i, w):
        tit = "Transactions for Account: %s %s - %s" % \
            (self.code, self.acno, self.name)
        tab = ["rtltrn"]
        col = (("rtt_trdt", "", 0, "   Date"), ("rtt_curdt", "", 0, "Curr-Dt"),
               ("rtt_batch", "", 0,
                "Batch"), ("rtt_type", ("XX", rttrtp), 3,
                           "Typ"), ("rtt_refno", "", 0, "Reference",
                                    "Y"), ("rtt_tramt", "", 0, "     Amount"),
               ("rtt_taxamt", "", 0, " VAT-Amount"), ("rtt_desc", "", 0,
                                                      "Details"))
        whr = [("rtt_cono", "=", self.opts["conum"]),
               ("rtt_code", "=", self.code), ("rtt_acno", "=", self.acno)]
        if w:
            whr.append(("rtt_cnum", "=", w))
        odr = "rtt_trdt, rtt_type"
        state = self.df.disableButtonsTags()
        SRec(self.opts["mf"],
             screen=self.df.nb.Page2,
             title=tit,
             tables=tab,
             cols=col,
             where=whr,
             order=odr)
        self.df.enableButtonsTags(state=state)
        self.doTrans1()

    def doNotes(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        NotesCreate(self.opts["mf"], self.opts["conum"], self.opts["conam"],
                    self.opts["capnm"], "RTL",
                    "%7s%s" % (self.code, self.acno))
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doClear(self):
        self.df.selPage("Premises")
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        mess = "Select the Required Print Option."
        butt = (("Information", "I"), ("Transactions", "T"), ("Both", "B"),
                ("None", "N"))
        self.doPrintOption(
            askChoice(self.opts["mf"].body, "Print Options", mess, butt=butt))
        if self.df.topq[self.df.pag]:
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doPrintOption(self, opt):
        if opt == "N":
            return
        self.head = "%03u %-101s" % (self.opts["conum"], self.opts["conam"])
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.pglin = 999
        if opt != "T":
            self.pageHeading()
            self.printInfo()
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            self.opts["conum"],
                            ext="pdf")
        if opt == "I":
            self.fpdf.output(pdfnam, "F")
            doPrinter(mf=self.opts["mf"],
                      conum=self.opts["conum"],
                      pdfnam=pdfnam,
                      header=self.tit,
                      repprt=["N", "V", "view"])
        elif opt == "B":
            if not self.trn:
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"],
                          conum=self.opts["conum"],
                          pdfnam=pdfnam,
                          header=self.tit,
                          repprt=["N", "V", "view"])
            else:
                self.pageHeading()
                self.pageHeadingTrans()
                self.printTrans()
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"],
                          conum=self.opts["conum"],
                          pdfnam=pdfnam,
                          header=self.tit,
                          repprt=["N", "V", "view"])
        elif opt == "T":
            if self.trn:
                self.pageHeading()
                self.pageHeadingTrans()
                self.printTrans()
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"],
                          conum=self.opts["conum"],
                          pdfnam=pdfnam,
                          header=self.tit,
                          repprt=["N", "V", "view"])

    def printInfo(self):
        for x in range(0, len(self.df.topf[0])):
            self.fpdf.drawText(
                "%-26s%-25s %s" %
                ("", self.df.topf[0][x][3], self.df.t_disp[0][0][x]))
        self.fpdf.drawText()
        for x in range(0, len(self.df.topf[1])):
            self.fpdf.drawText(
                "%-26s%-25s %s" %
                ("", self.df.topf[1][x][3], self.df.t_disp[1][0][x]))
        self.fpdf.drawText()
        for x in range(0, len(self.df.topf[2])):
            self.fpdf.drawText(
                "%-26s%-25s %s" %
                ("", self.df.topf[2][x][3], self.df.t_disp[2][0][x]))
        self.fpdf.drawText()
        self.pglin += 3 + len(self.df.topf[3])
        self.fpdf.setFont(style="B")
        self.fpdf.drawText("%26s%-34s %13s" % ("", "Details", "Amount "))
        self.fpdf.drawText("%26s%s" % ("", self.fpdf.suc * 48))
        self.fpdf.setFont()
        desc = ("Rentals ", "Receipts", "Payments", "Journals", "Balance ")
        for n, d in enumerate(self.df.c_disp[3]):
            self.fpdf.drawText("%26s%-34s %13s" % ("", desc[n], d[0]))

    def printTrans(self):
        col = self.sql.rtltrn_col
        bal = 0
        for ct in self.trn:
            trdt = CCD(ct[col.index("rtt_trdt")], "D1", 10)
            refno = CCD(ct[col.index("rtt_refno")], "Na", 9)
            trtp = CCD(ct[col.index("rtt_type")], "UI", 1)
            batch = CCD(ct[col.index("rtt_batch")], "Na", 7)
            desc = CCD(ct[col.index("rtt_desc")], "NA", 30)
            tramt = ct[col.index("rtt_tramt")]
            if tramt < 0:
                debit = CCD(0, "SD", 13.2)
                credit = CCD(tramt, "SD", 13.2)
            else:
                debit = CCD(tramt, "SD", 13.2)
                credit = CCD(0, "SD", 13.2)
            bal = float(ASD(bal) + ASD(tramt))
            tot = CCD(bal, "SD", 13.2)
            taxamt = CCD(ct[col.index("rtt_taxamt")], "SD", 13.2)
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
                self.pageHeadingTrans()
            self.fpdf.drawText(
                "%s %s %s %s %s %s %s %s %s" %
                (trdt.disp, refno.disp, rttrtp[(trtp.work - 1)][0], batch.disp,
                 desc.disp, debit.disp, credit.disp, tot.disp, taxamt.disp))
            self.pglin += 1

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        self.fpdf.drawText("%-34s %-10s" % \
            ("Rentals Ledger Interrogation as at", self.sysdtd))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 6

    def pageHeadingTrans(self):
        self.fpdf.drawText(
            "%-16s %s %s %s %s %s %s %s %s" %
            ("", self.df.topf[0][0][3], self.df.t_disp[0][0][0], "",
             self.df.topf[0][1][3], self.df.t_disp[0][0][1], "",
             self.df.topf[0][2][3], self.df.t_disp[0][0][2]))
        self.fpdf.drawText()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText("%-10s %-9s %-3s %-7s %-30s %-13s %-13s %-13s" % \
            ("   Date", "Reference", "Typ", "Batch", "Remarks",
            "       Debit", "      Credit",  "     Balance"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 8

    def doExit(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #21
0
class ms1040(object):
    def __init__(self, **opts):
        self.opts = opts
        if "args" in opts:
            self.code = opts["args"]
        else:
            self.code = None
        if self.setVariables():
            self.mainProcess()
            if self.code:
                self.df.doKeyPressed("T", 0, 0, self.code)
            if "wait" in self.opts:
                self.df.mstFrame.wait_window()
            else:
                self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["ctlvmf", "ctlvrf", "ctlvtf",
            "chglog"], prog=self.__class__.__name__)
        if self.sql.error:
            return
        if not self.code:
            gc = GetCtl(self.opts["mf"])
            ctlmst = gc.getCtl("ctlmst", self.opts["conum"])
            if not ctlmst:
                return
            if not ctlmst["ctm_taxno"]:
                showError(self.opts["mf"].body, "Unregistered",
                    "The Company Record Does Not Have a V.A.T. Number")
                return
        return True

    def mainProcess(self):
        vtm = {
            "stype": "R",
            "tables": ("ctlvmf",),
            "cols": (
                ("vtm_code", "", 0, "C"),
                ("vtm_desc", "", 0, "Description", "Y"),
                ("vtm_cat", "", 0, "C")),
            "where": [("vtm_cono", "=", self.opts["conum"])]}
        vtr = {
            "stype": "R",
            "tables": ("ctlvrf",),
            "cols": (
                ("vtr_date", "", 0, "Start-Date"),
                ("vtr_rate", "", 0, "Rate")),
            "where": [("vtr_cono", "=", self.opts["conum"])],
            "whera": [["T", "vtr_code", 0, 0]]}
        vtt = {
            "stype": "C",
            "titl": "VAT Types",
            "head": ("C", "Description"),
            "data": [
                ["N", "None"],
                ["S", "Standard"],
                ["Z", "Zero Rated"],
                ["C", "Capital Item"],
                ["X", "Excluded Item"]]}
        fld = (
            (("T",0,0,0),"IUA",1,"V.A.T. Code","",
                "","Y",self.doCode,vtm,None,("notblank",)),
            (("T",0,1,0),"INA",30,"Description","",
                "","N",self.doDesc,None,self.doDelete,("notblank",)),
            (("T",0,2,0),"IUA",1,"Category","",
                "S","N",self.doCat,vtt,None,("in", ("C","N","S","X","Z"))),
            (("C",0,0,0),"Id1",10,"Start-Date","The Starting Date",
                "","N",self.doStart,vtr,None,("efld",)),
            (("C",0,0,1),"IUD",6.2,"Rate-%","The Rate",
                "","N",self.doRate,None,None,("efld",)))
        but = (
            ("Print",None,self.doPrint,0,("T",0,1),(("T",0,0),("T",0,2))),
            ("Add",None,self.doAdd,0,("T",0,0),None),
            ("Edit",None,self.doEdit,0,("T",0,0),None),
            ("Exit",None,self.doExit,0,("T",0,0),(("T",0,1),("C",0,1))))
        tnd = ((self.doTEnd,"y"), )
        txt = (self.doTExit, )
        cnd = ((self.doCEnd,"y"), )
        cxt = (self.doCExit, )
        self.df = TartanDialog(self.opts["mf"], eflds=fld,
            butt=but, tend=tnd, txit=txt, cend=cnd, cxit=cxt, rows=(15,))

    def doPrint(self):
        hds = "V.A.T. Records"
        col = [
            ["vtm_code", "UA",  1,   "C"],
            ["vtm_desc", "NA", 30,   "Description"],
            ["vtm_cat", "UA",   1,   "T"],
            ["vtr_date", "d1", 10,   "Start-Date"],
            ["vtr_rate", "UD",  6.2, "Rate"]]
        recs = self.sql.getRec(tables=["ctlvmf", "ctlvrf"], cols=["vtm_code",
            "vtm_desc", "vtm_cat", "vtr_date", "vtr_rate"], where=[("vtm_cono",
            "=", self.opts["conum"]), ("vtr_cono=vtm_cono",),
            ("vtr_code=vtm_code",)], order="vtm_code, vtr_date")
        code = None
        data = copyList(recs)
        for num, rec in enumerate(recs):
            if rec[0] == code:
                data[num][0] = ""
                data[num][1] = ""
                data[num][2] = ""
            code = rec[0]
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        RepPrt(self.opts["mf"], name=self.__class__.__name__, tables=data,
            heads=[hds], ttype="D", cols=col, prtdia=(("Y","V"), ("Y","N")))
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        self.df.focusField("T", 0, 1)

    def doCode(self, frt, pag, r, c, p, i, w):
        self.code = w
        self.oldm = self.sql.getRec("ctlvmf", where=[("vtm_cono", "=",
            self.opts["conum"]), ("vtm_code", "=", self.code)], limit=1)
        if not self.oldm:
            self.newm = True
        else:
            self.newm = False
            self.desc = self.oldm[self.sql.ctlvmf_col.index("vtm_desc")]
            self.df.loadEntry(frt, pag, p+1, data=self.desc)
            self.cat = self.oldm[self.sql.ctlvmf_col.index("vtm_cat")]
            self.df.loadEntry(frt, pag, p+2, data=self.cat)
            self.doLoadRates()
            return "ff2"

    def doDelete(self):
        if self.df.frt == "T":
            if self.doCheckTrn():
                showError(self.opts["mf"].body, "Exists",
                    "Transactions Exist for this Code, Not Deleted")
                return
            self.sql.delRec("ctlvmf", where=[("vtm_cono", "=",
                self.opts["conum"]), ("vtm_code", "=", self.code)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            self.sql.insRec("chglog", data=["ctlvmf", "D", "%03i%-1s" % \
                (self.opts["conum"], self.code), "", dte, self.opts["capnm"],
                "", "", "", 0])
            self.sql.delRec("ctlvrf", where=[("vtr_cono", "=",
                self.opts["conum"]), ("vtr_code", "=", self.code)])
            self.opts["mf"].dbm.commitDbase()

    def doDesc(self, frt, pag, r, c, p, i, w):
        self.desc = w

    def doCat(self, frt, pag, r, c, p, i, w):
        self.cat = w

    def doTEnd(self):
        self.edit = False
        datm = [self.opts["conum"]]
        datm.extend(self.df.t_work[0][0][:3])
        if self.newm:
            self.sql.insRec("ctlvmf", data=datm)
            if self.cat in ("N", "X", "Z"):
                newr = [self.opts["conum"], self.code, 0, 0]
                self.sql.insRec("ctlvrf", data=newr)
                self.opts["mf"].dbm.commitDbase()
                self.df.focusField("T", 0, 1)
            else:
                self.doButtons()
                self.df.focusField("C", 0, 1)
        elif self.cat in ("N", "X", "Z"):
            self.df.focusField("T", 0, 1)
        elif datm != self.oldm[:len(datm)]:
            col = self.sql.ctlvmf_col
            datm.append(self.oldm[col.index("vtm_xflag")])
            self.sql.updRec("ctlvmf", data=datm, where=[("vtm_cono", "=",
                self.opts["conum"]), ("vtm_code", "=", self.code)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.oldm):
                if dat != datm[num]:
                    self.sql.insRec("chglog", data=["ctlvmf",
                    "U", "%03i%-1s" % (self.opts["conum"], self.code),
                    col[num], dte, self.opts["capnm"], str(dat),
                    str(datm[num]), "", 0])
            self.doButtons()
        self.opts["mf"].dbm.commitDbase()

    def doTExit(self):
        chks = ""
        recs = self.sql.getRec("ctlvmf", where=[("vtm_cono", "=",
            self.opts["conum"])])
        for rec in recs:
            rte = self.sql.getRec("ctlvrf", where=[("vtr_cono",
                "=", self.opts["conum"]), ("vtr_code", "=", rec[1])])
            if not rte:
                if rec[3] in ("N", "X", "Z"):
                    self.sql.insRec("ctlvrf", data=[rec[0], rec[1], 0, 0])
                    self.opts["mf"].dbm.commitDbase()
                    continue
                chks = "%s\n%1s %-30s %1s" % (chks, rec[1], rec[2], rec[3])
        if chks:
            showError(self.opts["mf"].body, "Missing Rate Record", "The "\
                "following VAT Codes do Not have Rate Records:\n%s\n\n"\
                "You will Not be able to Exit until you either Create "\
                "Rate Records or Delete these codes." % chks)
            self.df.focusField("T", 0, 1)
        else:
            self.df.closeProcess()
            if "wait" not in self.opts:
                self.opts["mf"].closeLoop()

    def doAdd(self):
        for num, rec in enumerate(self.df.c_work[0]):
            if not rec[0] and not rec[1]:
                pos = (num * 2) + 1
                self.df.focusField("C", 0, pos)
                break

    def doEdit(self):
        self.edit = True
        self.newr = False
        tit = "Edit Rate"
        vtr = {
            "stype": "R",
            "tables": ("ctlvrf",),
            "cols": (
                ("vtr_date", "", 0, "Start-Date"),
                ("vtr_rate", "", 0, "Rate")),
            "where": [
                ("vtr_cono", "=", self.opts["conum"]),
                ("vtr_code", "=", self.code)]}
        fld = (
            (("T",0,0,0),"OUA",1,"V.A.T. Code"),
            (("T",0,1,0),"ONA",30,"Description"),
            (("T",0,2,0),"OUA",1,"Category"),
            (("T",0,3,0),"Id1",10,"Start-Date","The Starting Date",
                "","N",self.doEStart,vtr,self.doEDelete,("efld",)),
            (("T",0,4,0),"IUD",6.2,"Rate-%","The Rate",
                "","N",self.doERate,None,self.doEDelete,("notzero",)))
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        self.ed = TartanDialog(self.opts["mf"], title=tit, tops=True,
            eflds=fld, tend=((self.doEEnd,"n"),), txit=(self.doEExit,))
        self.ed.loadEntry("T", 0, 0, data=self.code)
        self.ed.loadEntry("T", 0, 1, data=self.desc)
        self.ed.loadEntry("T", 0, 2, data=self.cat)
        self.ed.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        if self.exit:
            self.df.focusField("T", 0, 1)
        else:
            self.doExit()

    def doEDelete(self):
        self.exit = False
        if self.ed.pos == 3:
            if self.doCheckTrn():
                return ("T", 0, 4, "Transactions Exist, Not Deleted")
            self.sql.delRec("ctlvmf", where=[("vtm_cono", "=",
                self.opts["conum"]), ("vtm_code", "=", self.code)])
            self.sql.delRec("ctlvrf", where=[("vtr_cono", "=",
                self.opts["conum"]), ("vtr_code", "=", self.code)])
        else:
            if self.doCheckTrn(self.start):
                return ("T", 0, 5, "Transactions Exist, Not Deleted")
            self.sql.delRec("ctlvrf", where=[("vtr_cono", "=",
                self.opts["conum"]), ("vtr_code", "=", self.code),
                ("vtr_date", "=", self.start)])
        self.ed.closeProcess()
        chk = self.sql.getRec("ctlvrf", cols=["count(*)"],
            where=[("vtr_cono", "=", self.opts["conum"]),
            ("vtr_code", "=", self.code)], limit=1)
        if not chk[0]:
            self.sql.delRec("ctlvmf", where=[("vtm_cono", "=",
                self.opts["conum"]), ("vtm_code", "=", self.code)])
            self.exit = True
        self.opts["mf"].dbm.commitDbase()
        return "nf"

    def doEStart(self, frt, pag, r, c, p, i, w):
        self.oldr = self.sql.getRec("ctlvrf", where=[("vtr_cono",
            "=", self.opts["conum"]), ("vtr_code", "=", self.code),
            ("vtr_date", "=", w)], limit=1)
        if not self.oldr:
            return "Date Does Not Exist"
        if self.doCheckTrn(w):
            showError(self.opts["mf"].body, "Date Error",
                "Transactions Exist for Date, Editing Not Allowed.")
            return "Invalid Date"
        self.start = w
        self.rate = self.oldr[3]
        self.ed.loadEntry(frt, pag, p+1, data=self.rate)

    def doERate(self, frt, pag, r, c, p, i, w):
        if not w:
            yes = askQuestion(self.opts["mf"].body, "Zero Rate",
                "Are You Sure That This Rate is Correct?", default="no")
            if yes == "no":
                return "Invalid Rate"
        self.rate = w

    def doEEnd(self):
        self.ed.closeProcess()
        self.doCEnd()

    def doEExit(self):
        self.ed.closeProcess()

    def doStart(self, frt, pag, r, c, p, i, w):
        if self.doCheckTrn(w):
            showError(self.opts["mf"].body, "Date Error",
                "Transactions Exist On or After This Starting Date.")
            return "Invalid Date"
        self.start = w
        self.oldr = self.sql.getRec("ctlvrf", where=[("vtr_cono",
            "=", self.opts["conum"]), ("vtr_code", "=", self.code),
            ("vtr_date", "=", self.start)], limit=1)
        if not self.oldr:
            self.newr = True
            if self.cat in ("N", "X", "Z"):
                if self.edit:
                    self.ed.loadEntry(frt, pag, p+1, data=0)
                else:
                    self.df.loadEntry(frt, pag, p+1, data=0)
                return "nd"
        else:
            self.newr = False
            if self.edit:
                self.ed.loadEntry(frt, pag, p+1,
                    data=self.oldr[self.sql.ctlvrf_col.index("vtr_rate")])
            else:
                self.df.loadEntry(frt, pag, p+1,
                    data=self.oldr[self.sql.ctlvrf_col.index("vtr_rate")])

    def doRate(self, frt, pag, r, c, p, i, w):
        if not w:
            yes = askQuestion(self.opts["mf"].body, "Zero Rate",
                "Are You Sure That This Rate is Correct?", default="no")
            if yes == "no":
                return "Invalid Rate"
        self.rate = w

    def doCheckTrn(self, date=None):
        where = [
            ("vtt_cono", "=", self.opts["conum"]),
            ("vtt_code", "=", self.code)]
        if date:
            where.append(("vtt_refdt", ">=", date))
        return self.sql.getRec("ctlvtf", cols=["count(*)"],
            where=where, limit=1)[0]

    def doCEnd(self):
        datr = [self.opts["conum"], self.code, self.start, self.rate]
        if self.newr:
            self.sql.insRec("ctlvrf", data=datr)
        elif datr != self.oldr[:len(datr)]:
            col = self.sql.ctlvrf_col
            datr.append(self.oldr[col.index("vtr_xflag")])
            self.sql.updRec("ctlvrf", data=datr, where=[("vtr_cono", "=",
                self.opts["conum"]), ("vtr_code", "=", self.code),
                ("vtr_date", "=", self.start)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.oldr):
                if dat != datr[num]:
                    self.sql.insRec("chglog", data=["ctlvrf", "U",
                        "%03i%-1s" % (self.opts["conum"], self.code),
                        col[num], dte, self.opts["capnm"], str(dat),
                        str(datr[num]), "", 0])
        self.opts["mf"].dbm.commitDbase()
        self.edit = False
        self.doExit()

    def doCExit(self):
        self.edit = False
        self.doExit()

    def doLoadRates(self):
        self.df.clearFrame("C", 0)
        recs = self.sql.getRec("ctlvrf",
            cols=["vtr_date", "vtr_rate"],
            where=[("vtr_cono", "=", self.opts["conum"]),
            ("vtr_code", "=", self.code)], order="vtr_date")
        for num, rec in enumerate(recs):
            pos = (num * 2)
            if pos > 27:
                self.df.scrollScreen(0)
                pos = 26
            self.df.focusField("C", 0, pos + 1)
            self.df.loadEntry("C", 0, pos, data=rec[0])
            self.df.focusField("C", 0, pos + 2)
            self.df.loadEntry("C", 0, pos + 1, data=rec[1], zero=True)

    def doButtons(self):
        self.df.setWidget(self.df.B1, "normal")
        self.df.setWidget(self.df.B2, "normal")
        self.df.setWidget(self.df.B3, "normal")
        self.opts["mf"].window.focus_set()

    def doExit(self):
        self.df.setWidget(self.df.B3, "disabled")
        self.df.focusField("T", 0, 1)
Пример #22
0
class bs1010(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"])
        ctlsys = gc.getCtl("ctlsys")
        if not ctlsys:
            return
        ctlmst = gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        tabs = ["bksmst", "bksown", "bksaut", "chglog"]
        self.sql = Sql(self.opts["mf"].dbm, tabs, prog=self.__class__.__name__)
        if self.sql.error:
            return
        return True

    def mainProcess(self):
        bmf = {
            "stype":
            "R",
            "tables": ("bksmst", "bksown"),
            "cols":
            (("bmf_stat", "", 0, "S"), ("bmf_code", "", 0, "Code"),
             ("bmf_titl", "", 0, "Title", "Y"), ("bmf_ownr", "", 0, "Ownr"),
             ("bof_fnam", "", 0, "Name"), ("bmf_mnth", "", 0, "Mth-Rec")),
            "where": [("bmf_cono", "=", self.opts["conum"]),
                      ("bof_cono=bmf_cono", ), ("bof_code=bmf_ownr", )],
            "order":
            "bmf_stat, bmf_titl",
            "index":
            1
        }
        amf = {
            "stype":
            "R",
            "tables": ("bksaut", ),
            "cols":
            (("baf_code", "", 0, "Code"), ("baf_snam", "", 0, "Surname", "Y"),
             ("baf_fnam", "", 0, "Names")),
            "order":
            "baf_code"
        }
        omf = {
            "stype":
            "R",
            "tables": ("bksown", ),
            "cols":
            (("bof_code", "", 0, "Code"), ("bof_snam", "", 0, "Surname", "Y"),
             ("bof_fnam", "", 0, "Names")),
            "where": [("bof_cono", "=", self.opts["conum"])],
            "order":
            "bof_code"
        }
        r1s = (("Current", "C"), ("Removed", "X"))
        fld = ((("T", 0, 0,
                 0), "IUI", 4, "Code", "", "", "Y", self.doCode, bmf, None,
                ("efld", )), (("T", 0, 1, 0), "ITX", 30, "Title", "", "", "N",
                              self.doTitle, None, None, ("notblank", )),
               (("T", 0, 2, 0), "IUI", 4, "Author", "", "", "N", self.doAuthor,
                amf, None, ("efld", )), (("T", 0, 2, 0), "ONA", 30, ""),
               (("T", 0, 3, 0), "IUI", 4, "Owner", "", "", "N", self.doOwner,
                omf, None, ("efld", )), (("T", 0, 3, 0), "ONA", 30, ""),
               (("T", 0, 4,
                 0), "ID2", 7, "Month", "", "", "N", self.doMonth, None, None,
                ("efld", )), (("T", 0, 5, 0), ("IRB", r1s), 0, "Status", "",
                              "C", "N", self.doStatus, None, None, None))
        but = (("Accept", None, self.doAccept, 0, ("T", 0, 2),
                (("T", 0, 0), ("T", 0, 1))), ("Exit", None, self.doExit, 0,
                                              ("T", 0, 1), None))
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)

    def doCode(self, frt, pag, r, c, p, i, w):
        self.bcode = w
        if not self.bcode:
            ok = askQuestion(self.opts["mf"].body,
                             "New Book",
                             "Is This a New Book?",
                             default="no")
            if ok == "no":
                return "Invalid Code"
            self.newbk = True
            self.bcode = getNextCode(self.sql,
                                     "bksmst",
                                     "bmf_code",
                                     start=1,
                                     last=9999)
            self.df.loadEntry(frt, pag, p, data=self.bcode)
        else:
            self.old = self.sql.getRec("bksmst",
                                       where=[("bmf_cono", "=",
                                               self.opts["conum"]),
                                              ("bmf_code", "=", self.bcode)],
                                       limit=1)
            if not self.old:
                ok = askQuestion(self.opts["mf"].body,
                                 "Code",
                                 "Is This a Manual Code?",
                                 default="no")
                if ok == "no":
                    return "Invalid Code"
                self.newbk = True
                return
            col = 0
            self.newbk = False
            for num, dat in enumerate(self.old[1:-1]):
                self.df.loadEntry(frt, pag, col, data=dat)
                if num == 2:
                    col += 1
                    self.df.loadEntry(frt, pag, col, data=self.getAuthor(dat))
                elif num == 3:
                    col += 1
                    self.df.loadEntry(frt, pag, col, data=self.getOwner(dat))
                col += 1

    def doDelete(self):
        self.sql.delRec("bksmst",
                        where=[("bmf_cono", "=", self.opts["conum"]),
                               ("bmf_code", "=", self.bcode)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doTitle(self, frt, pag, r, c, p, i, w):
        self.title = w

    def doAuthor(self, frt, pag, r, c, p, i, w):
        self.acode = w
        if not self.acode:
            ok = askQuestion(self.opts["mf"].body,
                             "New Author",
                             "Is This a New Author?",
                             default="no")
            if ok == "no":
                return "Invalid Code"
            self.doNewAuthor()
            if not self.aend:
                return "rf"
            self.df.loadEntry(frt, pag, p, data=self.acode)
        acc = self.sql.getRec("bksaut",
                              where=[("baf_code", "=", self.acode)],
                              limit=1)
        if not acc:
            return "Invalid Code"
        self.df.loadEntry(frt, pag, p + 1, data=self.getAuthor(self.acode))

    def doNewAuthor(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        tit = ("Author's Details", )
        fld = ((("T", 0, 0, 0), "ITX", 30, "Surname", "", "", "Y", None, None,
                None, ("notblank", )), (("T", 0, 1, 0), "ITX", 30, "Names", "",
                                        "", "Y", None, None, None, ("efld", )))
        self.aa = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doAutEnd, "y"), ),
                               txit=(self.doAutExit, ))
        self.aa.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doAutEnd(self):
        self.aend = True
        self.acode = getNextCode(self.sql,
                                 "bksaut",
                                 "baf_code",
                                 start=1,
                                 last=9999)
        data = [self.acode, self.aa.t_work[0][0][0], self.aa.t_work[0][0][1]]
        self.sql.insRec("bksaut", data=data)
        self.aa.closeProcess()

    def doAutExit(self):
        self.aend = False
        self.aa.closeProcess()

    def getAuthor(self, code):
        acc = self.sql.getRec("bksaut",
                              where=[("baf_code", "=", code)],
                              limit=1)
        if acc:
            return "%s, %s" % (acc[1], acc[2])
        else:
            return ""

    def doOwner(self, frt, pag, r, c, p, i, w):
        self.ocode = w
        if not self.ocode:
            ok = askQuestion(self.opts["mf"].body,
                             "New Member",
                             "Is This a New Member?",
                             default="no")
            if ok == "no":
                return "Invalid Code"
            self.doNewOwner()
            if not self.oend:
                return "rf"
            self.df.loadEntry(frt, pag, p, data=self.ocode)
        acc = self.sql.getRec("bksown",
                              where=[("bof_cono", "=", self.opts["conum"]),
                                     ("bof_code", "=", self.ocode)],
                              limit=1)
        if not acc:
            return "Invalid Code"
        self.df.loadEntry(frt, pag, p + 1, data=self.getOwner(self.ocode))

    def doNewOwner(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        tit = ("Owner's Details", )
        fld = ((("T", 0, 0, 0), "ITX", 30, "Surname", "", "", "Y", None, None,
                None, ("notblank", )), (("T", 0, 1, 0), "ITX", 30, "Names", "",
                                        "", "Y", None, None, None, ("efld", )))
        self.oo = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=((self.doOwnEnd, "y"), ),
                               txit=(self.doOwnExit, ))
        self.oo.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doOwnEnd(self):
        self.oend = True
        self.ocode = getNextCode(self.sql,
                                 "bksown",
                                 "bof_code",
                                 start=1,
                                 last=9999)
        data = [
            self.opts["conum"], self.acode, self.oo.t_work[0][0][0],
            self.oo.t_work[0][0][1], "", "", "", "", "", "", "", ""
        ]
        self.sql.insRec("bksown", data=data)
        self.oo.closeProcess()

    def doOwnExit(self):
        self.oend = False
        self.oo.closeProcess()

    def getOwner(self, code):
        acc = self.sql.getRec("bksown",
                              where=[("bof_cono", "=", self.opts["conum"]),
                                     ("bof_code", "=", code)],
                              limit=1)
        if acc:
            return "%s, %s" % (acc[2], acc[3])
        else:
            return ""

    def doMonth(self, frt, pag, r, c, p, i, w):
        self.month = w

    def doStatus(self, frt, pag, r, c, p, i, w):
        self.status = w

    def doEnd(self):
        data = [self.opts["conum"]]
        for num, dat in enumerate(self.df.t_work[0][0]):
            if num in (3, 5):
                continue
            data.append(dat)
        if self.newbk:
            self.sql.insRec("bksmst", data=data)
        elif data != self.old[:len(data)]:
            col = self.sql.bksmst_col
            data.append(self.old[col.index("bmf_xflag")])
            self.sql.updRec("bksmst",
                            data=data,
                            where=[("bmf_cono", "=", self.opts["conum"]),
                                   ("bmf_code", "=", self.bcode)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.old):
                if dat != data[num]:
                    self.sql.insRec(
                        "chglog",
                        data=[
                            "bksmst", "U",
                            "%03i%04i" % (self.opts["conum"], self.bcode),
                            col[num], dte, self.opts["capnm"],
                            str(dat),
                            str(data[num]), "", 0
                        ])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doAccept(self):
        frt, pag, col, mes = self.df.doCheckFields()
        if mes:
            self.df.focusField(frt, pag, (col + 1), err=mes)
        else:
            self.df.doEndFrame("T", 0, cnf="N")

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #23
0
class gl3020(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):
        self.sql = Sql(self.opts["mf"].dbm, ["ctlmst", "genmst", "gentrn"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        # Check for Multiple Companies
        coy = self.sql.getRec("ctlmst", cols=["count(*)"], limit=1)
        if coy[0]:
            self.multi = "Y"
        else:
            self.multi = "N"
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sysdttm = "(Printed on: %i/%02i/%02i at %02i:%02i) %6s" % (
            t[0], t[1], t[2], t[3], t[4], self.__class__.__name__)
        self.head = "%03u %-30s" % (self.opts["conum"], self.opts["conam"])
        self.colsh = [
            "TP", "BatchNo", "Coy", "Acc-Num", "Description", "Reference",
            "Date", "Debits", "Credits", "Tax-Amount", "T", "Remarks"
        ]
        self.forms = [("UI", 2, False, False, True), ("Na", 7),
                      ("UI", 3, False, False, True),
                      ("UI", 7, False, False, True), ("NA", 30), ("Na", 9),
                      ("D1", 10), ("SD", 15.2), ("SD", 15.2), ("SD", 15.2),
                      ("UA", 1), ("NA", 30)]
        self.s_per = int(self.opts["period"][1][0] / 100)
        self.e_per = int(self.opts["period"][2][0] / 100)
        self.gqt = [0] * (len(gltrtp) + 1)
        self.gdr = [0] * (len(gltrtp) + 1)
        self.gcr = [0] * (len(gltrtp) + 1)
        self.gvt = [0] * (len(gltrtp) + 1)
        self.totind = "N"
        self.other = "N"
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "General Ledger Audit Trail (%s)" %
                    self.__class__.__name__)
        data = ["All Types"]
        for typ in gltrtp:
            data.append(typ[1])
        btt = {"stype": "C", "titl": "Valid Types", "data": data, "retn": "I"}
        btm = {
            "stype":
            "R",
            "tables": ("gentrn", ),
            "cols": (("glt_batch", "", 0,
                      "Bat-Num"), ("glt_type", ("xx", gltrtp), 20, "Type"),
                     ("glt_curdt", "", 0, "Cur-Dat")),
            "where": [],
            "group":
            "glt_batch, glt_type, glt_curdt",
            "order":
            "glt_type, glt_curdt, glt_batch"
        }
        r1s = (("Financial", "F"), ("Capture", "C"))
        r2s = (("Yes", "Y"), ("No", "N"))
        if "args" in self.opts and "noprint" in self.opts["args"]:
            var = self.opts["args"]["work"][0]
            view = None
            mail = None
        else:
            var = ["F", "", "", "", "", "", "", "Y"]
            view = ("Y", "V")
            mail = ("Y", "N")
        fld = [(("T", 0, 0, 0), ("IRB", r1s), 0, "Period Type", "", var[0],
                "Y", self.doPtyp, None, None, None),
               (("T", 0, 1, 0), "Id2", 7, "Starting Period", "", self.s_per,
                "N", self.doStartPer, None, None, ("efld", )),
               (("T", 0, 2, 0), "Id2", 7, "Ending Period", "", self.e_per, "N",
                self.doEndPer, None, None, ("efld", )),
               (("T", 0, 3, 0), "Id1", 10, "Starting Date", "", self.sysdtw,
                "N", self.doStartDat, None, None, ("efld", )),
               (("T", 0, 4, 0), "Id1", 10, "Ending Date", "", self.sysdtw, "N",
                self.doEndDat, None, None, ("efld", )),
               (("T", 0, 5, 0), "IUI", 1, "Type", "Transaction Type", var[5],
                "N", self.doBatTyp, btt, None, None),
               (("T", 0, 6, 0), "INa", 7, "Batch Number", "", var[6], "N",
                self.doBatNum, btm, None, None),
               (("T", 0, 7, 0), ("IRB", r2s), 0, "Totals Only", "", var[7],
                "N", self.doTots, None, None, None)]
        if self.multi == "Y":
            fld.append((("T", 0, 8, 0), ("IRB", r2s), 10, "Other Companies",
                        "", "N", "N", self.doCoy, None, None, None))
        tnd = ((self.doEnd, "y"), )
        txt = (self.doExit, )
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               view=view,
                               mail=mail)

    def doPtyp(self, frt, pag, r, c, p, i, w):
        self.ptyp = w
        if self.ptyp == "C":
            return "sk2"

    def doStartPer(self, frt, pag, r, c, p, i, w):
        if not w:
            w = self.s_per
        elif w < self.s_per or w > self.e_per:
            return "Invalid Period"
        self.sperw = w
        self.df.loadEntry(frt, pag, p, data=self.sperw)
        self.sperd = self.df.t_disp[pag][0][i]

    def doEndPer(self, frt, pag, r, c, p, i, w):
        if not w:
            w = self.e_per
        elif w < self.sperw or w > self.e_per:
            return "Invalid Period"
        self.eperw = w
        self.df.loadEntry(frt, pag, p, self.eperw)
        self.eperd = self.df.t_disp[pag][0][i]
        return "sk2"

    def doStartDat(self, frt, pag, r, c, p, i, w):
        self.sdatw = w
        self.df.loadEntry(frt, pag, p, data=self.sdatw)
        self.sperd = self.df.t_disp[pag][0][i]

    def doEndDat(self, frt, pag, r, c, p, i, w):
        if w < self.sdatw:
            return "Invalid Date"
        self.edatw = w
        self.df.loadEntry(frt, pag, p, self.edatw)
        self.eperd = self.df.t_disp[pag][0][i]

    def doBatTyp(self, frt, pag, r, c, p, i, w):
        if w > len(gltrtp):
            return "Invalid Batch Type"
        self.btyp = w
        whr = [("glt_cono", "=", self.opts["conum"])]
        if self.ptyp == "F":
            whr.append(("glt_curdt", "between", self.sperw, self.eperw))
        else:
            whr.append(("glt_capdt", "between", self.sdatw, self.edatw))
        if self.btyp:
            whr.append(("glt_type", "=", self.btyp))
        self.df.topf[pag][i + 1][8]["where"] = whr

    def doBatNum(self, frt, pag, r, c, p, i, w):
        self.batch = w

    def doTots(self, frt, pag, r, c, p, i, w):
        self.totsonly = w
        if "args" in self.opts and "noprint" in self.opts["args"]:
            return
        if self.totsonly == "Y":
            if self.multi == "Y":
                self.df.setWidget(self.df.topEntry[0][9][3][0], state="hide")
                self.df.setWidget(self.df.topEntry[0][9][4][0], state="hide")
            else:
                self.df.setWidget(self.df.topEntry[0][8][3][0], state="hide")
                self.df.setWidget(self.df.topEntry[0][8][4][0], state="hide")
        else:
            if self.multi == "Y":
                self.df.setWidget(self.df.topEntry[0][9][3][0], state="show")
                self.df.setWidget(self.df.topEntry[0][9][4][0], state="show")
            else:
                self.df.setWidget(self.df.topEntry[0][8][3][0], state="show")
                self.df.setWidget(self.df.topEntry[0][8][4][0], state="show")

    def doCoy(self, frt, pag, r, c, p, i, w):
        self.other = w

    def doEnd(self):
        self.df.closeProcess()
        jon = "left outer join genmst on glt_cono=glm_cono and "\
            "glt_acno=glm_acno"
        col = [
            "glt_cono", "glt_acno", "glt_trdt", "glt_type", "glt_refno",
            "glt_batch", "glt_tramt", "glt_taxamt", "glt_desc", "glt_taxind",
            "glm_desc"
        ]
        if self.other == "Y":
            self.doSelCoy()
            if self.con == "X":
                self.closeProcess()
                return
            whr = [("glt_cono", "in", tuple(self.con))]
        else:
            whr = [("glt_cono", "=", self.opts["conum"])]
        if self.ptyp == "F":
            whr.append(("glt_curdt", "between", self.sperw, self.eperw))
        else:
            whr.append(("glt_capdt", "between", self.sdatw, self.edatw))
        if self.btyp:
            whr.append(("glt_type", "=", self.btyp))
        if self.batch:
            whr.append(("glt_batch", "=", self.batch))
        odr = "glt_type, glt_batch, glt_trdt, glt_refno"
        recs = self.sql.getRec("gentrn",
                               join=jon,
                               cols=col,
                               where=whr,
                               order=odr)
        if not recs:
            showError(self.opts["mf"].body, "Transaction Error",
                      "No Transactions Selected")
        elif self.df.repprt[2] == "export":
            self.exportReport(recs)
        else:
            self.printReport(recs)
        if "args" in self.opts and "noprint" in self.opts["args"]:
            self.t_work = [self.df.t_work[0][0]]
        self.closeProcess()

    def doSelCoy(self):
        tit = ("Company Selection", )
        self.coys = self.sql.getRec("ctlmst",
                                    cols=["ctm_cono", "ctm_name"],
                                    order="ctm_cono")
        coy = {
            "stype": "C",
            "head": ("Num", "Name"),
            "typs": (("UI", 3), ("NA", 30)),
            "data": self.coys,
            "mode": "M",
            "comnd": self.doCoyCmd
        }
        r1s = (("Yes", "Y"), ("Include", "I"), ("Exclude", "E"))
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "All Companies", "", "Y", "N",
                self.doAllCoy, None, None, None, None),
               (("T", 0, 1, 0), "INA", 30, "Companies", "", "", "N",
                self.doCoySel, coy, None, None, None))
        self.cf = TartanDialog(self.opts["mf"],
                               tops=True,
                               title=tit,
                               eflds=fld,
                               tend=((self.doCoyEnd, "y"), ),
                               txit=(self.doCoyExit, ))
        self.cf.mstFrame.wait_window()

    def doAllCoy(self, frt, pag, r, c, p, i, w):
        self.con = w
        if self.con == "Y":
            self.con = []
            for coy in self.coys:
                self.con.append(coy[0])
            return "nd"
        elif self.con == "I":
            self.cf.topf[pag][i + 1][8]["titl"] = "Select Companies to Include"
        else:
            self.cf.topf[pag][i + 1][8]["titl"] = "Select Companies to Exclude"

    def doCoyCmd(self, frt, pag, r, c, p, i, w):
        c = ""
        for co in w:
            if int(co):
                c = c + str(int(co)) + ","
        if len(c) > 1:
            c = c[:-1]
        self.cf.loadEntry(frt, pag, p, data=c)

    def doCoySel(self, frt, pag, r, c, p, i, w):
        if w[-1:] == ",":
            w = w[:-1]
        self.coy = w.split(",")

    def doCoyEnd(self):
        if self.con == "I":
            self.con = self.coy
        elif self.con == "E":
            self.con = []
            for co in self.coys:
                self.con.append(int(co[0]))
            for co in self.coy:
                del self.con[self.con.index(int(co))]
            self.con.sort()
        self.doCoyClose()

    def doCoyExit(self):
        self.con = "X"
        self.doCoyClose()

    def doCoyClose(self):
        self.cf.closeProcess()

    def exportReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        expnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__, self.opts["conum"])
        self.expheads = [self.head + " %s" % self.sysdttm]
        self.expheads.append("General Ledger Audit Trail for Period "\
            "%s to %s" % (self.sperd, self.eperd))
        self.expcolsh = [self.colsh]
        self.expforms = self.forms
        self.expdatas = []
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                p.closeProgress()
                return
            vals = self.getValues(dat)
            if not vals:
                continue
            cono, acno, trdt, trtp, refno, batch, debit, credit, taxamt, \
                detail, taxind, desc = vals
            line = [
                "BODY",
                [
                    trtp.work, batch.work, cono.work, acno.work, desc.work,
                    refno.work, trdt.work, debit.work, credit.work,
                    taxamt.work, taxind.work, detail.work
                ]
            ]
            self.expdatas.append(line)
        p.closeProgress()
        self.grandTotal()
        doWriteExport(xtype=self.df.repprt[1],
                      name=expnam,
                      heads=self.expheads,
                      colsh=self.expcolsh,
                      forms=self.expforms,
                      datas=self.expdatas,
                      rcdic=self.opts["mf"].rcdic)

    def printReport(self, recs):
        p = ProgressBar(self.opts["mf"].body, mxs=len(recs), esc=True)
        if self.totsonly == "Y":
            self.head = "%03i %-95s" % (self.opts["conum"], self.opts["conam"])
        else:
            self.head = "%03i %-138s" % (self.opts["conum"],
                                         self.opts["conam"])
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.bqty = 0
        self.bdrs = 0
        self.bcrs = 0
        self.bvat = 0
        self.tqty = 0
        self.tdrs = 0
        self.tcrs = 0
        self.tvat = 0
        self.trtp = 0
        self.pglin = 999
        for num, dat in enumerate(recs):
            p.displayProgress(num)
            if p.quit:
                break
            vals = self.getValues(dat)
            if not vals:
                continue
            cono, acno, trdt, trtp, refno, batch, debit, credit, taxamt, \
                detail, taxind, desc = vals
            if not self.trtp:
                self.trtp = trtp.work
                self.batch = batch.work
            if trtp.work != self.trtp:
                self.batchTotal()
                self.typeTotal()
                self.trtp = trtp.work
                self.batch = batch.work
                self.pglin = 999
            if batch.work != self.batch:
                self.batchTotal()
                self.batch = batch.work
                if self.totsonly != "Y":
                    self.typeHeading()
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
            if self.totsonly != "Y":
                self.fpdf.drawText(
                    "%s %s %s %s %s %s %s %s %s %s" %
                    (cono.disp, acno.disp, desc.disp, refno.disp, trdt.disp,
                     debit.disp, credit.disp, taxamt.disp, taxind.disp,
                     detail.disp))
                self.pglin += 1
            # Batch Totals
            self.bqty += 1
            self.bdrs = float(ASD(self.bdrs) + ASD(debit.work))
            self.bcrs = float(ASD(self.bcrs) + ASD(credit.work))
            self.bvat = float(ASD(self.bvat) + ASD(taxamt.work))
            # Type Totals
            self.tqty += 1
            self.tdrs = float(ASD(self.tdrs) + ASD(debit.work))
            self.tcrs = float(ASD(self.tcrs) + ASD(credit.work))
            self.tvat = float(ASD(self.tvat) + ASD(taxamt.work))
        p.closeProgress()
        if self.fpdf.page and not p.quit:
            self.batchTotal()
            self.typeTotal()
            self.grandTotal()
            if "args" not in self.opts or "noprint" not in self.opts["args"]:
                pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                                    self.__class__.__name__,
                                    self.opts["conum"],
                                    ext="pdf")
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"],
                          conum=self.opts["conum"],
                          pdfnam=pdfnam,
                          header=self.tit,
                          repprt=self.df.repprt,
                          repeml=self.df.repeml)

    def getValues(self, data):
        cono = CCD(data[0], "UI", 3)
        acno = CCD(data[1], "UI", 7)
        trdt = CCD(data[2], "D1", 10)
        trtp = CCD(data[3], "UI", 2)
        refno = CCD(data[4], "Na", 9)
        batch = CCD(data[5], "Na", 7)
        if data[6] < 0:
            debit = CCD(0, "SD", 15.2)
            credit = CCD(data[6], "SD", 15.2)
        else:
            debit = CCD(data[6], "SD", 15.2)
            credit = CCD(0, "SD", 15.2)
        taxamt = CCD(data[7], "SD", 15.2)
        detail = CCD(data[8], "NA", 30)
        taxind = CCD(data[9], "NA", 1)
        desc = CCD(data[10], "NA", 30)
        self.gqt[trtp.work - 1] = self.gqt[trtp.work - 1] + 1
        self.gdr[trtp.work - 1] = float(ASD(self.gdr[trtp.work - 1]) + \
            ASD(debit.work))
        self.gcr[trtp.work - 1] = float(ASD(self.gcr[trtp.work - 1]) + \
            ASD(credit.work))
        self.gvt[trtp.work - 1] = float(ASD(self.gvt[trtp.work - 1]) + \
            ASD(taxamt.work))
        return (cono, acno, trdt, trtp, refno, batch, debit, credit, taxamt,
                detail, taxind, desc)

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.drawText(self.head, font=["B"])
        self.fpdf.drawText()
        if self.totsonly == "Y":
            self.fpdf.drawText("%-37s %-7s %-2s %-50s" %
                               ("General Ledger Audit Trail for Period",
                                self.sperd, "to", self.eperd))
        else:
            self.fpdf.drawText("%-37s %-7s %-2s %-94s" %
                               ("General Ledger Audit Trail for Period",
                                self.sperd, "to", self.eperd))
        self.fpdf.drawText()
        self.pglin = 4
        if self.totind == "N":
            self.typeHeading()
        else:
            self.fpdf.drawText("%-14s" % "Totals Summary")
            self.fpdf.drawText()
            if self.totsonly == "Y":
                self.fpdf.drawText(
                    "%-27s%-8s  %-15s %-15s %-15s %-15s" %
                    ("Document Type", "Quantity", "        Debits",
                     "       Credits", "    Difference", "        V.A.T."))
            else:
                self.fpdf.drawText(
                    "%-34s%-8s  %-15s %-15s %-15s %-15s" %
                    ("Document Type", "Quantity", "        Debits",
                     "       Credits", "    Difference", "        V.A.T."))
            self.fpdf.underLine(self.head)
            self.pglin += 4
            self.fpdf.setFont()

    def typeHeading(self):
        if self.fpdf.lpp - self.pglin < 4:
            self.pageHeading()
            return
        if self.totsonly != "Y":
            batch = self.batch
        else:
            batch = "Various"
        self.fpdf.drawText(
            "%-7s %7s %-10s %3s" %
            ("Batch", batch, "    Type", gltrtp[self.trtp - 1][1]),
            font=["B"])
        self.fpdf.drawText()
        if self.totsonly == "Y":
            self.fpdf.drawText("%-36s %-15s %-15s %-15s %-15s" %
                               ("Details", "        Debits", "       Credits",
                                "    Difference", "        V.A.T."))
        else:
            self.fpdf.drawText("%-3s %-7s %-30s %-9s %-10s %-15s %-15s "\
                "%-15s %-1s %-30s" % ("Coy", "Acc-Num", "Description",
                "Reference", "   Date", "        Debits", "       Credits",
                "    Tax-Amount", "T", "Remarks"))
        self.fpdf.underLine(self.head)
        self.fpdf.setFont()
        self.pglin += 4

    def batchTotal(self):
        if self.fpdf.lpp - self.pglin < 3:
            self.pageHeading()
        j = CCD(self.bdrs, "SD", 15.2)
        k = CCD(self.bcrs, "SD", 15.2)
        l = CCD(float(ASD(j.work) + ASD(k.work)), "SD", 15.2)
        m = CCD(self.bvat, "SD", 15.2)
        if self.totsonly == "Y":
            self.fpdf.drawText("%-36s %15s %15s %15s %15s" %
                               ("Batch " + self.batch + " Totals", j.disp,
                                k.disp, l.disp, m.disp))
            self.pglin += 1
        else:
            self.fpdf.drawText()
            self.fpdf.drawText("%-11s %-51s %15s %15s %15s" %
                               (" ", "Batch " + self.batch + " Totals", j.disp,
                                k.disp, m.disp))
            self.fpdf.drawText()
            self.pglin += 3
        self.bqty = 0
        self.bcrs = 0
        self.bdrs = 0
        self.bvat = 0

    def typeTotal(self):
        if self.fpdf.lpp - self.pglin < 2:
            self.pageHeading()
        j = CCD(self.tdrs, "SD", 15.2)
        k = CCD(self.tcrs, "SD", 15.2)
        l = CCD(float(ASD(j.work) + ASD(k.work)), "SD", 15.2)
        m = CCD(self.tvat, "SD", 15.2)
        if self.totsonly == "Y":
            self.fpdf.drawText()
            self.fpdf.drawText("%-36s %15s %15s %15s %15s" %
                               ("Type Totals", j.disp, k.disp, l.disp, m.disp))
            self.pglin += 2
        else:
            self.fpdf.drawText("%-11s %-51s %15s %15s %15s" %
                               (" ", "Type-Totals", j.disp, k.disp, m.disp))
            self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1
        self.tqty = 0
        self.tcrs = 0
        self.tdrs = 0
        self.tvat = 0

    def grandTotal(self):
        tot = [0, 0, 0, 0, 0]
        if self.df.repprt[2] == "export":
            for x in range(0, len(gltrtp)):
                tot[0] = float(ASD(tot[0]) + ASD(self.gdr[x]))
                tot[1] = float(ASD(tot[1]) + ASD(self.gcr[x]))
                tot[2] = float(ASD(tot[2]) + ASD(self.gvt[x]))
            self.expdatas.append(["ULINES"])
            self.expdatas.append([
                "TOTAL",
                [
                    "", "", "", "", "Grand Totals", "", "", tot[0], tot[1],
                    tot[2], ""
                ]
            ])
            self.expdatas.append(["ULINED"])
            return
        self.totind = "Y"
        self.pageHeading()
        for x, t in enumerate(gltrtp):
            qt = CCD(self.gqt[x], "SI", 8)
            dr = CCD(self.gdr[x], "SD", 15.2)
            cr = CCD(self.gcr[x], "SD", 15.2)
            df = float(ASD(dr.work) + ASD(cr.work))
            df = CCD(df, "SD", 15.2)
            vt = CCD(self.gvt[x], "SD", 15.2)
            if self.totsonly == "Y":
                self.fpdf.drawText(
                    "%-27s %s %s %s %s %s" %
                    (t[1], qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
            else:
                self.fpdf.drawText(
                    "%-34s %s %s %s %s %s" %
                    (t[1], qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
            tot[0] = tot[0] + qt.work
            tot[1] = float(ASD(tot[1]) + ASD(dr.work))
            tot[2] = float(ASD(tot[2]) + ASD(cr.work))
            tot[3] = float(ASD(tot[3]) + ASD(df.work))
            tot[4] = float(ASD(tot[4]) + ASD(vt.work))
        self.fpdf.drawText()
        qt = CCD(tot[0], "SI", 8)
        dr = CCD(tot[1], "SD", 15.2)
        cr = CCD(tot[2], "SD", 15.2)
        df = CCD(tot[3], "SD", 15.2)
        vt = CCD(tot[4], "SD", 15.2)
        if self.totsonly == "Y":
            self.fpdf.drawText(
                "%-27s %s %s %s %s %s" %
                ("Grand Totals", qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
        else:
            self.fpdf.drawText(
                "%-34s %s %s %s %s %s" %
                ("Grand Totals", qt.disp, dr.disp, cr.disp, df.disp, vt.disp))
        self.fpdf.drawText()

    def doExit(self):
        self.df.closeProcess()
        self.closeProcess()

    def closeProcess(self):
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #24
0
class sl4010(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):
        self.sql = Sql(self.opts["mf"].dbm, ["ctlynd", "wagmst", "waglmf",
            "wagltf"], prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        wagctl = gc.getCtl("wagctl", self.opts["conum"])
        if not wagctl:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.sysdtd = "%i/%02i/%02i" % (t[0], t[1], t[2])
        # Get the current period starting date
        period = self.sql.getRec("ctlynd", cols=["max(cye_period)"],
            where=[("cye_cono", "=", self.opts["conum"])], limit=1)[0]
        self.opts["period"] = getPeriods(self.opts["mf"], self.opts["conum"],
            period)[0].work
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
            "Staff Loans Interrogation (%s)" % self.__class__.__name__)
        wgm = {
            "stype": "R",
            "tables": ("waglmf", "wagmst"),
            "cols": (
                ("wlm_empno", "", 0, "EmpNo"),
                ("wgm_sname", "", 0, "Surname", "Y"),
                ("wgm_fname", "", 0, "Names")),
            "where": [
                ("wlm_cono", "=", self.opts["conum"]),
                ("wgm_cono=wlm_cono",),
                ("wgm_empno=wlm_empno",)],
            "group": "wlm_empno"}
        lnm = {
            "stype": "R",
            "tables": ("waglmf",),
            "cols": (
                ("wlm_empno", "", 0, "EmpNo"),
                ("wlm_loan", "", 0, "Ln"),
                ("wlm_desc", "", 0, "Description", "Y")),
            "where": [("wlm_cono", "=", self.opts["conum"])],
            "whera": [["T", "wlm_empno", 0, 0]],
            "order": "wlm_empno, wlm_loan",
            "index": 1}
        r1s = (("Yes", "Y"), ("No", "N"))
        tag = (
            ("General", self.doGeneral, ("T",0,0), ("T",0,1)),
            ("Trans", self.doTrans1, ("T",0,0), ("T",0,1)))
        fld = (
            (("T",0,0,0),"IUI",5,"Emp-Num","Employee Number",
                "","N",self.doEmp,wgm,None,("notzero",)),
            (("T",0,0,0),"ONA",40,"Name"),
            (("T",0,1,0),"IUI",5,"Loan-Num","Loan Number",
                "","N",self.doLoan,lnm,None,("notzero",)),
            (("T",0,1,0),"ONA",40,"Desc"),
            (("T",1,0,0),"OUI",3,"Deduction Code"),
            (("T",1,1,0),"OUD",6.2,"Interest Percentage"),
            (("T",1,2,0),"OD1",10,"Start Date"),
            (("T",1,3,0),"OSD",13.2,"Deduction Amount"),
            (("T",1,4,0),"OSD",13.2,"Total Advances"),
            (("T",1,5,0),"OSD",13.2,"Total Interest"),
            (("T",1,6,0),"OSD",13.2,"Total Repayments"),
            (("T",1,7,0),"OSD",13.2,"Total Adjustments"),
            (("T",1,8,0),"OSD",13.2,"Balance"),
            (("T",1,9,0),"Od1",10,"Last Interest Raised"),
            (("T",1,10,0),"Od1",10,"Last Payment Received"),
            (("T",2,0,0),("IRB",r1s),0,"History","",
                "Y","Y",self.doTrans2,None,None,None))
        tnd = ((self.doEndTop,"N"), None, None)
        txt = (self.doExit, None, None)
        cnd = (None, None, None)
        cxt = (None, None, None)
        but = (
            ("Clear",None,self.doClear,0,("T",0,0),("T",0,1)),
            ("Print",None,self.doPrint,0,("T",0,0),("T",0,1)),
            ("Quit",None,self.doExit,1,None,None))
        self.df = TartanDialog(self.opts["mf"], title=self.tit, eflds=fld,
            tags=tag, tend=tnd, txit=txt, cend=cnd, cxit=cxt, butt=but)

    def doEmp(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("wagmst", cols=["wgm_sname",
            "wgm_fname"], where=[("wgm_cono", "=", self.opts["conum"]),
            ("wgm_empno", "=", w)], limit=1)
        if not acc:
            return "Invalid Employee Number"
        self.empno = w
        self.name = "%s, %s" % (acc[0], acc[1])
        self.history = "Y"
        self.df.loadEntry("T", pag, p+1, data=self.name)

    def doLoan(self, frt, pag, r, c, p, i, w):
        lmc = self.sql.waglmf_col
        rec = self.sql.getRec("waglmf", where=[("wlm_cono", "=",
            self.opts["conum"]), ("wlm_empno", "=", self.empno),
            ("wlm_loan", "=", w)], limit=1)
        if not rec:
            return "Invalid Loan Number"
        self.loan = w
        self.desc = rec[lmc.index("wlm_desc")]
        self.df.loadEntry("T", pag, p+1, data=self.desc)
        self.df.loadEntry("T", 1, 0, data=rec[lmc.index("wlm_code")])
        self.df.loadEntry("T", 1, 1, data=rec[lmc.index("wlm_rate")])
        self.df.loadEntry("T", 1, 2, data=rec[lmc.index("wlm_start")])
        self.df.loadEntry("T", 1, 3, data=rec[lmc.index("wlm_repay")])
        # Raise Interest
        LoanInterest("S", self.opts["mf"].dbm, rec, update="Y",
            curdt=int(self.sysdtw / 100), tdate=self.sysdtw, refno="Pending")
        # Get Balances
        self.lon = 0.0
        self.imt = 0.0
        self.pay = 0.0
        self.adj = 0.0
        self.bal = 0.0
        self.idt = 0
        self.pdt = 0
        whr = [
            ("wlt_cono", "=", self.opts["conum"]),
            ("wlt_empno", "=", self.empno),
            ("wlt_loan", "=", self.loan)]
        odr = "wlt_trdt, wlt_type"
        self.wlt = self.sql.getRec("wagltf", where=whr, order=odr)
        if self.wlt:
            col = self.sql.wagltf_col
            for rec in self.wlt:
                dat = CCD(rec[col.index("wlt_trdt")], "d1", 10)
                typ = CCD(rec[col.index("wlt_type")], "UI",  2)
                amt = CCD(rec[col.index("wlt_amt")], "SD",13.2)
                self.bal = float(ASD(self.bal) + ASD(amt.work))
                if typ.work == 1:
                    self.idt = dat.work
                    self.imt = float(ASD(self.imt) + ASD(amt.work))
                elif typ.work in (2, 3):
                    self.lon = float(ASD(self.lon) + ASD(amt.work))
                elif typ.work == 4:
                    self.pay = float(ASD(self.pay) + ASD(amt.work))
                    self.pdt = dat.work
                elif typ.work == 5:
                    self.adj = float(ASD(self.adj) + ASD(amt.work))
        # Load Balances
        self.df.loadEntry("T", 1, 4, data=self.lon)
        self.df.loadEntry("T", 1, 5, data=self.imt)
        self.df.loadEntry("T", 1, 6, data=self.pay)
        self.df.loadEntry("T", 1, 7, data=self.adj)
        self.df.loadEntry("T", 1, 8, data=self.bal)
        self.df.loadEntry("T", 1, 9, data=self.idt)
        self.df.loadEntry("T", 1, 10, data=self.pdt)
        self.opts["mf"].updateStatus("")

    def doHist(self, frt, pag, r, c, p, i, w):
        self.history = w

    def doEndTop(self):
        self.df.last[0] = [0, 0]
        self.df.setWidget(self.df.topEntry[0][0], state="disabled")

    def loadBalances(self):
        whr = [
            ("wlt_cono", "=", self.opts["conum"]),
            ("wlt_empno", "=", self.empno),
            ("wlt_loan", "=", self.loan)]
        odr = "wlt_trdt, wlt_type"
        self.wlt = self.sql.getRec("wagltf", where=whr, order=odr)
        if self.wlt:
            for rec in self.wlt:
                dat = CCD(rec[self.sql.wagltf_col.index("wlt_trdt")], "d1", 10)
                typ = CCD(rec[self.sql.wagltf_col.index("wlt_type")], "UI",  2)
                amt = CCD(rec[self.sql.wagltf_col.index("wlt_amt")], "SD",13.2)
                self.bal = float(ASD(self.bal) + ASD(amt.work))
                self.cap = float(ASD(self.cap) + ASD(amt.work))
                if typ.work == 1:
                    if dat.work >= self.opts["period"] and \
                            dat.work >= self.df.t_work[1][0][3]:
                        self.cap = float(ASD(self.cap) - ASD(amt.work))
                        self.due = float(ASD(self.due) + ASD(amt.work))
                    self.imt = float(ASD(self.imt) + ASD(amt.work))
                    self.idt = dat.work
                elif typ.work in (2, 3):
                    self.lon = float(ASD(self.lon) + ASD(amt.work))
                elif typ.work == 4:
                    self.pay = float(ASD(self.pay) + ASD(amt.work))
                    self.pdt = dat.work
                elif typ.work == 5:
                    self.adj = float(ASD(self.adj) + ASD(amt.work))

    def doGeneral(self):
        self.opts["mf"].updateStatus("")

    def doTrans1(self):
        self.df.focusField("T", 2, 1)

    def doTrans2(self, frt, pag, r, c, p, i, w):
        self.history = w
        tit = "Transactions for Loan: %s %s - %s" % \
            (self.empno, self.name, self.desc)
        tab = ["wagltf"]
        col = (("wlt_trdt", "", 0, "   Date"),
                ("wlt_batch", "", 0, "Batch"),
                ("wlt_type", ("XX", sltrtp), 3, "Typ"),
                ("wlt_ref", "", 0, "Reference", "Y"),
                ("wlt_per", "", 0, " Int-%"),
                ("wlt_amt", "", 0, "      Amount"),
                ("wlt_ded", "", 0, "   Deduction"),
                ("wlt_desc", "", 0, "Remarks"))
        whr = [
            ("wlt_cono", "=", self.opts["conum"]),
            ("wlt_empno", "=", self.empno),
            ("wlt_loan", "=", self.loan)]
        if self.history == "N":
            whr.append(("wlt_curdt", ">=", int(self.opts["period"] / 100)))
        odr = "wlt_trdt, wlt_type, wlt_ref"
        state = self.df.disableButtonsTags()
        SRec(self.opts["mf"], screen=self.df.nb.Page2, title=tit, tables=tab,
            cols=col, where=whr, order=odr)
        self.df.enableButtonsTags(state=state)
        self.df.focusField("T", 2, 1)

    def doClear(self):
        self.df.selPage("General")
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        mess = "Select the Required Print Option."
        butt = (
            ("Information", "I"),
            ("Transactions", "T"),
            ("Both", "B"),
            ("None", "N"))
        self.doPrintOption(askChoice(self.opts["mf"].body, "Print Options",
            mess, butt=butt))
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doPrintOption(self, opt):
        print(opt)
        if opt == "N":
            return
        self.head = "%03u %-93s" % (self.opts["conum"], self.opts["conam"])
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.pglin = 999
        if opt != "T":
            self.pageHeading()
            self.printInfo()
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
            self.__class__.__name__, self.opts["conum"], ext="pdf")
        if opt == "I":
            self.fpdf.output(pdfnam, "F")
            doPrinter(mf=self.opts["mf"], conum=self.opts["conum"],
                pdfnam=pdfnam, header=self.tit, repprt=["N", "V", "view"])
        elif opt == "B":
            if not self.wlt:
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"], conum=self.opts["conum"],
                    pdfnam=pdfnam, header=self.tit, repprt=["N", "V", "view"])
            else:
                self.acctot = 0.0
                self.pageHeading()
                self.pageHeadingTrans()
                self.printTrans()
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"], conum=self.opts["conum"],
                    pdfnam=pdfnam, header=self.tit, repprt=["N", "V", "view"])
        elif opt == "T":
            if self.wlt:
                self.acctot = 0.0
                self.pageHeading()
                self.pageHeadingTrans()
                self.printTrans()
                self.fpdf.output(pdfnam, "F")
                doPrinter(mf=self.opts["mf"], conum=self.opts["conum"],
                    pdfnam=pdfnam, header=self.tit, repprt=["N", "V", "view"])

    def printInfo(self):
        self.fpdf.drawText("%-5s %-20s %-25s %s" % ("", "",
                self.df.topf[0][0][3], self.df.t_disp[0][0][0]))
        self.fpdf.drawText("%-5s %-20s %-25s %s" % ("", "",
                self.df.topf[0][1][3], self.df.t_disp[0][0][1]))
        self.fpdf.drawText("%-5s %-20s %-25s %s" % ("", "",
                self.df.topf[0][2][3], self.df.t_disp[0][0][2]))
        self.fpdf.drawText()
        for x in range(0, len(self.df.topf[1])):
            self.fpdf.drawText("%-5s %-20s %-25s %s" % ("", "",
                self.df.topf[1][x][3], self.df.t_disp[1][0][x]))
        self.fpdf.drawText()

    def printTrans(self):
        whr = [
            ("wlt_cono", "=", self.opts["conum"]),
            ("wlt_empno", "=", self.empno),
            ("wlt_loan", "=", self.loan)]
        odr = "wlt_trdt, wlt_type"
        if self.history == "N":
            whr.append(("wlt_curdt", ">=", int(self.opts["period"] / 100)))
        recs = self.sql.getRec("wagltf", where=whr, order=odr)
        for rec in recs:
            trd = CCD(rec[self.sql.wagltf_col.index("wlt_trdt")], "D1", 10)
            typ = CCD(rec[self.sql.wagltf_col.index("wlt_type")], "UI", 1)
            ref = CCD(rec[self.sql.wagltf_col.index("wlt_ref")], "Na", 9)
            bat = CCD(rec[self.sql.wagltf_col.index("wlt_batch")], "Na", 7)
            rte = CCD(rec[self.sql.wagltf_col.index("wlt_per")], "UD", 6.2)
            amt = CCD(rec[self.sql.wagltf_col.index("wlt_amt")], "SD", 13.2)
            ded = CCD(rec[self.sql.wagltf_col.index("wlt_ded")], "SD", 13.2)
            det = CCD(rec[self.sql.wagltf_col.index("wlt_desc")], "NA", 30)
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
                self.pageHeadingTrans()
            self.acctot = float(ASD(self.acctot) + ASD(amt.work))
            self.fpdf.drawText("%s %s %s %s %s %s %s %s" % (trd.disp,
                sltrtp[(typ.work - 1)][0], ref.disp, bat.disp,
                rte.disp, amt.disp, ded.disp, det.disp))
            self.pglin += 1
        self.fpdf.underLine(txt=self.head)
        b = CCD(self.acctot, "SD", 13.2)
        self.fpdf.drawText("%-39s %13s %13s %-30s" % \
            ("", b.disp, "", "Closing Balance"))

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        self.fpdf.drawText("Staff Loans Interrogation as at %s" % self.sysdtd)
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 3

    def pageHeadingTrans(self):
        self.fpdf.setFont(style="B")
        text = "%-8s %5s %-4s %s" % (self.df.topf[0][0][3],
            self.df.t_disp[0][0][0], self.df.topf[0][1][3],
            self.df.t_disp[0][0][1])
        self.fpdf.drawText(text)
        text = "%-8s %5s %-4s %s" % (self.df.topf[0][2][3],
            self.df.t_disp[0][0][2], self.df.topf[0][3][3],
            self.df.t_disp[0][0][3])
        self.fpdf.drawText(text)
        self.fpdf.drawText()
        self.fpdf.drawText("%-10s %-3s %-9s %-7s %6s %12s  %12s  %-30s" % \
            ("   Date", "Typ", "Reference", "Batch", "Int%",
            "    Amount", "  Deduction", "Remarks"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 7
        b = CCD(self.acctot, "SD", 13.2)
        if self.acctot != 0:
            self.fpdf.drawText("%-39s %13s %13s %-30s" % \
                ("", b.disp, "", "Brought Forward"))
            self.pglin += 1

    def doExit(self):
        try:
            self.opts["mf"].dbm.rollbackDbase()
        except:
            pass
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
Пример #25
0
class ml2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        # Check for Valid Posting Routine
        if self.opts["rtn"] not in (1, 2, 3, 4):
            showError(self.opts["mf"].body, "Control Error",
                "Invalid Routine %s, Only 1-4 Are Allowed" % \
                str(self.opts["rtn"]))
            return
        tabs = ["ctlvmf", "ctlvrf", "ctlvtf", "memmst", "memtrn"]
        self.gc = GetCtl(self.opts["mf"])
        memctl = self.gc.getCtl("memctl", self.opts["conum"])
        if not memctl:
            return
        self.glint = memctl["mcm_glint"]
        if self.glint == "Y":
            ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = ["mem_ctl", "vat_ctl", "dis_all"]
            if self.gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.memctl = ctlctl["mem_ctl"]
            self.dis_all = ctlctl["dis_all"]
            tabs.extend(["gentrn", "genmst"])
        # Create SQL Object
        self.sql = Sql(self.opts["mf"].dbm, tabs, prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.bh = Batches(self.opts["mf"],
                          self.opts["conum"],
                          self.opts["conam"],
                          self.opts["period"],
                          "MEM",
                          self.opts["rtn"],
                          glint=self.glint)
        self.bh.doBatchHeader()
        if not self.bh.batno:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        ctlmst = self.gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        self.taxdf = ctlmst["ctm_taxdf"]
        if self.opts["rtn"] == 1:
            self.glt = 1
        elif self.opts["rtn"] == 2:
            self.glt = 2
        elif self.opts["rtn"] == 3:
            self.glt = 4
        elif self.opts["rtn"] == 4:
            self.glt = 1
        self.agevar = tk.BooleanVar()
        self.agevar.set(False)
        return True

    def drawDialog(self):
        mlm = {
            "stype":
            "R",
            "tables": ("memmst", ),
            "cols":
            (("mlm_memno", "", 0, "Mem-No"), ("mlm_oldno", "", 0, "Old-No"),
             ("mlm_gender", "", 0, "G"), ("mlm_state", "", 0, "S"),
             ("mlm_surname", "", 0, "Surname", "Y"), ("mlm_names", "", 0,
                                                      "Names", "F")),
            "where": [("mlm_cono", "=", self.opts["conum"])],
            "order":
            "mlm_surname, mlm_names",
            "sort":
            False
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        vtm = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "C"), ("vtm_desc", "", 0,
                                                "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        fld = [(("T", 0, 0, 0), "OUI", 9, "Batch %s Quantity" % self.bh.batno),
               (("T", 0, 0, 0), "OSD", 13.2, "Value"),
               (("C", 1, 0, 0), "IUI", 6, "Mem-No", "Member Number", "r", "N",
                self.doMemAcc, mlm, None, ("notzero", )),
               [("C", 1, 0, 1), "ONA", 10, "Name"],
               (("C", 1, 0, 2), "INa", 9, "Reference", "Reference Number One",
                "i", "N", self.doRefno, None, None, ("notblank", )),
               (("C", 1, 0, 3), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 4), "ISD", 13.2, "Amount", "Transaction Amount",
                "", "N", self.doTrnAmt, None, None, ("efld", ))]
        if self.opts["rtn"] == 2:
            fld[3][2] = 20
            fld.extend([
                (("C", 1, 0, 5), "ISD", 13.2, "Discount", "Discount Amount",
                 "", "N", self.doDisAmt, None, None, None, None,
                 "Discount Amount to be Added to the Transaction Amount."),
                (("C", 1, 0, 6), "OSD", 13.2, "Total-Amount"),
                (("C", 1, 0,
                  7), "INA", (20, 30), "Details", "Transaction Details", "",
                 "N", self.doTrnDet, None, None, None)
            ])
        elif self.glint == "Y":
            fld[3][2] = 24
            fld.extend([
                (("C", 1, 0, 5), "INA", 30, "Details", "Transaction Details",
                 "", "N", self.doTrnDet, None, None, None),
                (("T", 2, 0, 0), "OSD", 13.2, "Unallocated Balance"),
                (("C", 2, 0, 0), "IUI", 7, "Acc-Num", "Account Number", "",
                 "N", self.doGenAcc, glm, None, None),
                (("C", 2, 0, 1), "ONA", 19, "Description"),
                (("C", 2, 0, 2), "IUA", 1, "V", "V.A.T Code", self.taxdf, "N",
                 self.doVatCode2, vtm, None, ("notblank", )),
                (("C", 2, 0, 3), "ISD", 13.2, "All-Amt", "Allocation Amount",
                 "", "N", self.doAllAmt, None, None, ("efld", )),
                (("C", 2, 0, 4), "ISD", 13.2, "V.A.T", "V.A.T Amount", "", "N",
                 self.doAllVat, None, None, None),
                (("C", 2, 0, 5), "INA", (26, 30), "Details", "", "", "N",
                 self.doAllDet, None, None, ("notblank", ))
            ])
        else:
            fld[3][2] = 22
            fld.extend([
                (("C", 1, 0, 6), "IUA", 1, "V", "V.A.T Code", self.taxdf, "N",
                 self.doVatCode1, vtm, None, ("notblank", )),
                (("C", 1, 0, 7), "ISD", 13.2, "V.A.T", "V.A.T Amount", "", "N",
                 self.doVatAmt, None, None, None),
                (("C", 1, 0,
                  8), "INA", (20, 30), "Details", "Transaction Details", "",
                 "N", self.doTrnDet, None, None, None)
            ])
        but = (
            ("Age _Normal",None,self.doAgeNormal,0,None,None,
                "Only Show Unallocated Transactions",1),
            ("Age _History",None,self.doAgeHistory,0,None,None,
                "Show All Transactions Including Already Allocated",1),
            ("Age _Automatic",None,self.doAgeAuto,0,None,None,
                "Automatically Allocate the Amount Starting With the "\
                "Oldest Unallocated One",1),
            ("Age _Current",None,self.doAgeCurrent,0,None,None,
                "Leave the Transaction Unallocated",1),
            ("Cancel",None,self.doCancel,0,("C",2,1),("C",1,1),"",1))
        tag = [("Transaction", None, None, None, False)]
        cnd = [(None, "n"), (self.endPage1, "y")]
        cxt = [None, self.exitPage1]
        if self.opts["rtn"] != 2 and self.glint == "Y":
            tag.append(("Allocation", None, None, None, False))
            cnd.append((self.endPage2, "y"))
            cxt.append(self.exitPage2)
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tags=tag,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)
        self.df.focusField("C", 1, 1)

    def doMemAcc(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("memmst",
                              cols=["mlm_title", "mlm_initial", "mlm_surname"],
                              where=[("mlm_cono", "=", self.opts["conum"]),
                                     ("mlm_memno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Member Number"
        self.memno = w
        self.name = "%s, %s %s" % (acc[2], acc[0], acc[1])
        self.df.loadEntry("C", pag, p + 1, data=self.name)

    def doRefno(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("memtrn",
                              cols=["mlt_batch"],
                              where=[("mlt_cono", "=", self.opts["conum"]),
                                     ("mlt_memno", "=", self.memno),
                                     ("mlt_type", "=", self.opts["rtn"]),
                                     ("mlt_refno", "=", w)],
                              limit=1)
        if acc:
            return "Transaction Already Exists"
        self.refno = w

    def doTrnDat(self, frt, pag, r, c, p, i, w):
        if w < self.opts["period"][1][0] or w > self.opts["period"][2][0]:
            return "Invalid Date, Not in Financial Period"
        if w > mthendDate(self.bh.curdt * 100):
            return "Invalid Date, After Batch Period"
        if self.bh.multi == "N" and int(w / 100) > self.bh.curdt:
            return "Invalid Date, After Batch Period"
        self.trndat = w

    def doTrnAmt(self, frt, pag, r, c, p, i, w):
        self.trnamt = w
        if self.glint == "Y" or self.opts["rtn"] == 2:
            self.vatcode = "N"
            self.vatamt = 0

    def doVatCode1(self, frt, pag, r, c, p, i, w):
        vrte = getVatRate(self.sql, self.opts["conum"], w, self.trndat)
        if vrte is None:
            return "Invalid V.A.T Code"
        self.vatcode = w
        self.vatamt = round((self.trnamt * vrte / (vrte + 100)), 2)
        self.df.loadEntry(frt, pag, p + 1, self.vatamt)
        if not self.vatamt:
            return "sk1"

    def doVatAmt(self, frt, pag, r, c, p, i, w):
        if self.trnamt < 0 and w > 0:
            self.vatamt = float(ASD(0) - ASD(w))
        elif self.trnamt > 0 and w < 0:
            self.vatamt = float(ASD(0) - ASD(w))
        else:
            self.vatamt = w
        self.df.loadEntry(frt, pag, p, data=self.vatamt)

    def doDisAmt(self, frt, pag, r, c, p, i, w):
        if self.trnamt < 0 and w > 0:
            self.disamt = float(ASD(0) - ASD(w))
        elif self.trnamt > 0 and w < 0:
            self.disamt = float(ASD(0) - ASD(w))
        else:
            self.disamt = w
        self.df.loadEntry(frt, pag, p, data=self.disamt)
        totamt = float(ASD(self.trnamt) + ASD(self.disamt))
        self.df.loadEntry(frt, pag, p + 1, data=totamt)

    def doTrnDet(self, frt, pag, r, c, p, i, w):
        self.trndet = w
        if self.opts["rtn"] != 2 and self.glint == "Y":
            self.df.colf[2][5][5] = w
        self.allocated = float(0.00)

    def endPage1(self):
        self.cancel = False
        self.agecan = False
        self.batupd = False
        self.updateTables1()
        if self.cancel:
            return
        else:
            self.updateBatch()
            if self.trnamt == 0:
                self.df.advanceLine(1)
            else:
                self.allocated = float(0.0)
                if self.opts["rtn"] == 2 or self.glint == "N":
                    self.doMemTrn()
                    self.opts["mf"].dbm.commitDbase()
                    self.df.selPage("Transaction")
                    self.df.advanceLine(1)
                else:
                    self.df.selPage("Allocation")
                    self.df.loadEntry("T", 2, 0, data=self.trnamt)
                    self.df.focusField("C", 2, 1)

    def updateTables1(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trndat / 100)
        else:
            self.curdt = self.bh.curdt
        self.amt = self.trnamt
        self.vat = self.vatamt
        if self.opts["rtn"] == 1:  # Invoices
            recon = 0
            self.dis = 0.00
        elif self.opts["rtn"] == 2:  # Payment
            if self.trnamt == 0:
                recon = self.curdt
            else:
                recon = 0
            self.vat = 0.00
            self.dis = self.disamt
        elif self.opts["rtn"] == 3:  # Journal
            recon = 0
            self.dis = 0.00
        elif self.opts["rtn"] == 4:  # Credit Note
            recon = 0
            self.amt = float(ASD(0) - ASD(self.amt))
            self.dis = 0.00
        if self.opts["rtn"] == 1:
            self.ageloop = False
            self.doAgeCurrent()
        else:
            state = self.df.disableButtonsTags()
            self.opts["mf"].updateStatus("Choose an Ageing Option")
            for x in range(0, 4):
                wid = getattr(self.df, "B%s" % x)
                self.df.setWidget(wid, "normal")
            self.df.setWidget(self.df.B0, "focus")
            self.agevar.set(True)
            self.df.mstFrame.wait_variable(self.agevar)
            self.df.enableButtonsTags(state=state)
            if self.agecan:
                self.doCancel()
                return
        if self.glint == "N":
            return
        # General Ledger Control Transaction (Members)
        val = float(ASD(self.amt) + ASD(self.dis))
        data = (self.opts["conum"], self.memctl, self.curdt, self.trndat,
                self.glt, self.refno, self.bh.batno, val, 0.00, self.trndet,
                "N", "", recon, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        # General Ledger Control Transaction (Bank)
        if self.opts["rtn"] == 2:
            val = float(ASD(0) - ASD(self.amt))
            data = (self.opts["conum"], self.bh.acc, self.curdt, self.trndat,
                    self.glt, self.refno, self.bh.batno, val, 0.00,
                    self.trndet, "N", "", recon, self.opts["capnm"],
                    self.sysdtw, 0)
            self.sql.insRec("gentrn", data=data)
            # General Ledger Control Transaction (Discount)
            if self.dis:
                val = float(ASD(0) - ASD(self.dis))
                data = (self.opts["conum"], self.dis_all, self.curdt,
                        self.trndat, self.glt, self.refno, self.bh.batno, val,
                        0.00, self.trndet, "N", "", recon, self.opts["capnm"],
                        self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)

    def doAgeNormal(self):
        self.doAgeing("N")

    def doAgeHistory(self):
        self.doAgeing("H")

    def doAgeAuto(self):
        self.doAgeing("O")

    def doAgeCurrent(self):
        self.doAgeing("C")

    def doAgeing(self, atype):
        # Disable All Ageing Buttons
        for x in range(0, 4):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, "disabled")
        self.opts["mf"].updateStatus("Select Transaction to Allocate Against")
        age = AgeAll(self.opts["mf"],
                     system="mem",
                     agetyp=atype,
                     agekey=[
                         self.opts["conum"], self.memno, self.opts["rtn"],
                         self.refno, self.curdt, self.amt, self.dis
                     ])
        self.agecan = age.cancel
        if self.agevar.get():
            self.agevar.set(False)

    def exitPage1(self):
        self.df.closeProcess()
        self.bh.doBatchTotal()
        self.opts["mf"].closeLoop()

    def doGenAcc(self, frt, pag, r, c, p, i, w):
        chk = chkGenAcc(self.opts["mf"], self.opts["conum"], w)
        if type(chk) is str:
            return chk
        if not chk[2]:
            self.taxgl = self.taxdf
        else:
            self.taxgl = chk[2]
        self.genacc = w
        self.df.loadEntry("C", pag, p + 1, data=chk[0])
        self.df.loadEntry("C", pag, p + 2, data=self.taxgl)

    def doVatCode2(self, frt, pag, r, c, p, i, w):
        ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"], error=False)
        if not ctlctl:
            return "Missing ctlctl Record for Company"
        if self.gc.chkRec(self.opts["conum"], ctlctl, ["vat_ctl"]):
            return "Missing or Invalid Control Record"
        self.convat = ctlctl["vat_ctl"]
        self.vatrte = getVatRate(self.sql, self.opts["conum"], w, self.trndat)
        if self.vatrte is None:
            return "Invalid V.A.T Code"
        self.vatcode = w

    def doAllAmt(self, frt, pag, r, c, p, i, w):
        if w == 0:
            allamt = float(ASD(self.trnamt) - ASD(self.allocated))
            self.allamt = round((allamt * 100 / (100 + self.vatrte)), 2)
            self.df.loadEntry(frt, pag, p, data=self.allamt)
            self.allvat = float(ASD(allamt) - ASD(self.allamt))
        else:
            self.allamt = w
            self.allvat = round((self.allamt * self.vatrte / 100), 2)
        self.df.loadEntry(frt, pag, p + 1, data=self.allvat)
        if not self.allvat:
            self.df.loadEntry(frt, pag, p + 2, data=self.name)
            return "sk1"

    def doAllVat(self, frt, pag, r, c, p, i, w):
        if self.allamt < 0 and w > 0:
            self.allvat = float(ASD(0) - ASD(w))
        elif self.allamt > 0 and w < 0:
            self.allvat = float(ASD(0) - ASD(w))
        else:
            self.allvat = w
        self.df.loadEntry(frt, pag, p, data=self.allvat)
        self.df.loadEntry(frt, pag, p + 1, data=self.name)

    def doAllDet(self, frt, pag, r, c, p, i, w):
        self.alldet = w

    def doCancel(self):
        if self.agecan:
            ok = "yes"
        else:
            ok = askQuestion(
                self.opts["mf"].body,
                head="Cancel",
                mess="Are You Certain You Want to Cancel This Entry?")
        if ok == "yes":
            self.cancel = True
            self.opts["mf"].dbm.rollbackDbase()
            if self.batupd:
                self.updateBatch(rev=True)
            if self.glint == "Y":
                self.df.clearFrame("C", 2)
            row = int((self.df.last[1][1] - 1) / self.df.colq[1])
            col = (row * self.df.colq[1]) + 1
            self.df.selPage("Transaction")
            self.df.focusField("C", 1, col)

    def endPage2(self):
        self.updateTables2()
        self.allocated = float(ASD(self.allocated) + \
            ASD(self.allamt) + ASD(self.allvat))
        if self.allocated == self.trnamt:
            self.doMemTrn()
            self.opts["mf"].dbm.commitDbase()
            self.df.clearFrame("C", 2)
            self.df.selPage("Transaction")
            self.df.advanceLine(1)
        else:
            bal = float(ASD(self.trnamt) - ASD(self.allocated))
            self.df.loadEntry("T", 2, 0, data=bal)
            self.df.advanceLine(2)

    def updateTables2(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trndat / 100)
        else:
            self.curdt = self.bh.curdt
        if self.opts["rtn"] == 1:  # Invoices
            self.credit()
        elif self.opts["rtn"] == 3:  # Journal Entry
            self.credit()
        elif self.opts["rtn"] == 4:  # Credit Notes
            self.debit()

    def debit(self):
        amt = self.allamt
        vat = self.allvat
        self.restDebitCredit(amt, vat)

    def credit(self):
        amt = float(ASD(0) - ASD(self.allamt))
        vat = float(ASD(0) - ASD(self.allvat))
        self.restDebitCredit(amt, vat)

    def restDebitCredit(self, amt, vat):
        # VAT Transaction (ctlvtf)
        data = (self.opts["conum"], self.vatcode, "O", self.curdt, "M",
                self.glt, self.bh.batno, self.refno, self.trndat, self.memno,
                self.alldet, amt, vat, 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("ctlvtf", data=data)
        if self.glint == "N":
            return
        # General Ledger Transaction (Expense)
        data = (self.opts["conum"], self.genacc, self.curdt, self.trndat,
                self.glt, self.refno, self.bh.batno, amt, vat, self.alldet,
                self.vatcode, "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        if vat:
            # General Ledger Control Transaction (V.A.T.)
            data = (self.opts["conum"], self.convat, self.curdt, self.trndat,
                    self.glt, self.refno, self.bh.batno, vat, 0.00,
                    self.alldet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)
        vat = float(ASD(0) - ASD(vat))
        self.vat += vat

    def exitPage2(self):
        self.df.focusField("C", 2, self.df.col)

    def doMemTrn(self):
        # Members Ledger Transaction
        data = [
            self.opts["conum"], self.memno, self.opts["rtn"], self.refno,
            self.bh.batno, self.trndat, self.amt, self.vat, self.curdt, "", 0,
            self.trndet, self.vatcode, "N", self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("memtrn", data=data)
        if self.dis:
            data = [
                self.opts["conum"], self.memno, 6, self.refno, self.bh.batno,
                self.trndat, self.dis, self.vat, self.curdt, "", 0,
                self.trndet, self.vatcode, "N", self.opts["capnm"],
                self.sysdtw, 0
            ]
            self.sql.insRec("memtrn", data=data, unique="mlt_refno")

    def updateBatch(self, rev=False):
        if rev:
            self.bh.batqty -= 1
            self.bh.batval = float(ASD(self.bh.batval) - ASD(self.trnamt))
        else:
            self.batupd = True
            self.bh.batqty += 1
            self.bh.batval = float(ASD(self.bh.batval) + ASD(self.trnamt))
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)
Пример #26
0
class sc2030(object):
    def __init__(self, **opts):
        self.opts = opts
        if "test" not in opts:
            self.opts["test"] = None
        if self.setVariables():
            if self.opts["test"]:
                self.doImport()
            else:
                self.mainProcess()
                self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm,
                       ["scpcmp", "scpmem", "scpent", "scpgme"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.pair = 0
        self.doimport = False
        return True

    def mainProcess(self):
        com = {
            "stype":
            "R",
            "tables": ("scpcmp", ),
            "cols":
            (("scp_ccod", "", 0, "CCD"), ("scp_name", "", 0, "Name", "Y"),
             ("scp_tsiz", "", 0, "S"), ("scp_fmat", "", 0, "F"),
             ("scp_nsec", "", 0, "NS"), ("scp_nent", "", 0, "NE")),
            "where": [("scp_cono", "=", self.opts["conum"])]
        }
        self.sec = {
            "stype": "C",
            "titl": "Available Sections",
            "head": ("Sec", "Club"),
            "typs": (("Ua", 3), ("NA", 30)),
            "data": []
        }
        self.skp = {
            "stype":
            "R",
            "tables": ("scpmem", "scpgme"),
            "cols": (("a", "UI", 6, "S-Code"), ("b", "NA", 30, "Name", "Y"),
                     ("c", "UI", 6, "O-Code"), ("d", "NA", 30, "Name"),
                     ("e", "UI", 3, "For"), ("f", "UI", 3, "Agt")),
            "where": [],
            "wtype":
            "D"
        }
        tag = (("Results", None, ("T", 0, 0), ("T", 0, 1)), )
        r1s = (("Main", "M"), ("Play-Offs", "P"))
        fld = ((("T", 0, 0,
                 0), "I@scp_ccod", 0, "", "", "", "Y", self.doCmpCod, com,
                None, ("notzero", )), (("T", 0, 0, 0), "O@scp_name", 0, ""),
               (("T", 0, 1,
                 0), ("IRB", r1s), 0, "Type", "", "", "N", self.doCmpTyp, None,
                None, None), (("T", 0, 2, 0), "I@scg_rnum", 0, "Round", "", "",
                              "N", self.doRndNum, None, None, ("notzero", )),
               (("T", 1, 0, 0), "IUI", 2, "Section Number", "", "", "N",
                self.doSecNum, None, None, ("notzero", )),
               (("T", 1, 0, 0), "IUA", 1, "Sub-Section", "", "", "N",
                self.doSubNum, None, None, ("in", ("A", "B"))),
               (("C", 1, 0, 0), "I@scg_scod", 0, "", "", 0, "N", self.doSkpCod,
                self.skp, None, ("notzero", )), (("C", 1, 0, 0), "ONA", 30,
                                                 "Skp-Name"),
               (("C", 1, 0, 0), "I@scg_sfor", 0, "", "", "", "N", self.doShots,
                None, None, ("efld", )), (("C", 1, 0, 0), "I@scg_ocod", 0, "",
                                          "", 0, "N", self.doSkpCod, self.skp,
                                          None, ("notzero", )),
               (("C", 1, 0, 0), "ONA", 30,
                "Opp-Name"), (("C", 1, 0, 0), "I@scg_sagt", 0, "", "", "", "N",
                              self.doShots, None, None, ("efld", )))
        tnd = ((self.doTopEnd, "y"), (self.doTopEnd, "n"))
        txt = (self.doTopExit, self.doTopExit)
        cnd = (None, (self.doColEnd, "n"))
        cxt = (None, self.doColExit)
        but = (("Import Results", None, self.doImport, 0, ("T", 1, 1),
                (("T", 1, 2), ("T", 1, 0))),
               ("Show Entries", None, self.doShow, 0, ("C", 1, 1), ("C", 1,
                                                                    2)))
        self.df = TartanDialog(self.opts["mf"],
                               tags=tag,
                               eflds=fld,
                               rows=(0, 16),
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)

    def doCmpCod(self, frt, pag, r, c, p, i, w):
        com = self.sql.getRec("scpcmp",
                              where=[("scp_cono", "=", self.opts["conum"]),
                                     ("scp_ccod", "=", w)],
                              limit=1)
        if not com:
            return "Invalid Competition Code"
        if not com[2]:
            return "Competiton Draw Not Yet Done"
        chk = self.sql.getRec("scpent",
                              cols=["count(*)"],
                              where=[("sce_cono", "=", self.opts["conum"]),
                                     ("sce_ccod", "=", w)],
                              limit=1)
        if not chk[0]:
            return "There are No Entries for this Competition"
        self.ccod = w
        self.name = com[self.sql.scpcmp_col.index("scp_name")]
        self.fmat = com[self.sql.scpcmp_col.index("scp_fmat")]
        self.nsec = com[self.sql.scpcmp_col.index("scp_nsec")]
        self.nent = com[self.sql.scpcmp_col.index("scp_nent")]
        self.ssub = com[self.sql.scpcmp_col.index("scp_subs")]
        self.squa = com[self.sql.scpcmp_col.index("scp_qual")]
        self.clup = com[self.sql.scpcmp_col.index("scp_clup")]
        self.mrnds = com[self.sql.scpcmp_col.index("scp_mrnds")]
        self.prnds = com[self.sql.scpcmp_col.index("scp_prnds")]
        self.state = com[self.sql.scpcmp_col.index("scp_state")]
        if not self.doimport:
            self.df.loadEntry(frt, pag, p + 1, data=self.name)
        self.byenum = 900000
        if self.state < 3:
            self.ctyp = "M"
            self.lrnd = self.mrnds
            if not self.doimport:
                self.df.loadEntry(frt, pag, p + 2, data=self.ctyp)
                return "sk2"
        elif self.state == 6:
            return "All Results Already Captured"
        else:
            self.ctyp = "P"
            self.lrnd = self.prnds
            if not self.doimport:
                self.df.loadEntry(frt, pag, p + 2, data=self.ctyp)

    def doCmpTyp(self, frt, pag, r, c, p, i, w):
        self.ctyp = w
        chk = self.sql.getRec(
            "scpgme",
            cols=["count(*)", "sum(scg_sfor)", "sum(scg_sagt)"],
            where=[("scg_cono", "=", self.opts["conum"]),
                   ("scg_ccod", "=", self.ccod), ("scg_ctyp", "=", "P")],
            limit=1)
        if self.ctyp == "M":
            if chk[0] and (chk[1] or chk[2]):
                return "Play-Offs Already Started"
            self.lrnd = self.mrnds
        elif not chk[0]:
            return "Play-Offs Draw Not Yet Done"
        else:
            self.lrnd = self.prnds

    def doRndNum(self, frt, pag, r, c, p, i, w):
        if self.ctyp == "M" and self.clup == "Y" and w > 1:
            more = self.sql.getRec("scpgme",
                                   cols=["count(*)"],
                                   where=[("scg_cono", "=",
                                           self.opts["conum"]),
                                          ("scg_ccod", "=", self.ccod),
                                          ("scg_rnum", "=", w - 1),
                                          ("scg_ocod", "=", 0)],
                                   limit=1)[0]
            if more:
                return "Closed-Up Draw, Round %s Results Missing" % (w - 1)
        if w > self.lrnd:
            return "Invalid Round, Exceeds Maximum (%s)" % self.lrnd
        if w > 1:
            chk = self.sql.getRec("scpgme",
                                  cols=[
                                      "scg_scod", "scg_ocod", "sum(scg_sfor)",
                                      "sum(scg_sagt)"
                                  ],
                                  where=[("scg_cono", "=", self.opts["conum"]),
                                         ("scg_ccod", "=", self.ccod),
                                         ("scg_ctyp", "=", self.ctyp),
                                         ("scg_rnum", "=", w - 1)])
            for s in chk:
                if s[0] < 900000 and s[1] < 900000 and not s[2] and not s[3]:
                    return "Invalid Round, Previous Round Missing"
            chk = self.sql.getRec("scpgme",
                                  where=[("scg_cono", "=", self.opts["conum"]),
                                         ("scg_ccod", "=", self.ccod),
                                         ("scg_ctyp", "=", self.ctyp),
                                         ("scg_rnum", "<", w),
                                         ("scg_scod", "<", 900000),
                                         ("scg_ocod", "<", 900000),
                                         ("(", "scg_sfor", "=", 0, "and",
                                          "scg_sagt", "=", 0, ")")])
            if chk:
                return "Previous Round Not Yet Completely Captured"
        chk = self.sql.getRec("scpgme",
                              cols=["sum(scg_sfor)", "sum(scg_sagt)"],
                              where=[("scg_cono", "=", self.opts["conum"]),
                                     ("scg_ccod", "=", self.ccod),
                                     ("scg_ctyp", "=", self.ctyp),
                                     ("scg_rnum", ">", w)],
                              limit=1)
        if chk[0] or chk[1]:
            return "Invalid Round, Later Rounds Captured"
        chk = self.sql.getRec("scpgme",
                              cols=["count(*)"],
                              where=[("scg_cono", "=", self.opts["conum"]),
                                     ("scg_ccod", "=", self.ccod),
                                     ("scg_ctyp", "=", self.ctyp),
                                     ("scg_rnum", "=", w),
                                     ("scg_scod", "<", 900000),
                                     ("scg_ocod", "<", 900000),
                                     ("scg_sfor", "=", 0),
                                     ("scg_sagt", "=", 0)])[0]
        if not chk:
            ok = askQuestion(self.opts["mf"].body,
                             "Already Entered",
                             """All Results for this Round Already Captured.

Would you Like to Recapture this Round?""",
                             default="no")
            if ok == "no":
                return "Already Captured"
            if self.fmat == "K" or self.ctyp == "R":
                if self.ctyp == "M" and w == self.mrnds:
                    self.sql.delRec("scpgme",
                                    where=[("scg_cono", "=",
                                            self.opts["conum"]),
                                           ("scg_ccod", "=", self.ccod),
                                           ("scg_ctyp", "=", "R")])
                else:
                    self.sql.delRec("scpgme",
                                    where=[("scg_cono", "=",
                                            self.opts["conum"]),
                                           ("scg_ccod", "=", self.ccod),
                                           ("scg_ctyp", "=", self.ctyp),
                                           ("scg_rnum", "=", w + 1)])
        self.rnum = w
        self.doimport = False

    def doImport(self):
        self.doimport = True
        if self.opts["test"]:
            self.ccod, self.rnum, impfle = self.opts["test"]
            err = self.doCmpCod("T", 0, 0, 0, 0, 0, self.ccod)
            if err:
                print(err)
                return
            self.doGetOldWin()
            impdlg = False
        else:
            impfle = None
            impdlg = True
            self.df.setWidget(self.df.mstFrame, state="hide")
        cols = [["scg_snum", 0, "UI", 2], ["scg_subs", 1, "UA", 1],
                ["scg_scod", 2, "UI", 6], ["scg_ocod", 3, "UI", 6],
                ["scg_sfor", 4, "UI", 2], ["scg_sagt", 5, "UI", 2]]
        fi = FileImport(self.opts["mf"],
                        impcol=cols,
                        impfle=impfle,
                        impdlg=impdlg)
        if fi.impdat:
            if not self.opts["test"]:
                sp = ProgressBar(self.opts["mf"].body,
                                 typ="Importing Results",
                                 mxs=len(fi.impdat))
            err = None
            for num, line in enumerate(fi.impdat):
                if not self.opts["test"]:
                    sp.displayProgress(num)
                if not line[0]:
                    continue
                whr = [("scg_cono", "=", self.opts["conum"]),
                       ("scg_ccod", "=", self.ccod),
                       ("scg_ctyp", "=", self.ctyp),
                       ("scg_snum", "=", line[0]), ("scg_subs", "=", line[1]),
                       ("scg_rnum", "=", self.rnum)]
                if self.clup == "Y":
                    self.newo = True
                    whr.append(("scg_scod", "in", (line[2], line[3])))
                else:
                    self.newo = False
                    whr.append(("scg_scod", "=", line[2]))
                    whr.append(("scg_ocod", "=", line[3]))
                chk = self.sql.getRec("scpgme", where=whr)
                if not chk:
                    err = "Invalid Skip %s, Opponent %s" % (line[2], line[3])
                    break
                if line[2] > 900000 or line[3] > 900000:
                    pass
                elif not line[4] and not line[5]:
                    err = "Zero Results"
                    break
                self.snum = line[0]
                self.subs = line[1]
                self.scod = line[2]
                self.ocod = line[3]
                self.sfor = line[4]
                self.sagt = line[5]
                self.doColEnd()
            if not self.opts["test"]:
                sp.closeProgress()
            if err:
                err = "Line %s: %s" % ((num + 1), err)
                showError(
                    self.opts["mf"].body, "Import Error", """%s

Please Correct your Import File and then Try Again.""" % err)
                self.opts["mf"].dbm.rollbackDbase()
            else:
                self.ierr = False
                if self.ssub == "Y":
                    secs = int(self.nsec / 2)
                else:
                    secs = self.nsec
                for self.snum in range(1, secs + 1):
                    if self.ssub == "Y":
                        for self.subs in ("A", "B"):
                            self.doColExit()
                            if self.ierr:
                                break
                        if self.ierr:
                            break
                    else:
                        self.subs = ""
                        self.doColExit()
                        if self.ierr:
                            break
                if not self.ierr:
                    self.opts["mf"].dbm.commitDbase()
        self.doTopExit()
        if not self.opts["test"]:
            self.df.setWidget(self.df.mstFrame, state="show")
            self.df.focusField("T", 0, 1)

    def doSecNum(self, frt, pag, r, c, p, i, w):
        chk = self.sql.getRec("scpgme",
                              where=[("scg_cono", "=", self.opts["conum"]),
                                     ("scg_ccod", "=", self.ccod),
                                     ("scg_ctyp", "=", self.ctyp),
                                     ("scg_snum", "=", w)],
                              limit=1)
        if not chk:
            return "Invalid Section Number"
        self.snum = w
        if self.ssub == "N" or self.ctyp == "P":
            self.subs = ""
            self.df.loadEntry(frt, pag, p + 1, data=self.subs)
            self.doLoadSkips()
            return "sk1"

    def doSubNum(self, frt, pag, r, c, p, i, w):
        self.subs = w
        self.doLoadSkips()

    def doTopEnd(self):
        if self.df.pag == 0:
            if self.ctyp == "P":
                self.snum = 1
                self.df.loadEntry("T", 1, 0, data=self.snum)
                self.subs = ""
                self.df.loadEntry("T", 1, 1, data=self.subs)
                self.doLoadSkips()
                self.df.focusField("C", 1, 1)
            else:
                self.doGetOldWin()
                self.df.focusField("T", 1, 1)
        else:
            self.df.focusField("C", 1, 1)

    def doLoadSkips(self):
        col = ["scg_scod", "scg_ocod", "scg_sfor", "scg_sagt"]
        whr = [("scg_cono", "=", self.opts["conum"]),
               ("scg_ccod", "=", self.ccod), ("scg_ctyp", "=", self.ctyp),
               ("scg_rnum", "=", self.rnum), ("scg_snum", "=", self.snum),
               ("scg_subs", "=", self.subs), ("scg_ocod", "<", 900000)]
        data = []
        recs = self.sql.getRec("scpgme", cols=col, where=whr)
        for rec in recs:
            data.append((rec[0], self.getName(rec[0]), rec[1],
                         self.getName(rec[1]), rec[2], rec[3]))
        self.skp["where"] = data

    def doTopExit(self):
        if not self.opts["test"] and self.df.pag == 0:
            self.df.closeProcess()
            self.opts["mf"].closeLoop()
        else:
            # Check all entries for round
            chk = self.sql.getRec("scpgme",
                                  cols=["count(*)"],
                                  where=[("scg_cono", "=", self.opts["conum"]),
                                         ("scg_ccod", "=", self.ccod),
                                         ("scg_ctyp", "=", self.ctyp),
                                         ("scg_rnum", "=", self.rnum),
                                         ("scg_scod", "<", 900000),
                                         ("scg_ocod", "<", 900000),
                                         ("scg_sfor", "=", 0),
                                         ("scg_sagt", "=", 0)],
                                  limit=1)[0]
            if chk:
                txt = "Not All the Results for Round %s Captured" % self.rnum
                if self.opts["test"]:
                    self.opts["mf"].dbm.rollbackDbase()
                    return
                txt = "%s\n\nDo You want to Exit and Lose All Results for "\
                    "this Round?" % txt
                ok = askQuestion(self.opts["mf"].body,
                                 "Missing Results",
                                 txt,
                                 default="no")
                if ok == "yes":
                    self.opts["mf"].dbm.rollbackDbase()
                    self.df.focusField("T", 0, 4)
                else:
                    self.df.focusField("T", 1, 1)
                return
            if self.rnum == self.lrnd:
                chk = self.sql.getRec("scpgme",
                                      cols=["count(*)"],
                                      where=[("scg_cono", "=",
                                              self.opts["conum"]),
                                             ("scg_ccod", "=", self.ccod),
                                             ("scg_ctyp", "=", "M"),
                                             ("scg_scod", "<", 900000),
                                             ("scg_ocod", "<", 900000),
                                             ("scg_sfor", "=", 0),
                                             ("scg_sagt", "=", 0)],
                                      limit=1)[0]
                if not chk:
                    # Update scpcmp if no missing entries
                    self.sql.updRec("scpcmp",
                                    cols=["scp_state"],
                                    data=[3],
                                    where=[("scp_cono", "=",
                                            self.opts["conum"]),
                                           ("scp_ccod", "=", self.ccod)])
                    self.opts["mf"].dbm.commitDbase()
            if not self.doimport:
                if self.ctyp == "P":
                    self.df.focusField("T", 0, 4)
                else:
                    self.df.focusField("T", 0, 1)

    def doSkpCod(self, frt, pag, r, c, p, i, w):
        skp = self.sql.getRec("scpgme",
                              where=[("scg_cono", "=", self.opts["conum"]),
                                     ("scg_ccod", "=", self.ccod),
                                     ("scg_ctyp", "=", self.ctyp),
                                     ("scg_snum", "=", self.snum),
                                     ("scg_subs", "=", self.subs),
                                     ("scg_rnum", "=", self.rnum),
                                     ("scg_scod", "=", w)],
                              limit=1)
        if not skp:
            return "Invalid Skip"
        if skp[self.sql.scpgme_col.index("scg_ocod")] > 900000:
            return "Skip has a Bye"
        if i == 3:
            if w == self.scod:
                return "Playing Against Himself?"
            if skp[self.sql.scpgme_col.index("scg_ocod")]:
                return "Already Paired"
            self.ocod = w
            onam = self.getName(self.ocod)
            self.df.loadEntry("C", 1, p + 1, data=onam)
            self.df.loadEntry("C", 1, p + 2, data=0)
            return
        self.scod = w
        snam = self.getName(w)
        self.df.loadEntry("C", 1, p + 1, data=snam)
        sfor = skp[self.sql.scpgme_col.index("scg_sfor")]
        self.df.loadEntry("C", 1, p + 2, data=sfor)
        self.ocod = skp[self.sql.scpgme_col.index("scg_ocod")]
        if self.ocod:
            self.newo = False
            self.df.loadEntry("C", 1, p + 3, data=self.ocod)
            onam = self.getName(self.ocod)
            self.df.loadEntry("C", 1, p + 4, data=onam)
            ofor = skp[self.sql.scpgme_col.index("scg_sagt")]
            self.df.loadEntry("C", 1, p + 5, data=ofor)
        else:
            self.newo = True

    def getName(self, code):
        if code > 900000:
            return "Bye"
        nam = self.sql.getRec("scpmem",
                              cols=["scm_surname", "scm_names"],
                              where=[("scm_cono", "=", self.opts["conum"]),
                                     ("scm_scod", "=", code)],
                              limit=1)
        return "%s, %s" % (nam[0], nam[1][0])

    def doShots(self, frt, pag, r, c, p, i, w):
        if i == 2:
            self.sfor = w
            if not self.newo:
                return "sk2"
        else:
            self.sagt = w

    def doPoints(self, frt, pag, r, c, p, i, w):
        pass

    def doColEnd(self):
        if self.fmat == "K":
            if self.newo:
                self.sql.delRec("scpgme",
                                where=[("scg_cono", "=", self.opts["conum"]),
                                       ("scg_ccod", "=", self.ccod),
                                       ("scg_ctyp", "=", self.ctyp),
                                       ("scg_snum", "=", self.snum),
                                       ("scg_subs", "=", self.subs),
                                       ("scg_rnum", "=", self.rnum),
                                       ("scg_scod", "=", self.ocod)])
                cols = ["scg_ocod"]
                data = [self.ocod]
            else:
                cols = []
                data = []
            if self.clup == "Y":
                cols.extend(["scg_sfor", "scg_sagt", "scg_pair"])
                self.pair += 1
                data.extend([self.sfor, self.sagt, self.pair])
            else:
                cols.extend(["scg_sfor", "scg_sagt"])
                data.extend([self.sfor, self.sagt])
            self.sql.updRec("scpgme",
                            cols=cols,
                            data=data,
                            where=[("scg_cono", "=", self.opts["conum"]),
                                   ("scg_ccod", "=", self.ccod),
                                   ("scg_ctyp", "=", self.ctyp),
                                   ("scg_snum", "=", self.snum),
                                   ("scg_subs", "=", self.subs),
                                   ("scg_rnum", "=", self.rnum),
                                   ("scg_scod", "=", self.scod)])
        else:
            if self.sfor == self.sagt:
                pfor = .5
                pagt = .5
            elif self.sfor > self.sagt:
                pfor = 1
                pagt = 0
            else:
                pfor = 0
                pagt = 1
            self.sql.updRec("scpgme",
                            cols=["scg_sfor", "scg_sagt", "scg_pnts"],
                            data=[self.sfor, self.sagt, pfor],
                            where=[("scg_cono", "=", self.opts["conum"]),
                                   ("scg_ccod", "=", self.ccod),
                                   ("scg_ctyp", "=", self.ctyp),
                                   ("scg_snum", "=", self.snum),
                                   ("scg_subs", "=", self.subs),
                                   ("scg_rnum", "=", self.rnum),
                                   ("scg_scod", "=", self.scod)])
            self.sql.updRec("scpgme",
                            cols=["scg_sfor", "scg_sagt", "scg_pnts"],
                            data=[self.sagt, self.sfor, pagt],
                            where=[("scg_cono", "=", self.opts["conum"]),
                                   ("scg_ccod", "=", self.ccod),
                                   ("scg_ctyp", "=", self.ctyp),
                                   ("scg_snum", "=", self.snum),
                                   ("scg_subs", "=", self.subs),
                                   ("scg_rnum", "=", self.rnum),
                                   ("scg_scod", "=", self.ocod)])
        self.scod = 0
        if not self.doimport:
            self.doLoadSkips()
            self.df.advanceLine(1)

    def doShow(self):
        cols = (("scod", "Skip", 6, "UI",
                 "N"), ("sname", "Name", 30, "NA",
                        "N"), ("sfor", "Shots", 5, "UI", "N"), ("ocod", "Oppt",
                                                                6, "UI", "N"),
                ("oname", "Name", 30, "NA", "N"), ("sagt", "Shots", 5, "UI",
                                                   "N"))
        recs = self.sql.getRec("scpgme",
                               where=[("scg_cono", "=", self.opts["conum"]),
                                      ("scg_ccod", "=", self.ccod),
                                      ("scg_ctyp", "=", self.ctyp),
                                      ("scg_snum", "=", self.snum),
                                      ("scg_subs", "=", self.subs),
                                      ("scg_rnum", "=", self.rnum)])
        done = []
        data = []
        for rec in recs:
            scod = rec[self.sql.scpgme_col.index("scg_scod")]
            ocod = rec[self.sql.scpgme_col.index("scg_ocod")]
            if scod in done or scod > 900000 or ocod in done or ocod > 900000:
                continue
            sfor = rec[self.sql.scpgme_col.index("scg_sfor")]
            sagt = rec[self.sql.scpgme_col.index("scg_sagt")]
            data.append((scod, self.getName(scod), sfor, ocod,
                         self.getName(ocod), sagt))
        SelectChoice(self.opts["mf"].window, "Results", cols, data)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doColExit(self):
        chk = self.sql.getRec("scpgme",
                              cols=["count(*)"],
                              where=[("scg_cono", "=", self.opts["conum"]),
                                     ("scg_ccod", "=", self.ccod),
                                     ("scg_ctyp", "=", self.ctyp),
                                     ("scg_rnum", "=", self.rnum),
                                     ("scg_snum", "=", self.snum),
                                     ("scg_subs", "=", self.subs),
                                     ("scg_scod", "<", 900000),
                                     ("scg_ocod", "<", 900000),
                                     ("(", "scg_sfor", "=", 0, "and",
                                      "scg_sagt", "=", 0, ")")],
                              limit=1)
        if chk[0] and (self.clup == "N" or self.ctyp == "P" or \
                            (self.clup == "Y" and self.rnum > 1)):
            # All results for section not yet entered
            if self.doimport:
                showError(self.opts["mf"].body, "Missing Results",
                    "Some Results are Missing, Please Check Import "\
                    "File and Retry")
                self.opts["mf"].dbm.rollbackDbase()
                self.ierr = True
                return
            ok = askQuestion(self.opts["mf"].body, "Missing Results",
                "Some Result are Missing. Do You want to Exit and Lose "\
                "the Results for this Section?")
            if ok == "no":
                self.df.focusField(self.df.frt, self.df.pag, self.df.col)
                return
            self.opts["mf"].dbm.rollbackDbase()
        else:
            chk = self.doUpdateTables()
            if not self.doimport:
                if chk == "continue":
                    self.df.focusField(self.df.frt, self.df.pag, self.df.col)
                    return
                if chk == "abort":
                    self.opts["mf"].dbm.rollbackDbase()
                else:
                    self.opts["mf"].dbm.commitDbase()
        if not self.doimport:
            self.df.clearFrame("T", 1)
            self.df.clearFrame("C", 1)
            if self.ctyp == "P":
                self.df.focusField("T", 0, 4)
            else:
                self.df.focusField("T", 1, 1)

    def doUpdateTables(self):
        nrnd = self.rnum + 1
        if self.fmat == "K" and self.clup == "Y" and self.ctyp == "M":
            # Closed up draw (1st and maybe 2nd Round)
            skps = self.sql.getRec("scpgme",
                                   where=[("scg_cono", "=",
                                           self.opts["conum"]),
                                          ("scg_ccod", "=", self.ccod),
                                          ("scg_ctyp", "=", self.ctyp),
                                          ("scg_snum", "=", self.snum),
                                          ("scg_subs", "=", self.subs),
                                          ("scg_rnum", "=", self.rnum)])
            byes = []
            nums = {}
            for skp in skps:
                scod = skp[self.sql.scpgme_col.index("scg_scod")]
                ocod = skp[self.sql.scpgme_col.index("scg_ocod")]
                if not ocod:
                    byes.append(scod)
                nums[scod] = skp
            for skp in byes:
                if self.opts["test"]:
                    ok = "B"
                else:
                    ok = askChoice(self.opts["mf"].body, "Capture Error",
                        "The Results for Skip %s - %s is Missing. Did he/she "\
                        "Withdraw or have a Bye?" % (skp, self.getName(skp)),
                        butt=(("No", "N"), ("Withdraw", "W"), ("Bye", "B"),
                        ("Abort", "A")), default="Bye")
                if ok == "N":
                    return "continue"
                if ok == "A":
                    return "abort"
                if ok == "W":
                    self.sql.delRec("scpgme",
                                    where=[("scg_cono", "=",
                                            self.opts["conum"]),
                                           ("scg_ccod", "=", self.ccod),
                                           ("scg_scod", "=", skp)])
                    byes.remove(skp)
                    del nums[skp]
                    continue
            for scod in nums:
                rec = nums[scod]
                scod = rec[self.sql.scpgme_col.index("scg_scod")]
                ocod = rec[self.sql.scpgme_col.index("scg_ocod")]
                sfor = rec[self.sql.scpgme_col.index("scg_sfor")]
                sagt = rec[self.sql.scpgme_col.index("scg_sagt")]
                where = [("scg_cono", "=", self.opts["conum"]),
                         ("scg_ccod", "=", self.ccod),
                         ("scg_ctyp", "=", self.ctyp),
                         ("scg_snum", "=", self.snum),
                         ("scg_subs", "=", self.subs), ("scg_rnum", "=", nrnd),
                         ("scg_scod", "=", scod)]
                if scod in byes:
                    self.byenum += 1
                    # Create bye
                    self.sql.updRec("scpgme",
                                    cols=["scg_ocod"],
                                    data=[self.byenum],
                                    where=where)
                if nrnd < self.lrnd:
                    # Create next round record
                    rec[self.sql.scpgme_col.index("scg_rnum")] = nrnd
                    rec[self.sql.scpgme_col.index("scg_ocod")] = 0
                    rec[self.sql.scpgme_col.index("scg_sfor")] = 0
                    rec[self.sql.scpgme_col.index("scg_sagt")] = 0
                    rec[self.sql.scpgme_col.index("scg_seed")] = 0
                    rec[self.sql.scpgme_col.index("scg_pair")] = 0
                    if scod not in byes and sfor < sagt and ocod:
                        scod = ocod
                        rec[self.sql.scpgme_col.index("scg_scod")] = scod
                    chk = self.sql.getRec("scpgme", where=where, limit=1)
                    if not chk:
                        self.sql.insRec("scpgme", data=rec)
                    else:
                        self.sql.updRec("scpgme", data=rec, where=where)
                else:
                    # Update playoff records
                    cod = self.snum + 700000
                    if sfor > sagt:
                        win = scod
                    else:
                        win = ocod
                    whr = where[:6]
                    whr[2] = ("scg_ctyp", "=", "P")
                    whr[3] = ("scg_snum", "=", 1)
                    whr[5] = ("scg_rnum", "=", 1)
                    whr.append(("scg_scod", "=", cod))
                    self.sql.updRec("scpgme",
                                    cols=["scg_scod"],
                                    data=[win],
                                    where=whr)
                    whr[6] = ("scg_ocod", "=", cod)
                    self.sql.updRec("scpgme",
                                    cols=["scg_ocod"],
                                    data=[win],
                                    where=whr)
        if (self.fmat == "K" and self.clup == "N") or self.ctyp == "P":
            recs = self.sql.getRec("scpgme",
                                   where=[("scg_cono", "=",
                                           self.opts["conum"]),
                                          ("scg_ccod", "=", self.ccod),
                                          ("scg_ctyp", "=", self.ctyp),
                                          ("scg_snum", "=", self.snum),
                                          ("scg_rnum", "=", self.rnum)],
                                   order="scg_group, scg_pair")
            group = 0
            for num in range(0, len(recs), 2):
                one = recs[num]
                snum = one[self.sql.scpgme_col.index("scg_snum")]
                subs = one[self.sql.scpgme_col.index("scg_subs")]
                if group != one[self.sql.scpgme_col.index("scg_group")]:
                    group = one[self.sql.scpgme_col.index("scg_group")]
                    pair = 1
                else:
                    pair += 1
                cod1 = one[self.sql.scpgme_col.index("scg_scod")]
                opp1 = one[self.sql.scpgme_col.index("scg_ocod")]
                for1 = one[self.sql.scpgme_col.index("scg_sfor")]
                agt1 = one[self.sql.scpgme_col.index("scg_sagt")]
                if opp1 > 900000 or for1 > agt1:
                    win1 = cod1
                else:
                    win1 = opp1
                if len(recs[num:]) > 1:
                    two = recs[num + 1]
                    cod2 = two[self.sql.scpgme_col.index("scg_scod")]
                    opp2 = two[self.sql.scpgme_col.index("scg_ocod")]
                    for2 = two[self.sql.scpgme_col.index("scg_sfor")]
                    agt2 = two[self.sql.scpgme_col.index("scg_sagt")]
                    if opp2 > 900000 or for2 > agt2:
                        win2 = cod2
                    else:
                        win2 = opp2
                else:
                    win2 = 0
                # Create next round record
                sgc = self.sql.scpgme_col
                whr = [("scg_cono", "=", one[sgc.index("scg_cono")]),
                       ("scg_ccod", "=", one[sgc.index("scg_ccod")]),
                       ("scg_ctyp", "=", one[sgc.index("scg_ctyp")]),
                       ("scg_snum", "=", one[sgc.index("scg_snum")]),
                       ("scg_subs", "=", one[sgc.index("scg_subs")]),
                       ("scg_rnum", "=", nrnd),
                       ("scg_ktyp", "=", one[sgc.index("scg_ktyp")]),
                       ("scg_scod", "=", win1)]
                one[sgc.index("scg_rnum")] = nrnd
                one[sgc.index("scg_scod")] = win1
                one[sgc.index("scg_ocod")] = win2
                one[sgc.index("scg_sfor")] = 0
                one[sgc.index("scg_sagt")] = 0
                one[sgc.index("scg_pnts")] = 0
                one[sgc.index("scg_pair")] = pair
                if not self.sql.getRec("scpgme", where=whr, limit=1):
                    self.sql.insRec("scpgme", data=one)
                else:
                    self.sql.updRec("scpgme",
                                    cols=["scg_ocod", "scg_pair"],
                                    data=[win2, pair],
                                    where=whr)
                if self.rnum == self.lrnd and \
                        self.ctyp == "M" and self.nsec > 2:
                    # Create playoff records with winners codes
                    if not self.oldwin:
                        if subs == "B":
                            key = snum + 800000
                        else:
                            key = snum + 700000
                    else:
                        key = self.oldwin[snum]
                    self.sql.updRec("scpgme",
                                    cols=["scg_scod"],
                                    data=[win1],
                                    where=[("scg_cono", "=",
                                            self.opts["conum"]),
                                           ("scg_ccod", "=", self.ccod),
                                           ("scg_ctyp", "=", "P"),
                                           ("scg_rnum", "=", 1),
                                           ("scg_scod", "=", key)])
                    self.sql.updRec("scpgme",
                                    cols=["scg_ocod"],
                                    data=[win1],
                                    where=[("scg_cono", "=",
                                            self.opts["conum"]),
                                           ("scg_ccod", "=", self.ccod),
                                           ("scg_ctyp", "=", "P"),
                                           ("scg_rnum", "=", 1),
                                           ("scg_ocod", "=", key)])
        elif self.squa == "S" and self.rnum == self.lrnd:
            # Update playoff records with winners codes
            if self.ssub == "Y":
                lsub = "B"
            else:
                lsub = ""
            whr = [("scg_cono", "=", self.opts["conum"]),
                   ("scg_ccod", "=", self.ccod), ("scg_ctyp", "=", self.ctyp),
                   ("scg_snum", "=", self.snum), ("scg_subs", "=", self.subs)]
            if self.fmat == "K":
                col = ["scg_scod", "scg_ocod", "scg_sfor", "scg_sagt"]
                whr.append(("scg_rnum", "=", self.lrnd))
                rec = self.sql.getRec("scpgme", cols=col, where=whr, limit=1)
                if rec[2] > rec[3]:
                    win = rec[0]
                else:
                    win = rec[1]
            else:
                self.doGetNewWin(sect=self.snum, sub=self.subs)
                win = self.newwin[self.snum]
            if not self.oldwin:
                if self.subs == "B":
                    key = self.snum + 800000
                else:
                    key = self.snum + 700000
            else:
                key = self.oldwin[self.snum]
            self.sql.updRec("scpgme",
                            cols=["scg_scod"],
                            data=[win],
                            where=[("scg_cono", "=", self.opts["conum"]),
                                   ("scg_ccod", "=", self.ccod),
                                   ("scg_ctyp", "=", "P"),
                                   ("scg_rnum", "=", 1),
                                   ("scg_scod", "=", key)])
            self.sql.updRec("scpgme",
                            cols=["scg_ocod"],
                            data=[win],
                            where=[("scg_cono", "=", self.opts["conum"]),
                                   ("scg_ccod", "=", self.ccod),
                                   ("scg_ctyp", "=", "P"),
                                   ("scg_rnum", "=", 1),
                                   ("scg_ocod", "=", key)])
            if self.snum == self.nsec and self.subs == lsub:
                self.sql.updRec("scpgme",
                                cols=["scg_ktyp"],
                                data=["M"],
                                where=[("scg_cono", "=", self.opts["conum"]),
                                       ("scg_ccod", "=", self.ccod),
                                       ("scg_ctyp", "=", "P")])
        # Check if all results for the round are captured
        chek = self.sql.getRec("scpgme",
                               cols=["count(*)"],
                               where=[("scg_cono", "=", self.opts["conum"]),
                                      ("scg_ccod", "=", self.ccod),
                                      ("scg_ctyp", "=", self.ctyp),
                                      ("scg_rnum", "=", self.rnum),
                                      ("scg_scod", "<", 900000),
                                      ("scg_ocod", "<", 900000),
                                      ("scg_sfor", "=", 0),
                                      ("scg_sagt", "=", 0)],
                               limit=1)
        if chek[0]:
            return
        if self.clup == "Y" and self.ctyp == "M" and nrnd == self.lrnd:
            state = 3
        elif self.rnum == self.lrnd:
            if self.ctyp == "M":
                state = 3
            else:
                state = 6
        elif self.ctyp == "M":
            state = 2
        else:
            state = 5
        self.sql.updRec("scpcmp",
                        cols=["scp_state"],
                        data=[state],
                        where=[("scp_cono", "=", self.opts["conum"]),
                               ("scp_ccod", "=", self.ccod)])

    def doGetOldWin(self):
        self.oldwin = {}
        if self.ctyp == "M" and self.rnum == self.lrnd:
            recs = self.sql.getRec("scpgme",
                                   cols=["scg_scod", "scg_ocod"],
                                   where=[("scg_cono", "=",
                                           self.opts["conum"]),
                                          ("scg_ccod", "=", self.ccod),
                                          ("scg_ctyp", "=", "P"),
                                          ("scg_snum", "=", 1)])
            for rec in recs:
                for cod in rec:
                    if cod < 900000:
                        sec = self.sql.getRec("scpgme",
                                              cols=["scg_snum"],
                                              where=[("scg_cono", "=",
                                                      self.opts["conum"]),
                                                     ("scg_ccod", "=",
                                                      self.ccod),
                                                     ("scg_ctyp", "=", "M"),
                                                     ("scg_scod", "=", cod)],
                                              limit=1)
                        if sec:
                            self.oldwin[sec[0]] = cod

    def doGetNewWin(self, sect=None, sub=""):
        # Get Leaders
        self.newwin = {}
        if sect is None:
            secs = []
            for x in range(self.nsec):
                secs.append(x + 1)
        else:
            secs = [sect]
        for sec in secs:
            col = [
                "scg_scod", "sum(scg_pnts) as a",
                "sum(scg_sfor - scg_sagt) as b",
                "round(sum(scg_sfor) / sum(scg_sagt), 2) as c"
            ]
            whr = [("scg_cono", "=", self.opts["conum"]),
                   ("scg_ccod", "=", self.ccod), ("scg_ctyp", "=", "M"),
                   ("scg_snum", "=", sec), ("scg_subs", "=", sub)]
            grp = "scg_scod"
            odr = "a desc, b desc, c desc"
            rec = self.sql.getRec("scpgme",
                                  cols=col,
                                  where=whr,
                                  group=grp,
                                  order=odr,
                                  limit=1)
            self.newwin[sec] = rec[0]
Пример #27
0
class dr2020(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        # Check for Valid Posting Routine
        if self.opts["rtn"] != 2:
            mes = "Invalid Routine %s" % str(self.opts["rtn"])
            showError(self.opts["mf"].body, "Control Error", mes)
            return
        # Setup SQL Object
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlmst", "ctlvmf", "drschn", "drsmst", "drstrn", "genint",
            "genmst", "gentrn"
        ],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        # Check for Intercompany Facility
        if not self.sql.getRec("ctlmst",
                               cols=["count(*)"],
                               where=[("ctm_cono", "<>", self.opts["conum"])],
                               limit=1)[0]:
            self.incoac = False
        else:
            itg = self.sql.getRec("genint",
                                  cols=["cti_inco"],
                                  where=[("cti_cono", "=", self.opts["conum"])
                                         ])
            if itg:
                self.incoac = [self.opts["conum"]]
                [self.incoac.append(coy[0]) for coy in itg]
            else:
                self.incoac = False
        #
        self.gc = GetCtl(self.opts["mf"])
        drsctl = self.gc.getCtl("drsctl", self.opts["conum"])
        if not drsctl:
            return
        self.glint = drsctl["ctd_glint"]
        self.chains = drsctl["ctd_chain"]
        if self.glint == "Y":
            ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = ["drs_ctl", "vat_ctl", "dis_all"]
            if self.gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.drsctl = ctlctl["drs_ctl"]
            self.dis_all = ctlctl["dis_all"]
        self.batchHeader()
        if not self.bh.batno:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.allcoy = self.opts["conum"]
        ctlmst = self.gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        self.taxdf = ctlmst["ctm_taxdf"]
        if self.chains == "N":
            self.chain = 0
        self.glt = 6
        self.agevar = tk.BooleanVar()
        self.agevar.set(False)
        return True

    def batchHeader(self):
        self.bh = Batches(self.opts["mf"],
                          self.opts["conum"],
                          self.opts["conam"],
                          self.opts["period"],
                          "DRS",
                          self.opts["rtn"],
                          glint=self.glint)
        self.bh.doBatchHeader()
        if not self.bh.batno:
            return
        self.bh.batval = float(ASD(0) - ASD(self.bh.batval))

    def drawDialog(self):
        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)]
        drm["where"].append(("drm_stat", "<>", "X"))
        coy = {
            "stype": "R",
            "tables": ("ctlmst", ),
            "cols":
            (("ctm_cono", "", 0, "Coy"), ("ctm_name", "", 0, "Name", "Y"))
        }
        viw = {
            "stype":
            "R",
            "tables": ("drstrn", ),
            "cols": (("drt_chain", "", 0, ""), ("drt_acno", "", 0, ""),
                     ("drt_ref1", "", 0, ""), ("drt_trdt", "", 0, ""),
                     ("drt_tramt", "", 0, ""), ("drt_taxamt", "", 0, "")),
            "where": [("drt_cono", "=", self.opts["conum"]),
                      ("drt_type", "=", self.opts["rtn"]),
                      ("drt_batch", "=", self.bh.batno)],
            "order":
            "drt_seq"
        }
        tag = (("Deposit", None, None, None, False), ("Allocation", None, None,
                                                      None, False))
        fld = [(("T", 0, 0, 0), "OUI", 9, "Batch %s Quantity" % self.bh.batno),
               (("T", 0, 0, 0), "OSD", 13.2, "Value"),
               (("C", 1, 0, 0), "INa", 9, "Reference", "Reference Number One",
                "i", "Y", self.doRef1, None, None, ("efld", )),
               (("C", 1, 0, 1), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 2), "ISD", 13.2, "Amount", "Transaction Amount",
                "", "N", self.doTrnAmt, None, None, ("notzero", )),
               (("C", 1, 0, 3), "INA", (30), "Details", "Deposit Details", "",
                "N", self.doTrnDet, None, None, None),
               (("T", 2, 0, 0), "OSD", 13.2, "Unallocated Balance"),
               [("C", 2, 0, 0), "OUI", 3, "Coy", "Company Number",
                self.opts["conum"], "N", self.doCoyNum, coy, None,
                ("notzero", )],
               [("C", 2, 0, 1), "IUI", 3, "Chn", "Chain Store", "r", "N",
                self.doChain, drc, None, ("efld", )],
               (("C", 2, 0, 2), "INA", 7, "Acc-Num", "Account Number", "r",
                "N", self.doDrsAcc, drm, None, ("notblank", )),
               (("C", 2, 0, 3), "ONA", 30, "Name"),
               (("C", 2, 0, 4), "ISD", 13.2, "Receipt", "Receipt Amount", "",
                "N", self.doAllAmt, None, None, ("efld", )),
               (("C", 2, 0, 5), "ISD", 13.2, "Discount", "Discount Amount", "",
                "N", self.doDisAmt, None, None, ("efld", ), None,
                "Discount Amount to be Added to the Receipt Amount"),
               (("C", 2, 0, 6), "OSD", 13.2, "Total-Amount")]
        if self.glint == "Y" and self.incoac:
            fld[7][1] = "IUI"
        if self.chains == "N":
            fld[8][1] = "OUI"
            but = [("View Entries", viw, None, 1, ("C", 2, 3), ("C", 2, 4),
                    "View Batch Transactions", 1),
                   ("Interrogate", None, self.queryDrs, 0, ("C", 2, 3),
                    ("C", 2, 0), "Interrogate Debtors Accounts", 1),
                   ("Maintain", None, self.maintainDrs, 0, ("C", 2, 3),
                    ("C", 2, 4), "Maintain Debtors Accounts", 1),
                   ("Canc_el", None, self.doCancel, 0, ("C", 2, 1),
                    ("C", 1, 1), "", 1)]
        else:
            but = [("View Entries", viw, None, 0, ("C", 2, 3), ("C", 2, 4),
                    "View Batch Transactions", 1),
                   ("Interrogate", None, self.queryDrs, 0, ("C", 2, 2),
                    ("C", 2, 0), "Interrogate Debtors Accounts", 1),
                   ("Maintain", None, self.maintainDrs, 0, ("C", 2, 2),
                    ("C", 2, 3), "Maintain Debtors Accounts", 1),
                   ("Canc_el", None, self.doCancel, 0, ("C", 2, 1),
                    ("C", 1, 1), "", 1)]
        but.extend((
                ("Age _Normal",None,self.doAgeNormal,0,None,None,
                    "Only Show Unallocated Transactions",2),
                ("Age _History",None,self.doAgeHistory,0,None,None,
                    "Show All Transactions, Including Already Allocated",2),
                ("Age _Automatic",None,self.doAgeAuto,0,None,None,
                    "Automatically Allocate the Amount Starting With the "\
                    "Oldest Unallocated One",2),
                ("Age _Current",None,self.doAgeCurrent,0,None,None,
                    "Leave the Transaction Unallocated",2)))
        txt = (None, None, None)
        cnd = [None, (self.endPage1, "y"), (self.endPage2, "y")]
        cxt = [None, self.exitPage1, self.exitPage2]
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tags=tag,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)
        self.df.focusField("C", 1, 1)

    def doRef1(self, frt, pag, r, c, p, i, w):
        if not w:
            trns = self.sql.getRec("drstrn",
                                   cols=["drt_ref1"],
                                   where=[("drt_cono", "=",
                                           self.opts["conum"]),
                                          ("drt_ref1", "like", "R________")],
                                   order="drt_ref1 desc")
            auto = False
            for trn in trns:
                try:
                    w = "R%08i" % (int(trn[0][1:]) + 1)
                    auto = True
                    break
                except:
                    pass
            if not auto:
                w = "R00000001"
            self.df.loadEntry(frt, pag, p, data=w)
        chk = self.sql.getRec("drstrn",
                              cols=["drt_acno"],
                              where=[("drt_cono", "=", self.opts["conum"]),
                                     ("drt_type", "=", self.opts["rtn"]),
                                     ("drt_ref1", "=", w)])
        if chk:
            return "A Transaction with this Reference Already Exists"
        self.ref1 = w

    def doTrnDat(self, frt, pag, r, c, p, i, w):
        if w < self.opts["period"][1][0] or w > self.opts["period"][2][0]:
            return "Invalid Date, Not in Financial Period"
        if self.bh.multi == "N" and int(w / 100) > self.bh.curdt:
            return "Invalid Date, After Batch Period"
        self.trndat = w

    def doTrnAmt(self, frt, pag, r, c, p, i, w):
        self.trnamt = w

    def doTrnDet(self, frt, pag, r, c, p, i, w):
        self.trndet = w
        self.allocated = float(0.00)

    def endPage1(self):
        self.agecan = False
        self.batupd = False
        self.updateTables1()
        self.updateBatch()
        self.allocated = float(0.0)
        self.df.selPage("Allocation")
        self.df.loadEntry("T", 2, 0, data=self.trnamt)
        self.df.focusField("C", 2, 1)

    def updateTables1(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trndat / 100)
        else:
            self.curdt = self.bh.curdt
        if self.glint == "Y":
            # General Ledger Control Transaction (Bank)
            data = (self.opts["conum"], self.bh.acc, self.curdt, self.trndat,
                    self.glt, self.ref1, self.bh.batno, self.trnamt, 0.00,
                    self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)

    def exitPage1(self):
        self.df.closeProcess()
        self.bh.doBatchTotal()
        self.opts["mf"].closeLoop()

    def doCoyNum(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("ctlmst",
                              cols=["ctm_name"],
                              where=[("ctm_cono", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Company, Missing"
        if self.incoac and w not in self.incoac:
            return "Invalid Company, No Intercompany Record 1"
        if w != self.opts["conum"]:
            acc = self.sql.getRec("genint",
                                  where=[("cti_cono", "=", w),
                                         ("cti_inco", "=", self.opts["conum"])
                                         ],
                                  limit=1)
            if not acc:
                return "Invalid Company, No Intercompany Record 2"
        self.allcoy = w

    def doChain(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drschn",
                                  cols=["chm_chain"],
                                  where=[("chm_cono", "=", self.allcoy),
                                         ("chm_chain", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Chain Store"
        self.chain = w

    def doDrsAcc(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("drsmst",
                              cols=["drm_name", "drm_stat"],
                              where=[("drm_cono", "=", self.allcoy),
                                     ("drm_chain", "=", self.chain),
                                     ("drm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        if acc[1] == "X":
            return "Invalid Account, Redundant"
        self.dracno = w
        self.name = acc[0]
        self.df.loadEntry("C", pag, p + 1, data=self.name)
        self.allref = self.ref1
        while self.sql.getRec("drstrn",
                              cols=["drt_batch"],
                              where=[("drt_cono", "=", self.allcoy),
                                     ("drt_chain", "=", self.chain),
                                     ("drt_acno", "=", self.dracno),
                                     ("drt_type", "=", self.opts["rtn"]),
                                     ("drt_ref1", "=", self.allref)]):
            self.doGetAnotherRef()

    def doGetAnotherRef(self):
        tit = ("Duplicate Reference Number", )
        fld = ((("T", 0, 0, 0), "ONa", 9, "Old Reference", "", self.allref,
                "N", None, None, None, None),
               (("T", 0, 1, 0), "INa", 9, "New Reference", "", "", "N",
                self.doRefNew, None, None, ("notblank", )))
        tnd = ((self.doRefEnd, "n"), )
        txt = (self.doRefExit, )
        state = self.df.disableButtonsTags()
        self.tf = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=tnd,
                               txit=txt)
        self.tf.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)

    def doRefExit(self):
        self.tf.focusField("T", 0, 2)

    def doRefNew(self, frt, pag, r, c, p, i, w):
        self.allref = w

    def doRefEnd(self):
        self.tf.closeProcess()

    def doAllAmt(self, frt, pag, r, c, p, i, w):
        if w == 0:
            self.allamt = float(ASD(self.trnamt) - ASD(self.allocated))
            self.df.loadEntry(frt, pag, p, data=self.allamt)
        else:
            self.allamt = w

    def doDisAmt(self, frt, pag, r, c, p, i, w):
        if self.allamt < 0 and w > 0:
            ok = self.checkSign()
        elif self.allamt > 0 and w < 0:
            ok = self.checkSign()
        else:
            ok = "yes"
        if ok != "yes":
            return "Invalid Discount Amount (Sign Error)"
        self.disamt = w
        totamt = float(ASD(self.allamt) + ASD(self.disamt))
        self.df.loadEntry(frt, pag, p + 1, data=totamt)

    def checkSign(self):
        return askQuestion(self.opts["mf"].body, "Check Sign",
            "The Sign of the Discount Amount is not the same "\
            "as the Sign of the Receipt Amount, Is This Correct?")

    def endPage2(self):
        self.amt = float(ASD(0) - ASD(self.allamt))
        self.dis = float(ASD(0) - ASD(self.disamt))
        state = self.df.disableButtonsTags()
        self.opts["mf"].updateStatus("Choose an Ageing Option")
        for x in range(4, 8):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, "normal")
        self.agevar.set(True)
        self.df.mstFrame.wait_variable(self.agevar)
        self.df.enableButtonsTags(state=state)
        if self.agecan:
            self.doCancel()
            return
        # Debtors Ledger Transaction
        data = [
            self.allcoy, self.chain, self.dracno, self.opts["rtn"],
            self.allref, self.bh.batno, self.trndat, "", self.amt, 0.00,
            self.curdt, self.trndet, "", "N", self.opts["capnm"], self.sysdtw,
            0
        ]
        self.sql.insRec("drstrn", data=data)
        if self.dis:
            data = [
                self.allcoy, self.chain, self.dracno, 6, self.allref,
                self.bh.batno, self.trndat, "", self.dis, 0.00, self.curdt,
                self.trndet, "", "N", self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("drstrn", data=data)
        self.allocated = float(ASD(self.allocated) + ASD(self.allamt))
        if self.glint == "Y":
            # General Ledger Control Transaction (Debtors)
            amt = float(ASD(self.amt) + ASD(self.dis))
            data = (self.allcoy, self.drsctl, self.curdt, self.trndat,
                    self.glt, self.allref, self.bh.batno, amt, 0.00,
                    self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)
            # General Ledger Control Transaction (Discount)
            if self.disamt:
                data = (self.allcoy, self.dis_all, self.curdt, self.trndat,
                        self.glt, self.allref, self.bh.batno, self.disamt,
                        0.00, self.trndet, "N", "", 0, self.opts["capnm"],
                        self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)
            # General Ledger Transaction (Intercompany)
            if self.allcoy != self.opts["conum"]:
                # General Ledger Transaction (Intercompany From)
                acc = self.sql.getRec("genint",
                                      cols=["cti_acno"],
                                      where=[("cti_cono", "=",
                                              self.opts["conum"]),
                                             ("cti_inco", "=", self.allcoy)],
                                      limit=1)[0]
                data = (self.opts["conum"], acc, self.curdt, self.trndat,
                        self.glt, self.allref, self.bh.batno, self.amt, 0.00,
                        self.trndet, "N", "", 0, self.opts["capnm"],
                        self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)
                # General Ledger Transaction (Intercompany To)
                acc = self.sql.getRec("genint",
                                      cols=["cti_acno"],
                                      where=[("cti_cono", "=", self.allcoy),
                                             ("cti_inco", "=",
                                              self.opts["conum"])],
                                      limit=1)[0]
                amt = float(ASD(0) - ASD(self.amt))
                data = (self.allcoy, acc, self.curdt, self.trndat, self.glt,
                        self.allref, self.bh.batno, amt, 0.00, self.trndet,
                        "N", "", 0, self.opts["capnm"], self.sysdtw, 0)
                self.sql.insRec("gentrn", data=data)
        if self.allocated == self.trnamt:
            self.opts["mf"].dbm.commitDbase()
            self.df.clearFrame("C", 2)
            self.df.selPage("Deposit")
            self.df.advanceLine(1)
        else:
            bal = float(ASD(self.trnamt) - ASD(self.allocated))
            self.df.loadEntry("T", 2, 0, data=bal)
            self.df.advanceLine(2)

    def doAgeNormal(self):
        self.doAgeing("N")

    def doAgeHistory(self):
        self.doAgeing("H")

    def doAgeAuto(self):
        self.doAgeing("O")

    def doAgeCurrent(self):
        self.doAgeing("C")

    def doAgeing(self, atype):
        # Disable All Ageing Buttons
        for x in range(4, 8):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, "disabled")
        self.opts["mf"].updateStatus("Select Transaction to Allocate Against")
        age = AgeAll(self.opts["mf"],
                     system="drs",
                     agetyp=atype,
                     agekey=[
                         self.allcoy, self.chain, self.dracno,
                         self.opts["rtn"], self.allref, self.curdt, self.amt,
                         self.dis
                     ])
        self.agecan = age.cancel
        self.agevar.set(False)

    def doCancel(self):
        if self.agecan:
            ok = "yes"
        else:
            ok = askQuestion(
                self.opts["mf"].body,
                head="Cancel",
                mess="Are You Certain You Want to Cancel This Entry?")
        if ok == "yes":
            self.opts["mf"].dbm.rollbackDbase()
            if self.batupd:
                self.updateBatch(rev=True)
            self.df.clearFrame("C", 2)
            self.df.selPage("Deposit")
            row = int((self.df.last[1][1] - 1) / self.df.colq[1])
            col = (row * self.df.colq[1]) + 1
            self.df.focusField("C", 1, col)

    def exitPage2(self):
        self.df.focusField("C", 2, self.df.col)

    def updateBatch(self, rev=False):
        if rev:
            self.bh.batqty = self.bh.batqty - 1
            self.bh.batval = float(ASD(self.bh.batval) - ASD(self.trnamt))
        else:
            self.batupd = True
            self.bh.batqty = self.bh.batqty + 1
            self.bh.batval = float(ASD(self.bh.batval) + ASD(self.trnamt))
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)

    def queryDrs(self):
        callModule(self.opts["mf"],
                   self.df,
                   "dr4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])

    def maintainDrs(self):
        callModule(self.opts["mf"],
                   self.df,
                   "dr1010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])
Пример #28
0
class gl2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["ctlynd", "genmst", "genbal"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        per = self.sql.getRec("ctlynd",
                              where=[("cye_cono", "=", self.opts["conum"]),
                                     ("cye_period", "=", 0)],
                              limit=1)
        if not per:
            showError(
                self.opts["mf"].body, "Period Error", """No Period 0!

Please Contact your Software Support and Quote this Message as this is a Serious Error!"""
            )
            return
        self.start = per[self.sql.ctlynd_col.index("cye_start")]
        return True

    def drawDialog(self):
        sel_acc = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        sel_all = {
            "stype":
            "R",
            "tables": ("genbal", "genmst"),
            "cols":
            (("glo_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                              "Description"),
             ("glo_trdt", "", 0, "Date"), ("glo_cyr", "", 0, "Balance")),
            "where": [("glo_cono", "=", self.opts["conum"]),
                      ("glm_cono=glo_cono", ), ("glm_acno=glo_acno", ),
                      ("glo_trdt", "=", self.start)]
        }
        fld = ((("C", 0, 0, 0), "IUI", 7, "Acc-Num", "Account Number", "", "N",
                self.doAcc, sel_acc, None, None), (("C", 0, 0, 1), "ONA", 30,
                                                   "Description"),
               (("C", 0, 0, 2), "ISD", 13.2, "Balance", "Balance Value", "",
                "N", self.doBal, None, None, None))
        but = (("Import File", None, self.doImport, 0, ("C", 0, 1), ("C", 0,
                                                                     2),
                "Import Opening Balances from a CSV or XLS File."),
               ("All Entries", sel_all, None, 1, ("C", 0, 1), None,
                "Display All Existing Balances"),
               ("Exit", None, self.exitData, 1, ("C", 0, 1), ("C", 0, 2)))
        row = (20, )
        self.df = TartanDialog(self.opts["mf"],
                               rows=row,
                               eflds=fld,
                               cend=((self.endData, "y"), ),
                               cxit=(self.exitData, ),
                               butt=but)

    def doImport(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        impcol = [["Account Number", 0, "UI", 7],
                  ["Opening Balance", 1, "SD", 13.2]]
        fi = FileImport(self.opts["mf"], impcol=impcol)
        err = None
        for num, line in enumerate(fi.impdat):
            if len(line) != 2:
                err = "Line %s: Invalid Number of Fields (S/B %s is %s)" % \
                    (num + 1, 2, len(line))
                break
            self.acc = line[0]
            chk = self.sql.getRec("genmst",
                                  where=[("glm_cono", "=", self.opts["conum"]),
                                         ("glm_acno", "=", self.acc)],
                                  limit=1)
            if not chk:
                err = "Line %s: Invalid Account %s" % ((num + 1), self.acc)
                break
            self.bal = line[1]
            self.old = self.sql.getRec("genbal",
                                       cols=["glo_cyr"],
                                       where=[("glo_cono", "=",
                                               self.opts["conum"]),
                                              ("glo_acno", "=", self.acc),
                                              ("glo_trdt", "=", self.start)],
                                       limit=1)
            if not self.old:
                self.new_acc = "y"
            else:
                self.new_acc = "n"
            self.endData(det=True)
        if err:
            showError(self.opts["mf"].body, "Import Error", err)
        elif fi.impdat:
            self.opts["mf"].dbm.commitDbase()
        self.df.enableButtonsTags(state=state)
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doAcc(self, frt, pag, r, c, p, i, w):
        desc = self.sql.getRec("genmst",
                               cols=["glm_desc"],
                               where=[("glm_cono", "=", self.opts["conum"]),
                                      ("glm_acno", "=", w)],
                               limit=1)
        if not desc:
            return "Invalid Account Number"
        self.acc = w
        self.df.loadEntry(frt, pag, p + 1, data=desc[0])
        self.old = self.sql.getRec("genbal",
                                   where=[("glo_cono", "=",
                                           self.opts["conum"]),
                                          ("glo_acno", "=", self.acc),
                                          ("glo_trdt", "=", self.start)],
                                   limit=1)
        if not self.old:
            self.new_acc = "y"
        else:
            self.new_acc = "n"
            bal = self.old[self.sql.genbal_col.index("glo_cyr")]
            self.df.loadEntry(frt, pag, p + 2, data=bal)

    def doBal(self, frt, pag, r, c, p, i, w):
        self.bal = w

    def endData(self, det=False):
        data = [self.opts["conum"], self.acc, self.start, self.bal]
        if self.new_acc == "y":
            self.sql.insRec("genbal", data=data)
        elif data != self.old[:len(data)]:
            col = self.sql.genbal_col
            data.append(self.old[col.index("glo_xflag")])
            self.sql.updRec("genbal",
                            data=data,
                            where=[("glo_cono", "=", self.opts["conum"]),
                                   ("glo_acno", "=", self.acc),
                                   ("glo_trdt", "=", self.start)])
        if det:
            return
        self.opts["mf"].dbm.commitDbase()
        nxt = self.sql.getRec("genmst",
                              cols=["glm_acno"],
                              where=[("glm_cono", "=", self.opts["conum"]),
                                     ("glm_acno", ">", self.acc)],
                              limit=1)
        if nxt:
            self.df.colf[0][0][5] = nxt[0]
        else:
            self.df.colf[0][0][5] = 0
        self.df.advanceLine(0)

    def exitData(self):
        bals = self.sql.getRec("genbal",
                               cols=["sum(glo_cyr)"],
                               where=[("glo_cono", "=", self.opts["conum"]),
                                      ("glo_trdt", "=", self.start)],
                               limit=1)
        if bals[0]:
            diff = CCD(bals[0], "SD", 13.2)
            showError(self.opts["mf"].body, "Out of Balance",
                      "Opening Balances Do Not Balance by %s" % diff.disp)
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)
        else:
            showInfo(
                self.opts["mf"].body, "Year End",
                """A Year End for the Previous Period Must be Executed to Include These Opening Balances.

If the Current Period is 1 then the Year End for Period 0 must be Executed.""")
            self.df.closeProcess()
            self.opts["mf"].closeLoop()
Пример #29
0
class ml6010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.dataHeader()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["memmst", "memtrn", "memage"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.curdt = int(self.sysdtw / 100)
        self.agevar = tk.BooleanVar()
        self.agevar.set(False)
        return True

    def dataHeader(self):
        mlm = {
            "stype":
            "R",
            "tables": ("memmst", ),
            "cols":
            (("mlm_memno", "", 0, "Mem-No"), ("mlm_oldno", "", 0, "Old-No"),
             ("mlm_gender", "", 0, "G"), ("mlm_state", "", 0, "S"),
             ("mlm_surname", "", 0, "Surname", "Y"), ("mlm_names", "", 0,
                                                      "Names", "F")),
            "where": [("mlm_cono", "=", self.opts["conum"])],
            "order":
            "mlm_surname, mlm_names",
            "sort":
            False
        }
        fld = ((("T", 0, 0, 0), "IUI", 6, "Mem-No", "Member Number", "", "Y",
                self.doMemNo, mlm, None, ("notblank", )),
               (("T", 0, 0, 0), "ONA", 30, "Member"))
        tnd = ((self.endTop, "n"), )
        txt = (self.exitTop, )
        self.but = (("Normal", None, self.doReAgeNormal, 0, None, None,
                     "Only Show Unallocated Transactions"),
                    ("History", None, self.doReAgeHistory, 0, None, None,
                     "Show All Transactions, Including Already Allocated"))
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               butt=self.but)

    def doMemNo(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("memmst",
                              cols=["mlm_title", "mlm_initial", "mlm_surname"],
                              where=[("mlm_cono", "=", self.opts["conum"]),
                                     ("mlm_memno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Member Number"
        self.memno = w
        self.key = None
        name = "%s, %s %s" % (acc[2], acc[0], acc[1])
        self.df.loadEntry(frt, pag, p + 1, data=name)
        self.opts["mf"].updateStatus("Select Routine")
        for b in range(2):
            wid = getattr(self.df, "B%s" % b)
            self.df.setWidget(wid, "normal")
        self.df.setWidget(self.df.B0, "focus")
        self.agevar.set(True)
        self.df.mstFrame.wait_variable(self.agevar)
        if self.key in ("normal", "history"):
            return "nd"
        elif self.key == "cancel":
            return "nc"

    def doReAgeNormal(self):
        self.key = "normal"
        self.doReAge()

    def doReAgeHistory(self):
        self.key = "history"
        self.doReAge()

    def doReAge(self):
        self.opts["mf"].updateStatus("")
        for b in range(2):
            wid = getattr(self.df, "B%s" % b)
            self.df.setWidget(wid, "disabled")
        col = [
            "mlt_trdt", "mlt_refno", "mlt_type", "mlt_tramt", "paid", "balance"
        ]
        whr = [("mlt_cono", "=", self.opts["conum"]),
               ("mlt_memno", "=", self.memno)]
        if self.key == "normal":
            dtc, recs = getTrn(self.opts["mf"].dbm, "mem", whr=whr, zer="N")
        else:
            dtc, recs = getTrn(self.opts["mf"].dbm, "mem", whr=whr)
        if recs:
            data = []
            for rec in recs:
                dat = []
                for c in col:
                    dat.append(rec[dtc.index(c)])
                data.append(dat)
            age = AgeTrans(self.opts["mf"], "mem", data, 0, xits=False)
            if not age.ccl and age.data:
                if age.total.work:
                    while not age.ccl:
                        age.doAllocate()
                        if age.ccl or not age.total.work:
                            break
                if age.ccl:
                    self.key = "cancel"
                    age.data = []
                for tr in age.data:
                    if tr[6]:
                        w = copyList(whr)
                        w.extend([("mlt_type", "=", tr[2]),
                                  ("mlt_refno", "=", tr[1])])
                        self.sql.insRec("memage",
                                        data=[
                                            self.opts["conum"], self.memno,
                                            tr[2], tr[1], self.curdt, tr[2],
                                            tr[1], tr[6], 0
                                        ])
            else:
                self.key = "cancel"
        self.agevar.set(False)

    def endTop(self):
        self.df.focusField("T", 0, 1)

    def exitTop(self):
        self.opts["mf"].dbm.commitDbase(ask=True)
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
Пример #30
0
class tb1030(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.mainProcess()
            self.doReset()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm,
                       "ftable",
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.doGetTable()
        if not self.table:
            return
        self.sql = Sql(self.opts["mf"].dbm, ["ftable", self.table],
                       prog=self.__class__.__name__)
        self.sqi = Sql(self.opts["mf"].dbm,
                       self.table,
                       prog=self.__class__.__name__)
        self.read = "N"
        return True

    def doGetTable(self):
        tit = ("Table to Fix/Amend", )
        tbl = {
            "stype":
            "R",
            "tables": ("ftable", ),
            "cols": (("ft_tabl", "", 0, "Table"), ("ft_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("ft_seq", "=", 1)],
            "screen":
            self.opts["mf"].body
        }
        fld = ((("T", 0, 0, 0), "I@ft_tabl", 0, "", "", "", "N", self.doTabNam,
                tbl, None, None), )
        tnd = ((self.doTabEnd, "y"), )
        txt = (self.doTabExit, )
        self.tb = TartanDialog(self.opts["mf"],
                               tops=True,
                               title=tit,
                               eflds=fld,
                               tend=tnd,
                               txit=txt)
        self.tb.mstFrame.wait_window()

    def doTabNam(self, frt, pag, r, c, p, i, w):
        desc = self.sql.getRec("ftable",
                               cols=["ft_desc"],
                               where=[("ft_tabl", "=", w)],
                               limit=1)
        if not desc:
            return "Invalid Table"
        self.table = w
        self.desc = desc[0]

    def doTabExit(self):
        self.table = None
        self.doTabEnd()

    def doTabEnd(self):
        self.tb.closeProcess()

    def mainProcess(self):
        self.dics = getattr(self.sql, "%s_dic" % self.table)
        self.lcol = getattr(self.sql, "%s_col" % self.table)
        self.pgs = int((len(self.lcol) - 1) / 15) + 1
        fld = []
        cnt = 0
        lpg = 0
        for num, col in enumerate(self.lcol):
            if self.pgs == 1:
                pag = 0
            else:
                pag = int(num / 15) + 1
            if pag != lpg:
                lpg = pag
                cnt = 0
            if self.dics[col][2][0] == "D":
                typ = "I%s" % self.dics[col][2].lower()
            else:
                typ = "I%s" % self.dics[col][2]
            siz = self.dics[col][3]
            if siz > 50:
                siz = 50
            fld.append([["T", pag, cnt, 0], typ, siz, self.dics[col][4],
                        self.dics[col][4], "", "N", None, None, None, None])
            cnt += 1
        but = (("Display", None, self.doDisplay, None, None,
                None), ("Update", None, self.doUpdate, None, None,
                        None), ("Create", None, self.doCreate, 1, None, None),
               ("Delete", None, self.doDelete, None, None,
                None), ("Cancel", None, self.doReset, None, None,
                        None), ("Exit", None, self.doExit, 1, None, None))
        if self.pgs == 1:
            tag = None
            tnd = ((self.doEnd, "n"), )
            txt = (self.doExit, )
        else:
            tag = []
            tnd = [None]
            txt = [None]
            for pag in range(1, (self.pgs + 1)):
                tag.append(["Page-_%s" % pag, self.chgPage, ("T", 1, 1), None])
                tnd.append([self.doEnd, "n"])
                txt.append(self.doExit)
        if self.pgs == 1:
            self.df = TartanDialog(self.opts["mf"],
                                   tops=True,
                                   title=self.desc,
                                   eflds=fld,
                                   tags=tag,
                                   tend=tnd,
                                   txit=txt,
                                   butt=but,
                                   clicks=self.doClick)
        else:
            self.df = TartanDialog(self.opts["mf"],
                                   eflds=fld,
                                   tags=tag,
                                   tend=tnd,
                                   txit=txt,
                                   butt=but,
                                   clicks=self.doClick)

    def doClick(self, *opts):
        self.df.focusField("T", opts[0][0], opts[0][1] + 1)

    def chgPage(self):
        self.df.focusField("T", self.df.pag, 1, clr=False)

    def doDisplay(self):
        whr = []
        hed = []
        pos = 0
        for pag in range(self.df.pgs + 1):
            for num, fld in enumerate(self.df.t_work[pag][0]):
                hed.append(self.dics[self.lcol[pos]][5])
                if fld:
                    if type(fld) == str and fld.count("%"):
                        eql = "like"
                    else:
                        eql = "="
                    if self.dics[self.lcol[pos]][2][1] in ("A", "a"):
                        whr.append((self.lcol[pos], eql, fld))
                    else:
                        whr.append((self.lcol[pos], eql, fld))
                pos += 1
        keys = self.sql.getRec("ftable",
                               where=[("ft_tabl", "=", self.table),
                                      ("ft_seq", "=", 1)],
                               limit=1)
        odr = ""
        for x in range(4, 14):
            if keys[x]:
                odr = "%s%s," % (odr, keys[x])
        odr = odr[:-1]
        recs = self.sql.getRec(tables=self.table, where=whr, order=odr)
        if recs:
            titl = "Available Records"
            dat = []
            for rec in recs:
                a = []
                for n, c in enumerate(self.lcol):
                    d = CCD(rec[n], self.dics[c][2], self.dics[c][3])
                    a.append(d.disp)
                dat.append(a)
            state = self.df.disableButtonsTags()
            sc = SChoice(self.opts["mf"],
                         scrn=self.opts["mf"].body,
                         titl=titl,
                         head=hed,
                         data=dat,
                         retn="I",
                         mode="S")
            self.df.enableButtonsTags(state=state)
            if sc.selection is not None:
                self.read = "Y"
                self.olddata = recs[sc.selection]
                for num, dat in enumerate(self.olddata):
                    if self.pgs == 1:
                        pag = 0
                        idx = num
                    else:
                        pag = int(num / 15) + 1
                        idx = num - ((pag - 1) * 15)
                    self.df.loadEntry("T", pag, idx, data=dat)
                self.df.setWidget(self.df.B0, "disabled")
                self.df.setWidget(self.df.B1, "normal")
                self.df.setWidget(self.df.B3, "normal")
                self.df.setWidget(self.df.B4, "normal")
            else:
                self.read = "N"
            frt, pag, row, col = self.df.first
            self.df.focusField(frt, pag, 1, clr=False)

    def doUpdate(self):
        if self.read == "N":
            return
        self.sql.delRec(self.table, data=self.olddata)
        self.olddata = []
        newdata = []
        for pag in range((self.df.pgs + 1)):
            newdata.extend(self.df.t_work[pag][0])
        self.sqi.insRec(self.table, data=newdata)
        self.doReset()

    def doCreate(self):
        newdata = []
        for pag in range((self.df.pgs + 1)):
            newdata.extend(self.df.t_work[pag][0])
        keys = self.sql.getRec("ftable",
                               where=[("ft_tabl", "=", self.table),
                                      ("ft_type", "=", "U")])
        for key in keys:
            col = []
            dat = []
            for fld in key[4:]:
                if fld:
                    col.append(fld)
                    idx = getattr(self.sqi, "%s_col" % self.table)
                    dat.append(newdata[idx.index(fld)])
            whr = []
            for num, ccc in enumerate(col):
                whr.append((ccc, "=", dat[num]))
            chk = self.sqi.getRec(tables=self.table, where=whr)
            if chk:
                showError(self.opts["mf"].body, "Duplicate Key",
                          "A Record like this Already Exists")
                return
        self.sqi.insRec(self.table, data=newdata)
        self.doReset()

    def doDelete(self):
        if self.read == "N":
            return
        if self.table in ("gentrn", "crstrn", "drstrn"):
            ask = askQuestion(self.opts["mf"].body,
                              "Delete",
                              "Delete All Associated Records?",
                              default="no")
        else:
            ask = "no"
        if ask == "yes":
            err = ""
            tabs = ["gentrn", "ctlvtf", "crsctl", "crstrn", "drsctl", "drstrn"]
            sql = Sql(self.opts["mf"].dbm, tables=tabs)
            conum = self.olddata[0]
            if self.table == "gentrn":
                system = "G"
                docno = CCD(self.olddata[5], "Na", 9).work
                date = CCD(self.olddata[3], "D1", 10).work
                dtyp = CCD(self.olddata[4], "UI", 2).work
                gtyp = dtyp
            elif self.table == "crstrn":
                system = "C"
                acno = CCD(self.olddata[1], "NA", 7).work
                dtyp = CCD(self.olddata[2], "UI", 2).work
                docno = CCD(self.olddata[3], "Na", 9).work
                date = CCD(self.olddata[5], "D1", 10).work
                if dtyp in (1, 4):
                    gtyp = 5  # Purchase
                elif dtyp == 2:
                    gtyp = 6  # Receipt
                elif dtyp == 3:
                    gtyp = 4  # Journal
                elif dtyp == 5:
                    gtyp = 2  # Payment
                glint = sql.getRec("crsctl",
                                   cols=["ctc_glint"],
                                   where=[("ctc_cono", "=", conum)],
                                   limit=1)[0]
            else:
                system = "D"
                chain = CCD(self.olddata[1], "UI", 3).work
                acno = CCD(self.olddata[2], "NA", 7).work
                dtyp = CCD(self.olddata[3], "UI", 2).work
                docno = CCD(self.olddata[4], "Na", 9).work
                date = CCD(self.olddata[6], "D1", 10).work
                if dtyp in (1, 4):
                    gtyp = 1  # Sale
                elif dtyp == 2:
                    gtyp = 6  # Receipt
                elif dtyp == 3:
                    gtyp = 4  # Journal
                elif dtyp == 5:
                    gtyp = 2  # Payment
                glint = sql.getRec("drsctl",
                                   cols=["ctd_glint"],
                                   where=[("ctd_cono", "=", conum)],
                                   limit=1)[0]
            sqv = [("vtt_cono", "=", conum), ("vtt_styp", "=", system),
                   ("vtt_refno", "=", docno), ("vtt_refdt", "=", date),
                   ("vtt_ttyp", "=", dtyp)]
            recs = sql.getRec("ctlvtf", where=sqv)
            if len(recs) > 1:
                err = "ctlvtf recs %s\n" % len(recs)
            texc = 0
            ttax = 0
            for rec in recs:
                texc = float(ASD(texc) + ASD(rec[11]))
                ttax = float(ASD(ttax) + ASD(rec[12]))
            ttot = float(ASD(texc) + ASD(ttax))
            ok = "yes"
            if system == "G" or glint == "Y":
                sqg = [("glt_cono", "=", conum), ("glt_refno", "=", docno),
                       ("glt_trdt", "=", date), ("glt_type", "=", gtyp)]
                recs = sql.getRec("gentrn", where=sqg)
                gamt = 0
                gtax = 0
                for rec in recs:
                    gamt = float(ASD(gamt) + ASD(rec[7]))
                    gtax = float(ASD(gtax) + ASD(rec[8]))
                if gtax != ttax:
                    err = "%sctlvtf %s <> gentrn %s\n" % (err, ttax, gtax)
                if gamt:
                    err = "%sgentrn debits <> credits" % err
            if system == "C":
                sqc = [("crt_cono", "=", conum), ("crt_acno", "=", acno),
                       ("crt_ref1", "=", docno), ("crt_trdt", "=", date),
                       ("crt_type", "=", dtyp)]
                recs = sql.getRec("crstrn", where=sqc)
                if len(recs) > 1:
                    err = "%scrstrn recs %s\n" % (err, len(recs))
                camt = 0
                ctax = 0
                for rec in recs:
                    camt = float(ASD(camt) + ASD(rec[7]))
                    ctax = float(ASD(ctax) + ASD(rec[8]))
                if ctax != ttax:
                    err = "%sctlvtf %s <> crstrn %s\n" % (err, ttax, ctax)
                if camt != ttot:
                    err = "%sctlvtf tot %s <> crstrn tot %s" % (err, ttot,
                                                                camt)
            if system == "D":
                sqd = [("drt_cono", "=", conum), ("drt_chain", "=", chain),
                       ("drt_acno", "=", acno), ("drt_ref1", "=", docno),
                       ("drt_trdt", "=", date), ("drt_type", "=", dtyp)]
                recs = sql.getRec("drstrn", where=sqd)
                if len(recs) > 1:
                    err = "%sdrstrn recs %s\n" % (err, len(recs))
                damt = 0
                dtax = 0
                for rec in recs:
                    damt = float(ASD(damt) - ASD(rec[8]))
                    dtax = float(ASD(dtax) - ASD(rec[9]))
                if dtax != ttax:
                    err = "%sctlvtf %s <> drstrn %s\n" % (err, ttax, dtax)
                if damt != ttot:
                    err = "%sctlvtf tot %s <> drstrn tot %s" % (err, ttot,
                                                                damt)
            if err:
                ok = askQuestion(self.opts["mf"].body, "Error",
                                 "%s\n\nDelete transaction (y/n)?" % err)
            if ok == "yes":
                sql.delRec("ctlvtf", where=sqv)
                if system == "G" or glint == "Y":
                    sql.delRec("gentrn", where=sqg)
                if system == "C":
                    sql.delRec("crstrn", where=sqc)
                if system == "D":
                    sql.delRec("drstrn", where=sqd)
        else:
            self.sql.delRec(self.table, data=self.olddata)
        self.olddata = []
        self.doReset()

    def doEnd(self):
        self.df.focusField(self.df.frt, self.df.pag, 1, clr=False)

    def doReset(self):
        self.read = "N"
        if self.pgs == 1:
            self.df.focusField("T", 0, 1)
        else:
            self.df.selPage(self.df.tags[0][0])
            self.df.focusField("T", 1, 1)
        self.df.setWidget(self.df.B0, "normal")
        self.df.setWidget(self.df.B1, "disabled")
        self.df.setWidget(self.df.B3, "disabled")
        self.df.setWidget(self.df.B4, "disabled")

    def doExit(self):
        mes = None
        dft = "yes"
        if self.table == "gentrn":
            bals = self.sql.getRec("gentrn", cols=["sum(glt_tramt)"], limit=1)
            if bals[0]:
                amt = CCD(bals[0], "SD", 13.2)
                mes = "General Ledger Out of Balance by %s\n\n"\
                    "Commit Anyway?" % amt.disp.lstrip()
                dft = "no"
        self.opts["mf"].dbm.commitDbase(ask=True, mess=mes, default=dft)
        self.df.closeProcess()
        self.opts["mf"].closeLoop()