From 08e3d611b3dffcb58328808d5dbd4400151afcfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Tue, 6 Jan 2026 20:57:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_salary/__manifest__.py | 6 ++ yuthon_salary/models/__init__.py | 3 +- yuthon_salary/models/yuthon_meal_expenses.py | 45 +++++++++++ yuthon_salary/models/yuthon_salary_party.py | 26 +++++- yuthon_salary/security/ir.model.access.csv | 7 +- yuthon_salary/static/others/salary_meal.xlsx | Bin 0 -> 9502 bytes yuthon_salary/static/others/salary_party.xlsx | Bin 9438 -> 9495 bytes .../static/src/js/salary_meal_button.js | 42 ++++++++++ .../static/src/js/salary_party_button.js | 13 +++ .../static/src/xml/salary_meal_button.xml | 13 +++ .../static/src/xml/salary_party_button.xml | 3 + .../views/yuthon_meal_expenses_views.xml | 27 +++++++ .../views/yuthon_salary_party_views.xml | 6 +- yuthon_salary/wizard/__init__.py | 5 +- yuthon_salary/wizard/party_meal_wizard.py | 74 +++++++++++++++++ .../wizard/party_meal_wizard_views.xml | 22 +++++ yuthon_salary/wizard/party_send_wizard.py | 69 ++++++++++++++++ .../wizard/party_send_wizard_views.xml | 22 +++++ yuthon_salary/wizard/salary_meal_wizard.py | 76 ++++++++++++++++++ .../wizard/salary_meal_wizard_views.xml | 37 +++++++++ yuthon_salary/wizard/salary_party_wizard.py | 20 +++-- yuthon_work_brand/views/hr_menus.xml | 5 ++ 22 files changed, 509 insertions(+), 12 deletions(-) create mode 100644 yuthon_salary/models/yuthon_meal_expenses.py create mode 100644 yuthon_salary/static/others/salary_meal.xlsx create mode 100644 yuthon_salary/static/src/js/salary_meal_button.js create mode 100644 yuthon_salary/static/src/xml/salary_meal_button.xml create mode 100644 yuthon_salary/views/yuthon_meal_expenses_views.xml create mode 100644 yuthon_salary/wizard/party_meal_wizard.py create mode 100644 yuthon_salary/wizard/party_meal_wizard_views.xml create mode 100644 yuthon_salary/wizard/party_send_wizard.py create mode 100644 yuthon_salary/wizard/party_send_wizard_views.xml create mode 100644 yuthon_salary/wizard/salary_meal_wizard.py create mode 100644 yuthon_salary/wizard/salary_meal_wizard_views.xml diff --git a/yuthon_salary/__manifest__.py b/yuthon_salary/__manifest__.py index 9979fc76a..eca970dfd 100644 --- a/yuthon_salary/__manifest__.py +++ b/yuthon_salary/__manifest__.py @@ -31,10 +31,14 @@ 'views/yuthon_salary_documents_views.xml', 'views/yuthon_welfare_expenses_views.xml', 'views/yuthon_payroll_retired_views.xml', + 'views/yuthon_meal_expenses_views.xml', 'views/yuthon_salary_year_views.xml', 'wizard/rank_log_wizard_views.xml', + 'wizard/salary_meal_wizard_views.xml', 'wizard/yuthon_salary_wizard_views.xml', 'wizard/salary_party_wizard_views.xml', + 'wizard/party_send_wizard_views.xml', + 'wizard/party_meal_wizard_views.xml', 'wizard/temporary_payslip_wizard_views.xml', 'wizard/salary_import_wizard_views.xml', 'wizard/yuthon_payroll_wizard_views.xml', @@ -64,6 +68,8 @@ 'yuthon_salary/static/src/js/salary_validation_button.js', 'yuthon_salary/static/src/js/salary_year_button.js', 'yuthon_salary/static/src/js/salary_import_button.js', + 'yuthon_salary/static/src/js/salary_meal_button.js', + 'yuthon_salary/static/src/xml/salary_meal_button.xml', 'yuthon_salary/static/src/xml/salary_create_button.xml', 'yuthon_salary/static/src/xml/salary_labor_button.xml', 'yuthon_salary/static/src/xml/salary_import_button.xml', diff --git a/yuthon_salary/models/__init__.py b/yuthon_salary/models/__init__.py index 8864f9ba9..345668a87 100644 --- a/yuthon_salary/models/__init__.py +++ b/yuthon_salary/models/__init__.py @@ -15,4 +15,5 @@ from . import yuthon_welfare_expenses from . import inherit_hr_payslip_run from . import inherit_hr_payslip_line from . import yuthon_salary_party -from . import yuthon_individual_tax \ No newline at end of file +from . import yuthon_individual_tax +from . import yuthon_meal_expenses \ No newline at end of file diff --git a/yuthon_salary/models/yuthon_meal_expenses.py b/yuthon_salary/models/yuthon_meal_expenses.py new file mode 100644 index 000000000..e0b571b42 --- /dev/null +++ b/yuthon_salary/models/yuthon_meal_expenses.py @@ -0,0 +1,45 @@ +from odoo import api, fields, models +from datetime import datetime +import calendar + + +class YuthonMealExpenses(models.Model): + _name = 'yuthon.meal.expenses' + _description = '餐费' + + employee_id = fields.Many2one('hr.employee', string='姓名') + card = fields.Char(string='身份证') + number_breakfasts = fields.Integer(string='早餐次数') + number_lunches = fields.Integer(string='午餐次数') + total_payment = fields.Float(string='合计缴费') + company_id = fields.Many2one(related='employee_id.company_id', string="公司") + select_time = fields.Selection([('1', '一月'), ('2', '二月'), ('3', '三月'), ('4', '四月'), + ('5', '五月'), ('6', '六月'), ('7', '七月'), ('8', '八月'), + ('9', '九月'), ('10', '十月'), ('11', '十一月'), + ('12', '十二月')], string='月份', + default=lambda self: self._get_default_month()) + select_year = fields.Selection(selection=[(str(i), str(i)) for i in range(2024, 2040)], string='年份', + default=lambda self: str(datetime.now().year)) + meal_state = fields.Selection([('to_do', '待发送'), ('done', '已发送')], string='状态', default='to_do') + + + def _get_default_month(self): + current_month = datetime.now().month + return str(current_month) + + def send_meal(self): + year = self.select_year or datetime.now().year + month = self.select_time or datetime.now().month + last_day = calendar.monthrange(year, month)[1] + message = f"""致{self.employee_id.name}: + {self.select_year}年{self.select_time}月 早餐{self.number_breakfasts} 次、午餐{self.number_lunches} 次,按餐标核算, + 本月餐费合计{self.total_payment}元。缴费截止{self.select_year}年{self.select_time}月{last_day}日],可汇入账户:[账户信息]。异议请联系行政部 [联系方式]。 + 办公室 + {fields.Date.today()}""" + self.sudo().env["wecom.apps"].sync_send_message( + category='att', + user_id=self.employee_id.wecom_userid, + message=message, + ) + self.write({'party_state': 'done'}) + diff --git a/yuthon_salary/models/yuthon_salary_party.py b/yuthon_salary/models/yuthon_salary_party.py index 0f948e3a8..7ca732b7d 100644 --- a/yuthon_salary/models/yuthon_salary_party.py +++ b/yuthon_salary/models/yuthon_salary_party.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from datetime import datetime class YuthonSalaryParty(models.Model): @@ -6,12 +7,35 @@ class YuthonSalaryParty(models.Model): _description = '党建' employee_id = fields.Many2one('hr.employee', string='姓名') - phone = fields.Char(string='手机') + card = fields.Char(string='身份找') fee = fields.Float(string='党费') payment = fields.Float(string='补缴党费') total_payment = fields.Float(string='合计缴费') company_id = fields.Many2one(related='employee_id.company_id', string="公司") + select_time = fields.Selection([('1', '一月'), ('2', '二月'), ('3', '三月'), ('4', '四月'), + ('5', '五月'), ('6', '六月'), ('7', '七月'), ('8', '八月'), + ('9', '九月'), ('10', '十月'), ('11', '十一月'), + ('12', '十二月')], string='月份', + default=lambda self: self._get_default_month()) + select_year = fields.Selection(selection=[(str(i), str(i)) for i in range(2024, 2040)], string='年份', + default=lambda self: str(datetime.now().year)) + party_state = fields.Selection([('to_do', '待发送'), ('done', '已发送')], string='状态', default='to_do') + def _get_default_month(self): + current_month = datetime.now().month + return str(current_month) + def send_party(self): + pay_year_month = self.select_year + '年' + self.select_time + '月' + message = f"""【{pay_year_month}缴纳党费通知】: + 请于{fields.Date.today()}(今天)15:00前将党费按时汇入账户:44001580909059000222 广州市天河投资集团有限公司, + 并在群里告知汇款完毕。 + 您当月的缴费金额为{self.total_payment},其中党费{self.fee},补缴党费{self.payment}。""" + self.sudo().env["wecom.apps"].sync_send_message( + category='att', + user_id=self.employee_id.wecom_userid, + message=message, + ) + self.write({'party_state': 'done'}) diff --git a/yuthon_salary/security/ir.model.access.csv b/yuthon_salary/security/ir.model.access.csv index 34e5dc719..bf11fa4f7 100644 --- a/yuthon_salary/security/ir.model.access.csv +++ b/yuthon_salary/security/ir.model.access.csv @@ -39,4 +39,9 @@ access_yuthon_salary_party,access_yuthon_salary_party,model_yuthon_salary_party, access_salary_party_wizard,access_salary_party_wizard,model_salary_party_wizard,base.group_user,1,1,1,1 access_salary_import_wizard,access_salary_import_wizard,model_salary_import_wizard,base.group_user,1,1,1,1 -access_yuthon_individual_tax,access_yuthon_individual_tax,model_yuthon_individual_tax,base.group_user,1,1,1,1 \ No newline at end of file +access_yuthon_individual_tax,access_yuthon_individual_tax,model_yuthon_individual_tax,base.group_user,1,1,1,1 +access_party_send_wizard,access_party_send_wizard,model_party_send_wizard,base.group_user,1,1,1,1 + +access_yuthon_meal_expenses,access_yuthon_meal_expenses,model_yuthon_meal_expenses,base.group_user,1,1,1,1 +access_party_meal_wizard,access_party_meal_wizard,model_party_meal_wizard,base.group_user,1,1,1,1 +access_salary_meal_wizard,access_salary_meal_wizard,model_salary_meal_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/yuthon_salary/static/others/salary_meal.xlsx b/yuthon_salary/static/others/salary_meal.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5296faeeb86289c5205599086236bf6cc1db8cc1 GIT binary patch literal 9502 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 z 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 Sxma;vB{!%r96b5G-2VYBuTxY2 literal 0 HcmV?d00001 diff --git a/yuthon_salary/static/others/salary_party.xlsx b/yuthon_salary/static/others/salary_party.xlsx index 61d522f69df34db05a6ce0c54528c92599c3a7f4..991dd8d29a8a4bc19fd08b4b5659edf914f0bd19 100644 GIT binary patch delta 2245 zcmY*ac{J1w7oK4lvP}#zCXBJA?EAj&yX^Z`kzLjrCTl2JewggLEM;jd$r6c_Ereob zXh>S5jID@I=lj0*yxl+UANSnn+;g7uJkKQ=;fz}VFg+9HNwy9c1o8)p!JOFG9CwRB zKKRg**&#F2rdZpxB2?g+V;>7~sZjkD?)dHu2N7`FVkfS{`QgMq-A4lNM?#jwZbQ2I zfU@Hksv3H&)4pyD^_?`=-6U50;YyQj9<~oFG@&8BR&H*q1WPyP=(cw77s1COS#4DW zxbMf_3QmLC|aq;hJ}f+%)va4M+P^ROfkd?jhDg=!K)VeIUG%cvW!drF;e{MJL| zo6DS{mgT*JemUgeW@sa!jJiZRO!O0rP`L8&Sv<|=&_Hign54WJAPb1=kCc(;X9q9Z z%jG{IvO{gw5-tYC|6Isd&^8h)>D)N?0$oG&8Y*^AP7W4GT^tOibh)6iy7|?3bm5g# zeIrIO1q5OL+pYI!>%KW)pdDx&*HDT@8X1stZtV z9UU0Fydl&-m6DpWZQX)I7SP@%Z}E5AhIzaSH&x+4g){FCGhU;UBg&Y!U72}y*{NPp zYPTL6Y1t8I;3)QKq(BmehU+L_MR%!S$ovlb$p%4rhRCuQ3o(NQXL z+VT!#?X6c0Ls+KL2#(_uUz>7CYJPg=%ROyERYvfORQhkV3uE=MzX@()B0u7b63+Yc zRZT8`ay>e7U2ur{&aTNf;(^g`gnefBcC#t($_!wl&7M{sr*f!9L&!7*8RijRkUo^S)u9BH=E}j58^lKquJcwM<=>L)zE20JW3QnJVUJ0 zsVlu=Isy+a_qLhfOgf79-;fj5HO8k2XYcN?v(Ebl3Fk3RmJqdIN%p0+ewDSm*^&~X z`b@@ajL&|pC(d&7U=_z_f~Yd@e(*!J-riVGOO&qKd-)kv!MQ0NXX1OfZc4TE8$`pe z8Q-XF)J>)0&k{&J!#E@sg?lX>c6yb5uG~hSckQtrwi^-soa(EKCx)jXu)8KEy!vJi zudRdgjsZu-t95>-J7t1rt@{?&WJY4yE#F-zwDQW-GNN{W55b;Vnq1#_=dhTf8qtAz z%)dT3-{ZRMBWFNe$wcyo7pRgfVu~NJHNYj_zL3f{ZQbGQF7+ys+VxD2MR?=Sb)5B9 zxX5^ar-8D2M`~MsyIsMVqJ~)slE@G~WxUN{K;braS$cHD8bI9fzCtZ-67}GFB29oH z(lg92kW*Z7kcVzDav-w$qlPyAHLV9NbKkB{^@kHDnx6O%4gxgM9N56DR%3`1T<^vJ zmhKbr4u@!t55s`OYZf}0$&&b&qlyw}CnvhaRE9_|e6j=G0^>--fr37TOaJ*Z&(Rwb zz2kW+GS2vmzV%^s`)eXAjFM4$$!tTJ%q;SeO6cGg$#xyfLu6{^&aXm&tqXzKaEadF z-K6p!h`;YDqTlDPE7m{5qP2wXs*@y59*8vOb$+xXS&ls{zni(2tWq4|P!is9jBBqp zHfbKLJdSoYe%}t)SjEMW%{6f!4kiDWY|g?{cjdLzC3U^6d>U)hL* zTsGy)+BNVdDy8*|icaunWh+@88424tBmRnh*=PEr0Kf%}z}v#| zVPG%dE1xEK6c9tnfHwh86!5RV{~IOG{m+v+2~xHb!~7{Qi0`ED0p|Rg;6NagUy|w! z4=}(lN2SgKpm>k~91Y|C+hBiC|Hl~s8fYzW2oR4}2JZnqXn86gD6owdz6*p3pt%1@bqEN=`PbGH;Gw{I+FyKshW`Oalk@)o delta 2183 zcmY*aXH=7k5=}zrEkXe4B!r@XhK>@X2ue#pLlGs2BGM5EB@~Syy@=#n0)`^el#VZS z6r@UBDI!h5r56EdN)cFm`;O=B{Fone?wucV=H8oPJYiH0fLS}|-O?_BL7-beI`||x zfr7=gpkWa|3_l?@E_hQ0^h!{C+Doy%Cp4)ZhV^&aY-$;C1CbWx_UAS; z8v~Vn)W$oNNX!lfc|L#WE3)alie<0t>~}rKU1n}CYMD+=4ii~v%C_--Kvl$EbNtd| zAr#MR&tP_yiq6O>A=2#KNBL2eNdaWpv!!y91)F)J_SjLm&mi11DNIVEt01Qa99bum z%|M}x6-=6rLNr>;!=SVBxNPVVN%W-4QApouh8J+pvIAUH%|$h*jFI{PtF89B(wv|V z?ca8Jf4;6EyIXTcxO%pM_ynE81+z+(+Ei2YSeH%lj-)IVYxx2{cJjAM(9H+*vke!t zm44Q*1bY1BV#9n3H552{iAnHWqY^E0z0Y$2D)BPiJCt03JL#`g@MaV0;QB~R&!M)r zF=g=~2@3aE9W=WV!eDN~0EL4`TRLvH!uD;eCiE0bv75y>$MqP9NCac|#@^{h^&oirb~BUMb9eCfKNHx)E@!+qwPpdU*8j&}8&HVlMNg{7N zpOTvsb!7;X{9j7)EeUv2gpCtlyjQC|zY{SUAI~Z|Bz>b~QWu@s422dZHSA$4w~HU$ z;Fyl{%kMGFXf@I*o05NOph9@{M;nRIPwNj)>LtQw7c?{FbK=^yBc|f|R$4OFMsc5B z6^M_OptXOpPc8;UiC!(r8{%EhZmPX_^AJY?ZLQKDh?GO$R31jCQx%og!x62XJe7EUv zfr_I`<1yJ+t+~E`EdN}_d6xeIRWL1wFh7(xSnoNvrRSR#{74}lr>wMXuz{RMdOG) z7CE%^H1}uzgB7>FB(`XL#A0A^)ndwAKOJHmh_3OOOFUEFwS%FVH8P6h8|uHaFAySf z-T8Yph|DTu%?u(zCy8F6c?tGvcV~cXa%kf@68`S^J8KcyCnl z663x~8-?hu+E)7h)i!+J>+zN0o6EhpREY!!GE;xTrzZ8qfH9`KS*QeW-{6*~;>Fwo zzSuRlppoV_d(|R{&YM4L+)c?B{2xo`IvQ>SO+kS&I89H z69ViwMaYSY#!y|D0kKI_CAnUUE!HsLo&*V^rK5~rRWY?r#H(gA!%V{&6QGYcTYIqn z3{A@%n(xXDIBYqNf?t10Tg1A5Q1ut#u^D*=&wA2j!AP^I(a;{(WNMo#*uWwyyy7_U z)%6ak2D8)=J%xcx=U&Hz{!LV+;izr?nV?R(W15Sn<`&;@G>`CobNJ=+dpcQNAAoBb z&>?)y()w0_W=oTxcgy%RnvA}l-ak1L<(c_$dc!e|E8zX~l0(|#xZ&RUC9-`Hbum^FftqBiBm$D6k^Gz6ZI{5oC|$G z1pZcH`l(Z=rfV!yyDtbKyRSi#3~^FkpJNSWU#h*gK38P%f+|LfE2XK5MEd1LvdY*m zV^VBoNwpo3~KR+b!{i(uQZlh%!9vQ`g5da;`XypQKH98dV#}ihh|JZLUKsIHSO{R z8+C#*Qh2RLv!^;;c@wdAwff3J7teK6BF|_a?Edh2NcTf}gLPfZ0?OtgITEm0h!44k ze*Bq)_P_50iyU0H=V{C7lu@rEm`&Zx7<4L1B_yo!XWfZ`8{csVN{yye5ck~}KMA@N zhAsgrX_dAWuEe-@fi1SX3SKS;iR^RZ9aTOBhvMsKi$1RNpx z0Wv}eTm{e&!2gA|8d6R8cf3GAAl_p={3q>`S7QCDf5=FHB&iEl2kIoxg9m_ZNj1nW6QF>S68`Te9>ZbB od%6E%{Es3Hc%U#~f1nVB5dQ7i$EcJ4LS+MUC^@DkiC@FN0k#?1SO5S3 diff --git a/yuthon_salary/static/src/js/salary_meal_button.js b/yuthon_salary/static/src/js/salary_meal_button.js new file mode 100644 index 000000000..29f22edff --- /dev/null +++ b/yuthon_salary/static/src/js/salary_meal_button.js @@ -0,0 +1,42 @@ +/** @odoo-module */ +import {ListController} from "@web/views/list/list_controller"; +import {registry} from '@web/core/registry'; +import {listView} from '@web/views/list/list_view'; + +export class CustomSalaryMealController extends ListController { + setup() { + super.setup(); + } + + openMealWizard() { + this.actionService.doAction({ + type: 'ir.actions.act_window', + res_model: 'salary.meal.wizard', + name: '餐费导入', + view_mode: 'form', + view_type: 'form', + views: [[false, 'form']], + target: 'new', + context: {}, + }); + } + + openMealSendWizard() { + this.actionService.doAction({ + type: 'ir.actions.act_window', + res_model: 'party.meal.wizard', + name: '发送弹窗', + view_mode: 'form', + view_type: 'form', + views: [[false, 'form']], + target: 'new', + context: {}, + }); + } +} + +registry.category("views").add("custom_meal_button", { + ...listView, + Controller: CustomSalaryMealController, + buttonTemplate: "meal_module.ListView.Buttons" +}); \ No newline at end of file diff --git a/yuthon_salary/static/src/js/salary_party_button.js b/yuthon_salary/static/src/js/salary_party_button.js index 229ac576d..d91cd2775 100644 --- a/yuthon_salary/static/src/js/salary_party_button.js +++ b/yuthon_salary/static/src/js/salary_party_button.js @@ -20,6 +20,19 @@ export class CustomSalaryPartyController extends ListController { context: {}, }); } + + openPartySendWizard() { + this.actionService.doAction({ + type: 'ir.actions.act_window', + res_model: 'party.send.wizard', + name: '发送弹窗', + view_mode: 'form', + view_type: 'form', + views: [[false, 'form']], + target: 'new', + context: {}, + }); + } } registry.category("views").add("custom_party_button", { diff --git a/yuthon_salary/static/src/xml/salary_meal_button.xml b/yuthon_salary/static/src/xml/salary_meal_button.xml new file mode 100644 index 000000000..53feb64ad --- /dev/null +++ b/yuthon_salary/static/src/xml/salary_meal_button.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/yuthon_salary/static/src/xml/salary_party_button.xml b/yuthon_salary/static/src/xml/salary_party_button.xml index a909547ba..a1cb363de 100644 --- a/yuthon_salary/static/src/xml/salary_party_button.xml +++ b/yuthon_salary/static/src/xml/salary_party_button.xml @@ -5,6 +5,9 @@ + diff --git a/yuthon_salary/views/yuthon_meal_expenses_views.xml b/yuthon_salary/views/yuthon_meal_expenses_views.xml new file mode 100644 index 000000000..f3f73a9e6 --- /dev/null +++ b/yuthon_salary/views/yuthon_meal_expenses_views.xml @@ -0,0 +1,27 @@ + + + + yuthon.meal.expenses.tree + yuthon.meal.expenses + + + + + + + + + + + +