コード例 #1
0
ファイル: sl2020.py プロジェクト: paulmalherbe/Tartan
class sl2020(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,
                       ["genmst", "gentrn", "wagmst", "waglmf", "wagltf"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.col = self.sql.waglmf_col
        gc = GetCtl(self.opts["mf"])
        wagctl = gc.getCtl("wagctl", self.opts["conum"])
        if not wagctl:
            return
        self.glint = wagctl["ctw_glint"]
        if self.glint == "Y":
            ctlctl = gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = ["wag_slc", "wag_sli"]
            if gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.glctls = (ctlctl["wag_slc"], ctlctl["wag_sli"])
        else:
            self.glctls = None
        self.batchHeader()
        if not self.bh.batno:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        return True

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

    def dataHeader(self):
        wgm = {
            "stype":
            "R",
            "tables": ("wagmst", ),
            "cols": (("wgm_empno", "", 0, "EmpNo"),
                     ("wgm_sname", "", 0, "Surname", "Y"), ("wgm_fname", "", 0,
                                                            "Names")),
            "where": [("wgm_cono", "=", self.opts["conum"])]
        }
        lnm = {
            "stype":
            "R",
            "tables": ("waglmf", ),
            "cols": (("wlm_loan", "", 0, "Ln"), ("wlm_desc", "", 0,
                                                 "Description", "Y")),
            "where": [("wlm_cono", "=", self.opts["conum"])],
            "whera": (("C", "wlm_empno", 0), ),
            "index":
            0
        }
        typ = {
            "stype":
            "C",
            "titl":
            "Transaction Types",
            "head": ("C", "Description"),
            "data": ((1, "Interest Adjustment"), (3, "Further Advance"),
                     (4, "Loan Repayment"), (5, "Loan Adjustment")),
            "index":
            0
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_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", 5, "EmpNo", "Employee Number", "", "N",
                self.doEmp, wgm, None, None),
               (("C", 1, 0, 1), "ONA", 10, "Name"),
               (("C", 1, 0, 2), "IUI", 2, "Ln", "Loan Number", "", "N",
                self.doLoan, lnm, None, ("notzero", )),
               (("C", 1, 0, 3), "ONA", 10, "Descript", "Description", "", "N",
                None, None, None, None),
               (("C", 1, 0, 4), "ID1", 10, "Trans-Date", "Transaction Date",
                self.sysdtw, "N", self.doTrdate, None, None, None),
               (("C", 1, 0, 5), "IUI", 1, "T", "Transaction Type", "", "N",
                self.doTyp, typ, None, ("in", (1, 3, 4, 5))),
               (("C", 1, 0, 6), "INa", 9, "Reference", "Reference Number", "i",
                "N", self.doRef, None, None, ("notblank", )),
               (("C", 1, 0, 7), "IUD", 6.2, "Intr-%", "New Interest Rate", "",
                "N", self.doPer, None, None, None),
               (("C", 1, 0, 8), "ISD", 13.2, "Interest",
                "Interest (Adds to interest raised)", "", "Y", self.doInt,
                None, None, ("notzero", )),
               (("C", 1, 0, 9), "ISD", 13.2, "Amount",
                "Amount (Adds to advances or payments)", "", "Y", self.doPay,
                None, None, ("notzero", )),
               (("C", 1, 0, 10), "IUD", 9.2, "Deduct",
                "Deduction Amount (New total deduction)", "", "Y", self.doDed,
                None, None, ("efld", ))]
        if self.glint == "Y":
            fld.extend([[("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", 30, "Description"),
                        (("C", 2, 0,
                          2), "ISD", 13.2, "All-Amt", "Allocation Amount", "",
                         "N", self.doAllAmt, None, None, ("efld", )),
                        (("C", 2, 0, 3), "INA", 30, "Details", "", "", "N",
                         self.doAllDet, None, None, ("notblank", ))])
        but = [("Interrogate", None, self.querySln, 0, ("C", 1, 1), ("C", 1,
                                                                     2))]
        tag = [("Transaction", None, None, None, False)]
        cnd = [(None, "n"), (self.endPage1, "y")]
        cxt = [None, self.exitPage1]
        if self.glint == "Y":
            but.append(
                ("Cancel", None, self.doCancel, 0, ("C", 2, 1), ("C", 1, 1)))
            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 doEmp(self, frt, pag, r, c, p, i, w):
        self.empno = w
        acc = self.sql.getRec("wagmst",
                              cols=["wgm_sname"],
                              where=[("wgm_cono", "=", self.opts["conum"]),
                                     ("wgm_empno", "=", self.empno)],
                              limit=1)
        if not acc:
            return "Invalid Employee Number"
        self.name = acc[0]
        self.df.loadEntry("C", pag, p + 1, data=self.name)
        chk = self.sql.getRec("waglmf",
                              where=[("wlm_cono", "=", self.opts["conum"]),
                                     ("wlm_empno", "=", self.empno)])
        if len(chk) == 1:
            self.acc = chk[0]
            self.loan = self.acc[self.col.index("wlm_loan")]
            desc = self.acc[self.col.index("wlm_desc")]
            self.df.loadEntry("C", pag, p + 2, data=self.loan)
            self.df.loadEntry("C", pag, p + 3, data=desc)
            return "sk3"

    def doLoan(self, frt, pag, r, c, p, i, w):
        self.loan = w
        self.acc = self.sql.getRec("waglmf",
                                   where=[("wlm_cono", "=",
                                           self.opts["conum"]),
                                          ("wlm_empno", "=", self.empno),
                                          ("wlm_loan", "=", self.loan)],
                                   limit=1)
        if not self.acc:
            return "Invalid Loan Number"
        desc = self.acc[self.col.index("wlm_desc")]
        self.df.loadEntry("C", pag, p + 1, data=desc)

    def doTrdate(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.trdate = w

    def doTyp(self, frt, pag, r, c, p, i, w):
        self.typ = w

    def doRef(self, frt, pag, r, c, p, i, w):
        self.ref = w
        per = self.acc[self.col.index("wlm_rate")]
        self.df.loadEntry("C", pag, p + 1, data=per)

    def doPer(self, frt, pag, r, c, p, i, w):
        self.per = w
        if self.typ in (3, 4, 5):
            self.intp = 0
            return "sk1"

    def doInt(self, frt, pag, r, c, p, i, w):
        self.intp = w
        self.pay = 0
        self.ded = 0
        return "sk2"

    def doPay(self, frt, pag, r, c, p, i, w):
        self.pay = w
        amt = self.acc[self.col.index("wlm_repay")]
        self.df.loadEntry("C", pag, p + 1, data=amt)

    def doDed(self, frt, pag, r, c, p, i, w):
        self.ded = w

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

    def updateTables1(self):
        if self.bh.multi == "Y":
            self.curdt = int(self.trdate / 100)
        else:
            self.curdt = self.bh.curdt
        if self.typ == 1:
            self.glt = 4
            desc = "Interest Adj"
            self.val = self.intp
            ded = self.acc[self.col.index("wlm_repay")]
            cap = 0.00
        elif self.typ == 3:
            self.glt = 2
            desc = "Advance"
            self.val = self.pay
            ded = self.ded
            cap = self.val
        elif self.typ == 4:
            self.glt = 6
            desc = "Repayment"
            self.val = float(ASD(0) - ASD(self.pay))
            ded = self.ded
            cap = 0.00
        elif self.typ == 5:
            self.glt = 4
            desc = "Adjustment"
            self.val = self.pay
            ded = self.ded
            cap = 0.00
        self.sql.updRec("waglmf",
                        cols=["wlm_rate", "wlm_repay"],
                        data=[self.per, ded],
                        where=[("wlm_cono", "=", self.opts["conum"]),
                               ("wlm_empno", "=", self.empno),
                               ("wlm_loan", "=", self.loan)])
        self.sql.insRec("wagltf",
                        data=[
                            self.opts["conum"], self.empno, self.loan,
                            self.bh.batno, self.typ, self.trdate, self.ref,
                            self.val, cap, ded, self.per, self.curdt, desc,
                            "N", self.opts["capnm"], self.sysdtw, 0
                        ])
        if self.glint == "N":
            return
        # General Ledger Staff Loans Control Account
        data = (self.opts["conum"], self.glctls[0], self.curdt, self.trdate,
                self.glt, self.ref, self.bh.batno, self.val, 0.00, self.name,
                "N", "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        self.val = float(ASD(0) - ASD(self.val))
        if self.typ == 1:
            # General Ledger Interest Received
            data = (self.opts["conum"], self.glctls[1], self.curdt,
                    self.trdate, self.glt, self.ref, self.bh.batno, self.val,
                    0.00, "Staff Loan - %s" % self.name, "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 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
        self.genacc = w
        self.df.loadEntry("C", pag, p + 1, data=chk[0])

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

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

    def doCancel(self):
        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("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)

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

    def updateTables2(self):
        # General Ledger Transaction (Source)
        data = (self.opts["conum"], self.genacc, self.curdt, self.trdate,
                self.glt, self.ref, self.bh.batno, self.allamt, 0.00,
                self.alldet, "N", "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)

    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.val))
        else:
            self.batupd = True
            self.bh.batqty = self.bh.batqty + 1
            self.bh.batval = float(ASD(self.bh.batval) + ASD(self.val))
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)

    def querySln(self):
        callModule(self.opts["mf"],
                   self.df,
                   "sl4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])
コード例 #2
0
ファイル: cr4010.py プロジェクト: paulmalherbe/Tartan
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()
コード例 #3
0
ファイル: ml2010.py プロジェクト: paulmalherbe/Tartan
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)
コード例 #4
0
class rt2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        tabs = [
            "ctlmst", "ctlvmf", "ctlvrf", "ctlvtf", "genint", "genmst",
            "gentrn", "rtlprm", "rtlmst", "rtlcon", "rtltrn"
        ]
        self.sql = Sql(self.opts["mf"].dbm, tabs, prog=self.__class__.__name__)
        if self.sql.error:
            return
        if self.opts["rtn"] not in (2, 3, 4):
            mes = "Invalid Routine %s" % str(self.opts["rtn"])
            showError(self.opts["mf"].body, "Control Error", mes)
            return
        self.gc = GetCtl(self.opts["mf"])
        rtlctl = self.gc.getCtl("rtlctl", self.opts["conum"])
        if not rtlctl:
            return
        self.glint = rtlctl["ctr_glint"]
        if self.glint == "Y":
            # Check All Premises Control Records
            errs = ("Premises %s Has An Invalid",
                    "Rental Control Account (%s)",
                    "Rental Income Account (%s)")
            ass = self.sql.getRec(
                "rtlprm",
                cols=["rtp_code", "rtp_rtlacc", "rtp_incacc"],
                where=[("rtp_cono", "=", self.opts["conum"])])
            for acc in ass:
                for x in range(1, 3):
                    chk = self.sql.getRec("genmst",
                                          where=[("glm_cono", "=",
                                                  self.opts["conum"]),
                                                 ("glm_acno", "=", acc[x])],
                                          limit=1)
                    if not chk:
                        mess = "%s %s" % (errs[0] % acc[0], errs[x] % acc[x])
                        showError(self.opts["mf"].body, "Control Error", mess)
                        return
            # Check for VAT Control
            ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            if self.gc.chkRec(self.opts["conum"], ctlctl, ["vat_ctl"]):
                return
            self.convat = ctlctl["vat_ctl"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.bh = Batches(self.opts["mf"],
                          self.opts["conum"],
                          self.opts["conam"],
                          self.opts["period"],
                          "RTL",
                          self.opts["rtn"],
                          glint=self.glint)
        self.bh.doBatchHeader()
        if not self.bh.batno:
            return
        if self.opts["rtn"] == 2:
            self.bh.batval = float(ASD(0) - ASD(self.bh.batval))
        return True

    def drawDialog(self):
        prm = {
            "stype":
            "R",
            "tables": ("rtlprm", ),
            "cols": (("rtp_code", "", 0, "Prm-Cod"), ("rtp_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("rtp_cono", "=", self.opts["conum"])]
        }
        mst = {
            "stype":
            "R",
            "tables": ("rtlmst", ),
            "cols":
            (("rtm_acno", "", 0, "Acc-Num"), ("rtm_name", "", 0, "Name", "Y")),
            "where": [("rtm_cono", "=", self.opts["conum"])],
            "whera": [["C", "rtm_code", 0, 1]]
        }
        con = {
            "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": [["C", "rtc_code", 0, 1], ["C", "rtc_acno", 1, 1]]
        }
        vtm = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "C"), ("vtm_desc", "", 0,
                                                "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_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), "INA", 7, "Prm-Cod", "Premises Code", "r", "N",
                self.doPrmCod, prm, None, None),
               (("C", 1, 0, 1), "INA", 7, "Acc-Num", "Account Number", "r",
                "N", self.doAccNum, mst, None, None),
               (("C", 1, 0, 2), "IUI", 3, "Seq", "Contract Sequence", "", "N",
                self.doConSeq, con, None, None),
               (("C", 1, 0, 3), "INa", 9, "Reference", "Reference Number", "i",
                "N", self.doTrnRef, None, None, ("notblank", )),
               (("C", 1, 0, 4), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 5), "ISD", 13.2, "Amount", "Transaction Amount",
                "", "N", self.doTrnAmt, None, None, None),
               (("C", 1, 0, 6), "IUA", 1, "V", "V.A.T Code", "", "N",
                self.doVatCod, vtm, None, ("notblank", )),
               (("C", 1, 0, 7), "ISD", 11.2, "V.A.T", "V.A.T Amount", "", "N",
                self.doVatAmt, None, None, None),
               [("C", 1, 0, 8), "INA", 30, "Details", "Transaction Details",
                "", "N", self.doTrnDet, None, None, None]]
        if self.opts["rtn"] not in (2, 3) and self.glint == "Y":
            fld[10][2] = (22, 30)
            fld.extend([[("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", 30, "Description"),
                        (("C", 2, 0,
                          2), "ISD", 13.2, "All-Amt", "Allocation Amount", "",
                         "N", self.doAllAmt, None, None, ("efld", )),
                        (("C", 2, 0, 3), "INA", 30, "Details", "", "", "N",
                         self.doAllDet, None, None, ("notblank", ))])
        but = (("Interrogate", None, self.queryRtl, 0, ("C", 1, 1),
                ("C", 1, 2)), ("Cancel", None, self.doCancel, 0, ("C", 2, 1),
                               ("C", 1, 1)))
        tag = [("Transaction", None, None, None, False)]
        cnd = [(None, "n"), (self.endPage1, "y")]
        cxt = [None, self.exitPage1]
        if self.opts["rtn"] not in (2, 3) 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 doPrmCod(self, frt, pag, r, c, p, i, w):
        whr = [("rtp_cono", "=", self.opts["conum"]), ("rtp_code", "=", w)]
        acc = self.sql.getRec("rtlprm", where=whr, limit=1)
        if not acc:
            return "Invalid Premises Code"
        self.code = w
        self.rtlacc = acc[self.sql.rtlprm_col.index("rtp_rtlacc")]

    def doAccNum(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("rtlmst",
                              cols=["rtm_name", "rtm_vatind"],
                              where=[("rtm_cono", "=", self.opts["conum"]),
                                     ("rtm_code", "=", self.code),
                                     ("rtm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        self.acno = w
        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 "No Valid Contracts"
        self.cnum = con[-1:][0][3]
        self.df.colf[1][2][5] = self.cnum
        if self.opts["rtn"] == 4:
            self.df.colf[1][6][5] = acc[1]
        else:
            self.df.colf[1][6][5] = "N"

    def doConSeq(self, frt, pag, r, c, p, i, w):
        con = self.sql.getRec("rtlcon",
                              where=[("rtc_cono", "=", self.opts["conum"]),
                                     ("rtc_code", "=", self.code),
                                     ("rtc_acno", "=", self.acno),
                                     ("rtc_cnum", "=", w)],
                              order="rtc_cnum")
        if not con:
            return "Invalid Contract Sequence"
        self.cnum = w

    def doTrnRef(self, frt, pag, r, c, p, i, w):
        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.opts["rtn"] in (2, 3):
            self.vatcode = ""
            self.trnvat = 0
            return "sk2"

    def doVatCod(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.trnvat = round((self.trnamt * vrte / (vrte + 100)), 2)
        self.df.loadEntry(frt, pag, p + 1, data=self.trnvat)
        if not self.trnvat:
            return "sk1"

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

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

    def endPage1(self):
        self.batupd = False
        self.updateTables1()
        self.updateBatch()
        if self.trnamt == 0:
            self.df.advanceLine(1)
        else:
            self.allocated = float(0.0)
            if self.opts["rtn"] in (2, 3) or self.glint == "N":
                self.opts["mf"].dbm.commitDbase()
                self.df.selPage("Transaction")
                self.df.advanceLine(1)
            else:
                self.trnamt = float(ASD(self.trnamt) - ASD(self.trnvat))
                self.df.loadEntry("T", 2, 0, data=self.trnamt)
                self.df.selPage("Allocation")
                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.trnvat
        if self.opts["rtn"] == 2:  # Receipts
            if self.trnamt == 0:
                self.recon = self.curdt
            else:
                self.recon = 0
            self.amt = float(ASD(0) - ASD(self.amt))
            self.vat = float(ASD(0) - ASD(self.vat))
            self.glt = 6
        elif self.opts["rtn"] == 3:  # Payments
            if self.trnamt == 0:
                self.recon = self.curdt
            else:
                self.recon = 0
            self.glt = 2
        elif self.opts["rtn"] == 4:  # Journal Entries
            self.recon = 0
            self.glt = 4
        # Rental Ledger Transaction
        data = [
            self.opts["conum"], self.code, self.acno, self.cnum,
            self.opts["rtn"], self.trnref, self.bh.batno, self.trndat,
            self.amt, self.vat, self.curdt, self.trndet, self.vatcode, "N",
            self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("rtltrn", data=data)
        if self.vatcode:
            # VAT Transaction (ctlvtf)
            exc = float(ASD(0) - ASD(self.amt) + ASD(self.vat))
            vat = float(ASD(0) - ASD(self.vat))
            data = (self.opts["conum"], self.vatcode, "O", self.curdt, "R",
                    self.opts["rtn"], self.bh.batno, self.trnref, self.trndat,
                    self.code, self.trndet, exc, vat, 0, self.opts["capnm"],
                    self.sysdtw, 0)
            self.sql.insRec("ctlvtf", data=data)
        if self.glint == "N":
            return
        # General Ledger Rental Account
        data = (self.opts["conum"], self.rtlacc, self.curdt, self.trndat,
                self.glt, self.trnref, self.bh.batno, self.amt, self.vat,
                self.trndet, self.vatcode, "", 0, self.opts["capnm"],
                self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        self.trnamt = float(ASD(0) - ASD(self.amt))
        self.trnvat = float(ASD(0) - ASD(self.vat))
        if self.vatcode and self.trnvat:
            # General Ledger Control Transaction (V.A.T.)
            data = (self.opts["conum"], self.convat, self.curdt, self.trndat,
                    self.glt, self.trnref, self.bh.batno, self.trnvat, 0.00,
                    self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw,
                    0)
            self.sql.insRec("gentrn", data=data)
        if self.opts["rtn"] in (2, 3):
            # General Ledger Control Transaction (Bank)
            data = (self.opts["conum"], self.bh.acc, self.curdt, self.trndat,
                    self.glt, self.trnref, self.bh.batno, self.trnamt, 0.00,
                    self.trndet, "N", "", self.recon, 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 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
        self.genacc = w
        self.df.loadEntry("C", pag, p + 1, data=chk[0])

    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 doAllDet(self, frt, pag, r, c, p, i, w):
        self.alldet = w

    def doCancel(self):
        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("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)

    def endPage2(self):
        self.updateTables2()
        self.allocated = float(ASD(self.allocated) + ASD(self.allamt))
        if self.allocated == self.trnamt:
            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
        # General Ledger Transaction (Source)
        data = (self.opts["conum"], self.genacc, self.curdt, self.trndat,
                self.glt, self.trnref, self.bh.batno, self.allamt, 0.00,
                self.alldet, "N", "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)

    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 queryRtl(self):
        callModule(self.opts["mf"],
                   self.df,
                   "rt4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])
コード例 #5
0
ファイル: ar2020.py プロジェクト: paulmalherbe/Tartan
class ar2020(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        if self.opts["rtn"] not in (1, 2, 3):
            mes = "Invalid Routine %s" % str(self.opts["rtn"])
            showError(self.opts["mf"].body, "Control Error", mes)
            return
        self.gc = GetCtl(self.opts["mf"])
        assctl = self.gc.getCtl("assctl", self.opts["conum"])
        if not assctl:
            return
        self.glint = assctl["cta_glint"]
        self.rordp = assctl["cta_rordp"]
        tabs = [
            "assgrp", "assmst", "assdep", "asstrn", "ctlvmf", "ctlvrf",
            "ctlvtf", "genint", "genmst", "gentrn"
        ]
        self.sql = Sql(self.opts["mf"].dbm, tabs, prog=self.__class__.__name__)
        if self.sql.error:
            return
        if self.glint == "Y":
            # Check Sale of Asset Record
            ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            if self.gc.chkRec(self.opts["conum"], ctlctl, "ass_sls"):
                return
            self.slsac = ctlctl["ass_sls"]
            # Check for VAT Control
            if self.gc.chkRec(self.opts["conum"], ctlctl, ["vat_ctl"]):
                return
            self.convat = ctlctl["vat_ctl"]
            # Check All Group Control Records
            errs = ("Group %s Has An Invalid", "Asset Control Account (%s)",
                    "Accumulated Depreciation Account (%s)",
                    "Depreciation Expense Account (%s)")
            ass = self.sql.getRec(
                "assgrp",
                cols=["asg_group", "asg_assacc", "asg_depacc", "asg_expacc"],
                where=[("asg_cono", "=", self.opts["conum"])])
            for acc in ass:
                for x in range(1, 4):
                    chk = self.sql.getRec("genmst",
                                          where=[("glm_cono", "=",
                                                  self.opts["conum"]),
                                                 ("glm_acno", "=", acc[x])],
                                          limit=1)
                    if not chk:
                        mess = "%s %s" % (errs[0] % acc[0], errs[x] % acc[x])
                        showError(self.opts["mf"].body, "Control Error", mess)
                        return
        self.batchHeader()
        if not self.bh.batno:
            return
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        return True

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

    def drawDialog(self):
        grp = {
            "stype":
            "R",
            "tables": ("assgrp", ),
            "cols": (("asg_group", "", 0, "Grp"), ("asg_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("asg_cono", "=", self.opts["conum"])]
        }
        cod = {
            "stype":
            "R",
            "tables": ("assmst", ),
            "cols": (("asm_code", "", 0, "Cod-Num"), ("asm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("asm_cono", "=", self.opts["conum"])],
            "whera": [["C", "asm_group", 0, 1]]
        }
        vtm = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "C"), ("vtm_desc", "", 0,
                                                "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        glm = {
            "stype":
            "R",
            "tables": ("genmst", ),
            "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                      "Description", "Y")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        data = []
        for x in range(1, (len(armvtp) + 1)):
            data.append([x, armvtp[x - 1][1]])
        mov = {
            "stype": "C",
            "titl": "Valid Types",
            "head": ("C", "Description"),
            "data": data
        }
        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), "IUA", 3, "Grp", "Asset Group", "r", "N",
                self.doAssGrp, grp, None, None),
               (("C", 1, 0, 1), "INa", 7, "Cod-Num", "Asset Code", "r", "N",
                self.doAssCod, cod, None, ("notblank", )),
               (("C", 1, 0, 2), "ONA", 13, "Description"),
               (("C", 1, 0, 3), "INa", 9, "Reference", "Reference Number One",
                "i", "N", self.doTrnRef, None, None, ("notblank", )),
               (("C", 1, 0, 4), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 5), "IUI", 1, "M", "Movement Type", "r", "N",
                self.doTrnMov, mov, None, ("in", (1, 2, 3, 4, 5))),
               (("C", 1, 0, 6), "ISD", 13.2, "Company", "Company Amount", "",
                "N", self.doCoyAmt, None, None, None),
               (("C", 1, 0, 7), "ISD", 13.2, "Receiver", "Receiver Amount", "",
                "N", self.doRorAmt, None, None, None),
               (("C", 1, 0, 8), "IUA", 1, "V", "V.A.T Code", "C", "N",
                self.doVatCod, vtm, None, ("notblank", )),
               (("C", 1, 0, 9), "ISD", 13.2, "V.A.T", "V.A.T Amount", "", "N",
                self.doVatAmt, None, None, None),
               (("C", 1, 0,
                 10), "INA", (13, 30), "Details", "Transaction Details", "",
                "N", self.doTrnDet, None, None, None)]
        if self.opts["rtn"] not in (1, 2) and self.glint == "Y":
            fld.extend([[("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", 30, "Description"),
                        (("C", 2, 0,
                          2), "ISD", 13.2, "All-Amt", "Allocation Amount", "",
                         "N", self.doAllAmt, None, None, ("efld", )),
                        (("C", 2, 0, 3), "INA", 30, "Details", "", "", "N",
                         self.doAllDet, None, None, ("notblank", ))])
        but = (("Interrogate", None, self.queryAss, 0, ("C", 1, 1),
                ("C", 1, 2)), ("Cancel", None, self.doCancel, 0, ("C", 2, 1),
                               ("C", 1, 1)))
        tag = [("Transaction", None, None, None, False)]
        cnd = [(None, "n"), (self.endPage1, "y")]
        cxt = [None, self.exitPage1]
        if self.opts["rtn"] not in (1, 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 doAssGrp(self, frt, pag, r, c, p, i, w):
        whr = [("asg_cono", "=", self.opts["conum"]), ("asg_group", "=", w)]
        acc = self.sql.getRec("assgrp", where=whr, limit=1)
        if not acc:
            return "Invalid Asset Group"
        self.group = w
        self.depcod = acc[self.sql.assgrp_col.index("asg_depcod")]
        self.assacc = acc[self.sql.assgrp_col.index("asg_assacc")]
        self.depacc = acc[self.sql.assgrp_col.index("asg_depacc")]
        self.expacc = acc[self.sql.assgrp_col.index("asg_expacc")]

    def doAssCod(self, frt, pag, r, c, p, i, w):
        self.code = w
        self.buydt = 0
        self.seldt = 0
        col = ["asm_desc", "asm_depcod"]
        whr = [("asm_cono", "=", self.opts["conum"]),
               ("asm_group", "=", self.group), ("asm_code", "=", self.code)]
        acc = self.sql.getRec("assmst", cols=col, where=whr, limit=1)
        if not acc:
            ok = askQuestion(screen=self.opts["mf"].body,
                             head="New Asset",
                             mess="Asset does not exist, Create?")
            if ok == "no":
                return "Invalid Asset"
            self.doNewAsset()
            acc = self.sql.getRec("assmst", cols=col, where=whr, limit=1)
            if not acc:
                return "Asset Not Found"
            self.new = "y"
        else:
            self.new = "n"
        dep = self.sql.getRec("assdep",
                              cols=["asd_rate1r"],
                              where=[("asd_cono", "=", self.opts["conum"]),
                                     ("asd_code", "=", acc[1])],
                              limit=1)
        self.rate1r = dep[0]
        col = ["ast_date"]
        whr = [("ast_cono", "=", self.opts["conum"]),
               ("ast_group", "=", self.group), ("ast_code", "=", self.code),
               ("ast_mtyp", "=", 1)]
        pur = self.sql.getRec("asstrn", cols=col, where=whr, limit=1)
        if pur:
            self.buydt = pur[0]
        whr = [("ast_cono", "=", self.opts["conum"]),
               ("ast_group", "=", self.group), ("ast_code", "=", self.code),
               ("ast_mtyp", "in", (3, 5))]
        sel = self.sql.getRec("asstrn", cols=col, where=whr, limit=1)
        if sel:
            self.seldt = sel[0]
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])

    def doTrnRef(self, frt, pag, r, c, p, i, w):
        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
        if self.new == "y":
            self.trnmov = 1
            self.df.loadEntry(frt, pag, p + 1, data=self.trnmov)
            return "sk1"

    def doTrnMov(self, frt, pag, r, c, p, i, w):
        if type(w) == list:
            w = w[0] + 1
        # Do some tests to see if not new again or already sold etc.
        if w == 4 and self.opts["rtn"] != 3:
            return "Depreciation Only Allowed with Journal Entries"
        if self.opts["rtn"] == 1 and w not in (1, 2):
            return "Invalid Choice For Payment"
        if self.opts["rtn"] == 2 and w not in (5, ):
            return "Invalid Choice For Receipt"
        if w == 1 and self.buydt:
            return "Asset Already Purchased"
        if w in (2, 3, 4, 5) and self.seldt:
            return "Asset Already Sold or Written Off"
        if w in (2, 3, 4, 5) and not self.buydt:
            return "Asset Not Yet Purchased"
        self.df.loadEntry(frt, pag, p, data=w)
        self.trnmov = w
        if self.trnmov == 3:
            bal = self.sql.getRec("asstrn",
                                  cols=["sum(ast_amt1)", "sum(ast_amt2)"],
                                  where=[("ast_cono", "=", self.opts["conum"]),
                                         ("ast_group", "=", self.group),
                                         ("ast_code", "=", self.code)],
                                  limit=1)
            self.coyamt = float(ASD(0) - ASD(bal[0]))
            self.df.loadEntry(frt, pag, p + 1, data=self.coyamt)
            self.roramt = float(ASD(0) - ASD(bal[0]))
            self.df.loadEntry(frt, pag, p + 2, data=self.roramt)
            self.vatcode = ""
            self.trnvat = 0
            return "sk4"

    def doCoyAmt(self, frt, pag, r, c, p, i, w):
        if self.opts["rtn"] == 3 and self.trnmov == 5 and w > 0:
            ok = askQuestion(screen=self.opts["mf"].body,
                             head="Debit",
                             mess="Should this Amount not be a Credit Entry?")
            if ok == "yes":
                w = float(ASD(0) - ASD(w))
                self.df.loadEntry(frt, pag, p, data=w)
        self.coyamt = w
        if self.rordp == "N" or not self.rate1r or self.trnmov != 4:
            self.roramt = 0
            self.df.loadEntry(frt, pag, p + 1, data=self.roramt)
            if self.trnmov == 4:
                self.vatcode = ""
                self.trnvat = 0
                self.df.loadEntry(frt, pag, p + 2, data=self.vatcode)
                self.df.loadEntry(frt, pag, p + 3, data=self.trnvat)
                return "sk3"
            return "sk1"

    def doRorAmt(self, frt, pag, r, c, p, i, w):
        if self.opts["rtn"] == 3 and self.trnmov == 5 and w > 0:
            ok = askQuestion(screen=self.opts["mf"].body,
                             head="Debit",
                             mess="Should this Amount not be a Credit Entry?")
            if ok == "yes":
                w = float(ASD(0) - ASD(w))
                self.df.loadEntry(frt, pag, p, data=w)
        self.roramt = w
        self.vatcode = ""
        self.trnvat = 0
        self.df.loadEntry(frt, pag, p + 1, data=self.vatcode)
        self.df.loadEntry(frt, pag, p + 2, data=self.trnvat)
        return "sk2"

    def doVatCod(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.trnvat = round((self.coyamt * vrte / (vrte + 100)), 2)
        self.df.loadEntry(frt, pag, p + 1, data=self.trnvat)
        if not self.trnvat:
            return "sk1"

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

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

    def endPage1(self):
        self.batupd = False
        self.updateTables1()
        self.updateBatch()
        if self.coyamt == 0:
            self.df.advanceLine(1)
        else:
            self.allocated = float(0.0)
            if self.glint == "N" or self.opts["rtn"] in (1, 2) or \
                    self.trnmov == 4:
                self.opts["mf"].dbm.commitDbase()
                self.df.advanceLine(1)
            else:
                self.coyamt = float(ASD(0) - ASD(self.coyamt))
                self.df.loadEntry("T", 2, 0, data=self.coyamt)
                self.df.selPage("Allocation")
                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.coyamt
        self.vat = self.trnvat
        if self.trnmov == 4:
            self.net = float(ASD(0) - ASD(self.coyamt))
            self.ror = float(ASD(0) - ASD(self.roramt))
        else:
            self.net = self.ror = float(ASD(self.coyamt) - ASD(self.trnvat))
        if self.opts["rtn"] == 1:  # Payments
            if self.coyamt == 0:
                self.recon = self.curdt
            else:
                self.recon = 0
            acc = self.assacc
            self.glt = 2
        elif self.opts["rtn"] == 2:  # Receipts
            if self.coyamt == 0:
                self.recon = self.curdt
            else:
                self.recon = 0
            self.amt = float(ASD(0) - ASD(self.amt))
            self.vat = float(ASD(0) - ASD(self.vat))
            self.net = float(ASD(0) - ASD(self.net))
            acc = self.assacc
            self.glt = 6
        elif self.opts["rtn"] == 3:  # Journal Entries
            self.recon = 0
            if self.trnmov == 4:
                acc = self.depacc
            else:
                acc = self.assacc
            self.glt = 4
        # Asset Register Transaction
        data = [
            self.opts["conum"], self.group, self.code, self.opts["rtn"],
            self.trnref, self.bh.batno, self.trndat, self.trnmov, self.net,
            self.ror, self.vat, self.curdt, self.trndet, self.vatcode, "N",
            self.opts["capnm"], self.sysdtw, 0
        ]
        self.sql.insRec("asstrn", data=data)
        if self.vatcode:
            # VAT Transaction (ctlvtf)
            data = (self.opts["conum"], self.vatcode, "I", self.curdt, "A",
                    self.opts["rtn"], self.bh.batno, self.trnref, self.trndat,
                    self.code, self.trndet, self.amt, self.vat, 0,
                    self.opts["capnm"], self.sysdtw, 0)
            self.sql.insRec("ctlvtf", data=data)
        if self.glint == "N":
            return
        # General Ledger Asset or Depreciation Account
        data = (self.opts["conum"], acc, self.curdt, self.trndat, self.glt,
                self.trnref, self.bh.batno, self.net, self.vat, self.trndet,
                self.vatcode, "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        if self.vat:
            # General Ledger Control Transaction (V.A.T.)
            data = [
                self.opts["conum"], self.convat, self.curdt, self.trndat,
                self.glt, self.trnref, self.bh.batno, self.vat, 0.00,
                self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("gentrn", data=data)
        self.amt = float(ASD(0) - ASD(self.amt))
        if self.opts["rtn"] in (1, 2):
            # General Ledger Control Transaction (Bank)
            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)
        elif self.trnmov == 4:
            # General Ledger Expense Account (Depreciation)
            data = [
                self.opts["conum"], self.expacc, self.curdt, self.trndat,
                self.glt, self.trnref, self.bh.batno, self.coyamt, self.vat,
                self.trndet, "N", "", self.recon, self.opts["capnm"],
                self.sysdtw, 0
            ]
            self.sql.insRec("gentrn", data=data)
        if self.trnmov == 5:
            # Sale of Asset
            # Raise Depreciation
            callModule(self.opts["mf"],
                       None,
                       "ar2030",
                       coy=(self.opts["conum"], self.opts["conam"]),
                       period=self.opts["period"],
                       user=self.opts["capnm"],
                       args=(self.curdt, self.group, self.code))
            # Generate Sale
            amt = self.sql.getRec("asstrn",
                                  cols=["sum(ast_amt1)"],
                                  where=[("ast_cono", "=", self.opts["conum"]),
                                         ("ast_group", "=", self.group),
                                         ("ast_code", "=", self.code)],
                                  limit=1)
            if amt[0]:
                data = [
                    self.opts["conum"], self.slsac, self.curdt, self.trndat,
                    self.glt, self.trnref, self.bh.batno, amt[0], 0,
                    self.trndet, "N", "", 0, self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
                data[1] = acc
                data[7] = float(ASD(0) - ASD(amt[0]))
                self.sql.insRec("gentrn", data=data)

    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
        self.genacc = w
        self.df.loadEntry("C", pag, p + 1, data=chk[0])

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

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

    def doCancel(self):
        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("Transaction")
            row = int(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 endPage2(self):
        self.updateTables2()
        self.allocated = float(ASD(self.allocated) + ASD(self.allamt))
        if self.allocated == self.coyamt:
            self.opts["mf"].dbm.commitDbase()
            self.df.clearFrame("C", 2)
            self.df.selPage("Transaction")
            self.df.advanceLine(1)
        else:
            bal = float(ASD(self.coyamt) - 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
        # General Ledger Transaction (Allocation)
        amt = float(ASD(0) - ASD(self.allamt))
        data = (self.opts["conum"], self.genacc, self.curdt, self.trndat,
                self.glt, self.trnref, self.bh.batno, amt, 0.00, self.alldet,
                "N", "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)

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

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

    def doNewAsset(self):
        tit = ("Create New Asset", )
        dep = {
            "stype":
            "R",
            "tables": ("assdep", ),
            "cols": (("asd_code", "", 0, "Cod"), ("asd_desc", "", 0,
                                                  "Description", "Y")),
            "where": [("asd_cono", "=", self.opts["conum"])]
        }
        self.fld = ((("T", 0, 0, 0), "INA", 30, "Description", "", "", "N",
                     None, None, None, ("notblank", )),
                    (("T", 0, 1, 0), "INa", 3, "Dep Code", "Depreciation Code",
                     self.depcod, "N", self.doDepCode, dep, None,
                     ("notblank", )), (("T", 0, 1, 0), "ONA", 34, ""))
        tnd = ((self.doNewEnd, "N"), )
        txt = (self.doNewXit, )
        state = self.df.disableButtonsTags()
        self.na = TartanDialog(self.opts["mf"],
                               tops=True,
                               title=tit,
                               eflds=self.fld,
                               tend=tnd,
                               txit=txt)
        self.na.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)

    def doDepCode(self, frt, pag, r, c, p, i, w):
        chk = self.sql.getRec("assdep",
                              cols=["asd_desc"],
                              where=[("asd_cono", "=", self.opts["conum"]),
                                     ("asd_code", "=", w)],
                              limit=1)
        if not chk:
            return "Invalid Depreciation Code"
        self.na.loadEntry(frt, pag, p + 1, data=chk[0])

    def doNewEnd(self):
        dat = [self.opts["conum"], self.group, self.code]
        for x in range(len(self.na.t_work[0][0]) - 1):
            dat.append(self.na.t_work[0][0][x])
        self.sql.insRec("assmst", data=dat)
        self.doNewXit()

    def doNewXit(self):
        self.na.closeProcess()

    def queryAss(self):
        callModule(self.opts["mf"],
                   self.df,
                   "ar4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=self.opts["period"],
                   user=self.opts["capnm"])
コード例 #6
0
ファイル: dr1010.py プロジェクト: paulmalherbe/Tartan
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")
コード例 #7
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()
コード例 #8
0
ファイル: rc4020.py プロジェクト: paulmalherbe/Tartan
class rc4020(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, ["rcaprm", "rcatnm", "rcacon",
            "rcatnt"], prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        rcactl = gc.getCtl("rcactl", self.opts["conum"])
        if not rcactl:
            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 Tenants Interrogation (%s)" % self.__class__.__name__)
        prm = {
            "stype": "R",
            "tables": ("rcaprm",),
            "cols": (
                ("rcp_owner", "", 0, "Own-Cod"),
                ("rcp_code", "", 0, "Prm-Code"),
                ("rcp_addr1", "", 0, "Address-Line-1")),
            "where": [("rcp_cono", "=", self.opts["conum"])],
            "index": 1}
        acc = {
            "stype": "R",
            "tables": ("rcatnm",),
            "cols": (
                ("rtn_acno", "", 0, "Acc-Num"),
                ("rtn_name", "", 0, "Name", "Y")),
            "where": [("rtn_cono", "=", self.opts["conum"])],
            "whera": (("T", "rtn_code", 0, 0),)}
        seq = {
            "stype": "R",
            "tables": ("rcacon",),
            "cols": (
                ("rcc_cnum", "", 0, "Acc-Num"),
                ("rcc_payind", "", 0, "F"),
                ("rcc_start", "", 0, "Start-Date"),
                ("rcc_period", "", 0, "Per")),
            "where": [("rcc_cono", "=", self.opts["conum"])],
            "whera": [["T", "rcc_code", 0, 0], ["T", "rcc_acno", 1, 0]]}
        tag = (
            ("Premises", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("Tenant", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("Balances", self.doTagSelect, ("T",0,2), ("T",0,1)),
            ("Transactions", self.doTrans1, ("T",0,2), ("T",0,1)),
            ("Deposit", self.doDeposit1, ("T",0,2), ("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",1,5,0),"OUD",6.2,"Commission Rate"),
            (("T",2,0,0),"ONA",20,"Telephone Number"),
            (("T",2,1,0),"OTX",50,"E-Mail Address"),
            (("T",2,2,0),"OUA",1,"VAT Indicator"),
            (("T",2,3,0),"ONA",10,"VAT Number"),
            (("T",2,4,0),"OUA",1,"Payment Frequency"),
            (("T",2,5,0),"OD1",10,"Start Date"),
            (("T",2,6,0),"OUI",3,"Number of Periods"),
            (("T",2,7,0),"OUD",12.2,"Rental Amount"),
            (("T",2,8,0),"OUD",12.2,"Deposit Amount"),
            (("T",2,9,0),"OUD",12.2,"Basic Water Amount"),
            (("T",2,9,0),"OUI",1,"Type"),
            (("T",2,10,0),"OUD",12.2,"Basic Exlectricity Amount"),
            (("T",2,10,0),"OUI",1,"Type"),
            (("T",2,11,0),"OUA",1,"Status"),
            (("C",3,0,0),"OSD",13.2,"Value","",
                "","N",None,None,None,None,("Details",7)),
            (("T",4,0,0),"IUI",3,"Sequence Number","",
                "N","N",self.doTrans2,seq,None,None),
            (("T",5,0,0),"ID1",10,"Effective Date","",
                self.sysdtw,"N",self.doDeposit2,None,None,("efld",)))
        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, None)
        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="Deposit     ")
        self.df.colLabel[3][1].configure(text="Rentals     ")
        self.df.colLabel[3][2].configure(text="Fees        ")
        self.df.colLabel[3][3].configure(text="Services (O)")
        self.df.colLabel[3][4].configure(text="Services (A)")
        self.df.colLabel[3][5].configure(text="Repairs  (A)")
        self.df.colLabel[3][6].configure(text="Balance     ")

    def doPremises(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("rcaprm", where=[("rcp_cono", "=",
            self.opts["conum"]), ("rcp_code", "=", w)], limit=1)
        if not acc:
            return "Invalid Premises"
        self.code = w
        self.owner = acc[self.sql.rcaprm_col.index("rcp_owner")]
        for num, fld in enumerate(acc[:-1]):
            if num > 2:
                self.df.loadEntry("T", 1, (num-3), data=fld)

    def doAccount(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("rcatnm", where=[("rtn_cono", "=",
            self.opts["conum"]), ("rtn_owner", "=", self.owner),
            ("rtn_code", "=", self.code), ("rtn_acno", "=", w)], limit=1)
        if not acc:
            return "Invalid Account"
        self.acno = w
        self.depdtw = self.sysdtw
        self.depdtd = self.sysdtd
        self.name = acc[self.sql.rcatnm_col.index("rtn_name")]
        con = self.sql.getRec("rcacon", where=[("rcc_cono", "=",
            self.opts["conum"]), ("rcc_owner", "=", self.owner),
            ("rcc_code", "=", self.code), ("rcc_acno", "=", self.acno)],
            order="rcc_cnum")
        if not con:
            return "Invalid Contract"
        self.df.loadEntry(frt, pag, p+1, data=self.name)
        for num, fld in enumerate(acc[5:-1]):
            self.df.loadEntry("T", 2, num, data=fld)
        self.cnum = con[-1:][0][4]
        self.df.topf[4][0][5] = self.cnum
        for num, fld in enumerate(con[-1:][0][5:-1]):
            self.df.loadEntry("T", 2, num+4, 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
        dep = 0
        fee = 0
        svo = 0
        sva = 0
        rep = 0
        bal = self.sql.getRec("rcatnt", cols=["rtu_mtyp",
            "round(sum(rtu_tramt), 2)"], where=[("rtu_cono", "=",
            self.opts["conum"]), ("rtu_owner", "=", self.owner),
            ("rtu_code", "=", self.code), ("rtu_acno", "=", self.acno)],
            group="rtu_mtyp")
        if bal:
            for a in bal:
                if a[0] == 1:
                    rtl = a[1]
                if a[0] == 2:
                    dep = a[1]
                if a[0] == 3:
                    fee = a[1]
                if a[0] == 4:
                    svo = a[1]
                if a[0] == 5:
                    sva = a[1]
                if a[0] == 6:
                    rep = a[1]
        bal = float(ASD(rtl) + ASD(fee) + ASD(svo) + ASD(sva) + ASD(rep))
        self.df.loadEntry("C", 3, 0, data=dep)
        self.df.loadEntry("C", 3, 1, data=rtl)
        self.df.loadEntry("C", 3, 2, data=fee)
        self.df.loadEntry("C", 3, 3, data=svo)
        self.df.loadEntry("C", 3, 4, data=sva)
        self.df.loadEntry("C", 3, 5, data=rep)
        self.df.loadEntry("C", 3, 6, data=bal)
        self.trn = self.sql.getRec("rcatnt", where=[("rtu_cono", "=",
            self.opts["conum"]), ("rtu_owner", "=", self.owner), ("rtu_code",
            "=", self.code), ("rtu_acno", "=", self.acno)],
            order="rtu_trdt, rtu_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 - %s" % \
            (self.owner, self.code, self.acno, self.name)
        tab = ["rcatnt"]
        col = (
            ("rtu_trdt", "", 0, "   Date"),
            ("rtu_curdt", "", 0, "Curr-Dt"),
            ("rtu_batch", "", 0, "Batch"),
            ("rtu_type", ("XX", rctrtp), 3, "Typ"),
            ("rtu_mtyp", ("XX", rcmvtp), 3, "Mov"),
            ("rtu_refno", "", 0, "Reference", "Y"),
            ("rtu_tramt", "", 0, "     Amount"),
            ("rtu_taxamt", "", 0, " VAT-Amount"),
            ("rtu_desc", "", 0, "Details"))
        whr = [
            ("rtu_cono", "=", self.opts["conum"]),
            ("rtu_owner", "=", self.owner),
            ("rtu_code", "=", self.code),
            ("rtu_acno", "=", self.acno)]
        if w:
            whr.append(("rtu_cnum", "=", w))
        odr = "rtu_trdt, rtu_type"
        state = self.df.disableButtonsTags()
        SRec(self.opts["mf"], screen=self.df.nb.Page3, title=tit, tables=tab,
            cols=col, where=whr, order=odr)
        self.df.enableButtonsTags(state=state)
        self.doTrans1()

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

    def doDeposit2(self, frt, pag, r, c, p, i, w):
        self.depdtw = w
        self.depdtd = self.df.t_disp[pag][0][p]
        dat = getDeposit(self.opts["mf"], self.opts["conum"], self.depdtw,
            self.owner, self.code, self.acno)
        if dat:
            tit = "Deposit for Account: %s %s %s - %s as at %s" % (self.owner,
                self.code, self.acno, self.name, self.depdtd)
            col = (
                ("a", "D1", 10, "    Date"),
                ("b", "SD", 11.2, "  Deposits"),
                ("c", "UI", 5, " Days"),
                ("d", "UD", 5.2, " Rate"),
                ("e", "SD", 11.2, "  Interest"),
                ("f", "SD", 11.2, "   Balance"),
                ("g", "SD", 11.2, "     Admin"))
            state = self.df.disableButtonsTags()
            SRec(self.opts["mf"], screen=self.df.nb.Page4, title=tit, cols=col,
                where=dat, wtype="D")
            self.df.enableButtonsTags(state=state)
        self.doDeposit1()

    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"], "RCA", "%7s%7s%s" % (self.owner, 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 = (
            ("Info Only", "I"),
            ("Deposit Only", "D"),
            ("Transactions Only", "T"),
            ("Info and Transactions", "B"),
            ("None", "N"))
        self.doPrintOption(askChoice(self.opts["mf"].body, "Print Options",
            mess, butt=butt))
        self.df.selPage("Premises")
        self.df.focusField("T", 1, 1)

    def doPrintOption(self, opt):
        if opt == "N":
            return
        self.head = "%03u %-105s" % (self.opts["conum"], self.opts["conam"])
        self.fpdf = MyFpdf(name=self.__class__.__name__, head=self.head)
        self.pglin = 999
        if opt not in ("D", "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 == "D":
            recs = getDeposit(self.opts["mf"], self.opts["conum"], self.depdtw,
                self.owner, self.code, self.acno)
            if recs:
                self.pageHeading(deposit=True)
                self.pageHeadingDeposit()
                self.printDeposit(recs)
                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 = (
            "Deposit     ",
            "Rentals     ",
            "Fees        ",
            "Services (O)",
            "Services (A)",
            "Repairs  (A)",
            "Balance     ")
        for n, d in enumerate(self.df.c_disp[3]):
            self.fpdf.drawText("%26s%-34s %13s" % ("", desc[n], d[0]))

    def printDeposit(self, recs):
        tot1 = 0
        tot2 = 0
        tot3 = 0
        for ct in recs:
            date = CCD(ct[0], "D1", 10)
            move = CCD(ct[1], "SD", 13.2)
            days = CCD(ct[2], "UI", 5)
            rate = CCD(ct[3], "UD", 5.2)
            intr = CCD(ct[4], "SD", 13.2)
            bals = CCD(ct[5], "SD", 13.2)
            admn = CCD(ct[6], "SD", 13.2)
            tot1 = float(ASD(tot1) + ASD(move.work))
            tot2 = float(ASD(tot2) + ASD(intr.work))
            tot3 = float(ASD(tot3) + ASD(admn.work))
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
                self.pageHeadingDeposit()
            self.fpdf.drawText("%s %s %s %s %s %s %s" % (date.disp, move.disp,
                days.disp, rate.disp, intr.disp, bals.disp, admn.disp))
            self.pglin += 1
        self.fpdf.setFont(style="B")
        self.fpdf.underLine(txt=self.head)
        move = CCD(tot1, "SD", 13.2)
        intr = CCD(tot2, "SD", 13.2)
        admn = CCD(tot3, "SD", 13.2)
        self.fpdf.drawText("%-10s %s %11s %s %s %s" % ("Totals", move.disp, "",
            intr.disp, bals.disp, admn.disp))

    def printTrans(self):
        col = self.sql.rcatnt_col
        bal = 0
        for ct in self.trn:
            trdt = CCD(ct[col.index("rtu_trdt")], "D1", 10)
            refno = CCD(ct[col.index("rtu_refno")], "Na", 9)
            trtp = CCD(ct[col.index("rtu_type")], "UI", 1)
            mtyp = CCD(ct[col.index("rtu_mtyp")], "UI", 1)
            batch = CCD(ct[col.index("rtu_batch")], "Na", 7)
            desc = CCD(ct[col.index("rtu_desc")], "NA", 30)
            tramt = ct[col.index("rtu_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)
            if mtyp.work != 2:
                bal = float(ASD(bal) + ASD(tramt))
            tot = CCD(bal, "SD", 13.2)
            taxamt = CCD(ct[col.index("rtu_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 %s" % (trdt.disp,
                refno.disp, rctrtp[(trtp.work - 1)][0],
                rcmvtp[(mtyp.work - 1)][0], batch.disp, desc.disp,
                debit.disp, credit.disp, tot.disp, taxamt.disp))
            self.pglin += 1

    def pageHeading(self, deposit=False):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        if deposit:
            self.fpdf.drawText("%-42s %-10s" % \
                ("Rentals Ledger Deposit Interrogation as at", self.depdtd))
        else:
            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 pageHeadingDeposit(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 %-13s %-5s %-5s %-13s %-13s %-13s" % \
            ("   Date", "    Deposits", " Days", " Rate", "    Interest",
            "     Balance", "       Admin"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 8

    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 %-3s %-7s %-30s %-13s %-13s "\
            "%-13s" % ("   Date", "Reference", "Typ", "Mov", "Batch",
            "Remarks", "       Debit", "      Credit",  "     Balance"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 8

    def doExit(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
コード例 #9
0
ファイル: rc2010.py プロジェクト: paulmalherbe/Tartan
class rc2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        tabs = [
            "ctlmst", "ctlvmf", "ctlvrf", "ctlvtf", "genmst", "gentrn",
            "rcaowm", "rcaowt", "rcaprm", "rcatnm", "rcacon", "rcatnt"
        ]
        self.sql = Sql(self.opts["mf"].dbm, tabs, 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
        self.taxdf = ctlmst["ctm_taxdf"]
        rcactl = gc.getCtl("rcactl", self.opts["conum"])
        if not rcactl:
            return
        self.glint = rcactl["cte_glint"]
        self.ch1 = ((rcactl["cte_lme"] // 100) * 100) + 1
        self.ch2 = projectDate(self.ch1, 2, typ="months")
        if self.glint == "Y":
            self.glbnk = rcactl["cte_glbnk"]
            ctlctl = gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = [
                "rca_com", "rca_dep", "rca_fee", "rca_orx", "rca_own",
                "rca_tnt", "rca_trx", "vat_ctl"
            ]
            if gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.rcacom = ctlctl["rca_com"]
            self.rcadep = ctlctl["rca_dep"]
            self.rcafee = ctlctl["rca_fee"]
            self.rcaorx = ctlctl["rca_orx"]
            self.rcaown = ctlctl["rca_own"]
            self.rcatnt = ctlctl["rca_tnt"]
            self.rcatrx = ctlctl["rca_trx"]
            self.convat = ctlctl["vat_ctl"]
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.batno = "R%04i%02i" % (t[0], t[1])
        return True

    def drawDialog(self):
        # Transaction Types
        typ = {
            "stype": "C",
            "titl": "Select the Required Type",
            "head": ("C", "Type"),
            "data": []
        }
        # Movement Types
        data = []
        for x in range(1, len(rcmvtp) + 1):
            data.append((x, rcmvtp[x - 1][1]))
        mov = {
            "stype": "C",
            "titl": "Select the Required Type",
            "head": ("C", "Type"),
            "data": data
        }
        # Premises
        prm = {
            "stype":
            "R",
            "tables": ("rcaprm", "rcaowm"),
            "cols":
            (("rcp_owner", "", 0, "Owner"), ("rom_name", "", 0, "Owner"),
             ("rcp_code", "", 0, "Prm-Cod"), ("rcp_addr1", "", 0,
                                              "Address-Line-1")),
            "where": [("rcp_cono", "=", self.opts["conum"]),
                      ("rom_cono=rcp_cono", ), ("rom_acno=rcp_owner", )],
            "index":
            2
        }
        # Tenant
        tnm = {
            "stype":
            "R",
            "tables": ("rcatnm", ),
            "cols": (("rtn_acno", "", 0, "Acc-Num"), ("rtn_name", "", 0,
                                                      "Description", "Y")),
            "where": [("rtn_cono", "=", self.opts["conum"])],
            "whera": [("T", "rtn_owner", 0, 1)]
        }
        # Contract
        con = {
            "stype":
            "R",
            "tables": ("rcacon", ),
            "cols": (("rcc_cnum", "", 0, "Seq"), ("rcc_payind", "", 0, "F"),
                     ("rcc_start", "", 0, "Start-Date"),
                     ("rcc_period", "", 0, "Per"), ("rcc_status", "", 0, "S")),
            "where": [("rcc_cono", "=", self.opts["conum"])],
            "whera": [("T", "rcc_owner", 0, 1), ("T", "rcc_code", 0, 0),
                      ("T", "rcc_acno", 0, 2)]
        }
        # VAT Records
        vtm = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "C"), ("vtm_desc", "", 0,
                                                "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        tag = (
            (
                "Owner",
                None,
                (("T", 2, 1), ("C", 2, 1)),  # On
                (("C", 1, 1), ("T", 2, 2), ("C", 2, 2))),  # Off
            (
                "Tenant",
                None,
                ("C", 1, 1),  # On
                (("C", 1, 2), ("T", 2, 1), ("C", 2, 1))),  # Off
            ("Allocation", self.doAllocation, None, None))
        fld = [
            (("T", 0, 0, 0), "INA", 7, "Prm-Cod", "Premises Code", "", "Y",
             self.doPrmCod, prm, None, None),
            (("T", 0, 0, 0), "ONA", 30, "Description"),
            (("T", 1, 0, 0), "ONA", 7, "Acc-Num"),
            (("T", 1, 0, 0), "ONA", 30, "Name"),
            (("T", 1, 0, 0), "OSD", 11.2, "Payable"),
            (("C", 1, 0, 0), "INa", 9, "Reference", "Reference Number", "i",
             "Y", self.doOwnRef, None, None, ("notblank", )),
            (("C", 1, 0, 1), "ID1", 10, "Date", "Transaction Date", "r", "N",
             self.doOwnDat, None, None, ("efld", )),
            (("C", 1, 0, 2), "IUI", 1, "T", "Transaction Type", "r", "N",
             self.doOwnTyp, typ, None, ("notzero", )),
            (("C", 1, 0, 3), "ISD", 11.2, "Amount", "Transaction Amount", "",
             "N", self.doOwnAmt, None, None, None),
            (("C", 1, 0, 4), "IUA", 1, "V", "V.A.T Code", "N", "N",
             self.doOwnCod, vtm, None, ("efld", )),
            (("C", 1, 0, 5), "ISD", 11.2, "V.A.T", "V.A.T Amount", "", "N",
             self.doOwnVat, None, None, None),
            (("C", 1, 0, 6), "INA", 47, "Details", "Transaction Details", "",
             "N", self.doOwnDet, None, None, None),
            (("T", 2, 0, 0), "INA", 7, "Acc-Num", "Account Number", "", "Y",
             self.doAccNum, tnm, None, None),
            (("T", 2, 0, 0), "ONA", 30, "Name"),
            (("T", 2, 0, 0), "IUI", 3, "Seq", "Contract Number", "", "N",
             self.doConSeq, con, None, None),
            (("T", 2, 0, 0), "OSD", 11.2, "Balance"),
            (("C", 2, 0, 0), "INa", 9, "Reference", "Reference Number", "i",
             "Y", self.doTntRef, None, None, ("notblank", )),
            (("C", 2, 0, 1), "ID1", 10, "Date", "Transaction Date", "r", "N",
             self.doTntDat, None, None, ("efld", )),
            (("C", 2, 0, 2), "IUI", 1, "T", "Transaction Type", "r", "N",
             self.doTntTyp, typ, None, ("notzero", )),
            (("C", 2, 0, 3), "ISD", 11.2, "Amount", "Transaction Amount", "",
             "N", self.doTntAmt, None, None, None),
            (("C", 2, 0, 4), "INA", (60, 30), "Details", "Transaction Details",
             "", "N", self.doTntDet, None, None, None),
            (("T", 3, 0, 0), "OSD", 11.2, "Rentals     "),
            (("T", 3, 0, 0), "OSD", 11.2, "Deposit     "),
            (("T", 3, 0, 0), "OSD", 11.2, "Fees        "),
            (("T", 3, 1, 0), "OSD", 11.2, "Services (O)"),
            (("T", 3, 1, 0), "OSD", 11.2, "Services (A)"),
            (("T", 3, 1, 0), "OSD", 11.2, "Repairs     "),
            (("T", 3, 2, 0), "OSD", 11.2, "Allocation"),
            (("C", 3, 0, 0), "IUI", 1, "M", "Movement Type", "", "Y",
             self.doAllMov, mov, None, ("between", 1, 6)),
            (("C", 3, 0, 1), "ISD", 11.2, "Amount", "Allocation Amount", "",
             "N", self.doAllAmt, None, None, None),
            (("C", 3, 0, 2), "IUA", 1, "V", "V.A.T Code", "N", "N",
             self.doAllCod, vtm, None, ("efld", )),
            (("C", 3, 0, 3), "ISD", 11.2, "V.A.T", "V.A.T Amount", "", "N",
             self.doAllVat, None, None, None),
            (("C", 3, 0, 4), "INA", (50, 30), "Details", "Transaction Details",
             "", "N", self.doAllDet, None, None, None)
        ]
        row = [0, 4, 4, 10]
        tnd = [(self.endPage, "y"), (self.endPage, "y"), (self.endPage, "y"),
               (self.endPage, "y")]
        txt = [self.exitPage, self.exitPage, self.exitPage, self.exitPage]
        cnd = [(None, "n"), (self.endPage, "y"), (self.endPage, "y"),
               (self.endPage, "y")]
        cxt = [None, self.exitPage, self.exitPage, self.exitPage]
        but = (("Notes", None, self.allNotes, 0, ("T", 0, 0), ("T", 0, 1)),
               ("Statement", None, self.allStmnt, 0,
                (("C", 1, 1), ("C", 2, 1)), (("T", 0, 1), ("T", 2, 1))),
               ("Cancel", None, self.doAllCancel, 0, ("C", 3, 1), ("C", 2, 1)))
        self.df = TartanDialog(self.opts["mf"],
                               tags=tag,
                               eflds=fld,
                               rows=row,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)

    def doPrmCod(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec(
            "rcaprm",
            cols=["rcp_desc", "rcp_owner", "rcp_crate", "rcp_addr1"],
            where=[("rcp_cono", "=", self.opts["conum"]),
                   ("rcp_code", "=", w)],
            limit=1)
        if not acc:
            return "Invalid Premises Code"
        self.code = w
        desc, self.owner, self.crate, addr1 = acc
        if desc:
            self.df.loadEntry(frt, pag, p + 1, data=desc)
        else:
            self.df.loadEntry(frt, pag, p + 1, data=addr1)
        acc = self.sql.getRec("rcaowm",
                              cols=["rom_name", "rom_vatdf"],
                              where=[("rom_cono", "=", self.opts["conum"]),
                                     ("rom_acno", "=", self.owner)],
                              limit=1)
        if not acc:
            return "Missing Owner Record (%s)" % self.owner
        self.df.loadEntry("T", 1, 0, data=self.owner)
        self.df.loadEntry("T", 1, 1, data=acc[0])
        self.vatdf = acc[1]
        self.acno = None

    def doAccNum(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("rcatnm",
                              cols=["rtn_name"],
                              where=[("rtn_cono", "=", self.opts["conum"]),
                                     ("rtn_owner", "=", self.owner),
                                     ("rtn_code", "=", self.code),
                                     ("rtn_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        self.acno = w
        self.name = acc[0]
        self.df.loadEntry(frt, pag, p + 1, data=self.name)
        con = self.sql.getRec("rcacon",
                              where=[("rcc_cono", "=", self.opts["conum"]),
                                     ("rcc_owner", "=", self.owner),
                                     ("rcc_code", "=", self.code),
                                     ("rcc_acno", "=", self.acno)],
                              order="rcc_cnum")
        if not con:
            return "No Valid Contracts"
        self.cnum = con[-1:][0][self.sql.rcacon_col.index("rcc_cnum")]
        self.df.topf[2][2][5] = self.cnum

    def doConSeq(self, frt, pag, r, c, p, i, w):
        con = self.sql.getRec("rcacon",
                              where=[("rcc_cono", "=", self.opts["conum"]),
                                     ("rcc_code", "=", self.code),
                                     ("rcc_acno", "=", self.acno),
                                     ("rcc_cnum", "=", w)],
                              order="rcc_cnum")
        if not con:
            return "Invalid Contract Sequence"
        self.cnum = w
        self.showTenantBalance()

    def doOwnRef(self, frt, pag, r, c, p, i, w):
        self.trnref = w

    def doOwnDat(self, frt, pag, r, c, p, i, w):
        if w < self.ch1 or w > self.ch2:
            ov = PwdConfirm(self.opts["mf"],
                            conum=self.opts["conum"],
                            system="RCA",
                            code="DateOver")
            if ov.flag == "no":
                return "Invalid Date (< %s or > %s)" % (self.ch1, self.ch2)
        self.trndat = w
        data = []
        for x in range(2, len(rctrtp) + 1):
            data.append((x, rctrtp[x - 1][1]))
        self.df.colf[1][2][8]["data"] = data

    def doOwnTyp(self, frt, pag, r, c, p, i, w):
        if w not in (2, 3, 4):
            return "Invalid Transaction Type"
        self.trntyp = w

    def doOwnAmt(self, frt, pag, r, c, p, i, w):
        if self.trntyp == 3 and w > self.due:
            op = PwdConfirm(self.opts["mf"],
                            conum=self.opts["conum"],
                            system="RCA",
                            code="Overpaid")
            if op.flag == "no":
                return "Overpaid"
        self.trnamt = w
        # Ignore VAT at this stage
        self.vatcode = ""
        self.trnvat = 0
        self.df.loadEntry(frt, pag, p + 1, data=self.vatcode)
        self.df.loadEntry(frt, pag, p + 2, data=self.trnvat)
        return "sk2"

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

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

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

    #    if self.trnamt < 0 and w > 0:
    #        self.trnvat = float(ASD(0) - ASD(w))
    #    elif self.trnamt > 0 and w < 0:
    #        self.trnvat = float(ASD(0) - ASD(w))
    #    else:
    #        self.trnvat = w
    #    self.df.loadEntry(frt, pag, p, data=self.trnvat)

    def doOwnDet(self, frt, pag, r, c, p, i, w):
        self.trndet = w

    def doTntRef(self, frt, pag, r, c, p, i, w):
        self.trnref = w

    def doTntDat(self, frt, pag, r, c, p, i, w):
        if w < self.ch1 or w > self.ch2:
            ov = PwdConfirm(self.opts["mf"],
                            conum=self.opts["conum"],
                            system="RCA",
                            code="DateOver")
            if ov.flag == "no":
                return "Invalid Date (< %s or > %s)" % (self.ch1, self.ch2)
        self.trndat = w
        data = []
        for x in range(1, len(rctrtp) + 1):
            data.append((x, rctrtp[x - 1][1]))
        self.df.colf[2][2][8]["data"] = data

    def doTntTyp(self, frt, pag, r, c, p, i, w):
        if w not in (1, 2, 3, 4):
            return "Invalid Transaction Type"
        self.trntyp = w

    def doTntAmt(self, frt, pag, r, c, p, i, w):
        self.trnamt = w
        if self.trntyp == 1:
            # Rental Raised
            self.vatcode = self.vatdf
            vrte = getVatRate(self.sql, self.opts["conum"], self.vatcode,
                              self.trndat)
            if vrte is None:
                vrte = 0.0
            self.trnvat = round((w * vrte / (vrte + 100)), 2)
            self.df.loadEntry(frt, pag, p + 1, data="Rental Raised")
        else:
            # Ignore VAT at this stage
            self.vatcode = ""
            self.trnvat = 0

    def doTntDet(self, frt, pag, r, c, p, i, w):
        self.trndet = w

    def doAllocation(self):
        self.df.setWidget(self.df.B1, state="normal")

    def doAllMov(self, frt, pag, r, c, p, i, w):
        if w == 2 and self.trntyp not in (2, 3):
            return "Deposits Only Allowed for Receipts and Payments"
        self.allmov = w

    def doAllAmt(self, frt, pag, r, c, p, i, w):
        if not w:
            self.allamt = float(ASD(self.trnamt) - ASD(self.alltot))
            self.df.loadEntry(frt, pag, p, data=self.allamt)
        else:
            self.allamt = w
        if self.allmov == 2:
            # Deposit
            self.allcod = ""
            self.df.loadEntry(frt, pag, p + 1, data=self.allcod)
            self.allvat = 0
            self.df.loadEntry(frt, pag, p + 2, data=self.allvat)
            return "sk2"
        if self.trntyp in (2, 3):
            # Receipt or Payment
            self.df.loadEntry(frt, pag, p + 1, self.vatdf)
        if self.trntyp == 4 and self.allmov == 3:
            # Journal Fee
            self.df.loadEntry(frt, pag, p + 1, self.taxdf)
        else:
            self.allcod = ""
            self.allvat = 0

    def doAllCod(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.allcod = w
        self.allvat = round((self.allamt * vrte / (vrte + 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.trndet)
            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.trndet)

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

    def doAllCancel(self):
        self.allocs = []
        self.df.clearFrame("C", 3)
        self.df.setWidget(self.df.B1, state="disabled")
        self.df.selPage("Tenant")
        self.df.clearLine(2, int((self.df.last[2][1] - 1) / self.df.colq[2]),
                          "Y")

    def endPage(self):
        if self.df.frt == "T" and self.df.pag == 0:
            self.df.focusField("C", 1, 1)
        elif self.df.frt == "C" and self.df.pag == 1:
            # Owners
            self.updateTables()
            self.df.advanceLine(self.df.pag)
        elif self.df.frt == "T" and self.df.pag == 2:
            self.df.focusField("C", 2, 1)
        elif self.df.frt == "C" and self.df.pag == 2:
            # Tenants
            self.allocs = []
            self.alltot = 0.0
            if self.trntyp == 1:
                self.movtyp = 1
                self.updateTables()
                self.df.advanceLine(self.df.pag)
            else:
                self.df.selPage("Allocation")
                dpp = 0.0
                acc = self.sql.getRec("rcacon",
                                      cols=["rcc_deposit"],
                                      where=[("rcc_cono", "=",
                                              self.opts["conum"]),
                                             ("rcc_owner", "=", self.owner),
                                             ("rcc_code", "=", self.code),
                                             ("rcc_acno", "=", self.acno)],
                                      order="rcc_cnum")
                if acc:
                    dpo = acc[-1:][0][0]
                else:
                    dpo = 0.0
                dat = self.sql.getRec(
                    "rcatnt",
                    cols=["rtu_mtyp", "round(sum(rtu_tramt), 2)"],
                    where=[("rtu_cono", "=", self.opts["conum"]),
                           ("rtu_owner", "=", self.owner),
                           ("rtu_code", "=", self.code),
                           ("rtu_acno", "=", self.acno)],
                    group="rtu_mtyp",
                    order="rtu_mtyp")
                if dat:
                    for d in dat:
                        if d[0] == 2:
                            dpp = d[1]
                        else:
                            self.df.loadEntry("T", 3, d[0] - 1, data=d[1])
                dpo = float(ASD(dpo) + ASD(dpp))
                if dpo:
                    self.df.loadEntry("T", 3, 1, data=dpo)
                self.df.loadEntry("T", 3, 6, data=self.trnamt)
                self.df.focusField("C", 3, 1)
        else:
            # Allocations
            self.allocs.append(
                [self.allmov, self.allamt, self.allcod, self.allvat])
            self.alltot = float(ASD(self.alltot) + ASD(self.allamt))
            bal = float(ASD(self.trnamt) - ASD(self.alltot))
            if bal:
                pos = self.allmov - 1
                if self.trntyp == 2:
                    a = float(
                        ASD(self.df.t_work[3][0][pos]) - ASD(self.allamt))
                else:
                    a = float(
                        ASD(self.df.t_work[3][0][pos]) + ASD(self.allamt))
                self.df.loadEntry("T", 3, pos, data=a)
                self.df.loadEntry("T", 3, 6, data=bal)
                self.df.advanceLine(3)
            else:
                for line in self.allocs:
                    self.movtyp, self.trnamt, self.vatcode, self.trnvat = line
                    self.updateTables()
                self.df.clearFrame("C", 3)
                self.df.selPage("Tenant")
                self.df.advanceLine(2)
        self.showOwnerTrans()
        if self.acno:
            self.showTenantTrans()

    def showOwnerTrans(self):
        whr = [("rot_cono", "=", self.opts["conum"]),
               ("rot_acno", "=", self.owner)]
        tot = self.sql.getRec("rcaowt",
                              cols=["round(sum(rot_tramt),2)"],
                              where=[("rot_cono", "=", self.opts["conum"]),
                                     ("rot_acno", "=", self.owner)],
                              limit=1)
        if not tot or not tot[0]:
            self.due = 0
        else:
            self.due = float(ASD(0) - ASD(tot[0]))
        arr = self.sql.getRec("rcatnt",
                              cols=["round(sum(rtu_tramt),2)"],
                              where=[("rtu_cono", "=", self.opts["conum"]),
                                     ("rtu_owner", "=", self.owner),
                                     ("rtu_mtyp", "in", (1, 4))],
                              limit=1)
        if arr and arr[0]:
            self.due = float(ASD(self.due) - ASD(arr[0]))
        self.df.loadEntry("T", 1, 2, data=self.due)
        tab = ["rcaowt"]
        col = [
            "rot_trdt", "rot_type", "rot_refno", "rot_desc", "rot_tramt",
            "rot_taxamt"
        ]
        whr = [("rot_cono", "=", self.opts["conum"]),
               ("rot_acno", "=", self.owner)]
        odr = "rot_trdt, rot_type, rot_refno"
        dat = self.sql.getRec(tables=tab, cols=col, where=whr, order=odr)
        data = []
        bals = 0
        for d in dat:
            bals = float(ASD(bals) + ASD(d[4]))
            data.append(d + [bals])
        col = (("rot_trdt", "Trans-Date", 10, "D1",
                "N"), ("rot_type", "Typ", 3, ("XX", rctrtp),
                       "N"), ("rot_refno", "Reference", 9, "Na",
                              "N"), ("rot_desc", "Details", 39, "NA", "N"),
               ("rot_tramt", "Amount", 11.2, "SD",
                "N"), ("rot_taxamt", "VAT-Amount", 11.2, "SD",
                       "N"), ("balance", "Balance", 15.2, "SD", "N"))
        try:
            self.otrn.closeProcess()
        except:
            pass
        self.otrn = SelectChoice(self.df.topPage1,
                                 None,
                                 col,
                                 data,
                                 wait=False,
                                 neww=False,
                                 butt=False,
                                 sort=False,
                                 live=False,
                                 modal=False,
                                 lines=9)

    def showTenantTrans(self):
        tab = ["rcatnt"]
        col = [
            "rtu_trdt", "rtu_type", "rtu_refno", "rtu_desc", "rtu_mtyp",
            "rtu_tramt", "rtu_taxamt"
        ]
        whr = [("rtu_cono", "=", self.opts["conum"]),
               ("rtu_owner", "=", self.owner), ("rtu_code", "=", self.code),
               ("rtu_acno", "=", self.acno)]
        odr = "rtu_trdt, rtu_type, rtu_refno, rtu_mtyp"
        dat = self.sql.getRec(tables=tab, cols=col, where=whr, order=odr)
        data = []
        bals = 0
        for d in dat:
            bals = float(ASD(bals) + ASD(d[5]))
            data.append(d + [bals])
        col = (("rtu_trdt", "Trans-Date", 10, "D1",
                "N"), ("rtu_type", "Typ", 3, ("XX", rctrtp),
                       "N"), ("rtu_refno", "Reference", 9, "Na",
                              "N"), ("rtu_desc", "Details", 35, "NA", "N"),
               ("rtu_mtyp", "Mov", 3, ("XX", rcmvtp),
                "N"), ("rtu_tramt", "Amount", 11.2, "SD",
                       "N"), ("rtu_taxamt", "VAT-Amount", 11.2, "SD",
                              "N"), ("balance", "Balance", 15.2, "SD", "N"))
        try:
            self.ttrn.closeProcess()
        except:
            pass
        self.ttrn = SelectChoice(self.df.topPage2,
                                 None,
                                 col,
                                 data,
                                 wait=False,
                                 neww=False,
                                 butt=False,
                                 sort=False,
                                 live=False,
                                 modal=False,
                                 lines=9)

    def showTenantBalance(self):
        bal = self.sql.getRec("rcatnt",
                              cols=["round(sum(rtu_tramt),2)"],
                              where=[("rtu_cono", "=", self.opts["conum"]),
                                     ("rtu_owner", "=", self.owner),
                                     ("rtu_code", "=", self.code),
                                     ("rtu_acno", "=", self.acno),
                                     ("rtu_cnum", "=", self.cnum),
                                     ("rtu_mtyp", "<>", 2)],
                              limit=1)
        self.df.loadEntry("T", 2, 3, data=bal[0])

    def updateTables(self):
        curdt = int(self.trndat / 100)
        amt = self.trnamt
        vat = self.trnvat
        if self.trntyp in (1, 4):
            # Rental and Journal
            gltyp = 4
        elif self.trntyp == 2:
            # Receipt
            gltyp = 6
            bnk = amt
            amt = float(ASD(0) - ASD(amt))
            vat = float(ASD(0) - ASD(vat))
        elif self.trntyp == 3:
            # Payment
            gltyp = 2
            bnk = float(ASD(0) - ASD(amt))
        if self.df.pag == 1:
            # Owners Transaction
            accod = self.owner
            data = [
                self.opts["conum"], self.owner, self.trntyp, self.trnref,
                self.batno, self.trndat, amt, vat, curdt, self.trndet,
                self.vatcode, "", self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("rcaowt", data=data)
            if self.glint == "Y":
                # General Ledger Transaction for Owner Control
                gld = "%7s %s" % (self.owner, self.trndet[:22])
                data = [
                    self.opts["conum"], self.rcaown, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, amt, 0, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
        else:
            # Tenants Transaction
            accod = self.code
            data = [
                self.opts["conum"], self.owner, self.code, self.acno,
                self.cnum, self.trntyp, self.trnref, self.batno, self.trndat,
                self.movtyp, amt, vat, curdt, self.trndet, self.vatcode, "",
                self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("rcatnt", data=data)
            if self.glint == "Y":
                gld = "%7s %7s %7s" % (self.owner, self.code, self.acno)
                if self.df.pag == 3 and self.movtyp == 2:
                    # General Ledger Transaction for Deposit Control
                    acc = self.rcadep
                else:
                    # General Ledger Transaction for Tenant Control
                    acc = self.rcatnt
                data = [
                    self.opts["conum"], acc, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, amt, 0, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
            self.showTenantBalance()
        if self.trntyp in (2, 3):
            if self.glint == "Y":
                # General Ledger Transaction for Bank Account
                data = [
                    self.opts["conum"], self.glbnk, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, bnk, 0, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
            return
        if self.df.pag == 1 and self.df.pag == 1:
            # Owners Journal Entries (Unallocated)
            if self.glint == "Y":
                amt = float(ASD(0) - ASD(amt))
                data = [
                    self.opts["conum"], self.rcaorx, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, amt, 0, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
            return
        if self.df.pag == 2 and self.movtyp == 1:
            # Rental and Commission Raised
            rta = float(ASD(0) - ASD(amt))
            rtv = float(ASD(0) - ASD(vat))
            des = "Rental on %s Premises" % self.code
            data = [
                self.opts["conum"], self.owner, self.trntyp, self.trnref,
                self.batno, self.trndat, rta, rtv, curdt, des, self.vatcode,
                "", self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("rcaowt", data=data)
            if self.glint == "Y":
                # General Ledger Transaction for Owner Control
                gld = "%7s Rental on %7s" % (self.owner, self.code)
                data = [
                    self.opts["conum"], self.rcaown, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, rta, 0, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
            if self.crate:
                # If there is a Commission Rate on the Premises Record
                cma = float(ASD(0) - ASD(round((rta * self.crate / 100.0), 2)))
                vrte = getVatRate(self.sql, self.opts["conum"], self.taxdf,
                                  self.trndat)
                if vrte is None:
                    vrte = 0.0
                cmv = round((cma * vrte / 100.0), 2)
                cmt = float(ASD(cma) + ASD(cmv))
                cma = float(ASD(0) - ASD(cma))
                tax = float(ASD(0) - ASD(cmv))
                des = "Commission @ %3.5s%s Inclusive" % (self.crate, "%")
                data = [
                    self.opts["conum"], self.owner, 4, self.trnref, self.batno,
                    self.trndat, cmt, cmv, curdt, des, self.vatdf, "",
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("rcaowt", data=data)
                if self.glint == "Y":
                    # Update Owner Control
                    gld = "%7s Commission Raised" % self.owner
                    data = [
                        self.opts["conum"], self.rcaown, curdt, self.trndat,
                        gltyp, self.trnref, self.batno, cmt, 0, gld, "", "", 0,
                        self.opts["capnm"], self.sysdtw, 0
                    ]
                    self.sql.insRec("gentrn", data=data)
                    # Update Commission Account
                    data = [
                        self.opts["conum"], self.rcacom, curdt, self.trndat,
                        gltyp, self.trnref, self.batno, cma, tax, gld, "", "",
                        0, self.opts["capnm"], self.sysdtw, 0
                    ]
                    self.sql.insRec("gentrn", data=data)
                if self.taxdf:
                    # VAT Transaction (ctlvtf)
                    data = [
                        self.opts["conum"], self.taxdf, "O", curdt, "R",
                        self.trntyp, self.batno, self.trnref, self.trndat,
                        self.acno, self.name, cma, tax, 0, self.opts["capnm"],
                        self.sysdtw, 0
                    ]
                    self.sql.insRec("ctlvtf", data=data)
                    if self.glint == "Y" and tax:
                        # Update VAT Control
                        data = [
                            self.opts["conum"], self.convat, curdt,
                            self.trndat, gltyp, self.trnref, self.batno, tax,
                            0, gld, "", "", 0, self.opts["capnm"], self.sysdtw,
                            0
                        ]
                        self.sql.insRec("gentrn", data=data)
            return
        if self.df.pag == 3 and self.movtyp == 3:
            # Contract Fees
            amt = float(ASD(0) - ASD(amt) + ASD(vat))
            vat = float(ASD(0) - ASD(vat))
            if self.glint == "Y":
                # Update Contract Fee Account
                data = [
                    self.opts["conum"], self.rcafee, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, amt, vat, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
            if self.taxdf:
                # VAT Transaction (ctlvtf)
                data = (self.opts["conum"], self.vatcode, "O", curdt, "R",
                        self.trntyp, self.batno, self.trnref, self.trndat,
                        accod, self.trndet, amt, vat, 0, self.opts["capnm"],
                        self.sysdtw, 0)
                self.sql.insRec("ctlvtf", data=data)
                if self.glint == "Y":
                    # Update VAT Control
                    data = [
                        self.opts["conum"], self.convat, curdt, self.trndat,
                        gltyp, self.trnref, self.batno, vat, 0, gld, "", "", 0,
                        self.opts["capnm"], self.sysdtw, 0
                    ]
                    self.sql.insRec("gentrn", data=data)
            return
        if self.df.pag == 3 and self.movtyp == 4:
            # Services - Owner Recovery
            rta = float(ASD(0) - ASD(amt))
            rtv = float(ASD(0) - ASD(vat))
            des = "Services Recovery on %s" % self.code
            data = [
                self.opts["conum"], self.owner, self.trntyp, self.trnref,
                self.batno, self.trndat, rta, rtv, curdt, des, self.vatcode,
                "", self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("rcaowt", data=data)
            if self.glint == "Y":
                # General Ledger Transaction for Owner Control
                gld = "%7s Services Recovery" % self.owner
                data = [
                    self.opts["conum"], self.rcaown, curdt, self.trndat, gltyp,
                    self.trnref, self.batno, rta, 0, gld, "", "", 0,
                    self.opts["capnm"], self.sysdtw, 0
                ]
                self.sql.insRec("gentrn", data=data)
            return
        # Tenants Journal Entries (Unallocated)
        if self.glint == "Y":
            amt = float(ASD(0) - ASD(amt))
            data = [
                self.opts["conum"], self.rcatrx, curdt, self.trndat, gltyp,
                self.trnref, self.batno, amt, 0, gld, "", "", 0,
                self.opts["capnm"], self.sysdtw, 0
            ]
            self.sql.insRec("gentrn", data=data)

    def exitPage(self):
        if self.df.frt == "T" and self.df.pag == 0:
            self.df.closeProcess()
            self.opts["mf"].closeLoop()
        elif self.df.frt == "C" and self.df.pag == 3:
            self.df.focusField("C", 3, self.df.col)
        else:
            self.opts["mf"].dbm.commitDbase(ask=True)
            try:
                self.otrn.closeProcess()
            except:
                pass
            try:
                self.ttrn.closeProcess()
            except:
                pass
            self.df.selPage("Owner")
            self.df.focusField("T", 0, 1)

    def allNotes(self):
        if self.df.frt == "C":
            state = self.df.disableButtonsTags()
            self.df.setWidget(self.df.mstFrame, state="hide")
            if self.df.pag == 1:
                key = "%s" % self.owner
            else:
                key = "%7s%7s%s" % (self.owner, self.code, self.acno)
            NotesCreate(self.opts["mf"],
                        self.opts["conum"],
                        self.opts["conam"],
                        self.opts["capnm"],
                        "RCA",
                        key,
                        commit=False)
            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 allStmnt(self):
        if self.df.frt == "C" and self.df.pag == 1:
            self.sargs = [self.owner]
            self.repModule("rc3050")
        elif self.df.frt == "C" and self.df.pag == 2:
            self.sargs = [self.owner, self.code, self.acno]
            self.repModule("rc3060")
        else:
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def repModule(self, mod):
        self.exit = False
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        tit = ("Date and Printer Selection", )
        fld = ((("T", 0, 0, 0), "ID1", 10, "Statement Date", "", self.sysdtw,
                "N", self.doPrtDate, None, None, ("efld", )), )
        self.st = TartanDialog(self.opts["mf"],
                               tops=True,
                               title=tit,
                               eflds=fld,
                               tend=((self.doPrtEnd, "y"), ),
                               txit=(self.doPrtExit, ),
                               view=("N", "V"),
                               mail=("B", "Y"))
        self.st.mstFrame.wait_window()
        if not self.exit:
            self.sargs.extend(
                [self.stdtw, self.stdtd, self.st.repprt, self.st.repeml])
            popt = {
                "mf": self.opts["mf"],
                "conum": self.opts["conum"],
                "conam": self.opts["conam"],
                "capnm": self.opts["capnm"],
                "args": self.sargs
            }
            runModule(mod, **popt)
        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 doPrtDate(self, frt, pag, r, c, p, i, w):
        self.stdtw = w
        self.stdtd = self.st.t_disp[0][0][0]

    def doPrtEnd(self):
        self.doPrtClose()

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

    def doPrtClose(self):
        self.st.closeProcess()
コード例 #10
0
ファイル: wgc310.py プロジェクト: paulmalherbe/Tartan
class wgc310(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", "genmst", "wagrcv", "wagedc", "wagtf2"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.gc = GetCtl(self.opts["mf"])
        wagctl = self.gc.getCtl("wagctl", self.opts["conum"])
        if not wagctl:
            return
        self.glint = wagctl["ctw_glint"]
        return True

    def mainProcess(self):
        ced = {
            "stype":
            "R",
            "tables": ("wagedc", ),
            "cols": (("ced_code", "", 0, "Cde"), ("ced_desc", "", 0,
                                                  "Description", "Y")),
            "where": [("ced_cono", "=", self.opts["conum"])],
            "whera": [["T", "ced_type", 0]],
            "order":
            "ced_code"
        }
        bas = {
            "stype":
            "C",
            "titl":
            "Available Base Rates",
            "head": ("C", "Description"),
            "data":
            ((1, "X * Normal Rate of Pay * Factor"),
             (2, "Normal Pay * Factor"), (3, "Normal Pay * Factor / 100"),
             (4, "X * Daily Rate of Pay * Factor"),
             (5, "X * Hourly Rate of Pay * Factor"),
             (6, "U.I.F. Pay * Factor"), (7, "S.D.L. Pay * Factor"))
        }
        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")),
            "where": [("glm_cono", "=", self.opts["conum"])]
        }
        rcv = {
            "stype":
            "R",
            "tables": ("wagrcv", ),
            "cols":
            (("rcv_code", "", 0, "Code"), ("rcv_desc", "", 0, "Details", "Y"))
        }
        r1s = (("Variable", "V"), ("Fixed", "F"))
        r2s = (("Amount", "A"), ("Rate", "R"))
        r3s = (("Salary", "S"), ("Commission", "C"))
        r4s = (("Amount", "A"), ("Rate", "R"), ("None", "N"))
        r5s = (("Yes", "Y"), ("No", "N"), ("Notional", "T"), ("One Time", "O"),
               ("Retrench", "R"))
        r6s = (("Yes", "Y"), ("No", "N"))
        tag = (("Detail-_A", None, ("T", 0, 0), ("T", 0, 1)),
               ("Detail-_B", None, ("T", 0, 0), ("T", 0, 1)))
        self.fld = ((("T", 0, 0,
                      0), "IUA", 1, "Type", "Earning/Deduction Type", "E", "N",
                     self.doType, None, None, ("in", ("E", "D"))),
                    (("T", 0, 0, 0), "IUI", 3, "Code", "", "", "N",
                     self.doCode, ced, None, ("notzero", )),
                    (("T", 0, 0, 0), "ONA", 30, "Description"),
                    (("T", 1, 0, 0), "INA", 30, "Description", "", "", "N",
                     self.doDesc, None, self.doDelete,
                     ("notblank", )), (("T", 1, 1, 0), ("IRB", r1s), 0, "Type",
                                       "", "V", "N", None, None, None, None),
                    (("T", 1, 2, 0), ("IRB", r2s), 0, "Employee Portion", "",
                     "A", "N", self.doEmployeePortion, None, None, None),
                    (("T", 1, 3, 0), "IUI", 3, "         Base", "", "", "N",
                     self.doEmployeeBase, bas, None,
                     ("between", 0,
                      7)), (("T", 1, 4, 0), "IUD", 8.2, "         Value", "",
                            "", "N", self.doValue, None, None, ("efld", )),
                    (("T", 1, 5, 0), "IUD", 8.2, "         Limit", "", "", "N",
                     self.doElim, None, None, ("efld", )),
                    (("T", 1, 6, 0), "IUI", 3, "         GL/Cono", "", "", "N",
                     self.doEglco, coy, None,
                     ("efld", )), (("T", 1, 6,
                                    0), "IUI", 7, "         GL/Acno", "", "",
                                   "N", self.doEglno, glm, None, ("efld", )),
                    (("T", 1, 7, 0), ("IRB", r3s), 0, "Earnings Type", "", "S",
                     "N", self.doEarnType, None, None,
                     None), (("T", 1, 8,
                              0), ("IRB", r4s), 0, "Employer Portion", "", "N",
                             "N", self.doEmployerPortion, None, None, None),
                    (("T", 1, 9, 0), "IUI", 3, "         Base", "Base", "",
                     "N", self.doEmployerBase, bas, None,
                     ("between", 0,
                      7)), (("T", 1, 10, 0), "IUD", 8.2, "         Value", "",
                            "", "N", None, None, None,
                            ("efld", )), (("T", 1, 11, 0), "IUD", 8.2,
                                          "         Limit", "", "", "N",
                                          self.doRlim, None, None, ("efld", )),
                    (("T", 1, 12, 0), "IUI", 3, "         GL/Cono", "", "",
                     "N", self.doRglco, coy, None,
                     ("efld", )), (("T", 1, 12,
                                    0), "IUI", 7, "         GL/Acno", "", "",
                                   "N", self.doRglno, glm, None, ("efld", )),
                    (("T", 1, 13, 0), ("IRB", r5s), 0, "Tax Code", "", "N",
                     "N", self.doTaxcode, None, None,
                     None), (("T", 1, 14, 0), "IUD", 6.2, "Tax Portion", "",
                             "", "N", self.doTaxportion, None, None,
                             ("efld", )), (("T", 2,
                                            0, 0), "IUI", 4, "Rec Of Rev Code",
                                           "", "", "N", self.doRcv, rcv, None,
                                           ("notzero", )), (("T", 2, 0, 0),
                                                            "ONA", 30, ""),
                    (("T", 2, 1, 0), ("IRB", r6s), 0, "Union Report", "", "N",
                     "N", self.doUniRep, None, None,
                     None), (("T", 2, 2, 0), ("IRB", r6s), 0, "Must Pay", "",
                             "N", "N", None, None, None, None),
                    (("T", 2, 3, 0), "IUI", 2, "Balance Number", "", "", "N",
                     self.doBalNo, None, None,
                     ("between", 0,
                      3)), (("T", 2, 4, 0), "IUD", 5.2, "Hourly Limit", "", "",
                            "N", self.doLimit, None, None, ("efld", )),
                    (("T", 2, 5, 0), ("IRB", r6s), 0, "Monthly Deduction", "",
                     "N", "N", self.doMthly, None, None,
                     None), (("T", 2, 6, 0), "IUD", 6.2, "UIF Percentage", "",
                             "", "N", None, None, None,
                             ("efld", )), (("T", 2, 7, 0), "IUD", 6.2,
                                           "SDL Percentage", "", "", "N", None,
                                           None, None, ("efld", )))
        but = (("Accept", None, self.doAccept, 0, ("T", 1, 1), ("T", 0, 0)),
               ("Cancel", None, self.doCancel, 0, ("T", 1, 1),
                ("T", 0, 0)), ("Quit", None, self.doExit0, 1, None, None))
        tnd = ((self.doEnd0, "N"), (self.doEnd1, "N"), (self.doEnd2, "Y"))
        txt = (self.doExit0, self.doExit1, self.doExit2)
        self.df = TartanDialog(self.opts["mf"],
                               eflds=self.fld,
                               tags=tag,
                               butt=but,
                               tend=tnd,
                               txit=txt)

    def doType(self, frt, pag, r, c, p, i, w):
        self.rtype = w
        if self.rtype == "E":
            self.df.topf[1][15][5] = "Y"
        else:
            self.df.topf[1][15][5] = "Y"

    def doCode(self, frt, pag, r, c, p, i, w):
        self.code = w
        self.acc = self.sql.getRec("wagedc",
                                   where=[("ced_cono", "=",
                                           self.opts["conum"]),
                                          ("ced_type", "=", self.rtype),
                                          ("ced_code", "=", self.code)],
                                   limit=1)
        if not self.acc:
            self.new = True
            if self.rtype == "D" and self.code == 1:
                showInfo(self.opts["mf"].body, "PAYE",
                         "This code is Reserved for PAYE Deductions")
            elif self.rtype == "D" and self.code == 2:
                showInfo(self.opts["mf"].body, "UIF",
                         "This code is Reserved for UIF Deductions")
        else:
            self.new = False
            d = 3
            self.df.loadEntry(frt, pag, p + 1, data=self.acc[d])
            for pg in range(1, self.df.pgs + 1):
                for x in range(0, self.df.topq[pg]):
                    if pg == 2 and x == 1:
                        continue
                    self.df.loadEntry("T", pg, x, data=self.acc[d])
                    if pg == 2 and not x:
                        ror = self.sql.getRec("wagrcv",
                                              limit=1,
                                              cols=["rcv_desc"],
                                              where=[("rcv_code", "=",
                                                      self.acc[d])])
                        if not ror:
                            desc = ""
                        else:
                            desc = ror[0]
                        self.df.loadEntry("T", 2, 1, data=desc)
                    d = d + 1

    def doDesc(self, frt, pag, r, c, p, i, w):
        self.df.loadEntry("T", 0, 2, data=self.df.t_disp[1][0][0])
        if self.rtype == "E" and self.code < 6:
            self.df.loadEntry("T", 1, p + 1, data="V")
            self.df.loadEntry("T", 1, p + 2, data="R")
            if self.code == 5:
                self.df.loadEntry("T", 1, p + 3, data=4)
            else:
                self.df.loadEntry("T", 1, p + 3, data=1)
            if self.code in (1, 5):
                self.df.loadEntry("T", 1, p + 4, data=1)
                self.df.loadEntry("T", 1, p + 5, data=0)
                if self.glint != "Y":
                    self.df.loadEntry("T", 1, p + 6, data=0)
                    self.df.loadEntry("T", 1, p + 7, data=0)
                    self.df.loadEntry("T", 1, p + 8, data="S")
                    return "sk8"
                else:
                    return "sk5"
            else:
                return "sk3"
        elif self.rtype == "D" and self.code in (1, 2):
            if self.code == 1:
                self.df.loadEntry("T", 1, 1, data="V")
                self.df.loadEntry("T", 1, 2, data="R")
                if self.glint != "Y":
                    self.df.loadEntry("T", 1, p + 6, data=0)
                    self.df.loadEntry("T", 1, p + 7, data=0)
                    self.df.loadEntry("T", 1, p + 9, data="N")
                    self.df.loadEntry("T", 1, p + 15, data="N")
                    return "nd"
                return "sk5"
            elif self.code == 2:
                self.df.loadEntry("T", 1, 1, data="V")
                self.df.loadEntry("T", 1, 2, data="R")
                self.df.loadEntry("T", 1, 3, data=6)
                return "sk3"

    def doDelete(self):
        t = self.sql.getRec("wagtf2",
                            cols=["count(*)"],
                            where=[("wt2_cono", "=", self.opts["conum"]),
                                   ("wt2_type", "=", self.rtype),
                                   ("wt2_code", "=", self.code)],
                            limit=1)
        if t[0]:
            return "Transactions Exist, Not Deleted"
        self.sql.delRec("wagedc",
                        where=[("ced_cono", "=", self.opts["conum"]),
                               ("ced_type", "=", self.rtype),
                               ("ced_code", "=", self.code)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

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

    def doEmployeeBase(self, frt, pag, r, c, p, i, w):
        if w > 7:
            return "Invalid Employee Base"

    def doValue(self, frt, pag, r, c, p, i, w):
        self.value = w
        if self.rtype == "E" and self.code < 6:
            self.df.loadEntry("T", 1, p + 1, data=0)
            if self.glint != "Y":
                self.df.loadEntry("T", 1, p + 2, data=0)
                self.df.loadEntry("T", 1, p + 3, data=0)
                self.df.loadEntry("T", 1, p + 4, data="S")
                return "sk3"
            else:
                return "sk1"

    def doElim(self, frt, pag, r, c, p, i, w):
        self.elim = w
        if self.glint != "Y":
            self.df.loadEntry("T", 1, p + 1, data=0)
            self.df.loadEntry("T", 1, p + 2, data=0)
            if self.rtype == "E":
                return "sk2"
            else:
                self.df.loadEntry("T", 1, p + 3, data="")
                return "sk3"

    def doEglco(self, frt, pag, r, c, p, i, w):
        if self.rtype == "E" and self.code < 6 and not w:
            # Use department code for integration
            self.eglco = w
            self.df.loadEntry("T", 1, p + 1, data=0)
            self.df.loadEntry("T", 1, p + 2, data="S")
            self.df.loadEntry("T", 1, p + 9, data="Y")
            self.df.loadEntry("T", 1, p + 10, data=100.00)
            return "sk10"
        if w:
            self.eglco = w
        else:
            self.eglco = self.opts["conum"]
        name = self.sql.getRec("ctlmst",
                               cols=["ctm_name"],
                               where=[("ctm_cono", "=", self.eglco)],
                               limit=1)
        if not name:
            return "Invalid Company"

    def doEglno(self, frt, pag, r, c, p, i, w):
        if self.rtype == "D":
            ctl = self.gc.getCtl("ctlctl", self.eglco)
            if ctl and not self.gc.chkRec(self.eglco, ctl, ["wag_slc"]):
                sln = ctl["wag_slc"]
            else:
                sln = None
        else:
            sln = None
        if w and w != sln:
            chk = chkGenAcc(self.opts["mf"], self.eglco, w)
            if type(chk) is str:
                return chk
        self.eglno = w
        if self.rtype == "D":
            if self.code == 2:
                self.df.loadEntry(frt, pag, 9, data="R")
                self.df.loadEntry(frt, pag, 10, data=6)
                self.df.loadEntry(frt, pag, 11, data=self.value)
                self.df.loadEntry(frt, pag, 12, data=self.elim)
                self.df.loadEntry(frt, pag, 13, data=self.eglco)
                self.df.loadEntry(frt, pag, 14, data=self.eglno)
                return "sk7"
            else:
                return "sk1"
        if self.code < 6:
            self.df.loadEntry("T", 1, p + 1, data="S")
            self.df.loadEntry("T", 1, p + 8, data="Y")
            self.df.loadEntry("T", 1, p + 9, data=100.00)
            return "sk9"

    def doEarnType(self, frt, pag, r, c, p, i, w):
        if self.rtype == "E":
            return "sk6"

    def doEmployerPortion(self, frt, pag, r, c, p, i, w):
        if w == "N":
            for x in range(1, 6):
                self.df.loadEntry(frt, pag, p + x, data=0)
            return "sk5"
        if w == "A":
            self.df.loadEntry(frt, pag, p + 1, data=0)
            return "sk1"

    def doEmployerBase(self, frt, pag, r, c, p, i, w):
        if w > 7:
            return "Invalid Employer Base"

    def doRlim(self, frt, pag, r, c, p, i, w):
        if self.glint != "Y":
            return "sk2"

    def doRglco(self, frt, pag, r, c, p, i, w):
        if not w:
            w = self.opts["conum"]
        name = self.sql.getRec("ctlmst",
                               cols=["ctm_name"],
                               where=[("ctm_cono", "=", w)],
                               limit=1)
        if not name:
            return "Invalid Company"
        self.rglco = w

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

    def doTaxcode(self, frt, pag, r, c, p, i, w):
        if self.rtype == "D" and w not in ("Y", "T", "N"):
            return "Invalid Selection"
        if w == "N":
            self.df.loadEntry("T", pag, p + 1, data=0)
            return "sk1"
        if self.glint == "Y" and not self.eglno and w != "T":
            return "ff8|Invalid G/L Account Number"

    def doTaxportion(self, frt, pag, r, c, p, i, w):
        if not w:
            return "Invalid Tax Portion"

    def doRcv(self, frt, pag, r, c, p, i, w):
        if w == 4101:
            return "SITE Code Not Allowed"
        acc = self.sql.getRec("wagrcv",
                              cols=["rcv_desc"],
                              where=[("rcv_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Rec of Rev Code"
        else:
            self.df.loadEntry(frt, pag, p + 1, data=acc[0])

    def doUniRep(self, frt, pag, r, c, p, i, w):
        self.df.loadEntry(frt, pag, p + 1, data="N")
        if self.rtype == "E":
            if self.code in (1, 2, 3, 4, 5):
                self.df.loadEntry(frt, pag, p + 2, data=0)
                self.df.loadEntry(frt, pag, p + 3, data=0)
                self.df.loadEntry(frt, pag, p + 4, data="N")
                self.df.loadEntry(frt, pag, p + 5, data=100.00)
                return "sk5"
            return "sk4"
        return "sk1"

    def doBalNo(self, frt, pag, r, c, p, i, w):
        if self.rtype == "E":
            self.df.loadEntry(frt, pag, p + 1, data=0)
            self.df.loadEntry(frt, pag, p + 2, data="N")
            self.df.loadEntry(frt, pag, p + 3, data="N")
            return "sk3"

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

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

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

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

    def doEnd2(self):
        dat = [self.opts["conum"]]
        for x in range(0, 2):
            dat.append(self.df.t_work[0][0][x])
        for x in range(0, len(self.df.t_work[1][0])):
            dat.append(self.df.t_work[1][0][x])
        for x in range(0, len(self.df.t_work[2][0])):
            if x in (0, 2, 3, 4, 5, 6, 7, 8):
                dat.append(self.df.t_work[2][0][x])
        if self.new:
            self.sql.insRec("wagedc", data=dat)
        elif dat != self.acc[:len(dat)]:
            col = self.sql.wagedc_col
            dat.append(self.acc[col.index("ced_xflag")])
            self.sql.updRec("wagedc",
                            data=dat,
                            where=[("ced_cono", "=", self.opts["conum"]),
                                   ("ced_type", "=", self.rtype),
                                   ("ced_code", "=", self.code)])
        self.opts["mf"].dbm.commitDbase()
        self.df.last[0] = [0, 0]
        self.df.selPage("Detail-A")
        self.df.focusField("T", 0, 1)

    def doAccept(self):
        if self.rtype == "D":
            frt, pag, col, mes = self.df.doCheckFields(("T", 0, None))
            if not mes:
                frt, pag, col, mes = self.df.doCheckFields(
                    ("T", 1, (0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14)))
                if not mes:
                    if self.df.t_work[1][0][15] not in ("Y", "N", "T", "O",
                                                        "R"):
                        frt = "T"
                        pag = 1
                        col = 15
                        mes = "Invalid Tax Code Selection"
                    if not mes:
                        frt, pag, col, mes = self.df.doCheckFields(
                            ("T", 1, (16, )))
                        if not mes:
                            frt, pag, col, mes = self.df.doCheckFields(
                                ("T", 2, (0, 2, 3, 4, 5, 6)))
        else:
            frt, pag, col, mes = self.df.doCheckFields(("T", 0, None))
            if not mes:
                frt, pag, col, mes = self.df.doCheckFields(
                    ("T", 1, (0, 1, 2, 3, 4, 5, 6, 7, 8, 15, 16)))
                if not mes:
                    frt, pag, col, mes = self.df.doCheckFields(
                        ("T", 2, (0, 2, 3)))
        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])
            self.df.focusField(frt, pag, (col + 1), err=mes)
        else:
            self.doEnd2()

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

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

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

    def doExit2(self):
        self.df.selPage("Detail-A")
コード例 #11
0
ファイル: ln2010.py プロジェクト: paulmalherbe/Tartan
class ln2010(object):
    def __init__(self, **opts):
        self.opts = opts
        if self.setVariables():
            self.drawDialog()
            self.opts["mf"].startLoop()

    def setVariables(self):
        # Create SQL Object
        self.sql = Sql(self.opts["mf"].dbm, [
            "ctlmst", "lonmf1", "lonmf2", "lonrte", "lontrn", "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"])
        lonctl = self.gc.getCtl("lonctl", self.opts["conum"])
        if not lonctl:
            return
        self.glint = lonctl["cln_glint"]
        self.drte = lonctl["cln_drte"]
        self.crte = lonctl["cln_crte"]
        if self.glint == "Y":
            ctlctl = self.gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            ctls = ["lon_ctl", "int_rec", "int_pay"]
            if self.gc.chkRec(self.opts["conum"], ctlctl, ctls):
                return
            self.lonctl = ctlctl["lon_ctl"]
            self.intrec = ctlctl["int_rec"]
            self.intpay = ctlctl["int_pay"]
        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"]
        return True

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

    def drawDialog(self):
        lm1 = {
            "stype":
            "R",
            "tables": ("lonmf1", ),
            "cols":
            (("lm1_acno", "", 0, "Acc-Num"), ("lm1_name", "", 0, "Name", "Y")),
            "where": [("lm1_cono", "=", self.opts["conum"])]
        }
        lm2 = {
            "stype":
            "R",
            "tables": ("lonmf2", ),
            "cols": (("lm2_loan", "", 0, "Ln"), ("lm2_desc", "", 0,
                                                 "Description", "Y")),
            "where": [("lm2_cono", "=", self.opts["conum"])],
            "whera": [("C", "lm2_acno", 0)]
        }
        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]]
        }
        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 Code", "", "Y",
                self.doLonAcc, lm1, None, ("efld", )),
               (("C", 1, 0, 1), "ONA", 10, "Name"),
               (("C", 1, 0, 2), "IUI", 2, "LN", "Loan Number", "", "N",
                self.doLonNum, lm2, None, ("efld", )),
               (("C", 1, 0, 3), "ITX", (12, 30), "Description", "", "", "N",
                self.doLonDes, None, None, ("notblank", )),
               (("C", 1, 0, 4), "ID1", 10, "Date", "Transaction Date", "r",
                "N", self.doTrnDat, None, None, ("efld", )),
               (("C", 1, 0, 5), "INa", 9, "Reference", "Reference Number One",
                "i", "N", self.doTrnRef, None, None, ("notblank", )),
               (("C", 1, 0, 6), "ISD", 13.2, "Amount", "Transaction Amount",
                "", "N", self.doTrnAmt, None, None, ("notzero", )),
               (("C", 1, 0, 7), "IUD", 6.2, "DRte-%", "Debit Rate", self.drte,
                "N", self.doLonDrt, None, None, None),
               (("C", 1, 0, 8), "IUD", 6.2, "CRte-%", "Credit Rate", self.crte,
                "N", self.doLonCrt, None, None, None),
               (("C", 1, 0, 9), "IUI", 3, "Mth", "Period in Months", "", "N",
                self.doLonMth, None, None, ("efld", )),
               (("C", 1, 0, 10), "OUD", 12.2, "Repay-Amt"),
               (("C", 1, 0, 11), "INA", 30, "Details", "Loan Details", "", "N",
                self.doTrnDet, None, None, None)]
        if self.opts["rtn"] == 3 and self.glint == "Y":
            fld.extend([(("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,
                          4), "ISD", 13.2, "All-Amount", "Allocation Amount",
                         "", "N", self.doAllAmt, None, None, ("efld", )),
                        (("C", 2, 0, 6), "INA", 30, "Allocation Details", "",
                         "", "N", self.doAllDet, None, None, ("notblank", ))])
            if not self.incoac:
                fld[15][1] = "OUI"
        but = [("Interrogate", None, self.querySln, 0, ("C", 1, 1), ("C", 1,
                                                                     2))]
        tag = [("Transaction", None, None, None, False)]
        cnd = [(None, "n"), (self.endPage1, "y")]
        cxt = [None, self.exitPage1]
        if self.opts["rtn"] == 3 and self.glint == "Y":
            but.append(
                ("Cancel", None, self.doCancel, 0, ("C", 2, 1), ("C", 1, 1)))
            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 doLonAcc(self, frt, pag, r, c, p, i, w):
        newacc = False
        if not w and self.opts["rtn"] in (1, 2, 3):
            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.opts["conum"], self.opts["conam"]),
                           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.name = acc[0]
        self.df.loadEntry(frt, pag, p + 1, data=self.name)
        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):
        self.newlon = False
        if not w and self.opts["rtn"] in (1, 2, 3):
            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.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.opts["rtn"] in (1, 3) and self.lonmth:
                showError(
                    self.opts["mf"].body, "Fixed Loan",
                    """This is a Fixed Period Loan.

Please Create a New Loan for this Account.""")
                return "Invalid Loan Number"
            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 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 doTrnRef(self, frt, pag, r, c, p, i, w):
        self.refno = w

    def doTrnAmt(self, frt, pag, r, c, p, i, w):
        self.trnamt = w
        if not self.newlon:
            self.londrt = 0
            self.loncrt = 0
            self.lonmth = 0
            self.lonpay = 0
            if self.opts["rtn"] in (1, 2):
                return "nd"
            else:
                return "sk4"

    def doLonDrt(self, frt, pag, r, c, p, i, w):
        self.londrt = w

    def doLonCrt(self, frt, pag, r, c, p, i, w):
        self.loncrt = w

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

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

    def endPage1(self):
        self.batupd = False
        self.updateTables1()
        self.updateBatch()
        if not self.val:
            self.df.advanceLine(1)
        elif self.opts["rtn"] in (1, 2, 4) or self.glint == "N":
            self.opts["mf"].dbm.commitDbase()
            self.df.selPage("Transaction")
            self.df.advanceLine(1)
        else:
            self.allocated = float(0.0)
            self.df.loadEntry("T", 2, 0, data=self.val)
            self.df.selPage("Allocation")
            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.opts["rtn"] == 1:
            self.glt = 2
            desc = "Loan Advance"
            self.val = self.trnamt
        elif self.opts["rtn"] == 2:
            self.glt = 6
            desc = "Loan Repayment"
            self.val = float(ASD(0) - ASD(self.trnamt))
        elif self.opts["rtn"] == 3:
            self.glt = 4
            desc = self.trndet
            self.val = self.trnamt
        elif self.opts["rtn"] == 4:
            self.glt = 4
            desc = self.trndet
            self.val = self.trnamt
        if self.newlon:
            # Loans Masterfile
            self.sql.insRec("lonmf2",
                            data=[
                                self.opts["conum"], self.lonacc, self.lonnum,
                                self.londes, self.trndat, self.lonmth,
                                self.lonpay, 0
                            ])
            # Loans Rate File
            self.sql.insRec("lonrte",
                            data=[
                                self.opts["conum"], self.lonacc, self.lonnum,
                                self.trndat, self.londrt, self.loncrt
                            ])
        # Loans Transaction File
        self.sql.insRec("lontrn",
                        data=[
                            self.opts["conum"], self.lonacc, self.lonnum,
                            self.bh.batno, self.opts["rtn"], self.trndat,
                            self.refno, self.val, self.curdt, desc, "N",
                            self.opts["capnm"], self.sysdtw, 0
                        ])
        if self.glint == "N":
            return
        # General Ledger Loans Control Account
        data = (self.opts["conum"], self.lonctl, self.curdt, self.trndat,
                self.glt, self.refno, self.bh.batno, self.val, 0.00, self.name,
                "N", "", 0, self.opts["capnm"], self.sysdtw, 0)
        self.sql.insRec("gentrn", data=data)
        if self.opts["rtn"] in (1, 2, 4):
            # General Ledger Bank or Interest
            self.val = float(ASD(0) - ASD(self.val))
            if self.opts["rtn"] in (1, 2):
                ctl = self.bh.acc
            elif self.val < 0:
                ctl = self.intrec
            else:
                ctl = self.intpay
            data = (self.opts["conum"], ctl, self.curdt, self.trndat, self.glt,
                    self.refno, self.bh.batno, self.val, 0.00,
                    "Loan - %s" % self.name, "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 doGenAcc(self, frt, pag, r, c, p, i, w):
        chk = chkGenAcc(self.opts["mf"], self.allcoy, w)
        if type(chk) is str:
            return chk
        self.genacc = w
        self.df.loadEntry(frt, pag, p + 1, data=chk[0])

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

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

    def doCancel(self):
        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("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)

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

    def updateTables2(self):
        val = float(ASD(0) - ASD(self.allamt))
        # General Ledger Transaction (Allocation)
        data = (self.allcoy, self.genacc, self.curdt, self.trndat, self.glt,
                self.refno, self.bh.batno, val, 0.00, self.alldet, "", "", 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.refno, 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(val))
            data = (self.allcoy, acc, self.curdt, self.trndat, self.glt,
                    self.refno, self.bh.batno, val, 0.00, self.alldet, "N", "",
                    0, self.opts["capnm"], self.sysdtw, 0)
            self.sql.insRec("gentrn", data=data)

    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.val))
        else:
            self.batupd = True
            self.bh.batqty = self.bh.batqty + 1
            self.bh.batval = float(ASD(self.bh.batval) + ASD(self.val))
        self.df.loadEntry("T", 0, 0, data=self.bh.batqty)
        self.df.loadEntry("T", 0, 1, data=self.bh.batval)

    def querySln(self):
        callModule(self.opts["mf"],
                   self.df,
                   "ln4010",
                   coy=(self.opts["conum"], self.opts["conam"]),
                   period=None,
                   user=self.opts["capnm"])
コード例 #12
0
ファイル: dr4010.py プロジェクト: paulmalherbe/Tartan
class dr4010(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):
        tables = [
            "ctlrep", "ctlmes", "drsact", "drschn", "drsmst", "drstrn",
            "drstyp", "slsiv1"
        ]
        self.sql = Sql(self.opts["mf"].dbm,
                       tables,
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        gc = GetCtl(self.opts["mf"])
        drsctl = gc.getCtl("drsctl", self.opts["conum"])
        if not drsctl:
            return
        self.chains = drsctl["ctd_chain"]
        self.fromad = drsctl["ctd_emadd"]
        self.paidup = "N"
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.curdt = int(self.sysdtw / 100)
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Debtors Interrogation (%s)" % self.__class__.__name__)
        drc = {
            "stype": "R",
            "tables": ("drschn", ),
            "cols":
            (("chm_chain", "", 0, "Num"), ("chm_name", "", 0, "Name", "Y")),
            "where": [("chm_cono", "=", self.opts["conum"])]
        }
        ratings = {"N": "", "G": "", "F": "Fair", "P": "Poor", "B": "BAD!"}
        drm = {
            "stype":
            "R",
            "tables": ("drsmst", ),
            "cols":
            (("drm_acno", "", 0, "Acc-Num"), ("drm_name", "", 0, "Name", "Y"),
             ("drm_add1", "", 0,
              "Address Line 1"), ("drm_rating", ("RR", ratings), 4, "RATE")),
            "where": [("drm_cono", "=", self.opts["conum"])]
        }
        if self.chains == "Y":
            drm["whera"] = [["T", "drm_chain", 0]]
        else:
            drm["where"].append(("drm_chain", "=", 0))
        tag = (("Basic-_A", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Basic-_B", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Balances", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("History", self.doTagSelect, ("T", 0, 0),
                ("T", 0, 1)), ("Trans", self.doTrans1, ("T", 0, 0),
                               ("T", 0, 1)), ("Other", self.doOthers,
                                              ("T", 0, 0), ("T", 0, 1)))
        r1s = (("No", "N"), ("Yes", "Y"))
        fld = [[("T", 0, 0, 0), "IUI", 3, "Chain Store", "", "", "N",
                self.doChain, drc, None, ("efld", )],
               [("T", 0, 0, 0), "INA", 7, "Acc-Num", "Account Number", "", "N",
                self.doAcno, drm, None, ("notblank", )],
               [("T", 0, 0, 0), "ONA", 30, "Name"],
               [("T", 0, 0, 0), "INA", 7, "Acc-Num", "Account Number", "", "N",
                self.doAcno, drm, None, ("notblank", )],
               [("T", 0, 0, 0), "ONA", 30, "Name"],
               (("T", 1, 0, 0), "ONA", 30, "Name"),
               (("T", 1, 1, 0), "ONA", 30, "Address Line 1"),
               (("T", 1, 2, 0), "ONA", 30, "Address Line 2"),
               (("T", 1, 3, 0), "ONA", 30, "Address Line 3"),
               (("T", 1, 4, 0), "ONA", 4, "Postal Code"),
               (("T", 1, 5, 0), "ONA", 20, "Telephone"),
               (("T", 1, 6, 0), "ONA", 20, "Fax"),
               (("T", 1, 7, 0), "ONA", 30, "Manager"),
               (("T", 1, 7, 0), "OTX", 40, "E-Mail"),
               (("T", 1, 8, 0), "ONA", 30, "Accounts Contact"),
               (("T", 1, 8, 0), "OTX", 40, "E-Mail"),
               (("T", 1, 9, 0), "ONA", 30, "Sales Contact"),
               (("T", 1, 9, 0), "OTX", 40, "E-Mail"),
               (("T", 1, 10, 0), "Od1", 10, "Date Opened"),
               (("T", 1, 11, 0), "Od1", 10, "Date Registered"),
               (("T", 1, 12, 0), "ONA", 10, "V.A.T Number"),
               (("T", 1, 13, 0), "ONA", 7, "Delivery Code"),
               (("T", 1, 14, 0), "ONa", 3, "Rep Code"),
               (("T", 1, 14, 0), "ONA", 26, ""),
               (("T", 1, 15, 0), "ONA", 3, "Business Activity"),
               (("T", 1, 15, 0), "ONA", 26, ""),
               (("T", 1, 16, 0), "ONA", 3, "Business Type"),
               (("T", 1, 16, 0), "ONA", 26, ""),
               (("T", 2, 0, 0), "OUI", 1, "Price Level"),
               (("T", 2, 1, 0), "OUD", 5.2, "Discount Percentage"),
               (("T", 2, 2, 0), "OUD", 5.2, "Interest Percentage"),
               (("T", 2, 3, 0), "OUI", 3, "Referral Terms"),
               (("T", 2, 4, 0), "OUI", 3, "Rejected Terms"),
               (("T", 2, 5, 0), "OUI", 5, "Credit Limit"),
               (("T", 2, 6, 0), "OUA", 1, "Stop Indicator"),
               (("T", 2, 7, 0), "OUI", 3, "Invoice Message"),
               (("T", 2, 7, 0), "ONA", 40, ""),
               (("T", 2, 8, 0), "OUI", 3, "Statement Message"),
               (("T", 2, 8, 0), "ONA", 40, ""),
               (("T", 2, 9, 0), "OUA", 1, "Credit Rating"),
               (("T", 2, 10, 0), "OUA", 1, "Status"),
               (("T", 3, 0, 0), "Od1", 10, "Date Last Sale"),
               (("T", 3, 1, 0), "Od1", 10, "Date Last Paid"),
               (("T", 3, 2, 0), "OSD", 12.2, "Total Balance"),
               (("T", 3, 3, 0), "OSD", 12.2, "Current"),
               (("T", 3, 4, 0), "OSD", 12.2, "30 Days"),
               (("T", 3, 5, 0), "OSD", 12.2, "60 Days"),
               (("T", 3, 6, 0), "OSD", 12.2, "90 Days"),
               (("T", 3, 7, 0), "OSD", 12.2, "120 Days"),
               (("C", 4, 0, 0), "OSD", 13.2, "Sales", "", "", "N", None, None,
                None, None, ("Months", 13)),
               (("C", 4, 0, 1), "OSD", 13.2, "Receipts"),
               (("T", 5, 0, 0), ("IRB", r1s), 1, "History", "", "N", "N",
                self.doTrans2, None, 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)
        if self.chains == "Y":
            del fld[3]
            del fld[3]
        else:
            del fld[0]
            del fld[0]
            del fld[0]
            self.chain = 0
        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 doChain(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.sql.getRec("drschn",
                                  where=[("chm_cono", "=", self.opts["conum"]),
                                         ("chm_chain", "=", w)],
                                  limit=1)
            if not acc:
                return "Invalid Chain Store"
        self.chain = w

    def doAcno(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("drsmst",
                              where=[("drm_cono", "=", self.opts["conum"]),
                                     ("drm_chain", "=", self.chain),
                                     ("drm_acno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Account Number"
        self.acno = w
        self.name = acc[self.sql.drsmst_col.index("drm_name")]
        self.df.loadEntry("T", pag, p + 1, data=acc[3])
        d = 3
        for pg in range(1, 3):
            for x in range(0, self.df.topq[pg]):
                if pg == 1 and x in (18, 20, 22, 24):
                    continue
                if pg == 2 and x in (8, 10):
                    continue
                if pg == 2 and x == 11 and not acc[d]:
                    data = "N"
                else:
                    data = acc[d]
                self.df.loadEntry("T", pg, x, data=data)
                d = d + 1
        self.loadRep()
        self.loadAct()
        self.loadTyp()
        self.loadMes()
        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 loadRep(self):
        acc = self.sql.getRec("ctlrep",
                              where=[("rep_cono", "=", self.opts["conum"]),
                                     ("rep_code", "=",
                                      self.df.t_work[1][0][17])],
                              cols=["rep_name"],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, 18, data=acc[0])

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

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

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

    def loadBalances(self):
        bals = Balances(self.opts["mf"], "DRS", self.opts["conum"],
                        int(self.sysdtw / 100), (self.chain, self.acno))
        obal, tbal, ages = bals.doAllBals()
        this, hist = bals.doCrsDrsHist()
        self.sale = hist[0]
        self.pays = hist[1]
        last = self.sql.getRec("drstrn",
                               cols=["max(drt_trdt)"],
                               where=[("drt_cono", "=", self.opts["conum"]),
                                      ("drt_chain", "=", self.chain),
                                      ("drt_acno", "=", self.acno),
                                      ("drt_type", "=", 1)],
                               limit=1)
        if not last or not last[0]:
            lastsald = 0
        else:
            lastsald = last[0]
        last = self.sql.getRec("drstrn",
                               cols=["max(drt_trdt)"],
                               where=[("drt_cono", "=", self.opts["conum"]),
                                      ("drt_chain", "=", self.chain),
                                      ("drt_acno", "=", self.acno),
                                      ("drt_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 = lastsald
            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.sale[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 = [("drt_cono", "=", self.opts["conum"]),
               ("drt_chain", "=", self.chain), ("drt_acno", "=", self.acno)]
        if self.paidup == "Y":
            col, recs = getTrn(self.opts["mf"].dbm, "drs", whr=whr)
        else:
            col, recs = getTrn(self.opts["mf"].dbm,
                               "drs",
                               dte=self.curdt,
                               whr=whr)
        if recs:
            data = []
            for dat in recs:
                data.append([
                    dat[col.index("drt_trdt")], dat[col.index("drt_curdt")],
                    dat[col.index("drt_batch")], dat[col.index("drt_type")],
                    dat[col.index("drt_ref1")],
                    self.getRef2(col, dat), dat[col.index("drt_tramt")],
                    dat[col.index("paid")], dat[col.index("balance")],
                    dat[col.index("drt_desc")]
                ])
            if self.chains == "Y":
                tit = "Transactions for Account: %s %s - %s" % \
                    (self.chain, self.acno, self.name)
            else:
                tit = "Transactions for Account: %s - %s" % \
                    (self.acno, self.name)
            col = (("drt_trdt", "   Date", 10, "D1",
                    "N"), ("drt_curdt", "Curr-Dt", 7, "D2",
                           "N"), ("drt_batch", "Batch", 7, "Na", "N"),
                   ("drt_type", "Typ", 3, ("XX", drtrtp),
                    "N"), ("drt_ref1", "Reference", 9, "Na",
                           "Y"), ("drt_ref2", "Ref-Number-Two", 14, "Na", "Y"),
                   ("drt_tramt", "    Amount", 13.2, "SD",
                    "N"), ("alloc", " Allocated", 13.2, "SD",
                           "N"), ("balan", "   Balance", 13.2, "SD",
                                  "N"), ("drt_desc", "Details", 30, "NA", "N"))
            state = self.df.disableButtonsTags()
            while True:
                rec = SelectChoice(self.df.nb.Page5, tit, col, data)
                # If Invoice or Credit Note, attempt to display the document
                # else display all transaction details
                if rec.selection:
                    self.df.setWidget(self.df.mstFrame, state="hide")
                    if rec.selection[4] in (1, 4):
                        if rec.selection[4] == 1:
                            typ = "I"
                        else:
                            typ = "C"
                        try:
                            doc = int(rec.selection[5])
                            inv = self.sql.getRec("slsiv1",
                                                  where=[("si1_cono", "=",
                                                          self.opts["conum"]),
                                                         ("si1_rtn", "=", typ),
                                                         ("si1_docno", "=",
                                                          doc)],
                                                  limit=1)
                        except:
                            inv = []
                    else:
                        inv = []
                    if inv:
                        PrintInvoice(self.opts["mf"],
                                     self.opts["conum"],
                                     self.opts["conam"],
                                     typ,
                                     doc,
                                     repprt=["N", "V", "view"],
                                     copy="y")
                    else:
                        whr = [("drt_cono", "=", self.opts["conum"]),
                               ("drt_chain", "=", self.chain),
                               ("drt_acno", "=", self.acno),
                               ("drt_type", "=", rec.selection[4]),
                               ("drt_ref1", "=", rec.selection[5])]
                        TabPrt(self.opts["mf"],
                               tabs="drstrn",
                               where=whr,
                               pdia=False)
                    self.df.setWidget(self.df.mstFrame, state="show")
                else:
                    break
            self.df.enableButtonsTags(state=state)
        self.doTrans1()

    def getRef2(self, col, dat):
        dtyp = dat[col.index("drt_type")]
        ref1 = dat[col.index("drt_ref1")]
        ref2 = dat[col.index("drt_ref2")]
        if dtyp not in (1, 2):
            return ref2
        try:
            doc = int(ref1)
        except:
            return ref2
        if dtyp == 1:
            styp = "I"
        else:
            styp = "C"
        sls = self.sql.getRec("slsiv1",
                              cols=["si1_our_ord", "si1_cus_ord"],
                              where=[("si1_cono", "=", self.opts["conum"]),
                                     ("si1_rtn", "=", styp),
                                     ("si1_docno", "=", doc)],
                              limit=1)
        if sls and sls[1].strip()[:9] == ref2.strip():
            return sls[1]
        return ref2

    def doOthers(self):
        si1 = self.sql.slsiv1_col
        wh1 = [("si1_cono", "=", self.opts["conum"]),
               ("si1_rtn", "in", ("Q", "O", "W")),
               ("si1_chain", "=", self.chain), ("si1_acno", "=", self.acno),
               ("si1_invno", "=", "")]
        recs = self.sql.getRec("slsiv1", where=wh1, order="si1_date")
        if recs:
            data = []
            for dat in recs:
                wh2 = [("si2_cono", "=", self.opts["conum"]),
                       ("si2_rtn", "=", dat[si1.index("si1_rtn")]),
                       ("si2_docno", "=", dat[si1.index("si1_docno")])]
                si2 = self.sql.getRec("slsiv2",
                                      cols=[
                                          "si2_disc_per", "si2_qty",
                                          "si2_price", "si2_vat_rate"
                                      ],
                                      where=wh2)
                incamt = 0
                for dis, qty, pri, vat in si2:
                    incrat = float(ASD(100.0) + ASD(vat))
                    incpri = round((pri * incrat / 100.0), 4)
                    net = float(ASD(100.0) - ASD(dis))
                    inc = round((qty * incpri * net / 100.0), 2)
                    incamt = float(ASD(incamt) + ASD(inc))
                data.append([
                    dat[si1.index("si1_date")], dat[si1.index("si1_rtn")],
                    dat[si1.index("si1_docno")], dat[si1.index("si1_cus_ord")],
                    dat[si1.index("si1_jobno")], dat[si1.index("si1_contact")],
                    incamt
                ])
            tit = "Quotes and Orders for Account: %s - %s" % \
                (self.acno, self.name)
            col = (("si1_date", "   Date", 10, "D1",
                    "N"), ("si1_rtn", "T", 1, "UA",
                           "N"), ("si1_docno", "Doc-Numbr", 9, "UI", "N"),
                   ("si1_cus_ord", "Cust-Ord-Num", 14,
                    "Na"), ("si1_jobno", "Job-Num", 7,
                            "Na"), ("si1_contact", "Contact", 30, "NA"),
                   ("incamt", "Total-Value", 12.2, "SD"))
            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")
                    typ = rec.selection[2]
                    try:
                        doc = int(rec.selection[3])
                        PrintInvoice(self.opts["mf"],
                                     self.opts["conum"],
                                     self.opts["conam"],
                                     typ,
                                     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"], "DRS",
                    "%03i%s" % (self.chain, 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"):
            tab = "drsmst"
            whr = [("drm_cono", "=", self.opts["conum"]),
                   ("drm_chain", "=", self.chain),
                   ("drm_acno", "=", self.acno)]
            rp = TabPrt(self.opts["mf"],
                        self.opts["conum"],
                        self.opts["conam"],
                        name=self.__class__.__name__,
                        tabs=tab,
                        where=whr,
                        keys=[self.chain, 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 = ["Debtor's Transactions",
                "Chain: %s  Account: %s  Name: %s" % \
                (self.chain, self.acno, self.name)]
            whr = [("drt_cono", "=", self.opts["conum"]),
                   ("drt_chain", "=", self.chain),
                   ("drt_acno", "=", self.acno)]
            if self.paidup == "Y":
                col, recs = getTrn(self.opts["mf"].dbm, "drs", whr=whr)
            else:
                col, recs = getTrn(self.opts["mf"].dbm,
                                   "drs",
                                   dte=self.curdt,
                                   whr=whr)
            cols = []
            data = []
            dic = self.sql.drstrn_dic
            for num, rec in enumerate(recs):
                dat = []
                for nam in [
                        "drt_ref1", "drt_ref2", "drt_trdt", "drt_type",
                        "drt_tramt", "paid", "balance", "drt_desc"
                ]:
                    if not num:
                        if nam == "drt_ref2":
                            cols.append(["a", "Na", 14, "Ref-Number-Two"])
                        elif 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]])
                    if nam == "drt_ref2":
                        dat.append(self.getRef2(col, rec))
                    else:
                        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=["drt_type", drtrtp],
                        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()
コード例 #13
0
ファイル: dr2010.py プロジェクト: paulmalherbe/Tartan
class dr2010(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, 3, 4, 5):
            showError(self.opts["mf"].body, "Control Error",
                "Invalid Routine %s, Only 1, 3, 4 and 5 Are Allowed" % \
                str(self.opts["rtn"]))
            return
        # Create SQL Object
        self.sql = Sql(self.opts["mf"].dbm, ["ctlmst", "ctlvmf", "ctlvrf",
            "ctlvtf", "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.glinp = drsctl["ctd_glinp"]
        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
        if self.opts["rtn"] == 1:
            self.glt = 1
        elif self.opts["rtn"] == 3:
            self.glt = 4
        elif self.opts["rtn"] == 4:
            self.glt = 1
        elif self.opts["rtn"] == 5:
            self.glt = 2
        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
        if self.opts["rtn"] == 4:
            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"))}
        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"])]}
        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"}
        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",3,"Chn","Chain Store",
                "r","Y",self.doChain,drc,None,("efld",)],
            [("C",1,0,1),"INA",7,"Acc-Num","Account Number",
                "r","N",self.doDrsAcc,drm,None,("notblank",)],
            [("C",1,0,2),"ONA",10,"Name"],
            (("C",1,0,3),"INa",9,"Reference","Reference Number One",
                "i","N",self.doRef1,None,None,("notblank",)),
            (("C",1,0,4),"ID1",10,"Date","Transaction Date",
                "r","N",self.doTrnDat,None,None,("efld",)),
            (("C",1,0,5),"ISD",13.2,"Amount","Transaction Amount",
                "","N",self.doTrnAmt,None,None,("efld",))]
        if self.opts["rtn"] == 5:
            fld[4][2] = 20
            fld.extend([
                [["C",1,0,6],"ISD",13.2,"Discount",
                    "Discount Amount","","N",self.doDisAmt,None,None,None,None,
                    "Discout Amount to be Added to the Transaction Amount"],
                [["C",1,0,7],"OSD",13.2,"Total-Amount"],
                [["C",1,0,8],"INA",(20,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[4][2] = 24
            fld.extend([
                [["C",1,0,6],"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",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",
                    self.taxdf,"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[10][1] = "OUI"
        else:
            fld[4][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]])
        if self.chains == "N":
            fld[2][1] = "OUI"
            idx = 2
        else:
            idx = 1
        but = (
            ("Interrogate",None,self.queryDrs,0,("C",1,idx),("C",1,idx+1),
                "Interrogate Debtors Records",1),
            ("View Entries",viw,None,0,("C",1,idx),("C",1,idx+1),
                "View Batch Transactions",1),
            ("Maintain",None,self.maintainDrs,0,("C",1,idx),("C",1,idx+1),
                "Maintain Debtors 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 One",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"] != 5 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 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 doDrsAcc(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.dracno = w
        self.name = acc[0]
        self.df.loadEntry("C", pag, p+1, data=self.name)

    def doRef1(self, frt, pag, r, c, p, i, w):
        self.ref1 = w
        acc = self.sql.getRec("drstrn", cols=["drt_batch"],
            where=[("drt_cono", "=", self.opts["conum"]), ("drt_chain", "=",
            self.chain), ("drt_acno", "=", self.dracno), ("drt_type", "=",
            self.opts["rtn"]), ("drt_ref1", "=", self.ref1)], limit=1)
        if acc:
            return "Transaction Already Exists"

    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"] == 5:
            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"] != 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"] == 5 or self.glint == "N":
                    self.doDrsTrn()
                    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"] == 3:                        # Journals
            recon = 0
            self.dis = 0.00
        elif self.opts["rtn"] == 4:                        # Credit Notes
            recon = 0
            self.amt = float(ASD(0) - ASD(self.amt))
            self.vat = float(ASD(0) - ASD(self.vat))
            self.dis = 0.00
        elif self.opts["rtn"] == 5:                        # Payments
            if self.trnamt == 0:
                recon = self.curdt
            else:
                recon = 0
            self.vat = 0.00
            self.dis = self.disamt
        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 (Debtors)
        val = float(ASD(self.amt) + ASD(self.dis))
        data = (self.opts["conum"], self.drsctl, self.curdt, self.trndat,
            self.glt, self.ref1, 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"] == 5:
            val = float(ASD(0) - ASD(self.amt))
            data = (self.opts["conum"], self.bh.acc, self.curdt, self.trndat,
                self.glt, self.ref1, 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.ref1, 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(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.opts["conum"], self.chain, self.dracno,
            self.opts["rtn"], self.ref1, 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):
        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 doGenAcc(self, frt, pag, r, c, p, i, w):
        chk = chkGenAcc(self.opts["mf"], self.allcoy, 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, 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.allcoy, 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.allcoy, 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 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)
            if self.glint == "Y" and self.opts["rtn"] != 5:
                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.doDrsTrn()
            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:                        # Journals
            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.allcoy, self.vatcode, "O", self.curdt, "D",
            self.opts["rtn"], self.bh.batno, self.ref1, self.trndat,
            self.dracno, 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 (Allocation)
        data = (self.allcoy, self.genacc, self.curdt, self.trndat,
            self.glt, self.ref1, 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.ref1, 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.ref1, 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.ref1, 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 doDrsTrn(self):
        # Debtors Ledger Transaction
        data = [self.opts["conum"], self.chain, self.dracno, self.opts["rtn"],
            self.ref1, self.bh.batno, self.trndat, "", self.amt, self.vat,
            self.curdt, self.trndet, self.vatcode, "N", self.opts["capnm"],
            self.sysdtw, 0]
        self.sql.insRec("drstrn", data=data)
        if not self.dis:
            return
        data = [self.opts["conum"], self.chain, self.dracno, 6, self.ref1,
            self.bh.batno, self.trndat, "", self.dis, self.vat, self.curdt,
            self.trndet, self.vatcode, "N", self.opts["capnm"], self.sysdtw, 0]
        self.sql.insRec("drstrn", 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 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"])
コード例 #14
0
ファイル: ms1010.py プロジェクト: paulmalherbe/Tartan
class ms1010(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", "ctlynd", "ctlvmf", "ctlvrf", "chglog"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        cnt = self.sql.getRec("ctlmst", cols=["count(*)"], limit=1)
        if not cnt[0]:
            self.first = True
        else:
            self.first = False
        self.img = None
        return True

    def mainProcess(self):
        self.tit = ("Company Records File Maintenance", )
        ctm = {
            "stype": "R",
            "tables": ("ctlmst", ),
            "cols":
            (("ctm_cono", "", 0, "Num"), ("ctm_name", "", 0, "Name", "Y"))
        }
        log = {"stype": "F", "types": "fle", "ftype": (("Image", "*"), )}
        r1s = (("Yes", "Y"), ("No", "N"))
        tag = (("General", None, ("T", 1, 2),
                ("T", 1, 1)), ("Banking", None, ("T", 1, 2), ("T", 1, 1)),
               ("Systems", None, ("T", 1, 2),
                ("T", 1, 1)), ("Logo", None, ("T", 1, 2), ("T", 1, 1)))
        fld = [[("T", 1, 0, 0), "IUI", 3, "Company Number", "Number", "", "Y",
                self.doCoyNum, ctm, None, ("notzero", )],
               (("T", 1, 1, 0), "INA", 30, "Name", "Company Name", "", "N",
                self.doCoyNam, None, self.doDelete, ("notblank", )),
               (("T", 1, 2, 0), "INA", 30, "Postal Address Line-1",
                "Address Line-1", "", "N", None, None, None, None),
               (("T", 1, 3, 0), "INA", 30, "               Line-2",
                "Address Line-2", "", "N", None, None, None, None),
               (("T", 1, 4, 0), "INA", 30, "               Line-3",
                "Address Line-3", "", "N", None, None, None, None),
               (("T", 1, 5, 0), "INA", 4, "Postal Code", "", "", "N", None,
                None, None, None),
               (("T", 1, 6, 0), "INA", 30, "Street Address Line-1",
                "Street Address Line-1", "", "N", None, None, None, None),
               (("T", 1, 7, 0), "INA", 30, "               Line-2",
                "Address Line-2", "", "N", None, None, None, None),
               (("T", 1, 8, 0), "INA", 30, "               Line-3",
                "Address Line-3", "", "N", None, None, None, None),
               (("T", 1, 9, 0), "INA", 4, "Street Code", "", "", "N", None,
                None, None, None),
               (("T", 1, 10, 0), "INA", 30, "Contact Name", "", "", "N", None,
                None, None, None),
               (("T", 1, 11, 0), "INA", 15, "Telephone", "Telephone No", "",
                "N", None, None, None, None),
               (("T", 1, 12, 0), "INA", 15, "Facsimile", "Facsimile No", "",
                "N", None, None, None, None),
               (("T", 1, 13, 0), "INA", 15, "Mobile", "Mobile Number", "", "N",
                None, None, None, None),
               (("T", 1, 14, 0), "ITX", 50, "E-Mail Address", "", "", "N",
                None, None, None, ("email", )),
               (("T", 1, 15, 0), "ITX", 50, "Internet URL", "", "", "N", None,
                None, None, ("efld", )),
               (("T", 1, 16, 0), "INA", 20, "Registration No", "", "", "N",
                None, None, None, None),
               (("T", 1, 17, 0), "INA", 20, "V.A.T. Number", "", "", "N",
                self.doVatNum, None, None, None),
               (("T", 1, 18, 0), "IUA", 1, "V.A.T. Default", "", "", "N",
                self.doVatCod, None, None, ("notblank", )),
               (("T", 2, 0, 0), "INA", 30, "Bank Name", "", "", "N", None,
                None, None, None),
               (("T", 2, 1, 0), "INA", 30, "Bank Branch", "", "", "N", None,
                None, None, None),
               (("T", 2, 2, 0), "INA", 8, "Bank IBT", "Bank IBT Number", "",
                "N", None, None, None, None),
               (("T", 2, 3, 0), "INA", 16, "Bank Account",
                "Bank Account Number", "", "N", None, None, None, None)]
        pos = 1
        self.sys = []
        for x in range(len(allsys)):
            for sss in allsys:
                if allsys[sss][3] == pos:
                    self.sys.append(allsys[sss][1])
                    fld.append(
                        (("T", 3, pos, 0), ("IRB", r1s), 0, allsys[sss][0], "",
                         "N", "N", None, None, None, None))
                    pos += 1
        fld.append((("T", 4, 0, 0), "IFF", 75, "Letterhead Image", "", "", "N",
                    self.doLogo, log, None, ("fle", "blank")))
        but = (("Accept", None, self.doAccept, 0, ("T", 1, 2),
                (("T", 1, 1), ("T", 4, 0))), ("Print", None, self.doPrint, 0,
                                              ("T", 1, 2), (("T", 1, 1),
                                                            ("T", 4, 0))),
               ("Cancel", None, self.doCancel, 0, ("T", 1, 2),
                (("T", 1, 1), ("T", 4, 0))), ("Quit", None, self.doExit1, 1,
                                              None, None))
        tnd = (None, (self.doEnd, "n"), (self.doEnd, "n"), (self.doEnd, "n"),
               (self.doEnd, "y"))
        txt = (None, self.doExit1, self.doExit2, self.doExit3, self.doExit4)
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               tags=tag,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt,
                               clicks=self.doClick)
        if self.first:
            self.opts["conum"] = 1
            self.new = True
            self.df.topf[1][0][1] = "OUI"
            self.df.loadEntry("T", 1, 0, data=self.opts["conum"])
            self.df.focusField("T", 1, 2)

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

    def doCoyNum(self, frt, pag, r, c, p, i, w):
        if w == 0:
            return "Invalid Company Number"
        elif w != 1:
            chk = self.sql.getRec("ctlmst",
                                  where=[("ctm_cono", "=", 1)],
                                  limit=1)
            if not chk:
                return "Company 1 Must First Exist"
        self.opts["conum"] = w
        self.old = self.sql.getRec("ctlmst",
                                   where=[("ctm_cono", "=", self.opts["conum"])
                                          ],
                                   limit=1)
        if not self.old:
            self.new = True
        else:
            self.new = False
            self.opts["conam"] = self.old[self.sql.ctlmst_col.index(
                "ctm_name")]
            for x in range(1, self.df.topq[pag]):
                data = self.old[x]
                self.df.loadEntry(frt, pag, x, data=data)
            for x in range(0, self.df.topq[pag + 1]):
                data = self.old[x + self.df.topq[pag]]
                self.df.loadEntry(frt, pag + 1, x, data=data)
            for x in range(0, self.df.topq[pag + 2]):
                self.df.loadEntry(frt, pag + 2, x, data="N")
            mods = self.old[self.sql.ctlmst_col.index("ctm_modules")].rstrip()
            for x in range(0, len(mods), 2):
                idx = self.sys.index(mods[x:x + 2])
                self.df.loadEntry(frt, pag + 2, idx, data="Y")
            self.logo = self.old[self.sql.ctlmst_col.index("ctm_logo")]
            self.df.loadEntry(frt, pag + 3, 0, data=self.logo)
            if self.logo:
                self.displayLogo(self.logo)

    def doDelete(self):
        if self.opts["conum"] == 1:
            showError(self.opts["mf"].body, "Deletion Error",
                      "Company 1 Cannot be Deleted")
            return
        err = False
        skp = {
            "ctlmst": "ctm_cono",
            "ctlynd": "cye_cono",
            "ctlvmf": "vtm_cono",
            "ctlvrf": "vtr_cono"
        }
        for tab in tabdic:
            if tab in skp:
                continue
            chk = tabdic[tab]["fld"][0][1]
            if chk.count("_cono"):
                sql = Sql(self.opts["mf"].dbm,
                          tab,
                          prog=self.__class__.__name__)
                err = sql.getRec(tables=tab,
                                 where=[(chk, "=", self.opts["conum"])])
                if err:
                    break
        if err:
            showError(self.opts["mf"].body, "Deletion Error",
                      "%s Records Exist for This Company, Cannot Delete" % tab)
            return
        for tab in skp:
            self.sql.delRec(tab, where=[(skp[tab], "=", self.opts["conum"])])
        self.opts["mf"].dbm.commitDbase(ask=True)

    def doCoyNam(self, frt, pag, r, c, p, i, w):
        self.opts["conam"] = w
        chk = self.sql.getRec("ctlvmf",
                              where=[("vtm_cono", "=", self.opts["conum"])],
                              limit=1)
        if not chk:
            self.sql.insRec("ctlvmf",
                            data=[self.opts["conum"], "N", "No VAT", "N"])
            self.sql.insRec("ctlvrf", data=[self.opts["conum"], "N", 0, 0])

    def doVatNum(self, frt, pag, r, c, p, i, w):
        self.vatnum = w
        if not self.vatnum:
            self.vat = "N"
            self.df.loadEntry(frt, pag, p + 1, data=self.vat)
            return "sk1"

    def doVatCod(self, frt, pag, r, c, p, i, w):
        self.vat = w
        acc = self.doReadVat(self.vat)
        if not acc:
            ok = askQuestion(
                self.opts["mf"].body, "VAT Code",
                "This Code Does Not Exist, Do You Want to Create It?")
            if ok == "no":
                return "Invalid Code"
            state = self.df.disableButtonsTags()
            self.df.setWidget(self.df.mstFrame, state="hide")
            callModule(self.opts["mf"],
                       None,
                       "ms1040",
                       coy=(self.opts["conum"], self.opts["conam"]),
                       user=self.opts["capnm"],
                       args=self.vat)
            self.df.setWidget(self.df.mstFrame, state="show")
            self.df.enableButtonsTags(state=state)
            acc = self.doReadVat(self.vat)
            if not acc:
                self.df.loadEntry(frt, pag, p, data="")
                return "Invalid Code"

    def doLogo(self, frt, pag, r, c, p, i, w):
        if not w:
            if self.img:
                self.img.destroyImage()
        else:
            self.logo = os.path.normpath(w)
            if self.displayLogo(self.logo):
                return "Invalid Logo Image"
            self.df.loadEntry(frt, pag, p, data=self.logo)

    def displayLogo(self, logo):
        try:
            if self.img:
                try:
                    self.img.destroyImage()
                except:
                    pass
            self.img = ShowImage(self.df.nb.Page4,
                                 logo,
                                 wrkdir=self.opts["mf"].rcdic["wrkdir"],
                                 msiz=640)
        except:
            return "error"

    def doReadVat(self, w):
        acc = self.sql.getRec("ctlvmf",
                              cols=["vtm_desc"],
                              where=[("vtm_cono", "=", self.opts["conum"]),
                                     ("vtm_code", "=", w)],
                              limit=1)
        return acc

    def doEnd(self):
        if self.df.pag == 1:
            self.df.selPage("Banking")
            self.df.focusField("T", 2, 1)
        elif self.df.pag == 2:
            self.df.selPage("Systems")
            self.df.focusField("T", 3, 1)
        elif self.df.pag == 3:
            self.df.selPage("Logo")
            self.df.focusField("T", 4, 1)
        else:
            data = []
            mods = ""
            for x in range(0, len(self.df.t_work[1][0])):
                data.append(self.df.t_work[1][0][x])
            for x in range(0, len(self.df.t_work[2][0])):
                data.append(self.df.t_work[2][0][x])
            fin = False
            for x in range(0, len(self.df.t_work[3][0])):
                if self.df.t_work[3][0][x] == "Y":
                    mod = self.sys[x]
                    if mod not in ("BC", "BS", "SC"):
                        fin = True
                    mods = mods + mod
            data.append(mods)
            data.extend(self.df.t_work[4][0][0:2])
            if self.new:
                self.sql.insRec("ctlmst", data=data)
            elif data != self.old[:len(data)]:
                col = self.sql.ctlmst_col
                data.append(self.old[col.index("ctm_xflag")])
                self.sql.updRec("ctlmst",
                                data=data,
                                where=[("ctm_cono", "=", self.opts["conum"])])
                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=[
                                            "ctlmst", "U",
                                            "%03i" % self.opts["conum"],
                                            col[num], dte, self.opts["capnm"],
                                            str(dat),
                                            str(data[num]), "", 0
                                        ])
            if fin:
                # Financial Systems
                ynd = self.sql.getRec("ctlynd",
                                      cols=["count(*)"],
                                      where=[("cye_cono", "=",
                                              self.opts["conum"])],
                                      limit=1)
                if not ynd[0]:
                    self.doFinPeriod()
                    if self.xits == "y":
                        self.doCancel()
                        return True
            self.opts["mf"].dbm.commitDbase()
            if self.first:
                self.doExit1()
            else:
                self.df.selPage("General")
                self.df.focusField("T", 1, 1)

    def doFinPeriod(self):
        tit = ("Initial Financial Period", )
        fld = ((("T", 0, 0, 0), "ID1", 10, "Period Start Date", "", "", "N",
                self.doStartPer, None, None, ("efld", )),
               (("T", 0, 1, 0), "ID1", 10, "Period End Date", "", "", "N",
                self.doEndPer, None, None, ("efld", )))
        tnd = ((self.doPerEnd, "y"), )
        txt = (self.doPerExit, )
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        self.pf = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               tend=tnd,
                               txit=txt)
        self.pf.mstFrame.wait_window()
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)
        self.opts["mf"].head.configure(text=self.tit[0])

    def doStartPer(self, frt, pag, r, c, p, i, w):
        y = int(w / 10000) - 1
        m = int((w % 10000) / 100)
        if m == 2:
            if not y % 4:
                d = 29
            else:
                d = 28
        else:
            d = w % 100
        self.s0 = (y * 10000) + (m * 100) + d
        self.s1 = w
        y = int(w / 10000) + 1
        m -= 1
        if not m:
            m = 12
            y -= 1
        self.pf.t_work[0][0][1] = mthendDate((y * 10000) + (m * 100) + 1)

    def doEndPer(self, frt, pag, r, c, p, i, w):
        if w <= self.s1:
            return "Invalid End Period"
        y = int(w / 10000) - 1
        m = int((w % 10000) / 100)
        if m == 2:
            if not y % 4:
                d = 29
            else:
                d = 28
        else:
            d = w % 100
        self.e0 = (y * 10000) + (m * 100) + d
        self.e1 = w

    def doPerEnd(self):
        self.sql.insRec("ctlynd",
                        data=[self.opts["conum"], 0, self.s0, self.e0, 0, "N"])
        self.sql.insRec("ctlynd",
                        data=[self.opts["conum"], 1, self.s1, self.e1, 0, "N"])
        self.xits = "n"
        self.closeProcess()

    def doPerExit(self):
        self.xits = "y"
        self.closeProcess()

    def closeProcess(self):
        self.pf.closeProcess()

    def doAccept(self):
        for page in range(4):
            frt, pag, col, mes = self.df.doCheckFields(("T", page + 1, None))
            if mes:
                break
        if mes:
            self.df.last[pag][0] = col + 1
            self.df.selPage(self.df.tags[pag - 1][0])
            self.df.focusField(frt, pag, (col + 1), err=mes)
        else:
            mod = False
            for x in range(len(self.df.t_work[3][0])):
                if self.df.t_work[3][0][x] == "Y":
                    mod = True
                    break
            if not mod:
                self.df.selPage("Systems")
                self.df.focusField("T", 3, 1, err="Missing System Module")
            else:
                if self.img:
                    self.img.destroyImage()
                self.df.selPage("Logo")
                self.df.doEndFrame("T", 4, cnf="N")

    def doPrint(self):
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, state="hide")
        TabPrt(self.opts["mf"],
               self.opts["conum"],
               name=self.__class__.__name__,
               tabs="ctlmst",
               where=[("ctm_cono", "=", self.opts["conum"])])
        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.selPage("General")
        self.df.focusField("T", 1, 1)

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

    def doExit2(self):
        self.df.selPage("General")

    def doExit3(self):
        self.df.selPage("Banking")

    def doExit4(self):
        self.df.selPage("Systems")
コード例 #15
0
class cs2010(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"])
        ctlmst = gc.getCtl("ctlmst", self.opts["conum"])
        if not ctlmst:
            return
        self.taxdf = ctlmst["ctm_taxdf"]
        if not self.taxdf:
            self.taxdf = "N"
        cshctl = gc.getCtl("cshctl", self.opts["conum"])
        if not cshctl:
            return
        self.glint = cshctl["ccc_glint"]
        if self.glint == "Y":
            tabs = ["genmst"]
        else:
            tabs = ["cshmst"]
        tabs.extend(["cshana", "cshcnt"])
        self.sql = Sql(self.opts["mf"].dbm,
                       tables=tabs,
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        if self.glint == "Y":
            self.ctl = [["csh_ctl", "Cash Control", 0]]
            ctlctl = gc.getCtl("ctlctl", self.opts["conum"])
            if not ctlctl:
                return
            for num, ctl in enumerate(self.ctl):
                if ctl[0] in ctlctl:
                    self.ctl[num][2] = ctlctl[ctl[0]]
        t = time.localtime()
        self.sysdtw = ((t[0] * 10000) + (t[1] * 100) + t[2])
        self.denoms = (("R200", 200), ("R100", 100), ("R50", 50), ("R20", 20),
                       ("R10", 10), ("R5", 5), ("R2", 2), ("R1", 1),
                       ("C50", .5), ("C20", .2), ("C10", .1), ("C5", .05),
                       ("C2", .02), ("C1", .01))
        return True

    def mainProcess(self):
        tag = (("Expenses", None, None, None, False),
               ("Income", None, None, None, False), ("Cash", None, None, None,
                                                     False))
        dte = {
            "stype": "R",
            "tables": ("cshcnt", ),
            "cols": (("cct_date", "", 0, "Date"), ),
            "where": [("cct_cono", "=", self.opts["conum"])],
            "group": "cct_date"
        }
        if self.glint == "Y":
            self.cod = {
                "stype":
                "R",
                "tables": ("genmst", ),
                "cols": (("glm_acno", "", 0, "Acc-Num"), ("glm_desc", "", 0,
                                                          "Description", "Y")),
                "where": [("glm_cono", "=", self.opts["conum"])],
                "order":
                "glm_acno"
            }
        else:
            self.cod = {
                "stype":
                "R",
                "tables": ("cshmst", ),
                "cols": (("ccm_acno", "", 0, "Acc-Num"), ("ccm_desc", "", 0,
                                                          "Description", "Y")),
                "where": [("ccm_cono", "=", self.opts["conum"])],
                "order":
                "ccm_acno"
            }
        des = {
            "stype":
            "R",
            "tables": ("cshana", ),
            "cols": (("can_desc", "", 0, "Description", "Y"), ("can_vatcod",
                                                               "", 0, "V")),
            "where": [("can_cono", "=", self.opts["conum"])],
            "whera": (("C", "can_code", 1, 1), ),
            "group":
            "can_desc",
            "order":
            "can_desc"
        }
        r1s = (("Expenses", "P"), ("Income", "T"), ("Cash", "C"))
        fld = ((("T", 0, 0, 0), ("IRB", r1s), 0, "Type", "", "P", "N",
                self.doType, None, None, None),
               (("T", 0, 1, 0), "I@cct_date", 0, "", "", self.sysdtw, "N",
                self.doDate, dte, None, ("efld", )), (("T", 0, 2, 0), "OSD",
                                                      13.2, "Expenses Total"),
               (("T", 0, 3, 0), "OSD", 13.2,
                "Income Total"), (("T", 0, 4, 0), "OSD", 13.2, "Cash Total"),
               (("C", 1, 0, 0), "I@can_trdt", 0, "", "", "", "N", None, None,
                None, ("efld", )), (("C", 1, 1,
                                     0), "I@can_code", 0, "", "", "", "N",
                                    self.doCode, self.cod, None, None),
               (("C", 1, 2, 0), "I@can_desc", 0, "", "", "", "N", self.doDesc,
                des, None, ("notblank", )), (("C", 1, 3, 0), "I@can_vatcod", 0,
                                             "", "", "N", "N", self.doVCode,
                                             None, None, ("notblank", )),
               (("C", 1, 4, 0), "I@can_incamt", 0, "", "", "", "N",
                self.doIncAmt, None, None,
                ("efld", )), (("C", 1, 5, 0), "I@can_vatamt", 0, "", "", "",
                              "N", None, None, None, ("efld", )),
               (("C", 2, 0, 0), "I@can_trdt", 0, "", "", "", "N", None, None,
                None, ("efld", )), (("C", 2, 1, 0), "I@can_code", 0, "", "",
                                    "", "N", self.doCode, self.cod, None,
                                    None), (("C", 2, 2, 0), "I@can_desc", 0,
                                            "", "", "", "N", self.doDesc, des,
                                            None, ("notblank", )),
               (("C", 2, 3, 0), "I@can_vatcod", 0, "", "", "N", "N",
                self.doVCode, None, None,
                ("notblank", )), (("C", 2, 4, 0), "I@can_incamt", 0, "", "",
                                  "", "N", self.doIncAmt, None, None,
                                  ("efld", )), (("C", 2, 5, 0), "I@can_vatamt",
                                                0, "", "", "", "N", None, None,
                                                None, ("efld", )),
               (("T", 3, 0, 0), "ISD", 13.2, "Cheques", "", "", "N",
                self.doCheq, None, None,
                ("efld", )), (("C", 3, 0, 0), "IUI", 5, "Quant", "Quantity", 0,
                              "N", self.doQty, None, None, None,
                              ("Denomination",
                               14)), (("C", 3, 1, 0), "OSD", 13.2, "Value", "",
                                      "", "N", None, None, None, ("efld", )))
        tnd = ((self.doTopEnd, "y"), None, None, (self.doTopEnd, "n"))
        txt = (self.doTopExit, None, None, None)
        cnd = (None, (self.doColEnd, "y"), (self.doColEnd, "y"),
               (self.doColEnd, "n"))
        cxt = (None, self.doColExit, self.doColExit, self.doColExit)
        but = (("Accept", None, self.doColExit, 0, (("C", 1, 1), ("C", 2, 1)),
                (("C", 1, 2), ("C", 2, 2))),
               ("Edit", None, self.doEdit, 0, (("C", 1, 1), ("C", 2, 1)),
                (("C", 1, 2), ("C", 2, 2))), ("Quit", None, self.doQuit, 0,
                                              ("T", 0, 0), ("T", 0, 1)))
        self.df = TartanDialog(self.opts["mf"],
                               tags=tag,
                               eflds=fld,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               butt=but,
                               focus=False)
        for x in range(14):
            self.df.colLabel[3][x].configure(text=self.denoms[x][0])
        self.df.focusField("T", 0, 1)

    def doType(self, frt, pag, r, c, p, i, w):
        self.trtp = w
        self.edit = None
        self.amend = False
        self.loader = False
        self.etotal = 0
        self.itotal = 0
        self.ctotal = 0

    def doDate(self, frt, pag, r, c, p, i, w):
        self.date = w
        rec = self.sql.getRec("cshana",
                              where=[("can_cono", "=", self.opts["conum"]),
                                     ("can_type", "=", "P"),
                                     ("can_date", "=", self.date)])
        if rec and self.trtp == "P":
            self.amend = True
        for rr in rec:
            self.etotal = float(ASD(self.etotal) + ASD(rr[7]))
        self.df.loadEntry(frt, pag, p + 1, data=self.etotal)
        rec = self.sql.getRec("cshana",
                              where=[("can_cono", "=", self.opts["conum"]),
                                     ("can_type", "=", "T"),
                                     ("can_date", "=", self.date)])
        if rec and self.trtp == "T":
            self.amend = True
        for rr in rec:
            self.itotal = float(ASD(self.itotal) + ASD(rr[7]))
        self.df.loadEntry(frt, pag, p + 2, data=self.itotal)
        self.rec = self.sql.getRec("cshcnt",
                                   where=[("cct_cono", "=",
                                           self.opts["conum"]),
                                          ("cct_type", "=", "T"),
                                          ("cct_date", "=", self.date)],
                                   limit=1)
        if self.rec and self.trtp == "C":
            self.amend = True
        if self.amend:
            return "nc"

    def doCode(self, frt, pag, r, c, p, i, w):
        if self.glint == "N" and not w:
            ok = askQuestion(self.opts["mf"].body,
                             "Code Maintenance",
                             "Do You Want to Add or Edit Codes?",
                             default="no")
            if ok == "no":
                return "rf"
            w = callModule(self.opts["mf"],
                           self.df,
                           "cs1010",
                           coy=[self.opts["conum"], self.opts["conam"]],
                           user=self.opts["capnm"],
                           args=True,
                           ret="acno")
            self.df.loadEntry(frt, pag, p, data=w)
        if self.glint == "Y":
            acc = self.sql.getRec("genmst",
                                  cols=["glm_desc", "glm_vat"],
                                  where=[("glm_cono", "=", self.opts["conum"]),
                                         ("glm_acno", "=", w)],
                                  limit=1)
        else:
            acc = self.sql.getRec("cshmst",
                                  cols=["ccm_desc", "ccm_vat"],
                                  where=[("ccm_cono", "=", self.opts["conum"]),
                                         ("ccm_acno", "=", w)],
                                  limit=1)
        if not acc:
            return "Invalid Code"
        self.code = w
        self.vcod = acc[1]
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])

    def doDesc(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("cshana",
                              cols=["can_vatcod"],
                              where=[("can_cono", "=", self.opts["conum"]),
                                     ("can_code", "=", self.code),
                                     ("can_desc", "=", w)],
                              order="can_date desc",
                              limit=1)
        if acc:
            self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        else:
            self.df.loadEntry(frt, pag, p + 1, data=self.vcod)

    def doVCode(self, frt, pag, r, c, p, i, w):
        self.vatrte = getVatRate(self.sql, self.opts["conum"], w, self.date)
        if self.vatrte is None:
            ask = askQuestion(self.opts["mf"].body,
                              "New Code",
                              "Code Does Not Exist, Create a New Code?",
                              default="no")
            if ask == "no":
                return "Invalid VAT Code"
            w = callModule(self.opts["mf"],
                           self.df,
                           "ms1040",
                           coy=[self.opts["conum"], self.opts["conam"]],
                           user=self.opts["capnm"],
                           args=w,
                           ret="code")
            self.df.loadEntry(frt, pag, p, data=w)
        self.vatrte = getVatRate(self.sql, self.opts["conum"], w, self.date)
        if self.vatrte is None:
            return "Invalid VAT Code"

    def doIncAmt(self, frt, pag, r, c, p, i, w):
        self.iamt = w
        if self.vatrte:
            vat = self.iamt * self.vatrte / float(ASD(100) + ASD(self.vatrte))
            self.df.loadEntry(frt, pag, p + 1, data=round(vat, 2))
        else:
            self.df.loadEntry(frt, pag, p + 1, data=0)
            if not self.loader:
                return "sk1"

    def doCheq(self, frt, pag, r, c, p, i, w):
        self.ctotal = w
        self.df.loadEntry("T", 0, 4, data=self.ctotal)

    def doQty(self, frt, pag, r, c, p, i, w):
        val = w * self.denoms[int(p / 2)][1]
        self.df.loadEntry(frt, pag, p + 1, val)
        self.ctotal = float(ASD(self.ctotal) + ASD(val))
        self.df.loadEntry("T", 0, 4, data=self.ctotal)

    def doEdit(self):
        if self.df.pag in (1, 2):
            self.doEditPage12()
        else:
            self.doEditPage3()

    def doEditPage12(self):
        ana = self.sql.getRec("cshana",
                              where=[("can_cono", "=", self.opts["conum"]),
                                     ("can_type", "=", self.trtp),
                                     ("can_date", "=", self.date)])
        data = []
        for rec in ana:
            dat = []
            for n, d in enumerate(rec):
                if n in (0, 1, 2, 9):
                    continue
                dat.append(d)
            data.append(dat)
        titl = "Analysis"
        head = ("Date", "Code", "Description", "V", "Inc-Amount", "VAT-Amount",
                "Seq")
        lin = {
            "stype":
            "C",
            "titl":
            titl,
            "head":
            head,
            "typs": (("D1", 10), ("UI", 7), ("NA", 30), ("UA", 1),
                     ("SD", 13.2), ("SD", 13.2), ("UA", 1), ("US", 10)),
            "data":
            data
        }
        state = self.df.disableButtonsTags()
        self.opts["mf"].updateStatus("Select a Line to Edit")
        chg = self.df.selChoice(lin)
        if chg and chg.selection:
            self.edit = self.sql.getRec("cshana",
                                        where=[("can_seq", "=",
                                                chg.selection[-1])],
                                        limit=1)
            self.doChgChanges()
        else:
            self.edit = None
        self.doLoadAnalysis()
        self.df.enableButtonsTags(state=state)

    def doChgChanges(self):
        tit = ("Change Line", )
        fld = ((("T", 0, 0,
                 0), "I@can_trdt", 10, "", "", "", "N", self.doChgDate, None,
                None, ("efld", )), (("T", 0, 1, 0), "I@can_code", 0, "", "",
                                    "", "N", None, self.cod, None, None),
               (("T", 0, 2, 0), "I@can_desc", 0, "", "", "", "N", None, None,
                None, ("efld", )), (("T", 0, 3,
                                     0), "I@can_vatcod", 0, "", "", "", "N",
                                    self.doChgVCode, None, None, ("efld", )),
               (("T", 0, 4, 0), "I@can_incamt", 0, "", "", "", "N",
                self.doChgIncAmt, None, None,
                ("efld", )), (("T", 0, 5, 0), "I@can_vatamt", 0, "", "", "",
                              "N", None, None, None, ("efld", )))
        but = [["Delete", None, self.doChgDel, 1, None, None]]
        self.cg = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               butt=but,
                               tend=((self.doChgEnd, "n"), ),
                               txit=(self.doChgExit, ),
                               focus=False)
        for num, dat in enumerate(self.edit[3:9]):
            self.cg.loadEntry("T", 0, num, data=dat)
        self.cg.focusField("T", 0, 1, clr=False)
        self.cg.mstFrame.wait_window()

    def doChgDate(self, frt, pag, r, c, p, i, w):
        self.chgdte = w

    def doChgVCode(self, frt, pag, r, c, p, i, w):
        self.vatrte = getVatRate(self.sql, self.opts["conum"], w, self.chgdte)
        if self.vatrte is None:
            return "Invalid VAT Code"

    def doChgIncAmt(self, frt, pag, r, c, p, i, w):
        self.iamt = w
        if self.vatrte:
            vat = self.iamt * self.vatrte / float(ASD(100) + ASD(self.vatrte))
            self.cg.loadEntry(frt, pag, p + 1, data=round(vat, 2))
        else:
            self.cg.loadEntry(frt, pag, p + 1, data=0)
            return "sk1"

    def doChgDel(self):
        self.sql.delRec("cshana", data=self.edit)
        self.doChgExit()

    def doChgEnd(self):
        self.sql.delRec("cshana", data=self.edit)
        for num, fld in enumerate(self.cg.t_work[0][0]):
            self.edit[num + 3] = fld
        self.sql.insRec("cshana", data=self.edit)
        self.opts["mf"].dbm.commitDbase()
        self.doChgExit()

    def doChgExit(self):
        self.cg.closeProcess()

    def doEditPage3(self):
        titl = "Denominations"
        data = []
        for num, rec in enumerate(self.df.c_work[3]):
            data.append([self.denoms[num][0], rec[0], rec[1]])
        lin = {
            "stype": "C",
            "deco": True,
            "titl": titl,
            "head": ("Denom", "Qty", "Value"),
            "typs": (("NA", 4), ("UI", 5), ("SD", 13.2)),
            "data": data,
            "retn": "I"
        }
        state = self.df.disableButtonsTags()
        self.opts["mf"].updateStatus("Select a Denomination to Edit")
        chg = self.df.selChoice(lin)
        self.df.enableButtonsTags(state=state)
        if chg and chg.selection:
            self.edit = self.df.col
            qty, val = self.df.c_work[3][chg.selection[0]]
            self.ctotal = float(ASD(self.ctotal) - ASD(val))
            self.df.focusField("C", 3, (chg.selection[0] * 2) + 1)
        else:
            self.edit = None
            self.df.focusField("C", 3, self.df.col)

    def doTopEnd(self):
        if self.df.pag == 0:
            if self.trtp == "P":
                self.df.selPage("Expenses")
                if self.amend:
                    self.doLoadAnalysis()
                else:
                    self.df.focusField("C", 1, 1)
            elif self.trtp == "T":
                self.df.selPage("Income")
                if self.amend:
                    self.doLoadAnalysis()
                else:
                    self.df.focusField("C", 2, 1)
            else:
                self.df.selPage("Cash")
                if not self.amend:
                    self.df.focusField("T", 3, 1)
                else:
                    self.doLoadCash()
        elif self.df.pag == 3:
            self.df.focusField("C", 3, 1)

    def doColEnd(self):
        if self.trtp in ("P", "T"):
            if self.trtp == "P":
                data = [self.opts["conum"], self.trtp, self.date]
                data.extend(self.df.c_work[1][self.df.row])
                data.append("N")
                self.sql.insRec("cshana", data=data)
                self.etotal = float(ASD(self.etotal) + ASD(self.iamt))
                self.df.loadEntry("T", 0, 2, data=self.etotal)
                self.df.advanceLine(1)
            else:
                data = [self.opts["conum"], self.trtp, self.date]
                data.extend(self.df.c_work[2][self.df.row])
                data.append("N")
                self.sql.insRec("cshana", data=data)
                self.itotal = float(ASD(self.itotal) + ASD(self.iamt))
                self.df.loadEntry("T", 0, 3, data=self.itotal)
                self.df.advanceLine(2)
        else:
            if self.df.col == 28:
                ask = askQuestion(self.opts["mf"].body, "Accept",
                                  "Accept All Entries")
                if ask == "yes":
                    data = [self.opts["conum"], "T", self.date]
                    data.append(self.df.t_work[3][0][0])
                    for x in range(14):
                        data.append(self.df.c_work[3][x][0])
                    if self.amend:
                        self.sql.delRec("cshcnt",
                                        where=[("cct_cono", "=",
                                                self.opts["conum"]),
                                               ("cct_type", "=", "T"),
                                               ("cct_date", "=", self.date)])
                    self.sql.insRec("cshcnt", data=data)
                    self.opts["mf"].dbm.commitDbase()
                    self.doRestart()
                else:
                    self.df.focusField("T", 3, 1, clr=False)
            elif self.edit:
                col = self.edit
                self.edit = None
                self.df.focusField("C", 3, col)
            else:
                self.df.advanceLine(self.df.pag)

    def doLoadCash(self):
        self.df.doInvoke(["T", 3, 1, self.doCheq], self.rec[3])
        for num, qty in enumerate(self.rec[4:-1]):
            col = (num * 2) + 1
            self.df.doInvoke(["C", 3, col, self.doQty], qty)

    def doLoadAnalysis(self):
        self.loader = True
        total = 0
        if self.trtp == "P":
            pag = 1
        else:
            pag = 2
        self.df.clearFrame("C", pag)
        ana = self.sql.getRec("cshana",
                              where=[("can_cono", "=", self.opts["conum"]),
                                     ("can_type", "=", self.trtp),
                                     ("can_date", "=", self.date)],
                              order="can_seq")
        if not ana:
            self.df.focusField("C", pag, 1)
        else:
            for num, rec in enumerate(ana):
                if num > 14:
                    num = 14
                for pos, dat in enumerate(rec[3:9]):
                    col = (num * 6) + pos + 1
                    if pos == 3:
                        self.df.doInvoke(["C", pag, col, self.doVCode], dat)
                    elif pos == 4:
                        self.df.doInvoke(["C", pag, col, self.doIncAmt], dat)
                    else:
                        self.df.doInvoke(["C", pag, col, "rt"], dat)
                total = float(ASD(total) + ASD(self.iamt))
                self.df.advanceLine(pag)
        if self.trtp == "P":
            self.etotal = total
            self.df.loadEntry("T", 0, 2, data=self.etotal)
        else:
            self.itotal = total
            self.df.loadEntry("T", 0, 3, data=self.itotal)
        self.loader = False

    def doQuit(self):
        self.opts["mf"].dbm.rollbackDbase()
        self.doRestart()

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

    def doColExit(self):
        if self.df.pag != 3:
            self.opts["mf"].dbm.commitDbase()
            self.doRestart()
        elif self.df.pos:
            self.df.loadEntry("C",
                              3,
                              self.df.pos,
                              data=self.df.c_work[3][self.df.row][self.df.idx])
            r = self.df.row - 1
            c = self.df.col - 2
            self.ctotal = float(
                ASD(self.ctotal) - ASD(self.df.c_work[3][r][1]))
            self.df.focusField("C", 3, c)

    def doRestart(self):
        self.df.clearFrame("C", 1)
        self.df.clearFrame("C", 2)
        self.df.clearFrame("T", 3)
        self.df.clearFrame("C", 3)
        self.df.selPage("Expenses")
        self.df.focusField("T", 0, 1, clr=True)
コード例 #16
0
class ar4010(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,
                       ["assctl", "assgrp", "assdep", "assmst", "asstrn"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.gc = GetCtl(self.opts["mf"])
        assctl = self.gc.getCtl("assctl", self.opts["conum"])
        if not assctl:
            return
        self.glint = assctl["cta_glint"]
        self.rordp = assctl["cta_rordp"]
        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.sper = int(self.opts["period"][1][0] / 100)
        self.eper = int(self.opts["period"][2][0] / 100)
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Asset Register Interrogation (%s)" %
                    self.__class__.__name__)
        grp = {
            "stype":
            "R",
            "tables": ("assgrp", ),
            "cols": (("asg_group", "", 0, "Grp"), ("asg_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("asg_cono", "=", self.opts["conum"])]
        }
        cod = {
            "stype":
            "R",
            "tables": ("assmst", ),
            "cols": (("asm_code", "", 0, "Code"), ("asm_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("asm_cono", "=", self.opts["conum"])],
            "whera": (("T", "asm_group", 0, 0), )
        }
        tag = (("Depreciation", 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)))
        r1s = (("Straight Line", "S"), ("Balance", "D"), ("None", "N"))
        r2s = (("Yes", "Y"), ("No", "N"))
        fld = [(("T", 0, 0, 0), "IUA", 3, "Group", "Asset Group", "", "N",
                self.doGroup, grp, None, ("notblank", )),
               (("T", 0, 0, 0), "INa", 7, "Code", "Asset Code", "", "N",
                self.doCode, cod, None, ("notblank", )),
               (("T", 0, 0, 0), "ONA", 30, "Description"),
               (("T", 1, 0, 0), "ONa", 3, "Dep Code"),
               (("T", 1, 0, 0), "ONA", 40, ""),
               (("T", 1, 1, 0), ("ORB", r1s[:-1]), 0, "Company Type"),
               (("T", 1, 2, 0), ("ORB", r1s), 0, "Receiver Type")]
        if self.rordp == "Y":
            fld.extend([(("C", 1, 0, 0), "OUD", 15.2, "Company-Rate", "", "",
                         "N", None, None, None, None, ("Period", 7)),
                        (("C", 1, 0, 1), "OUD", 15.2, "Receiver-Rate")])
        else:
            fld.append((("C", 1, 0, 0), "OUD", 15.2, "Rate", "", "", "N", None,
                        None, None, None, ("Period", 7)))
        fld.extend([(("T", 2, 0, 0), "Od1", 10, "Date of Purchase"),
                    (("T", 2, 0, 0), "OSD", 15.2, "Purchase Price")])
        if self.rordp == "Y":
            fld.extend([(("C", 2, 0, 0), "OSD", 15.2, "Company-Value", "", "",
                         "N", None, None, None, None, ("Details", 7)),
                        (("C", 2, 0, 1), "OSD", 15.2, "Receiver-Value")])
        else:
            fld.append((("C", 2, 0, 0), "OSD", 15.2, "Value", "", "", "N",
                        None, None, None, None, ("Details", 7)))
        fld.append((("T", 3, 0, 0), ("IRB", r2s), 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)
        txt = (self.doExit, None, None, self.doExit)
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               tags=tag,
                               eflds=fld,
                               butt=but,
                               tend=tnd,
                               txit=txt)
        for x in range(7):
            self.df.colLabel[1][x].configure(text="Year %s" % (x + 1))
        self.df.colLabel[2][0].configure(text="Opening Book Value")
        self.df.colLabel[2][1].configure(text="Purchases         ")
        self.df.colLabel[2][2].configure(text="Improvements      ")
        self.df.colLabel[2][3].configure(text="Write Offs        ")
        self.df.colLabel[2][4].configure(text="Depreciation      ")
        self.df.colLabel[2][5].configure(text="Sales             ")
        self.df.colLabel[2][6].configure(text="Closing Book Value")

    def doGroup(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("assgrp",
                              where=[("asg_cono", "=", self.opts["conum"]),
                                     ("asg_group", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Asset Group"
        self.group = w

    def doCode(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("assmst",
                              cols=["asm_desc", "asm_depcod"],
                              where=[("asm_cono", "=", self.opts["conum"]),
                                     ("asm_group", "=", self.group),
                                     ("asm_code", "=", w)],
                              limit=1)
        if not acc:
            return "Asset Does Not Exist"
        self.code = w
        self.desc = acc[0]
        self.df.loadEntry(frt, pag, p + 1, data=self.desc)
        dep = self.sql.getRec("assdep",
                              where=[("asd_cono", "=", self.opts["conum"]),
                                     ("asd_code", "=", acc[1])],
                              limit=1)
        for x in range(self.df.topq[1]):
            self.df.loadEntry("T", 1, x, data=dep[x + 1])
        if self.rordp == "Y":
            for y in range(14):
                self.df.loadEntry("C", 1, y, data=dep[x + y + 2])
        else:
            p = 5
            for y in range(7):
                self.df.loadEntry("C", 1, y, data=dep[p])
                p += 2
        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"],
                        "ASS",
                        self.opts["conum"],
                        self.sper,
                        keys=(self.group, self.code))
        asset = bals.doAssBals(start=self.sper, end=self.eper, trans="C")
        if not asset:
            return
        cap, cdp, rdp, cbl, rbl, mov, trn = asset
        dte = self.sql.getRec("asstrn",
                              cols=["min(ast_date)"],
                              where=[("ast_cono", "=", self.opts["conum"]),
                                     ("ast_group", "=", self.group),
                                     ("ast_code", "=", self.code),
                                     ("ast_mtyp", "=", 1)],
                              limit=1)
        if dte[0]:
            val = self.sql.getRec("asstrn",
                                  cols=["ast_amt1"],
                                  where=[("ast_cono", "=", self.opts["conum"]),
                                         ("ast_group", "=", self.group),
                                         ("ast_code", "=", self.code),
                                         ("ast_mtyp", "=", 1),
                                         ("ast_date", "=", dte[0])],
                                  limit=1)
            self.df.loadEntry("T", 2, 0, data=dte[0])
            self.df.loadEntry("T", 2, 1, data=val[0])
        self.df.loadEntry("C", 2, 0, data=cbl)
        if self.rordp == "Y":
            self.df.loadEntry("C", 2, 1, data=rbl)
        else:
            self.df.loadEntry("C", 2, 1, data=0)
        if mov:
            for n, c, r in mov:
                if self.rordp == "Y":
                    p = n * 2
                else:
                    p = n
                cbl = float(ASD(cbl) + ASD(c))
                if self.rordp == "Y":
                    rbl = float(ASD(rbl) + ASD(r))
                self.df.loadEntry("C", 2, p, data=c)
                if self.rordp == "Y":
                    self.df.loadEntry("C", 2, p + 1, data=r)
        if self.rordp == "Y":
            self.df.loadEntry("C", 2, 12, data=cbl)
            self.df.loadEntry("C", 2, 13, data=rbl)
        else:
            self.df.loadEntry("C", 2, 6, data=cbl)

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

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

    def doTrans2(self, frt, pag, r, c, p, i, w):
        tit = "Transactions for Item: %s %s - %s" % \
            (self.group, self.code, self.desc)
        dat, atc, col = self.getTrans(hist=w)
        if dat:
            state = self.df.disableButtonsTags()
            while True:
                rec = SelectChoice(self.df.nb.Page3, tit, atc, dat)
                if rec.selection:
                    self.df.setWidget(self.df.mstFrame, state="hide")
                    whr = [("ast_seq", "=", rec.selection[len(col)])]
                    TabPrt(self.opts["mf"],
                           tabs="asstrn",
                           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"], "ASS",
                    "%3s%s" % (self.group, self.code))
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

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

    def doPrint(self):
        mess = "Select the Required Print Option."
        butt = (("Balances", "B"), ("Transactions", "T"), ("Both", "A"),
                ("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
        pdfnam = getModName(self.opts["mf"].rcdic["wrkdir"],
                            self.__class__.__name__,
                            self.opts["conum"],
                            ext="pdf")
        if self.rordp == "Y":
            self.head = "%03u %-93s" % (self.opts["conum"], self.opts["conam"])
        else:
            self.head = "%03u %-77s" % (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()
        if opt == "B":
            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 == "A":
            dat, atc, col = self.getTrans()
            if not dat:
                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(dat, atc)
                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":
            dat, atc, col = self.getTrans()
            if dat:
                self.pageHeading()
                self.pageHeadingTrans()
                self.printTrans(dat, atc)
                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(
                "%-15s%-30s %s" %
                ("", self.df.topf[0][x][3], self.df.t_disp[0][0][x]))
        self.fpdf.drawText()
        self.fpdf.drawText(
            "%-15s%-30s %s" %
            ("", self.df.topf[1][0][3], self.df.t_disp[1][0][0]))
        self.fpdf.drawText("%-15s%-30s %s" %
                           ("", "Dep Description", self.df.t_disp[1][0][1]))
        self.fpdf.drawText()
        self.fpdf.drawText("%-15s%-30s     %s" %
                           ("", "Date of Purchase", self.df.t_disp[2][0][0]))
        self.fpdf.drawText("%-15s%-30s %s" %
                           ("", "Cost of Purchase", self.df.t_disp[2][0][1]))
        self.fpdf.drawText()
        self.pglin += 3 + len(self.df.topf[1])
        self.fpdf.setFont(style="B")
        if self.rordp == "Y":
            self.fpdf.drawText("%15s%-30s %15s %15s" % \
                ("", "Details", "Company ", "Receiver "))
            self.fpdf.underLine(txt="%15s%s" % ("", self.fpdf.suc * 61))
        else:
            self.fpdf.drawText("%15s%-30s %15s" % \
                ("", "Details", "Balances "))
            self.fpdf.underLine(txt="%15s%s" % ("", self.fpdf.suc * 45))
        self.fpdf.setFont()
        desc = ("Opening Book Value", "Purchases         ",
                "Improvements      ", "Write Offs        ",
                "Depreciation      ", "Sales             ",
                "Closing Book Value")
        for n, d in enumerate(self.df.c_disp[2]):
            if n == 6:
                if self.rordp == "Y":
                    self.fpdf.underLine(txt="%15s%s" %
                                        ("", self.fpdf.suc * 61))
                else:
                    self.fpdf.underLine(txt="%15s%s" %
                                        ("", self.fpdf.suc * 45))
            if self.rordp == "Y":
                self.fpdf.drawText("%15s%-30s %15s %15s" %
                                   (" ", desc[n][:30], d[0], d[1]))
            else:
                self.fpdf.drawText("%15s%-30s %15s" %
                                   (" ", desc[n][:30], d[0]))

    def printTrans(self, trn, atc):
        for ct in trn:
            trdt = CCD(ct[0], "D1", 10)
            ref1 = CCD(ct[5], "Na", 9)
            trtp = CCD(ct[3], "UI", 1)
            batch = CCD(ct[2], "Na", 7)
            mtyp = CCD(ct[4], "UI", 1)
            amt1 = CCD(ct[6], "SD", 15.2)
            if self.rordp == "Y":
                amt2 = CCD(ct[7], "SD", 15.2)
                detail = CCD(ct[8], "NA", 30)
            else:
                detail = CCD(ct[7], "NA", 30)
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
                self.pageHeadingTrans()
            if self.rordp == "Y":
                self.fpdf.drawText(
                    "%s %s %s %s %s %s %s %s" %
                    (trdt.disp, ref1.disp, artrtp[(trtp.work - 1)][0],
                     batch.disp, armvtp[(mtyp.work - 1)][0], amt1.disp,
                     amt2.disp, detail.disp))
            else:
                self.fpdf.drawText(
                    "%s %s %s %s %s %s %s" %
                    (trdt.disp, ref1.disp, artrtp[(trtp.work - 1)][0],
                     batch.disp, armvtp[(mtyp.work - 1)][0], amt1.disp,
                     detail.disp))
            self.pglin += 1

    def pageHeading(self):
        self.fpdf.add_page()
        self.fpdf.setFont(style="B")
        self.fpdf.drawText(self.head)
        self.fpdf.drawText()
        if self.rordp == "Y":
            self.fpdf.drawText(
                "%-35s %-61s" %
                ("Assets Register Interrogation as at", self.sysdtd))
        else:
            self.fpdf.drawText(
                "%-35s %-45s" %
                ("Assets Register Interrogation as at", self.sysdtd))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 6

    def pageHeadingTrans(self):
        self.fpdf.setFont(style="B")
        self.fpdf.drawText()
        self.fpdf.drawText(
            "%-5s %-10s %s %s %-5s %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.fpdf.drawText()
        if self.rordp == "Y":
            self.fpdf.drawText("%-10s %-9s %-3s %-7s %3s %-15s %-15s %-30s" % \
                ("   Date", "Reference", "Typ", "Batch", "Mov",
                "      Amount-1", "      Amount-2", "Remarks"))
        else:
            self.fpdf.drawText("%-10s %-9s %-3s %-7s %3s %-15s %-30s" % \
                ("   Date", "Reference", "Typ", "Batch", "Mov",
                "      Amount-1", "Remarks"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 8

    def getTrans(self, hist="Y"):
        if self.rordp == "Y":
            col = ("ast_date", "ast_curdt", "ast_batch", "ast_type",
                   "ast_mtyp", "ast_refno", "ast_amt1", "ast_amt2", "ast_desc",
                   "ast_seq")
        else:
            col = ("ast_date", "ast_curdt", "ast_batch", "ast_type",
                   "ast_mtyp", "ast_refno", "ast_amt1", "ast_desc", "ast_seq")
        atc = [("ast_date", "   Date", 10, "D1", "N"),
               ("ast_curdt", "Curr-Dt", 7, "D2", "N"),
               ("ast_batch", "Batch", 7, "Na", "N"),
               ("ast_type", "Typ", 3, ("XX", artrtp), "N"),
               ("ast_mtyp", "Mov", 3, ("XX", armvtp), "N"),
               ("ast_refno", "Reference", 9, "Na", "Y"),
               ("ast_amt1", "  Amount-1", 15.2, "SD", "N")]
        if self.rordp == "Y":
            atc.append(("ast_amt2", "  Amount-2", 15.2, "SD", "N"))
        atc.extend([("ast_desc", "Details", 30, "NA", "N"),
                    ("ast_seq", "Sequence", 8, "UI", "N")])
        whr = [("ast_cono", "=", self.opts["conum"]),
               ("ast_group", "=", self.group), ("ast_code", "=", self.code),
               ("ast_curdt", "<=", self.eper)]
        if hist == "N":
            whr.append(("ast_curdt", ">=", self.sper))
        odr = "ast_date, ast_refno"
        dat = self.sql.getRec("asstrn", cols=col, where=whr, order=odr)
        return dat, atc, col

    def doExit(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
コード例 #17
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)
コード例 #18
0
class st4010(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, [
            "ctlvmf", "drschn", "drsmst", "genmst", "strgrp", "strloc",
            "strmf1", "strmf2", "strgmu", "strcmu", "strrcp", "strtrn",
            "struoi"
        ],
                       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
        self.glint = strctl["cts_glint"]
        self.plevs = strctl["cts_plevs"]
        self.automu = strctl["cts_automu"]
        if strctl["cts_locs"] == "Y":
            self.locs = self.sql.getRec("strloc",
                                        cols=["count(*)"],
                                        where=[("srl_cono", "=",
                                                self.opts["conum"])],
                                        limit=1)[0]
        else:
            self.locs = 1
        t = time.localtime()
        self.sysdtw = (t[0] * 10000) + (t[1] * 100) + t[2]
        self.per_from = 0
        self.per_to = 0
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Stores Interrogation (%s)" % self.__class__.__name__)
        gpm = {
            "stype":
            "R",
            "tables": ("strgrp", ),
            "cols": (("gpm_group", "", 0, "Grp"), ("gpm_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("gpm_cono", "=", self.opts["conum"])]
        }
        stm = {
            "stype":
            "R",
            "tables": ("strmf1", ),
            "cols":
            (("st1_group", "", 0, "Grp"), ("st1_code", "", 0, "Product Code"),
             ("st1_type", "", 0, "T"), ("st1_desc", "", 0, "Description",
                                        "Y")),
            "where": [("st1_cono", "=", self.opts["conum"]),
                      ("st1_type", "<>", "X")],
            "whera": [["T", "st1_group", 0, 0]],
            "index":
            1
        }
        stl = {
            "stype":
            "R",
            "tables": ("strloc", "strmf2"),
            "cols":
            (("srl_loc", "UA", 1, "L"), ("srl_desc", "", 0, "Location", "Y")),
            "where": [("srl_cono", "=", self.opts["conum"]),
                      ("srl_loc=st2_loc", ), ("st2_cono=srl_cono", )],
            "whera": [["T", "st2_group", 0], ["T", "st2_code", 1]],
            "sort":
            "srl_loc",
            "index":
            0
        }
        r1s = (("Normal", "N"), ("Recipe", "R"))
        r2s = (("Average", "A"), ("Standard", "S"), ("None", "N"))
        r3s = (("Manual", "M"), ("Automatic", "A"), ("Zero", "Z"))
        tag = (("Basic", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Balances", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("History", self.doTagSelect, ("T", 0, 0), ("T", 0, 1)),
               ("Trans", self.doTrans1, ("T", 0, 0), ("T", 0, 1)))
        fld = [(("T", 0, 0, 0), "IUA", 3, "Grp", "Product Group", "", "N",
                self.doGroup, gpm, None, ("notblank", )),
               (("T", 0, 0, 0), "INA", 20, "Code", "Product Code", "", "N",
                self.doCode, stm, None, ("notblank", )),
               (("T", 0, 0, 0), "ONA", 30, ""),
               (("T", 0, 0, 0), "IUA", 1, "Loc", "Location", "", "N",
                self.doLoc, stl, None, ("efld", )),
               (("T", 0, 0, 0), "ONA", 20, ""),
               (("T", 1, 0, 0), ("ORB", r1s), 0, "Type of Item"),
               (("T", 1, 1, 0), "ONA", 10, "Unit of Issue"),
               (("T", 1, 1, 0), "ONA", 20, ""),
               (("T", 1, 2, 0), ("ORB", r2s), 0, "Value Indicator"),
               (("T", 1, 3, 0), "OUA", 1, "VAT Code"),
               (("T", 1, 3, 0), "ONA", 29, ""),
               (("T", 1, 4, 0), "OUI", 3, "Exclusive Chainstore"),
               (("T", 1, 4, 0), "ONA", 27, ""),
               (("T", 1, 5, 0), "ONA", 7, "Exclusive Account"),
               (("T", 1, 5, 0), "ONA", 23, ""),
               (("T", 1, 6, 0), "OUI", 7, "Sales Code"),
               (("T", 1, 6, 0), "ONA", 23, ""),
               (("T", 1, 7, 0), "OUI", 7, "COS Code"),
               (("T", 1, 7, 0), "ONA", 23, ""),
               (("T", 1, 8, 0), "OUA", 8, "Bin Number"),
               (("T", 1, 9, 0), ("ORB", r3s), 0, "Re-Order Indicator"),
               (("T", 1, 10, 0), "OUI", 7, "Re-Order Level"),
               (("T", 1, 11, 0), "OUI", 7, "Re-Order Quantity"),
               (("T", 1, 12, 0), "OUD", 6.2, "Price Markup    Lv1")]
        for x in range(self.plevs - 1):
            fld.append((("T", 1, 12, 0), "OUD", 6.2, " Lv%s" % (x + 2)))
        fld.extend([(("T", 2, 0, 0), "Od1", 10, "Date Last Receipt"),
                    (("T", 2, 1, 0), "Od1", 10, "Date Last Issue"),
                    (("T", 2, 2, 0), "OSD", 12.2, "Quantity Balance"),
                    (("T", 2, 3, 0), "OSD", 12.2, "Value Balance"),
                    [("T", 2, 4, 0), "OSD", 12.2, "Average Cost"],
                    (("T", 2, 5, 0), "OSD", 12.2, "Quantity on P/O"),
                    (("T", 2, 6, 0), "OSD", 12.2, "Quantity on S/O"),
                    (("C", 3, 0, 0), "OSD", 13.2, "Qty-Receipts", "", "", "N",
                     None, None, None, None, ("Months", 13)),
                    (("C", 3, 0, 1), "OSD", 13.2, "Val-Receipts"),
                    (("C", 3, 0, 2), "OSD", 13.2, "Qty-Issues"),
                    (("C", 3, 0, 3), "OSD", 13.2, "Val-Issues"),
                    (("T", 4, 0,
                      0), "Id2", 7, "Start Period", "Start Period (0=All)", "",
                     "N", self.doTrans2a, None, None, ("efld", )),
                    (("T", 4, 0, 0), "Id2", 7, "End Period", "End Period", "",
                     "N", self.doTrans2b, None, None, ("efld", ))])
        but = (("Clear", None, self.doClear, 1, ("T", 0, 0), ("T", 0, 1)),
               ("Recipe", None, self.doRecipe, None, None, None),
               ("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.doEndTop, "N"), None, None, None, (self.doTrans2c, "N"))
        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)
        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[3][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[3][x - 1].configure(text=nam)
                self.hist_tit.append(nam)
            if x != 13:
                mon -= 1
                if not mon:
                    mon = mon + 12
                    yer -= 1

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

    def doCode(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("strmf1",
                              where=[("st1_cono", "=", self.opts["conum"]),
                                     ("st1_group", "=", self.group),
                                     ("st1_code", "=", w),
                                     ("st1_type", "<>", "X")],
                              limit=1)
        if not acc:
            return "Invalid or Redundant Code"
        self.code = w
        self.desc = acc[self.sql.strmf1_col.index("st1_desc")]
        valind = acc[self.sql.strmf1_col.index("st1_value_ind")]
        self.df.loadEntry("T", 0, 2, data=self.desc)
        pag = 1
        d = 3
        for x in range(0, 15):
            if x == 2:
                self.loadUoi(x, acc[d - 1])
            elif x == 5:
                self.loadVat(x, acc[d - 1])
            elif x == 7:
                self.loadChnExcl(x, acc[d - 1])
            elif x == 9:
                self.loadAccExcl(x, acc[d - 1])
            elif x in (11, 13):
                self.loadGen(x, acc[d - 1])
            else:
                self.df.loadEntry("T", pag, x, data=acc[d])
                if d == 3:
                    self.itype = acc[d]
                    d += 2
                else:
                    d += 1
        if valind == "S":
            self.df.topLabel[2][4].configure(text="%-18s" % "Standard Cost")
        else:
            self.df.topLabel[2][4].configure(text="%-18s" % "Average Cost")
        if self.locs == 1:
            self.df.loadEntry("T", 0, 3, data="1")
            no = self.doLoc(frt, pag, r, c + 1, p + 1, i + 1, "1")
            if no:
                return no
            return "sk2"

    def doLoc(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("strloc",
                              cols=["srl_desc"],
                              where=[("srl_cono", "=", self.opts["conum"]),
                                     ("srl_loc", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Location Code"
        self.df.loadEntry("T", 0, 4, data=acc[0])
        acc = self.sql.getRec("strmf2",
                              where=[("st2_cono", "=", self.opts["conum"]),
                                     ("st2_group", "=", self.group),
                                     ("st2_code", "=", self.code),
                                     ("st2_loc", "=", w)],
                              limit=1)
        if not acc:
            return "This location does not exist for this product"
        self.loc = w
        d = 4
        for x in range(14, 18):
            self.df.loadEntry("T", 1, x, data=acc[d])
            d += 1
        if self.automu in ("A", "L"):
            for lev in range(1, self.plevs + 1):
                mup = getMarkup(self.sql, self.opts["conum"], self.group,
                                self.code, self.loc, lev)
                self.df.loadEntry("T", 1, x + lev, data=mup)
        self.loadBalances()
        if self.itype == "R":
            self.df.setWidget(self.df.B1, "normal")
        else:
            self.df.setWidget(self.df.B1, "disabled")

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

    def loadUoi(self, pos, uoi):
        acc = self.sql.getRec("struoi",
                              cols=["unm_desc"],
                              where=[("unm_cono", "=", self.opts["conum"]),
                                     ("unm_unit", "=", uoi)],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, pos, data=acc[0])

    def loadChnExcl(self, pos, chn):
        self.chn = chn
        if self.chn:
            acc = self.sql.getRec("drschn",
                                  cols=["chm_name"],
                                  where=[("chm_cono", "=", self.opts["conum"]),
                                         ("chm_chain", "=", self.chn)],
                                  limit=1)
            if acc:
                self.df.loadEntry("T", 1, pos, data=acc[0])

    def loadAccExcl(self, pos, drm):
        acc = self.sql.getRec("drsmst",
                              cols=["drm_name"],
                              where=[("drm_cono", "=", self.opts["conum"]),
                                     ("drm_chain", "=", self.chn),
                                     ("drm_acno", "=", drm)],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, pos, data=acc[0])

    def loadVat(self, pos, vat):
        acc = self.sql.getRec("ctlvmf",
                              cols=["vtm_desc"],
                              where=[("vtm_cono", "=", self.opts["conum"]),
                                     ("vtm_code", "=", vat)],
                              limit=1)
        if not vat:
            self.df.loadEntry("T", 1, pos, data="Invalid VAT Record")
        else:
            self.df.loadEntry("T", 1, pos, data=acc[0])

    def loadGen(self, pos, gen):
        if self.glint == "N":
            return
        acc = self.sql.getRec("genmst",
                              cols=["glm_desc"],
                              where=[("glm_cono", "=", self.opts["conum"]),
                                     ("glm_acno", "=", gen)],
                              limit=1)
        if acc:
            self.df.loadEntry("T", 1, pos, data=acc[0])

    def loadBalances(self):
        bals = Balances(self.opts["mf"],
                        "STR",
                        self.opts["conum"],
                        int(self.sysdtw / 100),
                        keys=(self.group, self.code, self.loc,
                              ("P", self.opts["period"][0])))
        m_ob, m_mv, m_cb, y_ob, y_mv, y_cb, ac, lc, ls = bals.doStrBals()
        cb, oo, bo = bals.doStrOrds()
        this, hist = bals.doStrHist()
        rec = hist[0]
        rec.append(this[0])
        iss = hist[1]
        iss.append(this[1])
        lrec = self.sql.getRec("strtrn",
                               cols=["max(stt_trdt)"],
                               where=[("stt_cono", "=", self.opts["conum"]),
                                      ("stt_group", "=", self.group),
                                      ("stt_code", "=", self.code),
                                      ("stt_loc", "=", self.loc),
                                      ("stt_type", "in", (1, 3))])
        if not lrec[0][0]:
            lastrec = 0
        else:
            lastrec = lrec[0][0]
        liss = self.sql.getRec("strtrn",
                               cols=["max(stt_trdt)"],
                               where=[("stt_cono", "=", self.opts["conum"]),
                                      ("stt_group", "=", self.group),
                                      ("stt_code", "=", self.code),
                                      ("stt_loc", "=", self.loc),
                                      ("stt_type", "in", (2, 4, 7, 8))])
        if not liss or not liss[0][0]:
            lastiss = 0
        else:
            lastiss = liss[0][0]
        qbal = float(y_cb[0])
        vbal = float(y_cb[1])
        if qbal:
            cost = round((vbal / qbal), 2)
        else:
            cost = 0.0
        cst = CCD(cost, "SD", 10.2)
        self.df.loadEntry("T", 2, 0, data=lastrec)
        self.df.loadEntry("T", 2, 1, data=lastiss)
        self.df.loadEntry("T", 2, 2, data=qbal)
        self.df.loadEntry("T", 2, 3, data=vbal)
        self.df.loadEntry("T", 2, 4, data=cst.disp)
        self.df.loadEntry("T", 2, 5, data=oo.disp)
        self.df.loadEntry("T", 2, 6, data=bo.disp)
        p = 0
        for x in range(0, 13):
            i = 0
            self.df.loadEntry("C", 3, p, data=rec[x][0])
            p = p + 1
            i = i + 1
            self.df.loadEntry("C", 3, p, data=rec[x][1])
            p = p + 1
            i = i + 1
            amt = float(ASD(0) - ASD(iss[x][0]))
            self.df.loadEntry("C", 3, p, data=amt)
            p = p + 1
            i = i + 1
            amt = float(ASD(0) - ASD(iss[x][1]))
            self.df.loadEntry("C", 3, p, data=amt)
            p = p + 1
            i = i + 1

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

    def doRecipe(self):
        tit = "Recipe"
        self.rcp = self.getRecipeItems()
        state = self.df.disableButtonsTags()
        SRec(self.opts["mf"],
             screen=self.opts["mf"].body,
             title=tit,
             cols=self.rcp[0],
             where=self.rcp[1],
             wtype="D",
             butt=[("Print", self.printRecipe)])
        self.df.enableButtonsTags(state=state)

    def printRecipe(self):
        self.df.setWidget(self.df.mstFrame, state="hide")
        hds = [
            "Stores's Recipe",
            "Location: %s  Code: %s  Description: %s" %
            (self.loc, self.code, self.desc)
        ]
        RepPrt(self.opts["mf"],
               conum=self.opts["conum"],
               conam=self.opts["conam"],
               name=self.__class__.__name__,
               heads=hds,
               cols=self.rcp[0],
               tables=self.rcp[1],
               ttype="D",
               prtdia=(("Y", "V"), ("Y", "N")))
        self.df.setWidget(self.df.mstFrame, state="show")
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()

    def getRecipeItems(self):
        tab = ["strrcp", "strmf1"]
        col = ["srr_rgroup", "srr_rcode", "st1_desc", "srr_rqty"]
        whr = [("srr_cono", "=", self.opts["conum"]),
               ("srr_group", "=", self.group), ("srr_code", "=", self.code),
               ("srr_loc", "=", self.loc), ("st1_cono=srr_cono", ),
               ("st1_group=srr_rgroup", ), ("st1_code=srr_rcode", )]
        odr = "srr_rgroup, srr_rcode"
        items = self.sql.getRec(tables=tab, cols=col, where=whr, order=odr)
        for seq, item in enumerate(items):
            bals = Balances(self.opts["mf"],
                            "STR",
                            self.opts["conum"],
                            int(self.sysdtw / 100),
                            keys=(item[0], item[1], self.loc,
                                  ("P", self.opts["period"][0])))
            m_ob, m_mv, m_cb, y_ob, y_mv, y_cb, ac, lc, ls = bals.doStrBals()
            items[seq].extend([y_cb[0], lc])
        return ((("srr_rgroup", "UA", 3.0, "Grp"), ("srr_rcode", "NA", 20.0,
                                                    "Product-Code"),
                 ("st1_desc", "NA", 30.0,
                  "Description"), ("srr_rqty", "UD", 11.2, "   Quantity"),
                 ("balance", "SD", 13.2,
                  "    In-Stock"), ("cost", "UD", 11.2, "  Last-Cost")), items)

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

    def doTrans2a(self, frt, pag, r, c, p, i, w):
        self.per_from = w
        self.df.loadEntry("T", 4, 1, data=w)
        if not self.per_from:
            return "nc"

    def doTrans2b(self, frt, pag, r, c, p, i, w):
        self.per_to = w
        if not self.per_to or self.per_to < self.per_from:
            return "Invalid Period"

    def doTrans2c(self):
        tit = "Transactions for Item: %s %s - %s" % \
            (self.group, self.code, self.desc)
        tab = ["strtrn"]
        crt = (("stt_trdt", "", 0, "   Date"), ("stt_batch", "", 0, "Batch"),
               ("stt_type", "NA", 3,
                "Typ"), ("stt_ref1", "", 0, "Reference",
                         "Y"), ("stt_ref2", "", 0,
                                "Ref-Num-2"), ("stt_qty", "", 0, "  Quantity"),
               ("stt_cost", "", 0, "      Cost"), ("stt_sell", "", 0,
                                                   "   Selling"),
               ("qbal", "SD", 13.2,
                "   Qty-Bal"), ("cbal", "SD", 13.2,
                                "  Cost-Bal"), ("stt_desc", "", 0, "Details"))
        whr = [("stt_cono", "=", self.opts["conum"]),
               ("stt_group", "=", self.group), ("stt_code", "=", self.code),
               ("stt_loc", "=", self.loc)]
        if self.per_from:
            whr.extend([("stt_curdt", ">=", self.per_from),
                        ("stt_curdt", "<=", self.per_to)])
        odr = "stt_trdt, stt_qty desc"
        recs = self.sql.getRec("strtrn",
                               cols=[
                                   "stt_trdt", "stt_batch", "stt_type",
                                   "stt_ref1", "stt_ref2", "stt_qty",
                                   "stt_cost", "stt_sell", "stt_desc"
                               ],
                               where=whr,
                               order=odr)
        data = []
        tqty = 0
        tcst = 0
        for rec in recs:
            rec[2] = sttrtp[rec[2] - 1][0]
            tqty = float(ASD(tqty) + ASD(rec[5]))
            tcst = float(ASD(tcst) + ASD(rec[6]))
            rec.insert(8, tqty)
            rec.insert(9, tcst)
            data.append(rec)
        state = self.df.disableButtonsTags()
        while True:
            rec = SRec(self.opts["mf"],
                       screen=self.df.nb.Page4,
                       title=tit,
                       tables=tab,
                       cols=crt,
                       where=data,
                       wtype="D")
            if rec.selection:
                for n, t in enumerate(sttrtp):
                    if t[0] == rec.selection[2]:
                        typ = n + 1
                        break
                dte = rec.selection[0]
                doc = rec.selection[3]
                if self.itype == "R" and typ in (7, 8):
                    bt = (("Transaction", "T"), ("Recipe", "R"))
                    ask = askChoice(
                        self.df.window,
                        head="Details",
                        mess="Transaction Details or the Recipe Details",
                        butt=bt,
                        default="Transaction")
                else:
                    ask = "T"
                if ask == "T":
                    wher = [("stt_cono", "=", self.opts["conum"]),
                            ("stt_group", "=", self.group),
                            ("stt_code", "=", self.code),
                            ("stt_loc", "=", self.loc), ("stt_type", "=", typ),
                            ("stt_trdt", "=", dte), ("stt_ref1", "=", doc)]
                    TabPrt(self.opts["mf"],
                           tabs="strtrn",
                           where=wher,
                           pdia=False)
                elif typ == 7:
                    rct = "Recipe Details"
                    rcc = (("si3_line", "", 0, ""), ("si3_rgroup", "", 0, ""),
                           ("si3_rcode", "", 0, ""), ("st1_desc", "", 0, ""),
                           ("si3_rqty", "", 0, ""), ("si3_cost", "", 0, ""))
                    rcw = (("si3_cono", "=", self.opts["conum"]),
                           ("si3_rtn", "=", "I"), ("si3_docno", "=", doc),
                           ("st1_cono=si3_cono", ), ("st1_group=si3_rgroup", ),
                           ("st1_code=si3_rcode", ))
                    rco = "si3_line"
                    SRec(self.opts["mf"],
                         title=rct,
                         tables=["slsiv3", "strmf1"],
                         cols=rcc,
                         where=rcw,
                         order=rco)
                else:
                    rct = "Recipe Details"
                    rcc = (("prp_rowno", "", 0, ""), ("prp_rgroup", "", 0, ""),
                           ("prp_rcode", "", 0, ""), ("st1_desc", "", 0, ""),
                           ("prp_rqty", "", 0, ""), ("prp_cost", "", 0, ""))
                    rcw = (("prp_cono", "=", self.opts["conum"]), ("prp_docno",
                                                                   "=", doc),
                           ("st1_cono=prp_cono", ), ("st1_group=prp_rgroup", ),
                           ("st1_code=prp_rcode", ))
                    rco = "prp_rowno"
                    SRec(self.opts["mf"],
                         title=rct,
                         tables=["posrcp", "strmf1"],
                         cols=rcc,
                         where=rcw,
                         order=rco)
            else:
                break
        self.df.enableButtonsTags(state=state)
        self.df.focusField("T", 4, 1)

    def doNotes(self, wiget=None):
        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"], "STR",
                    "%3s%s" % (self.group, self.code))
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    def doClear(self):
        self.df.selPage("Basic")
        self.df.setWidget(self.df.B1, "disabled")
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        mess = "Select the Required Print Option."
        butt = [("Information", "I"), ("Transactions", "T")]
        if self.itype == "R":
            butt.append(("Recipe", "R"))
        butt.append(("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 == "I":
            head = "Stores Masterfile Record"
            tab = ["strmf1", "strmf2"]
            col = [
                "st1_group", "st1_code", "st2_loc", "st1_desc", "st1_type",
                "st1_uoi", "st1_value_ind", "st1_vatcode", "st1_chn_excl",
                "st1_acc_excl", "st1_sls", "st1_cos", "st2_bin",
                "st2_reord_ind", "st2_reord_level", "st2_reord_qty"
            ]
            whr = [("st1_cono", "=", self.opts["conum"]),
                   ("st1_group", "=", self.group),
                   ("st1_code", "=", self.code), ("st2_cono=st1_cono", ),
                   ("st2_group=st1_group", ), ("st2_code=st1_code", ),
                   ("st2_loc", "=", self.loc)]
            TabPrt(self.opts["mf"],
                   self.opts["conum"],
                   self.opts["conam"],
                   name=self.__class__.__name__,
                   head=head,
                   tabs=tab,
                   cols=col,
                   where=whr,
                   keys=[self.group, self.code, self.loc])
        elif opt == "T":
            tab = ["strtrn"]
            hds = [
                "Stores's Transactions",
                "Location: %s  Group: %s  Code: %s  Description: %s" %
                (self.loc, self.group, self.code, self.desc)
            ]
            col = []
            dic = self.sql.strtrn_dic
            for c in [
                    "stt_ref1", "stt_trdt", "stt_type", "stt_qty", "stt_cost",
                    "stt_sell", "stt_desc"
            ]:
                col.append([c, dic[c][2], dic[c][3], dic[c][5]])
            whr = [("stt_cono", "=", self.opts["conum"]),
                   ("stt_group", "=", self.group),
                   ("stt_code", "=", self.code), ("stt_loc", "=", self.loc)]
            if self.per_from:
                whr.extend([("stt_curdt", ">=", self.per_from),
                            ("stt_curdt", "<=", self.per_to)])
            odr = "stt_trdt, stt_ref1"
            gtots = ["stt_qty", "stt_cost", "stt_sell"]
            RepPrt(self.opts["mf"],
                   conum=self.opts["conum"],
                   conam=self.opts["conam"],
                   name=self.__class__.__name__,
                   tables=tab,
                   heads=hds,
                   cols=col,
                   where=whr,
                   order=odr,
                   gtots=gtots,
                   prtdia=(("Y", "V"), ("Y", "N")))
        else:
            self.rcp = self.getRecipeItems()
            hds = [
                "Stores's Recipe",
                "Location: %s  Code: %s  Description: %s" %
                (self.loc, self.code, self.desc)
            ]
            RepPrt(self.opts["mf"],
                   conum=self.opts["conum"],
                   conam=self.opts["conam"],
                   name=self.__class__.__name__,
                   heads=hds,
                   cols=self.rcp[0],
                   tables=self.rcp[1],
                   ttype="D",
                   prtdia=(("Y", "V"), ("Y", "N")))
        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()
コード例 #19
0
ファイル: st1010.py プロジェクト: paulmalherbe/Tartan
class st1010(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, [
            "ctlvmf", "ctlrep", "drschn", "drsmst", "genmst", "slsiv1",
            "slsiv2", "strgrp", "strloc", "strmf1", "strmf2", "strgmu",
            "strcmu", "strprc", "strrcp", "struoi", "strtrn", "strpot",
            "strvar", "slsiv3", "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
        self.glint = strctl["cts_glint"]
        self.locs = strctl["cts_locs"]
        self.plevs = strctl["cts_plevs"]
        self.automu = strctl["cts_automu"]
        self.drsctl = gc.getCtl("drsctl", self.opts["conum"], error=False)
        if not self.drsctl:
            self.chains = "N"
        else:
            self.chains = self.drsctl["ctd_chain"]
        return True

    def mainProcess(self):
        gpm = {
            "stype":
            "R",
            "tables": ("strgrp", ),
            "cols": (("gpm_group", "", 0, "Grp"), ("gpm_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("gpm_cono", "=", self.opts["conum"])]
        }
        stm = {
            "stype":
            "R",
            "tables": ("strmf1", ),
            "cols":
            (("st1_group", "", 0, "Grp"), ("st1_code", "", 0, "Product Code"),
             ("st1_type", "", 0, "T"), ("st1_desc", "", 0, "Description",
                                        "Y")),
            "where": [("st1_cono", "=", self.opts["conum"]),
                      ("st1_type", "<>", "X")],
            "whera": [],
            "index":
            1
        }
        loc = {
            "stype":
            "R",
            "tables": ("strloc", ),
            "cols":
            (("srl_loc", "", 0, "L"), ("srl_desc", "", 0, "Description", "Y")),
            "where": [("srl_cono", "=", self.opts["conum"])]
        }
        unm = {
            "stype":
            "R",
            "tables": ("struoi", ),
            "cols": (("unm_unit", "", 0, "Unit"), ("unm_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("unm_cono", "=", self.opts["conum"])]
        }
        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_stat", "<>", "X")]
            drm["whera"] = [["T", "drm_chain", 10]]
        else:
            drm["where"] = [("drm_cono", "=", self.opts["conum"]),
                            ("drm_chain", "=", 0), ("drm_stat", "<>", "X")]
        vtm = {
            "stype":
            "R",
            "tables": ("ctlvmf", ),
            "cols": (("vtm_code", "", 0, "C"), ("vtm_desc", "", 0,
                                                "Description", "Y")),
            "where": [("vtm_cono", "=", self.opts["conum"])]
        }
        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", 0, 0),
                ("T", 0, 1)), ("Basic-_B", None, ("T", 0, 0), ("T", 0, 1)),
               ("Recipes", self.doReadLoadRecipe, None, ("T", 0, 1)))
        r1s = (("Normal", "N"), ("Recipe", "R"))
        r2s = (("Average", "A"), ("Standard", "S"), ("None", "N"))
        r3s = (("Manual", "M"), ("Automatic", "A"), ("Zero", "N"))
        self.fld = [(("T", 0, 0, 0), "IUA", 3, "Group", "Product Group", "",
                     "Y", self.doGroup, gpm, None, ("notblank", )),
                    (("T", 0, 0, 0), "INA", 20, "Code", "Product Code", "",
                     "N", self.doCode, stm, None, ("notblank", )),
                    (("T", 0, 0, 0), "IUA", 1, "Loc", "Location", "1", "N",
                     self.doLoc, loc, None, ("notblank", )),
                    (("T", 0, 0, 0), "ONA", 30, ""),
                    (("T", 1, 0, 0), ("IRB", r1s), 0, "Type of Item", "", "N",
                     "N", self.doType, None, None, None),
                    (("T", 1, 1, 0), "INA", 30, "Description", "", "", "N",
                     None, None, self.doDelete, ("notblank", )),
                    (("T", 1, 2, 0), "INA", 10, "Unit of Issue", "", "", "N",
                     self.doUoi, unm, None, ("notblank", )),
                    (("T", 1, 2, 0), "ONA", 30, ""),
                    (("T", 1, 3, 0), ("IRB", r2s), 0, "Cost Price Indicator",
                     "", "A", "N", self.doValInd, None, None, None),
                    (("T", 1, 4, 0), "IUA", 1, "VAT Code", "", "", "N",
                     self.doVat, vtm, None, ("notblank", )),
                    (("T", 1, 4, 0), "ONA", 30, ""),
                    (("T", 1, 5, 0), "IUI", 3, "Exclusive Chainstore", "", "",
                     "N", self.doChnExcl, drc, None, ("efld", )),
                    (("T", 1, 5, 0), "ONA", 30, ""),
                    (("T", 1, 6, 0), "INA", 7, "Exclusive Account", "", "",
                     "N", self.doAccExcl, drm, None, ("efld", )),
                    (("T", 1, 6, 0), "ONA", 30, ""),
                    (("T", 1, 7, 0), "IUI", 7, "Sales Code", "", "", "N",
                     self.doSales, glm, None, ("efld", )),
                    (("T", 1, 7, 0), "ONA", 30, ""),
                    (("T", 1, 8, 0), "IUI", 7, "COS Code", "", "", "N",
                     self.doCos, glm, None, ("efld", )),
                    (("T", 1, 8, 0), "ONA", 30, ""),
                    (("T", 2, 0, 0), "IUA", 8, "Bin Number", "", "", "N", None,
                     None, self.doDelete, ("efld", )),
                    (("T", 2, 1, 0), ("IRB", r3s), 0, "Re-Order Indicator", "",
                     "A", "N", self.doReord, None, None, None),
                    (("T", 2, 2, 0), "IUI", 7, "Re-Order Level", "", "", "N",
                     None, None, None, ("efld", )),
                    (("T", 2, 3, 0), "IUI", 7, "Re-Order Quantity", "", "",
                     "N", None, None, None, ("efld", ))]
        if self.automu in ("A", "L"):
            self.fld.append(
                (("T", 2, 4, 0), "IUD", 6.2, "Percentabge Markup Lv1", "", "",
                 "N", None, None, None, ("efld", )))
            for x in range(1, self.plevs):
                self.fld.append((("T", 2, 4, 0), "IUD", 6.2, "Lv%s" % (x + 1),
                                 "", "", "N", None, None, None, ("efld", )))
        self.fld.extend([(("C", 3, 0, 0), "INA", 3, "Grp", "Product Group",
                          "r", "N", self.doRecGrp, gpm, None, None),
                         (("C", 3, 0,
                           1), "INA", 20, "Product-Code", "Product Code", "",
                          "N", self.doRecCod, stm, None, None),
                         (("C", 3, 0, 2), "ONA", 30, "Description"),
                         (("C", 3, 0, 3), "IUD", 11.2, "Quantity", "", "", "N",
                          self.doRecQty, None, self.doDelRec, ("notzero", ))])
        but = (("Edit", None, self.doEditor, 0, ("C", 3, 1), None),
               ("Accept", None, self.doAccept, 0, ("T", 0, 0), ("T", 0, 1)),
               ("Cancel", None, self.doCancel, 0, ("T", 0, 0),
                ("T", 0, 1)), ("Quit", None, self.doQuit, 1, None, None))
        tnd = ((self.doEnd, "N"), (self.doEnd, "N"), (self.doEnd, "Y"), None)
        txt = (self.doExit, self.doExit, self.doExit, self.doExit)
        cnd = (None, None, None, (self.doEnd, "N"))
        cxt = (None, None, None, self.doExit)
        self.df = TartanDialog(self.opts["mf"],
                               eflds=self.fld,
                               tags=tag,
                               butt=but,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               clicks=self.doClick)

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

    def doGroup(self, frt, pag, r, c, p, i, w):
        self.grpacc = self.sql.getRec(
            "strgrp",
            cols=["gpm_vatcode", "gpm_sales", "gpm_costs"],
            where=[("gpm_cono", "=", self.opts["conum"]),
                   ("gpm_group", "=", w)],
            limit=1)
        if not self.grpacc:
            return "Invalid Group"
        self.group = w
        self.df.topf[0][1][8]["whera"] = [["T", "st1_group", 0, 0]]

    def doCode(self, frt, pag, r, c, p, i, w):
        self.code = w
        self.mups = [0, 0, 0, 0, 0]
        self.old1 = self.sql.getRec("strmf1",
                                    where=[("st1_cono", "=",
                                            self.opts["conum"]),
                                           ("st1_group", "=", self.group),
                                           ("st1_code", "=", w)],
                                    limit=1)
        if not self.old1:
            self.newcode = True
            self.gtype = None
        elif self.old1[3] == "X":
            return "Redundant Code"
        else:
            self.newcode = False
            d = 3
            for x in range(0, self.df.topq[1]):
                if x in (3, 6, 8, 10, 12, 14):
                    continue
                if x == 0:
                    self.gtype = self.old1[d]
                self.df.loadEntry("T", 1, x, data=self.old1[d])
                if x == 2:
                    get = self.getUoi(self.old1[d])
                    if get:
                        self.df.loadEntry("T", 1, x + 1, data=get[0])
                if x == 5:
                    get = self.getVat(self.old1[d])
                    if get:
                        self.df.loadEntry("T", 1, x + 1, data=get[0])
                if x == 7:
                    get = self.getChnExcl(self.old1[d])
                    if get:
                        self.df.loadEntry("T", 1, x + 1, data=get[0])
                if x == 9:
                    get = self.getAccExcl(self.old1[d])
                    if get:
                        self.df.loadEntry("T", 1, x + 1, data=get[0])
                if self.glint == "Y" and x in (11, 13):
                    get = self.getGenDes(self.old1[d])
                    if get:
                        self.df.loadEntry("T", 1, x + 1, data=get[0])
                d += 1
        if self.locs == "N":
            self.loc = "1"
            self.df.loadEntry("T", 0, 2, data=self.loc)
            err = self.checkLoc()
            if err:
                return err
            return "sk1"

    def doLoc(self, frt, pag, r, c, p, i, w):
        if w == 0:
            return "Invalid Location"
        self.loc = w
        err = self.checkLoc()
        if err:
            return err

    def checkLoc(self):
        acc = self.sql.getRec("strloc",
                              cols=["srl_desc"],
                              where=[("srl_cono", "=", self.opts["conum"]),
                                     ("srl_loc", "=", self.loc)],
                              limit=1)
        if not acc:
            return "Invalid Location Code"
        else:
            self.df.loadEntry("T", 0, 3, data=acc[0])
        self.old2 = self.sql.getRec("strmf2",
                                    where=[("st2_cono", "=",
                                            self.opts["conum"]),
                                           ("st2_group", "=", self.group),
                                           ("st2_code", "=", self.code),
                                           ("st2_loc", "=", self.loc)],
                                    limit=1)
        if not self.old2:
            ok = askQuestion(self.opts["mf"].body, "New Location",
                "This location does not exist for this product. " \
                "Are you sure that you want to create it?")
            if ok == "yes":
                self.newloc = "Y"
            else:
                return "Rejected Location"
        if not self.old2:
            self.newloc = "Y"
        else:
            self.newloc = "N"
            d = 3
            for x in range(0, 4):
                d = d + 1
                self.df.loadEntry("T", 2, x, data=self.old2[d])
            if self.automu in ("A", "L"):
                for y in range(self.plevs):
                    mup = getMarkup(self.sql, self.opts["conum"], self.group,
                                    self.code, self.loc, y + 1)
                    self.df.loadEntry("T", 2, 4 + y, data=mup)
                    self.mups[y] = mup

    def doType(self, frt, pag, r, c, p, i, w):
        self.gtype = w
        if self.gtype == "R":
            self.df.enableTag(2)
        else:
            self.df.disableTag(2)

    def doUoi(self, frt, pag, r, c, p, i, w):
        acc = self.getUoi(w)
        if not acc:
            return "Invalid UOI Record"
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])

    def doValInd(self, frt, pag, r, c, p, i, w):
        self.df.topf[1][5][5] = self.grpacc[0]

    def doVat(self, frt, pag, r, c, p, i, w):
        acc = self.getVat(w)
        if not acc:
            return "Invalid VAT Record"
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        if not self.drsctl:
            self.chain = 0
            self.df.loadEntry(frt, pag, p + 1, data=0)
            self.df.loadEntry(frt, pag, p + 1, data="")
            self.df.loadEntry(frt, pag, p + 1, data="")
            self.df.loadEntry(frt, pag, p + 1, data="")
            if self.glint == "N":
                return "sk9"
            else:
                return "sk4"

    def doChnExcl(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.getChnExcl(w)
            if not acc:
                return "Invalid Chainstore"
            self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        self.chain = w

    def doAccExcl(self, frt, pag, r, c, p, i, w):
        if w:
            acc = self.getAccExcl(w)
            if not acc:
                return "Invalid Debtors Account"
            self.df.loadEntry(frt, pag, p + 1, data=acc[0])
        if self.glint == "N":
            return "sk5"
        if self.newcode:
            self.df.loadEntry(frt, pag, p + 2, data=self.grpacc[1])
            if self.grpacc[1]:
                acc = self.getGenDes(self.grpacc[1])
                if not acc:
                    return "Invalid Sales Code"
                self.df.loadEntry(frt, pag, p + 3, data=acc[0])
            self.df.loadEntry(frt, pag, p + 4, data=self.grpacc[2])
            if self.grpacc[2]:
                acc = self.getGenDes(self.grpacc[2])
                if not acc:
                    return "Invalid C.O.S. Code"
                self.df.loadEntry(frt, pag, p + 5, data=acc[0])

    def doSales(self, frt, pag, r, c, p, i, w):
        acc = self.getGenDes(w)
        if not acc:
            return "Invalid Sales Account"
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])

    def doCos(self, frt, pag, r, c, p, i, w):
        acc = self.getGenDes(w)
        if not acc:
            return "Invalid COS Account"
        self.df.loadEntry(frt, pag, p + 1, data=acc[0])

    def doReord(self, frt, pag, r, c, p, i, w):
        if w == "N":
            self.df.loadEntry(frt, pag, p + 1, data=0)
            self.df.loadEntry(frt, pag, p + 2, data=0)
            return "sk2"

    def getUoi(self, dat):
        acc = self.sql.getRec("struoi",
                              cols=["unm_desc"],
                              where=[("unm_cono", "=", self.opts["conum"]),
                                     ("unm_unit", "=", dat)],
                              limit=1)
        return acc

    def getVat(self, dat):
        acc = self.sql.getRec("ctlvmf",
                              cols=["vtm_desc"],
                              where=[("vtm_cono", "=", self.opts["conum"]),
                                     ("vtm_code", "=", dat)],
                              limit=1)
        return acc

    def getChnExcl(self, dat):
        self.chain = dat
        if dat:
            acc = self.sql.getRec("drschn",
                                  cols=["chm_name"],
                                  where=[("chm_cono", "=", self.opts["conum"]),
                                         ("chm_chain", "=", dat)],
                                  limit=1)
            return acc

    def getAccExcl(self, dat):
        if dat:
            acc = self.sql.getRec("drsmst",
                                  cols=["drm_name"],
                                  where=[("drm_cono", "=", self.opts["conum"]),
                                         ("drm_chain", "=", self.chain),
                                         ("drm_acno", "=", dat),
                                         ("drm_stat", "<>", "X")],
                                  limit=1)
            return acc

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

    def doRecGrp(self, frt, pag, r, c, p, i, w):
        self.rgroup = w
        acc = self.sql.getRec("strgrp",
                              cols=["gpm_desc"],
                              where=[("gpm_cono", "=", self.opts["conum"]),
                                     ("gpm_group", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Group"
        self.df.topf[0][1][8]["whera"] = [["C", "st1_group", 0, 3]]

    def doRecCod(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("strmf1",
                              cols=["st1_type", "st1_desc"],
                              where=[("st1_cono", "=", self.opts["conum"]),
                                     ("st1_group", "=", self.rgroup),
                                     ("st1_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Code"
        if acc[0] == "R":
            return "Invalid Type (Recipe)"
        self.df.loadEntry(frt, pag, p + 1, data=acc[1])
        acc = self.sql.getRec("strmf2",
                              cols=["st2_bin"],
                              where=[("st2_cono", "=", self.opts["conum"]),
                                     ("st2_group", "=", self.rgroup),
                                     ("st2_code", "=", w),
                                     ("st2_loc", "=", self.loc)],
                              limit=1)
        if not acc:
            return "Invalid Code (2)"
        self.rcode = w
        acc = self.sql.getRec("strrcp",
                              cols=["srr_rqty"],
                              where=[("srr_cono", "=", self.opts["conum"]),
                                     ("srr_group", "=", self.group),
                                     ("srr_code", "=", self.code),
                                     ("srr_loc", "=", self.loc),
                                     ("srr_rgroup", "=", self.rgroup),
                                     ("srr_rcode", "=", self.rcode)],
                              limit=1)
        if acc:
            self.newrec = "n"
            self.df.loadEntry(frt, pag, p + 2, data=acc[0])
        else:
            self.newrec = "y"

    def doRecQty(self, frt, pag, r, c, p, i, w):
        self.rqty = w

    def doEditor(self):
        if self.df.pag != 3:
            self.df.focusField(self.df.frt, self.df.pag, self.df.col)
            return
        # Display recipe items and allow editing of details
        data = self.sql.getRec(
            tables=["strrcp", "strmf1"],
            cols=["srr_rgroup", "srr_rcode", "st1_desc", "srr_rqty"],
            where=[("srr_cono", "=", self.opts["conum"]),
                   ("srr_group", "=", self.group),
                   ("srr_code", "=", self.code), ("srr_loc", "=", self.loc),
                   ("st1_cono=srr_cono", ), ("st1_group=srr_rgroup", ),
                   ("st1_code=srr_rcode", )])
        if data:
            titl = "Recipe Items"
            head = ("Grp", "Product-Code", "Description", "Quantity")
            lin = {
                "stype": "C",
                "titl": titl,
                "head": head,
                "typs": (("NA", 3), ("NA", 20), ("NA", 30), ("SD", 10.2)),
                "data": data
            }
            state = self.df.disableButtonsTags()
            self.opts["mf"].updateStatus("Select a Product to Edit")
            chg = self.df.selChoice(lin)
            if chg and chg.selection:
                self.change = chg.selection
                self.doChgChanges()
            self.df.enableButtonsTags(state=state)
            self.df.focusField("C", 3, self.df.col)

    def doChgChanges(self):
        tit = ("Change Items", )
        gpm = {
            "stype":
            "R",
            "tables": ("strgrp", ),
            "cols": (("gpm_group", "", 0, "Grp"), ("gpm_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("gpm_cono", "=", self.opts["conum"])]
        }
        stm = {
            "stype":
            "R",
            "tables": ("strmf1", ),
            "cols":
            (("st1_group", "", 0, "Grp"), ("st1_code", "", 0, "Product Code"),
             ("st1_type", "", 0, "T"), ("st1_desc", "", 0, "Description",
                                        "Y")),
            "where": [("st1_cono", "=", self.opts["conum"])],
            "whera": [],
            "index":
            1
        }
        fld = ((("T", 0, 0, 0), "INA", 3, "Group", "Product Group", "", "N",
                self.doChgGrp, gpm, None, ('notblank', )),
               (("T", 0, 1, 0), "INA", 20, "Code", "Product Code", "", "N",
                self.doChgCod, stm, None,
                ('notblank', )), (("T", 0, 2, 0), "ONA", 30, "Description"),
               (("T", 0, 3, 0), "ISD", 10.2, "Quantity", "", "", "N",
                self.doChgQty, None, None, ('notzero', )))
        but = [["Delete", None, self.doChgDel, 1, None, None]]
        self.cg = TartanDialog(self.opts["mf"],
                               title=tit,
                               tops=True,
                               eflds=fld,
                               butt=but,
                               tend=((self.doChgEnd, "n"), ),
                               txit=(self.doChgExit, ))
        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.focusField("T", 0, 1, clr=False)
        self.cg.mstFrame.wait_window()

    def doChgGrp(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("strgrp",
                              cols=["gpm_desc"],
                              where=[("gpm_cono", "=", self.opts["conum"]),
                                     ("gpm_group", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Group"
        self.rgroup = w
        self.cg.topf[0][1][8]["whera"] = [["T", "st1_group", 0, 0]]

    def doChgCod(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("strmf1",
                              cols=["st1_type", "st1_desc"],
                              where=[("st1_cono", "=", self.opts["conum"]),
                                     ("st1_group", "=", self.rgroup),
                                     ("st1_code", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Code"
        if acc[0] != "N":
            return "Invalid Type"
        cnt = self.sql.getRec("strrcp",
                              cols=["count(*)"],
                              where=[("srr_cono", "=", self.opts["conum"]),
                                     ("srr_group", "=", self.rgroup),
                                     ("srr_code", "=", w)],
                              limit=1)
        if cnt[0]:
            return "Product Already In Recipe"
        self.rcode = w
        self.cg.loadEntry("T", 0, 2, data=acc[1])

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

    def doChgDel(self):
        self.sql.delRec("strrcp",
                        where=[("srr_cono", "=", self.opts["conum"]),
                               ("srr_group", "=", self.group),
                               ("srr_code", "=", self.code),
                               ("srr_loc", "=", self.loc),
                               ("srr_rgroup", "=", self.change[0]),
                               ("srr_rcode", "=", self.change[1])])
        self.doReadLoadRecipe()
        self.doChgExit()

    def doChgEnd(self):
        self.sql.updRec("strrcp",
                        cols=["srr_rgroup", "srr_rcode", "srr_rqty"],
                        data=[self.rgroup, self.rcode, self.rqty],
                        where=[("srr_cono", "=", self.opts["conum"]),
                               ("srr_group", "=", self.group),
                               ("srr_code", "=", self.loc),
                               ("srr_loc", "=", self.loc),
                               ("srr_rgroup", "=", self.change[0]),
                               ("srr_rcode", "=", self.change[1])])
        self.doReadLoadRecipe()
        self.doChgExit()

    def doChgExit(self):
        self.cg.closeProcess()

    def doDelete(self):
        trn = self.sql.getRec("strpot",
                              cols=["count(*)"],
                              where=[("pot_cono", "=", self.opts["conum"]),
                                     ("pot_group", "=", self.group),
                                     ("pot_code", "=", self.code)],
                              limit=1)
        if trn[0]:
            return "Purchase Orders Exist, Not Deleted"
        trn = self.sql.getRec("strtrn",
                              cols=["count(*)"],
                              where=[("stt_cono", "=", self.opts["conum"]),
                                     ("stt_group", "=", self.group),
                                     ("stt_code", "=", self.code),
                                     ("stt_loc", "=", self.loc)],
                              limit=1)
        if trn[0]:
            return "Stores Transactions Exist, Not Deleted"
        trn = self.sql.getRec("slsiv2",
                              cols=["count(*)"],
                              where=[("si2_cono", "=", self.opts["conum"]),
                                     ("si2_group", "=", self.group),
                                     ("si2_code", "=", self.code),
                                     ("si2_loc", "=", self.loc)],
                              limit=1)
        if trn[0]:
            return "Sales-2 Transactions Exist, Not Deleted"
        trn = self.sql.getRec("slsiv3",
                              cols=["count(*)"],
                              where=[("si3_cono", "=", self.opts["conum"]),
                                     ("si3_rgroup", "=", self.group),
                                     ("si3_rcode", "=", self.code)],
                              limit=1)
        if trn[0]:
            return "Sales-3 Transactions Exist, Not Deleted"
        self.sql.delRec("strmf2",
                        where=[("st2_cono", "=", self.opts["conum"]),
                               ("st2_group", "=", self.group),
                               ("st2_code", "=", self.code),
                               ("st2_loc", "=", self.loc)])
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        self.sql.insRec("chglog", data=["strmf2", "D", "%03i%-3s%-20s%-1s" % \
            (self.opts["conum"], self.group, self.code, self.loc), "", dte,
        self.opts["capnm"], "", "", "", 0])
        st2 = self.sql.getRec("strmf2",
                              cols=["count(*)"],
                              where=[("st2_cono", "=", self.opts["conum"]),
                                     ("st2_group", "=", self.group),
                                     ("st2_code", "=", self.code)],
                              limit=1)
        if not st2[0]:
            self.sql.delRec("strmf1",
                            where=[("st1_cono", "=", self.opts["conum"]),
                                   ("st1_group", "=", self.group),
                                   ("st1_code", "=", self.code)])
            self.sql.insRec("chglog", data=["strmf1", "D", "%03i%-3s%-20s" % \
                (self.opts["conum"], self.group, self.code), "", dte,
                self.opts["capnm"], "", "", "", 0])
        # Other Files
        self.sql.delRec("strcst",
                        where=[("stc_cono", "=", self.opts["conum"]),
                               ("stc_group", "=", self.group),
                               ("stc_code", "=", self.code),
                               ("stc_loc", "=", self.loc)])
        self.sql.delRec("strprc",
                        where=[("stp_cono", "=", self.opts["conum"]),
                               ("stp_group", "=", self.group),
                               ("stp_code", "=", self.code),
                               ("stp_loc", "=", self.loc)])
        self.sql.delRec("strrcp",
                        where=[("srr_cono", "=", self.opts["conum"]),
                               ("srr_group", "=", self.group),
                               ("srr_code", "=", self.code),
                               ("srr_loc", "=", self.loc)])
        self.sql.delRec("strrcp",
                        where=[("srr_cono", "=", self.opts["conum"]),
                               ("srr_loc", "=", self.loc),
                               ("srr_rgroup", "=", self.group),
                               ("srr_rcode", "=", self.code)])
        self.sql.delRec("strvar",
                        where=[("stv_cono", "=", self.opts["conum"]),
                               ("stv_group", "=", self.group),
                               ("stv_code", "=", self.code),
                               ("stv_loc", "=", self.loc)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doDelRec(self):
        self.sql.delRec("strrcp",
                        where=[("srr_cono", "=", self.opts["conum"]),
                               ("srr_group", "=", self.group),
                               ("srr_code", "=", self.code),
                               ("srr_loc", "=", self.loc),
                               ("srr_rgroup", "=", self.rgroup),
                               ("srr_rcode", "=", self.rcode)])
        self.df.clearLine(2, focus=True)

    def doEnd(self):
        if self.df.frt == "T" and self.df.pag == 0:
            if self.newcode:
                self.df.focusField("T", 1, 1)
            else:
                if self.gtype == "R":
                    self.df.enableTag(2)
                self.df.skip[1] = [1]
                self.df.focusField("T", 1, 2, clr=False)
        elif self.df.frt == "T" and self.df.pag == 1:
            self.df.selPage("Basic-B")
        elif self.df.frt == "T" and self.df.pag == 2:
            if self.gtype == "R":
                self.df.selPage("Recipes")
            else:
                self.doEnder()
        elif self.df.frt == "C" and self.df.pag == 3:
            data = [
                self.opts["conum"], self.group, self.code, self.loc,
                self.rgroup, self.rcode, self.rqty
            ]
            if self.newrec == "y":
                self.sql.insRec("strrcp", data=data)
                self.df.advanceLine(3)
            else:
                whr = [("srr_cono", "=", self.opts["conum"]),
                       ("srr_group", "=", self.group),
                       ("srr_code", "=", self.code),
                       ("srr_loc", "=", self.loc),
                       ("srr_rgroup", "=", self.rgroup),
                       ("srr_rcode", "=", self.rcode)]
                self.sql.updRec("strrcp", data=data, where=whr)
                self.doReadLoadRecipe()

    def doEnder(self):
        data = [self.opts["conum"]]
        for x in range(0, 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 (3, 6, 8, 10, 12, 14):
                continue
            data.append(self.df.t_work[1][0][x])
        if self.newcode:
            self.sql.insRec("strmf1", data=data)
        elif data != self.old1[:len(data)]:
            col = self.sql.strmf1_col
            data.append(self.old1[col.index("st1_xflag")])
            self.sql.updRec("strmf1",
                            data=data,
                            where=[("st1_cono", "=", self.opts["conum"]),
                                   ("st1_group", "=", self.group),
                                   ("st1_code", "=", self.code)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.old1):
                if dat != data[num]:
                    self.sql.insRec(
                        "chglog",
                        data=[
                            "strmf1", "U",
                            "%03i%-3s%-20s" %
                            (self.opts["conum"], self.group, self.code),
                            col[num], dte, self.opts["capnm"],
                            str(dat),
                            str(data[num]), "", 0
                        ])
        data = [self.opts["conum"], self.group, self.code, self.loc]
        for x in range(0, 4):
            data.append(self.df.t_work[2][0][x])
        if self.newloc == "Y":
            self.sql.insRec("strmf2", data=data)
        elif data != self.old2[:len(data)]:
            col = self.sql.strmf2_col
            data.append(self.old2[col.index("st2_xflag")])
            self.sql.updRec("strmf2",
                            data=data,
                            where=[("st2_cono", "=", self.opts["conum"]),
                                   ("st2_group", "=", self.group),
                                   ("st2_code", "=", self.code),
                                   ("st2_loc", "=", self.loc)])
            dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
            for num, dat in enumerate(self.old2):
                if dat != data[num]:
                    self.sql.insRec("chglog",
                                    data=[
                                        "strmf2", "U",
                                        "%03i%-3s%-20s%-1s" %
                                        (self.opts["conum"], self.group,
                                         self.code, self.loc), col[num], dte,
                                        self.opts["capnm"],
                                        str(dat),
                                        str(data[num]), "", 0
                                    ])
        self.sql.delRec("strcmu",
                        where=[("smc_cono", "=", self.opts["conum"]),
                               ("smc_group", "=", self.group),
                               ("smc_code", "=", self.code),
                               ("smc_loc", "=", self.loc)])
        for num, mup in enumerate(self.df.t_work[2][0][4:]):
            if mup and mup != self.mups[num]:
                self.sql.insRec("strcmu",
                                data=[
                                    self.opts["conum"], self.group, self.code,
                                    self.loc, num + 1, mup
                                ])
        self.opts["mf"].dbm.commitDbase()
        self.df.selPage("Basic-A")
        self.df.focusField("T", 0, 1)

    def doReadLoadRecipe(self):
        self.df.clearFrame("C", 3)
        self.df.focusField("C", 3, 1)
        rec = self.sql.getRec(
            tables=["strrcp", "strmf1"],
            cols=["srr_rgroup", "srr_rcode", "st1_desc", "srr_rqty"],
            where=[("srr_cono", "=", self.opts["conum"]),
                   ("srr_group", "=", self.group),
                   ("srr_code", "=", self.code), ("srr_loc", "=", self.loc),
                   ("st1_cono=srr_cono", ), ("st1_group=srr_rgroup", ),
                   ("st1_code=srr_rcode", )])
        if rec:
            mxs = (self.df.rows[3] - 1) * self.df.colq[3]
            for l, r in enumerate(rec):
                for i, d in enumerate(r):
                    c = l * self.df.colq[3]
                    if c > mxs:
                        c = mxs
                    self.df.loadEntry("C", 3, (c + i), data=d)
                self.df.advanceLine(3)

    def doExit(self):
        if self.df.frt == "T" and self.df.pag == 0:
            self.doQuit()
        elif self.df.frt == "T" and self.df.pag == 1:
            if self.newcode:
                self.df.focusField("T", 1, 1)
            else:
                self.df.skip[1] = [1]
                self.df.focusField("T", 1, 2, clr=False)
        elif self.df.frt == "T" and self.df.pag == 2:
            self.df.focusField("T", 2, 1)
        elif self.df.frt == "C" and self.df.pag == 3:
            if self.df.col == 1:
                self.df.focusField("C", 3, 1)
            else:
                self.doEnder()

    def doAccept(self):
        ok = "yes"
        for page in (1, 2):
            frt, pag, col, err = self.df.doCheckFields(("T", page, None))
            if err:
                ok = "no"
                if pag and pag != self.df.pag:
                    self.df.selPage(self.df.tags[pag - 1][0])
                self.df.focusField(frt, pag, (col + 1), err=err)
                break
        if ok == "yes":
            self.doEnder()

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

    def doCancel(self):
        self.opts["mf"].dbm.rollbackDbase()
        self.df.selPage("Basic-A")
        self.df.focusField("T", 0, 1)
コード例 #20
0
class gl1030(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
        self.dep = ctlsys["sys_gl_dep"]
        self.dig = ctlsys["sys_gl_dig"]
        self.sql = Sql(self.opts["mf"].dbm, ["genmst", "genrpt"],
            prog=self.__class__.__name__)
        if self.sql.error:
            return
        self.genrpt_fd = self.sql.genrpt_dic
        self.genrpt_cl = self.sql.genrpt_col
        self.pags = ["","Q","H","L","G","S","T","U","C","P"]
        self.head = ["glr_desc", "glr_high", "glr_ffeed", "glr_ignore"]
        self.ledger = [
            "glr_from", "glr_to", "glr_high", "glr_obal", "glr_accum",
            "glr_print", "glr_norm", "glr_acbal", "glr_ignore",
            "glr_store", "glr_snum1", "glr_acstr"]
        self.group = [
            "glr_group", "glr_desc", "glr_from", "glr_to", "glr_high",
            "glr_obal", "glr_accum", "glr_print", "glr_norm", "glr_acbal",
            "glr_ignore", "glr_store", "glr_snum1", "glr_acstr", "glr_label"]
        self.store = [
            "glr_desc", "glr_high", "glr_print", "glr_norm", "glr_acbal",
            "glr_clear", "glr_snum1", "glr_strper"]
        self.total = [
            "glr_desc", "glr_high", "glr_total", "glr_print", "glr_norm",
            "glr_clear", "glr_store", "glr_snum1", "glr_acstr", "glr_label"]
        self.uline = ["glr_high", "glr_uline"]
        self.calc = [
            "glr_desc", "glr_high", "glr_cbase", "glr_ctype", "glr_snum2",
            "glr_camnt", "glr_snum3"]
        self.percent = ["glr_desc", "glr_high", "glr_snum1", "glr_snum2"]
        return True

    def mainProcess(self):
        data = [
            ("H","Heading"),
            ("L","Ledger Accounts"),
            ("G","Group of Accounts"),
            ("S","Stored Amount"),
            ("T","Total"),
            ("U","Underline"),
            ("C","Calculation"),
            ("P","Percentage")]
        typ = {
            "stype": "C",
            "titl": "Select the Required Type",
            "head": ("T", "Description"),
            "data": data}
        coy = {
            "stype": "R",
            "tables": ("ctlmst",),
            "cols": (
                ("ctm_cono", "", 0, "Coy"),
                ("ctm_name", "", 0, "Description", "Y")),
            "order": "ctm_cono"}
        glr = {
            "stype": "R",
            "tables": ("genrpt",),
            "cols": (
                ("glr_cono", "", 0, "Coy"),
                ("glr_repno", "", 0, "Rep"),
                ("glr_type", "", 0, "T"),
                ("glr_desc", "", 0, "Description", "Y")),
            "where": [("glr_seq", "=", 0)],
            "whera": (("T", "glr_cono", 0, 0),),
            "order": "glr_cono, glr_repno",
            "index": 1}
        gls = {
            "stype": "R",
            "tables": ("genrpt",),
            "cols": (
                ("glr_seq", "", 0, "Seq"),
                ("glr_type", "", 0, "T"),
                ("glr_group", "", 0, "Grp"),
                ("glr_from", "", 0, "From-Ac"),
                ("glr_to", "", 0, "  To-Ac"),
                ("glr_desc", "", 0, "Description", "Y")),
            "where": [("glr_seq", ">", 0)],
            "whera": (("T", "glr_cono", 0, 0),("T", "glr_repno", 1, 0))}
        self.glm = {
            "stype": "C",
            "titl": "Account Numbers",
            "head": ("Number", "Description"),
            "data": []}
        ryn = (("Yes","Y"),("No","N"))
        rys = (("Yes","Y"),("No","N"),("Debit","+"),("Credit","-"))
        rns = (("Positive","P"),("Negative","N"))
        ras = (("Add","A"),("Subtract","S"))
        rat = (("Add","A"),("Subtract","S"),("Ignore","I"))
        rcb = (("Percentage","P"),("Amount","A"),("Store","S"))
        rct = (("Plus","+"),("Minus","-"),("Multiply","*"),("Divide","/"))
        rsd = (("Single","S"),("Double","D"),("Blank","B"))
        pts = (
            "Accumulate Month Values",
            "Add, Subtract or Ignore",
            "Calculation Base",
            "Calculation Type",
            "Clear Stored Value",
            "Clear Total",
            "Highlight",
            "Ignore Account Type",
            "Include Opening Balance",
            "Normal Sign",
            "Percentage of Stored Value",
            "Print Values",
            "Store Amount",
            "Add or Subtract")
        tag = [
            ("Sequence",None,None,None,False),
            ("Heading",None,None,None,False),
            ("Ledger",None,None,None,False),
            ("Group",None,None,None,False),
            ("Stored",None,None,None,False),
            ("Total",None,None,None,False),
            ("Uline",None,None,None,False),
            ("Calc",None,None,None,False),
            ("Percent",None,None,None,False)]
        fld = (
            (("T",0,0,0),"IUI",3,"Company","Company Number, 0=All",
                self.opts["conum"],"Y",self.doCoyNum,coy,None,
                ("in", (self.opts["conum"], 0))),
            (("T",0,0,0),"IUI",3,"Report","Report Number",
                "","N",self.doRepNum,glr,None,("notzero",)),
            (("T",0,0,0),"IUA",1,"Type","Report Type (B, P, O)",
                "P","N",self.doRepTyp,None,self.doDelRpt,
                ("in", ("O","P","B"))),
            (("T",0,0,0),"INA",30,"Heading","Report Heading",
                "","N",None,None,None,("notblank",)),
            (("T",1,0,0),"IUD",7.2,"Seq-Num","Sequence Number",
                "","N",self.doSeqNum,gls,None,("efld",)),
            (("T",1,1,0),"IUA",1,"Sequence Type","",
                "","N",self.doSeqType,typ,self.doDelSeq,
                ("in",("H","L","G","T","S","U","P","C"))),
            (("T",2,0,0),"INA",30,"Description","",
                "","N",None,None,None,("notblank",)),
            (("T",2,1,0),("IRB",ryn),0,pts[6],"",
                "Y","N",None,None,None,None),
            (("T",2,2,0),("IRB",ryn),0,"New Page","New Page (Y/N)",
                "N","N",None,None,None,None),
            (("T",2,3,0),("IRB",ryn),0,pts[7],"",
                "N","N",None,None,None,None),
            (("T",3,0,0),"IUI",7,"From Account","From Account Number",
                "","N",self.doAcno,self.glm,None,("notzero",)),
            (("T",3,1,0),"IUI",7,"To Account","To Account Number",
                "","N",self.doAcno,self.glm,None,("efld",)),
            (("T",3,2,0),("IRB",ryn),0,pts[6],"",
                "N","N",None,None,None,None),
            (("T",3,3,0),("IRB",ryn),0,pts[8],"",
                "Y","N",None,None,None,None),
            (("T",3,4,0),("IRB",ryn),0,pts[0],"",
                "N","N",None,None,None,None),
            (("T",3,5,0),("IRB",rys),0,pts[11],"",
                "Y","N",None,None,None,None),
            (("T",3,6,0),("IRB",rns),0,pts[9],"",
                "P","N",None,None,None,None),
            (("T",3,7,0),("IRB",rat),0,pts[1],"",
                "A","N",None,None,None,None),
            (("T",3,8,0),("IRB",ryn),0,pts[7],"",
                "N","N",None,None,None,None),
            (("T",3,9,0),("IRB",ryn),0,pts[12],"",
                "N","N",self.doStore,None,None,None),
            (("T",3,10,0),"IUI",2,"Storage Number","",
                "","N",None,None,None,("notzero",)),
            (("T",3,11,0),("IRB",ras),0,pts[13],"",
                "A","N",None,None,None,None),
            (("T",4,0,0),"IUI",3,"Group Number","",
                "","N",self.doGrpNum,None,None,("efld",)),
            (("T",4,1,0),"INA",30,"Description","",
                "","N",None,None,None,("notblank",)),
            (("T",4,2,0),"IUI",7,"From Account","From Account Number",
                "","N",self.doAcno,self.glm,None,("notzero",)),
            (("T",4,3,0),"IUI",7,"To Account","To Account Number",
                "","N",self.doAcno,self.glm,None,("efld",)),
            (("T",4,4,0),("IRB",ryn),0,pts[6],"",
                "N","N",None,None,None,None),
            (("T",4,5,0),("IRB",ryn),0,pts[8],"",
                "Y","N",None,None,None,None),
            (("T",4,6,0),("IRB",ryn),0,pts[0],"",
                "N","N",None,None,None,None),
            (("T",4,7,0),("IRB",rys),0,pts[11],"",
                "Y","N",None,None,None,None),
            (("T",4,8,0),("IRB",rns),0,pts[9],"",
                "P","N",None,None,None,None),
            (("T",4,9,0),("IRB",rat),0,pts[1],"",
                "A","N",None,None,None,None),
            (("T",4,10,0),("IRB",ryn),0,pts[7],"",
                "N","N",None,None,None,None),
            (("T",4,11,0),("IRB",ryn),0,pts[12],"",
                "N","N",self.doStore,None,None,None),
            (("T",4,12,0),"IUI",2,"Storage Number","",
                "","N",None,None,None,("notzero",)),
            (("T",4,13,0),("IRB",ras),0,pts[13],"",
                "A","N",None,None,None,None),
            (("T",4,14,0),"INA",10,"Chart Label","",
                "","N",None,None,None,None),
            (("T",5,0,0),"INA",30,"Description","",
                "","N",None,None,None,("notblank",)),
            (("T",5,1,0),("IRB",ryn),0,pts[6],"",
                "N","N",None,None,None,None),
            (("T",5,2,0),("IRB",rys),0,pts[11],"",
                "Y","N",None,None,None,None),
            (("T",5,3,0),("IRB",rns),0,pts[9],"",
                "P","N",None,None,None,None),
            (("T",5,4,0),("IRB",rat),0,pts[1],"",
                "A","N",None,None,None,None),
            (("T",5,5,0),("IRB",ryn),0,pts[4],"",
                "N","N",None,None,None,None),
            (("T",5,6,0),"IUI",2,"Storage Number","",
                "","N",None,None,None,("notzero",)),
            (("T",5,7,0),"IUD",6.2,pts[10],"",
                0,"N",None,None,None,("notzero",)),
            (("T",6,0,0),"INA",30,"Description","",
                "","N",None,None,None,("efld",)),
            (("T",6,1,0),("IRB",ryn),0,pts[6],"",
                "Y","N",None,None,None,None),
            (("T",6,2,0),"IUI",1,"Total Level","",
                "","N",None,None,None,("between",1,9)),
            (("T",6,3,0),("IRB",rys),0,pts[11],"",
                "Y","N",None,None,None,None),
            (("T",6,4,0),("IRB",rns),0,pts[9],"",
                "P","N",None,None,None,None),
            (("T",6,5,0),("IRB",ryn),0,pts[5],"",
                "Y","N",None,None,None,None),
            (("T",6,6,0),("IRB",ryn),0,pts[12],"",
                "N","N",self.doStore,None,None,None),
            (("T",6,7,0),"IUI",2,"Storage Number","",
                "","N",None,None,None,("notzero",)),
            (("T",6,8,0),("IRB",ras),0,pts[13],"",
                "A","N",None,None,None,None),
            (("T",6,9,0),"INA",10,"Chart Label","",
                "","N",None,None,None,None),
            (("T",7,0,0),("IRB",ryn),0,pts[6],"",
                "Y","N",None,None,None,None),
            (("T",7,1,0),("IRB",rsd),0,"Underline Type","",
                "S","N",None,None,None,None),
            (("T",8,0,0),"INA",30,"Description","",
                "","N",None,None,None,("notblank",)),
            (("T",8,1,0),("IRB",ryn),0,pts[6],"",
                "N","N",None,None,None,None),
            (("T",8,2,0),("IRB",rcb),0,pts[2],"",
                "A","N",self.doPAS,None,None,None),
            (("T",8,3,0),("IRB",rct),0,pts[3],"",
                "+","N",None,None,None,None),
            (("T",8,4,0),"IUI",2,"Storage Number (Base)","",
                "","N",self.doStore1,None,None,("notzero",)),
            (("T",8,5,0),"ISD",13.2,"Amount","Percent/Amount",
                "","N",self.doAmount,None,None,("efld",)),
            (("T",8,6,0),"IUI",2,"Storage Number (Calc)","",
                "","N",None,None,None,("efld",)),
            (("T",9,0,0),"INA",30,"Description","",
                "","N",None,None,None,("notblank",)),
            (("T",9,1,0),("IRB",ryn),0,pts[6],"",
                "N","N",None,None,None,None),
            (("T",9,2,0),"IUI",2,"Storage Number (Base)","",
                "","N",None,None,None,("notzero",)),
            (("T",9,3,0),"IUI",2,"Storage Number (Calc)","",
                "","N",None,None,None,("notzero",)))
        tnd = (
            (self.doT0End,"y"), (self.doT1End,"n"), (self.doT2End,"y"),
            (self.doT2End,"y"), (self.doT2End,"y"), (self.doT2End,"y"),
            (self.doT2End,"y"), (self.doT2End,"y"), (self.doT2End,"y"),
            (self.doT2End,"y"))
        txt = (
            self.doT0Exit, self.doT1Exit, self.doT2Exit, self.doT2Exit,
            self.doT2Exit, self.doT2Exit, self.doT2Exit, self.doT2Exit,
            self.doT2Exit, self.doT2Exit)
        but = (
            ("Import",None,self.doImpRpt,0,("T",0,1),("T",0,2)),
            ("Export",None,self.doExpRpt,0,("T",0,3),(("T",0,2),("T",0,4))),
            ("Copy",None,self.doCpyRpt,0,("T",0,3),(("T",0,2),("T",0,4))),
            ("Re-Sequence",None,self.doReSeq,0,("T",1,1),("T",1,2),None,1),
            ("Preview",None,self.doPreview,0,("T",1,1),("T",1,2),None,1),
            ("Print",None,self.doPrint,0,("T",1,1),("T",1,2),None,1))
        self.df = TartanDialog(self.opts["mf"], eflds=fld, tend=tnd,
            txit=txt, tags=tag, butt=but)

    def doCoyNum(self, frt, pag, r, c, p, i, w):
        self.selcoy = w
        if self.selcoy == 0:
            acc = self.sql.getRec("genmst", cols=["glm_acno",
                "glm_desc"], group="glm_acno, glm_desc", order="glm_acno")
        else:
            acc = self.sql.getRec("genmst", cols=["glm_acno",
                "glm_desc"], where=[("glm_cono", "=", self.selcoy)],
                group="glm_acno, glm_desc", order="glm_acno")
        if self.dep == "Y":
            dep = {}
            chs = 10 ** (7 - self.dig)
            for a in acc:
                dep[a[0] % chs] = a[1]
            acc = []
            for a in dep:
                acc.append([a, dep[a]])
            acc.sort()
        self.glm["data"] = acc

    def doRepNum(self, frt, pag, r, c, p, i, w):
        self.repno = w
        rep = self.doReadRep(self.selcoy, self.repno, 0)
        if not rep:
            self.newrep = True
            self.df.setWidget(self.df.B1, "normal")
        else:
            self.newrep = False
            self.df.setWidget(self.df.B1, "disabled")
            self.df.loadEntry(frt, pag, p+1, data=rep[3])
            self.df.loadEntry(frt, pag, p+2, data=rep[4])

    def doRepTyp(self, frt, pag, r, c, p, i, w):
        self.df.setWidget(self.df.B1, "disabled")

    def doImpRpt(self):
        self.df.setWidget(self.df.B0, state="disabled")
        self.df.setWidget(self.df.mstFrame, state="hide")
        sel = FileDialog(parent=self.opts["mf"].body, title="Import File",
            initd=self.opts["mf"].rcdic["wrkdir"], ftype=[("Report", "*.rpt")])
        nam = sel.askopenfilename()
        err = None
        if nam:
            fle = open(nam, "r")
            for num, line in enumerate(fle):
                dat = line.split("|")
                if not num:
                    if dat[0] != "genrpt":
                        err = "This File Does Not Contain a Valid Format"
                        break
                    chk = self.sql.getRec("genrpt",
                        where=[("glr_cono", "=", dat[1]), ("glr_repno", "=",
                            dat[2]), ("glr_seq", "=", 0)], limit=1)
                    if chk:
                        ok = askQuestion(self.opts["mf"].body, "Replace?",
                            "This Report Already Exists, Would you like "\
                            "to Replace It?")
                        if ok == "yes":
                            self.sql.delRec("genrpt", where=[("glr_cono", "=",
                                dat[1]), ("glr_repno", "=", dat[2])])
                        else:
                            err = "Report Already Exists"
                            break
                    self.sql.insRec("genrpt", data=dat[1:])
                else:
                    self.sql.insRec(dat[0], data=dat[1:])
        if not err:
            self.opts["mf"].dbm.commitDbase(ask=True)
        else:
            showError(self.opts["mf"].body, "Invalid Import", err)
        self.df.setWidget(self.df.mstFrame, "show")
        self.df.focusField("T", 0, 1)

    def doExpRpt(self):
        fle = open(os.path.join(self.opts["mf"].rcdic["wrkdir"],
            "C%s_R%s.rpt" % (self.selcoy, self.repno)), "w")
        rpt = self.sql.getRec("genrpt", where=[("glr_cono", "=",
            self.selcoy), ("glr_repno", "=", self.repno)], order="glr_seq")
        for lin in rpt:
            mes = "genrpt"
            for dat in lin:
                mes = "%s|%s" % (mes, str(dat))
            fle.write("%s\n" % mes)
        fle.close()
        self.df.focusField("T", 0, 1)

    def doCpyRpt(self):
        if not self.newrep:
            showError(self.opts["mf"].body, "Invalid Copy Request",
                "You can only Copy a report when Creating a New report, "\
                "not when Changing an Existing report!")
            self.df.focusField("T", 0, 3)
            return
        tit = ("Copy Existing Report Layout",)
        coy = {
            "stype": "R",
            "tables": ("ctlmst",),
            "cols": (
                ("ctm_cono", "", 0, "Coy"),
                ("ctm_name", "", 0, "Name", "Y"))}
        glr = {
            "stype": "R",
            "tables": ("genrpt",),
            "cols": (
                ("glr_cono", "", 0, "Coy"),
                ("glr_repno", "", 0, "Rep"),
                ("glr_type", "", 0, "T"),
                ("glr_desc", "", 0, "Description", "Y")),
            "where": [("glr_seq", "=", 0)],
            "whera": (("T", "glr_cono", 0, 0),),
            "index": 1}
        fld = (
            (("T",0,0,0),"IUI",3,"Company Number","",
                "","N",self.doCpyCoy,coy,None,None),
            (("T",0,1,0),"IUI",3,"Report Number","",
                "","N",self.doRptNum,glr,None,None))
        state = self.df.disableButtonsTags()
        self.cp = TartanDialog(self.opts["mf"], title=tit, tops=True,
            eflds=fld, tend=((self.doCpyEnd, "n"),), txit=(self.doCpyExit,))
        self.cp.mstFrame.wait_window()
        self.df.enableButtonsTags(state=state)
        self.df.focusField("T", 0, 1)

    def doCpyCoy(self, frt, pag, r, c, p, i, w):
        self.cpycoy = w

    def doRptNum(self, frt, pag, r, c, p, i, w):
        self.cpynum = w

    def doCpyEnd(self):
        rpt = self.sql.getRec("genrpt", where=[("glr_cono", "=",
            self.cpycoy), ("glr_repno", "=", self.cpynum)])
        if rpt:
            for rec in rpt:
                rec[0] = self.selcoy
                rec[1] = self.repno
                self.sql.insRec("genrpt", data=rec)
            self.opts["mf"].dbm.commitDbase()
        self.doCpyCloseProcess()

    def doCpyExit(self):
        self.doCpyCloseProcess()

    def doCpyCloseProcess(self):
        self.cp.closeProcess()

    def doDelRpt(self):
        self.sql.delRec("genrpt", where=[("glr_cono", "=", self.selcoy),
            ("glr_repno", "=", self.repno)])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doT0End(self):
        rtype = self.df.t_work[0][0][2]
        desc = self.df.t_work[0][0][3]
        if self.newrep:
            data = [self.selcoy, self.repno, 0, rtype, desc]
            for x in range(5, len(self.genrpt_cl)):
                if self.genrpt_fd[self.genrpt_cl[x]][2][1] in ("A", "a"):
                    data.append("")
                else:
                    data.append(0)
            self.sql.insRec("genrpt", data=data)
        else:
            self.sql.updRec("genrpt", cols=["glr_type", "glr_desc"],
                data=[rtype, desc], where=[("glr_cono", "=", self.selcoy),
                ("glr_repno", "=", self.repno), ("glr_seq", "=", 0)])
        self.df.selPage("Sequence")
        self.df.focusField("T", 1, 1)

    def doReSeq(self):
        whr = [("glr_cono", "=", self.selcoy), ("glr_repno", "=", self.repno)]
        recs = self.sql.getRec("genrpt", where=whr, order="glr_seq")
        self.sql.delRec("genrpt", where=whr)
        for seq, rec in enumerate(recs):
            rec = list(rec)
            rec[2] = float(seq)
            self.sql.insRec("genrpt", data=rec)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)

    def doPreview(self):
        self.cols = [
            ("a", "Seq-Num", 7.2, "UD"),
            ("b", "T", 1, "UA"),
            ("c", "Grp", 3, "Na"),
            ("d", "Lvl", 3, "Na"),
            ("e", "Acc-Num", 7, "Na"),
            ("f", "Description", 30, "NA")]
        self.data = []
        self.newp = []
        recs = self.sql.getRec("genrpt", where=[("glr_cono", "=",
            self.selcoy), ("glr_repno", "=", self.repno)], order="glr_seq")
        pgp = 0
        lsq = 0
        rpc = self.sql.genrpt_col
        for num, rec in enumerate(recs):
            seq = rec[rpc.index("glr_seq")]
            rtp = rec[rpc.index("glr_type")]
            if rtp in ("B", "P", "O"):
                self.titl = rec[rpc.index("glr_desc")]
                continue
            des = rec[rpc.index("glr_desc")]
            prt = rec[rpc.index("glr_print")]
            if prt == "N":
                continue
            if rtp == "H":
                if rec[rpc.index("glr_ffeed")] == "Y":
                    self.data.append((seq, "N", "", "", "",
                        "---------- New Page ----------"))
                elif lsq:
                    ptp = recs[lsq][rpc.index("glr_type")]
                    utp = recs[lsq][rpc.index("glr_uline")]
                    if ptp == "H" or (ptp == "U" and utp == "B"):
                        pass
                    else:
                        self.data.append((seq, "", "", "", "", ""))
                self.data.append((seq, rtp, "", "", "", des))
                self.data.append((seq, "", "", "", "", ""))
            elif rtp == "L":
                frm = rec[rpc.index("glr_from")]
                too = rec[rpc.index("glr_to")]
                whr = [("glm_cono", "=", self.selcoy)]
                if too:
                    whr.append(("glm_acno", "between", frm, too))
                else:
                    whr.append(("glm_acno", "=", frm))
                accs = self.sql.getRec("genmst", cols=["glm_acno",
                    "glm_desc"], where=whr, order="glm_acno")
                for acc in accs:
                    self.data.append((seq, rtp, "", "", acc[0], acc[1]))
            elif rtp == "G":
                grp = rec[rpc.index("glr_group")]
                if not pgp or grp != pgp:
                    self.data.append((seq, rtp, grp, "", "", des))
                pgp = grp
            elif rtp == "T":
                tot = rec[rpc.index("glr_total")]
                self.data.append((seq, rtp, "", tot, "", des))
            elif rtp == "S":
                self.data.append((seq, rtp, "", "", "", des))
            elif rtp == "U":
                utp = rec[rpc.index("glr_uline")]
                if utp == "B":
                    des = ""
                elif utp == "S":
                    des = "-" * 30
                else:
                    des = "=" * 30
                self.data.append((seq, rtp, "", "", "", des))
            else:
                continue
            lsq = num
        self.pprt = False
        self.sc = SelectChoice(self.opts["mf"].window, self.titl, self.cols,
            self.data, sort=False, butt=(("Print", self.doPrePrt),))
        if self.pprt:
            cols = []
            for col in self.cols:
                cols.append([col[0], col[3], col[2], col[1], "y"])
            state = self.df.disableButtonsTags()
            self.df.setWidget(self.df.mstFrame, "hide")
            RepPrt(self.opts["mf"], name=self.__class__.__name__,
                tables=self.data, heads=[self.titl], cols=cols, ttype="D",
                prtdia=(("Y","V"),("Y","N")))
            self.df.setWidget(self.df.mstFrame, "show")
            self.df.enableButtonsTags(state=state)
            self.df.focusField("T", 1, 1)
        elif self.sc.selection:
            self.df.doKeyPressed("T", 1,  0, self.sc.selection[1])
            self.df.doKeyPressed("T", 1,  1, self.sc.selection[2])
        else:
            self.df.focusField("T", 1, 1)

    def doPrePrt(self):
        self.pprt = True

    def doPrint(self):
        table = ["genrpt"]
        heads = ["General Ledger Report %s Layout" % self.repno]
        state = self.df.disableButtonsTags()
        self.df.setWidget(self.df.mstFrame, "hide")
        RepPrt(self.opts["mf"], name=self.__class__.__name__, tables=table,
            heads=heads, where=[("glr_cono", "=", self.selcoy),
            ("glr_repno", "=", self.repno)], order="glr_seq asc",
            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 doSeqNum(self, frt, pag, r, c, p, i, w):
        if not w:
            acc = self.sql.getRec("genrpt", cols=["max(glr_seq)"],
                where=[("glr_cono", "=", self.selcoy), ("glr_repno", "=",
                self.repno)], limit=1)
            if not acc:
                w = 1
            else:
                w = int(acc[0] + 1)
            self.df.loadEntry(frt, pag, i, data=w)
        self.seqno = w
        self.seq = self.doReadRep(self.selcoy, self.repno, self.seqno)
        if not self.seq:
            self.newseq = "y"
        else:
            self.newseq = "n"
            self.df.loadEntry(frt, pag, p+1, data=self.seq[3])

    def doSeqType(self, frt, pag, r, c, p, i, w):
        self.stype = w
        if self.newseq == "y":
            return
        if self.stype == self.seq[3]:
            return
        yn = askQuestion(self.opts["mf"].body, "Change Type?",
            "Change the Type?", default="no")
        if yn == "no":
            return "No Change"
        self.newseq = "c"

    def doDelSeq(self):
        if self.newseq == "y":
            showError(self.opts["mf"].body, "Invalid Delete Request",
                "You can only delete Existing report lines.")
            return
        self.sql.delRec("genrpt", where=[("glr_cono", "=", self.selcoy),
            ("glr_repno", "=", self.repno), ("glr_seq", "=", self.seqno)])
        self.df.clearFrame("T", 1)
        self.df.focusField("T", 1, 1)
        return "nf"

    def doT1End(self):
        for x in range(2, 10):
            self.df.clearFrame("T", x)
        pag = self.pags.index(self.stype)
        if self.newseq == "n":
            cl = self.genrpt_cl
            fld = self.doLoadTypes()
            for x, f in enumerate(fld):
                data = self.seq[cl.index(f)]
                self.df.loadEntry("T", pag, x, data=data)
        self.df.selPage(self.df.tags[pag - 1][0])

    def doAcno(self, frt, pag, r, c, p, i, w):
        if w:
            if pag == 3 and p == 1 and w < self.df.t_work[pag][0][0]:
                return "To Account Less Than From Account"
            if pag == 4 and p == 3 and w < self.df.t_work[pag][0][2]:
                return "To Account Less Than From Account"
            found = False
            for acc in self.glm["data"]:
                if w == acc[0]:
                    found = True
            if not found:
                return "Invalid Account Number"

    def doStore(self, frt, pag, r, c, p, i, w):
        if w == "N":
            self.df.loadEntry(frt, pag, p+1, data=0)
            self.df.loadEntry(frt, pag, p+2, data="")
            return "sk2"

    def doGrpNum(self, frt, pag, r, c, p, i, w):
        if not w:
            gno = self.sql.getRec("genrpt", cols=["max(glr_group)"],
                where=[("glr_cono", "=", self.selcoy), ("glr_repno", "=",
                self.repno), ("glr_type", "=", "G")], limit=1)
            self.gno = gno[0] + 1
            self.df.loadEntry(frt, pag, p, data=self.gno)
        else:
            self.gno = w
        col = ["glr_desc", "glr_high", "glr_obal", "glr_accum",
            "glr_print", "glr_norm", "glr_acbal", "glr_ignore",
            "glr_store", "glr_snum1", "glr_acstr", "glr_label"]
        grp = ""
        for cc in col:
            grp = "%s%s," % (grp, cc)
        grp = grp[:-1]
        self.grp = self.sql.getRec("genrpt", cols=col,
            where=[("glr_cono", "=", self.selcoy), ("glr_repno", "=",
            self.repno), ("glr_group", "=", self.gno)], group=grp)
        if self.grp:
            for n, f in enumerate(col):
                data = self.grp[0][n]
                self.df.loadEntry("T", pag, self.group.index(f), data=data)

    def doPAS(self, frt, pag, r, c, p, i, w):
        self.pas = w
        if self.pas == "P":
            self.df.loadEntry(frt, pag, p+1, data="*")
            return "sk1"

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

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

    def doT2End(self):
        ff = self.doLoadTypes()
        data = [self.selcoy, self.repno, self.seqno, self.stype]
        for nm, cl in enumerate(self.genrpt_cl):
            if nm < 4:
                continue
            if cl in ff:
                data.append(self.df.t_work[self.pags.index(self.stype)]
                        [0][ff.index(cl)])
            elif self.genrpt_fd[cl][2][1] in ("A", "a"):
                data.append("")
            else:
                data.append(0)
        data.append("")
        if self.newseq in ("c", "n"):
            self.doDelSeq()
        self.sql.insRec("genrpt", data=data)
        if self.stype == "G" and self.grp:
            grp = self.sql.getRec("genrpt", where=[("glr_cono", "=",
                self.selcoy), ("glr_repno", "=", self.repno), ("glr_group",
                "=", self.gno)], order="glr_seq")
            for g in grp:
                if g[2] == self.seqno:
                    continue
                data[2] = g[2]
                data[8] = g[8]
                data[9] = g[9]
                data[29] = g[29]
                self.sql.updRec("genrpt", data=data, where=[("glr_cono", "=",
                    self.selcoy), ("glr_repno", "=", self.repno), ("glr_group",
                    "=", self.gno), ("glr_seq", "=", g[2])])
        self.doT2Exit()
        if self.newseq == "y":
            self.df.loadEntry("T", 1, 0, data=(self.seqno + 1))
        else:
            self.df.clearEntry("T", 1, 1)
        self.df.clearEntry("T", 1, 2)
        self.df.focusField("T", 1, 1)

    def doLoadTypes(self):
        if self.stype == "H":
            fld = self.head
        elif self.stype == "L":
            fld = self.ledger
        elif self.stype == "G":
            fld = self.group
        elif self.stype == "S":
            fld = self.store
        elif self.stype == "T":
            fld = self.total
        elif self.stype == "U":
            fld = self.uline
        elif self.stype == "C":
            fld = self.calc
        elif self.stype == "P":
            fld = self.percent
        return fld

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

    def doT1Exit(self):
        # Check for duplicate group numbers
        errmess = """Group Number %s at Sequence Line %s is Duplicated or is Not Contiguous i.e. All Group Lines Must Follow One Another!

Please Delete, or Correct This Line!"""
        seq = self.sql.getRec("genrpt", cols=["glr_type", "glr_seq",
            "glr_group"], where=[("glr_cono", "=", self.selcoy), ("glr_repno",
            "=", self.repno)], order="glr_seq")
        gp = []
        lg = 0
        for t, s, g in seq:
            if t == "G":
                if not lg and g in gp:
                    showError(
                        self.opts["mf"].body, "Group Error", errmess % (g, s))
                    self.df.loadEntry("T", 1, 0, data=s)
                    self.df.focusField("T", 1, 1)
                    return
                if lg and lg != g:
                    if g in gp:
                        showError(self.opts["mf"].body, "Group Error",
                            errmess % (g, s))
                        self.df.loadEntry("T", 1, 0, data=s)
                        self.df.focusField("T", 1, 1)
                        return
                    lg = g
                    gp.append(g)
                    continue
                if not lg:
                    lg = g
                    gp.append(g)
                    continue
            else:
                lg = 0
        self.opts["mf"].dbm.commitDbase(ask=True, mess="Save All Changes?")
        self.df.focusField("T", 0, 1)

    def doT2Exit(self):
        self.df.selPage("Sequence")

    def doReadRep(self, coy, rep, seq):
        rep = self.sql.getRec("genrpt", where=[("glr_cono", "=", coy),
            ("glr_repno", "=", rep), ("glr_seq", "=", seq)], limit=1)
        return rep
コード例 #21
0
ファイル: wg1010.py プロジェクト: paulmalherbe/Tartan
class wg1010(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, ["ctldep", "chglog", "wagbal",
            "wagcap", "wagcod", "wagedc", "wagmst", "wagtf1", "wagtf2",
            "waglmf", "wagltf"], prog=self.__class__.__name__)
        if self.sql.error:
            return
        return True

    def mainProcess(self):
        wgm = {
            "stype": "R",
            "tables": ("wagmst",),
            "cols": (
                ("wgm_empno", "", 0, "EmpNo"),
                ("wgm_sname", "", 0, "Surname", "Y"),
                ("wgm_fname", "", 0, "Names"),
                ("wgm_freq", "", 0, "F"),
                ("wgm_start", "", 0, "Start-Date"),
                ("wgm_term", "", 0, "Term-Date")),
            "where": [("wgm_cono", "=", self.opts["conum"])]}
        dep = {
            "stype": "R",
            "tables": ("ctldep",),
            "cols": (
                ("dep_code", "", 0, "Dep"),
                ("dep_name", "", 0, "Name", "Y")),
            "where": [("dep_cono", "=", self.opts["conum"])]}
        wec = {
            "stype": "R",
            "tables": ("wagedc",),
            "cols": (
                ("ced_code", "", 0, "Code"),
                ("ced_desc", "", 0, "Description", "Y")),
            "where": [
                ("ced_cono", "=", self.opts["conum"]),
                ("ced_type", "=", "E")]}
        wdc = {
            "stype": "R",
            "tables": ("wagedc",),
            "cols": (
                ("ced_code", "", 0, "Code"),
                ("ced_desc", "", 0, "Description", "Y")),
            "where": [
                ("ced_cono", "=", self.opts["conum"]),
                ("ced_type", "=", "D")]}
        r1s = (("Weekly","W"),("2xWeekly","F"),("Monthly   ","M"))
        r2s = (("Cash  ","C"),("Cheque  ","Q"),("Electronic","E"))
        r3s = (("Yes","Y"),("No","N"))
        r4s = (("Current","1"),("Transmission","2"),("Savings","3"))
        fld = (
            (("T",0,0,0),"IUI",5,"Emp-Num","Employee Number",
                "","Y",self.doEmpNum,wgm,None,("notzero",)),
            (("T",0,0,0),"IUI",3,"Department","",
                "","N",self.doDept,dep,None,None),
            (("T",0,0,0),"IUI",1,"Class","",
                "","N",None,None,None,None),
            (("T",1,0,0),"INA",30,"Surname","",
                "","N",None,None,None,("notblank",)),
            (("T",1,1,0),"INA",30,"Names","",
                "","N",None,None,None,("notblank",)),
            (("T",1,2,0),"ID1",10,"Date of Birth","",
                "","N",self.doDOB,None,None,("efld",)),
            (("T",1,3,0),"INA",13,"ID Number","",
                "","N",self.doIdNo,None,None,("idno",)),
            (("T",1,4,0),"INA",16,"Spouse Name","",
                "","N",None,None,None,None),
            (("T",1,5,0),"INA",13,"Spouse ID Number","",
                "","N",self.doIdNo,None,None,("idno",)),
            (("T",1,6,0),"INA",30,"Address Line 1","",
                "","N",None,None,None,("notblank",)),
            (("T",1,7,0),"INA",30,"Address Line 2","",
                "","N",None,None,None,None),
            (("T",1,8,0),"INA",30,"Address Line 3","",
                "","N",None,None,None,None),
            (("T",1,9,0),"INA",4,"Postal Code","",
                "","N",None,None,None,("notblank",)),
            (("T",1,10,0),"INA",16,"Telephone Number","",
                "","N",None,None,None,None),
            (("T",1,11,0),"ITX",50,"E-Mail Address","",
                "","N",None,None,None,("email",)),
            (("T",1,12,0),"ID1",10,"Start Date","",
                "","N",None,None,None,("efld",)),
            (("T",1,13,0),"IUD",10.2,"Salary/Rate","",
                "","N",None,None,None,("efld",)),
            (("T",1,14,0),("IRB",r1s),0,"Pay Freq","Pay Frequency",
                "M","N",None,None,None,None),
            (("T",1,15,0),("IRB",r2s),0,"Pay Type","",
                "E","N",self.doPayTyp,None,None,None),
            (("T",2,0,0),("IRB",r3s),0,"P.A.Y.E.","",
                "Y","N",None,None,None,None),
            (("T",2,1,0),"INA",16,"Tax Office","",
                "","N",None,None,None,None),
            (("T",2,2,0),"INA",10,"Tax Number","",
                "","N",None,None,None,None),
            (("T",2,3,0),"IUA",1,"Nature of Employee","",
                "A","N",None,None,None,("notblank",)),
            (("T",2,4,0),"IUI",9,"Reg Number","Registration Number",
                "","N",None,None,None,None),
            (("T",2,5,0),"IUA",1,"Voluntary Excess","",
                "N","N",None,None,None,None),
            (("T",2,6,0),"IUD",6.2,"Fixed Rate","",
                "","N",None,None,None,None),
            (("T",2,7,0),"INA",13,"Directive","",
                "","N",None,None,None,None),
            (("T",3,0,0),("IRB",r4s),0,"Account Type","Bank Account Type",
                "1","N",None,None,None,None),
            (("T",3,1,0),"INA",30,"Bank Name","",
                "","N",self.doBankNam,None,None,None),
            (("T",3,2,0),"IUI",8,"Branch Code","Bank Branch Code",
                "","N",self.doBankBch,None,None,None),
            (("T",3,3,0),"INA",16,"Account Number","Bank Account Number",
                "","N",self.doBankAcc,None,None,None),
            (("T",3,4,0),"INA",30,"Account Holder's Name","",
                "","N",self.doHolderNam,None,None,None),
            (("T",3,5,0),"IUI",1,"Holder's Relationship","",
                "","N",self.doHolderRel,None,None,None),
            (("C",4,0,0),"IUI",3,"Cod","Earnings Code",
                "","N",self.doEarnCod,wec,None,("efld",)),
            (("C",4,0,1),"ONA",30,"Description"),
            (("C",4,0,2),"ISD",13.2,"Amnt/Rate","Amount or Rate",
                "","N",self.doEarnAmt,None,self.doCodeDelete,("efld",)),
            (("C",5,0,0),"IUI",3,"Cod","Deduction Code",
                "","N",self.doDedCod,wdc,None,("efld",)),
            (("C",5,0,1),"ONA",30,"Description"),
            (("C",5,0,2),"ISD",13.2,"Amnt/Rate","Employees Amount or Rate",
                "","N",self.doDedEAmt,None,self.doCodeDelete,("efld",)),
            (("C",5,0,3),"ISD",13.2,"Amnt/Rate","Employers Amount or Rate",
                "","N",self.doDedRAmt,None,None,("efld",)),
            (("T",6,0,0),"ISD",13.2,"Balance-1","",
                "","N",None,None,None,("efld",)),
            (("T",6,1,0),"ISD",13.2,"Balance-2","",
                "","N",None,None,None,("efld",)),
            (("T",6,2,0),"ISD",13.2,"Balance-3","",
                "","N",None,None,None,("efld",)))
        tag = (
            ("General",None,("T",0,0),("T",0,1)),
            ("Tax",None,("T",0,0),("T",0,1)),
            ("Bank",None,("T",0,0),("T",0,1)),
            ("Earnings",None,("T",0,0),("T",0,1)),
            ("Deductions",None,("T",0,0),("T",0,1)),
            ("Balances",None,("T",0,0),("T",0,1)))
        tnd = (
            (self.doEnd, "n"),
            (self.doEnd, "n"),
            (self.doEnd, "n"),
            (self.doEnd, "n"),
            None,
            None,
            (self.doEnd, "y"))
        txt = (
            self.doExit,
            self.doExit,
            self.doExit,
            self.doExit,
            None,
            None,
            self.doExit)
        cnd = (
            None,
            None,
            None,
            None,
            (self.doEndEarn, "y"),
            (self.doEndDed, "y"),
            None)
        cxt = (
            None,
            None,
            None,
            None,
            self.doExit,
            self.doExit,
            None)
        but = (
            ("Accept",None,self.doAccept,0,("T",0,2),("T",0,1)),
            ("Print",None,self.doPrint,0,("T",0,2),("T",0,0)),
            ("Cancel",None,self.doCancel,0,("T",0,2),("T",0,0)),
            ("Quit",None,self.doCloseProcess,1,None,None))
        row = [0,0,0,0,15,15,0]
        self.df = TartanDialog(self.opts["mf"], eflds=fld, tags=tag,
            rows=row, tend=tnd, txit=txt, cend=cnd, cxit=cxt, butt=but,
            clicks=self.doClick)

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

    def doEmpNum(self, frt, pag, r, c, p, i, w):
        self.empno = w
        self.oldm = self.sql.getRec("wagmst", where=[("wgm_cono", "=",
            self.opts["conum"]), ("wgm_empno", "=", self.empno)], limit=1)
        self.oldb = self.sql.getRec("wagbal", where=[("wbl_cono", "=",
            self.opts["conum"]), ("wbl_empno", "=", self.empno)],
            order="wbl_balno")
        if not self.oldm:
            self.new = True
            self.term = 0
            self.ptyp = ""
        else:
            self.new = False
            self.term = self.oldm[len(self.oldm)-1]
            d = 1
            for pg in range(0, self.df.pgs):
                for x in range(0, self.df.topq[pg]):
                    self.df.loadEntry("T", pg, x, data=self.oldm[d])
                    d = d + 1
            self.ptyp = self.df.t_work[1][0][15]
            self.doLoadEarnDed("E")
            self.doLoadEarnDed("D")
            if self.oldb:
                for b in self.oldb:
                    self.df.loadEntry("T", 6, b[2]-1, data=b[3])

    def doDept(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("ctldep", cols=["dep_name"],
            where=[("dep_cono", "=", self.opts["conum"]),
            ("dep_code", "=", w)], limit=1)
        if not acc:
            return "Invalid Department"
        self.dept = w

    def doDOB(self, frt, pag, r, c, p, i, w):
        self.dob = w

    def doIdNo(self, frt, pag, r, c, p, i, w):
        if p == 6:
            a = int(int(w) / 10000000)
            b = int(self.dob % 1000000)
            if a != b:
                return "ID Number Does Not Agree with Birth Date"

    def doPayTyp(self, frt, pag, r, c, p, i, w):
        self.ptyp = w

    def doBankNam(self, frt, pag, r, c, p, i, w):
        if self.ptyp == "E" and not w:
            return "Invalid Bank Name"

    def doBankBch(self, frt, pag, r, c, p, i, w):
        if self.ptyp == "E" and not w:
            return "Invalid Branch"

    def doBankAcc(self, frt, pag, r, c, p, i, w):
        if self.ptyp == "E" and not w:
            return "Invalid Account"

    def doHolderNam(self, frt, pag, r, c, p, i, w):
        self.holnam = w

    def doHolderRel(self, frt, pag, r, c, p, i, w):
        self.holrel = w

    def doEnd(self):
        if self.df.pag == 0:
            self.df.focusField("T", 1, 1)
        elif self.df.pag == 1:
            self.df.selPage("Tax")
            self.df.focusField("T", 2, 1)
        elif self.df.pag == 2:
            self.df.selPage("Bank")
            self.df.focusField("T", 3, 1)
        elif self.df.pag == 3:
            self.df.selPage("Earnings")
        elif self.df.pag == 6:
            self.doAccept()

    def doEarnCod(self, frt, pag, r, c, p, i, w):
        desc = self.sql.getRec("wagedc", cols=["ced_desc"],
            where=[("ced_cono", "=", self.opts["conum"]), ("ced_type", "=",
            "E"), ("ced_code", "=", w)], limit=1)
        if not desc:
            return "Invalid Code"
        self.code = w
        self.df.loadEntry(frt, pag, p+1, data=desc[0])
        code = self.sql.getRec("wagcod", cols=["wcd_eamt", "wcd_ramt"],
            where=[("wcd_cono", "=", self.opts["conum"]), ("wcd_empno", "=",
            self.empno), ("wcd_type", "=", "E"), ("wcd_code", "=", w)],
            limit=1)
        if not code:
            self.ncod = "y"
        else:
            self.ncod = "n"
            self.df.loadEntry(frt, pag, p+2, data=code[0])

    def doEarnAmt(self, frt, pag, r, c, p, i, w):
        self.eamt = w
        self.ramt = 0

    def doEndEarn(self):
        self.doEndCode("E")

    def doDedCod(self, frt, pag, r, c, p, i, w):
        desc = self.sql.getRec("wagedc", cols=["ced_desc"],
            where=[("ced_cono", "=", self.opts["conum"]), ("ced_type", "=",
            "D"), ("ced_code", "=", w)], limit=1)
        if not desc:
            return "Invalid Code"
        self.code = w
        self.df.loadEntry(frt, pag, p+1, data=desc[0])
        code = self.sql.getRec("wagcod", cols=["wcd_eamt", "wcd_ramt"],
            where=[("wcd_cono", "=", self.opts["conum"]), ("wcd_empno", "=",
            self.empno), ("wcd_type", "=", "D"), ("wcd_code", "=", w)],
            limit=1)
        if not code:
            self.ncod = "y"
        else:
            self.ncod = "n"
            self.df.loadEntry(frt, pag, p+2, data=code[0])
            self.df.loadEntry(frt, pag, p+3, data=code[1])

    def doDedEAmt(self, frt, pag, r, c, p, i, w):
        self.eamt = w

    def doDedRAmt(self, frt, pag, r, c, p, i, w):
        self.ramt = w

    def doEndDed(self):
        self.doEndCode("D")

    def doEndCode(self, rtype):
        if self.ncod == "y":
            self.sql.insRec("wagcod", data=[self.opts["conum"],
            self.empno, rtype, self.code, self.eamt, self.ramt])
        else:
            self.sql.updRec("wagcod", cols=["wcd_eamt", "wcd_ramt"],
                data=[self.eamt, self.ramt], where=[("wcd_cono", "=",
                self.opts["conum"]), ("wcd_empno", "=", self.empno),
                ("wcd_type", "=", rtype), ("wcd_code", "=", self.code)])
        self.doLoadEarnDed(rtype, focus=True)

    def doLoadEarnDed(self, rtype, focus=False):
        if rtype == "E":
            pag = 4
        else:
            pag = 5
        self.df.clearFrame("C", pag)
        codes = self.sql.getRec(tables=["wagcod", "wagedc"], cols=["wcd_code",
            "ced_desc", "wcd_eamt", "wcd_ramt"], where=[("wcd_cono", "=",
            self.opts["conum"]), ("wcd_empno", "=", self.empno), ("wcd_type",
            "=", rtype), ("ced_cono = wcd_cono",), ("ced_type = wcd_type",),
            ("ced_code = wcd_code",)])
        if not codes:
            return
        p = 0
        for cod in codes:
            for i, c in enumerate(cod):
                if rtype == "E" and i == 3:
                    continue
                self.df.loadEntry("C", pag, p, data=c)
                p = p + 1
        if focus:
            self.df.focusField("C", pag, p+1)
        else:
            self.df.last[pag][1] = p + 1

    def doCodeDelete(self):
        if self.df.pag == 4:
            rtype = "E"
        else:
            rtype = "D"
        code = self.df.c_work[self.df.pag][self.df.row][self.df.idx-2]
        self.sql.delRec("wagcod", where=[("wcd_cono", "=", self.opts["conum"]),
            ("wcd_empno", "=", self.empno), ("wcd_type", "=", rtype),
            ("wcd_code", "=", code)])
        self.doLoadEarnDed(rtype, focus=True)

    def doAccept(self):
        frt, pag, col, mes = self.df.doCheckFields(("T",0,None))
        if not mes:
            frt, pag, col, mes = self.df.doCheckFields(("T",1,None))
        if not mes:
            frt, pag, col, mes = self.df.doCheckFields(("T",2,None))
        if not mes and self.df.t_work[1][0][15] == "E":
            frt, pag, col, mes = self.df.doCheckFields(("T",3,None))
        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])
            self.df.focusField(frt, pag, (col+1), err=mes)
        else:
            data = [self.opts["conum"]]
            for p in range(0, self.df.pgs):
                for x in range(0, self.df.topq[p]):
                    data.append(self.df.t_work[p][0][x])
            data.append(self.term)
            if self.new:
                self.sql.insRec("wagmst", data=data)
                for b in range(3):
                    data = [self.opts["conum"], self.empno, b+1,
                        self.df.t_work[6][0][b], ""]
                    self.sql.insRec("wagbal", data=data)
            else:
                dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
                if data != self.oldm[:len(data)]:
                    col = self.sql.wagmst_col
                    data.append(self.oldm[col.index("wgm_xflag")])
                    self.sql.updRec("wagmst", data=data, where=[("wgm_cono",
                        "=", self.opts["conum"]), ("wgm_empno", "=",
                        self.empno)])
                    for num, dat in enumerate(self.oldm):
                        if dat != data[num]:
                            self.sql.insRec("chglog", data=["wagmst", "U",
                                "%03i%05i" % (self.opts["conum"], self.empno),
                                col[num], dte, self.opts["capnm"], str(dat),
                                str(data[num]), "", 0])
                for n, b in enumerate(self.df.t_work[6][0]):
                    lvl = n + 1
                    data = [self.opts["conum"], self.empno, lvl, b]
                    whr = [
                        ("wbl_cono", "=", self.opts["conum"]),
                        ("wbl_empno", "=", self.empno),
                        ("wbl_balno", "=", lvl)]
                    chk = self.sql.getRec("wagbal", where=whr, limit=1)
                    if not chk:
                        self.sql.insRec("wagbal", data=data)
                        continue
                    if data != self.oldb[n][:len(data)]:
                        col = self.sql.wagbal_col
                        data.append(self.oldb[n][col.index("wbl_xflag")])
                        self.sql.updRec("wagbal", data=data, where=whr)
                        for num, dat in enumerate(self.oldb[n]):
                            if dat != data[num]:
                                self.sql.insRec("chglog", data=["wagbal", "U",
                                    "%03i%05i%i" % (self.opts["conum"],
                                    self.empno, lvl), col[num], dte,
                                    self.opts["capnm"], str(dat),
                                    str(data[num]), "", 0])
            self.opts["mf"].dbm.commitDbase()
            self.df.last[0] = [0, 0]
            self.df.selPage("General")
            self.df.focusField("T", 0, 1)

    def doMainDelete(self):
        t = self.sql.getRec("wagtf1", cols=["count(*)"],
            where=[("wt1_cono", "=", self.opts["conum"]), ("wt1_empno", "=",
            self.empno)], limit=1)
        if t[0]:
            return "Transactions 1 Exist, Not Deleted"
        t = self.sql.getRec("wagtf2", cols=["count(*)"],
            where=[("wt2_cono", "=", self.opts["conum"]), ("wt2_empno=%s", "=",
            self.empno)], limit=1)
        if t[0]:
            return "Transactions 2 Exist, Not Deleted"
        t = self.sql.getRec("wagltf", cols=["count(*)"],
            where=[("wlt_cono", "=", self.opts["conum"]), ("wlt_empno", "=",
            self.empno)], limit=1)
        if t[0]:
            return "Loan Transactions Exist, Not Deleted"
        self.sql.delRec("wagbal", where=[("wbl_cono", "=", self.opts["conum"]),
            ("wbl_empno", "=", self.empno)])
        self.sql.delRec("wagcap", where=[("wcp_cono", "=", self.opts["conum"]),
            ("wcp_empno", "=", self.empno)])
        self.sql.delRec("wagcod", where=[("wcd_cono", "=", self.opts["conum"]),
            ("wcd_empno", "=", self.empno)])
        self.sql.delRec("waglmf", where=[("wlm_cono", "=", self.opts["conum"]),
            ("wlm_empno", "=", self.empno)])
        self.sql.delRec("wagmst", where=[("wgm_cono", "=", self.opts["conum"]),
            ("wgm_empno", "=", self.empno)])
        dte = int("%04i%02i%02i%02i%02i%02i" % time.localtime()[:-3])
        self.sql.insRec("chglog", data=["wagmst", "D", "%03i%05i" %
            (self.opts["conum"], self.empno), "", dte, self.opts["capnm"],
            "", "", "", 0])
        self.opts["mf"].dbm.commitDbase()
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        tables = []
        for pag in range(0, (self.df.pgs+1)):
            for x in range(0, self.df.topq[pag]):
                lin = []
                lin.append(self.df.topf[pag][x][3])
                lin.append(self.df.t_disp[pag][0][x])
                tables.append(lin)
        heads = ["Salaries and Wages File Maintenance"]
        cols = [["a","NA",30.0,"Field Name"],
                ["b","NA",30.0,"Values"]]
        state = self.df.disableButtonsTags()
        RepPrt(self.opts["mf"], name=self.__class__.__name__, tables=tables,
            heads=heads, cols=cols, conum=self.opts["conum"],
            conam=self.opts["conam"], ttype="D")
        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("General")
        self.df.focusField("T", 0, 1)

    def doExit(self):
        if self.df.pag == 0:
            self.doCloseProcess()
        elif self.df.pag == 1:
            self.df.focusField("T", 0, 3)
        elif self.df.pag == 2:
            self.df.selPage("General")
        elif self.df.pag == 3:
            self.df.selPage("Tax")
        elif self.df.pag == 4:
            self.df.selPage("Deductions")
        elif self.df.pag == 5:
            self.df.selPage("Balances")

    def doCloseProcess(self):
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
コード例 #22
0
ファイル: wg4010.py プロジェクト: paulmalherbe/Tartan
class wg4010(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,
            ["wagmst", "wagedc", "wagcod", "wagbal", "wagtf1", "wagtf2"],
            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])
        if t[1] < 3:
            self.taxyr = t[0]
        else:
            self.taxyr = t[0] + 1
        self.startb = self.startt = (((self.taxyr - 1) * 10000) + 301)
        if not self.taxyr % 4:
            self.endb = self.endt = ((self.taxyr * 10000) + 229)
        else:
            self.endb = self.endt = ((self.taxyr * 10000) + 228)
        return True

    def mainProcess(self):
        self.tit = ("%03i %s" % (self.opts["conum"], self.opts["conam"]),
                    "Salaries/Wages Interrogation (%s)" %
                    self.__class__.__name__)
        wgm = {
            "stype":
            "R",
            "tables": ("wagmst", ),
            "cols":
            (("wgm_empno", "", 0, "EmpNo"), ("wgm_sname", "", 0, "Surname"),
             ("wgm_fname", "", 0, "Names")),
            "where": [("wgm_cono", "=", self.opts["conum"])]
        }
        r1s = (("Weekly", "W"), ("2xWeekly", "F"), ("Monthly   ", "M"))
        r2s = (("Cash  ", "C"), ("Cheque  ", "Q"), ("Electronic", "E"))
        r3s = (("Yes", "Y"), ("No", "N"))
        r4s = (("Current", "1"), ("Transmission", "2"), ("Savings", "3"))
        tag = (("General", self.doTagSelect, ("T", 0, 2), ("T", 0, 1)),
               ("Tax", self.doTagSelect, ("T", 0, 2), ("T", 0, 1)),
               ("Bank", self.doTagSelect, ("T", 0, 2),
                ("T", 0, 1)), ("Earnings", self.doTagSelect, ("T", 0, 2),
                               ("T", 0, 1)), ("Deductions", self.doTagSelect,
                                              ("T", 0, 2), ("T", 0, 1)),
               ("Balances", self.doTagSelect, ("T", 0, 2),
                ("T", 0, 1)), ("Progs", self.doTaxYear, ("T", 0, 2),
                               ("T", 0, 1)), ("Trans", self.doTaxYear,
                                              ("T", 0, 2), ("T", 0, 1)))
        fld = ((("T", 0, 0, 0), "IUI", 5, "Emp-Num", "Employee Number", "",
                "Y", self.doEmpno, wgm, None,
                ("notzero", )), (("T", 0, 0, 0), "OUI", 1, "Department"),
               (("T", 0, 0, 0), "OUI", 1,
                "Class"), (("T", 1, 0, 0), "ONA", 30,
                           "Surname"), (("T", 1, 1, 0), "ONA", 30, "Names"),
               (("T", 1, 2, 0), "OD1", 10,
                "Date of Birth"), (("T", 1, 3, 0), "ONA", 13, "ID Number"),
               (("T", 1, 4, 0), "ONA", 16,
                "Spouse Name"), (("T", 1, 5, 0), "ONA", 13,
                                 "Spouse ID Number"), (("T", 1, 6, 0), "ONA",
                                                       30, "Address Line 1"),
               (("T", 1, 7, 0), "ONA", 30, "Address Line 2"),
               (("T", 1, 8, 0), "ONA", 30,
                "Address Line 3"), (("T", 1, 9, 0), "ONA", 4,
                                    "Postal Code"), (("T", 1, 10, 0), "ONA",
                                                     16, "Telephone Number"),
               (("T", 1, 11, 0), "OTX", 50,
                "E-Mail Address"), (("T", 1, 12, 0), "OD1", 10, "Start Date"),
               (("T", 1, 13, 0), "Od1", 10,
                "Term  Date"), (("T", 1, 14, 0), "OUD", 13.2, "Salary"),
               (("T", 1, 15, 0), ("ORB", r1s), 1,
                "Pay Freq"), (("T", 1, 16, 0), ("ORB", r2s), 1,
                              "Pay Type"), (("T", 2, 0, 0), ("ORB", r3s), 1,
                                            "P.A.Y.E."),
               (("T", 2, 1, 0), "ONA", 16,
                "Tax Office"), (("T", 2, 2, 0), "ONA", 10,
                                "Tax Number"), (("T", 2, 3, 0), "OUA", 1,
                                                "Nature of Employee"),
               (("T", 2, 4, 0), "OUI", 9,
                "Reg Number"), (("T", 2, 5, 0), "OUA", 1,
                                "Voluntary Excess"), (("T", 2, 6, 0), "OUD",
                                                      6.2, "Fixed Rate"),
               (("T", 2, 7, 0), "ONA", 13,
                "Directive"), (("T", 3, 0, 0), ("ORB", r4s), 0,
                               "Account Type"), (("T", 3, 1, 0), "ONA", 30,
                                                 "Bank Name"),
               (("T", 3, 2, 0), "OUI", 8,
                "Branch Code"), (("T", 3, 3, 0), "ONA", 16,
                                 "Account Number"), (("T", 3, 4, 0), "ONA", 30,
                                                     "Holder's Name"),
               (("T", 3, 5, 0), "OUI", 1,
                "Holder's Relationship"), (("C", 4, 0, 0), "OUI", 3,
                                           "Cod"), (("C", 4, 0, 1), "ONA", 30,
                                                    "Description"),
               (("C", 4, 0, 2), "OSD", 13.2,
                "Amnt/Rate"), (("C", 5, 0, 0), "OUI", 3,
                               "Cod"), (("C", 5, 0, 1), "ONA", 30,
                                        "Description"), (("C", 5, 0, 2), "OSD",
                                                         13.2, "Employee"),
               (("C", 5, 0, 3), "OSD", 13.2,
                "Employer"), (("T", 6, 0, 0), "OSD", 13.2,
                              "Balance-1"), (("T", 6, 1, 0), "OSD", 13.2,
                                             "Balance-2"), (("T", 6, 2,
                                                             0), "OSD", 13.2,
                                                            "Balance-3"),
               (("T", 7, 0, 0), "IUI", 4, "Tax Year", "Tax Year", self.taxyr,
                "N", self.doBals, None, None,
                None), (("C", 7, 0, 0), "OUA", 1,
                        "T"), (("C", 7, 0, 1), "OUI", 3,
                               "Cod"), (("C", 7, 0, 2), "ONA", 30,
                                        "Description"), (("C", 7, 0, 3), "OSD",
                                                         13.2, "Hours"),
               (("C", 7, 0, 4), "OSD", 13.2,
                "Value"), (("T", 8, 0, 0), "IUI", 4, "Tax Year", "Tax Year",
                           self.taxyr, "N", self.doTrans, None, None, None))
        tnd = (None, None, None, None, None, None, None, None, None)
        txt = (self.doExit, None, None, None, None, None, None, None,
               self.doExit)
        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))
        row = [0, 0, 0, 0, 15, 15, 0, 15, 0]
        self.df = TartanDialog(self.opts["mf"],
                               title=self.tit,
                               eflds=fld,
                               tags=tag,
                               rows=row,
                               tend=tnd,
                               txit=txt,
                               butt=but)

    def doEmpno(self, frt, pag, r, c, p, i, w):
        acc = self.sql.getRec("wagmst",
                              where=[("wgm_cono", "=", self.opts["conum"]),
                                     ("wgm_empno", "=", w)],
                              limit=1)
        if not acc:
            return "Invalid Employee Number"
        self.empno = w
        self.sname = acc[4]
        self.fname = acc[5]
        acc.insert(17, acc.pop())  # Termination Date
        self.df.loadEntry("T", 0, 1, data=acc[2])  # Department
        self.df.loadEntry("T", 0, 2, data=acc[3])  # Class
        d = 4
        for pg in range(1, 4):
            for x in range(0, self.df.topq[pg]):
                self.df.loadEntry("T", pg, x, data=acc[d])
                d = d + 1
        self.loadDetail()
        self.opts["mf"].updateStatus("")

    def loadDetail(self):
        ear = self.sql.getRec(
            tables=["wagcod", "wagedc"],
            cols=["wcd_type", "wcd_code", "ced_desc", "wcd_eamt", "wcd_ramt"],
            where=[("wcd_cono", "=", self.opts["conum"]),
                   ("wcd_empno", "=", self.empno), ("wcd_type", "=", "E"),
                   ("ced_cono=wcd_cono", ), ("ced_type=wcd_type", ),
                   ("ced_code=wcd_code", )],
            order="wcd_code")
        p = 0
        for e in ear:
            for y in range(1, 4):
                self.df.loadEntry("C", 4, p, data=e[y])
                p += 1
        ded = self.sql.getRec(
            tables=["wagcod", "wagedc"],
            cols=["wcd_type", "wcd_code", "ced_desc", "wcd_eamt", "wcd_ramt"],
            where=[("wcd_cono", "=", self.opts["conum"]),
                   ("wcd_empno", "=", self.empno), ("wcd_type", "=", "D"),
                   ("ced_cono=wcd_cono", ), ("ced_type=wcd_type", ),
                   ("ced_code=wcd_code", )],
            order="wcd_code")
        p = 0
        for d in ded:
            for y in range(1, 5):
                self.df.loadEntry("C", 5, p, data=d[y])
                p += 1
        bal = self.sql.getRec("wagbal",
                              where=[("wbl_cono", "=", self.opts["conum"]),
                                     ("wbl_empno", "=", self.empno)])
        if bal:
            for b in bal:
                self.df.loadEntry("T", 6, (b[2] - 1), data=b[3])

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

    def doBals(self, frt, pag, r, c, p, i, w):
        self.startb = (((w - 1) * 10000) + 301)
        if not w % 4:
            self.endb = ((w * 10000) + 229)
        else:
            self.endb = ((w * 10000) + 228)
        wt2 = self.sql.getRec("wagtf2",
                              cols=[
                                  "wt2_type", "wt2_code",
                                  "round(sum(wt2_hrs),2)",
                                  "round(sum(wt2_eamt),2)"
                              ],
                              where=[("wt2_cono", "=", self.opts["conum"]),
                                     ("wt2_empno", "=", self.empno),
                                     ("wt2_date", "between", self.startb,
                                      self.endb)],
                              group="wt2_type, wt2_code",
                              order="wt2_type desc, wt2_code")
        if wt2:
            for num, line in enumerate(wt2):
                typ = CCD(line[0], "UA", 1.0)
                cod = CCD(line[1], "UI", 3.0)
                det = self.sql.getRec("wagedc",
                                      cols=["ced_desc"],
                                      where=[("ced_cono", "=",
                                              self.opts["conum"]),
                                             ("ced_type", "=", typ.work),
                                             ("ced_code", "=", cod.work)],
                                      limit=1)
                if not det:
                    des = "Unknown"
                else:
                    des = det[0]
                self.df.loadEntry("C", pag, (num * 5), data=typ.work)
                self.df.loadEntry("C", pag, (num * 5) + 1, data=cod.work)
                self.df.loadEntry("C", pag, (num * 5) + 2, data=des)
                if line[2]:
                    self.df.loadEntry("C", pag, (num * 5) + 3, data=line[2])
                self.df.loadEntry("C", pag, (num * 5) + 4, data=line[3])

    def doTrans(self, frt, pag, r, c, p, i, w):
        self.startt = (((w - 1) * 10000) + 301)
        if not w % 4:
            self.endt = ((w * 10000) + 229)
        else:
            self.endt = ((w * 10000) + 228)
        tit = "Transactions for Employee: %s - %s %s" % \
            (self.empno, self.fname, self.sname)
        tab = ["wagtf1"]
        wcp = (("wt1_date", "", 0, "Date"), ("wt1_page", "", 0, "Number"),
               ("wt1_nhrs", "", 13.2, "Norm-Hrs"), ("wt1_npay", "", 13.2,
                                                    "Norm-Pay"),
               ("wt1_taxbl", "", 13.2, "Tx-Pay"), ("wt1_notax", "", 13.2,
                                                   "Non-Tx-Pay"),
               ("wt1_taxdd", "", 13.2, "Tx-Ded"), ("wt1_nondd", "", 13.2,
                                                   "Non-Tx-Ded"))
        whr = [("wt1_cono", "=", self.opts["conum"]),
               ("wt1_empno", "=", self.empno),
               ("wt1_date", "between", self.startt, self.endt)]
        odr = "wt1_date"
        state = self.df.disableButtonsTags()
        SRec(self.opts["mf"],
             screen=self.df.nb.Page7,
             title=tit,
             tables=tab,
             cols=wcp,
             where=whr,
             order=odr)
        self.df.enableButtonsTags(state=state)
        self.doTaxYear()

    def doTaxYear(self):
        if self.df.pag == 7:
            self.df.clearFrame("C", 7)
            self.df.focusField("T", 7, 1)
        else:
            self.df.focusField("T", 8, 1)

    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"], "WAG", self.empno)
        self.df.setWidget(self.df.mstFrame, state="show")
        self.df.enableButtonsTags(state=state)

    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):
        if opt == "N":
            return
        self.head = "%03u %-110s" % (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":
            self.wagtrn = self.doGetTrans()
            if not self.wagtrn:
                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":
            self.wagtrn = self.doGetTrans()
            if self.wagtrn:
                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("%15s %-25s %s" % \
            ("", self.df.topf[0][0][3], self.df.t_disp[0][0][0]))
        self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1
        # General Screen
        for x in range(0, len(self.df.topf[1])):
            self.fpdf.drawText("%15s %-25s %s" % \
                ("", self.df.topf[1][x][3], self.df.t_disp[1][0][x]))
            self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1
        # Tax Screen
        for x in range(0, len(self.df.topf[2])):
            self.fpdf.drawText("%15s %-25s %s" % \
                ("", self.df.topf[2][x][3], self.df.t_disp[2][0][x]))
            self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1
        # Bank Details Screen
        if self.df.t_work[1][0][15] == "E":
            for x in range(0, len(self.df.topf[3])):
                self.fpdf.drawText("%15s %-25s %s" % \
                    ("", self.df.topf[3][x][3], self.df.t_disp[3][0][x]))
                self.pglin += 1
            self.fpdf.drawText()
            self.pglin += 1
        # Balances Screen
        self.pglin += 1
        for x in range(0, len(self.df.topf[6])):
            self.fpdf.drawText("%15s %-25s %s" % \
                ("", self.df.topf[6][x][3], self.df.t_disp[6][0][x]))
            self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1
        # Earnings and Deductions Screen
        self.fpdf.drawText("%15s %29s" % ("", "Earnings and Deductions Codes"))
        self.pglin += 1
        self.fpdf.drawText("%15s %29s" % ("", self.fpdf.suc * 29))
        self.pglin += 1
        self.fpdf.drawText("%15s %-3s %-1s %-30s %12s  %12s " % \
            ("", "Cod", "T", "Description", "Employee", "Employer"))
        self.pglin += 1
        self.fpdf.drawText("%15s %s" % ("", self.fpdf.suc * 63))
        self.pglin += 1
        for x in range(0, len(self.df.colf[4])):
            if self.df.c_work[4][x][0] not in ("", 0):
                self.fpdf.drawText("%15s %s %s %s %12s" % \
                    ("", self.df.c_disp[4][x][0], "E",
                    self.df.c_disp[4][x][1], self.df.c_disp[4][x][2]))
                self.pglin += 1
        for x in range(0, len(self.df.colf[5])):
            if self.df.c_work[5][x][0] not in ("", 0):
                self.fpdf.drawText("%15s %s %s %s %12s %12s" % \
                    ("", self.df.c_disp[5][x][0], "D",
                    self.df.c_disp[5][x][1], self.df.c_disp[5][x][2],
                    self.df.c_disp[5][x][3]))
                self.pglin += 1
        # Progressive Balances Screen
        if self.startb is None or self.endb is None:
            pass
        else:
            self.fpdf.drawText()
            self.pglin += 1
            s = CCD(self.startb, "D1", 10.0)
            e = CCD(self.endb, "D1", 10.0)
            self.fpdf.drawText("%15s %-25s %10s %2s %10s" % \
                ("", "Progressive Balances from", s.disp, "to", e.disp))
            self.pglin += 1
            self.fpdf.drawText("%15s %s" % ("", self.fpdf.suc * 50))
            self.pglin += 1
            self.fpdf.drawText("%15s %-3s %-1s %-30s %12s  %12s " % \
                ("", "Cod", "T", "Description", "Hours", "Value"))
            self.pglin += 1
            self.fpdf.drawText("%15s %s" % ("", self.fpdf.suc * 63))
            self.pglin += 1
            for x in range(0, len(self.df.colf[7])):
                if self.df.c_work[7][x][0]:
                    if self.df.c_work[7][x][3]:
                        hr = self.df.c_disp[7][x][3]
                    else:
                        hr = "             "
                    self.fpdf.drawText(
                        "%15s %s %s %s %12s %12s" %
                        ("", self.df.c_disp[7][x][0], self.df.c_disp[7][x][1],
                         self.df.c_disp[7][x][2], hr, self.df.c_disp[7][x][4]))
                    self.pglin += 1
        self.fpdf.drawText()
        self.pglin += 1

    def doGetTrans(self):
        if self.startt is None or self.endt is None:
            return
        wagtrn = self.sql.getRec("wagtf1",
                                 cols=[
                                     "wt1_date", "wt1_page", "wt1_nhrs",
                                     "wt1_npay", "wt1_taxbl", "wt1_notax",
                                     "wt1_taxdd, wt1_nondd"
                                 ],
                                 where=[("wt1_cono", "=", self.opts["conum"]),
                                        ("wt1_empno", "=", self.empno),
                                        ("wt1_date", "between", self.startt,
                                         self.endt)],
                                 order="wt1_date")
        return wagtrn

    def printTrans(self):
        for x in range(0, len(self.wagtrn)):
            date = CCD(self.wagtrn[x][0], "D1", 10)
            page = CCD(self.wagtrn[x][1], "UI", 5)
            nhrs = CCD(self.wagtrn[x][2], "SD", 13.2)
            npay = CCD(self.wagtrn[x][3], "SD", 13.2)
            taxbl = CCD(self.wagtrn[x][4], "SD", 13.2)
            notax = CCD(self.wagtrn[x][5], "SD", 13.2)
            taxdd = CCD(self.wagtrn[x][6], "SD", 13.2)
            nondd = CCD(self.wagtrn[x][7], "SD", 13.2)
            if self.pglin > self.fpdf.lpp:
                self.pageHeading()
                self.pageHeadingTrans()
            net = CCD((float(ASD(taxbl.work) + ASD(notax.work) - \
                ASD(taxdd.work) - ASD(nondd.work))), "OSD", 13.2)
            self.fpdf.drawText(
                "%s %s %s %s %s %s %s %s %s" %
                (date.disp, page.disp, nhrs.disp, npay.disp, taxbl.disp,
                 notax.disp, taxdd.disp, nondd.disp, net.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("%-38s %-10s" % \
            ("Salaries and Wages Interrogation as at", self.sysdtd))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 6

    def pageHeadingTrans(self):
        self.fpdf.setFont(style="B")
        self.fpdf.drawText()
        self.fpdf.drawText("%8s Emp-Num: %5s Surname: %s Names: %s" % \
            ("", self.empno, self.df.t_disp[1][0][0], self.df.t_disp[1][0][1]))
        self.fpdf.drawText()
        s = CCD(self.startt, "D1", 10.0)
        e = CCD(self.endt, "D1", 10.0)
        self.fpdf.drawText("%8s %-17s %10s %2s %10s" % \
            ("", "Transactions from", s.disp, "to", e.disp))
        self.fpdf.drawText()
        self.fpdf.drawText(
            "%-10s %5s %12s  %12s  %12s  %12s  %12s  %12s  %12s" %
            ("   Date", "Page", "Norm-Hrs", "Norm-Pay", "Taxbl-Pay",
             "Non-Taxbl", "Tax-D-Ded", "Non-D-Ded", "Net-Pay"))
        self.fpdf.underLine(txt=self.head)
        self.fpdf.setFont()
        self.pglin = 10

    def doExit(self):
        self.df.closeProcess()
        if "wait" not in self.opts:
            self.opts["mf"].closeLoop()
コード例 #23
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()
コード例 #24
0
class pw1010(object):
    def __init__(self, **opts):
        self.opts = opts
        if not CRYPT:
            showError(self.opts["mf"].body, "Missing Module",
                "Either the CRYPT or PARAMIKO module is Missing")
        else:
            self.setVariables()
            self.mainProcess()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.saltchrs = "abcdefghijklmnopqrstuvwxyz"\
                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
                        "0123456789./"
        self.server = self.opts["mf"].rcdic["dbhost"]
        self.client = None
        random.seed()

    def mainProcess(self):
        tit = ("User Administration",)
        r1s = (("Mail", "M"), ("Client", "C"))
        fld = (
            (("T",1,0,0),"ITX",50,"Server","",
                self.server,"N",self.doServer,None,None,("notblank",)),
            (("T",1,1,0),"ITX",20,"Admin Name","",
                "root","N",self.doAdmNam,None,None,("notblank",)),
            (("T",1,1,0),"IHA",20,"Password","",
                "","N",self.doAdmPwd,None,None,("notblank",)),
            (("T",2,0,0),"ITX",50,"User Name","",
                "","N",self.doUsrNam,None,None,("notblank",)),
            (("T",2,1,0),("IRB",r1s),0,"Type of Account","",
                "M","N",self.doUsrTyp,None,None,None),
            (("T",2,2,0),"IHA",20,"New Password","",
                "","N",self.doNewPwd,None,None,("notblank",)),
            (("T",2,3,0),"IHA",20,"Check Password","",
                "","N",self.doCheckPwd,None,None,("notblank",)))
        but = (
            ("New",None,self.doNew,0,None,None),
            ("Amend",None,self.doAmend,0,None,None),
            ("Delete",None,self.doDelete,0,None,None),
            ("Quit",None,self.doQuit,0,None,None))
        tag = (("Server",None,None,None), ("Accounts",None,None,None))
        tnd = (None, (self.doEnd,"n"), (self.doEnd,"y"))
        txt = (None, self.doExit, self.doExit)
        self.df = TartanDialog(self.opts["mf"], tops=True, title=tit, tags=tag,
            eflds=fld, butt=but, tend=tnd, txit=txt, focus=True)

    def doNew(self):
        self.opt = "N"
        self.df.focusField("T", 2, 1)

    def doAmend(self):
        self.opt = "A"
        self.df.focusField("T", 2, 1)

    def doDelete(self):
        self.opt = "D"
        self.df.focusField("T", 2, 1)

    def doServer(self, frt, pag, r, c, p, i, w):
        self.server = w

    def doAdmNam(self, frt, pag, r, c, p, i, w):
        self.admnam = w

    def doAdmPwd(self, frt, pag, r, c, p, i, w):
        self.admpwd = w
        try:
            self.client = paramiko.SSHClient()
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.client.connect(self.server, username=self.admnam,
                password=self.admpwd)
        except:
            showError(self.opts["mf"].body, "SSH Error",
                "Cannot Open the Connection")
            return "ff1"

    def doUsrNam(self, frt, pag, r, c, p, i, w):
        self.usrnam = w
        self.usrpwd = None
        for x in range(4):
            wid = getattr(self.df, "B%s" % x)
            self.df.setWidget(wid, state="disabled")
        if self.opt == "A":
            return "sk1"
        if self.opt == "D":
            return "nd"

    def doUsrTyp(self, frt, pag, r, c, p, i, w):
        self.usrtyp = w

    def doNewPwd(self, frt, pag, r, c, p, i, w):
        self.usrpwd = w

    def doCheckPwd(self, frt, pag, r, c, p, i, w):
        if w != self.usrpwd:
            return "Passwords Do Not Agree"
        self.usrpwd = crypt.crypt(w, random.choice(self.saltchrs) +
            random.choice(self.saltchrs))

    def doEnd(self):
        if self.df.pag == 1:
            self.df.selPage("Accounts")
            for x in range(4):
                wid = getattr(self.df, "B%s" % x)
                self.df.setWidget(wid, state="normal")
            self.opts["mf"].updateStatus("Click the Required Option Button")
            self.df.setWidget(self.df.topEntry[2][0], state="disabled")
            return
        if self.opt == "A":
            cmd = ["usermod -p %s %s" % (self.usrpwd, self.usrnam)]
        elif self.opt == "D":
            ask = askQuestion(self.opts["mf"].body, "Remove Directory",
                "Must the User's Home Directory Also be Deleted", default="no")
            if ask == "yes":
                cmd = ["userdel -r %s" % self.usrnam]
            else:
                cmd = ["userdel %s" % self.usrnam]
        elif self.opt == "N":
            cmd = [
                "useradd -g users -m %s -p %s" % (self.usrnam, self.usrpwd)]
            if self.usrtyp == "M":
                cmd.extend([
                    "cp -r /etc/skel/Maildir /home/%s/" % self.usrnam,
                    "maildirmake /home/%s/.maildir" % self.usrnam,
                    "chown -R %s:users /home/%s" % (self.usrnam, self.usrnam),
                    "chmod -R 700 /home/%s/Maildir" % self.usrnam])
        err = self.executeCommand(cmd)
        if err:
            showError(self.opts["mf"].body, "SSH Error", err)
        self.doExit()

    def executeCommand(self, cmd):
        err = ""
        for c in cmd:
            try:
                chan = self.client.get_transport().open_session()
                chan.get_pty()
                try:
                    if self.admnam != "root":
                        chan.exec_command("sudo %s\n" % c)
                        if chan.recv(4096).count("password"):
                            chan.send("%s\n" % self.admpwd)
                    else:
                        chan.exec_command("%s\n" % c)
                except:
                    err = "%s\n%s" % (err,
                        "ERROR: Failed to Run Command %s" % c)
                chan.close()
            except:
                err = "Failed to Open a Channel to the Server"
        return err

    def doExit(self):
        if self.df.pag == 2:
            self.df.clearFrame("T", 2)
            for x in range(4):
                wid = getattr(self.df, "B%s" % x)
                self.df.setWidget(wid, state="normal")
            self.opts["mf"].updateStatus("Click the Required Option Button")
            self.df.setWidget(self.df.topEntry[2][0], state="disabled")
            return
        self.doQuit()

    def doQuit(self):
        if self.client:
            self.client.close()
        self.df.closeProcess()
        self.opts["mf"].closeLoop()
コード例 #25
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)
コード例 #26
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()
コード例 #27
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()
コード例 #28
0
ファイル: cr1010.py プロジェクト: paulmalherbe/Tartan
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()
コード例 #29
0
ファイル: dr2020.py プロジェクト: paulmalherbe/Tartan
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"])
コード例 #30
0
class tb1010(object):
    def __init__(self, **opts):
        self.opts = opts
        self.opts["mf"].dbm.openDbase()
        if self.setVariables():
            self.doProcess()
            self.opts["mf"].startLoop()

    def setVariables(self):
        self.sql = Sql(self.opts["mf"].dbm, ["ftable", "ffield"],
                       prog=self.__class__.__name__)
        if self.sql.error:
            return
        return True

    def doProcess(self):
        fft = {
            "stype":
            "R",
            "tables": ("ftable", ),
            "cols": (("ft_tabl", "", 0, "Table"), ("ft_desc", "", 0,
                                                   "Description", "Y")),
            "where": [("ft_seq", "=", 1)]
        }
        ffl = {
            "stype":
            "R",
            "tables": ("ffield", ),
            "cols": (("ff_seq", "", 0, "Seq"), ("ff_name", "", 0, "Name"),
                     ("ff_desc", "", 0, "Description", "Y"),
                     ("ff_type", "", 0, "Tp"), ("ff_size", "", 0, "Size")),
            "whera": (("T", "ff_tabl", 0, 0), ),
            "index":
            0
        }
        ffi = {
            "stype":
            "R",
            "tables": ("ftable", ),
            "cols":
            (("ft_seq", "", 0, "Seq"), ("ft_type", "", 0,
                                        "T"), ("ft_key0", "", 0, "Column-1"),
             ("ft_key1", "", 0, "Column-2"), ("ft_key2", "", 0, "Column-3"),
             ("ft_key3", "", 0, "Column-4"), ("ft_key4", "", 0, "Column-5"),
             ("ft_key4", "", 0, "Column-6"), ("ft_key4", "", 0, "Column-7")),
            "whera": (("T", "ft_tabl", 0, 0), ),
            "comnd":
            self.doIdxCmd
        }
        typ = {
            "stype": "C",
            "titl": "Select the Required Data Type",
            "head": ("Cd", "Description"),
            "data": dattyp,
            "index": 0
        }
        valtyp = []
        for t in dattyp:
            valtyp.append(t[0])
        self.col = {
            "stype": "C",
            "titl": "Select the Required Column",
            "head": ("Table", "Description"),
            "data": []
        }
        fld = [(("T", 0, 0, 0), "INA", 20, "Table ", "Table Name", "", "Y",
                self.doTable, fft, None, ("notin", ("", "ftable", "ffield"))),
               (("T", 0, 0, 0), "INA", 30, " Description ", "Description", "",
                "N", self.doDesc, None, None, None),
               (("C", 1, 0, 0), "IUI", 3, "Seq", "Column Sequence", "i", "N",
                self.doColSeq, ffl, None, ("between", 0, 999)),
               (("C", 1, 0, 1), "INA", 20, "Column", "Column Name", "", "N",
                None, None, None, ("notblank", )),
               (("C", 1, 0, 2), "INA", 2, "Tp", "Data Type", "", "N", None,
                typ, None, ("in", valtyp)),
               (("C", 1, 0, 3), "IUD", 6.1, "Size", "Field Size", "", "N",
                None, None, None, ("notzero", )),
               (("C", 1, 0, 4), "INA", 30, "Description", "", "", "N", None,
                None, None, None),
               (("C", 1, 0, 5), "INA", 30, "Heading", "Report Heading", "",
                "N", None, None, None, ("notblank", )),
               (("C", 2, 0, 0), "IUI", 1, "S", "Sequence", "i", "N",
                self.doIdxSeq, ffi, None, ("efld", )),
               (("C", 2, 0, 1), "IUA", 1, "T", "Type (U/N)", "", "N", None,
                None, None, ("in", ("U", "N"))),
               (("C", 2, 0, 2), "INA", (14, 20), "Column-0", "", "", "N",
                self.doIdxCol, self.col, None, ("notblank", )),
               (("C", 2, 0, 3), "INA", (14, 20), "Column-1", "", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 4), "INA", (14, 20), "Column-2", "", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 5), "INA", (14, 20), "Column-3", "", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 6), "INA", (14, 20), "Column-4", "", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 7), "INA", (5, 20), "Col-5", "Column-5", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 8), "INA", (5, 20), "Col-6", "Column-6", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 9), "INA", (5, 20), "Col-7", "Column-7", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 10), "INA", (5, 20), "Col-8", "Column-8", "", "N",
                self.doIdxCol, self.col, None, ("efld", )),
               (("C", 2, 0, 11), "INA", (5, 20), "Col-9", "Column-9", "", "N",
                self.doIdxCol, self.col, None, ("efld", ))]
        tag = (("Columns", None, ("C", 1, 1), ("T", 0, 1)),
               ("Indexes", None, ("C", 1, 1), ("T", 0, 1)))
        row = (0, 15, 5)
        tnd = ((self.endTop, "y"), )
        txt = (self.exitTop, )
        cnd = ((None, "n"), (self.endPage1, "y"), (self.endPage2, "y"))
        cxt = (None, self.exitPage1, self.exitPage2)
        but = (("Print", None, self.doPrint, 0, ("T", 0, 2), ("T", 0, 1)),
               ("Cancel", None, self.doRestart, 0, ("T", 0, 2), ("T", 0, 1)))
        self.df = TartanDialog(self.opts["mf"],
                               eflds=fld,
                               tags=tag,
                               rows=row,
                               tend=tnd,
                               txit=txt,
                               cend=cnd,
                               cxit=cxt,
                               butt=but)

    def doTable(self, frt, pag, r, c, p, i, w):
        self.tab = w
        tab = self.sql.getRec("ftable",
                              cols=["ft_tabl", "ft_desc"],
                              where=[("ft_tabl", "=", w), ("ft_seq", "=", 1)],
                              limit=1)
        if not tab:
            self.new = "y"
        else:
            self.new = "n"
            self.df.loadEntry(frt, pag, p + 1, data=tab[1])
            yn = askQuestion(screen=self.opts["mf"].body, head="Table Exists",
                mess="Changing This Record Could Result In Loss of Data, "\
                "Are You Sure You Want to Continue?", default="no")
            if yn == "no":
                return yn

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

    def endTop(self):
        self.fld = makeArray(6, 100, 1, "S")
        self.idx = makeArray(12, 20, 1, "S")
        if self.new == "n":
            fld = self.sql.getRec("ffield",
                                  where=[("ff_tabl", "=", self.tab)],
                                  order="ff_seq")
            for n, f in enumerate(fld):
                self.fld[n] = f[1:]
            idx = self.sql.getRec("ftable",
                                  where=[("ft_tabl", "=", self.tab)],
                                  order="ft_seq")
            for n, f in enumerate(idx):
                self.idx[n] = f[2:]
                self.idx[n][0] = n
            self.doPopulate("fld")
        else:
            self.df.focusField("C", 1, 1)

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

    def doColSeq(self, frt, pag, r, c, p, i, w):
        self.colseq = w
        for n, s in enumerate(self.fld[self.colseq][1:]):
            self.df.loadEntry("C", 1, p + n + 1, data=s)

    def endPage1(self):
        pos = int(self.df.col / self.df.colq[1]) - 1
        self.fld[self.colseq] = copyList(self.df.c_work[1][pos])
        self.doPopulate("fld")

    def exitPage1(self):
        self.createCols()
        self.df.selPage("Indexes")
        self.doPopulate("idx")

    def createCols(self):
        self.valcol = []
        self.col["data"] = []
        for fld in self.fld:
            self.valcol.append(fld[1])
            self.col["data"].append([fld[1], fld[4]])

    def doIdxCmd(self, frt, pag, r, c, p, i, w):
        idxseq = int(w[0]) - 1
        self.doIdxSeq(frt, pag, r, c, p, i, idxseq)
        self.df.focusField(frt, pag, c + 1)

    def doIdxSeq(self, frt, pag, r, c, p, i, w):
        self.idxseq = w
        for n, s in enumerate(self.idx[self.idxseq][1:]):
            self.df.loadEntry("C", 2, p + n + 1, data=s)

    def doIdxCol(self, frt, pag, r, c, p, i, w):
        if w and w not in self.valcol:
            return "Invalid Column"

    def endPage2(self):
        pos = int(self.df.col / self.df.colq[2]) - 1
        self.idx[self.idxseq] = copyList(self.df.c_work[2][pos])
        self.doPopulate("idx")

    def exitPage2(self):
        if self.new == "y" and self.df.col == 1:
            self.df.selPage("Columns")
        else:
            if self.tab in tabdic:
                tabdic[self.tab]["fld"] = []
                tabdic[self.tab]["idx"] = []
            else:
                tabdic[self.tab] = {"fld": [], "idx": []}
            for dat in self.fld:
                if dat == [""] * 6:
                    break
                tabdic[self.tab]["fld"].append(dat)
            for num, dat in enumerate(self.idx):
                if dat == [""] * 12:
                    break
                if num == 0:
                    dat.insert(0, self.df.t_work[0][0][1])
                else:
                    dat.insert(0, "")
                dat[1] = num + 1
                fmt = '"%s",%s,"%s"'
                ddd = dat[:3]
                for n, d in enumerate(dat[3:]):
                    if d:
                        fmt += ',"%s"'
                        ddd.append(d)
                fmt += "\n"
                tabdic[self.tab]["idx"].append(ddd)
            fle = os.path.join(getPrgPath(), "stdtab.py")
            outf = open(fle, "w")
            outf.write("""tabdic = {""")
            tabs = list(tabdic.keys())
            tabs.sort()
            for tab in tabs:
                outf.write("""
    "%s": {""" % tab)
                for key in ("fld", "idx"):
                    outf.write("""
        "%s": [""" % key)
                    for fld in tabdic[tab][key]:
                        outf.write("""
            %s""" % json.dumps(fld))
                        if fld == tabdic[tab][key][-1]:
                            outf.write("""]""")
                        else:
                            outf.write(""",""")
                    if key == "fld":
                        outf.write(""",""")
                outf.write("""}""")
                if tab != tabs[-1]:
                    outf.write(""",""")
            outf.write("""}""")
            outf.close()
            self.doRestart()

    def doPopulate(self, ftyp=None):
        if ftyp == "fld":
            self.df.clearFrame("C", 1)
            for num, dat in enumerate(self.fld):
                if dat == [""] * 6:
                    break
                if num > 14:
                    self.df.scrollScreen(1)
                    pos = 14
                else:
                    pos = num
                self.df.focusField("C", 1, (pos * 6) + 1)
                for n, c in enumerate(dat):
                    self.df.loadEntry("C", 1, (pos * 6) + n, data=c)
            self.df.advanceLine(1)
            return
        self.df.clearFrame("C", 2)
        for num, dat in enumerate(self.idx):
            if dat == [""] * 12:
                break
            if num > 4:
                self.df.scrollScreen(2)
                pos = 4
            else:
                pos = num
            self.df.focusField("C", 2, (pos * 12) + 1)
            for n, c in enumerate(dat):
                self.df.loadEntry("C", 2, (pos * 12) + n, data=c)
            self.df.advanceLine(2)
        self.df.focusField("C", 2, self.df.col)

    def doRestart(self):
        self.df.last[0] = [0, 0]
        self.df.selPage("Columns")
        self.df.focusField("T", 0, 1)

    def doPrint(self):
        state = self.df.disableButtonsTags()
        cols = [["ff_seq", "UI", 3.0, "Seq"],
                ["ff_name", "NA", 20.0, "Field Name"],
                ["ff_type", "NA", 2.0, "Tp"], ["ff_size", "NA", 6.1, "Size"],
                ["ff_desc", "NA", 30.0, "Description"],
                ["ff_head", "NA", 20.0, "Heading"]]
        whr = [("ff_tabl", "=", self.tab)]
        RepPrt(self.opts["mf"],
               name=self.tab + "_fld",
               tables=["ffield"],
               heads=[
                   "Table Fields for Table %s" % self.tab,
               ],
               cols=cols,
               where=whr)
        cols = [["ft_desc", "NA", 30.0, "Table Description"],
                ["ft_seq", "UI", 2.0, "Sq"], ["ft_type", "NA", 1.0, "T"],
                ["ft_key0", "NA", 10.0, "1st-Key"],
                ["ft_key1", "NA", 10.0, "2nd-Key"],
                ["ft_key2", "NA", 10.0, "3rd-Key"],
                ["ft_key3", "NA", 10.0, "4th-Key"],
                ["ft_key4", "NA", 10.0, "5th-Key"],
                ["ft_key5", "NA", 10.0, "6th-Key"],
                ["ft_key6", "NA", 10.0, "7th-Key"],
                ["ft_key7", "NA", 10.0, "8th-Key"],
                ["ft_key8", "NA", 10.0, "9th-Key"],
                ["ft_key9", "NA", 10.0, "10th-Key"]]
        whr = [("ft_tabl", "=", self.tab)]
        RepPrt(self.opts["mf"],
               name=self.tab + "_idx",
               tables=["ftable"],
               heads=[
                   "Table Keys for Table %s" % self.tab,
               ],
               cols=cols,
               where=whr)
        self.df.enableButtonsTags(state=state)
        self.df.focusField(self.df.frt, self.df.pag, self.df.col)