From 333b5aa3e2bdcfdae54f2fcc9e9be3d0574dbd85 Mon Sep 17 00:00:00 2001 From: "Hardik Ansodariy (OpenERP)" Date: Fri, 26 Aug 2011 18:39:29 +0530 Subject: [PATCH 1/3] [IMP] edi sale order with email template bzr revid: han@tinyerp.com-20110826130929-q0n8o9gdy8a6ssf0 --- addons/sale/__init__.py | 2 +- addons/sale/__openerp__.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/sale/__init__.py b/addons/sale/__init__.py index 3c7af56e808..6361fea3a0b 100644 --- a/addons/sale/__init__.py +++ b/addons/sale/__init__.py @@ -29,5 +29,5 @@ import sale_installer import wizard import report import company - +import edi_sale_order # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index c983edc881e..4dccadc34e2 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -85,6 +85,7 @@ Dashboard for Sales Manager that includes: 'stock_view.xml', 'board_sale_view.xml', 'process/sale_process.xml', + 'edi_sale_order_data.xml', ], 'demo_xml': ['sale_demo.xml'], 'test': [ From 1ed41c0578aa05ef67709a2d9520a8eae3b25a3c Mon Sep 17 00:00:00 2001 From: "Hardik Ansodariy (OpenERP)" Date: Fri, 26 Aug 2011 18:40:37 +0530 Subject: [PATCH 2/3] [imp] edi sale order bzr revid: han@tinyerp.com-20110826131037-fr63ylzjd8ev1l5j --- addons/sale/edi_sale_order.py | 195 ++++++++++++++++++++++++++++ addons/sale/edi_sale_order_data.xml | 51 ++++++++ 2 files changed, 246 insertions(+) create mode 100644 addons/sale/edi_sale_order.py create mode 100644 addons/sale/edi_sale_order_data.xml diff --git a/addons/sale/edi_sale_order.py b/addons/sale/edi_sale_order.py new file mode 100644 index 00000000000..266727c0ae5 --- /dev/null +++ b/addons/sale/edi_sale_order.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import fields, osv, orm +from base.ir import ir_edi +from tools.translate import _ +from datetime import date +class sale_order(osv.osv, ir_edi.edi): + _inherit = 'sale.order' + + def edi_export(self, cr, uid, records, edi_struct=None, context=None): + """Exports a Sale order""" + edi_struct = { + 'name': True, + 'shop_id': True, + 'origin': True, + 'amount_total': True, + 'date_order': True, + 'create_date': True, + 'date_confirm': True, + 'partner_id': True, + 'partner_invoice_id': True, + 'partner_order_id': True, + 'partner_shipping_id': True, + 'incoterm': True, + 'picking_policy': True, + 'order_policy': True, + 'pricelist_id': True, + 'project_id': True, + 'invoice_quantity': True, + 'order_line': { + 'name': True, + 'sequence': True, + 'product_id': True, + 'invoiced': True, + 'procurement_id': True, + 'price_unit': True, + 'type': True, + 'price_subtotal': True, + 'tax_id': True, + 'address_allotment_id': True, + 'product_uom': True, + 'product_uom_qty': True, + 'product_uos': True, + 'notes': True, + + }, + 'shipped': True, + } + partner_pool = self.pool.get('res.partner') + partner_address_pool = self.pool.get('res.partner.address') + company_address_dict = { + 'street': True, + 'street2': True, + 'zip': True, + 'city': True, + 'state_id': True, + 'country_id': True, + 'email': True, + 'phone': True, + + } + edi_doc_list = [] + for order in records: + # Get EDI doc based on struct. The result will also contain all metadata fields and attachments. + edi_doc = super(sale_order,self).edi_export(cr, uid, [order], edi_struct, context) + if not edi_doc: + continue + edi_doc = edi_doc[0] + + # Add company info and address + res = partner_pool.address_get(cr, uid, [order.shop_id.company_id.partner_id.id], ['contact', 'order']) + contact_addr_id = res['contact'] + invoice_addr_id = res['order'] + + address = partner_address_pool.browse(cr, uid, invoice_addr_id, context=context) + edi_company_address_dict = {} + for key, value in company_address_dict.items(): + if not value: + continue + address_rec = getattr(address, key) + if not address_rec: + continue + if key.endswith('_id'): + address_rec = self.edi_m2o(cr, uid, address_rec, context=context) + + edi_company_address_dict[key] = address_rec + + edi_doc.update({ + 'company_address': edi_company_address_dict, + #'company_logo': inv_comp.logo,#TODO + #'paid': inv_comp.paid, #TODO + }) + edi_doc_list.append(edi_doc) + return edi_doc_list + + def edi_import(self, cr, uid, edi_document, context=None): + + partner_pool = self.pool.get('res.partner') + partner_address_pool = self.pool.get('res.partner.address') + model_data_pool = self.pool.get('ir.model.data') + product_pool = self.pool.get('product.product') + product_categ_pool = self.pool.get('product.category') + company_pool = self.pool.get('res.company') + country_pool = self.pool.get('res.country') + state_pool = self.pool.get('res.country.state') + + tax_id = [] + account_id = [] + partner_id = None + company_id = None + if context is None: + context = {} + + # import company as a new partner, if type==in then supplier=1, else customer=1 + # partner_id field is modified to point to the new partner + # company_address data used to add address to new partner + edi_company_address = edi_document['company_address'] + edi_partner_id = edi_document['partner_id'] + company_name = edi_document['company_id'][1] + state_id = edi_company_address.get('state_id', False) + state_name = state_id and state_id[1] + country_id = edi_company_address.get('country_id', False) + country_name = country_id and country_id[1] + + country_id = country_name and self.edi_import_relation(cr, uid, 'res.country', country_name, context=context) or False + state_id = state_name and self.edi_import_relation(cr, uid, 'res.country.state', state_name, + values={'country_id': country_id, 'code': state_name}, context=context) or False + address_value = { + 'street': edi_company_address.get('street', False), + 'street2': edi_company_address.get('street2', False), + 'zip': edi_company_address.get('zip', False), + 'city': edi_company_address.get('city', False), + 'state_id': state_id, + 'country_id': country_id, + 'email': edi_company_address.get('email', False), + 'phone': edi_company_address.get('phone', False), + + } + + partner_value = {'name': company_name} + partner_value.update({'customer': True, 'supplier': False}) + + partner_id = partner_pool.create(cr, uid, partner_value, context=context) + address_value.update({'partner_id': partner_id}) + address_id = partner_address_pool.create(cr, uid, address_value, context=context) + partner_address = partner_address_pool.browse(cr, uid, [address_id], context=context) + partner_address_id = self.edi_o2m(cr, uid, partner_address, context=context) + partner = partner_pool.browse(cr, uid, partner_id, context=context) + edi_document['partner_id'] = self.edi_m2o(cr, uid, partner, context=context) + edi_document.update({ + 'partner_invoice_id': partner_address_id, + 'partner_order_id': partner_address_id, + 'partner_shipping_id': partner_address_id, + #'product_uom_qty': edi_document['order_line'][0]['product_qty'], + 'delay': 10, + }) + # all fields are converted for sale order import so unnecessary fields are deleted + del edi_document['order_line'][0]['date_planned'] + del edi_document['order_line'][0]['product_qty'] + del edi_document['date_approve'] + del edi_document['validator'] + + del edi_document['location_id'] + del edi_document['partner_address_id'] + del edi_document['company_address'] + del edi_document['company_id'] + del edi_document['warehouse_id'] + return super(sale_order,self).edi_import(cr, uid, edi_document, context=context) + +sale_order() + +class sale_order_line(osv.osv, ir_edi.edi): + _inherit='sale.order.line' + +sale_order_line() +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/edi_sale_order_data.xml b/addons/sale/edi_sale_order_data.xml new file mode 100644 index 00000000000..70b6adae397 --- /dev/null +++ b/addons/sale/edi_sale_order_data.xml @@ -0,0 +1,51 @@ + + + + + + context.update({'edi_web_url_view': '%s/edi/view_edi?db=%s&token=%s' %(self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url'),cr.dbname, self.pool.get('ir.edi.document').export_edi(cr, uid, [object], context = context)[0])}) +if not object.partner_id.opt_out: self.pool.get('email.template').generate_mail(cr, + uid, + self.pool.get('ir.model.data').get_object_reference(cr, uid, 'sale', 'email_template_edi_sale')[1], + [object.id], + context=context) + + code + ir.actions.server + + True + EDI Document - Sale Order + + + + + + + + + + + + ${object.company_id.name} - Sale Order ${object.name} + ${object.partner_invoice_id.email} + + True + +Hello ${object.partner_invoice_id.name}, + +We just registered the sale order ${object.name} for ${object.amount_total} for your company ${object.partner_id.name}. +You can click on the following link to preview. + + ${object._context.get('edi_web_url_view')} + + confirmed on ${object.date_confirm} + +Regards, + + mako + Mail Template of Sale Order For EDI Document + sale.order + ${object.user_id.email or ''} + + + From 37263ec7accdb62e33f686c566ac4db81bdf46c3 Mon Sep 17 00:00:00 2001 From: "Hardik Ansodariy (OpenERP)" Date: Mon, 29 Aug 2011 15:51:27 +0530 Subject: [PATCH 3/3] [merge] edi sale order with yml bzr revid: han@tinyerp.com-20110829102127-nkr1muz2e1jsu6xh --- addons/purchase/__init__.py | 1 + addons/sale/__openerp__.py | 1 + addons/sale/edi_sale_order.py | 4 +-- addons/sale/test/edi_sale_order.yml | 51 +++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 addons/sale/test/edi_sale_order.yml diff --git a/addons/purchase/__init__.py b/addons/purchase/__init__.py index 301e32ebca9..87e13840e0d 100644 --- a/addons/purchase/__init__.py +++ b/addons/purchase/__init__.py @@ -26,6 +26,7 @@ import wizard import report import stock import company +import edi_purchase_order # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index 4dccadc34e2..0e3ec9ed075 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -100,6 +100,7 @@ Dashboard for Sales Manager that includes: 'test/invoice_on_ordered_qty.yml', 'test/invoice_on_shipped_qty.yml', 'test/sale_report.yml', + 'test/edi_sale_order.yml', ], 'installable': True, 'active': False, diff --git a/addons/sale/edi_sale_order.py b/addons/sale/edi_sale_order.py index 266727c0ae5..ea1a56b1ed4 100644 --- a/addons/sale/edi_sale_order.py +++ b/addons/sale/edi_sale_order.py @@ -38,8 +38,6 @@ class sale_order(osv.osv, ir_edi.edi): 'date_confirm': True, 'partner_id': True, 'partner_invoice_id': True, - 'partner_order_id': True, - 'partner_shipping_id': True, 'incoterm': True, 'picking_policy': True, 'order_policy': True, @@ -163,7 +161,7 @@ class sale_order(osv.osv, ir_edi.edi): address_value.update({'partner_id': partner_id}) address_id = partner_address_pool.create(cr, uid, address_value, context=context) partner_address = partner_address_pool.browse(cr, uid, [address_id], context=context) - partner_address_id = self.edi_o2m(cr, uid, partner_address, context=context) + partner_address_id = self.edi_o2m(cr, uid, [partner_address], context=context) partner = partner_pool.browse(cr, uid, partner_id, context=context) edi_document['partner_id'] = self.edi_m2o(cr, uid, partner, context=context) edi_document.update({ diff --git a/addons/sale/test/edi_sale_order.yml b/addons/sale/test/edi_sale_order.yml new file mode 100644 index 00000000000..dba200f4cfa --- /dev/null +++ b/addons/sale/test/edi_sale_order.yml @@ -0,0 +1,51 @@ +- + I create a partner which is a my customer +- + !record {model: res.partner, id: res_partner_test22}: + name: Junjun wala + supplier: False + customer: True + opt_out: False +- + I create one Sale Order +- + !record {model: sale.order, id: sale_order_test}: + partner_id: res_partner_test22 + partner_invoice_id: base.res_partner_address_11 + partner_order_id: base.res_partner_address_11 + partner_shipping_id: base.res_partner_address_11 + pricelist_id: 1 + order_line: + - product_id: product.product_product_pc1 + product_uom_qty: 1.0 + product_uom: 1 + price_unit: 150.0 + name: 'basic pc' +- + I Open the sale order +- + !python {model: sale.order}: | + + orders = self.browse(cr, uid, ref("sale_order_test")) + import netsvc + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'sale.order',orders.id,'order_confirm', cr) + +- + I Tesing of EDI functionality. First I export Sale Order from my company than import that Order into customer company +- + !python {model: ir.edi.document}: | + import json + invoice_pool = self.pool.get('sale.order') + orders = invoice_pool.browse(cr, uid, ref("sale_order_test")) + + tokens = self.export_edi(cr, uid, [orders]) + assert tokens, 'Token is not generated' + document = self.get_document(cr, uid, tokens[0]) + document = json.loads(document) + document[0]["__model"] = "purchase.order" + document = json.dumps(document) + a = self.import_edi(cr, uid, edi_document = document) + assert a, 'Invoice is not imported' + +