test
							parent
							
								
									820ec298e7
								
							
						
					
					
						commit
						c61517aef4
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
		Loading…
	
		Reference in New Issue