Commit b1fea5eb 董杰

first commit

0 个父辈
正在显示 500 个修改的文件 包含 4395 行增加0 行删除
<<<<<<< HEAD
# odoo
挚锦odoo项目代码
=======
##erp项目代码
>>>>>>> 0123修改
# -*- coding: utf-8 -*-
from . import models
from . import report
\ No newline at end of file
# -*- coding: utf-8 -*-
{
'name': "acct_account",
'summary': """
锐驰财务模块。
""",
'description': """
锐驰财务模块
""",
'author': "jasonD",
'website': "http://www.acctronics.com/",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'acc',
'version': '1.0.0',
# any module necessary for this one to work correctly
'depends': ['base','acct_base','acct_purchase','acct_sale','web','account'],
# always loaded
'data': [
'security/ir.model.access.csv',
'views/acc_account_view.xml',
'views/acc_account_asset_view.xml',
'report/purchase_invoice_report_views.xml',
'views/base_menu.xml',
'views/report_menu.xml',
],
}
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import acc_account
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import purchase_invoice_report
\ No newline at end of file
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# from openerp.osv import osv, fields
from odoo import api, models
from odoo.exceptions import UserError, ValidationError
import datetime,time
class AccPurchaseInvoice(models.AbstractModel):
_name = 'report.acct_account.acct_report_purchase_invoice'
def rmb_upper(self, value):
map = [u"零",u"壹",u"贰",u"叁",u"肆",u"伍",u"陆",u"柒",u"捌",u"玖"]
unit = [u"分",u"角",u"元",u"拾",u"佰",u"仟",u"万",u"拾",u"佰",u"仟",u"亿",u"拾",u"佰",u"仟",u"万",u"拾",u"佰",u"仟",u"兆"]
nums = [] #取出每一位数字,整数用字符方式转换避大数出现误差
for i in range(len(unit)-3, -3, -1):
if value >= 10**i or i < 1:
nums.append(int(round(value/(10**i),2))%10)
words = []
zflag = 0 #标记连续0次数,以删除万字,或适时插入零字
start = len(nums)-3
for i in range(start, -3, -1): #使i对应实际位数,负数为角分
if 0 != nums[start-i] or len(words) == 0:
if zflag:
words.append(map[0])
zflag = 0
words.append(map[nums[start-i]])
words.append(unit[i+2])
elif 0 == i or (0 == i%4 and zflag < 3): #控制‘万/元’
words.append(unit[i+2])
zflag = 0
else:
zflag += 1
if words[-1] != unit[0]: #结尾非‘分’补整字
words.append(u"整")
return ''.join(words)
def _get_datas(self,docids,data=None):
# products = self.env['product.product'].browse(data.get('ids', data.get('active_ids')))
invoice = self.env['account.invoice']
res = {}
if len(docids)>1:
final_total = 0.0
po_names = ''
note_str = ''
bank_str = ''
invoice_str = ''
invoice_models = invoice.browse(docids)
partner_ids = set([tmp.partner_id.id for tmp in invoice_models])
if len(partner_ids) > 1:
raise UserError('请选择供应商相同的账单')
po_name = [po.origin for po in invoice_models]
po_names = ','.join(po_name)
today = time.strftime("%Y-%m-%d")
for invoice_model in invoice_models:
amount_total = invoice_model.amount_total or 0.00
amount_total = round(amount_total,2)
if invoice_model.partner_bank_id:
bank_str = invoice_model.partner_bank_id.bank_id.name + ':' + invoice_model.partner_bank_id.acc_number
if invoice_model.origin and invoice_model.payment_rule:
note_str += invoice_model.origin + ':' + invoice_model.payment_rule + ','
if invoice_model.invoice_number:
invoice_str += invoice_model.invoice_number + ','
final_total += amount_total
res = {
'amount_total':final_total,
'po_names':po_names,
'note_str':note_str,
'bank_str':bank_str,
'invoice_str':invoice_str,
'today':today
}
else:
po_names = ''
note_str = ''
bank_str = ''
invoice_str = ''
# a = {}
# for invoice_model in invoice.browse(docids):
invoice_model = invoice.browse(docids)
amount_total = invoice_model.amount_total or 0.00
amount_total = round(amount_total,2)
upper_amount = self.rmb_upper(amount_total)
if invoice_model.origin and invoice_model.payment_rule:
note_str = invoice_model.origin + ':' + invoice_model.payment_rule
if invoice_model.origin:
po_names = invoice_model.origin
if invoice_model.partner_bank_id:
bank_str = invoice_model.partner_bank_id.bank_id.name + invoice_model.partner_bank_id.acc_number
if invoice_model.invoice_number:
invoice_str = invoice_model.invoice_number
today = time.strftime("%Y-%m-%d")
# a = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
# res[purchase_model.id] = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
res = {
'amount_total':amount_total,
'po_names':po_names,
'note_str':note_str,
'bank_str':bank_str,
'invoice_str':invoice_str,
'today':today
}
return res
def _get_logo(self,useids,data=None):
# company_id = self.env.user.company_id
obj_model = self.env['account.invoice'].browse(useids)
company_id = obj_model.invoice_company
logo = company_id.logo
logo_transfer = str(logo, encoding="UTF8")
# print (logo_transfer)
return logo_transfer
@api.model
def _get_report_values(self,docids,data=None):
report_obj = self.env['ir.actions.report']
report = report_obj._get_report_from_name('acct_account.acct_report_purchase_invoice')
# ac = self._get_total(docids)
# if len[docids] > 1:
datas = self._get_datas(docids)
useids = [docids[0]]
logo_transfer = self._get_logo(useids)
# partner_info = self._get_partner_info(docids)
return {
'doc_ids': report.ids,
'doc_model': report.model,
'docs': self.env[report.model].browse(useids),
'final_datas':datas,
'logo':logo_transfer,
# 'partner_info':partner_info,
'report_type': data.get('report_type') if data else '',
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="acct_report_purchase_invoice">
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="o">
<style tyle="text/css">
.unovo-report-purchase-title {
font-family:"DengXian";
font-size: 25px;
font-weight: bold;
text-align:center;
line-height:40px;
}
.unovo-report-purchase-header {
font-family:"DengXian";
line-height:22px;
font-size:16px;
text-align:right;
}
.unovo-report-purchase-table {
vertical-align: middle;
font-family:"DengXian";
border:1px solid #ccc;
width:100%;
border-collapse:collapse;
border:1px solid #ccc;
background:#FFF
}
.unovo-report-purchase-table th{
font-weight:bold;
text-align:left;
height:20px;
font-size:16px;
border:1px solid #ccc;
}
.unovo-report-purchase-table td{
height:30px;
font-size:16px;
border:1px solid #ccc;
background:#FFF
text-align: left;
}
.unovo-report-purchase-total {
line-height:20px;
font-size:16px;
}
.unovo-report-purchase-content {
font-family:"DengXian";
line-height:22px;
font-size:16px;
}
.unovo-report-purchase-content p {
margin:5px 0px;
}
.unovo-report-purchase-footer {
font-family:"DengXian";
line-height:22px;
font-size:16px;
}
</style>
<div class="page">
<div class="row unovo-report-purchase-title">
<div class="col-xs-6" style="width: 50%;text-align: left;">
<!-- <img t-att-src="'data:image/jpg;base64,%s' % o.purchase_company.logo" style="max-height: 45px;"/> -->
<img t-att-src="'data:image/png;base64,%s' % logo" style="max-height: 110px;width:170px"/>
</div>
</div>
<div class="unovo-report-purchase-title">付 款 单</div>
<br/>
<br/>
<!-- <div class="unovo-report-purchase-content">
<p>
申请日期:<span t-field="o.date_due"/>
</p>
</div> -->
<table class="unovo-report-purchase-table" border="1px" cellspacing="0" cellpadding="0">
<tr>
<td class="text-center" style="width:30%;height:40px;align=left">
申请人
</td>
<td class="text-center">
<span t-field="o.user_id.name"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
付款公司
</td>
<td class="text-center">
<span t-field="o.invoice_company.name"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
到期时间
</td>
<td class="text-center">
<span t-field="o.date_due"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
金额
</td>
<td class="text-center">
<span t-esc="final_datas.get('amount_total', '')" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
<!-- <span t-esc="total.get('upper_amount', '')"/> -->
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
收款公司
</td>
<td class="text-center">
<span t-field="o.partner_id.name"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
开户行/收款账户
</td>
<td class="text-center">
<span t-esc="final_datas.get('bank_str', '')" style="width:30%;height:40px"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
事由
</td>
<td class="text-center">
<span t-esc="final_datas.get('po_names', '')" style="width:30%;height:40px"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
发票号
</td>
<td class="text-center">
<span t-esc="final_datas.get('invoice_str', '')" style="width:30%;height:40px"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:40px">
备注
</td>
<td class="text-center">
<span t-esc="final_datas.get('note_str', '')" style="width:30%;height:40px"/>
</td>
</tr>
<!-- <tr>
<td class="text-center" style="width:30%;height:40px">
打印日期
</td>
<td class="text-center">
<span t-esc="final_datas.get('today', '')"/>
</td>
</tr> -->
</table>
<br/>
<br/>
<div class="unovo-report-purchase-content" style="text-align: right;">
<p>
打印日期:<span t-esc="final_datas.get('today', '')"/>
</p>
</div>
</div>
<div style="page-break-after:always;"></div>
</t>
<!-- <t t-foreach="docs" t-as="doc">
<t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})"/>
</t> -->
</t>
</template>
<!-- <template id="unovo_report_purchaseorder">
<t t-call="report.html_container">
<t t-foreach="doc_ids" t-as="doc_id">
<t t-raw="translate_doc(doc_id, doc_model, 'partner_id.lang', 'unovo_report.unovo_report_purchaseorder_document')"/>
</t>
</t>
</template> -->
</data>
</odoo>
\ No newline at end of file
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_payrecord_line,payrecord_line,model_payrecord_line,base.group_user,1,1,1,1
access_user_line,user_line,model_user_line,base.group_user,1,1,1,0
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- 资产form视图继承 -->
<record id="asset_view_order_form_inherit" model="ir.ui.view">
<field name="name">acc.account.asset.asset</field>
<field name="model">account.asset.asset</field>
<field name="inherit_id" ref="account_asset.view_account_asset_asset_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='category_id']" position="before">
<field name="acc_type"/>
</xpath>
<xpath expr="//field[@name='code']" position="after">
<field name="asset_sequence"/>
<field name="acc_asset_code"/>
<field name="user_id"/>
<!-- <field name="acc_type"/> -->
<!-- <field name="minus_amount"/>
<field name="invoice_acc_total"/>
<field name="invoice_state"/> -->
</xpath>
<!-- <xpath expr="//field[@name='state']" position="attributes">
<attribute name="statusbar_visible">draft,teller,open,paid</attribute>
</xpath> -->
<!-- <xpath expr="/form/sheet/notebook/page[@string='Depreciation Board']" position="before">
<page string="使用记录">
<field name="user_line" readonly="1">
<tree string="使用记录" editable="bottom">
<field name="start_datetime"/>
<field name="end_datetime"/>
<field name="user_id"/>
<field name="use_state"/>
<field name="pay_user"/>
</tree>
</field>
</page>
</xpath> -->
</field>
</record>
<!-- 资产类型form视图继承 -->
<record id="asset_category_view_order_form_inherit" model="ir.ui.view">
<field name="name">acc.account.asset.category</field>
<field name="model">account.asset.category</field>
<field name="inherit_id" ref="account_asset.view_account_asset_category_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='journal_id']" position="after">
<field name="acc_type"/>
</xpath>
</field>
</record>
<record model="ir.actions.act_window" id="action_acc_account_asset_asset_form">
<field name="name">资产</field>
<field name="res_model">account.asset.asset</field>
<field name="view_type">form</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="account_asset.view_account_asset_asset_purchase_tree"/>
<field name="domain">[('category_id.type', '=', 'purchase')]</field>
</record>
<!-- <menuitem parent="account.menu_finance_entries_management" id="menu_action_account_asset_asset_form" action="action_account_asset_asset_form" sequence="101" groups="account.group_account_manager"/> -->
<menuitem id="acct_account_asset" name="资产管理" groups="acct_base.acc_manage_level1_group"/>
<menuitem id="acct_account_asset_menu" name="资产" parent="acct_account_asset" sequence="10"/>
<menuitem id="acct_account_asset_asset" name="资产" parent="acct_account_asset_menu" sequence="1" action="action_acc_account_asset_asset_form"/>
<!-- Configuration -->
<!-- <menuitem id="menu_finance_config_assets" name="Assets and Revenues" parent="account.menu_finance_configuration" sequence="25"/> -->
<record model="ir.actions.act_window" id="action_acc_account_asset_asset_list_normal_purchase">
<field name="name">资产配置</field>
<field name="res_model">account.asset.category</field>
<field name="domain">[('type', '=', 'purchase')]</field>
<field name="view_type">form</field>
<field name="view_mode">tree,kanban,form</field>
<field name="context">{'default_type': 'purchase'}</field>
</record>
<menuitem id="acct_account_asset_category_menu" name="资产配置" parent="acct_account_asset" sequence="20"/>
<menuitem id="acct_account_asset_asset_category" name="配置" parent="acct_account_asset_category_menu" sequence="1" action="action_acc_account_asset_asset_list_normal_purchase"/>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">acc.account.invoice.supplier.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_supplier_form"/>
<field name="arch" type="xml">
<!-- <xpath expr="//button[@name='action_invoice_open']" position="before">
<button name="teller_accept" string="出纳审核" type="object" states="open" class="oe_highlight" groups="acct_base.acc_account_user_group"/>
</xpath> -->
<xpath expr="//button[@name='action_invoice_open']" position="before">
<button name="boss_accept" string="财务经理审核" type="object" states="teller" class="oe_highlight" groups="account.group_account_manager"/>
</xpath>
<xpath expr="//button[@name='action_invoice_open']" position="after">
<button name="get_poqty" string="获取订购数量" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
</xpath>
<xpath expr="//button[@name='action_invoice_open']" position="after">
<button name="add_discount_line" string="添加折扣" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
</xpath>
<xpath expr="//field[@name='reference']" position="after">
<field name="invoice_company"/>
<!-- <field name="invoice_number"/> -->
<field name="payment_rule"/>
<field name="pay_rate"/>
<field name="minus_amount"/>
<field name="invoice_acc_total"/>
<field name="invoice_state"/>
</xpath>
<xpath expr="//field[@name='state']" position="attributes">
<attribute name="statusbar_visible">draft,teller,open,paid</attribute>
</xpath>
<xpath expr="/form/sheet/notebook/page[@name='other_info']" position="after">
<page string="发票记录">
<field name="payrecord_line">
<tree string="发票记录" editable="bottom">
<field name="invoice_number"/>
<field name="invoice_datetime"/>
<field name="pay_amount"/>
<field name="pay_datetime"/>
<field name="pay_user"/>
</tree>
</field>
<group class="oe_subtotal_footer oe_right">
<field name="invoice_acc_total" nolabel="1" widget="monetary" options="{'currency_field': 'currency_id'}" class="oe_subtotal_footer_separator" />
</group>
</page>
</xpath>
</field>
</record>
<!-- sale invoice -->
<record id="acccustomer_view_order_form_inherit" model="ir.ui.view">
<field name="name">acc.account.invoice.customer.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<!-- <xpath expr="//button[@name='action_invoice_open']" position="before">
<button name="teller_accept" string="出纳审核" type="object" states="open" class="oe_highlight" groups="acct_base.acc_account_user_group"/>
</xpath> -->
<xpath expr="//button[@name='action_invoice_open']" position="before">
<button name="boss_accept" string="财务审核" type="object" states="teller" class="oe_highlight" groups="acct_base.acc_account_user_group"/>
</xpath>
<xpath expr="//button[@name='action_invoice_open']" position="after">
<button name="add_sale_discount_line" string="添加折扣" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
</xpath>
<!-- <xpath expr="//button[@name='action_invoice_open']" position="after">
<button name="get_poqty" string="获取订购数量" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
</xpath> -->
<xpath expr="//field[@name='date_invoice']" position="attributes">
<attribute name="string">制单日期</attribute>
</xpath>
<xpath expr="//field[@name='payment_term_id']" position="after">
<field name="invoice_company"/>
<!-- <field name="sale_invoice_number"/> -->
<field name="sale_invoice_date"/>
<field name="acct_note"/>
<field name="invoice_acc_total"/>
</xpath>
<xpath expr="//field[@name='state']" position="attributes">
<attribute name="statusbar_visible">draft,teller,open,paid</attribute>
</xpath>
<xpath expr="/form/sheet/notebook/page[@name='other_info']" position="after">
<page string="发票记录">
<field name="payrecord_line">
<tree string="发票记录" editable="bottom">
<field name="invoice_number"/>
<field name="pay_amount"/>
<field name="pay_datetime"/>
<field name="pay_user"/>
</tree>
</field>
<group class="oe_subtotal_footer oe_right">
<field name="invoice_acc_total" nolabel="1" widget="monetary" options="{'currency_field': 'currency_id'}" class="oe_subtotal_footer_separator" />
</group>
</page>
</xpath>
</field>
</record>
<!-- account.invoice tree视图 -->
<!-- <record model="ir.ui.view" id="account_invoice_acc_tree_view">
<field name="name">account.invoice.acc.tree</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="product.product_template_tree_view"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="internal_des"/>
<field name="partner_code"/>
<field name="product_model"/>
</field>
</field>
</record> -->
</data>
</openerp>
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- <menuitem id="menu_export_account_invoice_data_root" name="导出数据" parent="account.menu_account_customer" sequence="50"/> -->
<menuitem id="menu_export_account_invoice_form_action" name="应收账单数据导出" parent="account.menu_account_customer" groups="account.group_account_user" action="acct_sale.export_sale_wizard" sequence="10"/>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
string="供应商账单打印"
id="acc_report_invoice_purchase1"
model="account.invoice"
report_type="qweb-html"
file="acct_account.acct_report_purchase_invoice"
name="acct_account.acct_report_purchase_invoice"
/>
</data>
</openerp>
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import models
from . import wizard
\ No newline at end of file
# -*- coding: utf-8 -*-
{
'name': "acct_base",
'summary': """
锐驰基础模块。
""",
'description': """
锐驰基础模块
""",
'author': "jasonD",
'website': "http://www.acctronics.com/",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'acc',
'version': '1.0.0',
# any module necessary for this one to work correctly
'depends': ['base','purchase','sale','web','account','stock','mrp','crm'],
# always loaded
'data': [
# 'security/ir.model.access.csv',
'views/ir_attachment_view.xml',
'views/acc_product_view.xml',
'views/res_groups.xml',
'views/info_read_group.xml',
'views/info_read_group_add.xml',
'views/acc_contact_view.xml',
'views/message_interface_view.xml',
'views/ir_sequence.xml',
'wizard/import_partner_data_wizard.xml',
'wizard/import_contact_data_wizard.xml',
'wizard/import_product_data_wizard.xml',
'wizard/import_purchase_data_wizard.xml',
'views/base_menu.xml',
# 'data/template_category_data.xml',
],
}
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import acc_product
from . import acc_partner
from . import acc_tools
\ No newline at end of file
# -*- coding: utf-8 -*-
from datetime import datetime
from odoo import fields, models, api, http, _
from odoo.addons import decimal_precision as dp
from odoo.http import request
from odoo.exceptions import UserError, ValidationError
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
import datetime as dt
import smtplib
import logging
import time
import requests
import json
import hashlib
import urllib.parse
_logger = logging.getLogger(__name__)
class AccTools(models.Model):
_name = 'acc.tools'
_description = u"锐驰邮件工具"
name = fields.Char(string=u"名称")
@api.model
def send_report_email(self,subjects,message,toaddrs):
'''''
@subject:邮件主题
@msg:邮件内容
@toaddrs:收信人的邮箱地址
@fromaddr:发信人的邮箱地址
@smtpaddr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
@password:发信人的邮箱密码
'''
fromaddr = "notreply@acctronics.cn"
smtpaddr = "smtp.exmail.qq.com"
# toaddrs = ['jie.dong@acctronics.cn']
toaddrs = toaddrs
# subject = "最新消息"
subject = subjects
password = "Acc@0410"
# msg = "测试"
msg = message
mail_msg = MIMEMultipart()
# if not isinstance(subject, unicode):
# subject = unicode(subject, 'utf-8')
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
try:
# smtplib.SMTP_SSL(host='smtp.gmail.com').connect(host='smtp.gmail.com', port=465)
s = smtplib.SMTP_SSL(smtpaddr)
s.connect(smtpaddr,465) # 连接smtp服务器
s.login(fromaddr, password) # 登录邮箱
s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) # 发送邮件
s.quit()
_logger.info("邮件发送成功")
except Exception as e:
print ("Error: unable to send email")
_logger.info("邮件发送失败")
def get_users(self,group_name):
commerce_group = self.env['res.groups'].search([('name', '=', group_name)])
gid = commerce_group.id
cr = self.env.cr
sql = """
select * from res_groups_users_rel where gid = %s
"""%(gid)
cr.execute(sql)
result = cr.dictfetchall()
uids = [m['uid'] for m in result]
# lists = [1,2]
to_addr = []
for user in uids:
user_obj = self.env['res.users'].search(['id','=', user])
to_addr.append(user_obj.login)
return to_addr
# @api.multi
# def make_acccode(self):
# pt = self.env['product.template'].search([('acc_code','like','-'),('active','=',True)])
# # n = 1
# for i in pt:
# # s = "%05d" % n
# # code = 'ACC-PRO-' + s
# # i.write({'acc_code':code})
# # n += 1
# # print (i.name)
# _logger.debug('===========%s===============', i.name)
# @api.multi
# def make_acccode(self):
# pt = self.env['product.template'].search(['name', 'like', 'ACC-PRO-'])
# for i in pt:
# i.write({'acc_code':code})
# _logger.debug('===========%s===============', i.name)
class AccMessageInterface(models.Model):
_name = 'acc.message.interface'
_description = u"短信接口"
_order = "id desc"
phone = fields.Char(string='手机号码',required=True,)
user_name = fields.Char(string='姓名',required=True,)
create_date = fields.Datetime(string="创建时间",readonly = True,default=time.strftime('%Y-%m-%d %H:%M:%S'),)
write_date = fields.Datetime(string="最后发送时间",readonly = True)
topic = fields.Text(string="标题",)
name = fields.Text(string="短信内容",)
note = fields.Text(string="失败原因",)
state = fields.Selection([('draft',u'待发送'), ('done', u'已发送'),('error', u'发送失败'),],string=u'发送状态',default='draft',required=True, readonly = True)
# def sms_send(self, cr, uid, ids, context=None):
# sms = self.read(cr, uid, ids, ['phone', 'name', 'topic', 'user_name'], context=context)
# for sms in self.browse(cr, uid, ids, context=context):
# text = sms.name
# phones = sms.phone
# topic = sms.topic
# if not phones:
# _logger.warning(u"%s手机号不存在!"%sms.user_name, )
# return False
# try:
# import requests
# import json
# url = 'http://121.43.62.168/messagecenter/api/20150927/system/messagecenter/send'
# args = {"channel": 102, "targets": json.dumps([phones]), 'topic': topic, 'content': text}
# respon = requests.post(url, data=args)
# result = json.loads(respon.text)
# if result.get('errorCode',False) == 0:
# self.write(cr, uid, sms.id, {'state': 'done','write_date':time.strftime('%Y-%m-%d %H:%M:%S'),}, context=context)
# else :
# note = result.get('message',False)
# self.write(cr, uid, sms.id, {'state': 'error','note':note,'write_date':time.strftime('%Y-%m-%d %H:%M:%S'),}, context=context)
# except Exception as e:
# self.write(cr, uid, sms.id, {'state': 'error'}, context=context)
# continue
# return True
#
@api.multi
def make_acccode(self):
pt = self.env['product.template'].search([('acc_code','like','-'),('active','=',True)])
# pt = self.env['product.template'].search([('acc_code','=','JX-BJ00508'),('active','=',True)])
n = 4248
count = 0
for i in pt:
s = "%05d" % n
code = 'PRO' + s
i.write({'acc_code':code})
n += 1
count +=1
# print (i.name)
_logger.debug('===========%s========%s=======', i.name,i.acc_code)
_logger.debug('===========下一号码%s===============', n)
_logger.debug('===========总数%s===============', count)
@api.multi
def sms_send(self):
# sms = self.read(['phone', 'name', 'topic', 'user_name'], context=context)
for sms in self:
text = sms.name.encode('GBK')
# text.encode(encoding='GBK')
phones = sms.phone
topic = sms.topic
if not phones:
_logger.warning(u"%s手机号不存在!"%sms.user_name, )
return False
try:
url="http://sms3.mobset.com/SDK2/Sms_Send.asp"
# str_time = "2019-11-12 10:23:10"
# time_array = time.strptime(str_time, "%m%d%H%M%S")
# fields.Datetime.now()
now_date = fields.Datetime.now() + dt.timedelta(hours=8)
time_array = (now_date.strftime('%m%d%H%M%S'))
# hashs = '300238' + 'Rk135802' + time_array
# str_md5 = hashlib.md5(hashs).hexdigest()
m=hashlib.md5()
strs='300238' + 'Rk135802' + time_array
m.update(strs.encode("utf8"))
str_md5 = m.hexdigest()
args = {"CorpID": "300238", "LoginName": "Admin", "TimeStamp": time_array, "send_no": phones,
"msg": text, "Passwd": str_md5}
respons = requests.post(url, data=args)
result = json.loads(str(respons.status_code))
print(result)
if result == 200:
self.write({'state': 'done'})
except Exception as e:
self.write({'state': 'error'})
continue
return True
# hashs = '300238' + 'Rk135802' + '1111172309'
# SecretKey = hashlib.md5()
# SecretKey.update(hashs.encode("utf-8"))
# # b = str.encode(encoding='utf-8')
# # m.update(b)
# # str_md5 = m.hexdigest()
# # Passwd = "300238Rk1358020517171100"
# # ts = datetime.now().timestamp()
# str_md5 = hashlib.md5(b'300238Rk1358021111172309').hexdigest()
# url="http://sms3.mobset.com/SDK2/Sms_Send.asp"
# args = {"CorpID":"300238", "LoginName":"Admin","TimeStamp":"1111172309" ,"send_no":"17621827400","msg":"test message","Passwd":str_md5}
# respons = requests.post(url, data=args)
# print (respons)
# result = json.loads(respons.text)
# return result
# def schedule_send(self, cr, uid, ids=False,context=None):
# self.sms_send(cr, uid, ids, context=None)
# -*- coding: UTF-8 -*-
import smtplib
import traceback
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def sendmail(subject, msg, toaddrs, fromaddr, smtpaddr, password):
'''
@subject:邮件主题
@msg:邮件内容
@toaddrs:收信人的邮箱地址
@fromaddr:发信人的邮箱地址
@smtpaddr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
@password:发信人的邮箱密码
'''
mail_msg = MIMEMultipart()
# if not isinstance(subject, unicode):
# subject = unicode(subject, 'utf-8')
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
try:
# smtplib.SMTP_SSL(host='smtpaddr').connect(host='smtp.gmail.com', port=465)
s = smtplib.SMTP_SSL(smtpaddr)
s.connect(smtpaddr,465) # 连接smtp服务器
s.login(fromaddr, password) # 登录邮箱
s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) # 发送邮件
s.quit()
except Exception as e:
print ("Error: unable to send email")
print (traceback.format_exc())
if __name__ == '__main__':
fromaddr = "notreply@acctronics.cn"
smtpaddr = "smtp.exmail.qq.com"
toaddrs = ['jie.dong@acctronics.cn','yapeng.dai@acctronics.cn']
subject = "最新消息"
password = "Acc@acc123"
msg = "测试"
sendmail(subject, msg, toaddrs, fromaddr, smtpaddr, password)
\ No newline at end of file
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_res_partner,res.partner,model_res_partner,unovo_it_operation_group,1,1,1,0
access_acc_message_interface,acc.message.interface,model_acc_message_interface,unovo_it_operation_group,1,1,1,1
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="action_acc_contact_form" model="ir.actions.act_window">
<field name="name">我的联系人</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<!-- <field name="domain">[('supplier','!=',1),('customer','!=',1),('is_company','!=',1)]</field>
<field name="context">{'default_customer':0, 'default_customer':0, 'default_is_company': False, 'search_default_is_company':False,}</field> -->
<field name="domain">[('is_company','!=',1),('charge_person','=',uid)]</field>
<field name="context">{'default_is_company': False, 'search_default_is_company':False,}</field>
<field name="filter" eval="True"/>
</record>
<record id="action_acc_all_contact_form" model="ir.actions.act_window">
<field name="name">所有联系人</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<!-- <field name="domain">[('supplier','!=',1),('customer','!=',1),('is_company','!=',1)]</field>
<field name="context">{'default_customer':0, 'default_customer':0, 'default_is_company': False, 'search_default_is_company':False,}</field> -->
<field name="domain">[('is_company','!=',1)]</field>
<field name="context">{'default_is_company': False, 'search_default_is_company':False,}</field>
<field name="filter" eval="True"/>
</record>
<!-- 我的客户 -->
<record id="action_acc_partner_form" model="ir.actions.act_window">
<field name="name">我的客户</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<!-- <field name="domain">[('supplier','!=',1),('customer','!=',1),('is_company','!=',1)]</field>
<field name="context">{'default_customer':0, 'default_customer':0, 'default_is_company': False, 'search_default_is_company':False,}</field> -->
<field name="domain">[('is_company','=',1),('charge_person','=',uid)]</field>
<!-- <field name="context">{'default_is_company': False, 'search_default_is_company':False,}</field> -->
<field name="filter" eval="True"/>
</record>
<!-- 所有客户 -->
<record id="action_acc_all_partner_form" model="ir.actions.act_window">
<field name="name">所有客户</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<!-- <field name="domain">[('supplier','!=',1),('customer','!=',1),('is_company','!=',1)]</field>
<field name="context">{'default_customer':0, 'default_customer':0, 'default_is_company': False, 'search_default_is_company':False,}</field> -->
<field name="domain">[('is_company','=',1),('customer','=',1)]</field>
<!-- <field name="context">{'default_is_company': False, 'search_default_is_company':False,}</field> -->
<field name="filter" eval="True"/>
</record>
<!-- <menuitem id="menu_acc_partner" name="我的客户" parent="sale.sale_order_menu" groups="unovo_it_operation_group" action="action_acc_partner_form" sequence='10'/>
<menuitem id="menu_acc_all_partner" name="所有客户" parent="sale.sale_order_menu" groups="acc_manage_level1_group" action="action_acc_all_partner_form" sequence='10'/> -->
<menuitem id="menu_acc_contact" name="联系人" groups="unovo_it_operation_group"/>
<menuitem id="acc_customer_menu" name="客户联系人" parent="menu_acc_contact" sequence="10"/>
<menuitem id="acct_contact_data" name="我的联系人" parent="acc_customer_menu" sequence="1" groups="unovo_it_operation_group" action="action_acc_contact_form"/>
<menuitem id="acct_all_contact_data" name="所有联系人" parent="acc_customer_menu" sequence="1" groups="acc_manage_level1_group" action="action_acc_all_contact_form"/>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<menuitem id="acct_baseconfig" name="基础配置" groups="acc_manage_level1_group"/>
<menuitem id="acct_vendor_customer_import_menu" name="供应商客户数据" parent="acct_baseconfig" sequence="10"/>
<menuitem id="acct_vendor_data" name="供应商" parent="acct_vendor_customer_import_menu" sequence="1" action="base.action_partner_supplier_form"/>
<menuitem id="acct_customer_data" name="客户" parent="acct_vendor_customer_import_menu" sequence="1" action="base.action_partner_customer_form"/>
<menuitem id="acct_data_import_menu" name="基础数据导入" parent="acct_baseconfig" sequence="20"/>
<menuitem id="import_partner_data" name="供应商数据导入" parent="acct_data_import_menu" sequence="1" action="import_partner_data_wizard"/>
<menuitem id="import_contact_data" name="联系人数据导入" parent="acct_data_import_menu" sequence="1" action="import_contact_data_wizard"/>
<menuitem id="import_product_data" name="产品数据导入" parent="acct_data_import_menu" sequence="1" action="import_product_data_wizard"/>
<menuitem id="import_purchase_data" name="采购单表头数据导入" parent="acct_data_import_menu" sequence="10" action="import_purchase_data_wizard"/>
<menuitem id="import_purchase_line_data" name="采购单明细数据导入" parent="acct_data_import_menu" sequence="15" action="import_purchase_line_data_wizard"/>
<menuitem id="acct_message_base_menu" name="短信记录" parent="acct_baseconfig" sequence="100"/>
<menuitem id="acct_message" name="短信记录" parent="acct_message_base_menu" sequence="1" action="action_acc_message_interface"/>
<!-- 产品模块 -->
<menuitem id="acct_product" name="产品管理"/>
<menuitem id="acct_product_base_menu" name="产品管理" parent="acct_product" sequence="10" groups="acc_product_level1_group"/>
<menuitem id="menu_product_acct_product_templates_normal" name="产品查询" parent="acct_product_base_menu" action="product_acc_action_puchased" groups="acc_product_level1_group" sequence="5"/>
<menuitem id="menu_product_acct_product_templates" name="产品创建" parent="acct_product_base_menu" action="vmc_product_template_action" groups="acc_product_manage_group" sequence="10"/>
<menuitem id="menu_product_acct_product_product" name="产品管理" parent="acct_product_base_menu" action="product.product_normal_action" groups="acc_product_manage_group" sequence="20"/>
<!-- product_normal_action -->
<!-- <menuitem id="menu_product_acct_product_products" name="产品va" parent="acct_product_base_menu" action="acc_product_product_action_all" groups="acc_it_manager_group" sequence="20"/> -->
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record model="ir.module.category" id="module_category_acc_product_group">
<field name="name">产品管理</field>
<field name="sequence">19</field>
<field name="visible" eval="0" />
</record>
<!-- 产品管理 -->
<record id="acc_product_level1_group" model="res.groups">
<field name="name">产品用户</field>
<field name="category_id" ref="module_category_acc_product_group"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<record id="acc_product_manage_group" model="res.groups">
<field name="name">产品管理员</field>
<field name="category_id" ref="module_category_acc_product_group"/>
<field name="implied_ids" eval="[(4, ref('acc_product_level1_group'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
</data>
</openerp>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Files -->
<record model="ir.ui.view" id="view_document_file_kanban_acct">
<field name="name">acct.document kanban.acct</field>
<field name="model">mrp.document</field>
<field name="arch" type="xml">
<kanban>
<field name="ir_attachment_id"/>
<field name="mimetype"/>
<field name="type"/>
<field name="datas_fname"/>
<field name="name"/>
<field name="priority"/>
<field name="create_uid"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_area o_kanban_attachment oe_kanban_global_click">
<div class="o_kanban_image">
<div class="o_kanban_image_wrapper">
<t t-set="webimage" t-value="new RegExp('image.*(gif|jpeg|jpg|png)').test(record.mimetype.value)"/>
<div t-if="record.type.raw_value == 'url'" class="o_url_image fa fa-link fa-3x text-muted"/>
<img t-elif="webimage" t-attf-src="/web/image/#{record.ir_attachment_id.raw_value}?field=thumbnail" width="100" height="100" alt="Document" class="o_attachment_image"/>
<div t-else="!webimage" class="o_image o_image_thumbnail" t-att-data-mimetype="record.mimetype.value"/>
</div>
</div>
<div class="o_kanban_details">
<div class="o_kanban_details_wrapper">
<div class="o_kanban_record_title">
<field name="name" class="o_text_overflow"/>
</div>
<div class="o_kanban_record_body">
<field name="datas_fname" attrs="{'invisible':[('type','=','url')]}"/>
<field name="url" widget="url" attrs="{'invisible':[('type','=','binary')]}"/>
</div>
<div class="o_kanban_record_bottom">
<span class="oe_kanban_bottom_left">
<field name="priority" widget="priority"/>
</span>
<div class="oe_kanban_bottom_right">
<img t-att-src="kanban_image('res.users', 'image_small', record.create_uid.raw_value)" t-att-data-member_id="record.create_uid.raw_value" t-att-alt="record.create_uid.raw_value" width="32" height="32" class="oe_kanban_avatar"/>
</div>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.ui.view" id="view_partner_document_file_kanban_acct">
<field name="name">acctpartner.document kanban.acct</field>
<field name="model">mrp.document</field>
<field name="arch" type="xml">
<kanban>
<field name="ir_attachment_id"/>
<field name="mimetype"/>
<field name="type"/>
<field name="datas_fname"/>
<field name="name"/>
<field name="priority"/>
<field name="create_uid"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_area o_kanban_attachment oe_kanban_global_click">
<div class="o_kanban_image">
<div class="o_kanban_image_wrapper">
<t t-set="webimage" t-value="new RegExp('image.*(gif|jpeg|jpg|png)').test(record.mimetype.value)"/>
<div t-if="record.type.raw_value == 'url'" class="o_url_image fa fa-link fa-3x text-muted"/>
<img t-elif="webimage" t-attf-src="/web/image/#{record.ir_attachment_id.raw_value}?field=thumbnail" width="100" height="100" alt="Document" class="o_attachment_image"/>
<div t-else="!webimage" class="o_image o_image_thumbnail" t-att-data-mimetype="record.mimetype.value"/>
</div>
</div>
<div class="o_kanban_details">
<div class="o_kanban_details_wrapper">
<div class="o_kanban_record_title">
<field name="name" class="o_text_overflow"/>
</div>
<div class="o_kanban_record_body">
<field name="datas_fname" attrs="{'invisible':[('type','=','url')]}"/>
<field name="url" widget="url" attrs="{'invisible':[('type','=','binary')]}"/>
</div>
<div class="o_kanban_record_bottom">
<span class="oe_kanban_bottom_left">
<field name="priority" widget="priority"/>
</span>
<div class="oe_kanban_bottom_right">
<img t-att-src="kanban_image('res.users', 'image_small', record.create_uid.raw_value)" t-att-data-member_id="record.create_uid.raw_value" t-att-alt="record.create_uid.raw_value" width="32" height="32" class="oe_kanban_avatar"/>
</div>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="acc_product_code_seq" model="ir.sequence">
<field name="name">产品编码</field>
<field name="code">product.template</field>
<field name="prefix">PRO</field>
<field name="padding">5</field>
<field name="number_increment">1</field>
<field name="company_id" eval="False"/>
</record>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data >
<!--短信接口-->
<record model="ir.ui.view" id="acc_message_interface_tree">
<field name="name">短信接口</field>
<field name="model">acc.message.interface</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="短信接口">
<field name="topic"/>
<field name="user_name"/>
<field name="phone"/>
<field name="name"/>
<field name="create_date"/>
<field name="write_date"/>
<field name="state"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="acc_message_interface_form">
<field name="name">短信接口</field>
<field name="model">acc.message.interface</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="短信接口">
<header>
<button name="sms_send" states="draft" type="object" string="发送"/>
<button name="make_acccode" type="object" string="编码"/>
<field name="state" widget="statusbar" statusbar_visible="draft,done,error"/>
</header>
<group>
<field name="topic" attrs="{'readonly':[('state','=', 'done')]}"/>
<field name="user_name" attrs="{'readonly':[('state','=', 'done')]}"/>
<field name="phone" attrs="{'readonly':[('state','=', 'done')]}"/>
<field name="name" attrs="{'readonly':[('state','=', 'done')]}"/>
<field name="create_date"/>
<field name="write_date"/>
<field name="note" attrs="{'invisible':[('state','!=', 'error')]}"/>
<field name="state"/>
</group>
</form>
</field>
</record>
<record id="acc_message_interface_search" model="ir.ui.view">
<field name="name">Search</field>
<field name="model">acc.message.interface</field>
<field name="arch" type="xml">
<search string="搜索">
<field name="phone" string="手机号码"/>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_acc_message_interface">
<field name="name">发送短信</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">acc.message.interface</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="acc_message_interface_tree"/>
</record>
<!-- <menuitem id="menu_action_unovo_message_interface" action="action_unovo_message_interface" parent="menu_unovo_message_interface_mgmt" string="短信记录" sequence="10"/> -->
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data >
<record model="ir.module.category" id="module_category_own">
<field name="name">权限</field>
<field name="sequence">0</field>
<field name="visible" eval="0" />
</record>
<!--不可见组-->
<record id="wb_less_important" model="res.groups">
<field name="name">不可见组</field>
<field name="category_id" ref="module_category_own"/>
</record>
<!--屏蔽联系人,员工,讨论-->
<record id="mail.menu_root_discuss" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- <record id="mail.mail_channel_menu_root_chat" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record> -->
<!-- 屏蔽采购模块中产品菜单 -->
<record id="purchase.menu_procurement_partner_contact_form" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽仓库模块中产品菜单 -->
<record id="stock.menu_product_variant_config_stock" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽销售模块中的产品菜单 -->
<record id="sale.product_menu_catalog" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽plm中产品菜单 -->
<record id="mrp_plm.menu_mrp_plm_products" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽制造模块中的产品菜单 -->
<record id="mrp.menu_mrp_product_form" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽采购模块中询价单采购单菜单 -->
<record id="purchase.menu_purchase_rfq" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<record id="purchase.menu_purchase_form_action" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽销售中报价单 -->
<record id="sale.menu_sale_quotations" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- <menuitem id="menu_sale_quotations"
action="action_quotations_with_onboarding"
parent="sale_order_menu"
sequence="1" groups="sales_team.group_sale_salesman"/> -->
<!-- 屏蔽销售模块中的待开票 -->
<record id="sale.menu_sale_invoicing" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽销售模块中的配置 -->
<record id="sale.menu_sale_config" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽销售模块中的销售团队菜单 -->
<record id="sale.report_sales_team" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽主菜单中的日历 -->
<record id="calendar.mail_menu_calendar" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽主菜单中的联系人 -->
<record id="contacts.menu_contacts" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽crm中的团队管道 -->
<record id="crm.sales_team_menu_team_pipeline" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽销售模块客户菜单 -->
<record id="sale.res_partner_menu" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽crm中客户菜单 -->
<record id="crm.res_partner_menu_customer" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
<!-- 屏蔽crm中的我的报价单 -->
<record id="sale_crm.sale_order_menu_quotations_crm" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('wb_less_important')])]"/>
</record>
</data>
</openerp>
\ No newline at end of file
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import import_partner_data
from . import import_contact_data
from . import import_product_data
from . import import_purchase_data
# import import_partner_data
#coding=utf-8
# from odoo import http,fields,models
import base64
# -*- coding: utf-8 -*-
from datetime import datetime
from odoo import fields, models, api, http, _
from odoo.addons import decimal_precision as dp
from odoo.http import request
from odoo.exceptions import UserError, ValidationError
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import logging
import time
_logger = logging.getLogger(__name__)
class ImportContactWizard(models.TransientModel):
_name = 'import.contact.wizard'
file_name = fields.Char(u'文件名')
data = fields.Binary(u'导入文件')
selected = fields.Integer(u'当前已选')
exported = fields.Integer(u'之前导出')
def import_data_all(self):
context = self.env.context or {}
type = context.get('type',None)
data = self.data
if data:
data = base64.b64decode(data)
if data:
# print data
# if type == 'hr_employee':
self.env['res.partner'].import_contact(content=data)
# elif type == 'attendance':
# self.env['resource.calendar.attendance'].import_attendance_list(content=data)
def send(self):
"""
@subject:邮件主题
@msg:邮件内容
@toaddrs:收信人的邮箱地址
@fromaddr:发信人的邮箱地址
@smtpaddr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
@password:发信人的邮箱密码
"""
fromaddr = "notreply@acctronics.cn"
smtpaddr = "smtp.exmail.qq.com"
toaddrs = ['jie.dong@acctronics.cn','yapeng.dai@acctronics.cn']
subject = "最新消息"
password = "Acc@acc123"
msg = "测试"
mail_msg = MIMEMultipart()
# if not isinstance(subject, unicode):
# subject = unicode(subject, 'utf-8')
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
try:
# smtplib.SMTP_SSL(host='smtp.gmail.com').connect(host='smtp.gmail.com', port=465)
s = smtplib.SMTP_SSL(smtpaddr)
s.connect(smtpaddr,465) # 连接smtp服务器
s.login(fromaddr, password) # 登录邮箱
s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) # 发送邮件
s.quit()
except Exception as e:
print ("Error: unable to send email")
# print (traceback.format_exc())
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导数据-->
<record id="import_contact_form_view" model="ir.ui.view">
<field name="name">导入联系人数据</field>
<field name="model">import.contact.wizard</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<group>
<templates>
<t t-name="kanban-box">
<div class="o_web_settings_dashboard_pills">
<a href="/acct_base/static/files/联系人导入模板.xlsx" target="_blank" class="pull-left"><i class="fa text-muted"/>下载模板</a>
</div>
</t>
</templates>
</group>
<group>
<!-- <field name='file_name'/> -->
<field name='data' string="选择文件"/>
<!--<field name='selected'/>-->
<!--<field name='exported'/>-->
</group>
<footer name="codes" >
<button class="oe_stat_button" name="import_data_all" string="导入" type="object"/>
<button class="oe_stat_button" name="send" string="fasong" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="import_contact_data_wizard" model="ir.actions.act_window">
<field name="name">联系人导入</field>
<field name="res_model">import.contact.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="import_contact_form_view"/>
<field name="target">new</field>
</record>
</data>
</odoo>
\ No newline at end of file
#coding=utf-8
from odoo import http,fields,models
import base64
class ImportPartnerWizard(models.TransientModel):
_name = 'import.partner.wizard'
file_name = fields.Char(u'文件名')
data = fields.Binary(u'导入文件')
selected = fields.Integer(u'当前已选')
exported = fields.Integer(u'之前导出')
def import_data_all(self):
context = self.env.context or {}
type = context.get('type',None)
data = self.data
if data:
data = base64.b64decode(data)
if data:
# print data
# if type == 'hr_employee':
self.env['res.partner'].import_supply(content=data)
# elif type == 'attendance':
# self.env['resource.calendar.attendance'].import_attendance_list(content=data)
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导数据-->
<record id="import_partner_form_view" model="ir.ui.view">
<field name="name">导入数据</field>
<field name="model">import.partner.wizard</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<group>
<templates>
<t t-name="kanban-box">
<div class="o_web_settings_dashboard_pills">
<a href="/acct_base/static/files/供应商导入模板.xlsx" target="_blank" class="pull-left"><i class="fa text-muted"/>下载模板</a>
</div>
</t>
</templates>
</group>
<group>
<!-- <field name='file_name'/> -->
<field name='data' string="选择文件"/>
<!--<field name='selected'/>-->
<!--<field name='exported'/>-->
</group>
<footer name="codes" >
<button class="oe_stat_button" name="import_data_all" string="导入" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<!--<record id="act_import_result_wizard" model="ir.actions.act_window">-->
<!--<field name="name">导入数据</field>-->
<!--<field name="res_model">water.card.data.wizard</field>-->
<!--<field name="view_type">form</field>-->
<!--<field name="view_mode">form</field>-->
<!--<field name="context">{"type":"attendance"}</field>-->
<!--<field name="view_id" ref="import_data_form_view"/>-->
<!--<field name="target">new</field>-->
<!--</record>-->
<!--<act_window id='import_attend_data_wizard'-->
<!--name='导入销售数据'-->
<!--res_model='guide.import.data.wizard'-->
<!--view_mode='form'-->
<!--context="{'type':'attendance'}"-->
<!--target="new"-->
<!--/>-->
<record id="import_partner_data_wizard" model="ir.actions.act_window">
<field name="name">供应商导入</field>
<field name="res_model">import.partner.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="import_partner_form_view"/>
<field name="target">new</field>
</record>
<!--<act_window id='import_watercard_data_wizard'-->
<!--name='水神卡数据'-->
<!--res_model='water.card.data.wizard'-->
<!--view_mode='form'-->
<!--context="{'type':'hr_employee'}"-->
<!--target="new"-->
<!--/>-->
</data>
</odoo>
\ No newline at end of file
#coding=utf-8
from odoo import http,fields,models
import base64
class ImportProductWizard(models.TransientModel):
_name = 'import.product.wizard'
file_name = fields.Char(u'文件名')
data = fields.Binary(u'导入文件')
selected = fields.Integer(u'当前已选')
exported = fields.Integer(u'之前导出')
def import_data_all(self):
context = self.env.context or {}
type = context.get('type',None)
data = self.data
if data:
data = base64.b64decode(data)
if data:
# print data
# if type == 'hr_employee':
self.env['product.template'].import_product_data(content=data)
# elif type == 'attendance':
# self.env['resource.calendar.attendance'].import_attendance_list(content=data)
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导数据-->
<record id="import_product_form_view" model="ir.ui.view">
<field name="name">导入产品数据</field>
<field name="model">import.product.wizard</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<group>
<templates>
<t t-name="kanban-box">
<div class="o_web_settings_dashboard_pills">
<a href="/acct_base/static/files/产品导入模板.xlsx" target="_blank" class="pull-left"><i class="fa text-muted"/>下载模板</a>
</div>
</t>
</templates>
</group>
<group>
<!-- <field name='file_name'/> -->
<field name='data' string="选择文件"/>
<!--<field name='selected'/>-->
<!--<field name='exported'/>-->
</group>
<footer name="codes" >
<button class="oe_stat_button" name="import_data_all" string="导入" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="import_product_data_wizard" model="ir.actions.act_window">
<field name="name">产品导入</field>
<field name="res_model">import.product.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="import_product_form_view"/>
<field name="target">new</field>
</record>
</data>
</odoo>
\ No newline at end of file
#coding=utf-8
from odoo import http,fields,models
import base64
class ImportPurchaseWizard(models.TransientModel):
_name = 'import.purchase.wizard'
file_name = fields.Char(u'文件名')
data = fields.Binary(u'导入文件')
selected = fields.Integer(u'当前已选')
exported = fields.Integer(u'之前导出')
def import_data_all(self):
context = self.env.context or {}
type = context.get('type',None)
data = self.data
if data:
data = base64.b64decode(data)
if data:
self.env['purchase.order'].import_purchase_charge(content=data)
class ImportPurchaseLineWizard(models.TransientModel):
_name = 'import.purchase.line.wizard'
file_name = fields.Char(u'文件名')
data = fields.Binary(u'导入文件')
selected = fields.Integer(u'当前已选')
exported = fields.Integer(u'之前导出')
def import_data_all(self):
context = self.env.context or {}
type = context.get('type',None)
data = self.data
if data:
data = base64.b64decode(data)
if data:
self.env['purchase.order.line'].import_purchase_line_data(content=data)
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导采购单表头数据-->
<record id="import_purchase_form_view" model="ir.ui.view">
<field name="name">导入采购单表头数据</field>
<field name="model">import.purchase.wizard</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<group>
<templates>
<t t-name="kanban-box">
<div class="o_web_settings_dashboard_pills">
<a href="/acct_base/static/files/采购单导入模板.xlsx" target="_blank" class="pull-left"><i class="fa text-muted"/>下载模板</a>
</div>
</t>
</templates>
</group>
<group>
<!-- <field name='file_name'/> -->
<field name='data' string="选择文件"/>
<!--<field name='selected'/>-->
<!--<field name='exported'/>-->
</group>
<footer name="codes" >
<button class="oe_stat_button" name="import_data_all" string="导入" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="import_purchase_data_wizard" model="ir.actions.act_window">
<field name="name">采购单表头导入</field>
<field name="res_model">import.purchase.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="import_purchase_form_view"/>
<field name="target">new</field>
</record>
<!--导采购单明细数据-->
<record id="import_purchase_line_form_view" model="ir.ui.view">
<field name="name">导入采购单明细数据</field>
<field name="model">import.purchase.line.wizard</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<group>
<templates>
<t t-name="kanban-box">
<div class="o_web_settings_dashboard_pills">
<a href="/acct_base/static/files/采购单明细导入模板.xlsx" target="_blank" class="pull-left"><i class="fa text-muted"/>下载模板</a>
</div>
</t>
</templates>
</group>
<group>
<!-- <field name='file_name'/> -->
<field name='data' string="选择文件"/>
<!--<field name='selected'/>-->
<!--<field name='exported'/>-->
</group>
<footer name="codes" >
<button class="oe_stat_button" name="import_data_all" string="导入" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="import_purchase_line_data_wizard" model="ir.actions.act_window">
<field name="name">采购单表头导入</field>
<field name="res_model">import.purchase.line.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="import_purchase_line_form_view"/>
<field name="target">new</field>
</record>
</data>
</odoo>
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import models
from . import report
\ No newline at end of file
# -*- coding: utf-8 -*-
{
'name': "acct_expense",
'summary': """
锐驰费用模块。
""",
'description': """
锐驰费用模块
""",
'author': "jasonD",
'website': "http://www.acctronics.com/",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'acc',
'version': '1.0.0',
# any module necessary for this one to work correctly
'depends': ['base','acct_base','web','hr'],
# always loaded
'data': [
# 'security/ir.model.access.csv',
'views/acc_hr_expense_view.xml',
'report/acc_expense_report_view.xml',
'views/report_menu.xml',
# # 'data/template_category_data.xml',
],
}
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import acc_hr_expense
\ No newline at end of file
# -*- coding: utf-8 -*-
import logging
from odoo import api, SUPERUSER_ID, fields, models, _
from odoo.http import request
import logging
import xlrd
from collections import Counter
import re
import datetime as dt
import xlrd
import xlwt
import pytz
import sys,os
file_url = 'my_addons/acct_expense'
file_url = os.path.join(sys.path[0],file_url)
import logging
from odoo.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
from datetime import datetime
# from ..controllers.common import localizeStrTime
from odoo.exceptions import UserError, ValidationError
_logger = logging.getLogger(__name__)
def check_path(image_path):
try:
dir_path = os.path.dirname(image_path)
if not os.path.exists(dir_path):
os.makedirs(dir_path)
except OSError as e:
logging.debug("file cant be created!{}".format(e))
return True
class AccHrExpenseSheet(models.Model):
"""
库存移动继承
"""
_inherit = "hr.expense.sheet"
expense_line_ids = fields.One2many('hr.expense', 'sheet_id', string='Expense Lines', states={'approve': [('readonly', True)], 'done': [('readonly', True)], 'post': [('readonly', True)],'teller': [('readonly', True)],'boss': [('readonly', True)]}, copy=False)
state = fields.Selection([
('draft', 'Draft'),
('submit', 'Submitted'),
('approve', 'Approved'),
('teller', '出纳已审核'),
('boss', '管理部已审核'),
('post', 'Posted'),
('done', 'Paid'),
('cancel', 'Refused')
], string='Status', index=True, readonly=True, track_visibility='onchange', copy=False, default='draft', required=True, help='Expense Report State')
@api.multi
def action_sheet_move_create(self):
res = super(AccHrExpenseSheet,self).action_sheet_move_create()
process_state = self.state
if process_state == 'teller':
raise ValidationError("需由出纳审批完成才可进行此操作")
if process_state == 'boss':
raise ValidationError("需由管理部门审批完成才可进行此操作")
return res
@api.multi
def action_submit_sheet(self):
res = super(AccHrExpenseSheet,self).action_submit_sheet()
# toaddrs = ['jie.dong@acctronics.cn']
toaddrs = []
toaddrs.append(self.user_id.login)
# toaddrs = ['jie.dong@acctronics.cn']
subjects = "{}费用报销单{}审批".format(self.employee_id.name,self.name)
message = "{}的费用报销单{}需要您审批,请及时处理".format(self.employee_id.name,self.name)
self.env['acc.tools'].send_report_email(subjects,message,toaddrs)
@api.multi
def approve_expense_sheets(self):
res = super(AccHrExpenseSheet,self).approve_expense_sheets()
toaddrs = ['mei.hong@neotel-technology.com']
# toaddrs.append(self.user_id.login)
# toaddrs = ['jie.dong@acctronics.cn']
subjects = "{}费用报销单{}审批".format(self.employee_id.name,self.name)
message = "{}的费用报销单{}部门经理已批准,请及时处理".format(self.employee_id.name,self.name)
self.env['acc.tools'].send_report_email(subjects,message,toaddrs)
@api.multi
def teller_accept(self):
self.filtered(lambda r: r.state == 'approve').write({'state': 'teller'})
# toaddrs = ['al@neotel-technology.com']
# subjects = "{}费用报销单{}审批".format(self.employee_id.name,self.name)
# message = "{}的费用报销单{}出纳已核准,请及时处理".format(self.employee_id.name,self.name)
# self.env['acc.tools'].send_report_email(subjects,message,toaddrs)
return True
@api.multi
def boss_accept(self):
self.filtered(lambda r: r.state == 'teller').write({'state': 'boss'})
toaddrs = ['hongyan.chen@neotel-technology.com']
# toaddrs.append(self.user_id.login)
# toaddrs = ['jie.dong@acctronics.cn']
subjects = "{}费用报销单{}审批".format(self.employee_id.name,self.name)
message = "{}的费用报销单{}管理部已批准,请及时处理".format(self.employee_id.name,self.name)
self.env['acc.tools'].send_report_email(subjects,message,toaddrs)
return True
def save_exel(self, header, body, file_name):
wbk = xlwt.Workbook(encoding='utf-8', style_compression=0)
# wbk.write(codecs.BOM_UTF8)
style1 = xlwt.easyxf('font: bold True;''alignment: horz center,vert center')
sheet = wbk.add_sheet('sheet1', cell_overwrite_ok=True)
# sheet.write(codecs.BOM_UTF8)
sheet.write(0, 0, 'some text')
sheet.write(0, 0, 'this should overwrite') ##重新设置,需要cell_overwrite_ok=True
n = 0
for i in range(len(header)):
sheet.write(n, i, header[i])
for i in range(len(body)):
n += 1
for j in range(len(body[i])):
# sheet.write(n, j, body[i][j], self.set_style())
sheet.write(n, j, body[i][j])
wbk.save(file_name) ##该文件名必须存在
def export_record(self,file_name):
"""
导出采购单信息
:return:
"""
return {
'type': 'ir.actions.act_url',
'url': '/download/work/files_export?file=%s' % (file_name),
'target': 'self'
}
def export_expense_record(self):
cr = self.env.cr
# if not product_state and not payment_state:
all_total = """ SELECT
h.NAME AS name,
h.description as description,
h.date as edate,
h.total_amount as amount,
pt.name as pname
FROM
hr_expense h
LEFT JOIN product_product pp on h.product_id = pp.id
LEFT JOIN product_template pt on pt.id = pp.product_tmpl_id
WHERE
sheet_id = %s """%(self.id)
cr.execute(all_total)
result = cr.dictfetchall()
detail_list_all=[]
# print result
# strftime("%Y%m%d_%H%M%S")
i= 0
for line in result:
detail_list_first = []
i += 1
# print ((line.get('create_date').strftime("%Y-%m-%d %H:%M:%S"))[0:11])
detail_list_first.append(i)
detail_list_first.append(line.get('edate').strftime("%Y-%m-%d"))
# if line.get('edate'):
# detail_list_first.append(line.get('forcast_date').strftime("%Y-%m-%d"))
# else:
# detail_list_first.append(line.get('forcast_date'))
detail_list_first.append(line.get('name'))
detail_list_first.append(line.get('pname'))
detail_list_first.append(line.get('description'))
detail_list_first.append(line.get('amount'))
detail_list_all.append(detail_list_first)
dir_path = os.path.join(file_url, 'Administrator')
filename = "{}.xls".format('费用报告明细表')
file_path = os.path.join(dir_path, filename)
check_path(file_path)
head = ['序号', '日期','说明','报销产品名称','备注','金额']
self.save_exel(head, detail_list_all, file_path)
return self.export_record(file_path)
class AccHrExpense(models.Model):
"""
"""
_inherit = "hr.expense"
# state = fields.Selection([
# ('draft', 'To Submit'),
# ('reported', 'Submitted'),
# ('approved', 'Approved'),
# ('done', 'Paid'),
# ('refused', 'Refused')
# ], compute='_compute_state', string='Status', copy=False, index=True, readonly=True, store=True, help="Status of the expense.")
@api.depends('sheet_id', 'sheet_id.account_move_id', 'sheet_id.state')
def _compute_state(self):
res = super(AccHrExpense, self)._compute_state()
for rec in self:
# if not expense.sheet_id or expense.sheet_id.state == 'draft':
# expense.state = "draft"
# elif expense.sheet_id.state == "cancel":
# expense.state = "refused"
# elif expense.sheet_id.state == "approve" or expense.sheet_id.state == "post":
# expense.state = "approved"
# elif not expense.sheet_id.account_move_id:
# expense.state = "reported"
# else:
# expense.state = "done"
if rec.sheet_id.state == 'teller' or rec.sheet_id.state == 'boss':
rec.state = "approved"
# -*- coding: utf-8 -*-
from . import acc_expense_report
\ No newline at end of file
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# from openerp.osv import osv, fields
from odoo import api, models
# from openerp.tools.float_utils import float_round as round
class AccExpense(models.AbstractModel):
_name = 'report.acct_expense.acct_report_expense_sheet'
def rmb_upper(self, value):
map = [u"零",u"壹",u"贰",u"叁",u"肆",u"伍",u"陆",u"柒",u"捌",u"玖"]
unit = [u"分",u"角",u"元",u"拾",u"佰",u"仟",u"万",u"拾",u"佰",u"仟",u"亿",u"拾",u"佰",u"仟",u"万",u"拾",u"佰",u"仟",u"兆"]
nums = [] #取出每一位数字,整数用字符方式转换避大数出现误差
for i in range(len(unit)-3, -3, -1):
if value >= 10**i or i < 1:
nums.append(int(round(value/(10**i),2))%10)
words = []
zflag = 0 #标记连续0次数,以删除万字,或适时插入零字
start = len(nums)-3
for i in range(start, -3, -1): #使i对应实际位数,负数为角分
if 0 != nums[start-i] or len(words) == 0:
if zflag:
words.append(map[0])
zflag = 0
words.append(map[nums[start-i]])
words.append(unit[i+2])
elif 0 == i or (0 == i%4 and zflag < 3): #控制‘万/元’
words.append(unit[i+2])
zflag = 0
else:
zflag += 1
if words[-1] != unit[0]: #结尾非‘分’补整字
words.append(u"整")
return ''.join(words)
def _get_total(self,docids,data=None):
# products = self.env['product.product'].browse(data.get('ids', data.get('active_ids')))
expense = self.env['hr.expense.sheet']
res = {}
# a = {}
for expense_model in expense.browse(docids):
amount_total = expense_model.total_amount or 0.00
amount_total = round(amount_total,2)
upper_amount = self.rmb_upper(amount_total)
# a = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
# res[purchase_model.id] = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
res = {
'amount_total':amount_total,
'upper_amount':upper_amount
}
return res
# def _get_logo(self,docids,data=None):
# # company_id = self.env.user.company_id
# purchase = self.env['purchase.order'].browse(docids)
# company_id = purchase.purchase_company
# logo = company_id.logo
# logo_transfer = str(logo, encoding="UTF8")
# # print (logo_transfer)
# return logo_transfer
# def _get_partner_info(self,docids,data=None):
# purchase = self.env['purchase.order'].browse(docids)
# partner = self.env['res.partner'].browse(purchase.partner_id.id)
# try:
# address = partner.country_id.name + partner.state_id.name + partner.city + partner.street
# except Exception as e:
# address = ''
# # address = partner.country_id.name + partner.state_id.name + partner.city + partner.street
# res_partner_bank = self.env['res.partner.bank'].search([('partner_id','=',partner.id)])
# if res_partner_bank:
# for line in res_partner_bank:
# bank_name = line.bank_id.name
# bank_number = line.acc_number
# else:
# bank_name = ''
# bank_number = ''
# res = {
# 'address':address,
# 'bank_name':bank_name,
# 'bank_number':bank_number
# }
# return res
@api.model
def _get_report_values(self,docids,data=None):
report_obj = self.env['ir.actions.report']
report = report_obj._get_report_from_name('acct_expense.acct_report_expense_sheet')
ac = self._get_total(docids)
# logo_transfer = self._get_logo(docids)
# partner_info = self._get_partner_info(docids)
return {
'doc_ids': report.ids,
'doc_model': report.model,
'docs': self.env[report.model].browse(docids),
'total':ac,
# 'logo':logo_transfer,
# 'partner_info':partner_info,
'report_type': data.get('report_type') if data else '',
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="acct_report_expense_sheet">
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="o">
<style tyle="text/css">
.unovo-report-purchase-title {
font-family:"DengXian";
font-size: 25px;
font-weight: bold;
text-align:center;
line-height:40px;
}
.unovo-report-purchase-header {
font-family:"DengXian";
line-height:22px;
font-size:16px;
text-align:right;
}
.unovo-report-purchase-table {
vertical-align: middle;
font-family:"DengXian";
border:1px solid #ccc;
width:100%;
border-collapse:collapse;
border:1px solid #ccc;
background:#FFF
}
.unovo-report-purchase-table th{
font-weight:bold;
text-align:center;
height:20px;
font-size:16px;
border:1px solid #ccc;
}
.unovo-report-purchase-table td{
height:30px;
font-size:16px;
border:1px solid #ccc;
background:#FFF
text-align: center;
}
.unovo-report-purchase-total {
line-height:20px;
font-size:16px;
}
.unovo-report-purchase-content {
font-family:"DengXian";
line-height:22px;
font-size:16px;
}
.unovo-report-purchase-content p {
margin:5px 0px;
}
.unovo-report-purchase-footer {
font-family:"DengXian";
line-height:22px;
font-size:16px;
}
</style>
<div class="page">
<!-- <div class="header">
<div class="row">
<div class="col-xs-3">
<span t-field="o.purchase_company.name"/>
</div>
</div>
</div> -->
<!-- <div class="row unovo-report-purchase-title">
<div class="col-xs-6" style="width: 50%;text-align: left;">
<img t-att-src="'data:image/jpg;base64,%s' % o.purchase_company.logo" style="max-height: 45px;"/>
<img t-att-src="'data:image/png;base64,%s' % logo" style="max-height: 110px;width:170px"/>
</div>
</div> -->
<!-- <br/> -->
<div class="unovo-report-purchase-title">付 款 审 批</div>
<br/>
<br/>
<div class="unovo-report-purchase-content">
<p>
申请日期:<span t-field="o.create_date"/>
</p>
</div>
<table class="unovo-report-purchase-table" border="1px" cellspacing="0" cellpadding="0">
<tr>
<td class="text-center" style="width:30%;height:50px;align=center">
申请人
</td>
<td class="text-center">
<span t-field="o.employee_id.name"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:50px">
申请人部门
</td>
<td class="text-center">
<span t-field="o.employee_id.department_id.name"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:50px">
付款日期
</td>
<td class="text-center">
下单日期:<span t-field="o.accounting_date"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:50px">
事由
</td>
<td class="text-center">
<span t-field="o.name" style="width:30%;height:50px"/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:50px">
金额
</td>
<td class="text-center">
<span t-esc="o.total_amount" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
</td>
</tr>
<tr>
<td class="text-center" style="width:30%;height:50px">
收款人
</td>
<td class="text-center">
<span t-field="o.employee_id.name"/>
</td>
</tr>
<!-- <tr>
<td class="text-center">
备注
</td>
<td class="text-center">
下单日期:<span t-field="o.name"/>
</td>
</tr>
<tr>
<td class="text-center">
合同编号:<span t-field="o.name"/>
</td>
<td class="text-center">
下单日期:<span t-field="o.name"/>
</td>
</tr>
<tr>
<td class="text-center">
合同编号:<span t-field="o.name"/>
</td>
<td class="text-center">
下单日期:<span t-field="o.name"/>
</td>
</tr>
<tr>
<td class="text-center">
合同编号:<span t-field="o.name"/>
</td>
<td class="text-center">
下单日期:<span t-field="o.name"/>
</td>
</tr> -->
</table>
</div>
<div style="page-break-after:always;"></div>
</t>
<!-- <t t-foreach="docs" t-as="doc">
<t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})"/>
</t> -->
</t>
</template>
<!-- <template id="unovo_report_purchaseorder">
<t t-call="report.html_container">
<t t-foreach="doc_ids" t-as="doc_id">
<t t-raw="translate_doc(doc_id, doc_model, 'partner_id.lang', 'unovo_report.unovo_report_purchaseorder_document')"/>
</t>
</t>
</template> -->
</data>
</odoo>
\ No newline at end of file
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- 费用报告视图继承 -->
<record id="hr_expense_sheet_form_inherit" model="ir.ui.view">
<field name="name">hr.expense.sheet.form.inherit</field>
<field name="model">hr.expense.sheet</field>
<field name="inherit_id" ref="hr_expense.view_hr_expense_sheet_form"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_sheet_move_create']" position="before">
<button name="teller_accept" string="出纳审核" type="object" states="approve" class="oe_highlight" groups="acct_base.acc_account_user_group"/>
</xpath>
<xpath expr="//button[@name='action_sheet_move_create']" position="before">
<button name="boss_accept" string="管理部审核" type="object" states="teller" class="oe_highlight" groups="acct_base.acc_manage_info_group"/>
</xpath>
<xpath expr="//button[@name='action_sheet_move_create']" position="before">
<button name="export_expense_record" string="导出明细行" type="object" class="oe_highlight" groups="acct_base.acc_account_user_group"/>
</xpath>
<xpath expr="//button[@name='action_sheet_move_create']" position="attributes">
<attribute name="states">boss</attribute>
</xpath>
<xpath expr="//field[@name='state']" position="attributes">
<attribute name="statusbar_visible">draft,submit,approve,teller,boss,post,done</attribute>
</xpath>
<!-- <xpath expr="/form/sheet/notebook/page/field/tree/field[@name='sale_order_id']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath> -->
<xpath expr="/form/sheet/notebook/page/field/tree/field[@name='tax_ids']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="/form/sheet/notebook/page/field/tree/field[@name='name']" position="after">
<field name="product_id" string='产品名称'/>
<field name="description" string='备注'/>
</xpath>
</field>
</record>
<!-- 待出纳审核action -->
<record id="action_hr_expense_sheet_all_to_teller" model="ir.actions.act_window">
<field name="name">待出纳审核</field>
<field name="res_model">hr.expense.sheet</field>
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="search_view_id" ref="hr_expense.view_hr_expense_sheet_filter"/>
<field name="domain">[('state','=','approve')]</field>
<!-- <field name="context">{'search_default_to_post': 1}</field> -->
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new expense report
</p><p>
Once you have created your expense, submit it to your manager who will validate it.
</p>
</field>
</record>
<!-- 待管理部审核action -->
<record id="action_hr_expense_sheet_all_to_boss" model="ir.actions.act_window">
<field name="name">待管理部审核</field>
<field name="res_model">hr.expense.sheet</field>
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="search_view_id" ref="hr_expense.view_hr_expense_sheet_filter"/>
<field name="domain">[('state','=','teller')]</field>
<!-- <field name="context">{'search_default_to_post': 1}</field> -->
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new expense report
</p><p>
Once you have created your expense, submit it to your manager who will validate it.
</p>
</field>
</record>
<!-- 已拒绝 -->
<record id="action_hr_expense_sheet_all_to_cancel" model="ir.actions.act_window">
<field name="name">已拒绝</field>
<field name="res_model">hr.expense.sheet</field>
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="search_view_id" ref="hr_expense.view_hr_expense_sheet_filter"/>
<field name="domain">[('state','=','cancel')]</field>
<!-- <field name="context">{'search_default_to_post': 1}</field> -->
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new expense report
</p><p>
Once you have created your expense, submit it to your manager who will validate it.
</p>
</field>
</record>
<!-- 已拒绝 -->
<record id="action_hr_expense_sheet_all_to_done" model="ir.actions.act_window">
<field name="name">已支付</field>
<field name="res_model">hr.expense.sheet</field>
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="search_view_id" ref="hr_expense.view_hr_expense_sheet_filter"/>
<field name="domain">[('state','=','done')]</field>
<!-- <field name="context">{'search_default_to_post': 1}</field> -->
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new expense report
</p><p>
Once you have created your expense, submit it to your manager who will validate it.
</p>
</field>
</record>
<menuitem id="menu_hr_expense_sheet_all_to_teller" name="待出纳审核" sequence="4" parent="hr_expense.menu_hr_expense_report"
action="action_hr_expense_sheet_all_to_teller" groups="account.group_account_user"/>
<menuitem id="menu_hr_expense_sheet_all_to_boss" name="待管理部审核" sequence="4" parent="hr_expense.menu_hr_expense_report"
action="action_hr_expense_sheet_all_to_boss" groups="account.group_account_user"/>
<menuitem id="menu_hr_expense_sheet_all_to_cancel" name="已拒绝" sequence="4" parent="hr_expense.menu_hr_expense_report"
action="action_hr_expense_sheet_all_to_cancel" groups="account.group_account_user"/>
<menuitem id="menu_hr_expense_sheet_all_to_done" name="已支付" sequence="4" parent="hr_expense.menu_hr_expense_report"
action="action_hr_expense_sheet_all_to_done" groups="account.group_account_user"/>
</data>
</openerp>
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
string="打印付款审批"
id="acct_report_expense_sheet"
model="hr.expense.sheet"
report_type="qweb-html"
file="acct_expense.acct_report_expense_sheet"
name="acct_expense.acct_report_expense_sheet"
/>
</data>
</openerp>
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import models
from . import report
from . import wizard
\ No newline at end of file
# -*- coding: utf-8 -*-
{
'name': "acct_project",
'summary': """
锐驰项目模块。
""",
'description': """
锐驰项目模块
""",
'author': "jasonD",
'website': "http://www.acctronics.com/",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'acc',
'version': '1.0.0',
# any module necessary for this one to work correctly
'depends': ['base','acct_base','web','project','web_timeline'],
# always loaded
'data': [
# 'security/ir.model.access.csv',
'views/acc_project_view.xml',
# 'views/excipients_product_view.xml',
# 'report/accstock_report_views.xml',
# 'wizard/choose_move_view.xml',
# 'views/report_menu.xml',
],
}
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import acc_project
\ No newline at end of file
# -*- coding: utf-8 -*-
import logging
from odoo import api, SUPERUSER_ID, fields, models, _
from odoo.http import request
import logging
import xlrd
from collections import Counter
import re
import datetime
import pytz
from odoo.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
# from datetime import datetime
# from ..controllers.common import localizeStrTime
from odoo.exceptions import UserError, ValidationError
_logger = logging.getLogger(__name__)
class AccProjectTask(models.Model):
"""
库存移动继承
"""
_inherit = "project.task"
task_start = fields.Date(string=u'开始日期')
class AccProjectProject(models.Model):
"""
库存移动继承
"""
_inherit = "project.project"
project_code = fields.Char(string=u'项目号')
equipment = fields.Char(string=u'需求设备名称&数量')
delivery_time = fields.Date(string='交货期')
priority_level = fields.Selection([('commonly', '一般'), ('urgent', '紧急')], '优先级', default='commonly')
machine_design = fields.Char(string='机械设计人员')
electrical_design = fields.Char(string='电气设计人员')
software_design = fields.Char(string='软件设计人员')
# design_sdate = fields.Date(string='设计开始日期')
# design_edate = fields.Date(string='设计结束日期')
# purchase_sdate = fields.Date(string='采购开始日期')
# purchase_edate = fields.Date(string='采购结束日期')
design_date = fields.Char(string='设计起止日期')
purchase_date = fields.Char(string='采购起止日期')
assembling_date = fields.Char(string='装配起止日期')
send_date = fields.Date(string='发货日期')
debugging_date = fields.Char(string='调试起止日期')
note = fields.Char(string='备注')
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- 项目任务视图继承 -->
<record id="acc_project_task_form_inherit" model="ir.ui.view">
<field name="name">project.task</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='date_deadline']" position="before">
<field name="task_start"/>
</xpath>
</field>
</record>
<record id="view_task_timeline" model="ir.ui.view">
<field name="model">project.task</field>
<field name="type">timeline</field>
<field name="arch" type="xml">
<timeline date_start="task_start"
date_stop="date_deadline"
string="Tasks"
default_group_by="user_id"
event_open_popup="true"
zoomKey="ctrlKey"
colors="#ec7063:user_id == false;#2ecb71:kanban_state=='done';"
dependency_arrow="task_dependency_ids">
<field name="user_id"/>
<field name="project_id"/>
<templates>
<div t-name="timeline-item">
项目:
<div t-esc="record.project_id[1]"/>
负责人:
<span t-esc="record.user_id[1]"/>
具体任务描述:
<div t-esc="record.display_name"/>
</div>
</templates>
</timeline>
</field>
</record>
<record id="project.action_view_task" model="ir.actions.act_window">
<field name="view_mode">kanban,tree,form,calendar,timeline,graph</field>
</record>
<!-- 项目视图 -->
<!-- 项目tree视图继承 -->
<record id="acc_project_tree_inherit" model="ir.ui.view">
<field name="name">project.tree.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field name="project_code"/>
<field name="equipment"/>
<field name="delivery_time"/>
<field name="priority_level"/>
<field name="machine_design"/>
<field name="electrical_design"/>
<field name="software_design"/>
<field name="design_date"/>
<field name="purchase_date"/>
<field name="assembling_date"/>
<field name="send_date"/>
<field name="debugging_date"/>
<field name="note"/>
</xpath>
</field>
</record>
<!-- 项目form视图继承 -->
<record id="acc_project_form_inherit" model="ir.ui.view">
<field name="name">project.project</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.edit_project"/>
<field name="arch" type="xml">
<!-- <xpath expr="//button[@name='action_quotation_send'][1]" position="attributes">
<attribute name="invisible">1</attribute>
</xpath> -->
<xpath expr="/form/sheet/notebook/page[@name='settings']" position="before">
<page string="项目基础信息" name="project_information">
<group>
<group>
<field name="project_code"/>
<field name="equipment"/>
<field name="delivery_time"/>
<field name="priority_level"/>
<field name="machine_design"/>
<field name="electrical_design"/>
<field name="software_design"/>
</group>
<group>
<field name="design_date"/>
<field name="purchase_date"/>
<field name="assembling_date"/>
<field name="send_date"/>
<field name="debugging_date"/>
<field name="note"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
<record id="action_acc_project" model="ir.actions.act_window">
<field name="name">项目</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">project.project</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="项目" id="menu_acc_project_management" parent="project.menu_main_pm"
action="action_acc_project" sequence="0" groups="base.group_no_one,project.group_project_user"/>
</data>
</openerp>
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- <menuitem id="acct_baseconfig" name="基础配置"/>
<menuitem id="acct_vendor_customer_import_menu" name="供应商客户数据" parent="acct_baseconfig" sequence="10"/>
<menuitem id="acct_vendor_data" name="供应商" parent="acct_vendor_customer_import_menu" sequence="1" action="base.action_partner_supplier_form"/>
<menuitem id="acct_customer_data" name="客户" parent="acct_vendor_customer_import_menu" sequence="1" action="base.action_partner_customer_form"/> -->
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
string="挚锦科技出货单"
id="acc_report_stock"
model="stock.picking"
report_type="qweb-html"
file="acct_stock.acct_report_stock"
name="acct_stock.acct_report_stock"
/>
</data>
</openerp>
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import models,report,wizard,controller
\ No newline at end of file
# -*- coding: utf-8 -*-
{
'name': "acct_purchase",
'summary': """
锐驰采购模块。
""",
'description': """
锐驰采购模块
""",
'author': "jasonD",
'website': "http://www.acctronics.com/",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'acc',
'version': '1.0.0',
# any module necessary for this one to work correctly
'depends': ['acct_base','base','purchase','sale','web','account','mrp'],
# always loaded
'data': [
'security/ir.model.access.csv',
# 'report/layout_templates.xml',
'wizard/import_bom_view.xml',
'wizard/add_partner_view.xml',
'wizard/purchase_separate_view.xml',
'wizard/recreate_before_purchase_view.xml',
'wizard/export_purchase_invoice_view.xml',
'views/bom_view.xml',
'views/acc_purchase_view.xml',
'wizard/merge_purchase_view.xml',
'wizard/merge_bom_view.xml',
'views/delivery_address_view.xml',
'views/acc_company_view.xml',
'views/before_purchase_view.xml',
'views/demand_purchase_view.xml',
'views/ir_sequence.xml',
'wizard/export_purchase_view.xml',
'wizard/export_info_view.xml',
'views/mail_data.xml',
'views/acc_purchase_report_view.xml',
'views/en_purchase_report_view.xml',
'views/report_menu.xml',
'views/menu_items.xml',
],
}
\ No newline at end of file
from . import task_download_content
此文件类型无法预览
# -*- coding: utf-8 -*-
from odoo import http
import os
import sys
import logging
import datetime
import calendar
from odoo.http import request
from odoo.addons.web.controllers.main import serialize_exception,content_disposition
_logger = logging.getLogger(__name__)
import base64
import zipfile
import shutil
from odoo.http import request
# import simplejson
# pic_url = "guide_addons/task_work_content"
# pic_download_url = os.path.join(sys.path[0],pic_url)
def check_path(image_path):
try:
dir_path = os.path.dirname(image_path)
if not os.path.exists(dir_path):
os.makedirs(dir_path)
except OSError as e:
logging.debug("file cant be created!{}".format(e))
return True
def zip_dir(dirname, zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name))
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(dirname):]
# print arcname
zf.write(tar, arcname)
zf.close()
class DownloadFiles(http.Controller):
@http.route('/download/work/files_export', type='http', auth="user")
# @serialize_exception
def download_sale_data(self, year=None, month=None, *args, **kwargs):
data = request.params
file = data.get('file')
if file:
# with open(file,encoding='UTF-8') as f:
file_name = "{}".format(file[file.rfind('/')+1:])
f=open(file, 'rb')
content = f.read()
# content = f.read()
# content = base64.b64decode(f)
# content.decode('latin-1').encode("utf-8")
# content.encode('latin-1').decode('utf8')
os.remove(file)
return request.make_response(content,
[('Content-Type', 'application/octet-stream'),
('Content-Disposition', content_disposition(file_name))]
)
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import acc_purchase
from . import demand_purchase
from . import acc_mrp_bom
from . import before_purchase
\ No newline at end of file
# -*- coding: utf-8 -*-
from datetime import datetime
from odoo import fields, models, api, http, _
from odoo.addons import decimal_precision as dp
from odoo.http import request
from odoo.exceptions import UserError, ValidationError
class BeforePurchase(models.Model):
"""
待确认供应商询价单
"""
_name = 'before.purchase'
_inherit = ['mail.thread', 'mail.activity.mixin', 'portal.mixin']
_description = "待确认供应商询价单"
_order = 'gen_datetime desc'
@api.model
def create(self,vals):
if not vals.get('name',''):
last_name = self.env['ir.sequence'].get('before.purchase') or ''
vals['name'] = "%s"%(last_name)
result = super(BeforePurchase,self).create(vals)
return result
name = fields.Char(string='名称')
sale_order_id = fields.Many2one('sale.order',string='源销售单')
demand_purchase_id = fields.Many2one('demand.purchase',string='源请购单')
is_excipients = fields.Boolean(string='辅料采购')
charge_person = fields.Many2one('res.users',string='采购负责人')
gen_datetime = fields.Datetime(string='生成时间',default=lambda self: fields.Datetime.now(),)
po_number = fields.Text(string='关联的采购单',readonly=True)
purchase_company = fields.Many2one('acc.company',string='采购公司',required=True)
delivery_address = fields.Many2one('delivery.address',string='交货地址')
state = fields.Selection([('draft', '待确认'), ('done', '已确认'),('cancel', '已取消')], '状态', default='draft',track_visibility='onchange')
order_line = fields.One2many('before.purchase.line', 'order_id', 'Order Lines')
recreate_line = fields.One2many('recreate.purchase.line', 'before_id', 'recreate Lines')
@api.multi
def draft_button(self):
self.create_po()
self.filtered(lambda r: r.state == 'draft').write({'state': 'done'})
return True
@api.multi
def draft_cancel(self):
# self.create_po()
self.filtered(lambda r: r.state == 'draft').write({'state': 'cancel'})
return True
@api.multi
def unlink(self):
for before in self:
if before.state in ('draft','done'):
raise ValidationError('不能删除该单据.')
return super(BeforePurchase,self).unlink()
@api.multi
def create_po(self):
res_line = []
for line in self.order_line:
product_partner_id = line.partner_id.id
if not product_partner_id:
raise UserError(u'有产品未选择供应商供应商')
exits_order = self.compare_partner_id(line)
line_vals = {
'product_id':line.product_id.id,
'name':line.product_model,
'product_qty':line.qty,
'price_unit':line.acc_purchase_price,
'acc_code':line.acc_code,
'date_planned':fields.Datetime.now(),
'product_uom':line.product_id.uom_id.id,
'partner_code':line.partner_code
}
res_line = [(0,0,line_vals)]
po_vals = {
'partner_id':line.partner_id.id,
'title':self.name,
'before_purchase_id':self.id,
'purchase_company':self.purchase_company.id,
'charge_person':self.charge_person.id,
'forcast_date':fields.Datetime.now(),
'date_planned':fields.Datetime.now(),
'delivery_address':self.delivery_address.id,
'traffic_rule':' ',
'payment_rule':' ',
'demand_purchase':self.demand_purchase_id.id,
'origin_order':self.sale_order_id.id,
'is_excipients':self.is_excipients,
'order_line':res_line
}
if not exits_order:
po_obj = self.env['purchase.order'].create(po_vals)
self.add_ponumber(po_obj)
if exits_order:
exits_order.write({'order_line':res_line})
# self.write({'purchase_date':fields.Datetime.now(),'is_purchasing':True})
# if exits_order:
return True
@api.multi
def compare_partner_id(self,line):
supply_partner_id = line.partner_id.id
if self.demand_purchase_id:
exits_order = self.env['purchase.order'].search([('partner_id', '=', supply_partner_id),('demand_purchase', '=', self.demand_purchase_id.id),('title', '=', self.name)])
else:
exits_order = self.env['purchase.order'].search([('partner_id', '=', supply_partner_id),('origin_order', '=', self.sale_order_id.id),('title', '=', self.name)])
return exits_order
@api.multi
def add_ponumber(self,pobj):
new_po_name = ''
po_name = pobj.name
if self.demand_purchase_id:
po_number = self.demand_purchase_id.po_number
if po_number:
new_po_name = po_number + ',' + po_name
else:
new_po_name = po_name
demand_purchase = self.env['demand.purchase'].search([('id', '=', self.demand_purchase_id.id)])
demand_purchase.write({'po_number':new_po_name})
self.write({'po_number':new_po_name})
if self.sale_order_id:
po_number = self.sale_order_id.po_number
if po_number:
new_po_name = po_number + ',' + po_name
else:
new_po_name = po_name
sale_order = self.env['sale.order'].search([('id', '=', self.sale_order_id.id)])
sale_order.write({'po_number':new_po_name})
self.write({'po_number':new_po_name})
def merge_before_line(self):
order_id = self.id
# list_ids = self.compare_partners(mrp_bom)
# list_ids,merge_info = self.get_merge_info(mrp_bom)
cr = self.env.cr
cr.execute("""
SELECT
product_id AS product_id,
SUM (qty) AS qty,
partner_code,
product_model,
brand,
acc_code,
partner_id
FROM
before_purchase_line
WHERE
order_id = %s
GROUP BY
product_id,
partner_code,
product_model,
acc_code,
brand,
partner_id
"""% (order_id)
)
result = cr.dictfetchall()
self.create_newline(result)
@api.multi
def create_newline(self,result):
for move in self.order_line:
move.unlink()
# res_line = []
for line in result:
line_vals = {
'order_id':self.id,
'product_id':line['product_id'],
'partner_id':line['partner_id'],
'product_model':line['product_model'],
'qty':line['qty'],
'acc_code':line['acc_code'],
'brand':line['brand'],
'partner_code':line['partner_code']
}
# res_line = [(0,0,line_vals)]
# res_line.append((0,0,line_vals))
self.env['before.purchase.line'].create(line_vals)
# subject = '提醒信息'
# merge_tips = "被合并单号为{},生成新单号为{}".format(po_name,po_obj.name)
# self.write({'mrp_bom_id':mrp_obj.id})
# return self.message_post(body=merge_tips, subject=subject)
return True
class BeforePurchaseLine(models.Model):
_name = 'before.purchase.line'
_description = " 待确认询价单明细"
_order = 'create_date desc, id desc'
order_id = fields.Many2one('before.purchase', 'Order Reference')
product_id = fields.Many2one('product.product',u'物料名称', required=True)
product_model = fields.Char(string='规格描述')
brand = fields.Char(string='品牌')
acc_code = fields.Char(string='产品编码')
partner_code = fields.Char(string='供应商编码')
acc_purchase_price= fields.Char(string='采购价格')
qty = fields.Float(string='数量')
partner_id = fields.Many2one('res.partner',string='供应商',domain=[('supplier', '=', True)])
class RecreatePurchaseLine(models.Model):
_name = 'recreate.purchase.line'
_description = " 重新生成待确认明细"
_order = 'create_date desc, id desc'
before_id = fields.Many2one('before.purchase', 'Order Reference')
product_id = fields.Many2one('product.product',u'物料名称', required=True)
partner_id = fields.Many2one('res.partner',string='供应商')
product_model = fields.Char(string='规格描述')
brand = fields.Char(string='品牌')
acc_code = fields.Char(string='产品编码')
partner_code = fields.Char(string='供应商编码')
acc_purchase_price= fields.Char(string='采购价格')
qty = fields.Float(string='数量')
partner_id = fields.Many2one('res.partner',string='供应商',domain=[('supplier', '=', True)])
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import acc_purchase_report
from . import purchase_en
\ No newline at end of file
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# from openerp.osv import osv, fields
from odoo import api, models
# from openerp.tools.float_utils import float_round as round
class unovoReport(models.AbstractModel):
_name = 'report.acct_purchase.unovo_report_purchaseorder'
def rmb_upper(self, value):
map = [u"零",u"壹",u"贰",u"叁",u"肆",u"伍",u"陆",u"柒",u"捌",u"玖"]
unit = [u"分",u"角",u"元",u"拾",u"佰",u"仟",u"万",u"拾",u"佰",u"仟",u"亿",u"拾",u"佰",u"仟",u"万",u"拾",u"佰",u"仟",u"兆"]
nums = [] #取出每一位数字,整数用字符方式转换避大数出现误差
for i in range(len(unit)-3, -3, -1):
if value >= 10**i or i < 1:
nums.append(int(round(value/(10**i),2))%10)
words = []
zflag = 0 #标记连续0次数,以删除万字,或适时插入零字
start = len(nums)-3
for i in range(start, -3, -1): #使i对应实际位数,负数为角分
if 0 != nums[start-i] or len(words) == 0:
if zflag:
words.append(map[0])
zflag = 0
words.append(map[nums[start-i]])
words.append(unit[i+2])
elif 0 == i or (0 == i%4 and zflag < 3): #控制‘万/元’
words.append(unit[i+2])
zflag = 0
else:
zflag += 1
if words[-1] != unit[0]: #结尾非‘分’补整字
words.append(u"整")
return ''.join(words)
def _get_total(self,docids,data=None):
# products = self.env['product.product'].browse(data.get('ids', data.get('active_ids')))
purchase = self.env['purchase.order']
res = {}
# a = {}
for purchase_model in purchase.browse(docids):
amount_total = purchase_model.amount_total or 0.00
amount_total = round(amount_total,2)
upper_amount = self.rmb_upper(amount_total)
# a = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
# res[purchase_model.id] = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
res = {
'amount_total':amount_total,
'upper_amount':upper_amount
}
return res
def _get_logo(self,docids,data=None):
# company_id = self.env.user.company_id
purchase = self.env['purchase.order'].browse(docids)
company_id = purchase.purchase_company
logo = company_id.logo
logo_transfer = str(logo, encoding="UTF8")
# print (logo_transfer)
return logo_transfer
def _get_partner_info(self,docids,data=None):
purchase = self.env['purchase.order'].browse(docids)
partner = self.env['res.partner'].browse(purchase.partner_id.id)
try:
address = partner.country_id.name + partner.state_id.name + partner.city + partner.street
except Exception as e:
address = ''
# address = partner.country_id.name + partner.state_id.name + partner.city + partner.street
res_partner_bank = self.env['res.partner.bank'].search([('partner_id','=',partner.id)])
if res_partner_bank:
for line in res_partner_bank:
bank_name = line.bank_id.name
bank_number = line.acc_number
else:
bank_name = ''
bank_number = ''
res = {
'address':address,
'bank_name':bank_name,
'bank_number':bank_number
}
return res
@api.model
def _get_report_values(self,docids,data=None):
report_obj = self.env['ir.actions.report']
report = report_obj._get_report_from_name('acct_purchase.unovo_report_purchaseorder')
ac = self._get_total(docids)
logo_transfer = self._get_logo(docids)
partner_info = self._get_partner_info(docids)
return {
'doc_ids': report.ids,
'doc_model': report.model,
'docs': self.env[report.model].browse(docids),
'total':ac,
'logo':logo_transfer,
'partner_info':partner_info,
'report_type': data.get('report_type') if data else '',
}
\ No newline at end of file
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# from openerp.osv import osv, fields
from odoo import api, models
from datetime import datetime,timedelta
# from openerp.tools.float_utils import float_round as round
class accenReport(models.AbstractModel):
_name = 'report.acct_purchase.acc_report_purchaseorder'
def rmb_upper(self, value):
map = [u"零",u"壹",u"贰",u"叁",u"肆",u"伍",u"陆",u"柒",u"捌",u"玖"]
unit = [u"分",u"角",u"元",u"拾",u"百",u"千",u"万",u"拾",u"百",u"千",u"亿",u"拾",u"百",u"千",u"万",u"拾",u"百",u"千",u"兆"]
nums = [] #取出每一位数字,整数用字符方式转换避大数出现误差
for i in range(len(unit)-3, -3, -1):
if value >= 10**i or i < 1:
nums.append(int(round(value/(10**i),2))%10)
words = []
zflag = 0 #标记连续0次数,以删除万字,或适时插入零字
start = len(nums)-3
for i in range(start, -3, -1): #使i对应实际位数,负数为角分
if 0 != nums[start-i] or len(words) == 0:
if zflag:
words.append(map[0])
zflag = 0
words.append(map[nums[start-i]])
words.append(unit[i+2])
elif 0 == i or (0 == i%4 and zflag < 3): #控制‘万/元’
words.append(unit[i+2])
zflag = 0
else:
zflag += 1
if words[-1] != unit[0]: #结尾非‘分’补整字
words.append(u"整")
return ''.join(words)
def _get_total(self,docids,data=None):
# products = self.env['product.product'].browse(data.get('ids', data.get('active_ids')))
purchase = self.env['purchase.order']
res = {}
a = {}
for purchase_model in purchase.browse(docids):
amount_total = purchase_model.amount_total or 0.00
amount_total = round(amount_total,2)
upper_amount = self.rmb_upper(amount_total)
a = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
res[purchase_model.id] = {'upper_amount':upper_amount or 0,'amount_total':amount_total or 0}
return res
def _get_logo(self,docids,data=None):
# company_id = self.env.user.company_id
purchase = self.env['purchase.order'].browse(docids)
company_id = purchase.purchase_company
logo = company_id.en_logo
logo_transfer = str(logo, encoding="UTF8")
# print (logo_transfer)
return logo_transfer
def _format_date_code(self,docids,data=None):
purchase = self.env['purchase.order'].browse(docids)
order_name = purchase.name
date = purchase.gen_date
forcast_date = purchase.forcast_date
en_forcast_date = str(forcast_date.day)+ '-' + str(forcast_date.month) + '-' + str(forcast_date.year)
# m = test_date.month
en_date = str(date.day)+ '-' + str(date.month) + '-' + str(date.year)
# en_date = str(datetime.strptime(date, '%Y-%m-%d %H:%M:%S'))[0:10]
code = 'CD-000' + '-' + str(en_date) + '-' + order_name
res = {
'code':code,
'date':en_date,
'en_forcast_date':en_forcast_date
}
return res
@api.model
def _get_report_values(self,docids,data=None):
report_obj = self.env['ir.actions.report']
report = report_obj._get_report_from_name('acct_purchase.acc_report_purchaseorder')
ac = self._get_total(docids)
logo_transfer = self._get_logo(docids)
date_code = self._format_date_code(docids)
return {
'doc_ids': report.ids,
'doc_model': report.model,
'docs': self.env[report.model].browse(docids),
'total':ac.get('amount_total',0),
'date_code':date_code,
'logo':logo_transfer,
'report_type': data.get('report_type') if data else '',
}
\ No newline at end of file
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_delivery_address,delivery.address,model_delivery_address,purchase.group_purchase_user,1,1,1,1
access_acc_company_manager,acc.company,model_acc_company,purchase.group_purchase_manager,1,0,0,0
access_acc_company,acc.company,model_acc_company,purchase.group_purchase_user,1,0,0,0
access_acc_company_user,acc.company,model_acc_company,base.group_user,1,1,1,0
access_delivery_address_manager,delivery.address,model_delivery_address,purchase.group_purchase_manager,1,1,1,1
access_demand_purchase_line,demand.purchase.line,model_demand_purchase_line,purchase.group_purchase_user,1,1,1,1
access_demand_purchase_line_manager,demand.purchase.line,model_demand_purchase_line,purchase.group_purchase_manager,1,1,1,1
access_demand_bom_line_manager,demand.bom.line,model_demand_bom_line,purchase.group_purchase_manager,1,1,1,1
access_demand_bom_line,demand.bom.line,model_demand_bom_line,purchase.group_purchase_user,1,1,1,1
access_demand_purchase,demand.purchase,model_demand_purchase,purchase.group_purchase_user,1,1,1,1
access_demand_purchase_manager,demand.purchase,model_demand_purchase,purchase.group_purchase_manager,1,1,1,1
access_before_purchase,before.purchase,model_before_purchase,purchase.group_purchase_user,1,1,1,1
access_before_purchase_manager,before.purchase,model_before_purchase,purchase.group_purchase_manager,1,1,1,1
access_before_purchase_line,before.purchase.line,model_before_purchase_line,purchase.group_purchase_user,1,1,1,1
access_before_purchase_line_manager,before.purchase.line,model_before_purchase_line,purchase.group_purchase_manager,1,1,1,1
access_recreate_purchase_line,recreate.purchase.line,model_recreate_purchase_line,purchase.group_purchase_user,1,1,1,1
access_recreate_purchase_line_manager,recreate.purchase.line,model_recreate_purchase_line,purchase.group_purchase_manager,1,1,1,1
access_purchase_payrecord_line,purchase.payrecord.line,model_purchase_payrecord_line,purchase.group_purchase_user,1,0,0,0
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Form View -->
<record model="ir.ui.view" id="acc_company_form">
<field name="name">acc company</field>
<field name="model">acc.company</field>
<field name="arch" type="xml">
<form string="acc company" version="12.0">
<sheet>
<group>
<group>
<field name="name"/>
<field name="bank"/>
<field name="bank_number"/>
<field name="vat"/>
<field name="logo" widget="image" class="oe_avatar"/>
<field name="en_logo" widget="image" class="oe_avatar"/>
<field name="qr_code" widget="image" class="oe_avatar"/>
<field name="active"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="acc_company_tree">
<field name="name">acc company</field>
<field name="model">acc.company</field>
<field name="arch" type="xml">
<!-- <tree colors="grey:state == 'done'" string="Demand Purchase"> -->
<tree string="acc company">
<field name="name"/>
<field name="active"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_acc_company">
<field name="name">公司配置</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">acc.company</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<!-- <field name="search_view_id" ref="demand_purchase_search"/> -->
<field name="domain">[]</field>
<field name="context">{}</field>
</record>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data >
<!-- Demand Purchase Form View -->
<record model="ir.ui.view" id="before_purchase_form">
<field name="name">Before Purchase</field>
<field name="model">before.purchase</field>
<field name="arch" type="xml">
<form string="Before Purchase" version="12.0" create="0">
<header>
<button name="draft_button" states="draft" string="确认生成" type="object" groups="purchase.group_purchase_user"/>
<button name="draft_cancel" states="draft" string="拒绝" type="object" groups="purchase.group_purchase_user"/>
<button name="merge_before_line" states="draft" string="合并重复产品" type="object" groups="purchase.group_purchase_user"/>
<button name="%(add_partner_wizard)d" states="draft" type="action" string="批量添加供应商" class="oe_highlight" groups="purchase.group_purchase_user"/>
<button name="%(recreate_before_purchase_wizard)d" states="done" type="action" string="重新生成" class="oe_highlight" groups="purchase.group_purchase_user"/>
<!-- <button name='attachment_tree_view' type='object' string='附件'/> -->
<field name="state" widget="statusbar" statusbar_visible="draft,done" statusbar_colors='{"draft":"red"}'/>
</header>
<sheet>
<div class="oe_title">
<h1><field name="name" readonly="1"/></h1>
</div>
<group>
<group>
<field name="sale_order_id" readonly="1"/>
<field name="demand_purchase_id" readonly="1"/>
<field name="is_excipients" readonly="1"/>
<field name="po_number" />
<field name="delivery_address"/>
</group>
<group>
<field name="gen_datetime" readonly="1"/>
<field name="charge_person"/>
<field name="purchase_company"/>
</group>
</group>
<notebook colspan="4">
<page string="待确认明细行">
<field name="order_line">
<tree string="待确认明细行" editable="bottom">
<field name="product_id" options="{'no_create': True, 'no_open': True}" readonly="1"/>
<field name="product_model" readonly="1"/>
<field name="brand" readonly="1"/>
<field name="acc_code" readonly="1"/>
<field name="partner_code" readonly="1"/>
<field name="partner_id"/>
<field name="acc_purchase_price"/>
<field name="qty" readonly="1"/>
</tree>
</field>
</page>
<page string="重新生成明细行">
<field name="recreate_line">
<tree string="重新生成明细行" editable="bottom">
<field name="product_id" options="{'no_create': True, 'no_open': True}" readonly="1"/>
<field name="product_model" readonly="1"/>
<field name="brand" readonly="1"/>
<field name="acc_code" readonly="1"/>
<field name="partner_code" readonly="1"/>
<field name="partner_id" readonly="1"/>
<!-- <field name="partner_id" readonly="1"/> -->
<!-- <field name="acc_purchase_price" readonly="1"/> -->
<field name="qty" readonly="1"/>
</tree>
</field>
</page>
</notebook>
<!-- <notebook colspan="4">
<page string="重新生成明细行">
<field name="recreate_line">
<tree string="重新生成明细行" editable="bottom">
<field name="product_id" options="{'no_create': True, 'no_open': True}" readonly="1"/>
<field name="product_model" readonly="1"/>
<field name="brand" readonly="1"/>
<field name="acc_code" readonly="1"/>
<field name="partner_code" readonly="1"/>
<field name="partner_id" readonly="1"/>
<field name="acc_purchase_price" readonly="1"/>
<field name="qty" readonly="1"/>
</tree>
</field>
</page>
</notebook> -->
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="before_purchase_tree">
<field name="name">Before Purchase</field>
<field name="model">before.purchase</field>
<field name="arch" type="xml">
<!-- <tree colors="grey:state == 'done'" string="Demand Purchase"> -->
<tree decoration-danger="state=='draft'" decoration-success="state=='done'" string="Before Purchase" create="0">
<field name="name"/>
<field name="sale_order_id"/>
<field name="demand_purchase_id"/>
<field name="charge_person"/>
<field name="gen_datetime"/>
<field name="is_excipients"/>
<field name="state"/>
</tree>
</field>
</record>
<!-- <record id="demand_purchase_search" model="ir.ui.view">
<field name="name">Demand Purchase Search</field>
<field name="model">demand.purchase</field>
<field name="arch" type="xml">
<search string="Demand Purchase">
<field name="name" string="编号"/>
<group expand="0" string="Group By..." colspan="16">
<filter string="供应商" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="单号" domain="[]" context="{'group_by':'name'}"/>
<filter string="申请日期" domain="[]" context="{'group_by':'apply_date'}"/>
<filter string="申请人" domain="[]" context="{'group_by':'create_user'}"/>
<filter string="需求日期" domain="[]" context="{'group_by':'need_date'}"/>
<filter string="备注" domain="[]" context="{'group_by':'note'}"/>
</group>
</search>
</field>
</record> -->
<record id="before_purchase_search" model="ir.ui.view">
<field name="name">Before Purchase Search</field>
<field name="model">before.purchase</field>
<field name="arch" type="xml">
<search string="Search before purchase">
<filter string="待确认" name="wait_confirm" domain="[('state','=','draft')]"/>
<field name="order_line" string="产品编码" filter_domain="[('order_line.product_id.acc_code', 'ilike', self)]"/>
<field name="name" string="单号"/>
<field name="sale_order_id"/>
<field name="demand_purchase_id"/>
<field name="charge_person"/>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_before_purchase">
<field name="name">待确认询价单</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">before.purchase</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="before_purchase_search"/>
<field name="context">{'search_default_wait_confirm': 1}</field>
</record>
<menuitem id="menu_acct_before_purchase" name="待确认生成询价单" parent="menu_demand_purchase_management" action="action_before_purchase" groups="purchase.group_purchase_user" sequence="1"/>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data >
<!-- Form View -->
<record model="ir.ui.view" id="delivery_address_form">
<field name="name">delivery address</field>
<field name="model">delivery.address</field>
<field name="arch" type="xml">
<form string="delivery address" version="12.0">
<sheet>
<group>
<group>
<field name="name"/>
<field name="active" />
<field name="charge"/>
<field name="phone" />
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="delivery_address_tree">
<field name="name">delivery address</field>
<field name="model">delivery.address</field>
<field name="arch" type="xml">
<!-- <tree colors="grey:state == 'done'" string="Demand Purchase"> -->
<tree string="delivery address">
<field name="name"/>
<field name="active"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_delivery_address">
<field name="name">收货地址</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">delivery.address</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<!-- <field name="search_view_id" ref="demand_purchase_search"/> -->
<field name="domain">[]</field>
<field name="context">{}</field>
</record>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data >
<!-- Demand Purchase Form View -->
<record model="ir.ui.view" id="demand_purchase_form">
<field name="name">Demand Purchase</field>
<field name="model">demand.purchase</field>
<field name="arch" type="xml">
<form string="Demand Purchase" version="12.0">
<header>
<button name="draft_button" states="draft" string="提交审批" type="object" groups="purchase.group_purchase_user"/>
<button name="approve" states="confirmed" string="审批通过" type="object" groups="purchase.group_purchase_manager"/>
<button name="cancel" states="confirmed" string="取消" type="object" groups="purchase.group_purchase_manager"/>
<button name="reject" states="confirmed" string="拒绝" type="object" groups="purchase.group_purchase_manager"/>
<button name="cancel_draft" states="cancel" string="设为草稿" type="object" groups="purchase.group_purchase_user"/>
<button name="add_new_bom" states="done" string="物料清单变更" type="object" groups="purchase.group_purchase_user"/>
<!-- <button name='make_acccode' type='object' string='test'/> -->
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"draft":"red"}'/>
</header>
<sheet>
<div class="oe_title">
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="create_user"/>
<field name="apply_date"/>
<field name="bomupdate_time"/>
<field name="manage_user"/>
<field name="need_date" />
<!-- <field name="purchase_type" /> -->
<field name="delivery_address"/>
<field name="before_purchase_id" readonly="1"/>
</group>
<group>
<field name="po_number" />
<field name="charge_person" />
<field name="purchase_company" />
<field name="currency_id" options="{'no_create': True, 'no_open': True}"/>
<field name="internal_note" />
<!-- <field name="purchase_order_id"/> -->
</group>
</group>
<group>
<field name="note"/>
</group>
<notebook colspan="4">
<page string="采购明细">
<field name="order_line">
<tree string="采购明细" editable="bottom">
<field name="product_id" options="{'no_create': True, 'no_open': True}"/>
<field name="name"/>
<field name="product_qty"/>
<!-- <field name="default_code"/> -->
<field name="product_uom"/>
<field name="price_unit"/>
<field name="taxes_id" widget="many2many_tags" domain="[('type_tax_use','!=','sale')]"/>
<field name="price_subtotal"/>
</tree>
</field>
<group class="oe_subtotal_footer oe_right" groups="purchase.group_purchase_user">
<field name="amount_untaxed" />
<field name="amount_tax" />
<div class="oe_subtotal_footer_separator oe_inline">
<label for="amount_total"/>
</div>
<field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator" />
</group>
</page>
<page string="物料清单记录">
<field name="bom_line">
<tree string="物料清单记录">
<field name="mrp_bom_id"/>
<field name="code"/>
<field name="product_qty"/>
<field name="gen_date"/>
<field name="acc_type"/>
<field name="is_active"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="demand_purchase_tree">
<field name="name">Demand Purchase</field>
<field name="model">demand.purchase</field>
<field name="arch" type="xml">
<!-- <tree colors="grey:state == 'done'" string="Demand Purchase"> -->
<tree decoration-danger="state=='confirmed'" decoration-success="state=='done'" string="Demand Purchase">
<field name="name"/>
<field name="create_user"/>
<field name="apply_date" />
<field name="internal_note"/>
<field name="state"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_demand_purchase">
<field name="name">请购单</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">demand.purchase</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<!-- <field name="search_view_id" ref="demand_purchase_search"/> -->
<field name="domain">[]</field>
<field name="context">{}</field>
</record>
<!-- <record model="ir.actions.act_window.view" id="demand_purchase_tree_view">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="demand_purchase_tree"/>
<field name="act_window_id" ref="action_demand_purchase"/>
</record>
<record model="ir.actions.act_window.view" id="demand_purchase_form_view">
<field name="sequence" eval="2"/>
<field name="view_mode">form</field>
<field name="view_id" ref="demand_purchase_form"/>
<field name="act_window_id" ref="action_demand_purchase"/>
</record> -->
<menuitem id="menu_demand_purchase_management" name="杂项/基础信息"
parent="purchase.menu_purchase_root" sequence="1" />
<menuitem id="menu_demand_purchase" name="请购单" parent="menu_demand_purchase_management" action="action_demand_purchase" groups="purchase.group_purchase_user" sequence="1"/>
<menuitem id="menu_delivery_address" name="收货地址" parent="menu_demand_purchase_management" action="action_delivery_address" groups="purchase.group_purchase_user" sequence="2"/>
<menuitem id="menu_acc_company" name="公司配置" parent="menu_demand_purchase_management" action="action_acc_company" groups="purchase.group_purchase_user" sequence="3"/>
<!-- <menuitem id="menu_acct_bom" name="物料清单" parent="menu_demand_purchase_management" action="acct_mrp_bom_form_action" groups="purchase.group_purchase_user" sequence="1"/> -->
<menuitem id="menu_merge_purchase_form_action" name="询价单合并" parent="menu_demand_purchase_management" action="merge_purchase_wizard" groups="purchase.group_purchase_user" sequence="4"/>
<menuitem id="menu_merge_bom_form_action" name="物料清单合并" parent="menu_demand_purchase_management" action="merge_bom_wizard" groups="purchase.group_purchase_user" sequence="5"/>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="unovo_demand_purchase_seq" model="ir.sequence">
<field name="name">请购单</field>
<field name="code">demand.purchase</field>
<field name="prefix">DE%(year)s%(month)s%(day)s</field>
<field name="padding">3</field>
<field name="number_increment">1</field>
<field name="company_id" eval="False"/>
</record>
<record id="unovo_before_purchase_seq" model="ir.sequence">
<field name="name">待确认询价单</field>
<field name="code">before.purchase</field>
<field name="prefix">BP%(year)s%(month)s%(day)s</field>
<field name="padding">3</field>
<field name="number_increment">1</field>
<field name="company_id" eval="False"/>
</record>
</data>
</openerp>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="mail_act_purchase_order_approve" model="mail.activity.type">
<field name="name">采购单待办事项</field>
<field name="icon">fa-dollar</field>
<field name="res_model_id" ref="purchase.model_purchase_order"/>
</record>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<menuitem id="menu_export_data_root" name="导出数据" parent="purchase.menu_purchase_root" sequence="50"/>
<menuitem id="menu_export_purchase_form_action" name="采购单数据导出" parent="menu_export_data_root" action="export_purchase_wizard" groups="purchase.group_purchase_user" sequence="10"/>
<!-- <menuitem id="menu_export_invoice_data_root" name="导出数据" parent="sale.sale_menu_root" sequence="50"/> -->
<menuitem id="menu_export_purchaseinvoice_form_action" name="应付账单数据导出" parent="menu_export_data_root" groups="purchase.group_purchase_user" action="export_accpurchase_wizard" sequence="20"/>
<menuitem id="menu_export_stockinfo_form_action" name="未到货物料表数据导出" parent="menu_export_data_root" groups="purchase.group_purchase_user" action="export_accstock_wizard" sequence="30"/>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
string="锐驰采购单"
id="unovo_report_purchase"
model="purchase.order"
report_type="qweb-html"
file="acct_purchase.unovo_report_purchaseorder"
name="acct_purchase.unovo_report_purchaseorder"
/>
<report
string="锐驰英文采购单"
id="acc_report_purchase"
model="purchase.order"
report_type="qweb-html"
file="acct_purchase.acc_report_purchaseorder"
name="acct_purchase.acc_report_purchaseorder"
/>
</data>
</openerp>
\ No newline at end of file
# -*- coding: utf-8 -*-
from . import export_purchase
from . import merge_purchase
from . import merge_bom
from . import import_bom
from . import add_partner
from . import purchase_separate
from . import recreate_before_purchase
from . import export_purchase_invoice
from . import export_stock_info
\ No newline at end of file
#coding=utf-8
from odoo import models,fields,api, _
import datetime
import logging
from odoo.exceptions import UserError, ValidationError
_logger = logging.getLogger(__name__)
class AddPartner(models.TransientModel):
_name = "add.partner"
# product_tmpl_id = fields.Many2one('product.template',string='合并为')
brand = fields.Char(string=u'品牌',required=True)
# bom_ids = fields.Many2many('mrp.bom','bom_merge_rel',string=u"物料清单")
partner_id = fields.Many2one('res.partner',string='选择供应商',required=True)
@api.multi
def choose_partner(self):
brand = self.brand
partner_id = self.partner_id
context = dict(self._context or {})
active_id = context.get('active_id', False)
# if active_id:
# before_model = self.env['before.purchase'].browse(active_id)
# for line in before_model.order_line:
# if line.brand == brand:
# line.write()
if active_id:
cr = self.env.cr
cr.execute("""
UPDATE before_purchase_line
SET partner_id = %s
WHERE
brand = '%s'
AND order_id = %s
"""% (partner_id.id,brand,active_id)
)
return True
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导数据-->
<record id="add_partner_form_view" model="ir.ui.view">
<field name="name">选择供应商</field>
<field name="model">add.partner</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<group>
<!-- <label string = "批量导入后请刷新页面"/> -->
<field name='brand'/>
<field name='partner_id'/>
</group>
<footer name="codes" >
<button class="oe_stat_button" name="choose_partner" string="批量填入供应商" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="add_partner_wizard" model="ir.actions.act_window">
<field name="name">批量导入供应商</field>
<field name="res_model">add.partner</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="add_partner_form_view"/>
<field name="target">new</field>
</record>
<!-- <menuitem id="import_bom_data" name="供应商数据导入" parent="acct_data_import_menu" sequence="1" action="import_partner_data_wizard"/> -->
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导出数据-->
<record id="export_accstock_form_view" model="ir.ui.view">
<field name="name">导出未到货物料表</field>
<field name="model">export.accstock.wizard</field>
<field name="arch" type="xml">
<form string="export">
<sheet>
<div style="font-size:20px">
填写项目号
</div>
<group>
<field name="origin"/>
<!-- <field name="purchase_company"/> -->
<!-- <field name="date_end" required="1"/> -->
</group>
<group name="codes">
<button class="oe_stat_button" name="export_stock_info_record" string="导出" type="object"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_export_accstock_wizard" model="ir.actions.act_window">
<field name="name">导出未到货物料表</field>
<field name="res_model">export.accstock.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="export_accstock_form_view"/>
<field name="target">inline</field>
</record>
<act_window id='export_accstock_wizard'
name='项目未到货物料表导出'
res_model='export.accstock.wizard'
view_id="export_accstock_form_view"
view_mode='form'
target="inline"
/>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导出数据-->
<record id="export_accpurchase_form_view" model="ir.ui.view">
<field name="name">导出应付款账单</field>
<field name="model">export.accpurchase.wizard</field>
<field name="arch" type="xml">
<form string="export">
<sheet>
<div style="font-size:20px">
应付账单导出筛选条件
</div>
<group>
<field name="charge_person"/>
<field name="purchase_company"/>
<!-- <field name="date_end" required="1"/> -->
</group>
<group name="codes">
<button class="oe_stat_button" name="export_purchase_invoice_record" string="导出" type="object"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_export_accpurchase_wizard" model="ir.actions.act_window">
<field name="name">导出应付账单数据</field>
<field name="res_model">export.accpurchase.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="export_accpurchase_form_view"/>
<field name="target">inline</field>
</record>
<act_window id='export_accpurchase_wizard'
name='应付账单导出'
res_model='export.accpurchase.wizard'
view_id="export_accpurchase_form_view"
view_mode='form'
target="inline"
/>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导出数据-->
<record id="export_purchase_form_view" model="ir.ui.view">
<field name="name">导出采购数据</field>
<field name="model">export.purchase.wizard</field>
<field name="arch" type="xml">
<form string="export">
<sheet>
<div style="font-size:20px">
采购数据导出筛选条件
</div>
<group>
<field name="product_state"/>
<field name="payment_state"/>
<field name="date_start" required="1"/>
<field name="date_end" required="1"/>
</group>
<group name="codes" >
<button class="oe_stat_button" name="export_purchase_record" string="导出" type="object"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_export_purchase_wizard" model="ir.actions.act_window">
<field name="name">导出数据</field>
<field name="res_model">export.purchase.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="export_purchase_form_view"/>
<field name="target">inline</field>
</record>
<act_window id='export_purchase_wizard'
name='导出采购数据'
res_model='export.purchase.wizard'
view_id="export_purchase_form_view"
view_mode='form'
target="inline"
/>
</data>
</odoo>
\ No newline at end of file
#coding=utf-8
from odoo import models,fields,api
import datetime,time
import xlwt
from datetime import datetime,timedelta
# import pandas as pd
import sys,os
file_url = 'my_addons/acct_purchase'
from odoo.http import request
file_url = os.path.join(sys.path[0],file_url)
import logging
import zipfile
import shutil
import base64
import logging
import codecs
_logger = logging.getLogger(__name__)
def check_path(image_path):
try:
dir_path = os.path.dirname(image_path)
if not os.path.exists(dir_path):
os.makedirs(dir_path)
except OSError as e:
logging.debug("file cant be created!{}".format(e))
return True
def zip_dir(dirname, zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name))
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(dirname):]
arcname = arcname.encode('GBK') #兼容windows平台,转为gbk,支持简体和繁体
# print arcname
zf.write(tar, arcname)
zf.close()
class ExportStockWizard(models.TransientModel):
_name = "export.accstock.wizard"
# date_start = fields.Datetime(string='起始日期',default=lambda self:fields.Datetime.now())
origin = fields.Char(string='项目号')
# charge_person = fields.Many2one('res.users',string=u'负责人')
def save_exel(self, header, body, file_name):
wbk = xlwt.Workbook(encoding='utf-8', style_compression=0)
# wbk.write(codecs.BOM_UTF8)
style1 = xlwt.easyxf('font: bold True;''alignment: horz center,vert center')
sheet = wbk.add_sheet('项目未到货物料表', cell_overwrite_ok=True)
# sheet.write(codecs.BOM_UTF8)
sheet.write(0, 0, 'some text')
sheet.write(0, 0, 'this should overwrite') ##重新设置,需要cell_overwrite_ok=True
n = 0
for i in xrange(len(header)):
sheet.write(n, i, header[i])
for i in xrange(len(body)):
n += 1
for j in xrange(len(body[i])):
# sheet.write(n, j, body[i][j], self.set_style())
sheet.write(n, j, body[i][j])
wbk.save(file_name) ##该文件名必须存在
def export_record(self,file_name):
"""
导出未到货物料表
:return:
"""
return {
'type': 'ir.actions.act_url',
'url': '/download/work/files_export?file=%s' % (file_name),
'target': 'self'
}
def export_stock_info_record(self):
origin = self.origin
today = time.strftime("%Y-%m-%d")
cr = self.env.cr
# if self.charge_person and not self.purchase_company:
file_name_str = origin + '-' + '未到货物料' + today
sql = """ SELECT
b. NAME AS rname,
d. NAME AS pname,
A . NAME AS product_model,
A .product_qty AS product_qty,
A .qty_received AS qty_received,
e. NAME AS po_number,
A .forcast_date AS forcast_date,
e.title AS ptitle
FROM
purchase_order_line A
LEFT JOIN purchase_order e ON A .order_id = e.id
LEFT JOIN res_partner b ON b. ID = A .partner_id
LEFT JOIN product_product C ON C . ID = A .product_id
LEFT JOIN product_template d ON d. ID = C .product_tmpl_id
WHERE
(a.qty_received IS NULL or a.qty_received < a.product_qty)
and e.title = '%s'
and e.state = 'purchase' """%(origin)
cr.execute(sql)
result = cr.dictfetchall()
detail_list_all=[]
# print result
# strftime("%Y%m%d_%H%M%S")
i= 0
for line in result:
detail_list_first = []
i += 1
detail_list_first.append(i)
detail_list_first.append(line.get('rname'))
detail_list_first.append(line.get('pname'))
detail_list_first.append(line.get('product_model'))
detail_list_first.append(line.get('product_qty'))
if line.get('qty_received'):
detail_list_first.append(line.get('qty_received'))
else:
detail_list_first.append(0)
detail_list_first.append(line.get('po_number'))
if line.get('forcast_date'):
detail_list_first.append(line.get('forcast_date').strftime("%Y-%m-%d"))
else:
detail_list_first.append(line.get('forcast_date'))
# detail_list_first.append(line.get('forcast_date'))
detail_list_first.append(line.get('ptitle'))
# detail_list_first.append(str(line.get('amount_total')))
# detail_list_first.append(str(line.get('residual')))
# detail_list_first.append(line.get('symbol')+str(line.get('amount_total')))
# detail_list_first.append(line.get('symbol')+str(line.get('residual')))
detail_list_all.append(detail_list_first)
dir_path = os.path.join(file_url, 'Administrator')
filename = "{}.xls".format(file_name_str)
file_path = os.path.join(dir_path, filename)
check_path(file_path)
# encode('utf-8')
head = ['序号','供应商', '品名', '型号', '采购数量','已接收数量','订单号','预计到货日期','项目号']
self.save_exel(head, detail_list_all, file_path)
return self.export_record(file_path)
#coding=utf-8
from odoo import http,fields,models
import base64
class ImportBomWizard(models.TransientModel):
_name = 'import.bom.wizard'
file_name = fields.Char(u'文件名')
data = fields.Binary(u'导入文件')
selected = fields.Integer(u'当前已选')
exported = fields.Integer(u'之前导出')
# by_code = fields.Boolean(string='根据编码导入')
def import_data_all(self):
context = self.env.context or {}
type = context.get('type',None)
data = self.data
if data:
data = base64.b64decode(data)
if data:
self.env['mrp.bom'].import_bom_charge(content=data)
# class ImportPurchaseLineWizard(models.TransientModel):
# _name = 'import.purchase.line.wizard'
# file_name = fields.Char(u'文件名')
# data = fields.Binary(u'导入文件')
# selected = fields.Integer(u'当前已选')
# exported = fields.Integer(u'之前导出')
# def import_data_all(self):
# context = self.env.context or {}
# type = context.get('type',None)
# data = self.data
# if data:
# data = base64.b64decode(data)
# if data:
# self.env['purchase.order.line'].import_purchase_line_data(content=data)
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导数据-->
<record id="import_bom_form_view" model="ir.ui.view">
<field name="name">导入物料清单</field>
<field name="model">import.bom.wizard</field>
<field name="arch" type="xml">
<form string="import">
<sheet>
<!-- <group>
<templates>
<t t-name="kanban-box">
<div class="o_web_settings_dashboard_pills">
<a href="/acct_base/static/files/联系人导入模板.xlsx" target="_blank" class="pull-left"><i class="fa text-muted"/>下载模板</a>
</div>
</t>
</templates>
</group> -->
<group>
<!-- <field name='file_name'/> -->
<field name='data' string="选择文件"/>
<!-- <field name='by_code'/> -->
<!--<field name='exported'/>-->
</group>
<footer name="codes" >
<button class="oe_stat_button" name="import_data_all" string="导入" type="object"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="import_bom_data_wizard" model="ir.actions.act_window">
<field name="name">物料清单导入</field>
<field name="res_model">import.bom.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<!-- <field name="context">{"type":"vmc_watergodcard"}</field> -->
<field name="view_id" ref="import_bom_form_view"/>
<field name="target">new</field>
</record>
<!-- <menuitem id="import_bom_data" name="供应商数据导入" parent="acct_data_import_menu" sequence="1" action="import_partner_data_wizard"/> -->
</data>
</odoo>
\ No newline at end of file
#coding=utf-8
from odoo import models,fields,api, _
import datetime
import logging
from odoo.exceptions import UserError, ValidationError
_logger = logging.getLogger(__name__)
class MergeBomWizard(models.TransientModel):
_name = "merge.bom.wizard"
product_tmpl_id = fields.Many2one('product.template',string='合并为')
code = fields.Char(string=u'参考')
bom_ids = fields.Many2many('mrp.bom','bom_merge_rel',string=u"物料清单")
mrp_bom_id = fields.Many2one('mrp.bom',readonly=True,string='合并物料清单')
def merge_bom_order(self):
merge_tips = ""
mrp_bom = self.bom_ids
# list_ids = self.compare_partners(mrp_bom)
list_ids,merge_info = self.get_merge_info(mrp_bom)
cr = self.env.cr
cr.execute("""
SELECT
product_id AS pid,
SUM (product_qty) AS qty,
product_uom_id,
product_model,
brand,
acc_code
FROM
mrp_bom_line
WHERE
bom_id IN %s
GROUP BY
product_id,
product_uom_id,
product_model,
acc_code,
brand
"""% (tuple(list_ids),)
)
result = cr.dictfetchall()
self.create_bom(result,merge_info)
# merge_tips = "被合并单号为{},生成新单号为{}".format(po_name,po_obj.name)
# raise ValidationError(merge_tips)
# except Exception as e:
# logging.error(e)
# else:
# raise ValidationError(merge_tips)
@api.multi
def create_bom(self,result,merge_info):
res_line = []
for line in result:
line_vals = {
'product_id':line['pid'],
'product_model':line['product_model'],
'product_qty':line['qty'],
'acc_code':line['acc_code'],
'brand':line['brand'],
'product_uom_id':line['product_uom_id']
}
# res_line = [(0,0,line_vals)]
res_line.append((0,0,line_vals))
bom_vals = {
'product_tmpl_id':self.product_tmpl_id.id,
'code':self.code,
'type':'normal',
'product_qty':1,
'merge_info':merge_info,
'bom_line_ids':res_line
}
mrp_obj = self.env['mrp.bom'].create(bom_vals)
# subject = '提醒信息'
# merge_tips = "被合并单号为{},生成新单号为{}".format(po_name,po_obj.name)
self.write({'mrp_bom_id':mrp_obj.id})
# return self.message_post(body=merge_tips, subject=subject)
return True
# def compare_partners(self,purchase_order):
# partner_list = []
# list_ids = []
# po_name = []
# for order in purchase_order:
# partner_list.append(order.partner_id.id)
# list_ids.append(order.id)
# po_name.append(order.name)
# if len(set(partner_list)) > 1:
# raise ValidationError(u'所选询价单供应商不一致,不能合并!!!')
# if len(list_ids) <= 1:
# raise ValidationError(u'合并时至少选择两个询价单!!!')
# else:
# return list_ids,po_name
def get_merge_info(self,order):
merge_info = ""
bom_name = []
list_ids = []
for line in order:
bom_name.append(line.product_tmpl_id.name)
list_ids.append(line.id)
if len(list_ids) <= 1:
raise ValidationError(u'合并时至少选择两个物料清单!!!')
merge_info = "被合并物料清单{}".format(bom_name)
return list_ids,merge_info
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--导出数据-->
<record id="merge_bom_form_view" model="ir.ui.view">
<field name="name">物料清单合并</field>
<field name="model">merge.bom.wizard</field>
<field name="arch" type="xml">
<form string="mergebom">
<sheet>
<div style="font-size:20px">
物料清单合并
</div>
<group>
<!-- <field name="title"/>
<field name="charge_person"/>
<field name="purchase_type"/>
<field name="traffic_rule"/>
<field name="payment_rule"/> -->
<field name="product_tmpl_id"/>
<field name="code"/>
<field name="bom_ids" widget="many2many_tags"/>
<field name="mrp_bom_id"/>
</group>
<group>
<button class="oe_stat_button" name="merge_bom_order" string="确认合并" type="object"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_merge_bom_wizard" model="ir.actions.act_window">
<field name="name">物料清单合并</field>
<field name="res_model">merge.bom.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="merge_bom_form_view"/>
<field name="target">inline</field>
</record>
<act_window id='merge_bom_wizard'
name='物料清单合并'
res_model='merge.bom.wizard'
view_id="merge_bom_form_view"
view_mode='form'
target="inline"
/>
</data>
</odoo>
\ No newline at end of file
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件类型无法预览
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件类型无法预览
此文件类型无法预览
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异被折叠, 点击展开。
此文件的差异太大,无法显示。
此文件的差异被折叠, 点击展开。
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!