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" _fields={ 'track_id': fields.Many2One("account.track.categ","Track-1"), 'department_id': fields.Many2One("clinic.department","Department"), } def create_sale_invoices(self,ids,context={}): obj=self.browse(ids)[0] 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, "department_id": inv.department_id.id, } line_vals={ "description": desc, "amount": abs(inv.amount_cur or inv.amount_due), "track_id": inv.track_id.id, } 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] if not context.get('is_append'): 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) 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() 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_cur=float(line["Amount Cur"].strip().replace(",","") or 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, } department_name=line['Department'] track_name=line['Track-1'] if department_name: for department in get_model("clinic.department").search_browse([['name','=',department_name]]): vals['department_id']=department.id branch=department.branch_id track=branch.track_id vals['track_id']=track.id elif track_name: for track_id in get_model("account.track.categ").search([['name','=',track_name]]): vals['track_id']=track_id get_model("conv.sale.invoice").create(vals) return { "next": { "name": "conv_bal", "active_id": obj.id, "view_xml": "conv_bal2", } } ConvBal.register()