diff --git a/hotel_ine/wizard/inewizard.py b/hotel_ine/wizard/inewizard.py index c2bc9000d..b0e88e7ef 100644 --- a/hotel_ine/wizard/inewizard.py +++ b/hotel_ine/wizard/inewizard.py @@ -30,61 +30,92 @@ import logging _logger = logging.getLogger(__name__) -def _get_default_date(option): +# def _get_default_date(option): +# now = datetime.datetime.now() +# month = int(now.month)-1 +# year = int(now.year) +# if month <= 0: +# month = 12 +# year -= year +# start_date = datetime.datetime(year, month, 1) +# end_date = calendar.monthrange(year, month)[1] - 1 +# month_end_date = start_date + datetime.timedelta(days=end_date) +# if option == "start": +# return start_date +# return month_end_date + + +def get_years(): + year_list = [] + for i in range(2017, get_year()+1): + year_list.append((i, str(i))) + return year_list + + +def get_year(): + now = datetime.datetime.now() + return int(now.year) + + +def get_month(): now = datetime.datetime.now() month = int(now.month)-1 - year = int(now.year) if month <= 0: month = 12 - year -= year - start_date = datetime.datetime(year, month, 1) - end_date = calendar.monthrange(year, month)[1] - 1 - month_end_date = start_date + datetime.timedelta(days=end_date) - if option == "start": - return start_date - return month_end_date + return month class Wizard(models.TransientModel): _name = 'ine.wizard' - @api.onchange('ine_start') - def onchange_ine_start(self): - if self.ine_start > self.ine_end: - self.ine_start = self.ine_end - txt_filename = fields.Char() txt_binary = fields.Binary() - ine_start = fields.Date("Fecha inicio", default=_get_default_date('start')) - ine_end = fields.Date("Fecha final", default=_get_default_date('end')) + + ine_month = fields.Selection([(1, 'January'), (2, 'February'), + (3, 'March'), (4, 'April'), + (5, 'May'), (6, 'June'), (7, 'July'), + (8, 'August'), (9, 'September'), + (10, 'October'), (11, 'November'), + (12, 'December'), ], + string='Month', default=get_month()) + ine_year = fields.Selection(get_years(), default=get_year(), string='Year') adr_screen = fields.Char() rev_screen = fields.Char() @api.one def generate_file(self): - + _logger.warning("Start Export INE XML file") + # month_first_date = datetime.datetime(self.ine_year, self.ine_month, 1) + last_day = calendar.monthrange(self.ine_year, self.ine_month)[1] + ine_start_search = datetime.date(self.ine_year, self.ine_month, 1) + ine_end_search = ine_start_search + datetime.timedelta(days=last_day) compan = self.env.user.company_id + active_room = self.env['hotel.room'].search([('in_ine', '=', True)]) message = "" if not compan.property_name: message = 'The NAME of the property is not established' + if not compan.name: + message = 'The NAME of the company is not established' if not compan.vat: - message = 'The VAT of the property is not established' + message = 'The VAT is not established' + if not compan.ine_tourism: + message = 'The tourism number of the property is not established' if message != "": raise UserError(message) return encuesta = ET.Element("ENCUESTA") cabezera = ET.SubElement(encuesta, "CABECERA") fecha = ET.SubElement(cabezera, "FECHA_REFERENCIA") - ET.SubElement(fecha, "MES").text = self.ine_start[5:7] - ET.SubElement(fecha, "ANYO").text = self.ine_start[0:4] + ET.SubElement(fecha, "MES").text = str(self.ine_month) + ET.SubElement(fecha, "ANYO").text = str(self.ine_year) ET.SubElement(cabezera, "DIAS_ABIERTO_MES_REFERENCIA").text = ( - str(int(self.ine_end[8:10]) - int(self.ine_start[8:10]) + 1)) + str(last_day)) ET.SubElement(cabezera, "RAZON_SOCIAL").text = compan.name ET.SubElement(cabezera, "NOMBRE_ESTABLECIMIENTO").text = ( compan.property_name) ET.SubElement(cabezera, "CIF_NIF").text = compan.vat[2:] - ET.SubElement(cabezera, "NUMERO_REGISTRO").text = compan.tourism + ET.SubElement(cabezera, "NUMERO_REGISTRO").text = compan.ine_tourism ET.SubElement(cabezera, "DIRECCION").text = compan.street ET.SubElement(cabezera, "CODIGO_POSTAL").text = compan.zip ET.SubElement(cabezera, "LOCALIDAD").text = compan.city @@ -93,31 +124,103 @@ class Wizard(models.TransientModel): ).text = compan.state_id.display_name ET.SubElement(cabezera, "TELEFONO_1").text = ( compan.phone.replace(' ', '')[0:12]) - ET.SubElement(cabezera, "TIPO").text = compan.category_id.tipo - ET.SubElement(cabezera, "CATEGORIA").text = compan.category_id.name - # Debug Stop ------------------- - import wdb; wdb.set_trace() - # Debug Stop ------------------- - active_room = self.env['hotel.room'].search_count( - [('capacity', '>', 0)]) - ET.SubElement(cabezera, "HABITACIONES").text = str(active_room) + ET.SubElement(cabezera, "TIPO").text = ( + compan.ine_category_id.category_type) + ET.SubElement(cabezera, "CATEGORIA").text = compan.ine_category_id.name + + ET.SubElement(cabezera, "HABITACIONES").text = str(len(active_room)) ET.SubElement(cabezera, "PLAZAS_DISPONIBLES_SIN_SUPLETORIAS" - ).text = str(compan.seats) + ).text = str(compan.ine_seats) ET.SubElement(cabezera, "URL").text = compan.website alojamiento = ET.SubElement(encuesta, "ALOJAMIENTO") + all_room_nights = self.env['hotel.reservation.line'].search([ + ('date', '>=', ine_start_search), + ('date', '<=', ine_end_search), + ('reservation_id.room_id.in_ine', '=', True), + ]) + room_nights = all_room_nights.filtered( + lambda n: (self.get_codeine(n.reservation_id))) + # Creating the empty dictionary system + dic_tabla = [] + for room_night in room_nights: + ine_code = self.get_codeine(room_night.reservation_id) + if not next((item for item in dic_tabla if item["ine"] == ine_code), False): + for x in range(1, last_day+1): + dic_tabla.append({'ine': ine_code, + 'dia': x, + 'entradas': 0, + 'salidas': 0, + 'pernocta': 0 + }) + # Adding overnight stays per day and INE code + for dia in range(1, last_day+1): + _logger.info("INE: Calculating %s de %s reservation", dia, last_day) + for room_night in room_nights.filtered(lambda x: x.date == str(self.ine_year)+'-'+str(self.ine_month).zfill(2)+'-'+str(dia).zfill(2)): + ine_code = self.get_codeine(room_night.reservation_id) + for idx, val in enumerate(dic_tabla): + if val['ine'] == ine_code and val['dia'] == dia: + dic_tabla[idx]['pernocta'] += room_night.reservation_id.adults + + # Debug Stop ------------------- + # import wdb; wdb.set_trace() + # Debug Stop ------------------- + # Calculating outputs and entries + count = 1 + last_stay = 0 + for idx, row in enumerate(dic_tabla): + if count == last_day: + last_stay = 0 + count = 1 + count += 1 + if last_stay < dic_tabla[idx]['pernocta']: + dic_tabla[idx]['entradas'] += dic_tabla[idx]['pernocta'] + elif last_stay > dic_tabla[idx]['pernocta']: + dic_tabla[idx]['salidas'] += last_stay - dic_tabla[idx]['pernocta'] + last_stay = dic_tabla[idx]['pernocta'] + + # "Print" outputs and entries + ine_residen = "" + for idx, row in enumerate(dic_tabla): + if ine_residen != dic_tabla[idx]['ine']: + ine_residen = dic_tabla[idx]['ine'] + residencia = ET.SubElement(alojamiento, "RESIDENCIA") + if len(dic_tabla[idx]['ine']) > 3: + ET.SubElement(residencia, "ID_PROVINCIA_ISLA" + ).text = str(dic_tabla[idx]['ine']) + else: + ET.SubElement(residencia, "ID_PAIS" + ).text = str(dic_tabla[idx]['ine']) + if (dic_tabla[idx]['entradas'] != 0) or (dic_tabla[idx]['salidas'] != 0) or (dic_tabla[idx]['pernocta'] != 0): + movimiento = ET.SubElement(residencia, "MOVIMIENTO") + ET.SubElement(movimiento, "N_DIA").text = "%02d" % dic_tabla[idx]['dia'] + ET.SubElement(movimiento, "ENTRADAS").text = str(dic_tabla[idx]['entradas']) + ET.SubElement(movimiento, "SALIDAS").text = str(dic_tabla[idx]['salidas']) + ET.SubElement(movimiento, "PERNOCTACIONES").text = str(dic_tabla[idx]['pernocta']) xmlstr = '' - xmlstr += ET.tostring(encuesta) + xmlstr += ET.tostring(encuesta).decode('utf-8') return self.write({ 'txt_filename': 'INE_'+str(self.ine_month)+'_'+str( - self.ine_year) + '.' + 'xml', + self.ine_year) + '.' + 'xml', # 'adr_screen': _('ADR in the month of the survey: ')+str( # round(month_adr_sum/month_adr_rooms, 2))+_('€ and '), # 'rev_screen': ' RevPar : '+str(round( # month_adr_sum/month_revpar_staff_rooms, 2))+'€', - 'txt_binary': base64.encodestring(xmlstr) + 'txt_binary': base64.encodestring(xmlstr.encode()) }) + + @api.model + def get_codeine(self, reserva): + response = False + code = reserva[0].partner_id.code_ine_id + if code: + response = code.code + else: + for l in reserva[0].folio_id.checkin_partner_ids: + if l.code_ine_id: + response = l.code_ine_id.code + return response diff --git a/hotel_ine/wizard/inewizard.xml b/hotel_ine/wizard/inewizard.xml index df784f063..9ae0ad03e 100644 --- a/hotel_ine/wizard/inewizard.xml +++ b/hotel_ine/wizard/inewizard.xml @@ -4,7 +4,7 @@ @@ -16,8 +16,8 @@
- - + +