mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-18 18:12:03 +02:00
Initial commit: OCA Technical packages (595 packages)
This commit is contained in:
commit
2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions
|
|
@ -0,0 +1,5 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import hr_payroll_payslips_by_employees
|
||||
from . import hr_payroll_contribution_register_report
|
||||
from . import hr_payslip_change_state
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,32 @@
|
|||
from datetime import datetime
|
||||
|
||||
from dateutil import relativedelta
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class PayslipLinesContributionRegister(models.TransientModel):
|
||||
_name = "payslip.lines.contribution.register"
|
||||
_description = "Payslip Lines by Contribution Registers"
|
||||
|
||||
date_from = fields.Date(
|
||||
string="Date From", required=True, default=datetime.now().strftime("%Y-%m-01")
|
||||
)
|
||||
date_to = fields.Date(
|
||||
string="Date To",
|
||||
required=True,
|
||||
default=str(
|
||||
datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1)
|
||||
)[:10],
|
||||
)
|
||||
|
||||
def print_report(self):
|
||||
active_ids = self.env.context.get("active_ids", [])
|
||||
datas = {
|
||||
"ids": active_ids,
|
||||
"model": "hr.contribution.register",
|
||||
"form": self.read()[0],
|
||||
}
|
||||
return self.env.ref("payroll.action_contribution_register").report_action(
|
||||
[], data=datas
|
||||
)
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record id="view_payslip_lines_contribution_register" model="ir.ui.view">
|
||||
<field name="name">payslip.lines.contribution.register</field>
|
||||
<field name="model">payslip.lines.contribution.register</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Contribution Register's Payslip Lines">
|
||||
<group col="4" colspan="6">
|
||||
<field name="date_from" />
|
||||
<newline />
|
||||
<field name="date_to" />
|
||||
</group>
|
||||
<footer>
|
||||
<button
|
||||
name="print_report"
|
||||
string="Print"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
/>
|
||||
<button string="Cancel" class="btn-secondary" special="cancel" />
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record
|
||||
id="action_payslip_lines_contribution_register"
|
||||
model="ir.actions.act_window"
|
||||
>
|
||||
<field name="name">PaySlip Lines</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">payslip.lines.contribution.register</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
<field name="binding_model_id" ref="model_hr_contribution_register" />
|
||||
<field name="binding_type">report</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
from odoo import _, fields, models
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
# batch payslip processing
|
||||
class HrPayslipEmployees(models.TransientModel):
|
||||
_name = "hr.payslip.employees"
|
||||
_description = "Generate payslips for all selected employees"
|
||||
|
||||
employee_ids = fields.Many2many(
|
||||
"hr.employee", "hr_employee_group_rel", "payslip_id", "employee_id", "Employees"
|
||||
)
|
||||
|
||||
def compute_sheet(self):
|
||||
payslips = self.env["hr.payslip"]
|
||||
[data] = self.read()
|
||||
active_id = self.env.context.get("active_id")
|
||||
if active_id:
|
||||
[run_data] = (
|
||||
self.env["hr.payslip.run"]
|
||||
.browse(active_id)
|
||||
.read(["date_start",
|
||||
"date_end",
|
||||
"credit_note"
|
||||
#, "struct_id"
|
||||
])
|
||||
)
|
||||
from_date = run_data.get("date_start")
|
||||
to_date = run_data.get("date_end")
|
||||
#struct_id = run_data.get("struct_id")
|
||||
if not data["employee_ids"]:
|
||||
raise UserError(_("You must select employee(s) to generate payslip(s)."))
|
||||
for employee in self.env["hr.employee"].browse(data["employee_ids"]):
|
||||
slip_data = self.env["hr.payslip"].get_payslip_vals(
|
||||
from_date, to_date, employee.id #, contract_ids=False, struct_id=struct_id
|
||||
)
|
||||
res = {
|
||||
"employee_id": employee.id,
|
||||
"name": slip_data["value"].get("name"),
|
||||
#"struct_id": slip_data["value"].get("struct_id"),
|
||||
#"contract_ids": slip_data["value"].get("contract_ids"),
|
||||
#"struct_id": False, # hernad: izbaciti ovo?
|
||||
#"contract_id": False, # hernad: izbaciti ovo?
|
||||
"payslip_run_id": active_id,
|
||||
"input_line_ids": [
|
||||
(0, 0, x) for x in slip_data["value"].get("input_line_ids")
|
||||
],
|
||||
"worked_days_line_ids": [
|
||||
(0, 0, x) for x in slip_data["value"].get("worked_days_line_ids")
|
||||
],
|
||||
"date_from": from_date,
|
||||
"date_to": to_date,
|
||||
"credit_note": run_data.get("credit_note"),
|
||||
"company_id": employee.company_id.id,
|
||||
}
|
||||
payslips += self.env["hr.payslip"].create(res)
|
||||
payslips._compute_name()
|
||||
for payslip in payslips:
|
||||
payslip.onchange_dates()
|
||||
payslips.compute_sheet()
|
||||
return {"type": "ir.actions.act_window_close"}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record id="view_hr_payslip_by_employees" model="ir.ui.view">
|
||||
<field name="name">payroll_payslip_employees</field>
|
||||
<field name="model">hr.payslip.employees</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Payslips by Employees">
|
||||
<header>
|
||||
<button
|
||||
icon="fa-cogs"
|
||||
string="Generate"
|
||||
name="compute_sheet"
|
||||
type="object"
|
||||
class="oe_highlight"
|
||||
/>
|
||||
</header>
|
||||
<group>
|
||||
<span colspan="4" nolabel="1">
|
||||
This wizard will generate payslips for all selected employee(s)
|
||||
based on the dates and credit note
|
||||
specified
|
||||
on Payslips Run.
|
||||
</span>
|
||||
</group>
|
||||
<group colspan="4">
|
||||
</group>
|
||||
<separator string="Employees" colspan="4" />
|
||||
<newline />
|
||||
<field name="employee_ids" nolabel="1" />
|
||||
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_hr_payslip_by_employees" model="ir.actions.act_window">
|
||||
<field name="name">Generate Payslips</field>
|
||||
<field name="res_model">hr.payslip.employees</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="view_hr_payslip_by_employees" />
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
<odoo>
|
||||
<!-- Mail template are declared in a NOUPDATE block
|
||||
so users can freely customize/delete them
|
||||
-->
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Email template -->
|
||||
<record id="mail_template_hr_payslip" model="mail.template">
|
||||
<field name="name">Send payslip by email</field>
|
||||
<field name="model_id" ref="payroll.model_hr_payslip" />
|
||||
<field name="email_from">{{ user.email_formatted }}</field>
|
||||
<field name="email_to">{{ object.employee_id.private_email or object.employee_id.work_email }}</field>
|
||||
<field name="reply_to">{{ user.email_formatted }}</field>
|
||||
<field name="subject">{{ object.company_id.name }}: Platna lista {{ object.employee_id.name }} obracun {{ object.payslip_run_id.name }}</field>
|
||||
<field name="body_html" type="html">
|
||||
<div style="margin: 0px; padding: 0px;">
|
||||
<p style="margin: 0px; padding: 0px; font-size: 13px;">
|
||||
Poštovani/a <span style="font-weight:bold;" t-out="object.employee_id.name or 'NN'" />,
|
||||
<br /><br />
|
||||
u prilogu se nalazi obračun plate: <t t-out="object.payslip_run_id.name or 'PP'"/>.
|
||||
<br /><br />
|
||||
Na raspolaganju smo Vam za sva dodatna pitanja.
|
||||
<br /><br />
|
||||
<t t-out="user.signature or 'Referent za obracun plata'"/>
|
||||
</p>
|
||||
</div>
|
||||
</field>
|
||||
<field name="report_template" ref="payroll.action_report_payslip" />
|
||||
<field name="lang">{{ object.employee_id.address_home_id.lang }}</field>
|
||||
<field name="auto_delete" eval="True" />
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<data>
|
||||
<record id="action_partner_mass_mail" model="ir.actions.act_window">
|
||||
<field name="name">Send email with payslip</field>
|
||||
<field name="res_model">mail.compose.message</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
<field
|
||||
name="context"
|
||||
eval="{
|
||||
'default_composition_mode': 'mass_mail',
|
||||
'default_use_template': True,
|
||||
'default_template_id': ref('payroll.mail_template_hr_payslip'),
|
||||
}"
|
||||
/>
|
||||
<field name="binding_model_id" ref="payroll.model_hr_payslip" />
|
||||
<field name="binding_view_types">list</field>
|
||||
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
# Copyright 2019 - Eficent http://www.eficent.com/
|
||||
# Copyright 2019 Serpent Consulting Services Pvt. Ltd.
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||
from odoo import fields, models
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.tools.translate import _
|
||||
|
||||
|
||||
class HrPayslipChangeState(models.TransientModel):
|
||||
|
||||
_name = "hr.payslip.change.state"
|
||||
_description = "Change state of a payslip"
|
||||
|
||||
state = fields.Selection(
|
||||
selection=[
|
||||
("draft", "Set to Draft"),
|
||||
("verify", "Compute Sheet"),
|
||||
("done", "Confirm"),
|
||||
("cancel", "Cancel Payslip"),
|
||||
("cdraft", "Cancel then Draft"),
|
||||
],
|
||||
string="Action",
|
||||
help="* When the payslip is created the status is 'Draft'.\
|
||||
\n* If the payslip is under verification, the status is "
|
||||
"'Compute Sheet'. \
|
||||
\n* If the payslip is confirmed then status is set to 'Done'.\
|
||||
\n* When user cancel payslip the status is 'Rejected'.",
|
||||
)
|
||||
|
||||
def change_state_confirm(self):
|
||||
record_ids = self.env.context.get("active_ids", False)
|
||||
payslip_obj = self.env["hr.payslip"]
|
||||
new_state = self.state
|
||||
records = payslip_obj.browse(record_ids)
|
||||
|
||||
for rec in records:
|
||||
if new_state == "draft":
|
||||
if rec.state == "cancel":
|
||||
rec.action_payslip_draft()
|
||||
else:
|
||||
raise UserError(
|
||||
_(
|
||||
"Only rejected payslips can be reset to "
|
||||
"draft, the payslip %s is in "
|
||||
"%s state" % (rec.name, rec.state)
|
||||
)
|
||||
)
|
||||
elif new_state == "verify":
|
||||
if rec.state in ["draft", "verify"]:
|
||||
rec.compute_sheet()
|
||||
else:
|
||||
raise UserError(
|
||||
_(
|
||||
"Only draft payslips can be verified,"
|
||||
"the payslip %s is in "
|
||||
"%s state" % (rec.name, rec.state)
|
||||
)
|
||||
)
|
||||
elif new_state == "done":
|
||||
if rec.state in ("verify", "draft"):
|
||||
rec.action_payslip_done()
|
||||
else:
|
||||
raise UserError(
|
||||
_(
|
||||
"Only payslips in states verify or draft"
|
||||
" can be confirmed, the payslip %s is in "
|
||||
"%s state" % (rec.name, rec.state)
|
||||
)
|
||||
)
|
||||
elif new_state == "cancel":
|
||||
if rec.state != "cancel":
|
||||
rec.action_payslip_cancel()
|
||||
else:
|
||||
raise UserError(
|
||||
_(
|
||||
"The payslip %s is already canceled "
|
||||
"please deselect it" % rec.name
|
||||
)
|
||||
)
|
||||
elif new_state == "cdraft":
|
||||
if rec.state != "cancel":
|
||||
rec.action_payslip_cancel()
|
||||
rec.action_payslip_draft()
|
||||
|
||||
|
||||
return {
|
||||
"domain": "[('id','in', [" + ",".join(map(str, record_ids)) + "])]",
|
||||
"name": _("Payslips"),
|
||||
"view_mode": "tree,form",
|
||||
"res_model": "hr.payslip",
|
||||
"view_id": False,
|
||||
"context": False,
|
||||
"type": "ir.actions.act_window",
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<!--Copyright 2019 - Eficent http://www.eficent.com/-->
|
||||
<!--Copyright 2019 Serpent Consulting Services Pvt. Ltd.-->
|
||||
<!--License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).-->
|
||||
<record id="hr_payslip_change_state_form" model="ir.ui.view">
|
||||
<field name="name">hr.payslip.change.state.form</field>
|
||||
<field name="model">hr.payslip.change.state</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Change state">
|
||||
<group>
|
||||
<field name="state" />
|
||||
</group>
|
||||
<footer>
|
||||
<button
|
||||
string="Execute"
|
||||
name="change_state_confirm"
|
||||
type="object"
|
||||
class="oe_highlight"
|
||||
/>
|
||||
<button string="Cancel" class="oe_link" special="cancel" />
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_hr_payslip_change_state_form" model="ir.actions.act_window">
|
||||
<field name="name">Change state</field>
|
||||
<field name="res_model">hr.payslip.change.state</field>
|
||||
<field name="view_mode">form,tree</field>
|
||||
<field name="view_id" ref="hr_payslip_change_state_form" />
|
||||
<field name="target">new</field>
|
||||
<field name="binding_model_id" ref="payroll.model_hr_payslip" />
|
||||
</record>
|
||||
</odoo>
|
||||
Loading…
Add table
Add a link
Reference in a new issue