Git 工作区、暂存区和版本库

基本概念
我们先来理解下Git 工作区、暂存区和版本库概念

工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。

图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

当对工作区修改(或新增)的文件执行 “git add” 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

当执行 “git rm –cached ” 命令时,会直接从暂存区删除文件,工作区则不做出改变。

当执行 “git checkout .” 或者 “git checkout — ” 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

当执行 “git checkout HEAD .” 或者 “git checkout HEAD ” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

Git-Gui的中文乱码解决方法

在Windows下使用Git-Gui时,可能会出现代码中的中文乱码的情况。
解决方法:
在软件的安装目录下,在Git\mingw64\etc\gitconfig文件末尾添加:

[gui]
encoding=utf-8

这样代码中的中文就能够正常显示了。

另外 关于软件的其他部分的软件相关中文乱码,解决方法如下:
打开软件,在Edit -> Preferences -> fonts 中修改相应的配置即可。

最简git服务器搭建和测试

git是一个开源的版本管理软件,通过git可以方便地进行软件的协同开发、历史回溯等,下面是一个最简单的git服务器搭建和测试步骤,为了方便,后面还有一个一键自动化搭建的脚本。前提是对git有一定了解,并且已经安装好git。
1.sudo apt-get install git openssh-server openssh-client
2.useradd -r -s /sbin/nologin git
3.ssh-keygen -C “12345@qq.com”
4.touch /home/git/.ssh/authorized_keys
5.mkdir -p /data/git && cd /data/git
git init –bare sample.git && chown -R git.git /data/git
6.git clone ssh://git@192.168.20.27:5270/home/git/code/sample.git

一、最简git服务器搭建和测试

服务端搭建:

说明:搭建一个空的hello.git的远程仓库(ip:192.168.1.155)

1.添加git用户

sudo useradd -m git

sudo passwdgit

su git

2.进入/home/git并初始化空的仓库,结果如图1所示,创建了一个名为hello.git的代码仓库

cd /home/git

git init –bare hello.git

图1 hello.git代码仓库

客户端测试:

说明:初始化一个本地仓库,然后推送到服务端

1.新建一个hello的目录,并写一段helloworld的代码

2.在hello目录下创建一个git仓库,并提交一次

git init

git add –all

git commit

3.添加远程代码仓库

git remote add origingit@192.168.1.155:/home/git/hello.git

4.推送master分支到远程,执行结果如图2所示,服务端多了一个master分支

git push origin master

图2 客户端测试流程

5.到另外一个目录下克隆远程仓库

git clonegit@192.168.1.155:/home/git/hello.git

二、最简git服务器自动化搭建脚本

说明:创建git仓库并搭建一个空的hello.git的远程仓库(ip:192.168.1.155)

脚本源码:

gitnew.sh:

#!/bin/sh

parmNum=$#

if [ $parmNum -eq 0 ];then

echo “Run as:”

echo “1.Create git account and repertory: ./gitnew.sh repertory”

echo “2.Create git account only: ./gitnew.sh null”

exit

fi

repertory=$1

echo “[$0]:Add git account:”

sudo useradd -m git

echo “[$0]:Passwd git account:”

sudo passwd git

if [ $repertory != “null” ];then

cd /home/git

repertory_git=”$repertory.git”

echo “[$0]:Create $repertory_git”

sudo git init –bare $repertory_git

sudo chown -R git:git $repertory_git

cd –

fi

echo “[$0]:Enjoy”

运行结果:

脚本运行完成之后,如图3所示,创建好了一个hello.git的远程仓库,跟上面的一模一样。

图3 自动化脚本创建代码仓库

三、解决客户端推送和克隆要输入服务端git登录密码的问题

1.在服务端/home/git目录下新建一个.ssh目录

mkdir .ssh

2.在.ssh目录下新建一个authorized_keys文件

touch authorized_keys

3.把客户端的ssh公钥写到authorized_keys文件中,一行一个

echo **** >>authorized_keys

Gitweb最简安装

1.安装gitweb程序
sudo apt-get install gitweb apache2
安装完成后,会自动生成/etc/gitweb.conf和/etc/apache2/conf-available/gitweb.conf两个文件。

2.配置git服务端
根目录修改/etc/gitweb.conf 中的$projectroot 为:
$projectroot = “/home/git” ;

3.启动gitweb服务
重启Apache服务器:
sudo service apache2 restart

4.测试
在客户端输入:http://192.168.1.155/gitweb/ 即可看到新建的项目。

5.安装CGI.pm
linux下perl及cgi.pm的安装(perl-5.22.1)
1.下载并解压perl-5.22.1(或者其他什么版本)
2.执行./Configure -des -Dprefix=/usr/local/perl
3.make ; make install;
4.建立软链接到/usr/bin
ln -s /usr/local/perl/bin/perl /usr/bin/perl
这里注意一下,若是之前安装过perl的话,需要先把/usr/local/下的perl改名或者删除什么的
5.如果没有意外,这就安装成功了.可以使用 perl -v查看版本信息什么的

安装CGI.pm的步骤
1.执行 perl -MCPAN -e shell
2.执行 install CGI.pm
3.没有以外的话这个模块也就安装成功了
可以在终端里执行 perl -MCGI -e ‘print “CGI.pm version $CGI::VERSION\n”;’ 这条命令来验证是否安装成功
如果出现 CGI.pm version 4.26 这种显示CGI版本的文本,恭喜你.

Windows Server 2008 R2中关闭“IE增强的安全配置”

当在Windows Sever 2008 R2中运动IE8的时候会发现默认情况下IE启用了增强的安全配置,为了方便而且是在内网的情况下我们可以关闭IE8的增强安全配置,操作很简单如下步骤。

一,以本机管理员或是域管理员的身份登陆系统,在“开始”菜单–>“管理工具”–>“服务器管理器”,如下图:(或者点击任务栏上的服务器管理器图标即可)

二,或者在“开始”菜单–>“运行”中输入“servermanager.msc”回车即可,如下图:

 

三,在打开的服务器管理器窗口中选中“服务器管理器”,然后单右边窗口中的“配置 IE ESC”如下图:

在接下来打开的新窗口中,分别选中“管理员”–>“禁用”,“用户”–>“禁用”。默认情况是开启的,这里全部禁用即可,如下图:

odoo12 免费常用及高级widget大全,社区及企业版共计100多个

odoo 12 从2018年10月16日发布至今,大概快3个月。 从12发布到现在,我们一直在熟悉新版的变化,并进行实施开发。如今12完全可以在我们的项目中进行商用,也迁移了很多原有的10和11模块到odoo12。

odoo12除了在业务流程逻辑上进行了不少优化,在前端也基本完全重构。 前端的js由原来单文件拆成了 view = controller + render + model 的结构,更为规范。除了性能,12很明显的特征就是界面更友好,操作更方便,这极大的得益于前端的重构,具体上就是用大量的 widget 实现UI优化。

花了不少时间,基本把所有widget都试了下,光是odoo12本身就已经有超过100个widget,少量是企业版的(自求多福),很多功能十分好,实现了很多想要的效果。 在此简单整理下,后续会更新些说明。

简述

至于 widget 怎么用,如果你能对widget感兴趣,应该具备一定能力了。 一句话,“odoo的源码就是大宝库”。这里放个 label_selection 的截图,本来是要写一个类似的,结果找源码找到了,发现十分好用。常规的 listview 有decoration可以用不同色,但太不明显,用了这个,在不同状态可以有更明显的css样式,简单处理下也可以用在时间上。比如还有2天就到期,显示红色 danger,还有5天的就显示橙色 warning。 业务跟单是硬需求,十分好用!!

以下是 odoo 12 社区版和企业版的全部 widget了(如果你还找到别的,欢迎补充)

odoo12 所有的widget, 基础与高级的大全

odoo12 基础 widget 高级 widget,多数为关联型及模块专有
abstract appointment_employee_url
ace asyncwidget
attachment_image barcode_handler
binary bullet_state
boolean deprec_lines_toggler
boolean_button field_float_scannable
boolean_favorite field_partner_autocomplete
boolean_toggle filters
char form.many2many_tags
CopyClipboardChar gauge
CopyClipboardText hierarchy_kanban
dashboard_graph hr_org_chart
date html
datetime html_frame
domain inventory_barcode_handler
email iot
float iot_picture
float_factor kanban.many2many_tags
float_time kanban.many2one
float_toggle kanban_activity
handle list.many2one
html lot_barcode_handler
image mail_activity
input mail_followers
integer mail_thread
kanban_state_selection many2many
label_selection many2many_binary
link_button many2many_checkboxes
monetary many2many_select
pdf_viewer many2many_tags
percentage many2many_tags_email
percentpie many2manyattendee
phone many2one
priority marketing_activity_graph
progressbar mrp_time_coun
state_selection one2many
statinfo one2many_list
text pad
toggle_button password_meter
payment
picking_barcode_handler
previous_order
radio
reference
report_layout
res_partner_many2one
section_and_note_one2many
section_and_note_text
selection
selection_badge
sms_widget
statusbar
tablet_image
tablet_kanban_view
tablet_list_view
terback_arrow
test
test_barcode_handler
timesheet_uom
timezone_mismatch
upgrade_boolean
upgrade_radio
url
website_button

odoo13前瞻-我们为什么要做企业版与社区版-来自odoo创始人Fabien Pinckaers的官宣

odoo12是一个里程碑产品,功能速度友好性都比之前版本作了极大的增强。而作为一个以开源为核心的产品,不断的超越自我是 odoo.com 的一种惯性,让我们一起看看 odoo创始人 Fabien Pinckaers 是怎么说未来的odoo13和odoo的发展蓝图的。

原文地址: https://www.odoo.com/zh_CN/blog/odoo-news-5/post/odoo-community-enterprise-532

odoo社区版与企业版:他们一起将更强大

2019年03月15日 01时51分11秒, Fabien Pinckaers

 

2015年,我们宣布了我们业务模式的一个重大转折点。在开发开源软件和销售支持服务之外,我们也同时进行了商业化转型。除了我们的开源产品Odoo Community社区版,我们还开发了额外的专有应用程序即Odoo Enterprise企业版。

 

从业务角度来看,odoo商业化是必要的。

服务利润不足以为软件供应商的活动提供足够的资金,开发产品,建立品牌和全球合作伙伴网络都需要大量投资。在此之前,我们的收入来源不可持续;新客户往往会支付第一年的支持,但是,随着一切正常,他们没有续订未来几年的许可与服务。

 

从开源的角度来看,odoo商业化也是必要的。

我们正处在一个不断发展的市场中,客户期望和竞争对手正在快速提升。如果我们没有大量投入产品,Odoo社区将在几年内被弃用,就像其他开源ERP一样。因此,我们需要一个可持续的收入流,这将允许我们招募更多的开发人员来改进开源软件。

 

从这一天开始,我们开启了一段奇妙的旅程。在商业方面,我们在2015年每月亏损50万欧元。我们只有几周的现金可用。截至2016年底,我们的现金流量为每月盈利50万欧元。odoo社区版也得到了共赢:我们现在有4倍以上的开发人员开发和维护我们的开源产品Odoo社区版。 (约180名开发人员)

 

进行商业化转型的关键决策之一就是避免存在两个相互冲突的产品(Odoo社区版与Odoo 企业版)。因此,我们让Odoo企业版建立在Odoo社区版的基础上。这样,一方的成功将推动了另一方的成功:Odoo 企业版受益于数百万社区用户创建的生态,Odoo社区版受益于Odoo企业版的不断改进。

 

如何知道新功能是在Odoo社区版还是企业版?

我们的大多数开发都涉及现有模块的改进,而不是新应用程序。显然,当我们改进社区模块,我们在Odoo社区版开发,如果我们改进企业应用程序,我们在Odoo 企业版中开发。

 

我们将专注于改善Odoo社区版和Odoo企业版:

  • Odoo社区版的优势在于将大量用户带到Odoo并吃掉竞争对手的单一应用市场(我们的对手将很难与免费而高质量的软件产品竞争)。
  • Odoo 企业版的优势在于可以产生更多收入,使我们能够在产品开发上投入更多资金。

 

我们的目标是在Odoo社区版和企业版之间保持良好的平衡。我们认为80%的开发应该是开源以吸引更多用户,另外的20%将在Odoo 企业版中以改善我们的收入流,这最终使我们能够招募更多开发人员从事开源产品。开源版或企业版的另一个标准是应用程序的性质:

  • 如果它是一个高价值的利基市场(较大的细分市场中具有相似兴趣或需求的一小群顾客所占有的市场空间),Odoo 企业版将更适合(它不会带来数百万用户,因为我们可以轻松销售该功能)
  • 如果它是一个拥有现有开源软件的大众市场,我们更愿意在开源软件Odoo 社区版中发布我们的模块(我们不会产生大量收入,但我们可以吸引数百万用户使用Odoo)

 

基于此,以下是我们为Odoo 13构建的新应用程序的两个示例:

  1. 新的E-Learning在线学习和认证应用将是开源的。它有可能覆盖数百万用户(例如学校和大学),并且已经在这个领域建立了许多竞争对手,因此很难获利。
  2. FSM即现场服务管理应用程序将出现在Odoo企业版。它是一个利基市场(约占公司的5%),但由于目前的竞争对手拥有的都是旧产品,因此很容易商业化。

当然,这些都不是黄金法则。我们可能会做一些例外,但这个原则将会引导我们的决策。

请注意,FSM现场服务管理应用程序依赖于现有的免费开源应用程序(例如,项目管理,计费和销售)。因此,我们为现场服务管理所做的部分开发也必将为开源产品做出贡献。

 

优化企业版与社区版的边界

2015年,我们匆忙完成了工作。为了推出新的开放核心模型,大多数新功能都是在Odoo 企业版中开发的。由于我们当时是有100%的开源和0%付费功能,我们需要在企业版中添加功能以达到我们的“80%开源,20%专有”目标。两个产品之间的分离已经在版本页面中详细介绍,从那时起我们就遵循了这个方向:点此查看Odoo 企业版与社区版版本区别

 

但我认为,对于最终用户来说,如果应用程序是完全社区版者或完全企业版,而不是两者兼而有之,那么它会更好。我们希望避免使用具有专有功能的开源应用程序,这对Odoo社区用户来说可能会产生误导或令人沮丧。如果拆分是“每个应用程序”,而不是“每个功能”,则更容易理解。

 

为实现这一目标,我们计划从Odoo 13(目前在Odoo 12 企业版)开源以下模块:

  1. CRM Lead Scoring,因为它是开源CRM应用程序的一项功能
  2. 优惠券,因为它是我们的开源电子商务应用程序的一个功能
  3. 邮件主题作为群发邮件应用程序是开源的
  4. 网站主题作为网站构建器应用程序是开源的
  5. 数字产品,因为它是电子商务的一个特色
  6. POS的会员忠诚度和奖励计划,因为它是开源POS的一项功能
  7. 并非所有应用都必须是开源的。但是当我们在Odoo社区版中加入应用程序时,我们会投入使其成为市场上最好的应用程序。

 

此外,我们还将通过删除Odoo社区版中没有Odoo 企业版时就无法使用的代码来强化我们的Odoo 企业版:

  • 我们将停止维护开源的人力资源工资应用程序,因为该模块远非可用的开箱即用。 (它多年来一直隐藏在网站和软件之外)相反,我们计划开发Odoo 企业版中缺少的功能,使其成为一个真正的应用程序:福利管理,报告,本地化等。我们准备投入大量资金对此进行本地化,保障这种投资有效性的唯一方法是在企业版在实现工资管理(我们认为工资是一个利基市场,因为我们主要针对通常转包工资单的中小企业)
  • 财务会计:我们计划停止维护旧的报表引擎,因为它在Odoo企业版中不再使用。帐帐相符功能将迁移到企业版,该功能在Odoo社区版中将不再存在。

我们计划在2019年10月发布的Odoo 13中进行这些更改。

 

如果您使用的是开源工资模块的代码,该怎么办?

我们不“关闭”开源代码。如果需要,您将始终能够得到Odoo 12 工资模块的Github分支并维护它(或者将其改编为Odoo 13)。 LGPL中的内容仍然存在于LGPL中。

但是,我们将停止维护Odoo 13的开源工资引擎。相反,我们将专注于构建完整的工资单应用程序并在Odoo 企业版中开发国家/地区本地化。

 

希望本文有助于您了解Odoo的方向。

使用odoo实现柔性制造ETO,MTO,ATO与MTS(按单设计、按单生产、按单装配和库存生产)

按照企业组织生产的特点,可以把制造企业划分为ETO、ATO、MTO与MTS(按单设计、按单装配、按单生产和库存生产)四种生产类型。

odoo默认实现了mto和mts,以及mto+mto。而对ato看似能操作但即其麻烦,所以对真实的企业ato和eto,需要做不少的开发和配置,开发集中于pmc产品研发的流程管理,集中于更好的操作界面。

我们在定制家居行业实现了ato+eto,在机械设备贸易实现了ato,现在将其设计得更通用,以便适用于多数行业。核心目标就是为企业pmc出门服务,在设计bom,研发bom,生产bom的管理流程上将更完善,做全面plm,pdm管理。

 

先说理论基础。

按单设计(Engineer To Order,ETO)

在这种生产类型下,一种产品在很大程度上是按照某一特定客户的要求来设计的,所以说支持客户化的设计是该生产流程的重要功能和组成部分。因为绝大多数产品都是为特定客户度身定制,所以这些产品有可能只生产一次。在这种生产类型中,产品的生产批量较小,但是设计工作和最终产品往往非常复杂。在生产过程中,每一项工作都要特殊处理,因为每项工作都可能有不一样的操作,不一样的费用,需要不同的人员来完成。当然,除了特殊该产品专用材料之外也有一些与其它产品共享的原材料。

 

按单生产(Make To Order,MTO)

按单生产,就是根据顾客的订单原先的设计制造顾客所需的产品,而生产计划则是依据所收到订单中所指定的产品BOM规划生产排程及购买原料,可以完全依据顾客的特殊要求制造其所需产品,且可将存货降至最低。

 

按单装配(Assemble To Order,ATO)

在这种生产类型中,客户对零部件或产品的某些配置给出要求,生产商根据客户的要求提供为客户定制的产品。所以,生产商必须保持一定数量的零部件的库存,以便当客户定单到来时,可以迅速按定单装配出产品并发送给客户。为此,需要运用某些类型的配置系统,以便迅速获取并处理定单数据信息,然后按照客户需求组织产品的生产装配来满足客户需要。生产企业必须备有不同部件并准备好多个柔性的组装车间,以便在最短的时间内组装出种类众多的产品。

库存生产(Make To Stock,MTS)

在按库存生产策略的类型中,客户基本上对最终产品规格的确定没有什么建议或要求,他们的投入很少。生产商生产的产品并不是为任何特定客户定制的。但是,按库存生产时的产品批量又不像典型的重复生产那么大。通常,这类产品可能属于大众化的市售通用规格的消费商品,也可能是企业的自有品牌产品;它随着市场的需求并参考本身的库存存量来决定是否要安排生产计划。

附:企业类型(ODM,OBM,OEM)

OEM(Original Equipment Manufacturer)

其意为原始设备制造商,但它指的是一种“代工生产”的方式,设备制造商利用自己掌握的核心关键技术负责开发及设计并且控管整个销售渠道,但具体的生产加工任务则交给别的企业去做。

ODM(Original Design Manufacturer)

其意为原始设计制造商,是生产者进行整体设计并拥有知识产权;其设计的产品也有被其它企业相中后,再经双方协议挂上其它企业的品牌销售,如此可节省再次设计的成本就称前者(设计制造商)为后者(其它企业)的ODM。

OBM(Original Brand Manufacturer)

其意为原始品牌生产商,是一个近年才流行的术语。指的是生产商自行创立产品品牌,生产、销售拥有自主品牌的产品。有观点认为:收购现有品牌以特许经营方式获取品牌也可算是OBM的一环。

安装阿里云 Python SDK

欢迎使用阿里云开发者工具套件(SDK)。阿里云Python SDK让您不用复杂编程即可访问云服务器、云数据库RDS、云监控等多个阿里云服务。本操作介绍如何获取阿里云Python SDK并开始调用。

如果您在使用SDK的过程中遇到任何问题,欢迎前往阿里云SDK问答社区提问,提问前请阅读提问引导提交反馈

在线调试和生成SDK示例

OpenAPI Explorer提供在线调用云产品API、动态生成 SDK示例代码和快速检索接口等功能,能显著降低使用API 的难度,推荐您使用。

环境准备

  • 使用阿里云Python SDK,您需要一个RAM账号以及一对AccessKey ID和AccessKey Secret。 请在阿里云控制台中的AccessKey管理页面上创建和查看您的AccessKey,或联系您的系统管理员。
  • 使用阿里云SDK调用某个产品的API前,确保您已经在阿里云控制台开通了该产品。

安装阿里云 Python SDK

完成以下操作安装Python SDK:

  1. 安装SDK核心库。
    • 如果您使用Python 2.x,执行以下命令,安装阿里云SDK核心库:
      pip install aliyun-python-sdk-core
    • 如果您使用Python 3.x,执行以下命令,安装阿里云SDK核心库:
      pip install aliyun-python-sdk-core-v3
  2. 安装云产品的SDK。

    以下是安装云服务器ECS的SDK示例:

    pip install aliyun-python-sdk-ecs

使用Python SDK

以下这个代码示例展示了调用阿里云Python SDK的3个主要步骤:

  1. 创建Client实例。在创建Client实例时,您需要获取Region ID、AccessKey ID和AccessKey Secret。
  2. 创建API请求并设置参数。
  3. 发起请求并处理应答或异常。
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
    from aliyunsdkecs.request.v20140526 import StopInstanceRequest
    # 创建AcsClient实例
    client = AcsClient(
       "<your-access-key-id>", 
       "<your-access-key-secret>",
       "<your-region-id>"
    );
    # 创建request,并设置参数
    request = DescribeInstancesRequest.DescribeInstancesRequest()
    request.set_PageSize(10)
    # 发起API请求并显示返回值
    response = client.do_action_with_exception(request)
    print response

如何编辑或退还发票?

在Odoo, 不能在发票已经验证并发送给客户之后修改。假如在验证的发票上出现错误, 合法的方式是对发票进行退款, 将它与原始发票调节, 然后创建新发票。

1.修改验证发票
如果需要修改现有的发票,使用发票上的退款发票按钮。选择退票方式“修改:创建退票,核销,并创建一个新的草稿发票”。

Odoo会自动 :

创建退款发票

将退票和原始发票核销(两者都到已付状态)

创建一个新的发票草案可以修改

然后, 你可以修改发票草案, 并对其进行验证, 一旦它是正确的。

2.取消发票
如果需要退还部分发票, 使用发票的退款发票按钮。选择退票方式”取消:创建一张退票并核销”.

Odoo会自动 :

创建退款发票

将退票和原始发票核销(两者都到已付状态)

没有别的需要做的事情。您可以发送退款通过普通邮件或电子邮件给你的客户, 如果你已经发送的原始发票。

3.发票的退款
如果您需要退还部分现有发票, 使用发票的退款发票按钮。在退款方法域, 选择’创建退款草案’。

Odoo会自动创建一个退款草案。你可以修改的退款(例如 :删除您不想退还线), 并对其进行验证。然后, 发送退款通过普通邮件或电子邮件给你的客户。

小技巧

退票不同于退款。通常情况下,在客户未付款前可退票。如果客户已付款,应退款。