diff --git a/netforce_clinic/migrations/__init__.py b/netforce_clinic/migrations/__init__.py index 204e2c6..1c76385 100644 --- a/netforce_clinic/migrations/__init__.py +++ b/netforce_clinic/migrations/__init__.py @@ -1,7 +1,7 @@ from . import clinic_setting -from . import update_account_tracking +#from . import update_account_tracking #from . import print_labor_cost #from . import hdcase #from . import remove_conv_bal -#from . import import_acc +from . import import_acc #from . import update_labor_cost_line diff --git a/netforce_clinic/migrations/import_acc.py b/netforce_clinic/migrations/import_acc.py index 95a15a9..7aab000 100644 --- a/netforce_clinic/migrations/import_acc.py +++ b/netforce_clinic/migrations/import_acc.py @@ -1,40 +1,49 @@ from netforce.model import get_model from netforce import migration -from netforce.access import set_active_user, get_active_user, set_active_company +from netforce.access import set_active_user, set_active_company class Migration(migration.Migration): _name="import.acc" - _version="2.11.0" + _version="2.10.0" def migrate(self): + set_active_user(1) set_active_company(1) cbv_id=24 cbv=get_model("conv.bal").browse(cbv_id) - #cbv.write({ - #'file': 'tb.csv', - #}) - #print("import acc file (step 1) running ...") - #get_model("conv.bal").import_acc([cbv.id],context={}) + cbv.write({ + 'file': 'tb.csv', + }) + print("import acc file (step 1) running ...") + get_model("conv.bal").import_acc_file([cbv.id],context={}) + get_model("conv.bal").import_acc([cbv.id],context={}) - #cbv.write({ - #'file': 'ar.csv', - #}) - #print("import sale file (step 2)running ...") - #get_model("conv.bal").import_sale_file([cbv.id],context={}) + cbv.write({ + 'file': 'ar.csv', + }) + print("import sale file (step 2)running ...") + get_model("conv.bal").import_sale_file([cbv.id],context={}) + get_model("conv.bal").import_sale([cbv.id],context={}) - #print("import purch file (step 3) running ...") - #cbv.write({ - #'file': 'ap.csv', - #}) - #get_model("conv.bal").import_purch([cbv.id],context={}) - #print("create invoice from setep 1 to 3 is running...") - #print("create_open_entry...") - #print('Done!') - #cbv.create_open_entry() - #print("create_sale_invoices...") - #cbv.create_sale_invoices() - #print("create_purch_invoices...") - #cbv.create_purch_invoices() + print("import purch file (step 3) running ...") + cbv.write({ + 'file': 'ap.csv', + 'date_fmt': '%d/%m/%Y', + }) + get_model("conv.bal").import_purch_file([cbv.id],context={}) + get_model("conv.bal").import_purch([cbv.id],context={}) + + cbv.write({ + 'date_fmt': '%Y-%m-%d', + }) + + # next 3 + print("create_open_entry...") + cbv.create_open_entry() + print("create_sale_invoices...") + cbv.create_sale_invoices() + print("create_purch_invoices...") + cbv.create_purch_invoices() print("Done!") return True diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index cb004e0..babbd2b 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -140,3 +140,4 @@ from . import share_location from . import report_cycle_setting from . import print_labor_cost from . import print_labor_cost_line +from . import conv_bal diff --git a/netforce_clinic/models/conv_bal.py b/netforce_clinic/models/conv_bal.py new file mode 100644 index 0000000..169ab5e --- /dev/null +++ b/netforce_clinic/models/conv_bal.py @@ -0,0 +1,135 @@ +import csv +import datetime +from io import StringIO + +from netforce.model import Model, fields, get_model +from netforce.utils import get_file_path + +class ConvBal(Model): + _inherit="conv.bal" + + def create_sale_invoices(self,ids,context={}): + obj=self.browse(ids)[0] + settings=get_model("settings").browse(1) + desc="Conversion balance %s"%obj.date + for inv in obj.sale_invoices: + vals={ + "type": "out", + "inv_type": inv.amount_due>=0 and "invoice" or "credit", + "partner_id": inv.contact_id.id, + "date": inv.date, + "due_date": inv.due_date, + "number": inv.number, + "ref": inv.ref, + "memo": desc, + "lines": [], + "state": "waiting_payment", + "account_id": inv.account_id.id, + "reconcile_move_line_id": inv.move_line_id.id, + "currency_id": inv.account_id.currency_id.id, + "currency_rate": inv.amount_due/inv.amount_cur if inv.amount_cur else None, + } + line_vals={ + "description": desc, + "amount": abs(inv.amount_cur or inv.amount_due), + } + vals["lines"].append(("create",line_vals)) + res=get_model("account.invoice").search([["number","=",inv.number]]) + if res: + inv2_id=res[0] + inv2=get_model("account.invoice").browse(inv2_id) + #ratchawat + inv2.write({ + 'lines': vals['lines'], + }) + #if abs(inv2.amount_total)-abs(inv.amount_due)>0.001: # XXX + #raise Exception("Failed to update invoice %s: different amount"%inv.number) + #if inv2.state=="draft": + #raise Exception("Failed to update invoice %s: invalid state"%inv.number) + #inv2.write({ + #"move_id": obj.move_id.id, + #"reconcile_move_line_id": inv.move_line_id.id, + #}) + else: + get_model("account.invoice").create(vals) + + def import_sale_file(self,ids,context): + obj=self.browse(ids)[0] + path=get_file_path(obj.file) + data=open(path).read() + rd=csv.reader(StringIO(data)) + headers=next(rd) + headers=[h.strip() for h in headers] + del_ids=get_model("conv.sale.invoice").search([["conv_id","=",obj.id]]) + get_model("conv.sale.invoice").delete(del_ids) + for row in rd: + print("row",row) + row+="," #XXX append blank column for Amount Cur + line=dict(zip(headers,row)) + print("line",line) + if not line.get("Number"): + continue + number=line["Number"].strip() + if not number: + continue + ref=line["Reference"].strip() + contact_name=line["Contact"].strip() + res=get_model("partner").search([["name","=",contact_name]]) + if not res: + raise Exception("Contact not found: '%s'"%contact_name) + contact_id=res[0] + date=datetime.datetime.strptime(line["Date"].strip(),obj.date_fmt).strftime("%Y-%m-%d") + due_date=datetime.datetime.strptime(line["Due Date"].strip(),obj.date_fmt).strftime("%Y-%m-%d") + amount_due=float(line["Amount Due"].strip().replace(",","") or 0) + acc_code=line["Account"].strip() + amount_cur=float(line["Amount Cur"].strip().replace(",","") or 0) + acc_codes=acc_code.split(",") + if len(acc_codes) > 1: + count=0 + amts=[m.split(":")[1] for m in line['Memo'].split(",")] + for acc_code in acc_codes: + acc_code=acc_code.strip() + res=get_model("account.account").search([["code","=",acc_code]]) + if not res: + raise Exception("Account code not found: %s"%acc_code) + acc_id=res[0] + amount_due=amts[count] + vals={ + "conv_id": obj.id, + "number": number, + "ref": ref, + "contact_id": contact_id, + "date": date, + "due_date": due_date, + "amount_due": amount_due, + "account_id": acc_id, + "amount_cur": amount_cur, + } + get_model("conv.sale.invoice").create(vals) + count+=1 + else: + res=get_model("account.account").search([["code","=",acc_code]]) + if not res: + raise Exception("Account code not found: %s"%acc_code) + acc_id=res[0] + vals={ + "conv_id": obj.id, + "number": number, + "ref": ref, + "contact_id": contact_id, + "date": date, + "due_date": due_date, + "amount_due": amount_due, + "account_id": acc_id, + "amount_cur": amount_cur, + } + get_model("conv.sale.invoice").create(vals) + return { + "next": { + "name": "conv_bal", + "active_id": obj.id, + "view_xml": "conv_bal2", + } + } + +ConvBal.register()