diff --git a/home/page/event_updates/event_updates.py b/home/page/event_updates/event_updates.py
index 6e811e756b5..85a121b2060 100644
--- a/home/page/event_updates/event_updates.py
+++ b/home/page/event_updates/event_updates.py
@@ -56,7 +56,9 @@ def get_setup_status():
percent = 20
ret = []
- if not webnotes.conn.get_value('Personalize', None, 'header_html'):
+ header = webnotes.conn.get_value('Control Panel', None, 'client_name') or ''
+ if header.startswith('
'\
+ +webnotes.conn.get_value('Control Panel', None, 'company_name')):
ret.append('
Upload your company banner')
else:
percent += 20
diff --git a/home/page/my_company/my_company.js b/home/page/my_company/my_company.js
index 08506076440..c2a55eab03c 100644
--- a/home/page/my_company/my_company.js
+++ b/home/page/my_company/my_company.js
@@ -134,24 +134,28 @@ MemberList.prototype.make_search = function() {
MemberList.prototype.make_list = function() {
var me = this;
this.lst_area = $a(this.list_wrapper, 'div');
- this.lst = new Listing('Profiles',1);
- this.lst.colwidths = ['100%'];
- this.lst.opts.cell_style = {padding:'0px'}
- this.lst.get_query = function() {
- var c1 = '';
- if(me.search_inp.value && me.search_inp.value != 'Search') {
- var c1 = repl(' AND (first_name LIKE "%(txt)s" OR last_name LIKE "%(txt)s" OR name LIKE "%(txt)s")', {txt:'%' + me.search_inp.value + '%'});
+
+ this.lst = new wn.widgets.Listing({
+ parent: this.lst_area,
+ as_dict: 1,
+ get_query: function() {
+ var c1 = '';
+ if(me.search_inp.value && me.search_inp.value != 'Search') {
+ var c1 = repl(' AND (first_name LIKE "%(txt)s" OR last_name LIKE "%(txt)s" OR name LIKE "%(txt)s")', {txt:'%' + me.search_inp.value + '%'});
+ }
+
+ return repl("SELECT name, \
+ ifnull(concat_ws(' ', first_name, last_name),'') as full_name, \
+ gender, file_list, enabled \
+ FROM tabProfile \
+ WHERE docstatus != 2 \
+ AND name not in ('Guest','Administrator') %(cond)s \
+ ORDER BY name asc",{cond:c1});
+ },
+ render_row: function(parent, data) {
+ me.member_items[data.name] = new MemberItem(parent, data, me);
}
-
- this.query = repl("SELECT distinct ifnull(name,''), ifnull(concat_ws(' ', first_name, last_name),''), \
- ifnull(messanger_status,''), ifnull(gender,''), ifnull(file_list,''), 0, enabled, last_login \
- from tabProfile where docstatus != 2 AND name not in ('Guest','Administrator') %(cond)s \
- ORDER BY name asc",{cond:c1});
- }
- this.lst.make(this.lst_area);
- this.lst.show_cell= function(cell, ri, ci, d) {
- me.member_items[d[ri][0]] = new MemberItem(cell, d[ri], me);
- }
+ });
this.lst.run();
}
@@ -186,14 +190,14 @@ MemberItem = function(parent, det, mlist) {
var me = this;
this.det = det;
this.wrapper = $a(parent, 'div');
- this.enabled = det[6];
+ this.enabled = det.enabled;
this.tab = make_table(this.wrapper, 1,2,'100%', ['20%', '70%'], {padding:'4px', overflow:'hidden'});
$y(this.tab, {tableLayout:'fixed', borderCollapse:'collapse'})
this.is_online = function() {
for(var i=0;i
'+ msg + ' ';
+}
+
+//Create salary slip
+//-----------------------
+cur_frm.cscript['Create Salary Slip'] = function(doc, cdt, cdn) {
+ var callback = function(r, rt){
+ if (r.message)
+ display_activity_log(r.message);
+ }
+ $c('runserverobj', args={'method':'create_sal_slip','docs':compress_doclist(make_doclist (cdt, cdn))},callback);
+}
+
+
+
+//Submit salary slip
+//-----------------------
+cur_frm.cscript['Submit Salary Slip'] = function(doc, cdt, cdn) {
+ var check = confirm("Do you really want to Submit all Salary Slip for month : " + doc.month+" and fiscal year : "+doc.fiscal_year);
+ if(check){
+ var callback = function(r, rt){
+ if (r.message)
+ display_activity_log(r.message);
+ }
+ $c('runserverobj', args={'method':'submit_salary_slip','docs':compress_doclist(make_doclist (cdt, cdn))},callback);
+ }
+}
+
+// Make Bank Voucher
+//-----------------------
+cur_frm.cscript['Make Bank Voucher'] = function(doc,cdt,cdn){
+ if(doc.month && doc.fiscal_year){
+ cur_frm.cscript.make_jv(doc, cdt, cdn);
+ }
+}
+
+
+// Make JV
+//-----------------------
+cur_frm.cscript.make_jv = function(doc, dt, dn) {
+ var call_back = function(r,rt){
+ var jv = LocalDB.create('Journal Voucher');
+ jv = locals['Journal Voucher'][jv];
+ jv.voucher_type = 'Bank Voucher';
+ jv.user_remark = 'Payment of salary for the month: ' + doc.month + 'and fiscal year: ' + doc.fiscal_year;
+ jv.fiscal_year = doc.fiscal_year;
+ jv.company = doc.company;
+ jv.posting_date = dateutil.obj_to_str(new Date());
+
+ // credit to bank
+ var d1 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries');
+ d1.account = r.message['default_bank_account'];
+ d1.credit = r.message['amount']
+
+ // debit to salary account
+ var d2 = LocalDB.add_child(jv, 'Journal Voucher Detail', 'entries');
+ d2.account = r.message['default_salary_account'];
+ d2.debit = r.message['amount']
+
+ loaddoc('Journal Voucher', jv.name);
+ }
+ $c_obj(make_doclist(dt,dn),'get_acc_details','',call_back);
+}
diff --git a/hr/doctype/salary_manager/salary_manager.py b/hr/doctype/salary_manager/salary_manager.py
new file mode 100644
index 00000000000..ec8fba271a7
--- /dev/null
+++ b/hr/doctype/salary_manager/salary_manager.py
@@ -0,0 +1,164 @@
+# Please edit this list and import only required elements
+import webnotes
+
+from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
+from webnotes.model import db_exists
+from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
+from webnotes.model.doclist import getlist, copy_doclist
+from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
+from webnotes import session, form, is_testing, msgprint, errprint
+
+set = webnotes.conn.set
+sql = webnotes.conn.sql
+get_value = webnotes.conn.get_value
+in_transaction = webnotes.conn.in_transaction
+convert_to_lists = webnotes.conn.convert_to_lists
+
+# -----------------------------------------------------------------------------------------
+
+
+class DocType:
+ def __init__(self, doc, doclist):
+ self.doc = doc
+ self.doclist = doclist
+
+
+ def get_emp_list(self):
+ """
+ Returns list of active employees based on selected criteria
+ and for which salary structure exists
+ """
+
+ cond = self.get_filter_condition()
+
+ emp_list = sql("""
+ select t1.name
+ from `tabEmployee` t1, `tabSalary Structure` t2
+ where t1.docstatus!=2 and t2.docstatus != 2
+ and ifnull(t1.status, 'Left') = 'Active' and ifnull(t2.is_active, 'No') = 'Yes'
+ and t1.name = t2.employee
+ %s """% cond)
+
+ return emp_list
+
+
+ def get_filter_condition(self):
+ self.check_mandatory()
+
+ cond = ''
+ for f in ['company', 'branch', 'department', 'designation', 'grade', 'employment_type']:
+ if self.doc.fields.get(f):
+ cond += " and t1." + f + " = '" + self.doc.fields.get(f) + "'"
+
+ return cond
+
+
+ def check_mandatory(self):
+ for f in ['company', 'month', 'fiscal_year']:
+ if not self.doc.fields[f]:
+ msgprint("Please select %s to proceed" % f, raise_exception=1)
+
+
+ def create_sal_slip(self):
+ """
+ Creates salary slip for selected employees if already not created
+
+ """
+
+ emp_list = self.get_emp_list()
+ log = ""
+ if emp_list:
+ log = "