iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
永豐金融APIs

試著讀懂與串接永豐金融APIs系列 第 26

Day 0x1A odoo addons 永豐金流開發(Part 2 - model, view, security)

*** 請先建立資料夾 payment_sinopac,以下路徑以 "/" 來代表此資料夾 ***

0x1 addons 基本需要的 __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,
}

0x2 __init__

這裡跟建立 package 一樣,
不管是否有python檔案要被探索,
這個一定要建立(應該吧),因為今天會把 models 的部分建立出來,
所以這裡先拓展探索

/__init__.py

# coding: utf-8
from . import models

0x3 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

0x4 views

有 model 當然要有 view (廢話),而 odoo 寫 view 所使用的結構是 xml
在模組資料夾裡建立 /views

這裡不需要建立 __init__.py,因為這裡並沒有要建立 .py

建立一個 view,位置為 /views/payment_order_views.xml

  • 簡單解釋一下,這裡 view有三個部分
    1. 第一個 record 為 視圖,有沒有看到關鍵字 tree,這視清單要呈現的部分
    2. 第二個 record 為 動作,跟 odoo 通知說,這個 res_model 有哪些視圖可被使用(若該對應視圖不存在則會跑系統預設)
    3. 第三個 menuitem,就是把動作掛到選單上,讓使用者可以點擊,點擊後就會載入動作對應的視圖
<?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>

0x5 Not Done yet! 我們還有 security

自從 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>

0x6 執行odoo 並安裝模組

安裝完成後會在會計的設定選單裡,有個永豐金流訂單
https://ithelp.ithome.com.tw/upload/images/20211006/20141805uWS0KRMQdq.png

點選進去後就會看到我們剛剛建立的tree view
https://ithelp.ithome.com.tw/upload/images/20211006/20141805ywn5ZahDr7.png

0x7 今日結語

今天快速地跑過一次流程,很多細節沒有細講,若有任何問題或錯誤歡迎提出或指正
明天會把目前寫的永豐金流sdk放上來


上一篇
Day 0x19 - odoo addons 永豐金流開發(Part 1 - 預期目標)
下一篇
Day 0x1B - odoo addons 永豐金流開發(Part 2 - sinopac sdk... maybe)
系列文
試著讀懂與串接永豐金融APIs30

尚未有邦友留言

立即登入留言