diff --git a/netforce_clinic/actions/clinic_hd_case.xml b/netforce_clinic/actions/clinic_hd_case.xml
index 2dbf99f..04b3628 100644
--- a/netforce_clinic/actions/clinic_hd_case.xml
+++ b/netforce_clinic/actions/clinic_hd_case.xml
@@ -2,7 +2,6 @@
HD Cases
multi_view
clinic.hd.case
-
[
["All",[]],["Draft",[["state","=","draft"]]],
["Waiting Treatment",[["state","=","waiting_treatment"]]],
diff --git a/netforce_clinic/actions/clinic_labor_cost_entry.xml b/netforce_clinic/actions/clinic_labor_cost_entry.xml
new file mode 100644
index 0000000..33012b3
--- /dev/null
+++ b/netforce_clinic/actions/clinic_labor_cost_entry.xml
@@ -0,0 +1,7 @@
+
+ Labor Cost Entries
+ multi_view
+ clinic.labor.cost.entry
+ account_menu
+ [["All",[]],["Draft",[["state","=","draft"]]],["Approved",[["state","=","approved"]]]]
+
diff --git a/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml b/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml
new file mode 100644
index 0000000..4d9be96
--- /dev/null
+++ b/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml
@@ -0,0 +1,41 @@
+
diff --git a/netforce_clinic/layouts/clinic_labor_cost_entry_list.xml b/netforce_clinic/layouts/clinic_labor_cost_entry_list.xml
new file mode 100644
index 0000000..0c1016f
--- /dev/null
+++ b/netforce_clinic/layouts/clinic_labor_cost_entry_list.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/netforce_clinic/layouts/clinic_labor_cost_form.xml b/netforce_clinic/layouts/clinic_labor_cost_form.xml
index 866b00e..fe08ebe 100644
--- a/netforce_clinic/layouts/clinic_labor_cost_form.xml
+++ b/netforce_clinic/layouts/clinic_labor_cost_form.xml
@@ -33,7 +33,7 @@
-
+
diff --git a/netforce_clinic/layouts/clinic_labor_cost_list.xml b/netforce_clinic/layouts/clinic_labor_cost_list.xml
index 09ddfb1..c02aeab 100644
--- a/netforce_clinic/layouts/clinic_labor_cost_list.xml
+++ b/netforce_clinic/layouts/clinic_labor_cost_list.xml
@@ -1,3 +1,4 @@
-
+
+
diff --git a/netforce_clinic/layouts/clinic_menu.xml b/netforce_clinic/layouts/clinic_menu.xml
index e012c29..3988e8d 100644
--- a/netforce_clinic/layouts/clinic_menu.xml
+++ b/netforce_clinic/layouts/clinic_menu.xml
@@ -28,8 +28,6 @@
-
-
-
-
diff --git a/netforce_clinic/layouts/clinic_menu_inherit.xml b/netforce_clinic/layouts/clinic_menu_inherit.xml
index bb71e57..3c405e1 100644
--- a/netforce_clinic/layouts/clinic_menu_inherit.xml
+++ b/netforce_clinic/layouts/clinic_menu_inherit.xml
@@ -3,6 +3,7 @@
-
+
diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py
index e808f08..9872a4f 100644
--- a/netforce_clinic/models/__init__.py
+++ b/netforce_clinic/models/__init__.py
@@ -76,3 +76,5 @@ from . import labor_cost
from . import labor_cost_formular
from . import labor_cost_line
from . import labor_cost_staff
+from . import labor_cost_entry
+from . import labor_cost_entry_line
diff --git a/netforce_clinic/models/labor_cost.py b/netforce_clinic/models/labor_cost.py
index e77ddec..cfc95e0 100644
--- a/netforce_clinic/models/labor_cost.py
+++ b/netforce_clinic/models/labor_cost.py
@@ -1,9 +1,11 @@
from netforce.model import Model, fields, get_model
from netforce.utils import get_data_path
+from netforce.access import get_active_company
class LaborCost(Model):
_name="clinic.labor.cost"
_string="Labor Cost"
+ _multi_company=True
_name_field="cycle_item_id"
_key=['cycle_item_id']
@@ -57,8 +59,14 @@ class LaborCost(Model):
"formulars": fields.One2Many("clinic.labor.cost.formular", "labor_cost_id", "Formulars"),
"staffs": fields.One2Many("clinic.labor.cost.staff", "labor_cost_id", "Staffs"),
"lines": fields.One2Many("clinic.labor.cost.line", "labor_cost_id", "Lines"),
+ 'company_id': fields.Many2One("company","Company"),
}
+ _defaults={
+ 'company_id': lambda *a: get_active_company(),
+ }
+
+
def compute(self,ids,context={}):
obj=self.browse(ids)[0]
if not obj.manual:
diff --git a/netforce_clinic/models/labor_cost_entry.py b/netforce_clinic/models/labor_cost_entry.py
new file mode 100644
index 0000000..07303ce
--- /dev/null
+++ b/netforce_clinic/models/labor_cost_entry.py
@@ -0,0 +1,124 @@
+import time
+
+from netforce.model import Model, fields, get_model
+from netforce.database import get_connection
+from netforce.access import get_active_user, get_active_company
+from netforce.utils import get_data_path
+
+from . import utils
+
+class LaborCostEntry(Model):
+ _name="clinic.labor.cost.entry"
+ _string="Labor Cost Entry"
+ _multi_company=True
+ _key=['name']
+
+ def _get_all(self,ids,context={}):
+ res={}
+ for obj in self.browse(ids):
+ total_amt=0.0
+ total_qty=0
+ for line in obj.lines:
+ total_qty+=line.qty or 0
+ total_amt+=line.amount or 0.0
+ res[obj.id]={
+ 'total_amt':total_amt,
+ 'total_qty': total_qty,
+ }
+ return res
+
+ _fields={
+ 'name': fields.Char("Name", search=True),
+ 'date': fields.Date("Month",required=True),
+ 'total_amt': fields.Float("Total", function="_get_all",function_multi=True),
+ 'total_qty': fields.Float("Total Qty", function="_get_all",function_multi=True),
+ "lines": fields.One2Many("clinic.labor.cost.entry.line", "entry_id", "Lines"),
+ 'state': fields.Selection([['draft','Draft'],['approved','Approved']],"State"),
+ 'user_id': fields.Many2One("base.user","Approver"),
+ 'note': fields.Text("Note"),
+ 'company_id': fields.Many2One("company","Company"),
+ }
+
+ _defaults={
+ 'state': 'draft',
+ 'date': lambda *a: time.strftime("%Y-%m-%d"),
+ 'user_id': lambda *a: get_active_user(),
+ 'company_id': lambda *a: get_active_company(),
+ }
+
+ def compute(self,ids,context={}):
+ obj=self.browse(ids)[0]
+ year,month,day=obj.date.split("-")
+ db=get_connection()
+ line_ids=[r['id'] for r in db.query("select id from clinic_labor_cost_line where extract(month from date)=%s",int(month))]
+ staffs={}
+ for line in get_model("clinic.labor.cost.line").browse(line_ids):
+ staff=line.staff_id
+ qty=line.qty
+ amt=line.amount
+ if not staffs.get(staff.id):
+ staffs[staff.id]={
+ 'qty': 0,
+ 'amt': 0,
+ 'rate': 0, # XXX for special nurse
+ }
+ staffs[staff.id]['qty']+=qty
+ staffs[staff.id]['amt']+=amt
+
+ lines=[]
+ timenow=time.strftime("%Y-%m-%d")
+ for staff_id, vals in staffs.items():
+ lines.append(('create',{
+ 'staff_id': staff_id,
+ 'qty': vals['qty'] or 0,
+ 'amount': vals['amt'] or 0.0,
+ 'date': timenow,
+ 'rate': vals['amt'],
+ }))
+
+ for line in obj.lines:
+ line.delete()
+
+ obj.write({
+ 'lines': lines,
+ })
+
+ return {
+ 'next': {
+ 'name': 'clinic_labor_cost_entry',
+ 'mode': 'form',
+ 'active_id': obj.id,
+ },
+ 'flash': 'Compute Succesffuly',
+ }
+
+ def create(self,vals,**kw):
+ vals['name']=utils.date2thai(vals['date'],format='%(BY)s/%(m)s')
+ new_id=super().create(vals,**kw)
+ return new_id
+
+ def write(self,ids,vals,**kw):
+ if 'date' in vals.keys():
+ vals['name']=utils.date2thai(vals['date'],format='%(BY)s/%(m)s')
+ else:
+ obj=self.browse(ids)[0]
+ vals['name']=utils.date2thai(obj.date,format='%(BY)s/%(m)s')
+ super().write(ids,vals,**kw)
+
+ def onchange_line(self,context={}):
+ data=context['data']
+ path=context['path']
+ line=get_data_path(data,path,parent=True)
+ line['amount']=(line['qty'] or 0) * (line['rate'] or 0.0)
+ data=self.update_amount(context)
+ return data
+
+ def update_amount(self,context={}):
+ data=context['data']
+ total_amt=0.0
+ for line in data['lines']:
+ total_amt+=line['amount']
+ data['total_amt']=total_amt
+ return data
+
+LaborCostEntry.register()
diff --git a/netforce_clinic/models/labor_cost_entry_line.py b/netforce_clinic/models/labor_cost_entry_line.py
new file mode 100644
index 0000000..d0d9d0f
--- /dev/null
+++ b/netforce_clinic/models/labor_cost_entry_line.py
@@ -0,0 +1,27 @@
+import time
+
+from netforce.model import Model, fields, get_model
+from netforce.utils import get_data_path
+from netforce.access import get_active_company
+
+class LaborCostEntryLine(Model):
+ _name="clinic.labor.cost.entry.line"
+ _string="Labor Cost Entry Line"
+ _multi_company=True
+
+ _fields={
+ 'entry_id': fields.Many2One("clinic.labor.cost.entry","Entry",required=True),
+ 'date': fields.Date("Date"),
+ 'staff_id': fields.Many2One("clinic.staff","Staff"),
+ 'qty': fields.Integer("Qty"),
+ 'rate': fields.Float("Rate"),
+ 'amount': fields.Float("Amount"),
+ 'company_id': fields.Many2One("company","Company"),
+ }
+
+ _defaults={
+ 'date': lambda *a: time.strftime("%Y-%m-%d"),
+ 'company_id': lambda *a: get_active_company(),
+ }
+
+LaborCostEntryLine.register()
diff --git a/netforce_clinic/todo.txt b/netforce_clinic/todo.txt
index c87f331..55b5e11 100644
--- a/netforce_clinic/todo.txt
+++ b/netforce_clinic/todo.txt
@@ -2,7 +2,8 @@
urgent
- report Matching Payment
- special cost
- -
+ - labor cost in period
+
============
-- tonight -
- matching