OpenERP中销售订单的预收款及多次开票的处理

现实的销售、收款、发货的关系有些复杂。常见的关系有:1)收到全款后发货;2)预收部分款后发货;3)先发货再收款;4)分批收款,分批发货。每一笔收款都有对应的发票/收据,1)、3)两种情况,一张销售订单只要开一张票据(发票或收据,OpenERP中是Invoice),2)、4)两种情况,一张销售订单有多张票据。

1)收到全款后发货
这种情况比较简单,在OpenERP的Sales Order中,字段Shipping Policy 选择“ Payment Before Delivery”,表示先付款再发货。选择这个选项,销售订单确认时候,OpenERP会自动生成SO对应的Invoice,但不会自动生成SO对应的发货单(Picking List)。当财务人员确认Invoice,并确认收到该Invoice的款项时候,系统自动生成SO对应的发货单,允许发货。

2)预收部分款后发货
在Sales Order中,有个按钮“Advance Invoice”,表示预收款票据。点击它,选择预收款对应的产品项目,填入预收金额,系统会自动生成预收票据,并将该票据关联到SO上(在SO 的History属性页上显示出来)。“预收款对应的产品项目”是指,必须事先定义一个用于预收款的产品名称(诸如 销售预收款 之类的)。
控制预收款再发货,有两个办法,一个是,SO上的Shipping Policy 选择 “Shipping & Manual Invoice”,这表示,SO确认时候,系统不会自动生成对应的Invoice,而是要手动点击按钮“Create Final Invoice”生成发票。如果选择这种方式,预收款收到前,销售人员不要确认SO,这样,系统就不会自动生成发货单。
另一种办法是,Shipping Policy 选择“ Payment Before Delivery”,这样,如果确认SO时候,预收款发票尚未支付,则系统不会自动生成发货单,而是要待到确认收到款额时候系统才会自动生成发货单。

3) 多次开票的处理
SO上的Shipping Policy 选择 “Shipping & Manual Invoice”。如果点击SO上的按钮“Create Final Invoice”,系统会自动一次性生成SO的余额的发票,而不允许拆分金额多次开票。不过系统提供了“Lines to Invoice”的功能,该功能会列出所有已确认但未开票的SO明细行,允许对每一个明细行开票,并将明细行的发票自动关联到SO上。
如果一张发票对应多个SO,或者,对SO上的一个明细行开多张发票。那么,就必须在Account的Invoice界面上手工新建发票,且该发票不能与SO关联起来。建议严格基于SO开发票,革除根据收款额开销售发票的习惯。

4)收款和发票的关系
建议开票严格基于SO,但收款不必严格基于SO。即1)一个SO可以多次开票,但开票的最小单位是SO上的一个明细行;2)不允许一张发票包含多个SO的内容;3)一笔收款可以对应到多张发票(核销多张发票)。

OpenERP 7 默认值详解

1.激活开发者模式

在OpenERP 7目前的版本中,设置默认值必须进入开发者模式。

2.设置默认值

然后在你要配置默认值的表单里面,先填入对应的数据然后,在表单左上方的调试视图里面选择设置默认值。

OpenERP设置默认值步骤1

默认值的配置界面很直观。

OpenERP设置默认值步骤2

  • 默认:就是你要设置的默认值,下拉列表里面已经根据你当前表单显示出相应的字段和值,你只需要选取
  • 条件:   就是你的默认值生效的条件。例如下图意思就是,当产品类别是服务的,产品类型默认值为服务。(这里涉及到一个bug1112232不过在最新的版本里面已经修复好了)。

OpenERP设置默认值步骤3

怎么样的字段才能成为默认值的条件呢?字段定义里面的 change_default属性为True。

'categ_id': fields.many2one('product.category','Category',
required=True, change_default=True, domain="[('type','=','normal')]" ,
help="Select category for the current product"),
  • 仅用于你个人/所有用户:此默认值是只对当前用户生效还是对于所有用户生效。

 

3.删除默认值

到 设置->技术->动作->用户设定默认值 就能看到目前已经设定的默认值。

4.更多默认值

OpenERP的默认值还可以通过代码的方式来实现。例如下图就是产品模块的默认值

_defaults = {
 'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'product.template', context=c),
 'list_price': 1,
 'cost_method': 'standard',
 'standard_price': 0.0,
 'sale_ok': 1,
 'produce_delay': 1,
 'uom_id': _get_uom_id,
 'uom_po_id': _get_uom_id,
 'uos_coeff' : 1.0,
 'mes_type' : 'fixed',
 'categ_id' : _default_category,
 'type' : 'consu',
 }

问题:如果我既配置了_defaults 又在界面上配置了默认值那么怎么办?
答案:界面的优先级大于代码里面的。

问题:如果在界面上配置了多次默认值,那么会取哪个默认值呢?
答案:取最新的。

原文链接:http://cn.openerp.cn/openerp-7-set-dafault/

OpenERP API 接口

API 接口?

使用Web服务(Working with Web Services)?

鉴于OpenERP的架构,它不适合直接通过PostgreSQL客户端或者 ODBC 这样的连接方法访问数据库, 幸运的是,OpenERP提供了一个非常全面的web服务集,允许你通过标准协议做任何事情。

Note

虽然直接访问数据库,在技术上是可行的,你必须意识到这可能对您的数据造成灾难性的后果,除非你知道你是在做 什么。当你直接访问数据库的时候,建议您关闭OpenERP服务器,以避免缓存和并发问题。

支持的网络服务协议(Supported Web Services Protocols)?

目前支持的协议是XML-RPC和Net-RPC。XML-RPC是用于Web服务的第一批标准之一, 几乎可以再任何语言中使用。这是一个非常详细的协议,而且在需要的时候可以引入潜在位。 另一方面,Net-RPC是一个优化的协议,特别用在Python编写的应用程序之间。.

对于REST风格的web服务的支持在将来的OpenErp发布包中支持。

对于SOAP协议,目前的OPenErp已经不再支持,但是如果在社区有足够的爱好者的话将来可能恢复。

可用的Web服务(Available Web Services)?

OpenERP 为你提供了以下的Web服务.

Note

你能在服务的源码(/bin/service/web_services.py)的对应类里面找到每种服务的细节 .

db:
提供函数创建、删除、备份、恢复数据库. 请谨慎使用!

Technorati 标签: ,,,

common:

让你登录和退出 OpenERP, 并且提供各种实用功能。你只有登录后才能使用其他的网络服务.

object:
这是最有用的网络服务,因为通过它可以访问 OpenERP 对象. 值得注意的是, 函数 “execute” 让你调用对象的方法, 比如可以搜索的大部分的ORM方法,读写记录。它也可以用来调用价格计算等对象的其他方法.

Note

主要的 ORM 方法一览:

create({‘field’:’value’})
  • 创建一个具有指定值的新纪录
  • Returns: 新纪录的ID
search([(‘arg1’,’=’,’value1’)…], offset=0, limit=1000)
  • arg1, arg2, .. ,argN: 指定列表的搜索条件
  • offset: 跳过的可选的记录
  • limit: 返回的最大数量的记录
  • Returns: 匹配给定条件的记录
read([IDS], [‘field1’,’field2’,…])
  • fields: 返回的字段名字(默认全部返回) (default: all fields)
  • Returns: 每条记录的ID和请求字段的值
write([IDS], {‘field1’:’value1’,’field2’:3})
  • values: 更新的字段的值
  • Updates 对给定的记录按照给定的值进行更新
  • Returns: True
unlink([IDS])
  • 按照给定的IDS删除记录
  • Returns: True

通过 Web 服务不能使用 Browse() 函数.

另一个有用的功能是 “exec_workflow”, 它可以让你通过工作流制定记录的进展.

向导:

提供对旧式的向导。新风格的向导是基于ORM的,因此他们可以通过 “object” web 服务来进行访问.

报告:

让你生成和检索报告.

例子:通过Web服务写入数据(Example:writing data through the Web Service)?

下面是一个写数据的例子程序。在下一章你会发现关于多种编程语言 XML-RPC的更详尽的例子.

  1. login: 在Web服务 “common” 中调用 “login” 函数,使用下面的参数:
    • database
    • user name
    • password
  2. 创建一个新的合作者: 在Web服务 “object” 中调用 “execute” 函数,使用下面的参数:
    • database
    • user id provided by “login” in step 1.
    • the object name : ‘res.partner’
    • the name of the ORM method : “create”
    • some data to be recorded

上面提到的数据都是键值对, 比如:

  • name: Fabien Pinckaers
  • lang: fr_FR

但是更复杂的数据结构也可以发送。比如你可以在一个单一的Web服务调用中创建一个合作者 和他的地址。在那种情况下,所有的数据在服务的相同的数据库事务中来处理。这意味. 着你一定要保存好你的数据一致性的状态。这是对所有ERP应用的关键要求.

XML-RPC Web服务(XML-RPC Web Services)?

XML-RPC 是一个著名的Web服务. Web 服务是一个工具,它可以再现有的网络基础设施上面设置分布式的应用程序。这些应用程序使用一种传输层的网络但是并不提供直接通过浏览器的人机界面。可扩展标记语言(XML)提供了描述远程过程调用(RPC)的词汇表,RPC是使用超文本传输协议(HTTP) 在计算机之间传输。实际上,RPC让各开发者自行定义网络调用中的接口。这些接口可以是很简单的一个函数调用也可以像大型API那样复杂.

XML-RPC 允许在两台或者更多运行不同操作系统和不同语言程序的计算机之间协同处理。比如,一个JAVA应用可以和一个Perl应用会谈,一个Perl应用可以同一个同ASP会谈的PYTHON应用会谈,等等。系统集成商往往在不同系统之间建立自己的连接,创建它们自己定义的格式的协议来进行通信,但是这造成了大量的不常使用的协议。RPC方法的程序员无需了解底层的协议、网络以及各种实施细则.

XML-RPC 可以同 Python, Java, Perl, PHP, C, C++, Ruby, Microsoft’s .NET 以及许多其他的编程语言来一起使用。它的实现被广泛用于 Unix, Linux, Windows 和 Macintosh 的平台.

一个 XML-RPC 调用实在双方之间进行的,客户端(调用程序)和服务器(被调用过程)。服务时提供在一个特定的URL上的,比如 (such as http://example.org:8080/rpcserv/).

上面我们只是接触了 XML-RPC 的表面. 我推荐 O’Reilly’s “Programming Web Service with XML-RPC” 进行进一步的学习。还可以阅读以下几个环节:

接口(InterFaces)?
XML-RPC?
XML-RPC 架构?

OpenERP 基于C/S体系结构。服务器和客户端之间的通信使用XML-RPC协议。XML-RPC是一个非常简单的协议,它允许客户端进行远程过程调用。被调用的函数,它的参数,调用结果通过XML编码并且使用HTTP进行传输。欲了解更多的关于XML-RPC的详尽信息,请参阅: http://www.xml-rpc.com.

架构(Architecture)?

下面的图标综合了OpenERP的客户端和服务器结构。OpenERP的服务器和客户端通信使用 XML-RPC.

../_images/tech_arch.png

客户端

OpenERP 的逻辑是在服务器端配置的。客户端是很简单的,它是仅用于POST的数据(forms, lists, trees)并且把结果发回服务器。新功能的更新和加入并不需要客户端的升级,这使得OpenERP更容易维护.

客户端并不明白POST的内容。即使像点击打印图标的行动时发送到服务器并且询问如何作出反应.

客户端的操作时很简单的,当客户发出一个动作(保存一个表格、打开一个目录、打印…)它发送动作到服务器。然后服务器执行客户端的请求并将结果发送回来.

下面是三种行为;

  • Open a window (form or tree)
  • Print a document
  • Execute a wizard
Python?
通过 xml-rpc 获取数据?
代码示例?
  • 创建一个合作伙伴和他的地址
import xmlrpclib

username = 'admin' # OpenERP 登陆用户
pwd = 'admin'      # 登陆密码
dbname = 'terp'    # OpenERP 帐套

# Get the uid
sock_common = xmlrpclib.ServerProxy ('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)

#replace localhost with the address of the server
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')

partner = {
   'name': 'Fabien Pinckaers',
   'lang': 'fr_FR',
}

partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner)

address = {
   'partner_id': partner_id,
   'type' : 'default',
   'street': 'Chaussée de Namur 40',
   'zip': '1367',
   'city': 'Grand-Rosière',
   'phone': '+3281813700',
   'fax': '+3281733501',
}

address_id = sock.execute(dbname, uid, pwd, 'res.partner.address', 'create', address)
  • 查询业务伙伴
    args = [('vat', '=', 'ZZZZZZ')] # 查询过滤条件
    ids = sock.execute(dbname, uid, pwd, 'res.partner', 'search', args)
  • 读取业务伙伴数据
    fields = ['name', 'active', 'vat', 'ref'] # 需要读取的数据字段
    data = sock.execute(dbname, uid, pwd, 'res.partner', 'read', ids, fields) #ids is a list of id
  • 更新业务伙伴数据
    values = {'vat': 'ZZ1ZZZ'} # 待更新数据Dictionary
    result = sock.execute(dbname, uid, pwd, 'res.partner', 'write', ids, values)
  • 删除业务伙伴
    # ids : 待删除业务伙伴id列表
    result = sock.execute(dbname, uid, pwd, 'res.partner', 'unlink', ids)
PHP?
通过 xml-rpc 获取数据?

下载 XML-RPC PHP Library

windows / linux: 从 http://phpxmlrpc.sourceforge.net/ 上下载xmlrpc框架,目前最新的正式版本是2007年2月25日发行的2.2版本

配置 PHP XML-RPC Library

从xmlrpc-2.2.tar.gz 解压出xmlrpc.inc 文件,把这个文件放到php函数库文件夹中,重启apache/iis 服务器

代码示例

  • 登陆OpenERP
function connect() {
   var $user = 'admin';
   var $password = 'admin';
   var $dbname = 'db_name';
   var $server_url = 'http://localhost:8069/xmlrpc/';

   if(isset($_COOKIE["user_id"]) == true)  {
       if($_COOKIE["user_id"]>0) {
       return $_COOKIE["user_id"];
       }
   }

   $sock = new xmlrpc_client($server_url.'common');
   $msg = new xmlrpcmsg('login');
   $msg->addParam(new xmlrpcval($dbname, "string"));
   $msg->addParam(new xmlrpcval($user, "string"));
   $msg->addParam(new xmlrpcval($password, "string"));
   $resp =  $sock->send($msg);
   $val = $resp->value();
   $id = $val->scalarval();
   setcookie("user_id",$id,time()+3600);
   if($id > 0) {
       return $id;
   }else{
       return -1;
   }
 }
  • 查询业务伙伴
/**
 * $client = xml-rpc handler
 * $relation = name of the relation ex: res.partner
 * $attribute = name of the attribute ex:code
 * $operator = search term operator ex: ilike, =, !=
 * $key=search for
 */

function search($client,$relation,$attribute,$operator,$keys) {
     var $user = 'admin';
     var $password = 'admin';
     var $userId = -1;
     var $dbname = 'db_name';
     var $server_url = 'http://localhost:8069/xmlrpc/';

     $key = array(new xmlrpcval(array(new xmlrpcval($attribute , "string"),
              new xmlrpcval($operator,"string"),
              new xmlrpcval($keys,"string")),"array"),
        );

     if($userId<=0) {
     connect();
     }

     $msg = new xmlrpcmsg('execute');
     $msg->addParam(new xmlrpcval($dbname, "string"));
     $msg->addParam(new xmlrpcval($userId, "int"));
     $msg->addParam(new xmlrpcval($password, "string"));
     $msg->addParam(new xmlrpcval($relation, "string"));
     $msg->addParam(new xmlrpcval("search", "string"));
     $msg->addParam(new xmlrpcval($key, "array"));

     $resp = $client->send($msg);
     $val = $resp->value();
     $ids = $val->scalarval();

     return $ids;
}
  • 创建业务伙伴
<?

include('xmlrpc.inc');

$arrayVal = array(
'name'=>new xmlrpcval('Fabien Pinckaers', "string") ,
'vat'=>new xmlrpcval('BE477472701' , "string")
);

$client = new xmlrpc_client("http://localhost:8069/xmlrpc/object");

$msg = new xmlrpcmsg('execute');
$msg->addParam(new xmlrpcval("dbname", "string"));
$msg->addParam(new xmlrpcval("3", "int"));
$msg->addParam(new xmlrpcval("demo", "string"));
$msg->addParam(new xmlrpcval("res.partner", "string"));
$msg->addParam(new xmlrpcval("create", "string"));
$msg->addParam(new xmlrpcval($arrayVal, "struct"));

$resp = $client->send($msg);

if ($resp->faultCode())

    echo 'Error: '.$resp->faultString();

else

    echo 'Partner '.$resp->value()->scalarval().' created !';

?>
  • 更新业务伙伴数据
/**
 * $client = xml-rpc handler
 * $relation = name of the relation ex: res.partner
 * $attribute = name of the attribute ex:code
 * $operator = search term operator ex: ilike, =, !=
 * $id = id of the record to be updated
 * $data = data to be updated
 */

function write($client,$relation,$attribute,$operator,$data,$id) {
     var $user = 'admin';
     var $password = 'admin';
     var $userId = -1;
     var $dbname = 'db_name';
     var $server_url = 'http://localhost:8069/xmlrpc/';

     $id_val = array();
     $id_val[0] = new xmlrpcval($id, "int");

     if($userId<=0) {
     connect();
     }

     $msg = new xmlrpcmsg('execute');
     $msg->addParam(new xmlrpcval($dbname, "string"));
     $msg->addParam(new xmlrpcval($userId, "int"));
     $msg->addParam(new xmlrpcval($password, "string"));
     $msg->addParam(new xmlrpcval($relation, "string"));
     $msg->addParam(new xmlrpcval("write", "string"));
     $msg->addParam(new xmlrpcval($id, "array"));
     $msg->addParam(new xmlrpcval($data, "struct"));

     $resp = $client->send($msg);
     $val = $resp->value();
     $record = $val->scalarval();

     return $record;

}
JAVA?
通过 xml-rpc 获取数据?

下载 JAVA XML-RPC Library

从 http://ws.apache.org/xmlrpc/ 上下载java xmlrpc框架,目前最新版本是2007年8月发布的3.1版本. All OpenERP errors throw exceptions because the framework allows only an int as the error code where OpenERP returns a string.

代码示例

  • 获取OpenERP帐套列表
import java.net.URL;
import java.util.Vector;

import org.apache.commons.lang.StringUtils;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

public Vector<String> getDatabaseList(String host, int port)
{
  XmlRpcClient xmlrpcDb = new XmlRpcClient();

  XmlRpcClientConfigImpl xmlrpcConfigDb = new XmlRpcClientConfigImpl();
  xmlrpcConfigDb.setEnabledForExtensions(true);
  xmlrpcConfigDb.setServerURL(new URL("http",host,port,"/xmlrpc/db"));

  xmlrpcDb.setConfig(xmlrpcConfigDb);

  try {
    //Retrieve databases
    Vector<Object> params = new Vector<Object>();
    Object result = xmlrpcDb.execute("list", params);
    Object[] a = (Object[]) result;

    Vector<String> res = new Vector<String>();
    for (int i = 0; i < a.length; i++) {
    if (a[i] instanceof String)
    {
      res.addElement((String)a[i]);
    }
  }
  catch (XmlRpcException e) {
    logger.warn("XmlException Error while retrieving OpenERP Databases: ",e);
    return -2;
  }
  catch (Exception e)
  {
    logger.warn("Error while retrieving OpenERP Databases: ",e);
    return -3;
  }
}
  • 登陆
import java.net.URL;

import org.apache.commons.lang.StringUtils;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

public int Connect(String host, int port, String tinydb, String login, String password)
{
  XmlRpcClient xmlrpcLogin = new XmlRpcClient();

  XmlRpcClientConfigImpl xmlrpcConfigLogin = new XmlRpcClientConfigImpl();
  xmlrpcConfigLogin.setEnabledForExtensions(true);
  xmlrpcConfigLogin.setServerURL(new URL("http",host,port,"/xmlrpc/common"));

  xmlrpcLogin.setConfig(xmlrpcConfigLogin);

  try {
    //Connect
    params = new Object[] {tinydb,login,password};
    Object id = xmlrpcLogin.execute("login", params);
    if (id instanceof Integer)
      return (Integer)id;
    return -1;
  }
  catch (XmlRpcException e) {
    logger.warn("XmlException Error while logging to OpenERP: ",e);
    return -2;
  }
  catch (Exception e)
  {
    logger.warn("Error while logging to OpenERP: ",e);
    return -3;
  }
}
  • 查询业务伙伴
    TODO
  • 创建业务伙伴
    TODO
  • 更新业务伙伴
    TODO
Python 代码示例?

创建合作伙伴和他们的地址的例子.

import xmlrpclib

sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
uid = 1
pwd = 'demo'

partner = {
    'title': 'Monsieur',
    'name': 'Fabien Pinckaers',
    'lang': 'fr',
    'active': True,
}

partner_id = sock.execute(dbname, uid, pwd, 'res.partner', 'create', partner)

address = {
    'partner_id': partner_id,
    'type': 'default',
    'street': 'Rue du vieux chateau, 21',
    'zip': '1457',
    'city': 'Walhain',
    'phone': '(+32)10.68.94.39',
    'fax': '(+32)10.68.94.39',
}

sock.execute(dbname, uid, pwd, 'res.partner.address', 'create', address)

用下面的脚本来获得用户的 UID :

sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
 UID = sock.login('terp3', 'admin', 'admin')

CRUD(创建/读取/更新/删除)代码示例:

"""
:The login function is under
::    http://localhost:8069/xmlrpc/common
:For object retrieval use:
::    http://localhost:8069/xmlrpc/object
"""
import xmlrpclib

user = 'admin'
pwd = 'admin'
dbname = 'terp3'
model = 'res.partner'

sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
uid = sock.login(dbname ,user ,pwd)

sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')

# CREATE A PARTNER
partner_data = {'name'.. code-block:: php:'Tiny', 'active':True, 'vat':'ZZZZZ'}
partner_id = sock.execute(dbname, uid, pwd, model, 'create', partner_data)

# The relation between res.partner and res.partner.category is of type many2many
# To add  categories to a partner use the following format:
partner_data = {'name':'Provider2', 'category_id': [(6,0,[3, 2, 1])]}
# Where [3, 2, 1] are id fields of lines in res.partner.category

# SEARCH PARTNERS
args = [('vat', '=', 'ZZZZZ'),]
ids = sock.execute(dbname, uid, pwd, model, 'search', args)

# READ PARTNER DATA
fields = ['name', 'active', 'vat', 'ref']
results = sock.execute(dbname, uid, pwd, model, 'read', ids, fields)
print results

# EDIT PARTNER DATA
values = {'vat':'ZZ1ZZ'}
results = sock.execute(dbname, uid, pwd, model, 'write', ids, values)

# DELETE PARTNER DATA
results = sock.execute(dbname, uid, pwd, model, 'unlink', ids)

PRINT(打印) 示例代码:

  1. 打印发票
  2. IDS is the invoice ID, as returned by:
  3. ids = sock.execute(dbname, uid, pwd, ‘account.invoice’, ‘search’, [(‘number’, ‘ilike’, invoicenumber), (‘type’, ‘=’, ‘out_invoice’)])
import time
import base64
printsock = xmlrpclib.ServerProxy('http://server:8069/xmlrpc/report')
model = 'account.invoice'
id_report = printsock.report(dbname, uid, pwd, model, ids, {'model': model, 'id': ids[0], 'report_type':'pdf'})
time.sleep(5)
state = False
attempt = 0
while not state:
    report = printsock.report_get(dbname, uid, pwd, id_report)
    state = report['state']
    if not state:
    time.sleep(1)
    attempt += 1
    if attempt>200:
    print 'Printing aborted, too long delay !'

    string_pdf = base64.decodestring(report['result'])
    file_pdf = open('/tmp/file.pdf','w')
    file_pdf.write(string_pdf)
    file_pdf.close()
PHP 代码示例?

下面的例子是如何使用 PHP 创建一个合作伙伴. 这里使用 phpxmlrpc 库, 在 sourceforge 上有效.

<?

    include('xmlrpc.inc');

    $arrayVal = array(
    'name'=>new xmlrpcval('Fabien Pinckaers', "string") ,
    'vat'=>new xmlrpcval('BE477472701' , "string")
    );

    $client = new xmlrpc_client("http://localhost:8069/xmlrpc/object");

    $msg = new xmlrpcmsg('execute');
    $msg->addParam(new xmlrpcval("dbname", "string"));
    $msg->addParam(new xmlrpcval("3", "int"));
    $msg->addParam(new xmlrpcval("demo", "string"));
    $msg->addParam(new xmlrpcval("res.partner", "string"));
    $msg->addParam(new xmlrpcval("create", "string"));
    $msg->addParam(new xmlrpcval($arrayVal, "struct"));

    $resp = $client->send($msg);

    if ($resp->faultCode())

        echo 'Error: '.$resp->faultString();

    else

        echo 'Partner '.$resp->value()->scalarval().' created !';

    ?>
Perl 代码示例?

下面的例子是使用 Perl 创建、查找、删除一个合作伙伴.

#!c:/perl/bin/perl
# 17-02-2010
# OpenERP XML RPC communication example
# Todor Todorov <todorov@hp.com> <tttodorov@yahoo.com>

use strict;
use Frontier::Client;
use Data::Dumper;

my($user) = 'admin';
my($pw) = 'admin';
my($db) = 'put_your_dbname_here';
my($model) = 'res.partner';

#登录
my $server_url = 'http://localhost:8069/xmlrpc/common';
my $server = Frontier::Client->new('url' => $server_url);
my $uid = $server->call('login',$db,$user,$pw);

print Dumper($uid);

my $server_url = 'http://localhost:8069/xmlrpc/object';
my $server = Frontier::Client->new('url' => $server_url);

print Dumper($server);

#
# 创建合作伙伴
#
my $partner_data = {'name'=>'MyNewPartnerName',
                  'active'=> 'True',
          'vat'=>'ZZZZZ'};
my $partner_id = $server->call('execute',$db, $uid, $pw, $model, 'create', $partner_data);

print Dumper($partner_id);

#
# 搜索合作伙伴
#
my $query = [['vat', '=', 'ZZZZZ']];

print Dumper($query);

my $ids = $server->call('execute',$db, $uid, $pw, $model, 'search', $query);

print Dumper($ids);

#这里等待用户输入
#OpenERP interface my be checked if partner is shown there

print $/."Check OpenERP if partner is inserted. Press ENTER".$/;
<STDIN>;

#
# 删除合作伙伴
#
my $results = $server->call('execute',$db, $uid, $pw, $model, 'unlink', $ids);

print Dumper($results);

在 OpenERP 的 GTK 或 web 客户端的一切活动都是通过 XML/RPC webservices. 启动 openERP GTK 客户端 使用 ./openerp-client.py -l debug_rpc (or debug_rpc_answer) 然后你可以在 GTK 客户端操作,查看客户端操作日志, 你将看到webservice的标签。通过在日志中创建缩进将帮助您 找出它的web服务.

http://tomora.blog.51cto.com/2624569/1305859 原文

OpenERP 7.0 打印PDF报表 中文 乱码问题的解决方案

内容提要:OpenERP 7.0 打印PDF报表 中文 乱码问题的解决方案

网上的解决方案基本上以替换字体和安装上海先锋科技开发的软件包配置两种方案,替换字体的方案尝试了几次都么有成功,安装软件包的方案成功。

软件环境:Windows 7

第一步:先到http://apps.openerp.com/addon/get_module_as_zip/6647/oecn_base_fonts.zip这里下载oecn_base_fonts这个软件包。
第二步:…./openerp/addons文件夹下,最后形成的目录一定是这样的:…/openerp/addons/oecn_base_fonts

第三步:采用管理员账号登陆OPENERP系统,将Administrator用户的权限中的技术特性勾选。

第四步:在设置里面,点击更新模块列表。

第五步:更新完成过后,在可安装的模块中筛选“oecn”即可找到该模块,选择安装即可。

第六步:重新启动OPENERP服务

软件环境:Ubuntu Server 12.04

第一步:先到http://apps.openerp.com/addon/get_module_as_zip/6647/oecn_base_fonts.zip这里下载oecn_base_fonts这个软件包。

第二步:解压放到/usr/lib/pymodules/python2.7/openerp/addons文件夹下,最后形成的目录一定是这样的:/usr/lib/pymodules/python2.7/openerp/addons/oecn_base_fonts

第三步:采用管理员账号登陆OPENERP系统,将Administrator用户的权限中的技术特性勾选。

第四步:在设置里面,点击更新模块列表。

第五步:更新完成过后,在可安装的模块中筛选“oecn”即可找到该模块,选择安装即可。

第六步:重新启动OPENERP服务