*** 請先建立資料夾 payment_sinopac,以下路徑以 "/" 來代表此資料夾 ***
__manifest__
__manifest__
主要是跟odoo 溝通說這個模組的需求(depends)、介紹,以及資料設定(data)
/__manifest__.py
# -*- coding: utf-8 -*-
{
"name": """永豐金流""",
"summary": """13th IT鐵人賽""",
"category": "payment",
"images": ['static/description/icon.png'],
"version": "14.00",
"description": """
永豐金流 消費支付模組
""",
"author": "大河",
"website": "https://mikuroda4402.github.io",
'depends': ['web', 'website_sale'],
"external_dependencies": {
"python": ['pycryptodome'],
"bin": []
},
"data": [
'security/payment_sinopac_access_rule.xml',
'security/ir.model.access.csv',
'views/payment_order_views.xml',
],
'installable': True,
"application": False,
}
__init__
這裡跟建立 package 一樣,
不管是否有python檔案要被探索,
這個一定要建立(應該吧),因為今天會把 models 的部分建立出來,
所以這裡先拓展探索
/__init__.py
# coding: utf-8
from . import models
odoo 的 addons 是 MVC 架構,model 就是代表 table 欄位,
很有趣的是在 odoo 裡要開欄位不用 Migrate 直接在裡面宣告即可
所以我們先建立 /models/order_sinopac.py
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class OrderSinopac(models.Model):
_name = 'order.sinopac'
_rec_name = 'order_no'
order_no = fields.Char(string='訂單編號')
prdt_name = fields.Char(string='商品名稱')
ts_no = fields.Char(string='豐收款交易編號')
ts_date = fields.Datetime(string='交易時間')
approved_date = fields.Datetime(string='授權時間')
pay_date = fields.Datetime(string='付款/請款時間')
amount = fields.Float(string='訂單金額', digits=(10, 2))
status = fields.Char(string='處理狀態')
description = fields.Char(string='處理訊息')
pay_status = fields.Char(string='訂單付款狀態')
pay_type = fields.Selection(
string='收款方式',
selection=[('A', 'ATM轉帳'), ('C', '信用卡')]
)
expire_date = fields.Datetime(string='付款截止日期')
refund_flag = fields.Char(string='退款註記')
refund_status = fields.Datetime(string='退款狀態')
refund_date = fields.Date(string='申請退款日期')
# ATM Param
atm_pay_no = fields.Char(string='轉帳目的虛擬帳號')
web_atm_url = fields.Char(string='ATM 線上轉帳網址')
otp_url = fields.Char(string='簡訊動態密碼付款網址')
back_no = fields.Char(string='金融機構代碼')
acc_no = fields.Char(string='轉帳帳號')
# Card Param
auto_billing = fields.Boolean(string='信用卡自動請款', default=True)
exp_billing_days = fields.Integer(string='預計自動請款天數')
exp_minutes = fields.Integer(string='信用卡付款廉潔有效時間(分鐘)')
pay_type_sub = fields.Char(string='信用卡付款子項目')
card_pay_url = fields.Char(string='信用卡付款網址')
staging_first_amount = fields.Float(string='分期付款首期金額', digits=(10, 2))
staging_each_amount = fields.Float(string='分期付款每期金額', digits=(10, 2))
bonus_count = fields.Integer(string='紅利折抵點數')
bonus_amount = fields.Float(string='紅利折抵金額', digits=(10, 2))
bonus_pay_amount = fields.Float(string='紅利折抵實付金額', digits=(10, 2))
bonus_last_count = fields.Integer(string='紅利折抵剩餘點數')
left_cc_no = fields.Char(string='授權卡後前6碼')
right_cc_no = fields.Char(string='授權卡後後4碼')
auth_code = fields.Char(string='授權碼')
cc_exp_date = fields.Char(string='卡號有效期限')
cc_token = fields.Char(string='快速付款 Token')
order_id = fields.Many2one('sale.order', string='銷售訂單')
是不是忘了什麼?
models 資料夾被探索了,但沒有探索到剛剛的 py 對吧
所以一樣在 models 建立 __init__.py
/models/__init__.py
# coding: utf-8
from . import order_sinopac
有 model 當然要有 view (廢話),而 odoo 寫 view 所使用的結構是 xml
在模組資料夾裡建立 /views
這裡不需要建立 __init__.py
,因為這裡並沒有要建立 .py
建立一個 view,位置為 /views/payment_order_views.xml
視圖
,有沒有看到關鍵字 tree
,這視清單
要呈現的部分動作
,跟 odoo 通知說,這個 res_model 有哪些視圖可被使用(若該對應視圖不存在則會跑系統預設)<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="order_sinopac_tree" model="ir.ui.view">
<field name="name">永豐金流訂單列表</field>
<field name="model">order.sinopac</field>
<field name="arch" type="xml">
<tree>
<field name="order_no"/>
<field name="prdt_name"/>
<field name="ts_no"/>
<field name="ts_date"/>
<field name="amount"/>
<field name="status"/>
<field name="description"/>
<field name="pay_status"/>
</tree>
</field>
</record>
<record id="action_menuitem_order_sinopac" model="ir.actions.act_window">
<field name="name">永豐金流訂單</field>
<field name="res_model">order.sinopac</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menuitem_order_sinopac" name="永豐金流訂單"
action="action_menuitem_order_sinopac"
parent="account.root_payment_menu"
groups="base.group_user"
sequence="5"/>
</odoo>
自從 odoo 13版開始,沒有設定對於model的存取權限時,
就算view 寫好了、用管理員登入也看不到我們寫的畫面跟選單,
當然還是有無視權限的功能,但我只用過一次,早就忘了 :p
但還是推薦各位不要無視權限,不然要上線的時候會除錯除到懷疑人生
回到主題,一樣在模組裡建立 security
資料夾
並在裡面建立一個檔案 ir.model.access.csv
(請注意,要命名一模一樣,不然odoo不會理你)/security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
payment_sinopac_admin,model_admin_access,model_order_sinopac,payment_sinopac.group_manager,1,1,1,1
payment_sinopac_user,model_user_access,model_order_sinopac,base.group_user,1,0,0,0
還沒完成,我們在csv有宣告一個權限組 group_manager
我們同樣在這個資料夾建立另一個檔案 payment_sinopac_access_rule.xml
/security/payment_sinopac_access_rule.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<record model="ir.module.category" id="access_management">
<field name="name">永豐金流存取權限</field>
<field name="sequence">5</field>
</record>
<record id="group_manager" model="res.groups">
<field name="name">管理者</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="category_id" ref="payment_sinopac.access_management"/>
</record>
</data>
</odoo>
安裝完成後會在會計的設定選單裡,有個永豐金流訂單
點選進去後就會看到我們剛剛建立的tree view
今天快速地跑過一次流程,很多細節沒有細講,若有任何問題或錯誤歡迎提出或指正
明天會把目前寫的永豐金流sdk放上來