Example #1
0
def add_producer():
    data = request.get_json()
    try:
        producer = Producer(name=data["name"])
        db.session.add(producer)
        db.session.commit()
        return jsonify(producer.to_dict())
    except KeyError:
        response = jsonify({"error": "Bad request", "missing field": "name"})
        response.status_code = 400
        return response
Example #2
0
def create_contract():

    try:
        treatment_start = parser.parse(request.json['treatment_start']).date()

        # Find or create insurer
        insurer_name = request.json['insurer']
        match = db.session.query(Insurer) \
            .filter(Insurer.name == insurer_name) \
            .first()

        if match:
            insurer = match
        else:
            insurer = Insurer(name=insurer_name)

        # Find or create manufacturer
        manufacturer_name = request.json['manufacturer']
        match = db.session.query(Producer) \
            .filter(Producer.name == manufacturer_name) \
            .first()

        if match:
            manufacturer = match
        else:
            manufacturer = Producer(name=manufacturer_name)

        # Find or create patient
        patient_surname = request.json['patient_surname']
        patient_name = request.json['patient_name']
        patient_birthday = parser.parse(
            request.json['patient_birthday']).date()
        patient_cancer_stage = CancerStage(
            request.json['patient_cancer_stage'])

        # Check if patient is young enough for enrollment
        patient_age = get_age(patient_birthday)
        if patient_age >= 55:
            return Response(
                f"{{'Error':'Patient does not fullfill enrollment criteria: Age {patient_age} >= 55'}}",
                status=400,
                mimetype='application/json')

        match = db.session.query(Patient) \
            .filter(Patient.name == patient_name) \
            .filter(Patient.surname == patient_surname) \
            .filter(Patient.birthday == patient_birthday) \
            .first()

        if match:
            patient = match
        else:
            patient = Patient(name=patient_name,
                              surname=patient_surname,
                              birthday=patient_birthday,
                              cancer_stage=patient_cancer_stage)

        # Find or create product configuration
        product_brand = request.json['product_brand']
        product_name = request.json['product_name']
        product_units = request.json['product_units']
        product_baseprice = request.json['product_baseprice']
        match = db.session.query(Product) \
            .filter(Product.brand == product_brand) \
            .filter(Product.product == product_name) \
            .filter(Product.units == product_units) \
            .filter(Product.baseprice == product_baseprice) \
            .first()

        if match:
            product = match
        else:
            product = Product(brand=product_brand,
                              product=product_name,
                              units=product_units,
                              baseprice=product_baseprice)

        # Find or create payable amounts configuration
        os = request.json['os']
        no_os = request.json['no_os']
        pfs = request.json['pfs']
        no_pfs = request.json['no_pfs']
        match = db.session.query(PayableAmount) \
            .filter(PayableAmount.os_after_12_months == os) \
            .filter(PayableAmount.no_os_after_12_months == no_os) \
            .filter(PayableAmount.pfs_after_9_months == pfs) \
            .filter(PayableAmount.no_pfs_after_9_months == no_pfs) \
            .first()

        if match:
            payable_amounts = match
        else:
            payable_amounts = PayableAmount(os_after_12_months=os,
                                            no_os_after_12_months=no_os,
                                            pfs_after_9_months=pfs,
                                            no_pfs_after_9_months=no_pfs)

        new_contract = Contract(insurer=insurer,
                                producer=manufacturer,
                                product=product,
                                patient=patient,
                                status='ongoing',
                                treatment_start=treatment_start,
                                payable_amounts=payable_amounts)

        # Check if contract is already finished -> simulation purposes
        payable = check_contract_status(new_contract.to_dict(), [])

        if not payable == -1:
            # No events could have been generated at contract creation -> bill for 9 months PFS
            new_contract.amount = 9 * (product_baseprice * payable)
            new_contract.status = 'finished'

        db.session.add(new_contract)
        db.session.commit()

        return Response('{"status": "ok"}', status=200)

    except:

        return Response('{"status": "error"}', status=500)
Example #3
0
def fill_db():

    # Add example products
    product_conf_1 = Product(brand="ABC",
                             product="vial 10mg/ml",
                             units=10,
                             baseprice=1000)
    product_conf_2 = Product(brand="ABC",
                             product="vial 10mg/ml",
                             units=20,
                             baseprice=1800)
    product_conf_3 = Product(brand="ABC",
                             product="vial 10mg/ml",
                             units=30,
                             baseprice=2500)
    product_conf_4 = Product(brand="ABC",
                             product="vial 20mg/ml",
                             units=10,
                             baseprice=1000)
    product_conf_5 = Product(brand="ABC",
                             product="vial 20mg/ml",
                             units=20,
                             baseprice=2700)
    product_conf_6 = Product(brand="ABC",
                             product="vial 20mg/ml",
                             units=30,
                             baseprice=4100)

    products = [
        product_conf_1, product_conf_2, product_conf_3, product_conf_4,
        product_conf_5, product_conf_6
    ]

    for product in products:
        db.session.add(product)

    # Add patient event types
    patient_event_type_1 = PatientEventType(event_name="progressed")
    patient_event_type_2 = PatientEventType(event_name="dead")

    db.session.add(patient_event_type_1)
    db.session.add(patient_event_type_2)

    # Add default payable amount configuration
    payable_amount_conf = PayableAmount(os_after_12_months=0.75,
                                        no_os_after_12_months=0.35,
                                        pfs_after_9_months=0.85,
                                        no_pfs_after_9_months=0.40)

    db.session.add(payable_amount_conf)

    # Add manufacturers
    manufacturer_1 = Producer(name="Roche")
    manufacturer_2 = Producer(name="Novartis")
    manufacturer_3 = Producer(name="Orion")

    db.session.add(manufacturer_1)
    db.session.add(manufacturer_2)
    db.session.add(manufacturer_3)

    # Add insurers
    insurer_1 = Insurer(name="Helsana")
    insurer_2 = Insurer(name="Swica")
    insurer_3 = Insurer(name="OEKK")

    db.session.add(insurer_1)
    db.session.add(insurer_2)
    db.session.add(insurer_3)

    # Add patients
    patient_1 = Patient(surname="Muster",
                        name="Max",
                        birthday=parser.parse('1990-01-01'),
                        cancer_stage=CancerStage.two)
    patient_2 = Patient(surname="Muller",
                        name="Jan",
                        birthday=parser.parse('1998-01-01'),
                        cancer_stage=CancerStage.zero)
    patient_3 = Patient(surname="Zindel",
                        name="Alice",
                        birthday=parser.parse('1985-06-01'),
                        cancer_stage=CancerStage.three)

    # Add example contracts
    contract_1 = Contract(producer=manufacturer_1,
                          insurer=insurer_1,
                          product=product_conf_1,
                          payable_amounts=payable_amount_conf,
                          patient=patient_1,
                          treatment_start=parser.parse('2020-08-01'),
                          status="ongoing")
    contract_2 = Contract(producer=manufacturer_2,
                          insurer=insurer_2,
                          product=product_conf_1,
                          payable_amounts=payable_amount_conf,
                          patient=patient_2,
                          treatment_start=parser.parse('2020-04-30'),
                          status="ongoing")
    contract_3 = Contract(producer=manufacturer_1,
                          insurer=insurer_1,
                          product=product_conf_1,
                          payable_amounts=payable_amount_conf,
                          patient=patient_3,
                          treatment_start=parser.parse('2020-11-30'),
                          status="ongoing")

    db.session.add(contract_1)
    db.session.add(contract_2)
    db.session.add(contract_3)
    db.session.commit()