Esempio n. 1
0
    def post(self, mine_guid):
        data = self.parser.parse_args()

        mine = Mine.find_by_mine_guid(mine_guid)
        if not mine:
            raise NotFound(
                'There was no mine found with the provided mine_guid.')

        party = Party.find_by_party_guid(data.get('permittee_party_guid'))
        if not party:
            raise NotFound('Party not found')

        permit = Permit.find_by_permit_no(data.get('permit_no'))
        if permit:
            raise BadRequest("That permit number is already in use.")

        uploadedFiles = data.get('uploadedFiles', [])

        permit = Permit.create(mine.mine_guid, data.get('permit_no'),
                               data.get('permit_status_code'))

        amendment = PermitAmendment.create(
            permit,
            data.get('received_date'),
            data.get('issue_date'),
            data.get('authorization_end_date'),
            'OGP',
            description='Initial permit issued.')

        db.session.add(permit)
        db.session.add(amendment)

        for newFile in uploadedFiles:
            new_pa_doc = PermitAmendmentDocument(
                document_name=newFile['fileName'],
                document_manager_guid=newFile['document_manager_guid'],
                mine_guid=permit.mine_guid,
            )
            amendment.related_documents.append(new_pa_doc)
        db.session.commit()

        permittee_start_date = data.get('issue_date'),
        permittee = MinePartyAppointment.create(
            mine.mine_guid,
            data.get('permittee_party_guid'),
            'PMT',
            start_date=permittee_start_date,
            processed_by=self.get_user_info(),
            permit_guid=permit.permit_guid)
        db.session.add(permittee)
        db.session.commit()

        return permit
Esempio n. 2
0
 def get(self, permit_guid, mine_guid):
     permit = Permit.find_by_permit_guid_or_no(permit_guid)
     if not permit:
         raise NotFound('Permit not found.')
     if not str(permit.mine_guid) == mine_guid:
         raise BadRequest('Permit and mine_guid mismatch.')
     return permit
Esempio n. 3
0
    def post(self, mine_guid, permit_guid, permit_amendment_guid=None):
        if permit_amendment_guid:
            raise BadRequest('Unexpected permit_amendement_guid.')

        permit = Permit.find_by_permit_guid(permit_guid)
        if not permit:
            raise NotFound('Permit does not exist.')

        if not str(permit.mine_guid) == mine_guid:
            raise BadRequest(
                'Permits mine_guid and provided mine_guid mismatch.')

        data = self.parser.parse_args()
        current_app.logger.info(f'creating permit_amendment with >> {data}')

        party = Party.find_by_party_guid(data.get('permittee_party_guid'))
        if not party:
            raise NotFound('Party not found')

        party_is_active_permittee = False

        permittees = MinePartyAppointment.find_by_permit_guid(permit_guid)

        for permittee in permittees:
            if permittee.end_date is None:
                if permittee.party_guid == party.party_guid:
                    party_is_active_permittee = True
                else:  # inactive old permittees
                    permittee.end_date = datetime.utcnow()
                    permittee.save()

        if not party_is_active_permittee:
            new_permittee = MinePartyAppointment.create(permit.mine_guid,
                                                        data.get(
                                                            'permittee_party_guid'), 'PMT',
                                                        datetime.utcnow(), None,
                                                        self.get_user_info(), permit_guid, True)
            new_permittee.save()

        new_pa = PermitAmendment.create(
            permit,
            data.get('received_date'),
            data.get('issue_date'),
            data.get('authorization_end_date'),
            data.get('permit_amendment_type_code', 'AMD'),
            description=data.get('description'))

        uploadedFiles = data.get('uploadedFiles', [])
        for newFile in uploadedFiles:
            new_pa_doc = PermitAmendmentDocument(
                document_name=newFile['fileName'],
                document_manager_guid=newFile['document_manager_guid'],
                mine_guid=permit.mine_guid,
            )
            new_pa.related_documents.append(new_pa_doc)
        new_pa.save()
        return new_pa
Esempio n. 4
0
    def post(self, mine_guid):
        mine = Mine.find_by_mine_guid(mine_guid)
        if not mine:
            raise NotFound('Mine not found')

        data = self.parser.parse_args()

        mine_report_definition = MineReportDefinition.find_by_mine_report_definition_guid(
            data['mine_report_definition_guid'])
        permit = Permit.find_by_permit_guid_or_no(data['permit_guid'])
        if mine_report_definition is None:
            raise BadRequest('A report must be selected from the list.')

        if permit and permit.mine_guid != mine.mine_guid:
            raise BadRequest(
                'The permit must be associated with the selected mine.')
        mine_report = MineReport.create(
            mine_report_definition_id=mine_report_definition.
            mine_report_definition_id,
            mine_guid=mine.mine_guid,
            due_date=data.get('due_date'),
            received_date=data['received_date'],
            submission_year=data['submission_year'],
            permit_id=permit.permit_id if permit else None)

        submissions = data.get('mine_report_submissions')
        if submissions:
            submission = submissions[-1]
            if len(submission.get('documents')) > 0:
                submission_status = data.get(
                    'mine_report_submission_status') if data.get(
                        'mine_report_submission_status') else 'NRQ'
                report_submission = MineReportSubmission(
                    mine_report_submission_status_code=submission_status,
                    submission_date=datetime.utcnow())
                for submission_doc in submission.get('documents'):
                    mine_doc = MineDocument(
                        mine_guid=mine.mine_guid,
                        document_name=submission_doc['document_name'],
                        document_manager_guid=submission_doc[
                            'document_manager_guid'])

                    if not mine_doc:
                        raise BadRequest(
                            'Unable to register uploaded file as document')

                    mine_doc.save()

                    report_submission.documents.append(mine_doc)

                mine_report.mine_report_submissions.append(report_submission)
        try:
            mine_report.save()
        except Exception as e:
            raise InternalServerError(f'Error when saving: {e}')

        return mine_report, 201
Esempio n. 5
0
def test_permit_model_validate_permit_no():
    with pytest.raises(AssertionError) as e:
        Permit(permit_guid=uuid.uuid4(),
               mine_guid=uuid.uuid4(),
               permit_no='',
               permit_status_code='O',
               received_date=datetime.today(),
               issue_date=datetime.today())
    assert 'Permit number is not provided.' in str(e.value)
Esempio n. 6
0
def test_permit_model_validate_permit_no_max_char():
    with pytest.raises(AssertionError) as e:
        Permit(permit_guid=uuid.uuid4(),
               mine_guid=uuid.uuid4(),
               permit_no='6' * 17,
               permit_status_code='O',
               received_date=datetime.today(),
               issue_date=datetime.today())
    assert 'Permit number must not exceed 16 characters.' in str(e.value)
    def get(self):
        result = ""
        now_info = ""
        response_message = ""

        try:
            permit_no = request.args.get('a_PermitNumber')
            permit_prefix = permit_no.split("-")[0]

            permits = Permit.find_by_permit_no_all(permit_no)

            for permit in permits:
                mine = Mine.find_by_mine_guid(str(permit.mine_guid))

                # Mine must be operating.
                if not mine.mine_status or mine.mine_status[
                        0].mine_status_xref.mine_operation_status_code != "OP":
                    break

                if permit_prefix not in ["CX", "MX"]:
                    break

                for permit_amendment in permit.permit_amendments:
                    if (permit_amendment.authorization_end_date -
                            datetime.utcnow().date()).days > 30:
                        #only want permits that expire 30 days or further in the future
                        if permit_amendment.now_identity:
                            now_info = now_info + str(
                                permit_amendment.now_identity.now_number
                            ) + " - " + str(
                                permit_amendment.authorization_end_date) + '\r'
                        else:
                            now_info = now_info + " - " + str(
                                permit_amendment.authorization_end_date) + '\r'
                        break

            if now_info != "":
                result = "Success"
            else:
                result = "Failure"
                response_message = "NoValidNowsForPermit"

        except Exception as e:
            current_app.logger.error(str(e))
            result = "Failure"
            now_info = ""
            response_message = "Unhandled Exception"

        return {
            "a_Result": result,
            "a_NoWInfo": now_info,
            "a_ResponseMessage": response_message,
            "a_Timestamp": datetime.utcnow()
        }
Esempio n. 8
0
    def get(self):
        result = ""
        mine_info = ""
        response_message = ""

        try:
            permit_no = request.args.get('a_PermitNumber')
            permit_prefix = permit_no.split("-")[0]
            type_of_deemed_auth = request.args.get('a_TypeofDeemedAuth')

            permits = Permit.find_by_permit_no_all(permit_no)

            for permit in permits:
                mine = Mine.find_by_mine_guid(str(permit.mine_guid))

                # Mine must be operating.
                if not mine.mine_status or mine.mine_status[
                        0].mine_status_xref.mine_operation_status_code != "OP":
                    break

                # IP SURVEYS (Induced): Valid MMS mine types: 'CX','ES','EU'
                # There may be need of a check against mine_tenure_type_code IN ["MIN", "COL"] and mine_disturbance_code IN ["SUR", "UND"]
                # but this data is inconsistant for now.
                if type_of_deemed_auth == "INDUCED" and permit_prefix not in [
                        "CX", "MX"
                ]:
                    break

                # DRILL PROGRAM (Drill): Valid MMS mine types: 'CS','CU','MS','MU','IS','IU'
                if type_of_deemed_auth != "INDUCED" and permit_prefix not in [
                        "C", "M"
                ]:
                    break

                mine_info = mine_info + mine.mine_no + ' - ' + mine.mine_name + '\r\c'

            if mine_info != "":
                result = "Success"
            else:
                result = "Failure"
                response_message = "NoValidMinesForPermit"

        except Exception as e:
            current_app.logger.error(str(e))
            result = "Failure"
            mine_info = ""
            response_message = "Unhandled Exception"

        return {
            "a_Result": result,
            "a_MineInfo": mine_info,
            "a_ResponseMessage": response_message,
            "a_Timestamp": datetime.utcnow()
        }
Esempio n. 9
0
    def put(self, bond_guid):
        # Get the bond and validate that it can be transferred
        bond = Bond.find_by_bond_guid(bond_guid)
        if bond is None:
            raise NotFound('No bond was found with the guid provided.')
        if bond.bond_status_code != "ACT":
            raise BadRequest('Only active bonds can be transferred.')

        # Get the permit to transfer the bond to and validate it
        permit_guid = request.json.get('permit_guid', None)
        if not permit_guid:
            raise BadRequest('permit_guid is required.')
        permit = Permit.find_by_permit_guid(permit_guid)
        if not permit:
            raise BadRequest(
                'No permit was found with the permit_guid provided.')
        if permit.permit_guid == bond.permit.permit_guid:
            raise BadRequest(
                'This bond is already associated with this permit.')
        if bond.permit.mine_guid != permit.mine_guid:
            raise BadRequest(
                'You can only transfer to a permit on the same mine.')

        # Get the note to apply to the bond and the transferred bond
        note = request.json.get('note', None)
        if note:
            bond.note = note

        # Release the bond
        bond.bond_status_code = "REL"

        # Create the new "transferred bond"
        new_bond_json = marshal(bond, BOND)
        del new_bond_json['bond_id']
        del new_bond_json['bond_guid']
        del new_bond_json['permit_guid']
        del new_bond_json['permit_no']
        del new_bond_json['payer']
        new_bond_json['bond_status_code'] = 'ACT'
        new_bond_json['note'] = note
        try:
            new_bond = Bond._schema().load(new_bond_json)
        except MarshmallowError as e:
            raise InternalServerError(e)

        permit.bonds.append(new_bond)
        bond.save()
        new_bond.save()

        return new_bond
Esempio n. 10
0
    def put(self, permit_guid, mine_guid):
        permit = Permit.find_by_permit_guid(permit_guid)
        if not permit:
            raise NotFound('Permit not found.')

        if not str(permit.mine_guid) == mine_guid:
            raise BadRequest('Permit and mine_guid mismatch.')

        data = self.parser.parse_args()
        for key, value in data.items():
            if key in ['permit_no', 'mine_guid', 'uploadedFiles']:
                continue  # non-editable fields from put
            setattr(permit, key, value)

        permit.save()
        return permit
Esempio n. 11
0
    def get(self):
        result = ""
        now_info = ""
        response_message = ""

        try:
            mine_no = request.args.get('a_MineNumber')
            mine = Mine.find_by_mine_no(mine_no)

            # Mine must be operating.
            if mine.mine_status or mine.mine_status[
                    0].mine_status_xref.mine_operation_status_code != "OP":

                permits = Permit.find_by_mine_guid(mine.mine_guid)
                for permit in permits:
                    for permit_amendment in permit.permit_amendments:
                        if permit_amendment.now_identity:
                            now_info = now_info + str(
                                permit_amendment.now_identity.now_number
                            ) + " - " + str(
                                permit_amendment.authorization_end_date) + '\r'
                        else:
                            now_info = now_info + " - " + str(
                                permit_amendment.authorization_end_date) + '\r'
                        break

            if now_info != "":
                result = "Success"
            else:
                result = "Failure"
                response_message = "NoValidNowsForMine"

        except Exception as e:
            current_app.logger.error(str(e))
            result = "Failure"
            now_info = ""
            response_message = "Unhandled Exception"

        return {
            "a_Result": result,
            "a_NoWInfo": now_info,
            "a_ResponseMessage": response_message,
            "a_Timestamp": datetime.utcnow()
        }
Esempio n. 12
0
    def post(self):

        try:
            bond = Bond._schema().load(request.json['bond'])
        except MarshmallowError as e:
            raise BadRequest(e)

        permit = Permit.find_by_permit_guid(request.json['permit_guid'])

        if permit is None:
            raise BadRequest('No permit was found with the guid provided.')

        bond.permit = permit

        for doc in bond.documents:
            doc.mine_guid = permit.mine_guid

        bond.save()

        return bond, 201
Esempio n. 13
0
    def get(self):

        mine_guid = request.args.get('mine_guid', None)

        if mine_guid is None:
            raise BadRequest('Please provide a mine_guid.')

        mine = Mine.find_by_mine_guid(mine_guid)

        if mine is None:
            return []

        permits = Permit.find_by_mine_guid(mine.mine_guid)

        if not permits:
            return []

        bonds = [bond for permit in permits for bond in permit.bonds]

        return bonds
Esempio n. 14
0
    def post(self):
        try:
            reclamation_invoice = ReclamationInvoice._schema().load(
                request.json['reclamation_invoice'])
        except MarshmallowError as e:
            raise BadRequest(e)

        permit = Permit.find_by_permit_guid(request.json['permit_guid'])

        if permit is None:
            raise BadRequest('No permit was found with the guid provided.')

        reclamation_invoice.permit = permit

        for doc in reclamation_invoice.documents:
            doc.mine_guid = permit.mine_guid

        reclamation_invoice.save()

        return reclamation_invoice, 201
Esempio n. 15
0
    def get(self):
        mine_guid = request.args.get('mine_guid', None)

        if mine_guid is None:
            raise BadRequest('Please provide a mine_guid.')

        mine = Mine.find_by_mine_guid(mine_guid)

        if mine is None:
            return []

        permits = Permit.find_by_mine_guid(mine.mine_guid)

        if not permits:
            return []

        reclamation_invoices = [
            reclamation_invoice for permit in permits
            for reclamation_invoice in permit.reclamation_invoices
        ]

        return reclamation_invoices
Esempio n. 16
0
    def post(self):
        data = self.parser.parse_args()
        mine = Mine.find_by_mine_guid(data['mine_guid'])
        permit = Permit.find_by_permit_guid(data['permit_guid'])
        err_str = ''
        if not mine:
            err_str += 'Mine not Found. '
        if not permit:
            err_str += 'Permit not Found. '
        if mine and not mine.major_mine_ind:
            err_str += 'Permit Applications can only be created on mines where major_mine_ind=True'
        if err_str:
            raise BadRequest(err_str)
        new_now = NOWApplicationIdentity(mine_guid=data['mine_guid'], permit=permit)
        new_now.now_application = NOWApplication(
            notice_of_work_type_code=data['notice_of_work_type_code'],
            now_application_status_code='REC',
            submitted_date=data['submitted_date'],
            received_date=data['received_date'])

        new_now.save()
        return new_now, 201
Esempio n. 17
0
    def get(self):

        mine_guid = request.args.get('mine_guid', None)

        if mine_guid is None:
            raise BadRequest('Please provide a mine_guid.')

        mine = Mine.find_by_mine_guid(mine_guid)

        if mine is None:
            return []

        permits = Permit.find_by_mine_guid(mine.mine_guid)

        if not permits:
            return []

        bonds = [bond for permit in permits for bond in permit.bonds]

        if jwt.validate_roles([MINESPACE_PROPONENT]):
            bonds = marshal(bonds, BOND_MINESPACE)

        return bonds
Esempio n. 18
0
def test_permit_model_find_by_permit_guid(db_session):
    permit_guid = PermitFactory().permit_guid

    permit = Permit.find_by_permit_guid(str(permit_guid))
    assert permit.permit_guid == permit_guid
Esempio n. 19
0
def test_permit_model_find_by_mine_guid(db_session):
    mine_guid = MineFactory(mine_permit=1).mine_guid

    permits = Permit.find_by_mine_guid(str(mine_guid))
    assert permits[0].mine_guid == mine_guid
Esempio n. 20
0
    def post(self, mine_guid, permit_guid, permit_amendment_guid=None):
        if permit_amendment_guid:
            raise BadRequest('Unexpected permit_amendement_guid.')

        permit = Permit.find_by_permit_guid(permit_guid)
        if not permit:
            raise NotFound('Permit does not exist.')

        if not str(permit.mine_guid) == mine_guid:
            raise BadRequest('Permits mine_guid and provided mine_guid mismatch.')

        data = self.parser.parse_args()
        current_app.logger.info(f'creating permit_amendment with >> {data}')

        party = Party.find_by_party_guid(data.get('permittee_party_guid'))
        if not party:
            raise NotFound('Party not found')

        permittees = MinePartyAppointment.find_by_permit_guid(permit_guid)
        if not permittees:
            raise NotFound('Party appointments not found')

        permit_issue_datetime = data.get('issue_date')
        # convert permit_issue_date to a date object to compare with permittee start_date,
        #Both dates are stored in the DB as Dates, and are being converted to SQLAlchemy dateTimes in the modals, but for some reason being returned as Python Dates.
        permit_issue_date = datetime.date(permit_issue_datetime)
        is_historical_permit = False

        new_end_dates = MinePartyAppointment.find_appointment_end_dates(
            permit_guid, permit_issue_date)

        for permittee in permittees:
            # check if the new appointment is older than the current appointment, if so create a new permittee appointment
            if permittee.start_date > permit_issue_date:
                is_historical_permit = True
            else:
                # if the amendment is the newest, change the end dates of the other appointments
                position = new_end_dates.index(permittee.start_date)
                if new_end_dates.index(permittee.start_date) == 0:
                    permittee.save()
                else:
                    permittee.end_date = new_end_dates[position - 1]
                    permittee.save()

        permittee_start_date = permit_issue_date
        position = new_end_dates.index(permit_issue_date)
        permittee_end_date = new_end_dates[position - 1] if is_historical_permit else None

        # create a new appointment, so every amendment is associated with a permittee
        new_permittee = MinePartyAppointment.create(
            permit.mine_guid,
            data.get('permittee_party_guid'),
            'PMT',
            self.get_user_info(),
            start_date=permittee_start_date,
            end_date=permittee_end_date,
            permit_guid=permit_guid)

        new_permittee.save()
        new_pa = PermitAmendment.create(
            permit,
            data.get('received_date'),
            data.get('issue_date'),
            data.get('authorization_end_date'),
            data.get('permit_amendment_type_code', 'AMD'),
            description=data.get('description'))

        uploadedFiles = data.get('uploadedFiles', [])
        for newFile in uploadedFiles:
            new_pa_doc = PermitAmendmentDocument(
                document_name=newFile['fileName'],
                document_manager_guid=newFile['document_manager_guid'],
                mine_guid=permit.mine_guid,
            )
            new_pa.related_documents.append(new_pa_doc)

        new_pa.save()
        return new_pa
Esempio n. 21
0
 def get(self, mine_guid):
     results = Permit.find_by_mine_guid(mine_guid)
     return results