def compile_records(self):
     compiler = EnergyRecordCompiler()
     for target in self.record_targets:
         syrx_num = target["syrx_num"]
         start_date = target["start_date"]
         end_date = target["end_date"]
         compiler.compile_component_point_records_by_year_span(syrx_num, start_date, end_date)
 def _compile_equipment_point_records(self):
     compiler = EnergyRecordCompiler()
     for r in self.point_ranges:
         syrx_num = r["syrx_num"]
         start_date = r["start_date"]
         end_date = r["end_date"]
         self.uow.compiled_energy_records.delete_compiled_equipment_point_records(syrx_num, start_date, end_date)
         compiler.compile_component_point_records_by_year_span(syrx_num, start_date, end_date)
 def compile_equipment_point_records(self, ranges):
     compiler = EnergyRecordCompiler()
     for r in ranges:
         syrx_num = r.syrx_num
         start_date = r.start_date
         end_date = r.end_date
         self.uow.compiled_energy_records.delete_compiled_equipment_point_records(syrx_num, start_date, end_date)
         compiler.compile_component_point_records_by_year_span(syrx_num, start_date, end_date)
    def _add_data_for_mapping(self, mapping, syrx_num):
        if mapping['source'] == 'johnson':
            vendor_point_records = self.uow.unmapped_vendor_point_records.get_all_vendor_point_records_for_johnson(mapping)
        elif mapping['source'] == 'fieldserver':
            vendor_point_records = self.uow.unmapped_vendor_point_records.get_all_vendor_point_records_for_fieldserver(mapping)
        elif mapping['source'] == 'invensys':
            vendor_point_records = self.uow.unmapped_vendor_point_records.get_all_vendor_point_records_for_invensys(mapping)
        else:
            vendor_point_records = self.uow.unmapped_vendor_point_records.get_all_vendor_point_records_for_siemens(mapping)
        insert_list = []
        if len(vendor_point_records) < 1:
            return

        for record in vendor_point_records:
            record['syrx_num'] = syrx_num
            if mapping['source'] == 'johnson':
                del record['johnson_fqr']
                del record['johnson_site_id']
            elif mapping['source'] == 'fieldserver':
                del record['fieldserver_offset']
                del record['fieldserver_site_id']
            elif mapping['source'] == 'invensys':
                del record['invensys_point_name']
                del record['invensys_equipment_name']
                del record['invensys_site_name']
            else:
                del record['siemens_meter_name']

            del record['source']
            del record['id']
            insert_list.append(record)

        date_list = [r['date'] for r in insert_list]

        min_date = min(date_list)
        max_date = max(date_list)

        self.uow.energy_records.insert_equipment_point_records(insert_list)
        energy_record_compiler = EnergyRecordCompiler()
        energy_record_compiler.compile_component_point_records_by_year_span(syrx_num, min_date, max_date)
        if mapping['source'] == 'johnson':
            self.uow.unmapped_vendor_point_records.delete_all_for_johnson_point(mapping)
        elif mapping['source'] == 'fieldserver':
            self.uow.unmapped_vendor_point_records.delete_all_for_fieldserver_point(mapping)
        elif mapping['source'] == 'invensys':
            self.uow.unmapped_vendor_point_records.delete_all_for_invensys_point(mapping)
        else:
            self.uow.unmapped_vendor_point_records.delete_all_for_siemens_point(mapping)
    def _insert_new_records(self, mapping, records):
        insert_list = []
        error_list = []

        self._populate_weatherstation_id_on_records(mapping['syrx_num'], records)
        # weather_data is a dict keyed by the weatherstation id
        try:
            weather_data = self._get_weather_data(records)
        except:
            weather_data = dict()

        for r in records:
            error_messages = []
            value = None
            equipment_point_record = None

            try:
                value = float(r["value"])
            except:
                error_messages.append("Value is not a number")

            try:
                date = r['date']
                syrx_num = mapping["syrx_num"]
                weather = None

                weather_time = date.replace(minute=0)

                if "weatherstation_id" not in r or r["weatherstation_id"] not in weather_data:
                    error_messages.append("Weatherstation not found")
                elif weather_time not in weather_data[r["weatherstation_id"]]:
                    weather_time_str = weather_time.strftime("%Y-%m-%d %H:%M:%S")
                    error_messages.append("Time " + weather_time_str + " not found in weather data")
                else:
                    weather = weather_data[r["weatherstation_id"]][weather_time]

                equipment_point_record = self.uow.energy_records.get_equipment_point_record(date, syrx_num,
                                                                                            value, weather,
                                                                                            self.date_time)
            except:
                error_messages.append("Timestamp could not be parsed")

            if len(error_messages) < 1:
                insert_list.append(equipment_point_record)
            else:
                mapping["errors"] = error_messages
                error_list.append(mapping)

        self.logger.debug("Found " + str(len(insert_list)) + " good records for " + str(mapping['syrx_num']) + ".")

        # insert the good records
        self.uow.energy_records.insert_equipment_point_records(insert_list)

        # get date range
        date_list = [x['date'] for x in insert_list]
        min_date = min(date_list)
        max_date = max(date_list)
        compiler = EnergyRecordCompiler()
        self.uow.compiled_energy_records.delete_compiled_equipment_point_records(mapping['syrx_num'], min_date, max_date)
        compiler.compile_component_point_records_by_year_span(mapping['syrx_num'], min_date, max_date)

        if len(error_list) > 0:
            # write bad records to file
            self._handle_bad_records(error_list)