def test_save_filing_with_colin_id(session): """Assert that saving a filing from the coops-updater-job user is set to paid and source is colin.""" from legal_api.models import Filing # setup filing = Filing() filing.filing_json = ANNUAL_REPORT filing.source = Filing.Source.COLIN.value filing.save() # test assert filing.source == Filing.Source.COLIN.value assert filing.status == Filing.Status.PAID.value
def load_historic_filings(corp_num: str, business: Business, legal_type: str): """Load historic filings for a business.""" try: # get historic filings r = requests.get( f'{COLIN_API}/api/v1/businesses/{legal_type}/{corp_num}/filings/historic', timeout=TIMEOUT) if r.status_code != HTTPStatus.OK or not r.json(): print( f'skipping history for {corp_num} historic filings not found') else: for historic_filing in r.json(): uow = versioning_manager.unit_of_work(db.session) transaction = uow.create_transaction(db.session) filing = Filing() filing_date = historic_filing['filing']['header']['date'] filing.filing_date = datetime.datetime.strptime( filing_date, '%Y-%m-%d') filing.business_id = business.id filing.filing_json = historic_filing for colin_id in filing.filing_json['filing']['header'][ 'colinIds']: colin_event_id = ColinEventId() colin_event_id.colin_event_id = colin_id filing.colin_event_ids.append(colin_event_id) filing.transaction_id = transaction.id filing._filing_type = historic_filing['filing']['header'][ 'name'] filing.paper_only = True filing.effective_date = datetime.datetime.strptime( historic_filing['filing']['header']['effectiveDate'], '%Y-%m-%d') updater_user = User.find_by_username(UPDATER_USERNAME) filing.submitter_id = updater_user.id filing.source = Filing.Source.COLIN.value db.session.add(filing) # only commit after all historic filings were added successfully db.session.commit() LOADED_FILING_HISTORY.append(corp_num) except requests.exceptions.Timeout: print('rolling back partial changes...') db.session.rollback() FAILED_FILING_HISTORY.append(corp_num) print('colin_api request timed out getting historic filings.') except Exception as err: print('rolling back partial changes...') db.session.rollback() FAILED_FILING_HISTORY.append(corp_num) raise err
def create_filing(filing_type, colin_filing, colin_event_id, corp_num): """Create legal api filing using colin filing as base""" effective_date = colin_filing['filing']['business']['foundingDate'] colin_filing['filing']['business']['identifier'] = corp_num filing = Filing(effective_date=effective_date, filing_json=colin_filing) filing._filing_type = filing_type filing.filing_date = effective_date colin_event = ColinEventId() colin_event.colin_event_id = colin_event_id filing.colin_event_ids.append(colin_event) # Override the state setting mechanism filing.skip_status_listener = True filing._status = 'PENDING' filing.source = Filing.Source.COLIN.value return filing
def _save_filing( client_request: LocalProxy, # pylint: disable=too-many-return-statements,too-many-branches business_identifier: str, user: User, filing_id: int ) -> Tuple[Union[Business, RegistrationBootstrap], Filing, dict, int]: """Save the filing to the ledger. If not successful, a dict of errors is returned. Returns: { Business: business model object found for the identifier provided Filing: filing model object for the submitted filing dict: a dict of errors int: the HTTPStatus error code @TODO refactor to a set of single putpose routines } """ json_input = client_request.get_json() if not json_input: return None, None, {'message': f'No filing json data in body of post for {business_identifier}.'}, \ HTTPStatus.BAD_REQUEST if business_identifier.startswith('T'): # bootstrap filing bootstrap = RegistrationBootstrap.find_by_identifier( business_identifier) business = None if not bootstrap: return None, None, { 'message': f'{business_identifier} not found' }, HTTPStatus.NOT_FOUND if client_request.method == 'PUT': rv = db.session.query(Filing). \ filter(Filing.temp_reg == business_identifier). \ filter(Filing.id == filing_id). \ one_or_none() if not rv: return None, None, { 'message': f'{business_identifier} no filings found' }, HTTPStatus.NOT_FOUND filing = rv else: filing = Filing() filing.temp_reg = bootstrap.identifier if not json_input['filing'].get('business'): json_input['filing']['business'] = {} json_input['filing']['business'][ 'identifier'] = bootstrap.identifier else: # regular filing for a business business = Business.find_by_identifier(business_identifier) if not business: return None, None, { 'message': f'{business_identifier} not found' }, HTTPStatus.NOT_FOUND if client_request.method == 'PUT': rv = db.session.query(Business, Filing). \ filter(Business.id == Filing.business_id). \ filter(Business.identifier == business_identifier). \ filter(Filing.id == filing_id). \ one_or_none() if not rv: return None, None, { 'message': f'{business_identifier} no filings found' }, HTTPStatus.NOT_FOUND filing = rv[1] else: filing = Filing() filing.business_id = business.id try: filing.submitter_id = user.id filing.filing_json = json_input filing.source = filing.filing_json['filing']['header'].get( 'source', Filing.Source.LEAR.value) if filing.source == Filing.Source.COLIN.value: try: filing.filing_date = datetime.datetime.fromisoformat( filing.filing_json['filing']['header']['date']) for colin_id in filing.filing_json['filing']['header'][ 'colinIds']: colin_event_id = ColinEventId() colin_event_id.colin_event_id = colin_id filing.colin_event_ids.append(colin_event_id) except KeyError: current_app.logger.error( 'Business:%s missing filing/header values, unable to save', business.identifier) return None, None, { 'message': 'missing filing/header values' }, HTTPStatus.BAD_REQUEST else: filing.filing_date = datetime.datetime.utcnow() # for any legal type, set effective date as set in json; otherwise leave as default filing.effective_date = \ datetime.datetime.fromisoformat(filing.filing_json['filing']['header']['effectiveDate']) \ if filing.filing_json['filing']['header'].get('effectiveDate', None) else datetime.datetime.utcnow() filing.save() except BusinessException as err: return None, None, {'error': err.error}, err.status_code return business or bootstrap, filing, None, None
def load_corps(csv_filepath: str = 'corp_nums/corps_to_load.csv'): """Load corps in given csv file from oracle into postgres.""" global ROWCOUNT with open(csv_filepath, 'r') as csvfile: reader = csv.DictReader(csvfile) with FLASK_APP.app_context(): for row in reader: corp_num = row['CORP_NUM'] print('loading: ', corp_num) added = False ROWCOUNT += 1 try: legal_type = Business.LegalTypes.COOP.value if corp_num[:2] != Business.LegalTypes.COOP.value: legal_type = Business.LegalTypes.BCOMP.value corp_num = 'BC' + corp_num[-7:] business = Business.find_by_identifier(corp_num) if business: added = True print( '-> business info already exists -- skipping corp load' ) else: try: # get current company info business_current_info = {} for info_type in BUSINESS_MODEL_INFO_TYPES[ legal_type]: business_current_info[ info_type] = get_oracle_info( corp_num=corp_num, legal_type=legal_type, info_type=info_type) if business_current_info[info_type].get( 'failed', False): raise Exception( f'could not load {info_type}') except requests.exceptions.Timeout: FAILED_CORPS.append(corp_num) print( 'colin_api request timed out getting corporation details.' ) continue except Exception as err: print(f'exception: {err}') print( f'skipping load for {corp_num}, exception occurred getting company info' ) continue uow = versioning_manager.unit_of_work(db.session) transaction = uow.create_transaction(db.session) try: # add BC prefix to non coop identifiers if legal_type != Business.LegalTypes.COOP.value: business_current_info['business']['business']['identifier'] = 'BC' + \ business_current_info['business']['business']['identifier'] # add company to postgres db business = create_business( business_current_info['business']) add_business_offices( business, business_current_info['office']) add_business_directors( business, business_current_info['parties']) if legal_type == Business.LegalTypes.BCOMP.value: add_business_shares( business, business_current_info['sharestructure']) add_business_resolutions( business, business_current_info['resolutions']) add_business_aliases( business, business_current_info['aliases']) filing = Filing() filing.filing_json = { 'filing': { 'header': { 'name': 'lear_epoch' }, 'business': business.json() } } filing._filing_type = 'lear_epoch' filing.source = Filing.Source.COLIN.value filing.transaction_id = transaction.id business.filings.append(filing) business.save() added = True NEW_CORPS.append(corp_num) except Exception as err: print(err) print(f'skipping {corp_num} missing info') FAILED_CORPS.append(corp_num) if added and history_needed(business=business): load_historic_filings(corp_num=corp_num, business=business, legal_type=legal_type) else: print( '-> historic filings not needed - skipping history load' ) except Exception as err: print(err) exit(-1)