Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compute cargos discount for GkWh products (RD 17/2021) #68

Merged
merged 2 commits into from
Oct 5, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 145 additions & 0 deletions som_generationkwh/giscedata_facturacio.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,29 @@ def anullar(self, cursor, uid, ids, tipus='A', context=None):

return refund_ids

def get_energy_product_from_gkwh(self, cursor, uid, gkwh_product_id, context=None):
"""" Get's atr product from Generation kWh product
product_id: product.product id
"""
res = None
per_obj = self.pool.get('giscedata.polissa.tarifa.periodes')

if isinstance(gkwh_product_id, (tuple, list)):
gkwh_product_id = gkwh_product_id[0]

search_vals = [
('product_gkwh_id', '=', gkwh_product_id)
]

per_ids = per_obj.search(
cursor, uid, search_vals, context=context
)

if per_ids:
res = per_obj.read(cursor, uid, per_ids[0], ['product_id'])['product_id'][0]

return res

def get_gkwh_period(self, cursor, uid, product_id, context=None):
"""" Get's linked Generation kWh period
product_id: product.product id
Expand Down Expand Up @@ -539,6 +562,128 @@ def fact_via_lectures(self, cursor, uid, polissa_id, lot_id, context=None):
factura_obj.button_reset_taxes(cursor, uid, factures, context=context)
return factures

def create_discount_lines_for_rd_17_2021(self, cursor, uid, fact_ids, context=None):
if context is None:
context = {}

fact_obj = self.pool.get('giscedata.facturacio.factura')
line_obj = self.pool.get('giscedata.facturacio.factura.linia')
pricelist_obj = self.pool.get('product.pricelist')
product_obj = self.pool.get('product.product')
imd_obj = self.pool.get('ir.model.data')

tarifes_elec_id = imd_obj.get_object_reference(
cursor, uid, 'giscedata_facturacio', 'pricelist_tarifas_electricidad'
)[1]
cargos_pricelist_id = imd_obj.get_object_reference(
cursor, uid, 'giscedata_facturacio', 'pricelist_tarifas_cargos_electricidad'
)[1]
discount_pricelist_id = imd_obj.get_object_reference(
cursor, uid, 'giscedata_facturacio_comer', 'pricelist_precios_descuento_rd_17_2021'
)[1]
discount_product_id = imd_obj.get_object_reference(
cursor, uid, 'giscedata_facturacio_comer', 'descompte_rd_17_2012'
)[1]
discount_product = product_obj.browse(cursor, uid, discount_product_id)

ctx = context.copy()
for factura_id in fact_ids:
factura = fact_obj.browse(cursor, uid, factura_id, context=ctx)

# IF there's a previous base_pricelist_lit where delete it
if ctx.get('base_pricelist_list', False):
ctx.update({'base_pricelist_list': {}})

periodes_energia = [l.product_id for l in factura.linia_ids if l.tipus == 'energia' and not l.is_gkwh()[l.id]]
num_periodes = len(list(set(periodes_energia)))
llista_preus = factura.llista_preu
mode_facturacio = factura.polissa_id.mode_facturacio
is_indexada_and_uses_cargos = self.is_indexada_and_uses_cargos(cursor, uid, factura, context=context)
if mode_facturacio == 'pvpc':
ctx['pricelist_base_price'] = 0.0 # Dummy base price to avoid error
for line in factura.linia_ids:
if line.tipus in ('energia', 'potencia') and line.data_desde >= "2021-06-01":
# let's get the price in order to get the base_pricelist_lit for his product
product_id = line.product_id.id
if line.is_gkwh()[line.id]:
product_id = fact_obj.get_energy_product_from_gkwh(cursor, uid, product_id)

ctx.update({'date': line.data_desde, 'uom': line.uos_id.id, 'base_pricelist_list': {}})
price = pricelist_obj.price_get(
cursor, uid, [llista_preus.id],
line.product_id.id, line.quantity, context=ctx
)
discount_to_apply = 0.0

if line.tipus == 'energia' and (
mode_facturacio == 'pvpc' or (
mode_facturacio == 'index' and is_indexada_and_uses_cargos)):
discount_to_apply = 1.0
else:
# List of pricelist referenced in the price list item recursively
base_pricelist_list = ctx.get('base_pricelist_list', False)
if base_pricelist_list and base_pricelist_list.get(tarifes_elec_id, False):
discount_to_apply = 1 + base_pricelist_list[tarifes_elec_id][0]

total_discount = 0.0
if line.tipus == 'energia' and num_periodes == 1 and line.data_desde >= '2021-09-16':
try:
discount_price = pricelist_obj.price_get(
cursor, uid, [discount_pricelist_id],
product_id, 1, context=ctx
)
except:
raise NotImplementedError(
_(u"Cálcul del preu de descompte segons RD 17/2021 no implementat "
u"per a la tarifa {}").format(factura.polissa_id.tarifa.name))
if discount_price:
total_discount = discount_price[discount_pricelist_id]
elif line.tipus == 'energia' and num_periodes == 2:
raise NotImplementedError(_(u"Cálcul del preu de descompte segons RD 17/2021 "
u"per a 2 periodes no implementat"))
else:
new_cargos_price = pricelist_obj.price_get(
cursor, uid, [cargos_pricelist_id],
product_id, 1, context=ctx
)

ctx2 = ctx.copy()
ctx2.update({'date': '2021-09-01'})
old_cargos_price = pricelist_obj.price_get(
cursor, uid, [cargos_pricelist_id],
product_id, 1, context=ctx2
)

if old_cargos_price.get(cargos_pricelist_id, False) and \
new_cargos_price.get(cargos_pricelist_id, False):
total_discount = new_cargos_price[cargos_pricelist_id] - \
old_cargos_price[cargos_pricelist_id]

if total_discount:
line_desc = "{} {} {}".format(discount_product.description, line.product_id.name, line.tipus)
vals = {
'data_desde': line.data_desde,
'data_fins': line.data_fins,
'uos_id': line.product_id.uom_id.id,
'quantity': line.quantity,
'multi': line.multi,
'product_id': discount_product_id,
'tipus': 'altres',
'name': line_desc,
'force_price': total_discount,
}

if discount_to_apply:
vals.update({'discount': discount_to_apply * 100.0})

ctx_crear_linia = context.copy()
ctx_crear_linia.update({'force_not_showing_discount': True})
line_id = self.crear_linia(cursor, uid, factura.id, vals, context=ctx_crear_linia)
tax_ids = [x.id for x in line.invoice_line_tax_id]
line_obj.write(cursor, uid, line_id, {'invoice_line_tax_id': [(6, 0, tax_ids)]})

factura.button_reset_taxes()


GiscedataFacturacioFacturador()

Expand Down