From 6c9f04177124c7e2168935521a2e00273353312e Mon Sep 17 00:00:00 2001 From: "watcha.h" Date: Fri, 21 Aug 2015 15:15:53 +0700 Subject: [PATCH] rematching 40% --- .../actions/clinic_payment_matching.xml | 8 ++ .../layouts/clinic_account_menu.xml | 5 +- .../layouts/clinic_document_form.xml | 5 + .../layouts/clinic_payment_matching.xml | 15 +++ netforce_clinic/layouts/clinic_prod_form.xml | 6 +- netforce_clinic/models/__init__.py | 2 + netforce_clinic/models/document.py | 10 ++ netforce_clinic/models/payment_matching.py | 108 ++++++++++++++++++ netforce_clinic/readme.txt | 8 +- netforce_clinic/reports/payment_matching.xlsx | Bin 0 -> 190059 bytes .../templates/payment_matching.hbs | 38 ++++++ 11 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 netforce_clinic/actions/clinic_payment_matching.xml create mode 100644 netforce_clinic/layouts/clinic_document_form.xml create mode 100644 netforce_clinic/layouts/clinic_payment_matching.xml create mode 100644 netforce_clinic/models/document.py create mode 100644 netforce_clinic/models/payment_matching.py create mode 100644 netforce_clinic/reports/payment_matching.xlsx create mode 100644 netforce_clinic/templates/payment_matching.hbs diff --git a/netforce_clinic/actions/clinic_payment_matching.xml b/netforce_clinic/actions/clinic_payment_matching.xml new file mode 100644 index 0000000..fd2e0ee --- /dev/null +++ b/netforce_clinic/actions/clinic_payment_matching.xml @@ -0,0 +1,8 @@ + + Payment Matching + report + clinic.payment.matching + payment_matching + payment_matching + account_menu + diff --git a/netforce_clinic/layouts/clinic_account_menu.xml b/netforce_clinic/layouts/clinic_account_menu.xml index c6ed01b..6bc6bdd 100644 --- a/netforce_clinic/layouts/clinic_account_menu.xml +++ b/netforce_clinic/layouts/clinic_account_menu.xml @@ -1,6 +1,6 @@ - + @@ -18,6 +18,9 @@ + + + diff --git a/netforce_clinic/layouts/clinic_document_form.xml b/netforce_clinic/layouts/clinic_document_form.xml new file mode 100644 index 0000000..8854b3c --- /dev/null +++ b/netforce_clinic/layouts/clinic_document_form.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/netforce_clinic/layouts/clinic_payment_matching.xml b/netforce_clinic/layouts/clinic_payment_matching.xml new file mode 100644 index 0000000..918a0f4 --- /dev/null +++ b/netforce_clinic/layouts/clinic_payment_matching.xml @@ -0,0 +1,15 @@ +
+ + + + + + + + + + + + + + diff --git a/netforce_clinic/layouts/clinic_prod_form.xml b/netforce_clinic/layouts/clinic_prod_form.xml index 9f58722..01800df 100644 --- a/netforce_clinic/layouts/clinic_prod_form.xml +++ b/netforce_clinic/layouts/clinic_prod_form.xml @@ -1,8 +1,8 @@ - + - + @@ -10,7 +10,7 @@ - + diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index e9f6029..a12468c 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -142,3 +142,5 @@ from . import conv_bal from . import conv_sale_invoice from . import account_move_line from . import invoice_payment +from . import document +from . import payment_matching diff --git a/netforce_clinic/models/document.py b/netforce_clinic/models/document.py new file mode 100644 index 0000000..3859784 --- /dev/null +++ b/netforce_clinic/models/document.py @@ -0,0 +1,10 @@ +from netforce.model import Model,fields + +class Document(Model): + _inherit="document" + + _fields={ + 'name': fields.Char("Name",search=True), + } + +Document.register() diff --git a/netforce_clinic/models/payment_matching.py b/netforce_clinic/models/payment_matching.py new file mode 100644 index 0000000..0484a58 --- /dev/null +++ b/netforce_clinic/models/payment_matching.py @@ -0,0 +1,108 @@ +import time +from calendar import monthrange + +from netforce.model import Model, fields, get_model + +class PaymentMatching(Model): + _name="clinic.payment.matching" + _string="Payment Matching" + _transient=True + + + _fields={ + 'name': fields.Char("Name"), + "date": fields.Date("Month"), + "date_from": fields.Date("From", required=True), + "date_to": fields.Date("To", required=True), + 'file_id': fields.Many2One('document','File',domain=[['categ_id.code','=','MP']]), + "period_id": fields.Many2One("clinic.period.line","Period"), + 'department_id': fields.Many2One("clinic.department","Department"), + 'branch_id': fields.Many2One("clinic.branch","Branch"), + "inv_state": fields.Selection([("draft","Draft"),("waiting_approval","Waiting Approval"),("waiting_payment","Waiting Payment"),("paid","Paid"),("voided","Voided")],"Status"), + "view_type": fields.Selection([("invoice","Invoice"),("file","File")],"View Type"), + } + + def _get_date_from(self,context={}): + year,month,day=time.strftime("%Y-%m-%d").split("-") + return '%s-%s-%s'%(year,month,day) + + def _get_date_to(self,context={}): + year,month,day=time.strftime("%Y-%m-%d").split("-") + weekday, total_day=monthrange(int(year), int(month)) + return "%s-%s-%s"%(year,month,day) + + def default_get(self,field_names=None,context={},**kw): + defaults=context.get("defaults",{}) + date_from=defaults.get("date_from", self._get_date_from()) + date_to=defaults.get("date_to", self._get_date_to()) + yearnow=date_from.split("-")[0] + for period in get_model('clinic.period').search_browse([['name','=',yearnow]]): + for line in period.lines: + if line.state=='open': + period_id=line.id + date_from=line.date_start + date_to=line.date_stop + break + res={ + 'period_id': period_id, + 'date': time.strftime("%Y-%m-%d"), + 'date_from': date_from, + 'date_to': date_to, + 'inv_state': 'waiting_payment', + 'view_type': 'invoice', + } + return res + + def onchange_period(self,context={}): + data=context['data'] + period_id=data['period_id'] + period=get_model('clinic.period.line').browse(period_id) + data['date_from']=period.date_start + data['date_to']=period.date_stop + return data + + def get_report_data(self,ids,context={}): + defaults=self.default_get(context=context) + print('defaults ', defaults) + date_from=defaults.get('date_from') + date_to=defaults.get('date_to') + branch_id=None + department_id=None + inv_state=defaults.get('inv_state') + view_type=defaults.get('view_type') + if ids: + obj=self.browse(ids)[0] + date_from=obj.date_from + date_to=obj.date_to + branch_id=obj.branch_id.id + department_id=obj.department_id.id + inv_state=obj.inv_state + view_type=obj.view_type + lines=[] + dom=[ + ['date','>=',date_from], + ['date','<=',date_to], + ['state','=',inv_state], + ] + if branch_id and not department_id: + dom.append(['department_id.branch_id','=',branch_id]) + elif department_id: + dom.append(['department_id','=',department_id]) + if view_type=='invoice': + field_names=['date','number','amount_due'] + for inv in get_model('account.invoice').search_read(dom,field_names): + vals={} + for field_name in field_names: + vals[field_name]=inv[field_name], + lines.append(vals) + data={ + 'lines': lines, + 'date_from': date_from, + 'date_to': date_to, + 'total_inv': len(lines), + 'view_type': view_type, + } + return data + + +PaymentMatching.register() diff --git a/netforce_clinic/readme.txt b/netforce_clinic/readme.txt index 1c0929d..914fccf 100644 --- a/netforce_clinic/readme.txt +++ b/netforce_clinic/readme.txt @@ -1,4 +1,4 @@ -- location - - staff - - patient - +mathching payment: + target + get invoice all invoice + can match any diff --git a/netforce_clinic/reports/payment_matching.xlsx b/netforce_clinic/reports/payment_matching.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ee6779428c6947ee2aadc531558996a5c3c2d3bd GIT binary patch literal 190059 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 K>@_yUr2hlpPji<5 literal 0 HcmV?d00001 diff --git a/netforce_clinic/templates/payment_matching.hbs b/netforce_clinic/templates/payment_matching.hbs new file mode 100644 index 0000000..e750aa0 --- /dev/null +++ b/netforce_clinic/templates/payment_matching.hbs @@ -0,0 +1,38 @@ + +
+
+
+
+

+ TOTAL: {{total_inv}} +

+
+
+ + {{#ifeq view_type 'invoice'}} + + + + + + {{#if lines}} + {{#each lines}} + + + + + {{/each}} + {{else}} + {{/if}} + + + + {{else}} + TODO + {{/ifeq}} +
Invoice DateNumber
{{date}}{{number}}