Planet ShineIT

September 22, 2016

Kevin KongNginx 配置 Odoo - Kevin-Kong

September 21, 2016

JefferyOdoo report - odoouse

September 18, 2016

JefferyOdoo Web Service API - odoouse

【摘要】Odoo Web服务暴露出相关的服务,路由分别是 根据 services 调用 后端对应服务的 方法method 【定义 openerp\http.py 之 dispatch_rpc()】,然后再将结果从python dict 转换为 xml-rpc 格式 或者 json-rpc 返回 servic 阅读全文

September 17, 2016

JefferyOdoo启动过程 - odoouse

【摘要】[本文基于odoo9源码编写] odoo包含的服务有 Odoo以wsgi 规范提供Web及Web服务db/object/report,而workflow则包含在model里面,以create[delete|redirect|signal|step]_workflow() 提供服务。Odoo9之后为了 阅读全文

September 14, 2016

Kevin KongDisplaying a full list of groups in Odoo's Kanban view - Kevin-Kong

【摘要】Kanban view is probably the most flexible view in Odoo. It can be used for many different purposes. One of the most common ones is splitting items int 阅读全文

September 12, 2016

Kevin Kong关于GreenOdoo的一个Bug - Kevin-Kong

【摘要】动态创建字段的时候,虽然字段已经创建,但是显示的时候会报没有新创建的字段错误: 但是原版是没有任何问题的,记录一下。 阅读全文

September 08, 2016

JefferyOdoo10 变化 - odoouse

【摘要】官方在 https://www.odoo.com/forum/help-1/question/fyi-what-has-odoo-r-d-been-working-on-lately-106945 发布了一个 说明, 将要点 摘要如下 Write BY jeffery 转载请 标明出处 New AP... 阅读全文

JefferyOdoo10尝鲜:出勤登记 - odoouse

【摘要】非常的cool,使用一个 联网的PAD 就能使用超级潮的 出勤登记功能 扫描 工牌条码,或者 从员工目录选择 员工, 例如 输入 PIN 密码, 防止"代打卡" 打卡 完成 下班,再做一次, 自动判断 check-in 还是 check-out 输入 PIN 密码 阅读全文

September 07, 2016

JefferyOdoo10尝鲜:制造 - odoouse

【摘要】Odoo10主要是对 MRP 进行重构, 增加制造领料类型 简化工作中心 指定投料的作业 工作中心的生产效率指标,例如 OEE 基于历史工单数据,统计、计算工序作业时长 并增加了新功能,例如 拆解 工作站使用的平板作业界面【企业版】 MPS 【企业版】 质检【企业版】 保养【企业版】 制造领料 新增... 阅读全文

JefferyOdoo10尝鲜: 退货 - odoouse

【摘要】Odoo sale / purchase 在 v9 改进之后, 开立发票的入口 不再像之前的版本,有多个来源,例如 订单 交货单 记工单 分析分录 现在只有一个入口,只需要在 订单上开票,这样,对应收款的确认变得异常的容易, 下面演示 销售退货 销售"测试产品" 2单位 确认订单, 系统建立 交货单... 阅读全文

August 29, 2016

Kevin KongOdoo 8.0 实施开发指南 第一版 试读 - Kevin-Kong

【摘要】试读地址: http://share.weiyun.com/4f83964db87e022c7c210abe6b5e782f 如有错误,欢迎指正。 阅读全文

August 19, 2016

Kevin KongOdoo Website 替换 谷歌地图为 百度地图 - Kevin-Kong

【摘要】由于众所周知的原因,国内使用谷歌地图是件非常痛苦的事,更为接地气的做法是替换为百度地图。 模块地址参见群公告。 演示地址:http://timesup.cn:8069 阅读全文

JefferyOdoo10尝鲜:MRP 10 新概念 - odoouse

【摘要】OEE [ overall equipment Effectiveness 整体设备效率 ] 整體設備效率是整合稼働率 (Availability)、產能效率 (Performance)、良率 (Quality)的可測量生產效率。整體設備效率可應用於工廠的生產線或獨立的部門。100 %的整體設備效率 阅读全文

August 11, 2016

JefferyOdoo multiprocessing - odoouse

【摘要】Odoo 在 非 windows 系统下, 支持 并行处理,开启 workers 配置项 即可。 odoo有以下配置项 跟 并行处理有关 配置项帮助信息解说limit_memory_softMaximum allowed virtual memory per worker, when reached... 阅读全文

August 10, 2016

Jefferynginx list directory - odoouse

【摘要】使用 http autoindex 模块列出 目录, 例如 需要将 /var/www 下的 resourcepacks 目录以 http 的方式 暴露 这样设置 nginx 开启 autoindex 选项 注意, root 只需要写 到 resourcepacks 的上级目录。 ... 阅读全文

August 09, 2016

Kevin Kong制作本地 odoo deb包安装镜像 - Kevin-Kong

【摘要】【本来这不是个事,可是在阿里云部署的时候,这个网速真是让我无语,本来10分钟就能解决的事,得俩三个小时,太没效率了!】 原文转自 http://www.cnblogs.com/xwdreamer/p/3875857.html 平时apt-get install安装软件时,下载的deb文件都会存放在/ 阅读全文

July 29, 2016

Kevin KongOdoo 配置快速创建编辑按钮 - Kevin-Kong

【摘要】对于Man2one类型的数据,我们知道,form view中总会显示出一个尾巴似的"create and edit"和一个快速创建的机制,有时候业务人员一不小心就容易创建一个新的行出来,对该功能进行限制就显得十分重要了。 今天我们介绍的这个模块就有这个功能: 我们先来看一下,安装模块后的效果。 很清 阅读全文

July 25, 2016

海飞odoo 优化(1)

背景,测试数据如下:
1 客户数据,20000000+
 min |   max    
-----+----------
   1 | 20000990
(1 row)

2 报价/销售, 11000000+,明细30000000+
 min |   max    
-----+----------
   1 | 11101008
(1 row)

 min |   max    
-----+----------
   1 | 30400995
(1 row)

顺序点击菜单:客户,仪表板,报价单,销售订单,发现特别耗数据库资源的SQL如下:
2016-07-25 13:42:44 CST LOG:  duration: 5658.017 ms  statement: 
           SELECT min(sale_order.id) AS id, count(sale_order.id) AS team_id_count , sum("sale_order"."amount_total") AS "amount_total" ,"sale_order"."team_id" as "team_id" 
           FROM "sale_order" LEFT JOIN "crm_team" as "sale_order__team_id" ON ("sale_order"."team_id" = "sale_order__team_id"."id") LEFT JOIN 
           (SELECT DISTINCT ON (res_id) res_id, value
           FROM "ir_translation"
           WHERE
               name = 'crm.team,name' AND
               lang = 'zh_CN' AND
               value != ''
           ORDER BY res_id, id DESC)
            as "sale_order__team_id__name" ON ("sale_order__team_id"."id" = "sale_order__team_id__name"."res_id")
           WHERE (("sale_order"."team_id" in (1,2))  AND  ("sale_order"."invoice_status" = 'to invoice'))
           GROUP BY "sale_order"."team_id",COALESCE("sale_order__team_id__name"."value","sale_order__team_id"."name")
           ORDER BY  COALESCE("sale_order__team_id__name"."value", "sale_order__team_id"."name")  
           
           
       
2016-07-25 13:44:24 CST LOG:  duration: 102824.465 ms  statement: SELECT count(1) FROM "res_partner" WHERE ((("res_partner"."active" = true)  AND  ("res_partner"."customer" = true))  AND  "res_partner"."parent_id" IS NULL )
2016-07-25 13:53:32 CST LOG:  duration: 7646.432 ms  statement: SELECT "sale_order".id FROM "sale_order" WHERE ("sale_order"."state" in ('draft','sent','cancel')) ORDER BY "sale_order"."date_order" DESC,"sale_order"."id" DESC  limit 80
2016-07-25 13:53:34 CST LOG:  duration: 1962.897 ms  statement:  SELECT "res_partner"."language" as "language","res_partner"."street2" as "street2","res_partner"."commercial_partner_id" as "commercial_partner_id","res_partner"."country_id" as "country_id","res_partner"."street" as "street","res_partner"."active" as "active","res_partner"."customer" as "customer","res_partner"."comment" as "comment","res_partner"."credit_limit" as "credit_limit","res_partner"."function" as "function","res_partner"."is_company" as "is_company","res_partner"."signup_token" as "signup_token","res_partner"."opt_out" as "opt_out","res_partner"."headimgurl" as "headimgurl","res_partner"."parent_id" as "parent_id","res_partner"."write_uid" as "write_uid","res_partner"."write_date" as "write_date","res_partner"."sex" as "sex","res_partner"."unionid" as "unionid","res_partner"."state_id" as "state_id","res_partner"."signup_expiration" as "signup_expiration","res_partner"."company_type" as "company_type","res_partner"."signup_type" as "signup_type","res_partner"."title" as "title","res_partner"."color" as "color","res_partner"."user_id" as "user_id","res_partner"."lang" as "lang","res_partner"."display_name" as "display_name","res_partner"."employee" as "employee","res_partner"."notify_email" as "notify_email","res_partner"."fax" as "fax","res_partner"."last_time_entries_checked" as "last_time_entries_checked","res_partner"."message_last_post" as "message_last_post","res_partner"."type" as "type","res_partner"."create_date" as "create_date","res_partner"."email" as "email","res_partner"."debit_limit" as "debit_limit","res_partner"."supplier" as "supplier","res_partner"."city" as "city","res_partner"."phone" as "phone","res_partner"."tz" as "tz","res_partner"."ref" as "ref","res_partner"."company_id" as "company_id","res_partner"."create_uid" as "create_uid","res_partner"."date" as "date","res_partner"."use_parent_address" as "use_parent_address","res_partner"."remark" as "remark","res_partner"."birthdate" as "birthdate","res_partner"."website" as "website","res_partner"."nickname" as "nickname","res_partner"."zip" as "zip","res_partner"."vat" as "vat","res_partner"."team_id" as "team_id","res_partner"."barcode" as "barcode","res_partner"."name" as "name","res_partner"."mobile" as "mobile","res_partner"."id" as "id" FROM "res_partner"
                       WHERE "res_partner".id IN (4200707, 7189252, 3771269, 2507971, 7077127, 8668725, 337803, 18056335, 3116433, 15140675, 12761237, 18774038, 18487191, 4599193, 4669210, 2313371, 12021662, 3811999, 17648809, 1186852, 5233191, 13094185, 18723847, 3644332, 5404973, 70575, 14858929, 15976627, 17271988, 8089653, 18299574, 8646985, 5151544, 17274484, 3326522, 18797756, 4163518, 769471, 14428352, 16711648, 932162, 8742595, 12799030, 6774726, 15477319, 16580103, 19309644, 8358218, 9885132, 15530317, 14262352, 62936, 17482069, 12159831, 18228952, 13852452, 10398805, 7348607, 7794951, 16039396, 6593041, 3071381, 13535019, 18160167, 11899757, 3810286, 10752112, 16294126, 5271855, 7248115, 8782059, 14583925, 2385868, 16391145, 4806142, 4023652, 9381357, 13299708, 15578494, 9324117)  ORDER BY "res_partner"."display_name"  
                   
2016-07-25 13:53:37 CST LOG:  duration: 3344.553 ms  statement: SELECT count(1) FROM "sale_order" WHERE ("sale_order"."state" in ('draft','sent','cancel'))
2016-07-25 13:53:41 CST LOG:  duration: 2892.137 ms  statement: SELECT "sale_order".id FROM "sale_order" WHERE (("sale_order"."state" not in ('draft','sent','cancel')) OR "sale_order"."state" IS NULL) ORDER BY "sale_order"."date_order" DESC,"sale_order"."id" DESC  limit 80

目前的PG版本是9.3版本,odoo版本是9.0c版本。



test01=> explain analyze 
test01-> SELECT "res_partner".id FROM "res_partner" WHERE ((("res_partner"."active" = true)  AND  ("res_partner"."customer" = true)) 
test01(>  AND  "res_partner"."parent_id" IS NULL )
test01->  ORDER BY "res_partner"."display_name"   limit 80
test01-> ;
                                                                             QUERY PLAN                                                                              
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.56..190.74 rows=80 width=25) (actual time=52.167..470.774 rows=80 loops=1)
   ->  Index Scan using res_partner_display_name_index on res_partner  (cost=0.56..47545531.47 rows=20000988 width=25) (actual time=52.164..470.711 rows=80 loops=1)
         Filter: (active AND customer AND (parent_id IS NULL))
         Rows Removed by Filter: 32
 Total runtime: 470.858 ms
(5 rows)

test01=> explain analyze SELECT count(1) FROM "res_partner" WHERE ((("res_partner"."active" = true)  AND  ("res_partner"."customer" = true))  AND  "res_partner"."parent_id" IS NULL );
                                                            QUERY PLAN                                                             
-----------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=1116553.35..1116553.36 rows=1 width=0) (actual time=100658.285..100658.286 rows=1 loops=1)
   ->  Seq Scan on res_partner  (cost=0.00..1066550.88 rows=20000988 width=0) (actual time=0.008..96363.068 rows=20000915 loops=1)
         Filter: (active AND customer AND (parent_id IS NULL))
         Rows Removed by Filter: 74
 Total runtime: 100658.418 ms
(5 rows)

test01=> CREATE INDEX partner_customer_menu_index ON res_partner (active, customer, parent_id, company_id);
CREATE INDEX
test01=> explain analyze SELECT count(1) FROM "res_partner" WHERE ((("res_partner"."active" = true)  AND  ("res_partner"."customer" = true))  AND  "res_partner"."parent_id" IS NULL );
                                                                                QUERY PLAN                                                                                
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=808085.26..808085.27 rows=1 width=0) (actual time=10868.048..10868.049 rows=1 loops=1)
   ->  Index Only Scan using partner_customer_menu_index on res_partner  (cost=0.56..758082.79 rows=20000988 width=0) (actual time=0.059..6959.573 rows=20000915 loops=1)
         Index Cond: ((active = true) AND (customer = true) AND (parent_id IS NULL))
         Filter: (active AND customer)
         Heap Fetches: 0
 Total runtime: 10868.095 ms
(6 rows)

test01=> drop index partner_customer_menu_index;
DROP INDEX
test01=> CREATE INDEX partner_customer_menu_index ON res_partner (active, customer, parent_id);
CREATE INDEX
test01=> explain analyze SELECT count(1) FROM "res_partner" WHERE ((("res_partner"."active" = true)  AND  ("res_partner"."customer" = true))  AND  "res_partner"."parent_id" IS NULL );
                                                                                QUERY PLAN                                                                                
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=808085.26..808085.27 rows=1 width=0) (actual time=10804.869..10804.869 rows=1 loops=1)
   ->  Index Only Scan using partner_customer_menu_index on res_partner  (cost=0.56..758082.79 rows=20000988 width=0) (actual time=0.063..6741.260 rows=20000915 loops=1)
         Index Cond: ((active = true) AND (customer = true) AND (parent_id IS NULL))
         Filter: (active AND customer)
         Heap Fetches: 0
 Total runtime: 10804.916 ms
(6 rows)

test01=> \d sale_order
                                          Table "public.sale_order"
        Column        |            Type             |                        Modifiers                        
----------------------+-----------------------------+---------------------------------------------------------
 id                   | integer                     | not null default nextval('sale_order_id_seq'::regclass)
 origin               | character varying           | 
 create_date          | timestamp without time zone | 
 write_uid            | integer                     | 
 team_id              | integer                     | 
 client_order_ref     | character varying           | 
 date_order           | timestamp without time zone | not null
 partner_id           | integer                     | not null
 create_uid           | integer                     | 
 procurement_group_id | integer                     | 
 amount_untaxed       | numeric                     | 
 message_last_post    | timestamp without time zone | 
 company_id           | integer                     | 
 note                 | text                        | 
 state                | character varying           | 
 pricelist_id         | integer                     | not null
 project_id           | integer                     | 
 amount_tax           | numeric                     | 
 validity_date        | date                        | 
 payment_term_id      | integer                     | 
 write_date           | timestamp without time zone | 
 partner_invoice_id   | integer                     | not null
 user_id              | integer                     | 
 fiscal_position_id   | integer                     | 
 amount_total         | numeric                     | 
 invoice_status       | character varying           | 
 name                 | character varying           | not null
 partner_shipping_id  | integer                     | not null
 picking_policy       | character varying           | 
 incoterm             | integer                     | 
 warehouse_id         | integer                     | 
 shop_id              | integer                     | 
 type                 | character varying           | 
 channel              | character varying           | 
 date_deliver         | date                        | 
 date_install         | date                        | 
Indexes:
    "sale_order_pkey" PRIMARY KEY, btree (id)
    "sale_order_create_date_index" btree (create_date)
    "sale_order_date_order_index" btree (date_order)
    "sale_order_name_index" btree (name)
    "sale_order_partner_id_index" btree (partner_id)
    "sale_order_state_index" btree (state)                            --已有索引!
    "sale_order_user_id_index" btree (user_id)
Foreign-key constraints:
    "sale_order_company_id_fkey" FOREIGN KEY (company_id) REFERENCES res_company(id) ON DELETE SET NULL
    "sale_order_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL
    "sale_order_fiscal_position_id_fkey" FOREIGN KEY (fiscal_position_id) REFERENCES account_fiscal_position(id) ON DELETE SET NULL
    "sale_order_incoterm_fkey" FOREIGN KEY (incoterm) REFERENCES stock_incoterms(id) ON DELETE SET NULL
    "sale_order_partner_id_fkey" FOREIGN KEY (partner_id) REFERENCES res_partner(id) ON DELETE SET NULL
    "sale_order_partner_invoice_id_fkey" FOREIGN KEY (partner_invoice_id) REFERENCES res_partner(id) ON DELETE SET NULL
    "sale_order_partner_shipping_id_fkey" FOREIGN KEY (partner_shipping_id) REFERENCES res_partner(id) ON DELETE SET NULL
    "sale_order_payment_term_id_fkey" FOREIGN KEY (payment_term_id) REFERENCES account_payment_term(id) ON DELETE SET NULL
    "sale_order_pricelist_id_fkey" FOREIGN KEY (pricelist_id) REFERENCES product_pricelist(id) ON DELETE SET NULL
    "sale_order_procurement_group_id_fkey" FOREIGN KEY (procurement_group_id) REFERENCES procurement_group(id) ON DELETE SET NULL
    "sale_order_project_id_fkey" FOREIGN KEY (project_id) REFERENCES account_analytic_account(id) ON DELETE SET NULL
test01=> explain analyze SELECT count(1) FROM "sale_order" WHERE ("sale_order"."state" in ('draft','sent','cancel'));
                                                           QUERY PLAN                                                           
--------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=438952.01..438952.02 rows=1 width=0) (actual time=7569.093..7569.094 rows=1 loops=1)
   ->  Seq Scan on sale_order  (cost=0.00..413219.70 rows=10292924 width=0) (actual time=0.058..5150.208 rows=11101055 loops=1)
         Filter: ((state)::text = ANY ('{draft,sent,cancel}'::text[]))
         Rows Removed by Filter: 3
 Total runtime: 7569.140 ms
(5 rows)

test01=> explain analyze SELECT count(1) FROM "sale_order" WHERE ("sale_order"."state" = 'draft');
                                                           QUERY PLAN                                                           
--------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=426085.86..426085.87 rows=1 width=0) (actual time=6796.909..6796.909 rows=1 loops=1)
   ->  Seq Scan on sale_order  (cost=0.00..400353.55 rows=10292924 width=0) (actual time=0.065..4549.074 rows=11101055 loops=1)
         Filter: ((state)::text = 'draft'::text)
         Rows Removed by Filter: 3
 Total runtime: 6796.953 ms
(5 rows)

test01=> explain analyze SELECT count(1) FROM "sale_order";
                                                           QUERY PLAN                                                           
--------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=400353.55..400353.56 rows=1 width=0) (actual time=4896.342..4896.342 rows=1 loops=1)
   ->  Seq Scan on sale_order  (cost=0.00..374621.24 rows=10292924 width=0) (actual time=0.042..2749.727 rows=11101058 loops=1)
 Total runtime: 4896.389 ms
(3 rows)

test01=> 

第一步加索引吧!

 

April 06, 2016

先安科技Odoo 只能运行在 Python 2.7 :-(


很多朋友都知道Odoo当前版本(9.0)目前不支持Python 3.X。但是,大概并不清楚Odoo 9.0实际上目前只能运行在Python 2.7。

我本来也没有对Python版本的要求有特别关注,因为所有的安装环境都用了最新Python2.7.X。直到最近在客户提供的一台CentOS 6.7的服务器上运行Odoo时才意识到这个要求。并且搞明白了为什么不能运行在CentOS6.7默认安装的Python 2.6环境下。

当按部署要求安装了数据库和所有Python依赖库后,启动Odoo服务器,立即有Syntax Error报错。查看Odoo源文件发现了以下这么几个原因导致了Odoo不能运行在Python 2.6环境下:

  1. Odoo用到了Python 2.7之前的版本不支持的字典解析表达式(dict comprehension)
    比如:
    { name: self.to_field(model, field, fromtype)
    for name, field in model._fields.iteritems()
    }

    一个向后兼容的修改是这样的:

    dict(
    (name, self.to_field(model, field, fromtype))
    for name, field in model._fields.iteritems()
    )
  2. Odoo用到了Python2.7之前的版本不支持的集合的标注法
    比如:

    fnames = {field.name}

    一个向后兼容的修改是这样的:
    fnames = set([field.name])
  3. Odoo用到了Python2.7之前的版本不支持的集合解析表达式 (set comprehension)
    比如:

    fnames = {fname
    for fname, fcolumn in self._columns.iteritems()
    if fcolumn._multi == multi
    if not fcolumn.groups or self.user_has_groups(fcolumn.groups)
    }

    一个向后兼容的修改是这样的:

    fnames = set(fname
    for fname, fcolumn in self._columns.iteritems()
    if fcolumn._multi == multi
    if not fcolumn.groups or self.user_has_groups(fcolumn.groups)
    )
  4. Odoo用到了Python2.7从第三方weakrefset库back port到标准库weakref的weakSet类
    比如:

    from weakref import weakSet

    一个向后兼容的修改是这样的:

    try:
    from weakref import weakSet
    except ImportError:
    from weakrefset import weakSet
  5. Odoo用到了Python2.7之前版本不支持的with 表达式写法(一行表示多个嵌套的context manager)

    with tools.ignore(Exception), tools.mute_logger('openerp.sql_db'), sql_db.db_connect(dbname, allow_uri=True).cursor() as cr:

    一个向后兼容的修改是这样的:

    import contextlib
    with contextlib.nested(tools.ignore(Exception), tools.mute_logger('openerp.sql_db'), sql_db.db_connect(dbname, allow_uri=True).cursor()) as (_,_,cr):
  6. 安装了不支持Python2.6的reportlab
    在requirements.txt中对reportlab依赖库的版本要求是 reportlab==3.1.44
    而该版本的reportlab不支持Python2.6解决办法:安装支持Python2.6的reportlab 2.7

    sudo pip uninstall reportlab
    sudo pip install https://pypi.python.org/packages/source/r/reportlab/reportlab-2.7.tar.gz

目前发现的影响Odoo向低版本Python兼容的问题就这些,理论上按上面介绍的方法去修改是可以让Odoo运行在Python2.7以下的版本的。

不过个人私下以为,对低版本Python的支持基本属闲的蛋疼,更靠谱的应该是让Odoo能运行于Py3或pypy,这个就留给强人研究了。

March 22, 2016

先安科技让Odoo更懂你习惯,本地化设置:语言,国家

Odoo是个来自欧洲的软件,那么是什么让它适应各种本地化的要求呢?首先它是支持国际化的,还提供了一个翻译平台,让社区人士能协同翻译。其次系统里面还有不少国际化配置项,这些国际化的配置会影响到Odoo系统的界面,报表。

语言(res.lang)(设置/翻译/语言)

语言列表里是我们导入过的语言翻译,一般中文用户,如果创建数据库的时候没有选择中文之后才导入中文翻译,这里就会有英语、中文两个语言。

打开语言的表单视图,这里可以看到如下的表单视图:

res.lang.1
这里面可以配置该语言的日期、数字和时间格式,大部分的值已在导入翻译的时候预配置好。这里有个题外话,这些预设置的值来自locale(https://docs.python.org/2/library/locale.html)这个python模块。关于日期的配置格式大家可以看到表单视图下方是日期格式的介绍,这里就不再重复了。

分隔符格式是对数字字段进行分割,当n>0时表示n位分隔,n=-1时则结束分隔;例如国内常用的千分位分隔符,可以这样配置[3,3],保存后刷新页面就会生效。

国家(res.country)(销售/配置/联系人/本地化/国家)

这里的国家信息也是系统可以配置地址格式,已经有默认值如下:%(country_name)s%(state_name)s%(city)s%(street)s%(street2)s %(zip)s ,它的格式是%(变量名)s,可选的值有:

country_name:国家名;state_name:省;city:城市;street:街道;street2:街道2;zip:邮编;country_code:国家编码;state_code:省编码。

你可以按照需要调整需要显示的顺序。

res.country
需要注意的是这里修改的日期、数字格式,地址格式是会应用到所有关联语言的系统视图、报表。

March 14, 2016

先安科技Odoo 自动动作教程(二)服务器动作

今天继续来看看自动动作的更多应用场景,例如:我们公司有专员专门负责跟踪美国来的线索。

第一步选择好筛选器:来自美国的线索,domain表达式是[('country_id','=','United States')],然后再来看看动作里还能做什么操作。

server-action-2-1
更改的字段

更改纪录上的字段,其中“设置负责人”就是修改线索上的销售员,从代码上看就是修改对象上的user_id字段。销售相关的对象这个字段一般就是销售人员。“添加关注者”,顾名思义就是添加关注者关注这个纪录,这里是可以多选的。这样设置的结果就是“所有来自美国的线索都会自动把销售人员设置为:Administrator而且添加上面三人为关注者”。

服务器动作

自动动作可以触发一系列的服务器动作。下图就是一个服务器动作,可以看到这里跟自动动作类似,也有关联模型,条件(Domain),需要注意的是代办动作类型:

Send Email:选择一个邮件模版进行邮件发送。

Execute Python:Python代码。这里面的Python代码和直接在文件里编写有点不同,“帮助”页签里有详细介绍。

Trigger a Workflow Signal:发送一个工作流信号,触发工作转跳。

Run a Client Action:执行一个客户端动作。

Create or Copy a new Record:创建或者复制一个新纪录,这个功能很强大,连字段映射都可以做,例如你想自动从一个线索创建销售订单,可以在这里配置来实现。

Write on a Record:是上面更改字段的升级版,这里可以写任何字段,还可以写到关联的对象里,例如写到线索对应的客户信息。

Execute Server action:触发其他一系列的服务器动作。

自动动作还有一个好处就是更“快”的配置,公司的业务逻辑可能在定制模块的完成的时候就开始发生变化,很多逻辑可能要基于现有的变化后的数据来做,自动动作恰好给了我们这样一个灵活的配置方式。

相信结合自动动作和服务端动作,能让你的Odoo变得更贴心 :-)

March 11, 2016

先安科技Odoo 自动动作教程(一)自动动作基本设置

Odoo 自动动作提供了一个可以在界面配置的动作规则的引擎给最终用户,通过它我们可以做到很多平时只能通过代码来实现的功能,就像一个机器人管家帮我们管理系统。今天我们一起来看看通过它到底能做什么功能。

“自动发邮件提醒超过5天状态没有处理的线索”

base.action.rule.1

规则名字,名字最好是能自解释的。然后选择一个相关单据模型,例如我们的例子是线索,所以这里选择了“线索/商机”。

下一步就是选择条件,可以选择的条件有“创建时”,“更新时”,“创建或更新时”,“删除时”,“基于表单更改时”,“基于时间条件”。我们这里选择“基于时间条件”,同时界面下部的控件会发生变化,因为根据不同的条件,我们需要输入的参数也是不同的。

筛选器是指要对数据根据一定的规则先行过滤,例如这里判断一个没有处理我们可以根据线索/商机状态来决定。这里直接是写入了一个Domain,表达式:[('stage_id.sequence', '=', 1)],他的意思是所有阶段对应的序列值为1的线索。当然了如果不熟悉些domain的可以用“Change Selection”按钮来在列表视图筛选出来所要的数据或者用“在搜索过滤设置一个选择”里选择一个已经设置好的筛选条件,这两种办法都会自动生成一个Domain。(关于Domain的写法我们以后专门会介绍或者可以先看看我们网站的博客:http://cn.openerp.cn/record_rule/)

触发日期,这里就是以线索中哪个日期字段作为触发本规则的日期。这里选“创建日期”,就是以创建日期为触发日期。

触发日期后的延迟,触发日期前(后)过多久才执行动作,可以填入负数表示提前。这里我们填“5”,结合上面一条整个条件就是触发时间为“创建日期后5天”。

使用日历,可以选择根据工作日历来判断时间,例如:如果需要考虑放假,工作天等,就可以在这里选择日历。

整个筛选条件就是“[('stage_id.sequence', '=', 1)]” 而且当前时间等于“创建日期后5天”的所有线索,有了这些线索就应该对这些线索进行对应的操作了。

接下来设置动作,这次动作还是比较简单就是提醒用户。动作类型是发邮件,选择好邮件模版,这个自动规则就好了。从此不用再担心线索被冷落了 :-)

P.S

本例子是Odoo测试数据,大家可以自己进入系统练习下。

关于邮件模版的设置可以看上篇消息。

January 26, 2016

海飞[转载]Odoo树形表单中的对齐方式

原文地址:Odoo树形表单中的对齐方式作者:
Odoo树形表单中的对齐方式是: 字符型字段靠左对齐, 数字型字段靠右对齐。
 
在有些情况下, 我们可能需要将数字对齐方式改为居中对齐。 只需两步操作就可以达到这个目的。
 
第一步, 修改tree view, 在<tree ...后增加 class="自己的class名" 和version="7.0" 
第二步, 在css文件中增加 .openerp  .自己的class名.oe_list_content td.oe_number, 并在其中设置
            text-align:center !important;
注意css文件的位置, 应当由__openerp__.py文件的css指定。 
 
我们以午餐模块的产品为例,做进一步解释。其tree view的原定义为
 
<?xml version="1.0"?>
<tree string="Products Tree">
     <field name="name"/>
     <field name="category_id"/>
     <field name="supplier"/>
     <field name="description"/>
     <field name="price"/>
</tree> 
 
我们将自己的class命名为 hello_kitty, 修改后的tree view就成了这个样子:
 
<?xml version="1.0"?>
<tree string="Products Tree" version="7.0" class="hello_kitty">
     <field name="name"/>
     <field name="category_id"/>
     <field name="supplier"/>
     <field name="description"/>
     <field name="price"/>
</tree> 
 
午餐模块在__openerp__.py中已经定义了已经有了一个css文件:
 
'css':['static/src/css/lunch.css'],
 
 
我们直接在 static/src/css/lunch.css文件的末尾增加如下内容:
 
 
.openerp  .hello_kitty .oe_list_content td.oe_number {
   text-align:center !important;
}
 
保存一下lunch.css文件,重新刷新一下浏览器页面,就可看到效果。

 

January 20, 2016

先安科技Odoo的自动添加关注者机制(auto subscribe)

在Odoo里,如果我们一个模型是继承了odoo的消息(mail.thread)模型,就可以对于这个模型使用Odoo的消息系统。直观来说就是可以在这个模型的对应界面里看到最底下的消息框,以及关注这个纪录的关注者。

这里我们以销售订单(sale.order)为例子,如果我们有这样的业务场景,我们公司有个多个销售团队,每个销售团队有对应的主管人员,那么我们如果做到,自动把管理人员自动添加到销售团队的订单的关注者列表。

我们可以通过子类型(mail.message.subtype)来实现这一需求。

首先子类型是一个消息的分组,我们可以通过在代码里面配置子类型触发的条件,每个关注者可以对应每个具体的单据来勾选他们所关注的子类型,如果该单据有该子类型的消息,odoo会通过内置消息系统/邮件来通知关注了该子类型的关注者。

subtype-1子类型的配置菜单(设置/技术/邮件/子类型),打开其中一个子类型,例如:模型是crm.team,名字为“销售订单已经确认”的子类型,模型:销售团队(crm.team)表示是这是一个定义在销售团队的子类型,右边的自动订阅下有2个字段:父级关联字段:

父级:销售订单已经确认 | 关联字段:team_id

subtype-2

这里的父级:“销售团队已经确认”是定义在销售订单上的子类型,关联字段是销售订单里保存销售团队的字段名。这里配置了的作用是:当销售订单创建的时候会通过订单上的销售团队找到关注他们的销售团队所有关注者,添加到当前订单的关注者列表里。

具体实现流程是:系统会监测新建的纪录对应模型所有的子类型“销售订单已经确认”,然后再搜索以该子类型作为父级的子类型:销售团队的“销售订单已经确认”,再通过关联字段“team_id”来确定他们的直接联系,找到对应的销售团队纪录并且把关联该销售团队的关注者添加到销售订单的关注者列表里。

在Odoo的默认子类型里又不少的是已经帮我们配置好自动关注的:

销售团队 -> 线索,项目任务 -> 项目

大家赶快来试试吧:-)

 

January 08, 2016

先安科技通过自动动作引擎(Automated Actions)让你的Odoo更聪明

Odoo的自动动作引擎(model:base.action.rule)是一个可以在界面定制的触发器,通过它我们可以便捷定义业务规则。在Odoo V9里,自动规则引擎又添加了两个新触发条件:On Deletion / Base on Form Modification,on change也可以在这里定义了!

现在我们来重温下怎么使用自动动作引擎吧:

Rule Name:规则名字,建议把他的作用直接写到名字上。

Related Document Model:规则监听的对象。例如对线索商机做的规则,这里选 Lead/Opportunity

When to Run:  触发条件

  1. On Creation:创建时触发。
  2. On Update:更新时触发。
  3. On Creation & Update: 创建和更新时触发
  4. On Deletion:删除的时候执行
  5. Based on Form Modification:界面数据修改触发,还可以通过设置On Change Fields Trigger特定的监听字段
  6. Based on Timed Condition:根据时间条件触发,可以根据监听对象的时间字段结合工作日历来作为判断条件。

Filter:过滤规则,在V9里面这里可以有2种的过滤类型,1、直接在 Change Selection 里选择需要监听的数据,系统会自动帮你创建规则在旁边的输入框内。2、直接选择过滤器(ir.filter)

我们可以通过自动动作做哪些动作呢?

Set Responsible:设置负责人(user_id)

Add Followers:添加关注者

Server action to run:添加服务器动作(发邮件,更新数据,触发工作流……)。

 

 

December 01, 2015

Simon537[原]Discuz!中文验证码设置

测试环境:Discuz! X3.2 + Ubuntu14.04

验证码是Discuz!防灌水机制的一部分,可设置在注册、登录、发帖等情况下启用验证码,以减少灌水行为或网络爬虫的恶意攻击。Discuz!中默认使用英文图片验证码,这种验证码已多有破解,而中文的破解难度相对大一些,因此使用中文验证码更为有效。本文简述如何在Discuz!中启用中文验证码。

首先,使用管理员用户登录管理中心,点击菜单【防灌水 ->验证设置】,在验证码设置一栏,将验证码类型设为“中文图片验证码”,然后点击提交。

i

图1 验证码设置

如果之前未设置中文字体,则会收到提示信息:验证码缺少显示所需的字体文件,请上传字体文件至 static/image/seccode/font/ch/ 目录。解决方法如下:

sudo apt-get install ttf-wqy-zenhei  #1. 安装中文字体,此处安装的是文泉驿字体
cd /usr/share/fonts/truetype/wqy  #2. 切换到字体目录
cp * /var/www/html/odoo/static/image/seccode/font/ch  #3. 将字体拷贝至Discuz!对应的字体目录

这几条命令执行完毕后,中文验证码就生效了。这时登录,可以看到验证码已显示为中文。


图2 验证码显示

作者:wangnan537 发表于2015/9/30 23:34:31 原文链接
阅读:94 评论:0 查看评论

Simon537[原]Odoo(OpenERP)学习资源

Odoo官方

Odoo官网 https://www.odoo.com/
Odoo源码 https://github.com/odoo/odoo
Odoo官方论坛 https://www.odoo.com/forum/help-1

Odoo中文论坛

Odoo(前OpenERP)中文社区 http://www.shine-it.net/
Odoo中文网 | Odoo中国社区 http://www.chinaodoo.net/

Odoo应用/开发/实施交流QQ群

OpenERP-应用 212904
OpenERP-开发 69195329
Odoo(OpenERP)实施 446389096

Odoo实施微信公众号

公众号 OdooApp


Odoo应用入门

Working with OpenERP》 出版日期:2013-11-25亚马逊链接
《Working with Odoo》 出版日期:2015-08-27 亚马逊链接

 

Odoo开发入门

《Odoo Development Essentials》 出版日期:2015-04-06 亚马逊链接


作者:wangnan537 发表于2015/9/1 21:19:21 原文链接
阅读:406 评论:0 查看评论

November 01, 2015

Simon537[原]Ubuntu14.04下安装Discuz!小记

前置条件:事先搭建好LAMP环境。

1.下载Discuz!
下载Discuz!包
wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
解压到当前目录
unzip Discuz_X3.2_SC_UTF8.zip
拷贝到Apache根目录下
cd /var/www/html
mkdir odoo
cp -r /wn/upload/* /var/www/html/odoo

2.准备DB
登录MySQL数据库:mysql -u root -p,为Discuz!创建专用DB及用户,
mysql> CREATE DATABASE discuz;
mysql> CREATE USER duser@localhost IDENTIFIED BY 'dpass';
mysql> GRANT all privileges on discuz.* TO duser@localhost;
mysql> FLUSH PRIVILEGES;
mysql> exit

3.安装Discuz!
安装前需要设置目录权限。安装过程则非常简单,没有特别需要注意的地方。目录权限设置如下:
chmod 777 /var/www/html/discuz/config
chmod -R 777 /var/www/html/discuz/data
chmod -R 777 /var/www/html/discuz/uc_client
chmod -R 777 /var/www/html/discuz/uc_server

作者:wangnan537 发表于2015/8/23 0:38:44 原文链接
阅读:435 评论:0 查看评论

Simon537[原]Odoo(OpenERP)开发实践:数据模型学习

作者:苏州-微尘

Odoo中,在Python类里定义的模型及字段信息,可在系统中直接查看。为用户开启技术特性权限后,即可通过菜单 [设置->技术->数据结构->模型] 进入列表视图,点击列表中的任一模型,进入表单视图,可看到该模型的详细信息。


图1 数据模型

主要字段说明说下,
模型:即模型的名称,由Python类的_name属性指定。它通常对应Postgresql数据库中的一张表。以sale.orer为例,其对应的表为sale_order。
类型:类型包括两种 - 基础对象/自定义对象。通过代码创建的模型,其类型为基础对象;通过web页面创建的模型,其类型为自定义对象。
在模块中:指该模型由哪些模块创建/扩展,一个模型在一个class中创建,并可由多个class扩展。
瞬态模型:Odoo中的Python class通常继承的是models.Model,对应数据中的普通表;如果继承自models.TransientModel,则是瞬态模型,并对应数据库中的临时表。

在表单视图下方可以看到其他信息,
字段页面显示该模型的字段信息,也可在此页面修改、删除、新增字段。
访问权限页面显示哪些用户组拥有哪些操作权限(CRUD),可在此页面修改、删除、新增访问权限。
视图页面显示哪些视图使用了此模型,并列出视图的名称、类型、外部标识等信息。

作者:wangnan537 发表于2015/8/7 22:47:44 原文链接
阅读:460 评论:0 查看评论

Simon537[原]Odoo(OpenERP)开发实践:通过XML-RPC接口访问Odoo数据库

Odoo(OpenERP)服务器支持通过XML-RPC接口访问、操作数据库,基于此可实现与其他系统的交互与集成。
本文是使用Java通过XMLRPC接口操作Odoo数据库的简单示例。本例引用的jar包包括xmlrpc-common-3.1.3.jar, xmlrpc-client-3.1.3.jar和ws-commons-util-1.0.2.jar,如需要,可点击这里下载。

package memo.by.weichen;

import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

/**
 * 
 * 通过XML-RPC接口访问Odoo数据库
 * Test@Odoo 8.0
 * by WeiChen
 *
 */
public class OdooWSDemo {
	public static final String URL = "http://127.0.0.1:8069";
	public static final String DB = "demo";
	public static final int USERID = 1;
	public static final String PASS = "demo";
	
	public static void main(String[] args) throws Exception{
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		XmlRpcClient client = new XmlRpcClient();
		config.setServerURL(new URL(String.format("%s/xmlrpc/2/object", URL)));
		client.setConfig(config);
		
		// 新建客户
		Integer id = (Integer) client.execute(
				"execute_kw", Arrays.asList(
						DB, USERID, PASS, "res.partner", "create",
						Arrays.asList(new HashMap() {
							{
								put("name", "苏州园区永旺梦乐城");
								put("customer", Boolean.TRUE);
							}
						})));
		// 更新客户
		client.execute("execute_kw", Arrays.asList(
				DB, USERID, PASS,
			    "res.partner", "write",
			    Arrays.asList(
			    	Arrays.asList(id),
			        new HashMap() {{ put("name", "永旺梦乐城苏州园区店"); }}
			    )
			));
		// 查找客户
		List<Object> partners = Arrays.asList((Object[])client.execute("execute_kw", Arrays.asList(
				DB, USERID, PASS,
			    "res.partner", "name_get",
			    Arrays.asList(Arrays.asList(id))
			)));
		if(partners!=null&&partners.size()>0){// partners格式: [[id, name]]
			Object[] partner = (Object[])partners.get(0);
			if(partner.length==2)
			System.out.println("客户名: "+partner[1]);
		}
		// 删除客户
		client.execute("execute_kw", Arrays.asList(
				DB, USERID, PASS,
			    "res.partner", "unlink",
			    Arrays.asList(Arrays.asList(id))));
		
		// 客户列表
		List<Object> customers = Arrays.asList((Object[]) client.execute(
				"execute_kw", Arrays.asList(
						DB, USERID, PASS, "res.partner", "search_read",
						Arrays.asList(Arrays.asList(
								// 设置查询条件
								// Arrays.asList("is_company", "=", true),
								Arrays.asList("customer", "=", true))),
						new HashMap() {
							{// 查询name字段, 限定最多返回100条记录
								put("fields", Arrays.asList("name"));
								put("limit", 100);
							}
						})));
		
		System.out.println("**********客户列表**********");
		for (int i=0;i<customers.size();i++){
			Map customer = (Map)customers.get(i);
			String name = (String)customer.get("name");
			System.out.println(name);
		}
		System.out.println("****************************");
	}
}
参考资料:

[1] https://www.odoo.com/documentation/8.0/api_integration.html

作者:wangnan537 发表于2015/8/1 23:05:23 原文链接
阅读:500 评论:0 查看评论

Simon537[原]PostgreSQL常用函数

|| 字符串拼接
语法
string || string
示例
'Post' || 'greSQL' -- 返回PostgreSQL

length() 字符串的长度
语法
length(string)
示例
length('Odoo') -- 返回4

LIKE 模式匹配
语法
string LIKE pattern
示例
’abc’ LIKE ’abc’ -- 返回true
’abc’ LIKE ’a%’ -- 返回true

to_char() 把时间戳转换成字符串
语法
to_char(timestamp, text)
示例
to_char(create_date, 'YYYY/MM/DD')
to_char(create_date, ’HH12:MI:SS’)

to_date() 把字符串转换成日期
语法
to_date(text, text)
示例
to_date(’05 Jan 2015’,’DD Mon YYYY’)

to_timestamp() 把字符串转换成时间戳
语法
to_timestamp(text, text)
示例
to_timestamp(’05 Jan 2015’, ’DD Mon YYYY’)

CASE 条件表达式, 类似于其他编程语言中的if/else
语法1
CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
示例1
CASE WHEN gender='male' THEN '程序猿' ELSE '程序媛' END
语法2(简化形式)
CASE expression WHEN value THEN result [WHEN ...] [ELSE result] END
示例2
CASE gender WHEN 'male' THEN '程序猿' ELSE '程序媛' END

COALESCE() 返回第一个非NULL的参数,所有参数均为NULL时则返回NULL
语法
COALESCE(value [, ...])
示例
COALESCE(actual_qty,0) as actual_qty

NULLIF() 如果value1与value2相等则返回NULL, 否则返回value1
语法
NULLIF(value1, value2)
示例
NULLIF(value, ’(none)’)

ascii() 将参数的第一个字符转换为ASCII码
语法
ascii(string)
示例
ascii(’x’) -- 返回120

chr() 将ASCII码转换为字符
语法
chr(int)
示例
chr(65) -- 返回A
作者:wangnan537 发表于2015/7/29 23:59:20 原文链接
阅读:238 评论:0 查看评论

Simon537[原]Odoo(OpenERP)应用实践:代发货管理

有些分销商,在买家下单后才向供应商采购产品,并由供应商直接发货给客户。这种模式可为公司省去囤货成本,非常适用于销售单价较高而订单量不大的产品。Odoo中的Drop Shipping (可译作直运、代发货、转运配送) 模块,正是针对这种业务场景而设计。

本文对此模块作简要说明。

1. 模块安装

可通过两种方式安装stock_dropshipping模块:
(1)通过菜单 [设置->模块->本地模块],搜索stock_dropshipping模块并点击安装
(2)通过菜单 [设置->设置->采购],在物流路线中勾选"管理直运"并保存后,系统会自动安装stock_dropshipping模块

图1 stock_dropshipping模块

安装此模块时,系统会新建一个名为"直运"的操作类型,其默认的源库位为供应商,目标库位为客户,同时创建路线Drop Shipping,此路线有一个从客户到供应商的拉式流。

图2 操作类型-直运

2. 设置

(1) 销售特性设置 - 点击菜单 [设置->设置->销售],在销售特性中勾选"在销售订单行上选择“按订单补货”、“直运”..."

(2) 产品设置 - 对于由供应商代发货的产品,需要在产品的路线中勾选"Make To Order",并设定产品的供应商

3. 测试

新建报价单,在订单行中,将路线设为"Drop Shipping",

图3 报价单

点击确认订单后,系统会自动生成采购询价单。在询价单中点击确认订单,询价单会转为采购订单,同时系统自动生成直运单。

图4 采购单

点击入库按钮,查看直运单:

图5 直运单

在销售订单中点击查看发货单,可以发现订单关联的是同一张直运单。
收到供应商的发货通知后,在直运单中点击移动,完成出货动作。接下来的开票、收款、付款流程与常规的进销存流程并无二致,不再赘述。

作者:wangnan537 发表于2015/7/27 22:05:29 原文链接
阅读:460 评论:0 查看评论

Simon537[原]Odoo(OpenERP)实施方法论

作者:苏州-微尘

Odoo(OpenERP)的成功实施,离不开供需双方实施团队的通力合作,而好的规划更是顺利上线的关键所在。ERP系统涵盖的内容有很多,一个环节没有做好,也会影响到整个项目的有效推进。本文主要概述Odoo实施过程的不同阶段的一些关注点,涉及的角色包括实施方和客户方,仅作参考。

1. 可行性研究
企业在进行ERP选型时,需要明确:期望借助ERP系统解决哪些业务痛点?Odoo标准版的功能与公司业务流程的契合度有多高?如果认可标准版的设计思路,觉得可用性强,或是加上一些功能定制即可满足应用需求,那么就可以考虑立项事宜了。

2. 需求分析与计划制定
梳理现有的业务流程,分析哪些是Odoo的标准流程,哪些是非标流程;哪些非标流程可以在Odoo中通过定制开发实现,哪些非标流程应该抛弃。实施ERP应该将业务流程尽量标准化,全盘保留所有的非标流程无法解放生产力,抱残守缺终究难见成效。

3. 定制开发与测试
定制开发主要包括界面定制、工作流定制、报表定制。Odoo优雅的底层架构足以实现程序的敏捷开发,为确保开发工作全程可控,定制开发应该遵循迭代开发、增量交付的原则。交付前的测试,各角色用户应该充分参与。

4. 系统部署与基础数据录入
根据企业的实际情况,选择合适的部署方案: SAAS/供应商托管/内部部署。安装软件系统,进行初始化设置,录入基础数据,包括:用户、业务伙伴、产品、BOM、最小库存规则、盘点单、期初凭证等。应该通过模板导入大量的数据。

5. 系统上线
上线前要编制正式版用户手册,并对各部门用户进行集中培训。可设定模拟上线期,在此过渡期间,线上线下两套账并行,这样有助于发现前期测试的疏漏点,并及时完善。问题解决后正式投产,告别手工帐。

6. 支持与维护
要及时响应用户使用过程中遇到的问题,定期备份数据,维护服务器正常运行,进行必要的性能调优,防止宕机事故。Odoo新版本发布时是否跟进升级,应该坚持一个原则:如果程序一直运行正常,不应盲目追新;如果想应用新版本的某些功能,可以考虑升级,但升级前必须先在测试服务器进行详尽的测试。

关于项目后期实施的一些总结,请参阅早前的博客:ERP项目实施成败关键点

作者:wangnan537 发表于2015/7/10 0:08:54 原文链接
阅读:1129 评论:1 查看评论

Simon537[原]Odoo进销存(采购、销售、仓库)入门教程 - 下

2. 进销存实务

2.1 销售产品

李逍遥接到客户苏州美尚邻里超市购买10只乐扣乐扣拉杆箱的请求后,登录系统,点击菜单 [销售->销售->报价单],点击新建,将客户设为“苏州美尚邻里超市”,在订单明细选项卡点击添加一个项目,产品设为“乐扣乐扣拉杆箱”,数量设为10,此时会提示没足够的库存,这是因为仓库中并没有存货(如果产品的路线已勾选Make To Order的话,则没有此提示),关闭此提示,其余信息保留默认设置,然后点击保存


图2.1 销售报价单

将报价单发给客户(可通过系统发送,也可打印为PDF后另行通过邮件发送),客户确认报价单后,点击确认订单,此时报价单转化成销售订单,系统会自动生成发货单,同时销售订单状态变为待开票。
点击查看发货单,可以看到发货单状态为“待出库方确认”,点击检查可用,发货单仍停留在此状态,表明库存不足。
点击生成发票,在弹出窗口选择“为整个销售订单开票”,然后点击创建和查看发票,此时生成内部发票,状态为“草稿”。生成的内部发票,会计人员可以通过菜单 [会计->客户->客户发票]来查询。
至此,销售前期工作完成,接下来需要采购产品入库再安排送货。

2.2 采购补货

此处使用由系统生成询价单的方式,当然也可由采购人员手工创建询价单。
我们在先前的步骤中已设置了产品的再订货规则,库管员登录系统,点击菜单 [仓库->计划->运行排程],点击运行排程,系统会根据再订货规则和销售订单及库存情况自动生成采购询价单。
Tips: 在系统中设置好MRP计划的循环周期,系统会定期运行MRP生成采购询价单,我们这里采用手工运行排程的方式生成询价单。
采购人员宁采臣登录系统,点击菜单 [采购->采购->询价单],可看到已生成的采购询价单,点击打开,


图2.2 采购询价单

Tips: 产品中路线未勾选MTO时,要运行排程才能生成询价单(已在设置中勾选实时生成采购单,为何没有生效?),采购数量会考虑最小库存规则,本案例中生成的采购订单行数量为20只;勾选MTO时,采购数量不考虑最小库存规则,采购订单行数量为10只。
供应商确认询价单信息后,宁采臣点击确认订单,此时询价单转换成采购单,系统会自动生成入库单和内部发票,同时销售订单状态变为“采购单被确认”。
点击入库,可以看到入库单状态为“准备移动”。
点击收到的发票,可以看到发票的状态为“草稿”。生成的内部发票,会计人员可以通过菜单 [会计->供应商->供应商发票]来查询。
至此,采购前期工作完成,等待仓库收货。

2.3 产品入库

乐扣乐扣日用品(苏州)有限公司将货物送到仓库后,仓老师登录系统,点击菜单 [仓库->操作->全部操作],


图2.3 操作类型

点击上图箭头所示的位置,接着打开入库单,


图2.4 入库单

点击移动,在弹出框中确认货物信息后,点击应用,此时入库完成,入库单状态变为“已移动”。
入库单确认后,系统会自动生成会计分录,此时蔡文姬登录系统,点击菜单 [会计->会计分录->会计分录],可看到已生成的会计分录。


图2.5 入库会计分录

点击过账,将会计凭证过账。
Tips: 系统自动生成会计分录是基于我们之前所做的两个设置:(1)在仓库中,勾选了“存货变动自动生成会计分录”(2)在产品中,设置了库存核算为“实时(自动进行)”。

2.4 付款处理

蔡文姬收到乐扣乐扣日用品(苏州)有限公司开具的实际发票后,需要与系统中之前生成的供应商发票草稿进行核对。点击菜单 [会计->供应商->供应商发票],打开发票,点击记账,核准发票。


图2.6 核准供应商发票

发票核准后,系统会自动生成会计分录,状态为“已记账”。


图2.7 采购发票会计分录

公司同意付款后,蔡文姬在供应商发票中点击付款,在弹出的支付窗口中选择实际的付款方式(现金或银行分录),本案例选为“银行分录”,然后点击登记付款


图2.8 付款

付款后,系统会自动生成会计分录,点击过账,将会计凭证过账。


图2.9 付款会计分录

至此,供应商付款完毕,采购过程结束。 

2.5 产品出库

采购的拉杆箱入库后,仓老师点击出库单上的检查可用,因为已有充足的库存,此时出库单状态会变为“准备移动”。


图2.10 检查出库单

准备好送货后,点击移动,在弹出框中确认信息后,点击应用,此时出库完成,出库单状态变为“已移动”。
出库单确认后,系统会自动生成会计分录,此时蔡文姬登录系统,点击菜单 [会计->会计分录->会计分录],可看到已生成的会计分录,点击过账,将会计凭证过账。  

2.6 收款处理

仓库人员送货后,蔡文姬点击菜单 [会计->客户->客户发票],打开发票,点击记账,核准发票。发票核准后,系统会自动生成会计分录,状态为“已记账”。
蔡文姬收到客户货款后,在客户发票点击登记付款,选择实际的付款方式,然后点击登记付款,系统会自动生成会计分录,点击过账,将会计凭证过账。
至此,客户收款完毕,销售过程结束。

3. 结语

为了让初学者快速了解Odoo,本文对采购、销售、仓库、会计模块的介绍仅是泛泛而谈,以图管窥之效。
实际上,Odoo的功能远比文中提到的复杂、强大,企业的实际应用场景也灵活多变。如何最大限度的借助Odoo规范化业务流程,如何基于Odoo进行二次开发以满足企业非标流程,才是实施Odoo的着力点和方向。

4. 参考资料

[1]OpenERP实施记录http://www.cnblogs.com/eastson/archive/2013/06/10/3121314.html
[2]Odoo8.0初始化设置http://shine-it.net/index.php?topic=16538.msg28681

作者:wangnan537 发表于2015/6/12 20:18:56 原文链接
阅读:947 评论:0 查看评论

Simon537[原]Odoo进销存(采购、销售、仓库)入门教程 - 上

运行环境: Ubuntu14.04+Odoo8.0
作者:苏州-微尘

0. 前言

Odoo(OpenERP)作为一款优秀的开源ERP软件,开发历史已有10年之久。随着系统的发展成熟,已有越来越多的公司借助Odoo管理日常业务的方方面面。本文以一个贸易公司为例,讲述Odoo中最常用的进销存(采购、销售、仓库)模块的使用,对会计模块的简单操作亦有涉及。我们假定的业务场景如下:
苏州世纪圆融贸易有限公司,从乐扣乐扣日用品(苏州)有限公司采购乐扣乐扣拉杆箱,并销售给苏州美尚邻里超市。

1. 系统初始化

1.1建库及初始化设置

1.1.1 创建数据库

进入数据库管理页面,从左侧菜单选择新建

图1.1 新建数据库

Tips: 进入数据库管理页面有几种方式,如从Odoo登录页面点击Manage Databases,或在浏览器中直接输入数据库管理页面URL (http://localhost:8069/web/database/manager);而对于新搭建的server,输入http://localhost:8069后则会自动重定向到数据库管理页面。

在新建数据库页面,输入主控密码(即Odoo数据库管理员密码,默认为admin)、新数据库名称、新库中admin用户的密码,此处不装入演示数据,默认语言选择简体中文。输入完毕后,点击新建数据库。数据库创建成功后会以admin用户自动登录,界面如下:


图1.2 新库初始界面

1.1.2 设置管理员及公司

(1) 设置管理员用户

点击菜单 [用户->用户],然后在列表视图点击打开管理员(即Administrator)用户,点击编辑,在访问权限中勾选技术特性,勾选创建联系人,在首选项中选择时区为Asia/Shanghai,然后点击保存
勾选技术特性并保存后,刷新页面,在页面左侧会看到更多的菜单项,如下图所示:


图1.3 勾选技术特性后的管理员菜单

(2) 设置公司信息
点击菜单 [公司->公司],然后点击打开Your Company,点击编辑,将公司名称改为“苏州世纪圆融贸易有限公司”,在一般信息中填入地址、电话、传真等信息,添加银行账户;在设置中将会计币别改为CNY,然后点击保存

Tips: 应该提前设置好公司名称和会计币别,因为在安装会计、销售、采购、仓库等模块时,有一些初始化设置基于默认的公司名Your Company和默认的币别EUR,如果安装好模块后再修改的话,要更改的地方会有很多。

我们还可以对公司作更多的设置:
①设置公司Logo
点击下图箭头所指的位置上传公司的Logo,

图1.4 设置公司Logo

②设置本位币
对国内的公司而言,除了将会计币别设为CNY外,还应将其设置为本位币(本位币的汇率为1)。设置方法为:在公司信息编辑页面,点击设置选项卡中币别右侧的箭头,在弹出窗口中将汇率设置为1保存后,然后勾选基本并保存。

Tips:在Ubuntu环境下新建数据库时,如果默认语言设为简体中文,则默认的时间格式为%I:%M:%S%p,更改汇率时会有错误信息提示日期无效。解决方法为,点击菜单 [设置->翻译->语言],再点击打开简体中文,点击编辑,将时间格式改为%H:%M:%S(如有必要,此时也可将日期格式改为%Y/%m/%d以符合中文习惯),更改后,注销再重新登录,再次更改汇率即可。

③设置中文报表字体
在报表的结构选项卡中先点击重新加载字体以加载本地字体,如下图所示,

图1.5 加载字体

加载完成后,在字体下拉列表中选择DejaVu Sans,然后点击保存

1.2 安装必要的模块

点击菜单 [模块->本地模块],找到会计与财务(account_accountant)模块,点击安装

图1.6 安装会计与财务模块

安装过程中,设置会计数据时,注意将会计科目表设为“中国会计科目表”,科目一览表模板设为“中国会计科目表(财会[2006]3号《企业会计准则》)”,其余选项保持默认设置即可。然后依次安装销售管理(sale)模块、仓库管理(stock)模块、采购管理(purchase)模块。


图1.7 安装销售、仓库、采购模块

Tips: 模块安装完毕后,可能会有部分菜单仍显示为英文,此时需要加载中文翻译。点击菜单 [设置->翻译->加载翻译],在弹出窗口中语言设为简体中文,并勾选覆盖现有术语,点击加载。加载完成后,翻译仍未生效,这是因为界面显示仍使用服务器之前的缓存。要刷新缓存,有两种方法,一是重启服务器;二是更改当前登录用户的首选项,将语言改为English,再改回简体中文即可。

1.3 全局设置 

点击菜单 [设置->设置->销售],在开发票流程中勾选“基于销售订单行生成发票”;在客户特性中勾选“允许不同的发货和开票地址”;在产品特性中勾选“允许使用不同的计量单位”。
点击菜单 [设置->设置->仓库],在会计中勾选“存货变动自动生成会计分录”;在物流中勾选实时生成采购单。
点击菜单 [会计->设置->税->税],依次打开“增值税17%进项税”和“增值税17%销项税”,在税定义中勾选“含税价”。
点击菜单 [设置->技术->序号与标识符->序列],找到Sales Order并打开,设置数字位数为5。

1.4 基础数据准备

1.4.1 检查会计科目

在安装会计与财务模块时,我们已将会计科目表设为“中国会计科目表”,它包含了适用于国内企业大多数情况的会计科目。点击菜单 [会计->设置->科目->科目],确保下述这些科目都已存在,以供本案例使用: 


表1.1 会计科目

Tips: 安装中国会计科目表时默认的会计科目长度为4,实际应用时科目长度可能不够用,需要手工新建会计科目。注意,只能选择视图作为上级科目;如新建科目时若想选择1122作为上级科目,则需要先把1122的内部类型更改为“视图”。

1.4.2 用户与权限

初学Odoo时为快速上手,可使用管理员用户做所有操作。但是为了更好的理解进销存及用户的角色,这里我们针对每个模块设1个用户。点击菜单 [设置->用户->用户],新建如下用户:


表1.2 用户与角色

分角色操作需要新增如下两组权限。产品的路线中勾选MTO时,销售人员确认订单需要第1组权限;会计核准供应商发票时需要第2组权限。点击菜单 [设置->技术->安全设定->访问控制列表],新建如下记录:


图1.8 访问控制列表

1.4.3 新建客户和供应商

(1) 新建客户

销售人员李逍遥登录系统,点击菜单 [销售->销售->客户],点击新建,输入客户名称“苏州美尚邻里超市”,勾选“是一个公司”,输入地址、电话等信息,在联系人一栏点击新建,输入联系人名称张三,地址类型设为发票,然后点击保存并关闭;在销售与采购选项卡一栏,默认已勾选客户,点击保存


图1.9 新建客户

Tips: 联系人的地址类型包括:默认、发货、发票、联系人、其他。默认,指当没有其他地址时使用的地址;发票,指系统生成发票时使用的地址;发货,指系统生成发货单时使用的地址;联系人,指与客户方联系时的接头人。

(2) 新建供应商
采购人员宁采臣登录系统,点击菜单 [采购->采购->供应商],点击新建,输入供应商名称“乐扣乐扣日用品(苏州)有限公司”,勾选“是一个公司”,输入地址、电话等信息,在联系人一栏点击新建,输入联系人名称李四,地址类型设为联系人,然后点击保存并关闭;在销售与采购选项卡一栏,默认已勾选供应商,点击保存


图1.10 新建供应商

1.4.4 新建产品分类

管理员登陆系统,点击菜单 [仓库->设置->产品->产品分类],点击新建,新建产品分类“拉杆箱”,上级类别设为“全部/可销售”,收入科目设为6001、费用科目设为1401、入库科目设为1402、出库科目设为6401、库存核算科目设为1406
Tips: 科目信息可在产品中也可在产品分类中设置,且前者的优先级大于后者,本案例在产品分类中设置。 
Tips: Odoo中产品分类默认由管理员管理,仓库主管、销售经理、采购经理默认都看不到产品分类菜单,若想操作产品分类需添加相应菜单。

1.4.5 新建产品

仓管员仓老师登录系统,点击菜单 [仓库->设置->计量单位],点击新建,新建拉杆箱的计量单位“只”:


图1.11 新建计量单位

点击菜单 [仓库->产品->产品],点击新建,输入产品名称“乐扣乐扣拉杆箱”,勾选“可销售”、“可采购”,上传产品图片。
在信息选项卡,产品类型设为“库存商品”,计量单位设为“只”,销售价格设为300;
在补货选项卡,成本价设为180,路线设为“Buy”(本案例中不勾选“Make To Order”),将乐扣乐扣日用品(苏州)有限公司添加为该产品的供应商;
在会计选项卡,内部分类设为“全部/可销售/拉杆箱”, 库存核算设为“实时(自动进行)”。


图1.12 新建产品

1.4.6 新建再订货规则

仓管员在产品的表单视图中点击再订货规则,然后点击新建,设置采购的最小数量为10,点击保存


图1.13 新建再订货规则

作者:wangnan537 发表于2015/6/10 0:50:16 原文链接
阅读:2127 评论:0 查看评论

Simon537[原]解决登录Odoo(OpenERP)时的Postgresql数据库编码错误

问题场景:
客户无法登陆OpenERP,报错信息为,
......
DataError: character 0xc2a9 of encoding "UTF8" has no equivalent in "GBK"

问题分析:
此问题显然是字符集编码问题, 从字面意思来看,某个UTF8编码的字符无法在GBK编码字符集中找到。

问题解决:
经查,发现数据库配置文件postgresql.conf被改动!在该文件中找到这么一行,
client_encoding = GBK
此处使得客户端编码被设置为GBK,而原数据库是UTF8编码的,则使用GBK编码方式连接数据库时,库中的一些字符可能就无法正确解析。将其改为UTF8后,再重启数据库和OpenERP,问题解决!
client_encoding = UTF8
作者:wangnan537 发表于2015/5/22 22:45:01 原文链接
阅读:388 评论:1 查看评论

Simon537[原]Odoo中自动备份数据库

本文地址: http://blog.csdn.net/wangnan537/article/details/45016965
测试环境: Ubuntu14.04+Odoo8.0

一个优雅的生产系统,数据库的自动备份是必备条件之一。Odoo社区模块中,就有这么一个很好很强大的工具可实现此需求,它的强大之处在于,不仅能自动备份,还可设置多少天后删除备份、备份到外部SFTP服务器、FTP备份失败后发送邮件通知。
请问这么好的模块在哪里才能下载到呢?地址就在: https://github.com/Yenthe666/auto_backup#8.0 下文作简要说明。
先决条件:
此模块依赖Python的pysftp库,运行命令sudo pip install pysftp安装pysftp库。

下载并安装auto_backup模块后,有两处需要设置:
1. 设置存放位置
点击菜单 [设置->设置->Configure Backup],点击新建,输入相应信息后点击保存。
 

图1. Configure Backup

2. 设置备份频度
点击菜单 [设置->技术->自动化->计划的动作],可看到安装该模块时已创建了Backup Scheduler,点击进入表单视图,然后点击编辑,设置间隔时间、间隔单位等信息后点击保存。
 

图2. Backup Scheduler

设置完毕后,如成功备份,会在设置的目录下生成dump文件。
作者:wangnan537 发表于2015/4/13 0:55:15 原文链接
阅读:1331 评论:0 查看评论

Simon537[译]Odoo(OpenERP)与SAP的对比

译者: 苏州-微尘
英文地址: http://sapficonsultant.com/odoo-openerp-vs-sap/
译文地址: http://blog.csdn.net/wangnan537/article/details/44987547

(微尘注)
Odoo与SAP,前者是开源ERP领域的翘楚,后者是ERP行业的执牛耳者。两者常被Odoo从业人员拿来作比较,言谈间大有舍Odoo其谁、欲与SAP一较高下之势。本文的作者是专业的财务人士,有Odoo实施经验,后来转做SAP顾问。作者从5个方面比较了两者的异同。虽然有些观点不敢苟同,但个别看法却是一针见血。站在自己的角度看问题,往往厚此薄彼,但保持谨慎的乐观尤为重要。
Odoo(OpenERP)的创始人Fabien Pinckaers对二者作过简要概括: SAP是领导者,Odoo是挑战者。SAP有更好的品牌和生态链,Odoo有更优的产品和价格。[1] 这两句话可以看作是Odoo的定位与目标。

----------正文分割线----------

作为一家Odoo(OpenERP)实施公司的前雇员,我对其有所了解,可能我是为数不多的既有Odoo又有SAP从业经验的人。老实说,大约一年半以前我喜欢上了OpenERP。起初惊为天人,现在看来则更有吸引力。有很多功能会让每个人为之心动;它简单易用,而且在大部分情况下、与多数业务解决方案相比,终端用户所需的必要培训更少。

在SAP小幅度增长的同时,Odoo正在赢得粉丝,这是开源项目关键的成功因素。也许你在想,为什么我离开Odoo的环境,投身于感觉又老又丑、学习曲线陡峭的SAP。主要原因在于:Odoo开箱即用的功能有限、bug、像我这样财经专业的行家里手无用武之地。关于两者的比较,我来表达下我的一些想法。


(1) 开箱即用的功能

在SAP商业套件的背后是7千多万行代码;根据Odoo开放日(2014)的数据,Odoo有15万行代码。一个有趣且并不那么广为人知的的事实是,SAP商业套件也有开源的代码,这意味着在自负风险的情况下,你可以更改核心应用程序。这也意味着如果你不喜欢你的顾问,你可以换掉他,而不会丢失定制开发的源码。

说到功能,在我11个月的Odoo顾问生涯中,我和几个客户有过不愉快的经历。在仓库、生产、采购、销售模块,有很多流程不通过二开无法实现。我不会谈论会计模块,因为基于我在财务和管理会计方面的经验,它和我的期望值相去甚远。会计将是Odoo 9.0版本最大的项目之一, 所以这里可能我们可能会看到一些改进。

比较SAP商业套件与Odoo并不是一个好主意,因为他们面向的是不同类型的客户。商业套件面向诸如财富500强这类的大公司,而Odoo面向中小型企业。在中小企业市场,SAP有其他产品具有很强的竞争力,这就是SAP Business ByDesign。这是个云解决方案,价格非常合理、功能丰富,同时有大量的工具用于快速有效的部署。

(2) 向下兼容性

有个关键之处是SAP胜出而Odoo让人失望的,尤其对大公司而言--向下兼容性。SAP和他们产品的维护和开发,向下兼容性一直牢记于心。商业套件中有许多代码已有二十多年历史,还能与新版本完美结合。Odoo却非如此,每一个新版本都意味着代码和数据的迁移。如果你使用开箱即用的功能,你肯定要签订Odoo企业维护合同,此合同将包括bug修复和新版本迁移。

如果你要定制开发,这将是个非常痛苦的任务。不止是说咨询和重组工程的IT成本,还包括要测试迁移功能的员工的大量工作。众所周知,不管你在测试环境付出多大的努力,多数情况下你还是会在生产系统发现错误,因为生产系统总是最好的测试环境。

我的观点是,当你选择Odoo而不是其他业务解决方案供应商时,应该总是牢记维护这个系统需要多少成本。要非常注意的是,大部分成本隐藏或包含在你支付的员工工时中。

(3) 标价

Odoo云解决方案,每用户/应用需花费12欧元。这意味着如果你使用销售、营销、会计、项目、采购、仓库、生产和人力资源,每用户需花费96欧元每月或1152欧元每年。据我所知,如需要Odoo企业合同,同样的定价适用于自部署的方案;否则,你需要有很好的技术顾问并为之支付类似的费用。

正如前面提到的,SAP Business ByDesign是云解决方案,有极具竞争力的价格,从10欧元(自服务的用户)到179欧元每人月不等。最昂贵的用户费用可能只有几个员工需要。ByDesign需要你最低用10个组用户或企业用户。每个组用户要花费79欧元,每月最低花费大概在800欧元。

就定价而言,Odoo给小型企业提供了更便宜的选择,甚至2个用户可免费访问云解决方案。一个关键的事实是,在他们的云上并不接受定制的代码。这意味着如果你需要定制开发(我认为这很有可能),你得用自己或Odoo合作伙伴的自部署方案。如果你有超过10个用户,从长远来看哪种方案花费更少很难定论,特别是在考虑自己公司参与的情况下。

(4) Bug

在OpenERP6.1和7.0的发布版中,bug是个大问题,有大量的bug妨碍了软件的投产使用。去年它确实困扰着我和我负责的客户。从接下来的版本8开始,这个问题会越来越缓解,因为每个新的核心功能将首先发布到云平台,在这里客户会进行额外的测试。我希望这是一个好的转变,因为一些风险在云端客户(会更快发现、更快修复--微尘注)。
相比较而言,SAP解决方案成熟得多,向后兼容性肯定会帮助你避免很多问题。当然,SAP也会有bug,但这些多半是次要的问题,不会将你的业务置于危险的境地。

(5) 业务经验丰富的顾问

Odoo仍不成熟,具有某一领域业务背景的资深顾问一将难求。大多数Odoo顾问是泛泛的专家,为所有模块(可能不包括会计)提供咨询。业务人员中,财务顾问的机会是有限的,能从Odoo中得到的收益对他们没有吸引力。原因很简单,Odoo的客户多是5到20人的公司,无需高级的行业知识、不需要收入预期很高的资深专业人士。
不管怎样,众所周知的是,Odoo由感觉良好的IT极客引领。对他们而言,机会完美。处在Odoo的成熟阶段,他们的技能可被大为赏识。在某些情况下你可能会看到,软件工程师试图让你相信他们精于业务咨询。

结语

Odoo作为非常有吸引力的解决方案,很适合一些公司。如果开箱即用的功能满足你的需求,那就放手去做吧!可能你将会非常满意。但记住,闪亮的表面背后,实施之路可能很不愉快。定制开发要非常小心,从长远来看它会让你花费很多。客观而论,和别的软件实施成本差不多。要求演示,你可以准确的看到你的业务流程是什么样子。你也应该要求灾难恢复计划,因为一旦你意识到你高度依赖于你的ERP解决方案,就会明白这非常重要。

注:
[1]http://www.quora.com/OdooApps/What-is-the-exact-comparison-between-SAP-OpenERP-will-OpenERP-suceed-where-SAP-failed

更新纪录:
2015-04-11  第一版
2015-07-31  第二版

  • 调整两处术语翻译
  • 更正一处翻译错误

附录:

----------群友观点----------

【大校】上海-开阖-Jeff(85822082) 13:52:49 
这篇文章写得很不错,翻译得也很棒,推荐阅读
【中校】南通-Lovebaby(529595602) 14:01:36 
@上海-开阖-Jeff 这个文章比较早期就看过,其实这个正是目前开源应用在落地的通病,特别是希望依附于开源实现增值来盈利的人或机构,走的痛苦。但是有时候开源就是这样,痛并快乐着,可能也是一种享受罢了。
【大校】上海-开阖-Jeff(85822082) 14:03:40 
自由是有代价的
【大校】重庆-mrshelly(49812643) 14:03:45 
文章中讲了 "成本相当"  可是没有数据支撑.
【中校】广西-jim(9885750) 14:03:52 
是的,大家都希望通过他来实现增值来盈利,否则谁有时间来搞.
【中校】南通-Lovebaby(529595602) 14:08:08 
而这也是很多人与原厂之间利益分配冲突的矛盾点,太多苦逼的开源应用倒闭了,少部分被招安封闭了,剩下有大公司罩着继续开源的,说白了就是给当小白鼠了。这也就决定了,要不我们自己强,利用基础做些有价值的东西,生存;要不,跟随吧,别骂娘了,没人疼;要不,继续流浪吧
【新兵】苏州远鼎-微尘(40299598) 14:33:12 
诸位讨论的很到位
【中校】南通-Lovebaby(529595602) 14:33:46 
双击查看原图
【新兵】苏州远鼎-微尘(40299598) 14:33:57 
晚上把讨论记录附到文后去

作者:wangnan537 发表于2015/4/11 0:34:58 原文链接
阅读:1913 评论:0 查看评论

Simon537[原]Odoo(OpenERP)开发实践:在QWeb报表中自定义页眉页脚

QWeb是Odoo中使用的首要模板引擎,它基于XML生成HTML片段或页面。我们知道在QWeb报表中,可调用report.external_layout或report.internal_layout模板,给报表加上系统预定义的页眉页脚,如下所示:
<t t-call="report.external_layout">
    <!-- your code fragments -->
</t>

但是在实际应用中,企业的每个单据页眉页脚有可能各不相同,这时就需要自定义以满足需求,如何实现呢?
其实很简单,在源码目录addons\report\views下的layouts.xml文件中,定义了report.external_layout和report.internal_layout模板,阅读代码可看出它使用<div class="header"></div>定义页眉,使用<div class="footer"></div>定义页脚,我们只要参照源码如法炮制,下面是一个简单的自定义页眉样例,嵌入报表开始处即可:
<div class="header">
    <div class="row">
        <div class='text-center' style="color:#808080">
            <span>苏州XXX公司销售合同</span>
        </div>
    </div>
    <div class="row zero_min_height">
        <div style="border-bottom: 1px solid black;"></div>
    </div>
</div>
作者:wangnan537 发表于2015/3/27 0:58:45 原文链接
阅读:1225 评论:0 查看评论

Simon537[原]Odoo 9.0特性

摘译自Odoo Help Forum上Odoo官方人士Yenthe对相关问题的答复,包括如下3点:
(原贴地址:https://www.odoo.com/forum/help-1/question/odoo-v9-features-81815)

1.主要路线图(main roadmap):
40% 可用性(usability)
20% 会计(Accounting)
20% 建站系统/电子商务(CMS/eCommerce)
10% 新设计(New design)
10% 框架(Framework)

Odoo9的预计发布日期为2015年6月

2.本身没有很多可用的特性但将有一个新的VoIP(在线语音)模块
译者注:
(1)在Odoo V8中已新增了im_chat模块, 用于用户间在线文字聊天, 目前尚不支持群聊;
(2)要新增的VoIP模块, 虽算不上新技术,但有了此功能绝对很赞,可通过系统给客户拨打电话、安排/管理通话.
经查, 这个VoIP模块(crm_voip: https://www.odoo.com/apps/modules/8.0/crm_voip/)已经并入Odoo V8, 但要收费, 官网标价为399欧元,
(3)不知新增的VoIP模块是否使用SIP协议或P2PSIP协议,目前SIP协议有成熟的Python库.

3.正如V8主要专注于重写仓库模块,V9将重写会计模块
作者:wangnan537 发表于2015/3/16 23:20:53 原文链接
阅读:3412 评论:1 查看评论

Simon537[原]Odoo(OpenERP)应用实践: 使用db-filter参数实现通过域名指定访问哪个数据库

我们知道在登录Odoo(OpenERP)时,如果当前系统中有多个数据库,需要先选择数据库再输入用户名、密码进行登录。但在实际应用中,终端用户只在意自己的用户名和密码,并不关注自己使用的是哪一个库;而且在部署SAAS应用时,我们可能并不想让客户看到其他人使用的库。这时可以使用db-filter参数实现此诉求。

db-filter,顾名思义,用于数据库过滤,使用格式为:--db-filter=<filter>,等号右侧是个正则表达式,说明如下:
%h 会被替换为请求的整个主机名
%d 会被替换为请求中除www以外的子域名(因此域odoo.com和www.odoo.com都将匹配odoo数据库)
(1)如果请求的URL为hostname.domainname.com,则%h对应hostname.domainname.com,%d对应hostname。
(2)等号右侧可使用'%d'、'^%d'或者'^%d$'(^表示正则表达式的开始,$表示正则表达式的结束)

举例来说,如果用如下方式启动Odoo Server:
./openerp-server --db-filter='%d' -c /etc/odoo-server.conf &
则通过域名demo.myhost.com访问时,系统会重定向到demo数据库;但是如果系统中有多个数据库名称中含有demo,如demo2,mydemo...,则系统仍然会进入数据库列表界面,把所有名称含demo的数据库都显示在下拉列表中;
那么如何精确定位到想要的数据库呢?要对db-filter等号右侧的值略作修改,改为如下方式即可:
./openerp-server --db-filter='^%d$' -c /etc/odoo-server.conf &
这时候再通过域名demo.myhost.com访问,系统会直接重定向到demo库,而不管系统中是否有其他名称含demo的库。

另外,如果系统中找不到过滤的库时(如通过域名demo.myhost.com访问而系统中无demo数据库),则会重定向到数据库管理页面。
显而易见无须赘言的是,以上的测试需要你能(gou)访(mai)问(le)myhost.com域名,并且已配置了二级域名demo.myhost.com。
作者:wangnan537 发表于2015/3/12 23:04:23 原文链接
阅读:1441 评论:0 查看评论

Simon537[原]Odoo(OpenERP)开发实践:菜单隐藏(2)

在实际应用Odoo(OpenERP)的过程中, 会有对某用户组隐藏菜单的需求.
只对某一用户组隐藏菜单,可使用如下方式:
<record id="original_module.menu_id" model="ir.ui.menu">
    <field name="groups_id" eval="[(3,ref('my_new_group_id'))]"/>
</record>

隐藏消息菜单实践记录:
在源码source\addons\mail\mail_thread_view.xml中,消息主菜单的定义如下:
<!-- Top menu item -->
<menuitem name="Messaging"
    id="mail.mail_feeds_main"
    groups="base.group_user"
    sequence="10"/>
由此可见, 消息主菜单对base.group_user用户组可见, 这是一个通用的用户组, Odoo系统中所有用户默认属于此组, 因此我们使用如下代码实现消息菜单的隐藏:
<record id="mail.mail_feeds_main" model="ir.ui.menu">
    <field name="groups_id" eval="[(3, ref('base.group_user'))]"/>
</record>
但测试发现这种方法没有生效! 目前尚不清楚具体原因.

此路不通,只能曲线救国. 先新建一个用户组, 并指定消息菜单只对其可见. 代码如下所示:
<!-- 新建用户组hideme -->
<record id="hideme" model="res.groups">
    <field name="category_id" ref="base.module_category_hidden" />
    <field name="name">hide me</field>
</record>
<!-- 指定只有hidme用户组才能看到消息菜单 -->
<record id="mail.mail_feeds_main" model="ir.ui.menu">
    <field name="groups_id" eval="[(6, 0, [ref('hideme')])]"/>
</record>
这种方式会波及到之前所有能看到此菜单的用户组, 如想让某个用户组仍能看到这个菜单, 需要改动代码,示例如下:
<!-- 指定只有hidme用户组才能看到消息菜单 -->
<record id="mail.mail_feeds_main" model="ir.ui.menu">
    <field name="groups_id" eval="[(6, 0, [ref('hideme')])]"/>
    <!-- 允许销售/查看自己的线索用户组操作消息菜单 -->
    <field name="groups_id" eval="[(4, ref('base.group_sale_salesman'))]"/>
</record>
作者:wangnan537 发表于2015/3/1 18:22:08 原文链接
阅读:830 评论:0 查看评论

Simon537[原]Odoo(OpenERP)开发实践:菜单隐藏(1)

在实际应用Odoo(OpenERP)的过程中, 会有对某用户组隐藏菜单的需求.
下文的代码定义了一个特定的用户组hideme, 并将要隐藏的菜单指定给该用户组, 这样相当于对所有的普通用户组屏蔽了此菜单.(感谢Jeff指导.)
注: 也可将groups属性值指定为多个用户组, 以逗号间隔开, 则除指定的用户组外, 菜单对其他用户组不可见.

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <!-- 新建用户组hideme -->
        <record id="hideme" model="res.groups">
            <field name="category_id" ref="base.module_category_hidden" />
            <field name="name">hide me</field>
        </record>
        
        <!-- 指定只有hidme用户组才能操作采购/采购/供应商菜单,该隐藏对管理员也有效 -->
        <!-- 如安装或卸载时未生效,请注销后重新登录 -->
        
        <!-- 此写法没有指定menuitem的parent, 不推荐此写法, 否则卸载后供应商会成为一级菜单
        <menuitem id='base.menu_procurement_management_supplier_name' groups="hideme" />
        -->
        <menuitem id="base.menu_procurement_management_supplier_name" name="Suppliers"
            parent="purchase.menu_procurement_management"
            action="base.action_partner_supplier_form" sequence="15" groups="hideme"/>
    </data>
</openerp>
作者:wangnan537 发表于2015/2/28 23:49:49 原文链接
阅读:893 评论:0 查看评论

September 01, 2015

海飞[转载]OpenERP安装笔记

原文地址:OpenERP安装笔记作者:Odoo文档交流

原文地址:http://taitan.cwsurf.de/2012/01/14/openerp安装笔记/

OpenERP 是一款建立在Python,PostgreSQL,XML等技术之上非常灵活强大的开源ERP系统。

最近成功安装了OpenERP6,期间参考了网络上的一些资料并得到了openerp论坛中的热心帮助,曾有论坛的朋友通过QQ询问安装问题,我就把这些安装记录写下来,希望这些记录可以帮助到其他人。

环境准备

  1. 安装 ubuntu server
  2. 安装vim(个人习惯)
  3. $ sudo apt-get install vim

  4. 设置网络,IP 地址和路由配置
  5. 例如设置

    192.168.20.20
    255.255.255.0
    192.168.20.1

    打开文件

    $ sudo vi /etc/network/interfaces

    配置以下内容:

    iface eth0 inet static
    address 192.168.20.20
    netmask 255.255.255.0
    gateway 192.168.20.1

安装openerp-server

  1. 安装PostgreSQL
  2. $ sudo apt-get install postgresql

    PostgreSQL默认超级用户为‘postgres’. 你首次需要以此用户来登录.

    $ sudo su postgres
    password: XXXXXXXXXX

    下面是为OpenERP配置PostgreSQL用户:

    $ createuser –createdb –username postgres –no-createrole –pwprompt openerp
    Enter password for new role: XXXXXXXXXX
    Enter it again: XXXXXXXXXX
    Shall the new role be a superuser? (y/n) y
    CREATE ROLE

    注意:密码设置为 postgres.

  3. 下载openerp
  4. 使用以下命令下载deb包:

    $ wget http://www.openerp.com/download/stable/deb/openerp-server-6.0.3-0_all.deb
    $ wget http://www.openerp.com/download/stable/source/openerp-web-6.0.3.tar.gz

  5. 安装openerp-server
  6. 使用 dpkg 安装deb包,并通过 apt-get -f 选项安装依赖包

    $ sudo dpkg -i openerp-server-6.0.3-0_all.deb
    $ sudo apt-get -f install

    配置参数

    $ sudo vi /etc/openerp-server.conf
    db_password = postgres

    添加参数,使其能够通过localhost以外的地址访问ftp

    ftp_server_host = 0.0.0.0

    重启服务

    $ sudo /etc/init.d/openerp-server restart

安装 openerp-web

  1. 必要包
  2. Python >= 2.4
    CherryPy >= 3.1.2
    Mako >= 0.2.4
    Babel >= 0.9.4
    FormEncode >= 1.2.2
    simplejson >= 2.0.9
    pyparsing >= 1.5.0

    python-libxslt1
    postgresql-client
    python-hippocanvas
    python-matplotlib
    python-webdav

  3. 解决中文(不完整)问题
  4. 解决此问题需要更改源代码:

    $ sudo vi ~/openerp-web-6.0.3/openobject/i18n/_gettext.py

    将代码:

    if locale in domain_catalog:
    return domain_catalog[locale]

    更改为:

    if str(locale) in domain_catalog:
    return domain_catalog[str(locale)]

  5. 安装
  6. $ sudo python setup.py install

     

  7. 建立OpenERP-Web启动进程(daemon)
  8.  

    $ sudo vi /etc/init.d/openerp-web

    内容如下(注意更换为您自己的内容):

     
     #!/bin/sh
     #
     # Open ERP web 启动脚本
     #
     
     PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
     DAEMON=/home/yourname/openerp/openerp-web
     CONFIGFILE=/home/yourname/openerp/openerp-web.cfg
     NAME=openerp-web
     DESC=openerp-web
     
     USER=yourname
     
     test -x ${DAEMON} || exit 0
     
     set -e
     
     case “${1}” in
         start)
             echo -n “Starting ${DESC}: ”
     
         start-stop-daemon –start –quiet –pidfile /var/run/${NAME}.pid
                 –chuid ${USER} –background –make-pidfile
                 –exec ${DAEMON} — –config=${CONFIGFILE}
     
             echo “${NAME}.”
             ;;
     
         stop)
             echo -n “Stopping ${DESC}: ”
     
             start-stop-daemon –stop –quiet –pidfile /var/run/${NAME}.pid
                 –oknodo
     
             echo “${NAME}.”
             ;;
     
         restart|force-reload)
             echo -n “Restarting ${DESC}: ”
     
             start-stop-daemon –stop –quiet –pidfile /var/run/${NAME}.pid
                 –oknodo
     
             sleep 2
     
             start-stop-daemon –start –quiet –pidfile /var/run/${NAME}.pid
                 –chuid ${USER} –background –make-pidfile
                 –exec ${DAEMON} — –config=${CONFIGFILE}
     
             echo “${NAME}.”
             ;;
     
         *)
             N=/etc/init.d/${NAME}
             echo “Usage: ${NAME} {start|stop|restart|force-reload}” >&2
             exit 1
             ;;
     esac
     
     exit 0

    (内容结束)
    然后进行如下操作:

    $ cp /doc/openerp-web.cfg /etc/
    $ sudo chown -R openerp /etc/openerp-web.cfg
    $ sudo chown -R openerp /addons
    $ sudo chown -R openerp /etc/init.d/openerp-web
    $ sudo chmod +x /etc/init.d/openerp-web

    更改配置文件openerp-web.cfg

    log.accessfile = “var/log/openerp-web/access.log”
    log.error
    file = “var/log/openerp-web/error.log”

    并且,进行如下操作:

    $ sudo mkdir -p /var/log/openerp-web
    $ sudo touch /var/log/openerp-web/access.log
    $ sudo touch /var/log/openerp-web/error.log
    $ sudo chown -R openerp /var/log/openerp-web

    加入启动进程:

    $ sudo update-rc.d openerp-web defaults
    $ sudo /etc/init.d/openerp-web start

     

 


 

 

一些问题的解决

  • 如果发现出现以下错误:
  • <type ‘exceptions.UnicodeEncodeError’>: ‘ascii’ codec can’t encode character u’u5e74′ in position 2: ordinal not in range(128)
    args = (‘ascii’, u’%Yu5e74%mu6708%du65e5 %Hu65f6%Mu5206%Su79d2′, 2, 3, ‘ordinal not in range(128)’)

    解决方法:
    “系统管理-翻译-语言” 修改日期格式与时间格式,使其不包含汉字。
    感觉代码使用’ascii’有问题,应该是/usr/local/lib/python2.7/dist-packages/openerp_web-6.0.3-py2.7.egg/openobject/i18n/format.py出错了

  • wiki显示不正常,只显示为编辑模式(权限问题)
  • $ sudo chmod -R 777 [目录]

    目录可能包含3个:

    /usr/lib/pymodules/python2.x/openerp-server/addons
    /usr/share/pyshared/openerp-server/addons
    /usr/…/openerp-web/addons

     

  • 更改web页面右上角support支持地址
  • 更改这里:

    /usr/share/pyshared/openerp-server/addons/web_livechat/publisher_warranty.py

    函数getdefaultlivechat_text的返回值

    return ‘<a href=”http://www…(略)

  • 更改logo图片
  • 图片信息在 <openerp-web目录>/addons/openerp/static/css/screen.css 文件中, 可能会是 ../images/logo-bg.png

  • 打开web缓存
  • Opery Web Client:打开openerp-web.cfg,确认 server.environment = “production” (源码安装默认development)
    cherrypy/cpserver.py文件中有两个重要参数,分别是46行的socketqueuesize = 5 和 51行threadpool = 10 ,这里修改为socketqueuesize = 500thread_pool = 1000。(这两个参数如果在保持默认值的情况下,连并发100都跑不了。不明白CherryPY的默认值为什么这么低 …)

 原文地址:http://taitan.cwsurf.de/2012/01/14/openerp安装笔记/


 

July 30, 2015

海飞Creating custom reports in Odoo 8

http://www.odoo.yenthevg.com/creating-custom-reports-odoo-8/

Creating custom reports in Odoo 8

DECEMBER 31, 2014

YENTHE666

Hi guys

In this tutorial you will learn how to create a new QWeb report from scratch.During this tutorial I will create a second invoice report, but this time without prices. Some companies do not want to show prices per record for example, so I’ll take this as a sample.

1. Creating a new XML file

The first step to create your own new report is to make a new XML file. This file should be placed under yourModuleName/views and you can name it as you wish. In this tutorial I will create a new invoice that is made in the module account.I’ve named the file report_without_prices.xml as you can see here:

In this file you will define the template id’s and names, which will later on be used by your Odoo to find the correct report.The minimal code looks like this:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


 

May 01, 2015

Simon537[原]在Ubuntu Server 14.04上源码安装Odoo 9.0

Odoo 9.0版已于2015年10月1日正式发布,相较Odoo 8.0版而言,新版本重写了会计模块,新增了一些功能,改进了用户体验(详见Odoo 9.0特性Odoo 9.0发行说明)。Ubuntu安装镜像可在其官网页面下载,本文假定你已准备好Ubuntu Server 14.04,主要介绍如何以源码方式安装Odoo 9.0。

本文基于社区文章《在Ubuntu Server 14.04 LTS版上以git方式源码安装Odoo8.0》(@Alan Lord 原创、@郑州-Dean 翻译、@上海-卓忆 补充)整理简化而来。与Odoo8.0的安装相比,主要差别在于多了nodejs、node-less的安装,其他基本相同。

整理:苏州-微尘

1. 更新Ubuntu服务器软件源

sudo apt-get update  #更新软件源
sudo apt-get dist-upgrade  #更新软件包,自动查找依赖关系
sudo shutdown -r now  #重启服务器,以更新改变的内容

2. 新建系统用户用于运行Odoo程序

运行如下命令创建系统用户:

sudo adduser --system --home=/opt/odoo9 --group odoo9  #新建系统用户odoo9,指定home目录为/opt/odoo9
系统用户不能用于登录并且没有shell,但当需要以它的身份进行特定操作时,可以用su命令切换用户:
sudo su - odoo9 -s /bin/bash  # 将当前终端登录切换到odoo9用户,并使用/bin/bash这个shell
命令运行后会自动从当前目录切换到odoo9用户的home目录/opt/odoo9。操作完毕后输入exit命令,离开odoo9用户的shell,回到登录所用的用户。

3. 安装和配置数据库服务器PostgreSQL

先运行如下命令查看PostgreSQL数据库的版本:

psql –version  #查看PostgreSQL版本
如报错,则表明之前未安装过PostgreSQL,那么可以通过如下命令安装:
sudo apt-get install postgresql #安装PostgreSQL
接下来切换到postgres用户,它是PostgreSQL默认的初始用户,以它的身份操作我们就有配置数据库的权限:
sudo su - postgres
然后以postgres的身份创建一个新的数据库用户odoo9,Odoo程序将用该用户访问数据库。
createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo9
根据系统输入密码,记住你这里设置的密码。最后运行exit退出postgres用户。

4. 安装Python运行库和wkhtmltopdf

运行如下命令安装Odoo 9.0版本依赖的python运行库:

sudo apt-get install python-dateutil python-docutils python-feedparser python-gdata \
python-jinja2 python-ldap python-libxslt1 python-lxml python-mako python-mock python-openid \
python-psycopg2 python-psutil python-pybabel python-pychart python-pydot python-pyparsing \
python-reportlab python-simplejson python-tz python-unittest2 python-vatnumber python-vobject \
python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-pyPdf \
python-decorator python-passlib python-requests
下载安装wkhtmltopdf(Odoo使用wkhtmltopdf来输出pdf):
sudo wget http://download.gna.org/wkhtmltopdf/0.12/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb #下载wkhtmltopdf,注意根据操作系统选择相应版本
sudo dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb  #安装wkhtmltopdf
sudo cp /usr/local/bin/wkhtmltopdf /usr/bin/wkhtmltopdf  #安装完成后将可执行文件复制到usr/bin中
sudo chown root:root /usr/bin/wkhtmltopdf  #更改所有者为root用户
sudo chmod +x /usr/bin/wkhtmltopdf  #并增加可执行属性
wkhtmltopdf www.baidu.com ~/baidu.pdf  #打印一个网页到home目录,如果成功生成pdf则表明安装成功
sudo apt-get install ttf-wqy-zenhei  #安装中文字体
sudo apt-get install ttf-wqy-microhei  #安装中文字体

5. 安装Odoo服务器代码

sudo apt-get install git  #安装git软件
sudo su - odoo9 -s /bin/bash #切换到odoo9用户
git clone -b 9.0 https://github.com/odoo/odoo.git .  #下载Odoo9.0代码
exit #退出odoo9用户

6. 安装nodejs、node-less

这一步不能忘掉,否则将来登录Odoo帐套时,界面中会有报错信息:Could not execute command lessc

apt-get install -y npm 
sudo ln -s /usr/bin/nodejs /usr/bin/node
npm install -g less less-plugin-clean-css
apt-get install node-less

7. 配置Odoo程序

默认的配置文件openerp-server.conf包括基本的设置,这里需要做一点改动。

sudo cp /opt/odoo9/debian/openerp-server.conf /etc/odoo9-server.conf  #把文件复制到/etc目录
sudo chown odoo9: /etc/odoo9-server.conf #将所有权赋予odoo用户和用户组
sudo chmod 640 /etc/odoo9-server.conf #只允许odoo用户和root用户读取
下面用Ubuntu自带的nano编辑器编辑它, 运行如下命令打开配置文件:
sudo nano /etc/odoo-server.conf  
然后改动如下,

图1 配置文件设置

配置文件编辑好后,按Ctrl+O,然后回车覆盖保存,然后Ctrl+X退出nano程序。
配置文件里指定了日志文件的存储位置,因此要创建这个目录,同时还得让它能被odoo9用户读写:
sudo mkdir /var/log/odoo9
sudo chown odoo9:root /var/log/odoo9
现在可以尝试启动Odoo服务器:
sudo su - odoo9 -s /bin/bash  #先切换到odoo9用户,
./openerp-server -c /etc/odoo9-server.conf #运行Odoo
在浏览器输入http://ip地址:8069/,因为是全新安装,还未创建过帐套,所以默认会进入数据库管理界面。


图2 数据库管理界面

如果一切正常,按 Ctrl+C停止服务器,然后用exit命令离开odoo9用户,回到你自己登陆的shell。如果报错,则需要查看odoo-server.log排查错误。(为方便起见,可以先将配置文件中的logfile一行注释掉,这样就可以直接在控制台看到报错信息)

8. 安装启动脚本

启动、停止Odoo服务需要多个步骤的操作,比较繁琐,可以安装启动脚本以批处理的方式处理这些步骤。Odoo程序提供了一个现成的脚本openerp-server.init,位于/opt/odoo9/server/install/目录。但需要一点小改动,因为我们不是按odoo的默认安装方式装的。这里有个修改好的脚本文件,下载此脚本拷贝到/etc/init.d/,然后把它改成可执行文件,赋给root用户:

sudo chmod 755 /etc/init.d/odoo9-server
sudo chown root: /etc/init.d/odoo9-server
要启动Odoo服务器,输入:
sudo /etc/init.d/odoo9-server start  
这时可以查看日志文件,查看Odoo是否已经启动:
less /var/log/odoo9/odoo9-server.log
要退出less命令的查看界面,只需按一下q键。如果启动过程中出现问题,可以依据日志文件的内容查找原因。
下边检查odoo服务器是否可以被恰当地停止:
sudo /etc/init.d/odoo9-server stop
检查下日志文件,确定下服务已经停止,也可以用top命令查看Ubuntu服务器正在运行的进程表来确认。(退出top命令的查看界面也是按q键)

9. 将Odoo设为开机自启动

让启动脚本随着Ubuntu服务器的开、关机而自动启动、关闭Odoo服务。

sudo update-rc.d odoo9-server defaults

现在就可以重启动你的服务器,当你再登录进来的时候,Odoo应该已经在运行了。输入如下命令查看Odoo是否已在运行:

ps aux | grep odoo9
作者:wangnan537 发表于2015/10/4 13:14:05 原文链接
阅读:4953 评论:7 查看评论

Simon537[译]Odoo9发行说明

2015年10月1日,期待已久的Odoo9正式发布。本文是Odoo9正式版发行说明,基于官网资料翻译。


译者: 苏州-微尘
原文地址:https://www.odoo.com/page/odoo-9-release-notes
译文地址:http://blog.csdn.net/wangnan537/article/details/48850915

1. 新设计与导航(New design & Navigation)
简单之美
基于内容的设计。简单、清晰、体验极佳。
更快
数据加载速度快,各应用瞬时切换。
简单的过滤器与分组
预定义的过滤器,一次点击可看到最有用的数据。
便捷的导航
重新排列的菜单,尽在指尖,懂你所想。
完全的移动端支持
新设计可自动准确的调整菜单、列表、表格和字段,以适应PC、平板或手机的尺寸。

2. 可用性与上手(Usability & On-boarding)
上下文菜单
为每个应用创建仪表板以更好的导航,包括关键指标和下一行动的概览。最相关指标进展的快速图形化概览。
上手计划
动态提示 - 帮助你基于业务需求配置Odoo的小教程,入门的分步指南,包括提示和技巧。
应用分离
人力资源和市场营销应用分成员工、招聘、考勤、考核、休假、费用、调查、电子邮件营销、营销自动化。合同、日历、MRP和维修现在是分开的应用。
日期选择器
新的响应式日期选择部件。
自定义工具
在每个应用中,配置项更易访问。
常规表单视图的改进
更新的主表单,易于查看、编辑最重要的数据,从表单中移除不用的字段。
智能翻译
更正初始版本中的错误,比如语法(不是指重大改变),保持翻译有效。
更平滑的搜索视图
精简的搜索视图,平滑集成了数据透视表、图表,以及动态分组。

3. 客户关系管理(CRM)
更易上手
新的仪表板能更好的预览销售活动。有用的技巧和最佳实践来配置和部署您的CRM。
活动和电话管理
为每个商机组织一系列活动。安排活动。在商机预定义动作的沟通时,即时记录每个活动。跟踪、记录和分析你团队的活动。
管道管理
为每个销售团队建立详细的阶段。可能要建立子阶段以更好的组织流程。自动归档失去的商机。手工归档其他商机。“失去”不再是一个阶段,而是一个单独的字段,使得管道分析更强大 - 比如,商机在每个阶段的丢失率。
阶段自定义
通过添加阶段描述自定义管道。
线索评分
基于显式和隐式的条件给线索打分,决定何种总分应该转为商机。
失去的原因
分析商机失去的原因以改进销售效率。
配置项改进
根据需要激活商机。

4. 销售(Sales)
简化的价格表
每个价格表一个版本。根据客户细分,给个别产品轻松添加一个或多个价格表。根据订购数量和/或时间周期配置价格表。价格表有3种配置模式:空、简单或高级。
在销售订单中管理发票
发票在产品中配置,在销售订单中管理。
合同的改变
合同分为Odoo订阅的定期发票和Odoo销售的其他类型的改进的销售单。例如:发票基于交付/订单数量,预付服务,考勤表和费用,项目任务等。
新的仪表板
活动、下一步行动及绩效的全面概览。
销售订单的改变
可修改,保持open,发票包
截止日期
默认情况下,为发票自动计算截止日期。
发票追踪
易于跟踪新建的和已确认的发票。
新建报价单
在线销售报价更快、更容易设计。
多公司规则
在多公司设置中自动镜像销售订单和采购订单。
国际贸易术语
发票中可显示国际贸易术语。

5. 订阅(Subscription)
定期发票
为客户创建定期发票规则。周期性产品自动关联到定期发票合同。
客户门户
从客户门户自行订阅和管理,定义服务选项和设置费。
报表
带图标和KPI(关键业绩指标)的仪表板。
收入确认
自动识别产生的收入。

6. 会计(Accounting)
报表
生成任意时间段的报表,时间段比较。某些字段的动态计算,比如年初至今的收入。创建多个注释。多个标准报表可用 —— 如损益表,现金流量表,现金报表,执行概要和逾期应付/应收账款等。可供80多个国家使用的标准报表和会计科目表。导出到Excel和pdf。
财年永久关闭
不需要逐年报告资产负债表账户。基于选择的日期自动计算损益。只需为关闭编制盈余处理。为非顾问和所有用户选择锁定的分录日期。
更好的核销
自动核销。在新的界面手工核销开启的和已付款的发票。根据初次手工核销获知账号。
简化的配置
开始只需一些字段,简化账户创建。

7. 发票和付款(Invoicing and Payments)
银行对账单
同步主要在美国,澳大利亚和新西兰的24000家银行。支持的文件导入格式:OFX, QIF, CSV, CODA.
付款
Sepa支付。按US格式检查打印。
多公司规则
在多公司设置中自动镜像订单和发票(在公司A创建一个销售订单,Odoo自动在公司B生成采购订单)。
仪表板
基于日记账类型的行动和具体信息。
客户付款
存款批处理可用。客户对账:通过简化的界面管理催款。
汇率
基于选择的频度自动更新汇率:每天、每周、每月。
支付条款
简化的管理视图。

8. 电子签名(eSign)
电子合同
通过拖放功能,定制PDF中的可编辑字段。选择在每页重复显示的字段。
多角色
根据签字人的职位发送正确的版本。
文档管理
准备文档。向一人或多人共享文档,自动合并同时发送的多个已签字的文档。创建模板。
法律效力
美国、欧洲、南非、澳大利亚和新西兰等国的法律。

9. 网络电话(VoIP)
商机呼叫
为客户或商机创建拨号队列,通过浏览器自动或手动发起呼叫。
电话接听
有来电时自动弹框。
跟进
漏掉的电话,可重新安排或发送邮件。
其他
集成Asterisk v13.2 VOIP服务器。

10. 零售(Point of sale)
积分卡和奖励系统
按订单、消费额或购买的产品给予积分,设置奖励(折扣、礼品或转售)。
厨房和吧台打单
通过无线网将订单发送至厨房或吧台,打印水单。
注册客户
选择和创建客户表单很方便。直接用平板电脑给客户拍照。
服务员小费管理
收取客户额外的小费,或将找零转成小费。
手工折扣
允许收银员手工设置折扣。
替换规则
为每个零售点设定替换规则。
账单拆分
订单可分批付款或分成多个新订单。
餐厅平面图
通过图形化编辑器查看餐厅平面图及餐桌情况。谁坐在哪,还剩多少席位,都一目了然。
按桌查单
通过图形化编辑器,按桌下单、改单。
多条码
遵照条码命名法,给一个产品配置多个条码。
收据重打印
收银员可手工重新打印POS收据。

11. 项目管理(Project management)
定制管道
“任务/问题”改名。改变绿色/红色状态的意义。每个项目可创建特定的阶段。使用自定义工具提示定义每个阶段的过程。从销售订单创建任务。
服务评价
配置在每一阶段自动发送邮件给客户,并直接收取客户反馈。按项目分析综合评分以改进流程。
自动的项目邮件地址
项目创建时,自动创建一个可立即使用的邮件地址。
创建任务
发送邮件到项目以创建任务。邮件的所有收件人和抄送人将被添加为此任务的关注者。
门户前端
客户可以从门户访问他们的票据。
其他
更好的统计。任务归档。删除Help desk management(服务台管理),由issues(问题)取代。

12. 网站(Website)
多版本
为网站准备多个版本,可一键切换版本。
新的构建块
新的构建块,如用“table”块显示详细的产品信息,“Gallery”块用于展示图片或消息弹出。
新的网站编辑器
可用性更佳,灵活性更好。
A/B测试
一个页面创建两个版本,通过实测找出表现最好的版本。直接在Google Analytics上分析结果。
链接追踪
在链接中加入追踪代码,从初次点击至销售结束,衡量所有的营销活动。
Odoo幻灯
直接在网站上分享视频和演示。通过频道管理隐私。

13. 电子商务(E-commerce)
销售数字产品
可在在线目录中添加数字产品,用电子书。
支付服务提供商
随Ogone、Paypal、Ayden和Buckaroo一起,Authorize.net和SIPS Wordline也被添加到在线支付方式列表中。
新的构建块
在table中描述产品,以提供尽可能多的细节说明。
集成Amazon和eBay
配置产品提要。获取订单。
新的客户门户
客户可通过个人门户跟进购买状态及历史订单。
订单检查
在最后一步,可看到订单的详细信息。
跳过送货地址
只购买服务时,不需要送货地址。
产品库存
产品中显示可用库存。

14. 博客(Blog)
新的构建块
很方便的在文本块中放置浮动图片。
作者
很方便的选择合作者的名字作为博客文章作者。
封面管理
能轻松删除封面。
Gallery
博客主页已检查和完善。

15. 论坛(Forum)
讨论和链接
分享任意网站的链接,开启定期讨论。
改进的标签管理
很方便的使用标签过滤问题和答案。
社交分享
在Facebook、Google+、Twitter和LinkedIn上分享问题和答案。
改进的用户界面
更清爽的前端,能更好的浏览内容。

16. 库存(Inventory)
库存预警
根据已确认销售订单、采购单、生产单,以及内部移动,预测产品可用库存。
新的条码机制
新的统一接口。只通过扫描仪扫描商品并确认接收或发货。支持EAN13和EAN14。
发货
发货方式检查。更容易、更快捷。
多条码
使用特定代码创建自定义条形码以满足需要,比如一次促销。
快递公司集成
支持Tamendo、DHL、USPS、UPS、Fedex. 由快递公司提供单号。在Odoo中跟踪包裹。

17. 事件(Event)
管理订阅
一次注册多人。订阅过程中,参与者能在一个新的窗口将细节展示给参加者。
自动确认
自动接收事件及注册确认。
编辑菜单
为高级事件创建多页菜单。
催促
通过定制的邮件和自动提醒进行事件催促。
定制
每个参与者或订阅者可在订阅中添加自定义问题。定制入场徽章,分析参与者资料。

18. 采购(Purchase)
更好的搜索过滤器
通过采购单上的供应商编号搜索产品。
发票控制
发票和采购订单之间的自动控制。
多公司规则
在多公司配置中自动镜像销售单和采购单。
采购订单
采购订单草稿没有生成更多。发票草稿自动生成。

19. 人力资源(Human resources)
应用分离
Odoo人力资源包括考核、费用、车辆、员工、休假、招聘和考勤。
员工每月出勤
用新的菜单项和状态,人力资源经理可以很容易地报告员工每月出勤情况。
考核
易于配置谁要接受考核。为每个角色定义、选择表格。管理考核计划和阶段。
员工休假汇总
人力资源经理可根据员工休假汇总很容易的管理工资。绿色按钮用于已批准、已计算的休假,灰色按钮用于将要管理的待处理休假。
费用
单独处理每笔费用。
仪表板
每个经理一个仪表板。

20. 考勤(Timesheet)
记录工时的新应用
移动
用Chrome插件在Odoo中直接录入所花时间。跨设备同步。
方便记录
从浏览器点击按钮,记录时间。离线工作。
井井有条
用“把事情做好”的方法论管理计划。统计数据。

21. 邮件(Mailing)
未送达的邮件
跟踪过去24小时未送达的邮件,通知他们失败的原因。
新的邮件设计器
新的脚本和9个主题用于创建邮件宣传活动。
邮件中的操作按钮
操作 - 如批准 - 在邮件通知中即时可用。
KPI's
获得邮件性能的实时统计数据:送达率、打开率、点击率和跳出率。
链接追踪集成
在邮件正文的链接中加入追踪代码,估算每个营销活动带来的收入。

22. 讨论(Discuss)
Odoo协作的新方式
艾特(Mention)
在会话中艾特Odoo用户(@odoo_username)以引起他们的注意。
频道
创建公开的群组即频道以跟进关于特定主题的讨论。
私有组
创建秘密群组,并邀请用户。
制式回应
创建快捷方式,在即时聊天中使用已有的模板答案回答常见问题。
评分系统
让客户通过即时聊天留下对公司服务的反馈。
直接聊天
使用Odoo时和同事聊天。

23. 设备管理(Equipment Management)
保修概览
管理设备的保修和生命周期(如笔记本、机器等)
维护
维护请求的创建及跟踪

附录:


附图1 Odoo8、Odoo9社区版、Odoo9企业版功能清单

作者:wangnan537 发表于2015/10/1 23:41:22 原文链接
阅读:2379 评论:1 查看评论

April 01, 2015

Simon537[原]Odoo(OpenERP)开发实践:基本字段类型

在Odoo(OpenERP)中定义数据模型时,可以使用的字段类型有10种:Char、Text、Selection、Html、Integer、Float、Date、Datetime、Boolean、Binary。

下面的代码是各字段类型的一个简单示例:

class Stage(models.Model):
    _name = 'todo.task.stage'
    _order = 'sequence,name'
    # String fields:
    name = fields.Char('Name', 40)
    desc = fields.Text('Description')
    state = fields.Selection(
        [('draft','New'), ('open','Started'),('done','Closed')],
        'State')
    docs = fields.Html('Documentation')
    # Numeric fields:
    sequence = fields.Integer('Sequence')
    perc_complete = fields.Float('% Complete', (3, 2))
    # Date fields:
    date_effective = fields.Date('Effective Date')
    date_changed = fields.Datetime('Last Changed')
    # Other fields:
    fold = fields.Boolean('Folded?')
    image = fields.Binary('Image')

参考资料:《Odoo Development Essentials》

作者:wangnan537 发表于2015/9/30 23:55:50 原文链接
阅读:692 评论:0 查看评论

January 03, 2015

海飞[转载]Odoo8.0部分关于翻译的代码 Bug 修复

代码Bug修复模块地址:

                  https://github.com/ManfredLee/odoo-dev

odoo-dev

1,修正继承视图时某些字段翻译提取不正确。例如,产品规格视图。 2,修正报表模块view翻译问题。例如销售分析。

安装 将两个文件夹拷到addons目录下。然后在客户端刷新模块列表安装。



 

海飞[转载]Odoo8.0部分关于翻译的代码 Bug 修复

代码Bug修复模块地址:

                  https://github.com/ManfredLee/odoo-dev

odoo-dev

1,修正继承视图时某些字段翻译提取不正确。例如,产品规格视图。 2,修正报表模块view翻译问题。例如销售分析。

安装 将两个文件夹拷到addons目录下。然后在客户端刷新模块列表安装。



 

December 07, 2014

海飞Magento for OpenERP 7

http://www.zbeanztech.com/blog/magento-openerp-7

Magneto is a eCommerce platform build on open-source technology where the user have unlimited flexibility over his eCommerce store. Magento when integrated with OpenERP forms an strong platform for managing eCommerce store. Magento when integrated with OpenERP 7 created an eCommerce store management system with user friendly interface.

To integrate the magento with OpenERP 7, the basic requirements are OpenERP 7 and Magento. Magento should have the integration module installed in magento side which can be downloaded fromhttps://code.launchpad.net/magentoerpconnect. After installing the modules in magento and OpenERP 7, we can see some new menus being created by the module.

Configuration:

After installing the module we have to configure OpenERP to communicate with magento. We have to create a magento instance in OpenERP 7. This can be done from MagentoERPconnect -> Magento Instances. A from view of the magento instance creation form is given below:

 

In the form view, the user can enter Name for the instance he is creating, Referential Version -  the version of the magento used, Location - address in which the magento can be accessed, Username - username of a root user in magento, Password - Password of the user in magneto, Debug - its a boolean field which when enables show the log of the process being done when syncing to and from magento. When this configuration is done some new buttons becomes visible. A screen shot is shown below:

Initial Imports :

Some initial imports has to be done before we start importing product and orders from magento like importing mapping template etc. In the magento instance, we can see a section called "Compulsory" in which there are two buttons called Reload referential mapping template and Synchronize referential setting. These two has to be done before we start importing. Reload referential mapping template import all the mapping from the csvin the module magentoerpconnect to OpenERP. These mapping template is used to map magento field with OpenERP. We can specify in which way the fields ha to be mapped ie; function mapping or direct mapping etc. When this button is pressed, we can see the mapping lines being loaded to the one2many field in the magento instance defined. A screenshot of the mapping lines is shown below:

Each line specifies each model that is imported from magento toOpenERP. If you open one record, you could see the method defined to map each field in that model. A screenshot is shown below:

Now as we have imported the mapping lines, we can now importmageto shops, magento website etc from magento. This can be done by pressing the button "Synchronize Referential Setting" in the magento instance. Now we have imported some of the compulsory imports in mageto. Now we can import the details like customers, product etc from magento.

In magento instance there is a section called "Optional - Initial Import" from where we can import product, customers, customer group, product categories, product images and product links. In this section you could see 8 buttons as:

1 - Import Customer Groups(Partner Categories) - Imports customer groups from magento

2 - Import Product Categories - Import product categories frommagento

3 - Import Product Attribute Sets - Import product attributes from magento. Attributes are the new fields that are used in the magneto to store details for product, partner etc. Each attribute has a set to which the attribute belong. This button imports the attribute set from magento. You can see the attribute set imported from MagentoERPconnect -> Attributes and Sate -> Attribute Sets. After the button is pressed you could see a new entry created. If we open the record we can see a button called "Update Attribute" . This button update or create all the attributes belonging to this attribute set. A screen shot is given below:

We can see all the attributes from MagentoERPconnect -> Attributes and Set ->Attributes. If we open one attribute, we can see all the properties of the attributes like field type, based on which template the attribute is created etc. A screenshot is attached below:

Some attribute can be a dropdown. The values of the attribute is stored in MagentoERPconnect -> Attributes and Set -> Attribute Options. A screenshot is given below:

4 - Import Attribute Groups - Import attribute groups frommagento. Attributes Groups can be seen from MagentoERPconnect-> Attributes and Set -> Attribute Groups.

5 - Import Product Attributes - Import product attributes.

6 - Import Products - Import product from magento. We can import product along with the image and links by enabling the checkbox "With Image" and "With Links". The field "Last Imported Product Id" gives the magento id of the product last imported. We can see the imported product from Sales -> Products -> Products. A screenshot is shown below:

To view the image of the product in magento, open the product record, you can see a tab called "Images" There will be the image record created in this tab. A screenshot is shown below:

We can see the magento imported field details of the product by clicking on the button "Open Magento Fields" in the product form view. A screenshot is shown below:

In magento instance, in "Advanced" tab, we can find a button called "Import All Partners" which imports all the partners from magentoto OpenERP. "Last imported Partner Id" gives the Magento id of the last partner imported. The imported Partners can be viewed from Sales -> Sales -> Customers. A screenshot is shown below:

If the customer has a separate invoice and delivery address inmagento, there will be two customers created. The main customer will be a company and the next customer comes as a contact as the main customer. For example, the Customer Prajul P T has two address in magento so in OpenERP when the partners are imported, the main customer will be assigned with one address and the contact will be assigned another address. The form view of the customer Prajul P T is shown below:

Now we have successfully imported product, partner we can now import orders from Magento. Create an sale order from magento. To import sale orders from magento, go to MagentoERPconnect -> Core Settings -> Magento Shops. In here you could see a section called "Orders". A screenshot is shown below:

Press the button "Import Orders". This will import newly created orders in magento. You could see the imported orders from Sales -> Sales -> Quotations. A screen shot of a imported order is shown below:

Now we can confirm, make delivery, make invoice for the order from OpenERP. You could export the invoice and delivery order created for the order to magento by clicking the button "Export Invoices" and "Export Shipping" in "Magento Shops".You could update the status of the sale order bu clicking the button "Update Orders State on Channel". A screen shot of the exported invoices and delivery order from OpenERP to Magento is shown below:

Magento Invoice

Magento Shipment

We can export the the details regarding the product from OpenERPto Magento including stock levels by clicking the button "Export Catalog" in "Catalog" section in Magento Shop.

* This is based on the migration of magentoerpconnect module using the old architecture.


 青春就应该这样绽放  游戏测试:三国时期谁是你最好的兄弟!!  你不得不信的星座秘密

November 09, 2014

海飞[原创]ODOO8.0中新模块DropShipping流程测试

测试该模块,主要目的就是检查需求单,入库单,发货单及相关库存凭证

记录测试步骤和发现的问题:

1)  销售订单选择Route(需要加入特定权限,才能在订单明细看到该字段)为DropShipping


2)  确认订单,检查到需求单已经运行,并产生了采购订单,没有发货单(供应商代发货,可以理解).
下图是后补的,需求单已经完成: 



3)  检查采购订单,确认后产生入库单(从供应商库位到客户库位),并同时产生了供应商发票(新建待审)
采购订单(后补)

代发调拨(后补),临时启用了这个名字,因为其Picking Type不是Incoming/Outgoing,而是DropShipping.
采购/销售相关库存单据的菜单打开都找不到,完成后在采购订单上也不能查看该单据。
最后在“库存调拨”里觅得芳踪。


供应商发票(待审)


4)  完成收货,检查库存凭证(商品是及时记帐,但收货( 含发货 )完成后,没有任何库存凭证,明显错误是成本科目没有变化.不知道是否因为哪里配置问题).

上图红色框,是产品报废相关的库存凭证测试,该字段取值有问题。

 青春就应该这样绽放  游戏测试:三国时期谁是你最好的兄弟!!  你不得不信的星座秘密

November 08, 2014

海飞[原创]ODOO8.0从销售到发货的一个流程测试

ODOO8.0发布已经快2个月了,最近终于有时间来测试一下其流程了。
因为一开始没有确定要写博文,在第一个流程基本走通后,开始补充截图的,大家理解一下。
1)安装基础模块,截图部分模块如下:

2)商品设置
主要说明一下计量单位,该商品是双计量单位,库存单位是“袋”,采购单位是“箱(16袋)”。
下面需要注意的是 Route(路线)部分,在最初的2个SO时,只勾选了Buy,结果每个SO产生一个需求单,而该需求单不会产生采购单。后来就勾选了MTO,结果每个SO产生2个需求单,一个自动运行,另一个是基于该需求单产生的需求单。2个需求单差异是需求库位不一样。SO直接产生的需求单,需求库位是“客户库位”,当设置为MTO后,客户库位有一个供应,即“Stock”到客户库位,此时又产生一个需求单,需求库位是“Stock”.
销售单位是“箱(16袋)”,这里换算率太小,需要设置销售单位数量的精度,为显示全1/16,设置了4位小数,否则测试时有误差。不知道为什么这里不用16,而用1/16=0.0625。

3)往来单位设置
贴一个客户的,供应商忽略。

4)销售订单
这里贴出已经创建的7个SO:
其中一个SO004如图:
这是另一个SO007的订单明细,后续会测试发货。

5)需求单
相关需求单如下:为什么SO001和SO002只有一个需求单,因为一开始只勾选了Buy,没有勾选MTO;勾选MTO后,每个SO都有2个需求单,第一个自动计算,第二个默认是“确认”状态,下图是已经经过手工计算,状态有变化:

6)采购单
采购单,一开始产生的几个采购单,被我删除了几个,原因一是双计量单位问题,二是没有明白流程。
后来阅读代码,发现流程有变化。即使最初的几张“Draft”的采购单被删除了,相关的需求单都是“Exception”状态,但可以再次计算需求,然后再产生采购单。产生采购单时,会自动搜索是否有“Draft”
及其它几个条件(就是以前版本的合并采购订单流程),如果符合合并条件,就直接累计这个“Draft”订单的数量。如下图,是SO003-SO007共5个订单的需求数量:
没有想到的是,虽然是一个采购单,但确认后,产生的入库单,却是5笔明细,每一个明细都对应原来的一个销售订单/需求单,遗憾的是调拨来源并没有能记录原始来源,而只是记录了采购单号(看"库存调拨"菜单得到)。

7)入库单
入库单也是双单位,但没有换算到主单位,而是直接记录相同的单位。
准备收货,但这里又有一个意外,在收货这里,又换算为库存单位了。
收货完成:
相关需求单也同步完成。但查看工作流,现在Picking和Procurement并没有工作流了(见最后补图)。
发货单,也已经可用,等待发货了:

8)发货单
发货单同销售单,记录了双单位。
开始处理:
处理完成:
销售订单记录了“已发货”。

这个流程走通了。

补充:
目前系统只有4个工作流,同以前版本比较,没有Picking/Procurement的工作流了。


欢迎路过的同学提出意见。

 青春就应该这样绽放  游戏测试:三国时期谁是你最好的兄弟!!  你不得不信的星座秘密

November 01, 2014

Simon537[原]Odoo(OpenERP)配置文件openerp-server.conf详解

[options]
; addons模块的查找路径
addons_path = E:\GreenOdoo8.0\source\openerp\addons
; 管理员主控密码(用于创建、还原和备份数据库等操作)
admin_passwd = admin
; 自动重载?
auto_reload = None
; 用于导入导出的csv文件的默认分隔符
csv_internal_sep = ,
; data目录, 用于存放session信息、附件
data_dir = data
; 数据库主机名
db_host = 127.0.0.1
; 数据库的最大连接数
db_maxconn = 64
; 指定要使用的数据库名
db_name = False
; 数据库用户密码
db_password = openerp
; 数据库端口号
db_port = 65432
; 创建新数据库时使用的数据库模板
db_template = template1
; 数据库用户名
db_user = openerp
; 过滤要显示的数据库名称
dbfilter = .*
; 是否为调试模式
debug_mode = False
; 哪些模块加载demo数据?
demo = {}
; 用于发送邮件的邮箱地址
email_from = False
; 在导入大量数据时使用这个选项, 如果在导入期间程序宕机, 你可以在当前状态下继续。指定一个存储中间导入状态的文件名。
import_partial = 
; 一个处理器允许使用的最大物理内存
limit_memory_hard = None
; 一个处理器允许使用的最大虚拟内存
limit_memory_soft = None
; 一个处理器接受的最大请求数
limit_request = None
; 一个请求最多占用多少处理器时间
limit_time_cpu = None
; 一个请求允许的最长实时时间
limit_time_real = None
; 是否允许显示数据库列表
list_db = True
; 是否将log写入db的ir_logging表
log_db = False
; 可以是一组module:log_level对, 默认值是:INFO(表示所有模块的默认日志级别为INFO级别)
log_handler = :INFO
; 日志的级别, 可选值包括debug_rpc_answer, debug_rpc, debug, debug_sql, info, warn, error, critical
log_level = info
; 指定用来存储日志的文件
logfile = openerp-server.log
; 是否按天存放日志
logrotate = False
; 长连接池使用的端口号?
longpolling_port = 8072
; 处理当前计划任务的最大线程数
max_cron_threads = 2
; 强制保存在virtual osv_memory表中的记录的最长时间,以小时为单位
osv_memory_age_limit = 1.0
; 强制一个virtual osv_memory表的最大记录数
osv_memory_count_limit = False
; 数据库可执行文件的路径
pg_path = runtime/pgsql/bin
; 存储服务器pid的文件名
pidfile = None
; 是否使用反向代理模式
proxy_mode = False
; 是否压缩报表
reportgz = False
; 指定用于SSL连接的证书文件
secure_cert_file = server.cert
; 指定用于SSL连接的主密钥文件
secure_pkey_file = server.pkey
; server范围的模块,以逗号分隔
server_wide_modules = None
; 发送邮件的SMTP用户密码
smtp_password = False
; SMTP端口号
smtp_port = 25
; SMTP服务器名
smtp_server = localhost
; SMTP服务器是否支持SSL协议
smtp_ssl = False
; 发送邮件的SMTP用户名
smtp_user = False
; 是否把日志发送给系统日志服务器
syslog = False
; 是否提交YAML或XML测试造成的数据库更改
test_commit = False
; 是否允许YAML和单元测试
test_enable = False
; YML测试文件
test_file = False
; 报表的范例的存放位置
test_report_directory = False
; 为系统提供一个参照的时区
timezone = False
; 哪些模块可翻译, 默认为all
translate_modules = ['all']
; 是否使用数据库的unaccent功能
unaccent = False
; 在安装时哪些模块不加载演示数据
without_demo = False
; 要使用的处理器数量
workers = None
; 是否允许使用XML-RPC协议,默认为True
xmlrpc = True
; 指定使用XML-RPC协议的IP地址,为空时表示绑定到现有IP
xmlrpc_interface = 
; XML-RPC协议使用的TCP端口
xmlrpc_port = 8069
; 是否允许使用XML-RPC安全协议,默认为True
xmlrpcs = True; 指定使用XML-RPC安全协议的IP地址,为空时表示绑定到现有IPxmlrpcs_interface = ; XML-RPC安全协议使用的TCP端口xmlrpcs_port = 8071

作者:wangnan537 发表于2014/12/31 1:13:20 原文链接
阅读:4450 评论:0 查看评论

Simon537[原]Odoo(OpenERP)应用实践:办公用品的领用及归还

本文描述如何在Odoo(OpenERP)中实现办公用品的领用及归还,测试环境为Odoo8.0。
本文基于小林的笔记整理而来。

1. 前置条件

点击菜单[设置-> 设置-> 仓库],然后勾选“管理多个库位和仓库”、“管理你仓库的高级路线”(勾选这两项设置后,才能新建仓库、库位,管理仓库的路线)。
 
图1 仓库设置

2. 设置

1) 创建办公用品领用库位

此处将办公用品领用库位当做一个虚拟的库位。领用时,办公用品从库存库位移动到领用库位;归还时,办公用品从领用库位移动到库存库位。
点击菜单[仓库-> 设置-> 库位],进入库位列表视图,点击新建,输入库位信息后点保存。
 
图2 新建库位


2) 创建办公用品的操作类型

需要建立两个操作类型:办公用品领用、办公用品归还,分别用于领用及归还办公用品。
点击菜单[仓库-> 设置-> 操作类型],进入操作类型列表视图,点击新建,输入操作类型信息后点保存。
创建操作类型时,同时新建序列:办公用品借用单据序列、办公用品归还单据序列。这样可以为领用和归还生成独立的单据号。
 
图3 操作类型-办公用品领用

 
图4 办公用品借用单据序列

 
图5 操作类型-办公用品归还
 
图6 办公用品归还单据序列

完成操作类型的新建后,点击菜单[仓库-> 操作-> 全部操作],可以看到多了两个新的仓库作业。
 
图7 新生成的仓库作业

3) 设置办公产品的路线

点击菜单[仓库-> 设置-> 仓库],然后打开仓库的表单视图,点击路线,
 
图8 仓库的表单视图

点击新建,输入路线名称“办公用品领用后归还”,
 
图9 新建路线

并建立推动规则,此处设置为自动调拨,延迟30天,
 
图10 建立路线的推动规则

创建后,在要领用的办公产品中确认是否勾选了刚刚新建的路线,没有的话手动打勾。
 
图11 设置产品的路线

3. 测试

点击菜单[仓库-> 操作-> 全部操作],在办公用品领用中点击全部操作,
 
图12 办公用品领用作业

然后点击新建,选择业务伙伴,点击添加一个项目,

图13 新建办公用品领用

输入如下信息,
 
图14 当前办公用品领用关联的移动信息

保存后,完成此借用后,可以看到在办公用品归还作业中自动生成了一笔归还,
 
图15 办公用品归还作业

详细信息如下,
 
图16 自动生成的办公用品归还记录

此处的安排日期为2015/01/27,正是根据借用日期2014/12/28加上之前设置的路线中的延迟(30天)计算得来。
作者:wangnan537 发表于2014/12/28 20:00:26 原文链接
阅读:2012 评论:5 查看评论

Simon537[译]Odoo学习: __openerp__.py文件详解

英文网址: https://www.odoo.com/documentation/8.0/reference/module.html

清单文件(manifest file)用于声明一个python包作为Odoo模块、并指定一些模块元数据。
这是一个名为__openerp__.py的文件,它包含一个Python字典,每个字典键指定一个模块元数据项。

可用的清单字段有:

name (str, required)
    模块的可读名称
version (str)
    模块的版本,应该遵循语义版本控制(semantic versioning)规则
description (str)
    模块的扩展描述, 使用结构化的文本(reStructuredText)
author (str)
    模块的作者
website (str)
    模块作者的网址
license (str, defaults: AGPL-3)
    模块的发布许可证
category (str, default: Uncategorized)
在Odoo中的分类,模块大致的业务领域。
尽管推荐使用现有的分类,但这个字段可自由指定,未知的分类是动态创建的。分类的层次结构可使用分隔符"/"创建。例如,Foo/Bar将创建分类Foo,以及分类Bar作为Foo的子分类,并将Bar设置为此模块的分类。
depends (list(str))
必须先于此模块加载的Odoo模块,可能因为此模块使用了这些模块的特性,或者改变了这些模块定义的资源。
    安装一个模块时,所有的依赖项将先于它安装;同样地,加载此模块时也会首先加载依赖项。
data (list(str))
数据文件列表,必须随模块安装或更新;基于模块根目录的路径列表。
demo (list(str))
数据文件列表,只会在演示模式下安装或更新。
auto_install (bool, default: False)
如果是True,在所有的依赖项已安装后,此模块会被自动安装。
通常用于"link modules",实现两个原本独立的模块间的协同集成。
举例来说,sale_crm依赖于sale和crm,并被设为auto_install。当sale和crm均被安装时,它自动装上CRM营销追踪销售订单,无须sale或crm意识到对方。

__openerp__.py文件实例(译者附):

# -*- encoding: utf-8 -*-
{
	"name": "my_test",
	"version": "8.0.0.1",
	"description": """
	This is just a test.
	""",
	"author": "Eric",
	"website": "http://www.mytest.com",
	"license": "AGPL-3",
	"category": "YD",
	'depends': [
		'base',
	],
	"data": [
		'test_view.xml',
	],
	"demo": [
		'demo_data.xml',
	],
	"auto_install": False,
} 


作者:wangnan537 发表于2014/12/19 21:15:05 原文链接
阅读:1826 评论:0 查看评论

Simon537[原]Odoo文档管理/知识管理应用实践 - 上传附件

测试环境: Odoo8.0

Odoo中的文档管理/知识管理可用于保存采购、销售、生产等一系列业务流程中产生的文件、凭证,可关联到具体的每一笔业务操作;也能用于管理公司的合同、资料,创建知识库以分享内部文档,实乃居家旅行的必备神器。

下文作简要描述:

1. document模块与knowledge模块的安装顺序
如先安装document模块, knowledge模块会同时自动安装, 并启用知识管理菜单;
如先安装knowledge模块, 要先通过菜单 设置->设置->知识管理, 勾选"管理文档", 才会安装document模块, 并启用知识管理菜单

2.上传附件
安装document模块与knowledge模块后,我们就可以上传附件了。有2种方式上传附件:
1)通过二级菜单打开某业务对象,打开对象的form视图,通过视图上方的 附件->添加..., 上传文件


2)点击菜单 知识管理->配置->文档管理->目录结构,再点击打开任一目录,点击"新建"按钮, 然后上传文件


备注:
可通过菜单 知识管理->配置->文档管理->目录来创建新的目录。如指定所有者,则只对指定的所有者可见;不指定所有者时所有人可见;也可通过安全设定,指定哪些用户组可见。

3. 附件的存放位置
如果在配置文件openerp-server.conf中指定了数据的存放目录,如下所示(data为目录名):
data_dir = data
则上传的附件存放的相对路径为: data\filestore\dbname\random_folder\random_filename, 说明
daname - 帐套名
random_folder - 以2位十六进制数命名的随机的目录名
random_filename - 以40位十六进制数命名的随机的文件名

4. 附件信息表ir_attachment
附件信息记录在表ir_attachment中, 有如下主要字段:
datas_fname - 原始文件名
res_model - 关联的对象(采用第1种上传方式时,该字段才有值)
res_name - 对象名(采用第1种上传方式时,该字段才有值)
name - 指定的文件名(采用第1种上传方式时与原始文件名相同; 采用第2种上传方式时该字段值为上传时指定的附件名称)
file_size - 文件的大小, 以字节为单位
store_fname - 相对路径, 格式为random_folder/random_filename
-- 查询示例
select datas_fname, res_model, res_name, name, file_size, store_fname from ir_attachment;

作者:wangnan537 发表于2014/12/13 0:19:42 原文链接
阅读:2064 评论:2 查看评论

Simon537[译]命令行界面: odoo.py(Odoo启动参数)

英文网址: https://www.odoo.com/documentation/8.0/reference/cmdline.html

运行服务器

-d <database>, --database=<database>
指定安装或更新模块时使用的数据库。

--db-filter=<filter>
隐藏不匹配过滤器的数据库。此过滤器是一个正则表达式,说明如下:
%h 会被替换为请求的整个主机名
%d 会被替换为请求中除www以外的子域名(因此域odoo.com和www.odoo.com都将匹配odoo数据库)
译者注:
(1)如果请求的URL为hostname.domainname.com,则%h对应hostname.domainname.com,%d对应hostname。
(2)等号右侧可使用'%d'、'^%d'或者'^%d$'(^表示正则表达式的开始,$表示正则表达式的结束)


-i <modules>, --init=<modules>
指定运行服务器前要安装的模块清单,用逗号分隔开;需要-d参数。

-u <modules>, --update=<modules>
指定运行服务器前要更新的模块清单,用逗号分隔开;需要-d参数。

--addons-path=<directories>
指定模块的存放目录清单,用逗号分隔开。扫描这些目录用于模块(注意:什么时候?为什么?)。

-c <config>, --config=<config>
指定一个替代的(译者注:非默认的)配置文件。

-s, --save
将服务器配置保存到当前的配置文件(默认指$HOME/.openerp_serverrc, 可使用-c覆盖)。

--test-enable
安装模块后运行tests。

--debug
当意想不到的错误出现时(不是警告或访问错误),在记录日志和返回错误前自动启动pdb。

搭支架(Scaffolding)

搭支架(Scaffolding)指自动创建一个框架结构来简化程序引导(在Odoo中指新模块)。尽管不是必须的,但它能让我们免于单调的设置基本结构和查找所有初始的必须项。
可通过odoo.py scaffold子命令执行Scaffolding。
-t <template>
指定模板目录,文件通过jinjia2(译者注:用于Python的一个全功能模板引擎)传输,然后拷贝到目标目录。

name
指定要创建的模块名称,以各种方式处理以生成程序化的名称(如模块目录名,模块名...)

destination
指定在哪个目录中创建新模块,默认为当前目录。

配置文件

大多数的命令行选项也可以在配置文件中指定。
默认的配置文件是$HOME/.openerp_serverrc,可使用--config替换。指定--save会将当前配置状态保存到配置文件。
作者:wangnan537 发表于2014/12/5 20:08:05 原文链接
阅读:1413 评论:0 查看评论

Simon537[转]在Ubuntu Server 14.04 LTS版上以git方式源码安装Odoo8.0

英文地址: http://www.theopensourcerer.com/2014/09/how-to-install-openerp-odoo-8-on-ubuntu-server-14-04-lts/
译文地址: http://shine-it.net/index.php?topic=16623.msg29044#msg29044
转载地址: http://jointd.com/?p=1998

2014年9月19日, Odoo官方发布了Odoo8.0正式版本,这是一个全新的版本,整合了网站建设等多种功能。
在Linux类操作系统中, 安装Odoo的常规办法是从Odoo官方网站的下载库http://nightly.openerp.com相应版本的目录里面下载一个.deb安装包(用于Debian/Ubuntu类型的Linux系统)或者一个.rpm安装包(用于Redhat/CentOS类型的Linux系统),并且运行安装。但这种做法下,安装的配置是按照Odoo官方的默认配置进行的,个性化设置空间小,有时候不方便管理。因此我们采取更手工化的源码安装方式,自己配置安装所需的配置。
本文介绍在Ubuntu Server14.04版操作系统中通过Github以源代码模式安装Odoo的方法。这种做法的优点是:
当官方的源代码升级时,或者有新的bug修正时,如果需要,我们可以在网络连通的情况下仅仅用一个"git pull"命令就能更新本地的代码。
请注意,未来在进行pull代码的操作时,需要事先做好备份。有些情况下,Odoo的数据库也需要更新。

第一步 建立服务器安装Ubuntu Server 14.04

访问Ubuntu官方网站服务器版页面http://www.ubuntu.com/server下载安装镜像,服务器版目前已经没有32位版本,只有64位版。或者从国内的网易源下载镜像 :http://mirrors.163.com/ubuntu-releases/14.04/ubuntu-14.04-server-amd64.iso下载完成后将镜像制成启动光盘或者优盘,按照常规的方法将它安装在电脑上,记好自己设置的用户名和密码。
本文以设定主机名为odoo、用户名为dean为例进行Ubuntu系统的安装,下面各步骤中如果有的命令与主机名和用户名相关,请读者自行改成自己实际的主机名和用户名。
在安装进行到选择预安装的服务的步骤时,选中PostgreSQL,把Odoo所需的数据服务环境PostgreSQL数据库一并装好。
系统装好重启后用自己用户名和密码登录进去,运行
psql –version
命令查看版本,目前随Ubuntu 14.04服务器版安装的是PostgreSQL的9.3.5版本

下边更新服务器的软件源信息:
sudo apt-get update
并且更新服务器的各个软件包,自动查找依赖关系:
sudo apt-get dist-upgrade
尽管并不总是必须的,但此时最好重启下服务器,以使改变的内容更新。
sudo shutdown -r now

第二步 创建一个系统用户odoo,将来让他拥有Odoo程序的权限并运行它

运行命令
sudo adduser --system --home=/opt/odoo --group odoo
这里添加的odoo用户是一个系统用户,它是用来拥有并运行各种后台服务的一类用户,而不是用来登录进系统进行各种操作的个人用户。在上述命令中指定并创建了odoo 用户的"home", home目录为/opt/odoo,这里就是我们将要把odoo程序代码存放的位置。你可以自由选择代码存放的位置,但请注意下文中的一些配置文件里面的内容是基于上述命令指定的目录而定的,所以当读者自行选择代码存放位置时,下文中的某些设置要自行修改。虽然系统用户被禁止用于登录,并且没有shell,但是当我们需要以它的身份进行一些特定操作的时候,还是可以用su命令切换用户:
sudo su - odoo -s /bin/bash
这个su(Switch User)命令将把你目前的终端登录切换到odoo用户,并且使用/bin/bash这个shell。这命令运行后会自动把你当前所在的目录切换到odoo用户的home目录/opt/odoo。当你以odoo用户身份操作完毕后, 可以用
exit
命令离开odoo用户的shell,回到你登录所用的用户。

第三步 安装和配置数据库服务器PostgreSQL

如果你之前在安装Ubuntu服务器过程中没勾选一并安装PostgreSQL,那么可以现在安装:
sudo apt-get install postgresql
如果已经安装过了则不必执行这个命令。
下面为PostgreSQL数据库添加并配置odoo用户 :
首先切换到postgres用户,它是PostgreSQL默认的初始用户,以它的身份操作我们就有配置数据库的权限:
sudo su - postgres
然后以postgres的身份创建一个新的数据库用户odoo,odoo程序将以它的身份访问postgreSQL数据库,来创建和删除数据库文件。
createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo
系统提示两次输入密码:
Enter password for new role: ********
Enter it again: ********
记住你这里设置的密码,后文中你会用到它。最后退出postgres用户身份:
exit

第四步 为Ubuntu服务器安装Python运行库和wkhtmltopdf

Odoo8.0版本依赖的python运行库与OpenERP7.0版本所依赖的有些不同。
运行命令
sudo apt-get install python-dateutil python-docutils python-feedparser python-gdata \
python-jinja2 python-ldap python-libxslt1 python-lxml python-mako python-mock python-openid \
python-psycopg2 python-psutil python-pybabel python-pychart python-pydot python-pyparsing \
python-reportlab python-simplejson python-tz python-unittest2 python-vatnumber python-vobject \
python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-pyPdf \
python-decorator python-passlib python-requests
 
Odoo8.0版改用wkhtmltopdf来输出pdf,因此要下载wkhtmltopdf 并安装:
wget http://sourceforge.net/projects/wkhtmltopdf/files/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb
然后运行
sudo dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb
进行安装。
安装完成后将可执行文件复制到 usr/bin 中
sudo cp /usr/local/bin/wkhtmltopdf /usr/bin/wkhtmltopdf
更改所有者为root用 户,并增加可执行属性
sudo chown root:root /usr/bin/wkhtmltopdf
sudo chmod +x /usr/bin/wkhtmltopdf
测试一下,打印一个网页到自己的home目录:
wkhtmltopdf www.baidu.com ~/baidu.pdf
如果显示成功输出了pdf,那么表明wkhtmltopdf安装成功。

安装中文字体:
sudo apt-get install ttf-wqy-zenhei
sudo apt-get install ttf-wqy-microhei
(Odoo中为何不能加载这些字体?)
这里安装完了之后,所有Odoo8.0运行时依赖的项目都已安装完成。

第五步 安装Odoo服务器

先安装git软件
sudo apt-get install git
切换到odoo用户:
sudo su - odoo -s /bin/bash
用git软件从github网站的odoo8.0分支下载一套代码(下边的命令第一行末尾的 - 和第二行开头的 b 之间没有空格;命令最后一个单词后面的一空格加一个点"."
是必须的,这个点表示"当前目录",不是个句号):
(下载时发现不能保存到当前目录,可以先下载至指定目录再移动到该目录)
git clone https://www.github.com/odoo/odoo --branch 8.0 --single-branch .
或者用这个:
git clone -b 8.0 https://github.com/odoo/odoo.git .
(有一百多兆东西要下载,根据你的网速,这里会花上些时间)
下载完整的分支到当前odoo目录:
git clone https://github.com/odoo/odoo.git .
全下载好了之后 ,退出odoo用户:
exit

第六步 配置Odoo程序

Odoo默认的配置文件(/opt/odoo/debian/openerp-server.conf)包括基础的设置内容,做一点小小改动就可以在我们的系统上很好地运行,这里我们先把这个文件复
制到我们需要的位置/etc下:
sudo cp /opt/odoo/debian/openerp-server.conf /etc/odoo-server.conf
更改它的所有权和许可:
sudo chown odoo: /etc/odoo-server.conf
sudo chmod 640 /etc/odoo-server.conf
上述命令让这个文件被odoo用户和用户组拥有,并且只有odoo用户和root用户可以读取。
下面用文本编辑器编辑它,初学者建议使用Ubuntu自带的nano编辑器, 以它为例, 运行:
sudo nano /etc/odoo-server.conf
然后做3处改动,
1.打开这个配置文件后,在文件顶部,找到
db_password = False
这一行,把等号后面的 False 改为你第三步配置postgreSQL时设定的数据库密码。
2. 然后找到
addons_path = /usr/lib/python2.7/dist-packages/openerp/addons
这一行,改成
addons_path = /opt/odoo/addons
这样odoo程序会到我们个性化安装的opt/odoo/addons目录里面去读取模块。
3. 我们还要指定Odoo往哪里写它的日志文件。在文件的末尾新加一行
logfile = /var/log/odoo/odoo-server.log
配置文件编辑好后,按Ctrl+O,然后回车覆盖保存,然后Ctrl+X退出nano程序。
现在你可以试着启动Odoo服务器,看它是否正常运行。
先切换到odoo用户,
sudo su – odoo -s /bin/bash
然后运行
/opt/odoo/openerp-server
如果你得到的界面反馈是几行字,告诉你"OpenERP is running and waiting for connections."那么就OK了。(虽然版本升级了,但是在日志里面仍然把这程序叫OpenERP 而不是 Odoo)
如果有错误出现,你就要回头找找看看问题出在哪。一切正常的话,按 Ctrl+C 来停止服务器,然后用
exit
命令离开odoo用户,回到你自己登陆的shell。

第七步 安装启动脚本

启动、停止odoo服务牵扯到许多模块,需要多个步骤的操作,比较繁琐,下边我们安装一个脚本,它将以批处理的方式处理这些步骤,我们只要运行这个脚本一次,它就能以正确的用户身份批处理地运行odoo服务器的启动和停止等动作。
odoo程序提供了一个现成的脚本,是/opt/odoo/server/install/openerp-server.init这个文件,但需要一点小改动——因为我们不是按odoo的默认安装方式装的。
这里有个修改好的脚本文件,可以下载使用:(下边的命令第一行末尾的/和第二行开头的o之间没有空格)
wget http://www.theopensourcerer.com/wp-content/uploads/2014/09/odoo-server与配置文件类似,你得把下载到的这个脚本复制到/etc/init.d/并将其命名为odoo-server:
sudo cp ~/odoo-server /etc/init.d/odoo-server
然后把它改成可执行文件,由root用户拥有:
sudo chmod 755 /etc/init.d/odoo-server
sudo chown root: /etc/init.d/odoo-server
在第六步我们编辑的配置文件里面指定了odoo 服务器的日志文件存储位置,现
在我们得创建那个目录,这样odoo服务器就能往里面写日志了,同时我们还得让这个位置能够被odoo用户读写:
sudo mkdir /var/log/odoo
sudo chown odoo:root /var/log/odoo

第八步 测试服务器

要启动Odoo服务器,输入:
sudo /etc/init.d/odoo-server start
现在你可以查看日志文件,看服务器是否已经启动
less /var/log/odoo/odoo-server.log
(要退出less命令的查看界面,只需按一下q键)
如果启动服务器过程中出现问题,你可以依据日志文件的内容查找原因。
如果一切正常,现在就可以用网络浏览器访问odoo的web页面,地址的格式为:
http://Odoo服务器的IP或者域名:8069
例如Odoo服务器的IP是192.168.1.10,那么在同一局域网的其它电脑上,打开网络浏览器(由于odoo使用的是较新的HTML5标准,所以在Windows XP自带的IE6上无法正常显示,建议下载安装个新版的Chrome或者Firefox浏览器),在地址栏输入:
http://192.168.1.10:8069
就应该能看到Odoo的数据库管理界面,因为是全新安装,一个帐套都没建立过,所以默认会来到这个界面。
建议读者此时修改Odoo系统的主密码master password 并牢牢记住它,这个密码是用来创建、复制、删除、备份、恢复数据库的,权力很大,最好设个强的密码。默认
的主密码是"admin",比较不安全。该密码以明文方式写在/etc/odoo-server.conf文件里面。这也是我们为什么把这个文件设成只有odoo用户和root用户可以读的原因。
当你在web界面上修改并且保存了新的主密码。/etc/odoo-server.conf 这个文件会被覆盖写入 ,并且会多出一些选项。
下边检查odoo服务器是否可以被恰当地停止:
sudo /etc/init.d/odoo-server stop
检查下日志文件,确定下服务已经停止,也可以用top命令查看Ubuntu服务器正在运行的进程表来确认。(退出top命令的查看界面也是按q键)

第九步 自动化Odoo的启动和关闭

前面的步骤如果都运行正常的话,最后的步骤就是让启动脚本随着Ubuntu服务器的开 、关机而自动启动 、关闭Odoo服务。
sudo update-rc.d odoo-server defaults
如果你喜欢的话,你现在就可以重启动你的服务器,当你再登录进来的时候,Odoo应该已经在运行了。如果你输入
ps aux | grep odoo
你将会看到像下面这样的信息:
odoo 1491 0.1 10.6 207132 53596 ? Sl 22:23 0:02 python /opt/odoo/openerp-server -c /etc/odoo-server.conf
这显示服务器正常运行,当然你也可以检查日志文件或者用网络浏览器访问的方式来验证。
作者:wangnan537 发表于2014/12/3 10:50:09 原文链接
阅读:3427 评论:0 查看评论

Simon537[转]为Odoo安装PDF报表运行环境

摘自 http://shine-it.net/index.php?topic=16623.msg29044#msg29044

Odoo8.0使用wkhtmltopdf来输出pdf,因此要下载安装wkhtmltopdf。
#下载
#注意根据操作系统选择相应版本
wget http://sourceforge.net/projects/wkhtmltopdf/files/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb
#安装
sudo dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb
#安装完成后将可执行文件复制到usr/bin中
sudo cp /usr/local/bin/wkhtmltopdf /usr/bin/wkhtmltopdf
#更改所有者为root用户,并增加可执行属性
sudo chown root:root /usr/bin/wkhtmltopdf
sudo chmod +x /usr/bin/wkhtmltopdf
#测试一下,打印一个网页到当前用户的home目录
wkhtmltopdf www.baidu.com ~/baidu.pdf
#如果显示成功输出了pdf,则wkhtmltopdf安装成功
#安装中文字体
sudo apt-get install ttf-wqy-zenhei
sudo apt-get install ttf-wqy-microhei

实际操作经验: 通过菜单 设置->公司->公司,打开公司,然后在报表的结构选项卡中的字体栏设置字体,先点"重新加载字体"(加载本地ttf字体),然后选择KaiTi(Windows); DejaVu Sans(Ubuntu), 中文无乱码。
作者:wangnan537 发表于2014/11/21 23:15:03 原文链接
阅读:1889 评论:0 查看评论