Skip to content
Snippets Groups Projects
Commit f06edf37 authored by Marco Folco's avatar Marco Folco
Browse files

[MOD] invoice refund and tariff change

Added extra filters to both wizards
Added functionality on tariff change to also change the insurance of X invoice lines
parent 11f45387
No related branches found
No related tags found
1 merge request!41[MOD] invoice refund and tariff change
......@@ -67,3 +67,4 @@ class AccountInvoiceLine(models.Model):
descriptor_id = fields.Many2one('medical.benefit.descriptor','Descriptor')
professional_id = fields.Many2one('res.partner','Professional')
patient_id = fields.Many2one('res.partner',string='Patient',related='benefit_id.patient_id')
benefit_date = fields.Date("Benefit Date",related="benefit_id.benefit_date")
......@@ -20,15 +20,41 @@ _logger = logging.getLogger(__name__)
class AccountInvoiceRefund(models.TransientModel):
_inherit = "account.invoice.refund"
professional_id = fields.Many2one('res.partner','Professional')
descriptor_id = fields.Many2one('medical.benefit.descriptor','Descriptor')
date_from = fields.Date('Date from')
date_to = fields.Date('Date to')
@api.multi
def button_add_descriptor_lines(self):
def button_remove_all_lines(self):
self.write({'invoice_line_ids': [(5,0,0)]})
return {
'context': self.env.context,
'view_type': 'form',
'view_mode': 'form',
'res_model': 'account.invoice.refund',
'res_id': self.id,
'view_id': False,
'type': 'ir.actions.act_window',
'target': 'new',
}
@api.multi
def button_add_filtered_lines(self):
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
invoice_lines = invoice.invoice_line_ids.filtered(lambda x:x.benefit_id.state not in ['not_charged','charged','for_reinvoicing'] and x.benefit_id.invoice_id == invoice)
if self.descriptor_id:
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
invoice_lines = invoice.invoice_line_ids.filtered(lambda x:x.benefit_id.state not in ['not_charged','charged','for_reinvoicing'] and x.descriptor_id.id == self.descriptor_id.id and x.benefit_id.invoice_id == invoice)
for il in invoice_lines:
self.write({'invoice_line_ids': [(4,il.id)]})
invoice_lines = invoice_lines.filtered(lambda x:x.descriptor_id == self.descriptor_id)
if self.professional_id:
invoice_lines = invoice_lines.filtered(lambda x:x.professional_id == self.professional_id)
if self.date_from:
invoice_lines = invoice_lines.filtered(lambda x:x.benefit_date >= self.date_from)
if self.date_to:
invoice_lines = invoice_lines.filtered(lambda x:x.benefit_date <= self.date_to)
for il in invoice_lines:
self.write({'invoice_line_ids': [(4,il.id)]})
return {
'context': self.env.context,
'view_type': 'form',
......@@ -46,10 +72,12 @@ class AccountInvoiceRefund(models.TransientModel):
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
invoice_lines = invoice.invoice_line_ids.filtered(lambda x:x.benefit_id.state not in ['not_charged','charged','for_reinvoicing'] and x.benefit_id.invoice_id == invoice)
descriptors = invoice_lines.mapped('descriptor_id')
professionals = invoice_lines.mapped('professional_id')
return {
'domain':{
'invoice_line_ids': [('id','in',invoice_lines.ids)],
'descriptor_id': [('id','in',descriptors.ids)],
'professional_id': [('id','in',professionals.ids)],
}
}
......
......@@ -6,14 +6,30 @@
<field name="model">account.invoice.refund</field>
<field name="inherit_id" ref="account.view_account_invoice_refund"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='invoice_line_ids']" position="after">
<group>
<label for="descriptor_id"/>
<div class="o_row">
<field name="descriptor_id"/>
<button type="object" string="Add lines" name="button_add_descriptor_lines" class="oe_stat_button"/>
<xpath expr="//notebook[@name='refund_notebook']" position="inside">
<page string="Filters">
<p style="text-align:center;">Fill only the necessary fields to filter, leave in blank to add all available lines</p>
<group>
<field name="descriptor_id" options="{'no_create_edit': True}"/>
</group>
<group>
<field name="professional_id" options="{'no_create_edit': True}"/>
</group>
<group>
<label for="date_from" string="Date"/>
<div>
From <field name="date_from" class="oe_inline"/> to <field name="date_to" class="oe_inline"/>
</div>
</group>
<div style="text-align:right;">
<button name="button_add_filtered_lines" type="object" string="Add Lines" class="oe_highlight"/>
</div>
</group>
</page>
</xpath>
<xpath expr="//field[@name='invoice_line_ids']" position="after">
<div style="text-align:right;">
<button name="button_remove_all_lines" type="object" string="Remove all lines" class="oe_highlight"/>
</div>
</xpath>
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='name']" position="after">
<field name="descriptor_id"/>
......
......@@ -8,6 +8,8 @@ import logging
from odoo import models, api, fields, _
from odoo.exceptions import ValidationError, UserError
from datetime import datetime
from dateutil.relativedelta import relativedelta
# from odoo.exceptions import except_orm
# from odoo.addons.decimal_precision import decimal_precision as dp
# from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, \
......@@ -21,16 +23,44 @@ class WizardAccountInvoiceTariffChange(models.TransientModel):
_name = "wizard.account.invoice.tariff.change"
_description = "Wizard change tariff from all lines with the selected descriptor"
state = fields.Selection([
('change_tariff', 'Change Tariff'),
('change_insurance', 'Change Insurance')
], string='Action', default='change_tariff')
descriptor_id = fields.Many2one('medical.benefit.descriptor','Descriptor',domain=lambda x: x.get_domain_descriptor_id())
professional_id = fields.Many2one('res.partner','Professional',domain=lambda x: x.get_domain_professional_id())
date_from = fields.Date('Date from')
date_to = fields.Date('Date to')
price = fields.Float('Price')
insurance_id = fields.Many2one('health.insurance.plan','New Insurance',domain=lambda x: x.get_domain_insurance_id())
@api.multi
def get_domain_insurance_id(self):
domain = []
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
plan = invoice.partner_id.insurance_plan_id
if plan:
domain.extend([('insurance_id','=',plan.insurance_id.id)])
return domain
@api.multi
def get_domain_professional_id(self):
domain = []
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
professionals = invoice.invoice_line_ids.mapped('professional_id')
if professionals:
domain.append(('id','in',professionals.ids))
return domain
@api.multi
def get_domain_descriptor_id(self):
domain = []
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
descriptors = invoice.invoice_line_ids.mapped('descriptor_id')
if descriptors:
return [('id','in',descriptors.ids)]
return [()]
domain.append(('id','in',descriptors.ids))
return domain
@api.onchange('descriptor_id')
def onchange_descriptor_id(self):
......@@ -45,10 +75,90 @@ class WizardAccountInvoiceTariffChange(models.TransientModel):
self.price = 0
@api.multi
def button_change_tariff(self):
def filter_lines(self):
invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
lines = invoice.invoice_line_ids.filtered(lambda x: x.descriptor_id.id == self.descriptor_id.id)
lines.write({
'price_unit': self.price,
})
invoice_lines = invoice.invoice_line_ids
if self.descriptor_id:
invoice_lines = invoice_lines.filtered(lambda x:x.descriptor_id == self.descriptor_id)
if self.professional_id:
invoice_lines = invoice_lines.filtered(lambda x:x.professional_id == self.professional_id)
if self.date_from:
invoice_lines = invoice_lines.filtered(lambda x:x.benefit_date >= self.date_from)
if self.date_to:
invoice_lines = invoice_lines.filtered(lambda x:x.benefit_date <= self.date_to)
return invoice_lines
@api.multi
def button_change_tariff(self):
invoice_lines = self.filter_lines()
if invoice_lines:
invoice_lines.write({
'price_unit': self.price,
})
@api.multi
def button_change_insurance(self):
current_invoice_lines = self.filter_lines()
current_invoice = self.env['account.invoice'].browse(self._context.get('active_id',False))
AI_obj = self.env['account.invoice']
insurance_plan = self.insurance_id
date_invoice = str(datetime.now())
for plan in insurance_plan:
insurance_config = self.env['medical.invoice.config'].search([('insurance_id', '=', plan.insurance_id.id)])
date_due_invoice = str(datetime.now() + relativedelta(
months=insurance_config.due_months if insurance_config else 1)
)
benefits = current_invoice_lines.mapped('benefit_id')
if not benefits:
continue
account_id = insurance_config.product_id.categ_id.property_account_income_categ_id.id
product_id = insurance_config.product_id.id
invoice_lines = [{
'name': rec.name_get()[0][1],
'price_unit': rec.price / rec.quantity,
'quantity': rec.quantity,
'account_id': account_id,
'product_id': product_id,
'benefit_id': rec.id,
'descriptor_id': rec.descriptor_id.id,
'professional_id': rec.professional_id.id,
} for rec in benefits ]
invoice_line_ids = self.env['account.invoice.line'].create(invoice_lines).ids
invoice = AI_obj.create({
'currency_id': self.env.user.company_id.currency_id.id,
'date_invoice': date_invoice,
'partner_id': plan.partner_id.id,
'journal_id': 1,
'company_id': self.env.user.company_id.id,
'name': plan.partner_id.name,
'type': 'out_invoice',
'medical_invoice_id': current_invoice.medical_invoice_id.id,
'invoice_line_ids': [[6, 0] + [invoice_line_ids]]
})
invoice._onchange_partner_id()
invoice.write({'date_due': date_due_invoice})
for invoice_line in invoice.invoice_line_ids:
company_id = invoice_line.company_id or self.env.user.company_id
taxes = invoice_line.product_id.taxes_id.filtered(
lambda r: r.company_id == company_id
) or invoice_line.account_id.tax_ids or invoice_line.invoice_id.company_id.account_sale_tax_id
invoice_line.invoice_line_tax_ids = invoice_line.professional_id.property_account_position_id.map_tax(
taxes, invoice_line.product_id, invoice_line.professional_id
)
invoice._onchange_invoice_line_ids()
for line in current_invoice_lines:
current_invoice.write({'invoice_line_ids': [(2,line.id)]})
if not current_invoice.invoice_line_ids:
current_invoice.unlink()
return {
'context': self.env.context,
'view_type': 'form',
'view_mode': 'form',
'res_model': 'account.invoice',
'res_id': invoice.id,
'view_id': self.env.ref('account.invoice_form').id,
'type': 'ir.actions.act_window',
}
......@@ -6,12 +6,23 @@
<field name="model">wizard.account.invoice.tariff.change</field>
<field name="arch" type="xml">
<form string="Tariff Change">
<p style="text-align:center;">Fill only the necessary fields to filter, leave in blank to add all available lines</p>
<group>
<field name="descriptor_id"/>
<field name="price"/>
<field name="state" widget="radio"/>
</group>
<group>
<field name="insurance_id" states="change_insurance" options="{'no_create_edit': True}"/>
<field name="descriptor_id" options="{'no_create_edit': True}"/>
<field name="professional_id" options="{'no_create_edit': True}"/>
<label for="date_from" string="Date"/>
<div>
From <field name="date_from" class="oe_inline"/> to <field name="date_to" class="oe_inline"/>
</div>
<field name="price" states="change_tariff"/>
</group>
<footer>
<button type="object" class="oe_highlight" name="button_change_tariff" string="Change Tariff"/>
<button type="object" class="oe_highlight" name="button_change_tariff" string="Change Tariff" states="change_tariff"/>
<button type="object" class="oe_highlight" name="button_change_insurance" string="Change Insurance" states="change_insurance"/>
<button type="special" special="cancel" string="Cancel"/>
</footer>
</form>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment