Example #1
0
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.panel_item_left        = wx.Panel(self, -1)
        self.panel_qnty             = wx.Panel(self.panel_item_left, -1)
        self.button_delete          = wx.BitmapButton(self.panel_qnty, -1, wx.Bitmap(".\\images\\16\\New folder\\editorLine.gif", wx.BITMAP_TYPE_ANY))
        self.num_ctrl_qnty          = NumCtrl(self.panel_qnty, -1, 1)
        self.combo_box_account      = P_Choice(self.panel_qnty, -1)
        self.label_save_as_item     = wx.StaticText(self.panel_item_left, -1, "-")
        self.text_ctrl_description  = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.TE_LINEWRAP | wx.TE_READONLY)
        self.panel_item_total       = wx.Panel(self, -1)
        self.num_ctrl_price         = NumCtrl(self.panel_item_total, -1,  style = wx.TE_READONLY)
        self.combo_box_tax          = wx.ComboBox(self.panel_item_total, -1, choices=[], style=wx.CB_DROPDOWN)
        
        self.panel_spc1             = wx.StaticText(self, -1, ' ')
        
        self.panel_total            = wx.Panel(self, -1)
        self.num_ctrl_total         = NumCtrl( self.panel_total, -1, style = wx.TE_READONLY)
        self.combo_box_pay_method   = wx.Choice(self.panel_total, -1, choices=[])#= wx.Panel(self, -1)

        self.__set_properties()
        self.__do_layout()
        self.Layout()
        
        self.Bind(wx.EVT_TEXT_ENTER, self.qntyUpdated, self.num_ctrl_qnty)
        
        self.Bind(wx.EVT_BUTTON,   self.OnRemove,    self.button_delete)
        self.Bind(wx.EVT_COMBOBOX, self.OnAccount,   self.combo_box_account)
        self.Bind(wx.EVT_COMBOBOX, self.OnTax,       self.combo_box_tax)
        self.Bind(wx.EVT_TEXT,     self.qntyUpdated, self.num_ctrl_qnty)
        self.Bind(wx.EVT_TEXT,     self.updateTotal, self.num_ctrl_price)
        
        self.__do_main()
Example #2
0
class PanelInvoiceItem(wx.Panel):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.panel_item_left        = wx.Panel(self, -1)
        self.panel_qnty             = wx.Panel(self.panel_item_left, -1)
        self.button_delete          = wx.BitmapButton(self.panel_qnty, -1, wx.Bitmap(".\\images\\16\\New folder\\editorLine.gif", wx.BITMAP_TYPE_ANY))
        self.num_ctrl_qnty          = NumCtrl(self.panel_qnty, -1, 1)
        self.combo_box_account      = P_Choice(self.panel_qnty, -1)
        self.label_save_as_item     = wx.StaticText(self.panel_item_left, -1, "-")
        self.text_ctrl_description  = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.TE_LINEWRAP | wx.TE_READONLY)
        self.panel_item_total       = wx.Panel(self, -1)
        self.num_ctrl_price         = NumCtrl(self.panel_item_total, -1,  style = wx.TE_READONLY)
        self.combo_box_tax          = wx.ComboBox(self.panel_item_total, -1, choices=[], style=wx.CB_DROPDOWN)
        
        self.panel_spc1             = wx.StaticText(self, -1, ' ')
        
        self.panel_total            = wx.Panel(self, -1)
        self.num_ctrl_total         = NumCtrl( self.panel_total, -1, style = wx.TE_READONLY)
        self.combo_box_pay_method   = wx.Choice(self.panel_total, -1, choices=[])#= wx.Panel(self, -1)

        self.__set_properties()
        self.__do_layout()
        self.Layout()
        
        self.Bind(wx.EVT_TEXT_ENTER, self.qntyUpdated, self.num_ctrl_qnty)
        
        self.Bind(wx.EVT_BUTTON,   self.OnRemove,    self.button_delete)
        self.Bind(wx.EVT_COMBOBOX, self.OnAccount,   self.combo_box_account)
        self.Bind(wx.EVT_COMBOBOX, self.OnTax,       self.combo_box_tax)
        self.Bind(wx.EVT_TEXT,     self.qntyUpdated, self.num_ctrl_qnty)
        self.Bind(wx.EVT_TEXT,     self.updateTotal, self.num_ctrl_price)
        
        self.__do_main()
        
    
    def __set_properties(self):
        self.button_delete.SetSize(self.button_delete.GetBestSize())
        self.num_ctrl_qnty.SetMinSize( (50, -1))
        self.combo_box_account.SetMinSize((120, 21))
        self.label_save_as_item.SetFont(wx.Font(7, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
        self.text_ctrl_description.SetMinSize((300, 45))
        self.num_ctrl_price.SetMinSize((120, 21))
        self.combo_box_tax.SetMinSize(  (120, 21))
        self.num_ctrl_total.SetMinSize((120, -1))
        self.num_ctrl_qnty.SetMin(1)

    def __do_layout(self):       
        sizer_qnty       = wx.BoxSizer(wx.HORIZONTAL)
        sizer_item_qnty  = wx.BoxSizer(wx.VERTICAL)
        sizer_item_price = wx.BoxSizer(wx.VERTICAL)
        sizer_item       = wx.BoxSizer(wx.HORIZONTAL)
        sizer_total      = wx.BoxSizer(wx.VERTICAL)
        
        sizer_qnty.Add(self.button_delete, 0, wx.LEFT, 5)
        sizer_qnty.Add(self.num_ctrl_qnty,      0, wx.LEFT, 5)
        sizer_qnty.Add(self.combo_box_account,  0, wx.LEFT, 5)
        self.panel_qnty.SetSizer(sizer_qnty)
        
        sizer_item_qnty.Add(self.panel_qnty,         0, wx.EXPAND, 0)
        sizer_item_qnty.Add(self.label_save_as_item, 0, 0, 0)
        self.panel_item_left.SetSizer(sizer_item_qnty)
        
        sizer_item_price.Add(self.num_ctrl_price, 0, wx.BOTTOM, 5)
        sizer_item_price.Add(self.combo_box_tax,   0, 0, 0)
        self.panel_item_total.SetSizer(sizer_item_price)
        
        sizer_total.Add(self.num_ctrl_total,       0, 0, 0)
        sizer_total.Add(self.combo_box_pay_method, 0, wx.EXPAND, 0)
        self.panel_total.SetSizer(sizer_total)
        
        sizer_item.Add(self.panel_item_left,       0, wx.EXPAND, 0)
        sizer_item.Add(self.text_ctrl_description, 0, wx.LEFT | wx.RIGHT, 10)
        sizer_item.Add(self.panel_item_total,      0, wx.EXPAND, 0)
        sizer_item.Add(self.panel_spc1,            1, wx.EXPAND, 0)
        sizer_item.Add(self.panel_total,        1, wx.ALIGN_RIGHT | wx.RIGHT, 5)
        self.SetSizer(sizer_item)
        
    def __do_main(self):
        #rint' do main'
        
        methods = {1:'Cash', 2:'Mandiri'}
        for key in methods:
            self.combo_box_pay_method.Append(methods[key], key)
        self.combo_box_pay_method.Select(0)
        self.combo_box_tax.Select(1)
        self.product_id = 0
        
        loadCmb.tax(self.combo_box_tax)

        sql ="SELECT id, name \
                FROM acc_accounts \
               WHERE %d <= closed_yr" % gVar.schYr
        self.combo_box_account.initChoices(sql, 'New Account', DlgNewEditAccount)
    
    
    def qntyUpdated(self,evt):
        qnty = self.num_ctrl_qnty.GetValue()

        if qnty <1: self.num_ctrl_qnty.SetValue(1)
        
        if self.Monthly:
            self.doMonthly(qnty)

        self.updateTotal(evt)
        
    def doMonthly(self, qnty):
        self.monthTo = self.monthFrom + qnty -1

        if self.monthTo > 12:
            self.num_ctrl_qnty.SetValue(1)
            self.monthTo = self.monthFrom + 1
            
        MonthFrom = gVar.monthNames[self.monthFrom]
        description, price = fetch.product_details(self.product_id)
        
        if qnty == 1:
            description = "%s : %s" % (description, MonthFrom)
        else:
            MonthTo = gVar.monthNames[self.monthTo]
            description = "%s : %s to %s" % (description, MonthFrom, MonthTo)
            
        self.text_ctrl_description.SetValue(description) 
        
    def isMonthly(self, iid):
        sql = "SELECT * \
                 FROM acc_products \
                WHERE id = %d \
                  AND recurring_monthly = 1" % iid
        
        if fetch.getCount(sql)>0:
            self.Monthly = True
        else:
            self.Monthly = False
            
        return self.Monthly
        
    def handle_keypress(self, event):
        keycode = event.GetKeyCode()
        if keycode < 255:
            if chr(keycode).isalnum():# Valid alphanumeric character
                event.Skip()
                
    def displayData(self, iid, student_id):
        #rint'displayData', iid, student_id
        
        self.product_id = iid
        
        description, price = fetch.product_details(iid)
        
        self.student_id = student_id
        NoInduk = fetch.NoInduk(student_id, gVar.schYr)
        
        if self.isMonthly(iid):
            
            monthFrom = self.getMonthFrom()
            #rint'gVar.monthNames[monthFrom]', gVar.monthNames[monthFrom]
            description += ' : ' + gVar.monthNames[monthFrom]
                
        self.text_ctrl_description.SetValue(description)
            
        #self.num_ctrl_qnty.SetValue(1)
        #rint'price', price
        self.num_ctrl_price.SetValue(price)
    
    def getMonthFrom(self, ):
        sql = "SELECT MAX(ii.month_from) AS monthFrom, \
                      MAX(ii.month_to)   AS monthTo \
                     FROM acc_invoices i \
                     JOIN acc_invoice_items ii ON i.id = ii.invoice_id \
                    WHERE ii.product_id = %d \
                      AND i.student_id ='%s' \
                      AND i.schYr = %d " % (1, self.student_id, gVar.schYr)
            
        res = fetch.getOneDict(sql)
        #rintsql, res
        if res:
            monthFrom = res['monthFrom']
            monthTo   = res['monthTo']
            
            if monthTo: self.monthFrom = monthTo + 1
            else:       self.monthFrom = monthFrom + 1
            
        else:
            self.monthFrom = 1
        
        return self.monthFrom
            
                
    def OnRemove(self, event):
        self.GetGrandParent().removeMe(self)
        self.GetTopLevelParent().onAdd()

    def OnAccount(self, event):
        self.updateTotal()

    def OnTax(self, event):  
        self.updateTotal()
        
    def getData(self):
        description = self.text_ctrl_description.GetValue()
        qnty    = self.num_ctrl_qnty.GetValue()
        price   = self.num_ctrl_price.GetValue()
        account = self.combo_box_account.GetID()
        taxCode = fetch.cmbID(self.combo_box_tax)
        net     = qnty*price
        
        return (qnty, description, price,  taxCode, net, account)
    
    def updateTotal(self, evt=0):
        qnty, description, price, units, taxCode, net = self.getData()

        if taxCode == "Tax Included": tax = 0.10
        else: tax =0
        
        grose = price*qnty
        net   = grose - grose*tax
        
        net = ("{:,.0f}".format(net))
        self.num_ctrl_total.SetValue(net)
        
        self.Layout()
        pub.sendMessage('update.invTotal')