Ejemplo n.º 1
0
def add_cg_to_cr(appointment_id, clinic_gesture_id, anatomic_location):
    """
        anatomic_location = int.
        * Create a clinic_report entry with a clinic_gesture.
        * Add material in use from model_material_category from clinic_gesture
        to MaterioVigilance and update quantities
        * If clinic_gesture as a model_event, create the event adapted
    """
    def _needs_redondance(appointment, material, mat_cg_ref):

        number_of_same_cg_in_appointment = [ cr.clinic_gesture for cr in
                                            appointment.clinic_reports 
            if cr.clinic_gesture_id == mat_cg_ref.clinic_gesture_id
        ]
        if not ( ( len(number_of_same_cg_in_appointment) - 1 ) % 
                                mat_cg_ref.enter_in_various_gestures ):
            return True
        else:
            return False

    patient, appointment = checks.get_patient_appointment(
                                                appointment_id=appointment_id)
    clinic_gesture = ( meta.session.query(act.ClinicGesture)
                        .filter(act.ClinicGesture.id == clinic_gesture_id )
                        .one()
    )
    ##
    ## Create new clinic_report entry
    values = {
        'appointment_id': appointment_id,
        'clinic_gesture_id': clinic_gesture_id,
        'anatomic_location': int(anatomic_location),
        'duration': clinic_gesture.duration,
    }
    new_clinic_report = act.ClinicReport(**values)
    meta.session.add(new_clinic_report)
    # or: appointment.clinic_reports.append(new_clinic_report)
    try:
        meta.session.commit()
    except sqlalchemy.exc.IntegrityError:
        meta.session.rollback()

    appointment.clinic_reports.reorder()
    meta.session.commit()
    
    ##
    ## Update Material and MaterioVigilance
    for mat_cg_ref in new_clinic_report.clinic_gesture.materials:
        
        material_used = cost.get_material_used(mat_cg_ref.id)
        
        if ( _needs_redondance(appointment, material_used, mat_cg_ref)
            and material_used ):

            materio_vigilance = add_to_materio_vigilance(appointment_id, 
                                    mat_cg_ref.mean_quantity, material_used)
            new_clinic_report.materio_vigilance.append(materio_vigilance)
            meta.session.commit()
    
    ##
    ## Create event 
    if clinic_gesture.event_model_id:
        event_model = ( meta.session.query(model_teeth.EventModel)
            .filter(model_teeth.EventModel.id == clinic_gesture.event_model_id )
            .one()
        )
        tooth = teeth.get_patient_tooth(appointment.patient_id, 
                                                    int(anatomic_location))
        tooth.state = event_model.tooth_state
        tooth.surveillance = event_model.surveillance
        values = {
            'appointment_id': appointment_id,
            'tooth_id': tooth.id,
            'location': event_model.location,
            'state': event_model.state,
            'description': event_model.description,
            'comment': event_model.comment,
            'color': event_model.color,
        }
        if event_model.location == constants.TOOTH_EVENT_LOCATION_PERIODONTAL :
            pass
        elif event_model.location == constants.TOOTH_EVENT_LOCATION_TOOTH:
            pass
        elif event_model.location == constants.TOOTH_EVENT_LOCATION_CROWN:
            new_crown_event = model_teeth.CrownEvent(**values)
            meta.session.add(new_crown_event)
            meta.session.commit()
            for att in [ 'state', 'is_occlusal', 'is_buccal', 'is_lingual',
                    'is_mesial', 'is_distal', 'tooth_shade' ] :
                setattr(new_crown_event, att, getattr(event_model, att))
        elif event_model.location == constants.TOOTH_EVENT_LOCATION_ROOT:
            new_root_event = model_teeth.RootCanalEvent(**values)
            meta.session.add(new_root_event)
            meta.session.commit()
            for att in [ 'state', 'is_central', 'is_buccal', 'is_lingual',
                'is_mesial', 'is_distal', 'is_mesio_buccal', 'is_disto_buccal',
                'is_mesio_lingual', 'is_disto_lingual', 'is_mesio_buccal_2' ] :
                setattr(new_root_event, att, getattr(event_model, att))
        meta.session.commit()
 
    return new_clinic_report
Ejemplo n.º 2
0
def view_clinic_report(appointment_id):
    patient, appointment = checks.get_patient_appointment( 
                                            appointment_id=appointment_id)

    cotation_form = ChooseCotationForReportForm(request.form)
    cotation_form.cotation_id.choices = [
        ( cotation.id, cotation.gesture.name +  " " + 
            cotation.healthcare_plan.name) for cotation in
         meta.session.query(act.Cotation)
            .filter(act.Cotation.healthcare_plan_id.in_(
                                            [ hc.id for hc in patient.hcs ] )
            )
            .join(act.Gesture, act.Specialty, act.HealthCarePlan)
            .order_by(act.Specialty.name,
                        act.Gesture.name,
                        act.HealthCarePlan.name.desc())
            .all()
    ]
    cg_form = ChooseClinicGestureForReportForm(request.form)
    cg_form.clinic_gesture_id.choices = [
        ( cg.id, cg.specialty.name[0:3] + " " + cg.name ) for cg in
            meta.session.query(act.ClinicGesture)
                .filter(act.ClinicGesture.before_first_patient.is_(False),
                        act.ClinicGesture.after_last_patient.is_(False),
                        act.ClinicGesture.before_each_appointment.is_(False),
                        act.ClinicGesture.after_each_appointment.is_(False)
                )
                .join(act.Specialty)
                .order_by(act.Specialty.name, act.ClinicGesture.name )
                .all()
    ]
    clinic_report_form = ClinicReportForm(request.form)

    clinic_gestures = [ clinic_report for clinic_report in 
                            sorted(appointment.clinic_reports,
                                key=lambda clinic_report: 
                                    clinic_report.sequence) 
    ]

    # Case dentist_fees and hour_cost isn't provided yet:
    if not appointment.dentist_fees:
        appointment.dentist_fees = ( 
            meta.session.query(act.HealthCarePlanUserReference.hour_fees)
                .filter(
                    act.HealthCarePlanUserReference.user_id == 
                                                        appointment.dentist_id,
                    act.HealthCarePlanUserReference.healthcare_plan_id.in_(
                        [ hcp.id for hcp in appointment.patient.hcs ] )
                )
                .order_by(act.HealthCarePlanUserReference.hour_fees)
                .first()
        )
        if not appointment.dentist_fees:
            appointment.dentist_fees = 1

        meta.session.commit()

    if not appointment.hour_cost:
        appointment.hour_cost = round(cost.get_hourly_operational_cost(), 2)
        meta.session.commit()

    # In case this day is the first where happens something, we add in this 
    # clinic report the material that is used every morning and every night 
    # before opening and closing the dental_unit
    # We need to check this first.
    # TODO Add a verification if material found is only materials use in an
    # autoclave cycle because it doesn't count
    material_used_this_day = ( 
        meta.session.query(traceability.MaterioVigilance)
        .filter(
            traceability.MaterioVigilance.appointment_id.in_(
                meta.session.query(schedule.Agenda.appointment_id)
                    .filter(
                        cast(schedule.Agenda.starttime, Date) == 
                                        appointment.agenda.starttime.date(),
                        schedule.Agenda.dental_unit_id ==
                                                    appointment.dental_unit_id
                    )
            )
        )
        .all()
    )
    # In case no material has been marqued used in this appointment, we now add
    # the minimum material used in each appointment
    # This query is made before adding eventual "material before first patient
    # TODO Add a verification if material found is only materials use in an
    # autoclave cycle because it doesn't count
    material_each_appointment = ( 
        meta.session.query(traceability.MaterioVigilance)
        .filter(traceability.MaterioVigilance.appointment_id == appointment.id)
        .all()
    )

    if not material_used_this_day:
        cg_every_work_day = (  meta.session.query(act.ClinicGesture)
            .filter(or_(
                act.ClinicGesture.before_first_patient.is_(True),
                act.ClinicGesture.after_last_patient.is_(True)
                ) )
            .all()
        )
        for cg in cg_every_work_day:
            for mat_cg_ref in cg.materials:
                material_used = cost.get_material_used(mat_cg_ref.id)
                opening_materio_vigilance = add_to_materio_vigilance(
                    appointment.id, mat_cg_ref.mean_quantity, material_used)

    if not material_each_appointment:
        cg_all_appointment = ( meta.session.query(act.ClinicGesture)
            .filter(or_(
                act.ClinicGesture.before_each_appointment.is_(True),
                act.ClinicGesture.after_each_appointment.is_(True)
                ) )
            .all()
        )
        for cg in cg_all_appointment:
            for mat_cg_ref in cg.materials:
                material_used = cost.get_material_used(mat_cg_ref.id)
                materio_vigilance_appointment = add_to_materio_vigilance(
                    appointment.id, mat_cg_ref.mean_quantity, material_used)

    material_form = ChooseMaterialForReportForm(request.form)
    
    materials_for_materio_vigilance = (
        meta.session.query(assets.Material)
            .filter(
                assets.Material.end_of_use.is_(None),
                assets.Material.end_use_reason ==
                                    constants.END_USE_REASON_IN_USE_STOCK,
                assets.Material.start_of_use.isnot(None),
                ~assets.Material.id.in_(
                    meta.session.query(
                        traceability.MaterioVigilance.material_id)
                        .filter(traceability.MaterioVigilance.appointment_id ==
                                                                appointment.id
                    )
                )
            )
            .join(assets.MaterialCategory, act.Specialty)
            .order_by(
                act.Specialty.name,
                assets.MaterialCategory.commercial_name,
                assets.MaterialCategory.brand )
            .all()
    )
    material_form.material_id.choices = [ 
        ( material.id, material.asset_category.commercial_name + " " +
                        material.asset_category.brand ) for material in
                        materials_for_materio_vigilance 
    ]

    # only appears cotation that were administraly officially indentified,
    # by a single clinic gesture in the global gesture repair.
    cotations = [ cot for cot in sorted(appointment.administrative_gestures,
                                key=lambda cot: (
                                    cot.gesture.name,
                                    cot.anatomic_location ) )
    ]
    
    for mat_vig in sorted(appointment.materio_vigilance, key=lambda mat_vig:(
                        mat_vig.material.asset_category.asset_specialty.name,
                            mat_vig.material.asset_category.commercial_name) ):

        mat_vig_form = MaterioVigilanceForm(request.form)
        mat_vig_form.material_id = mat_vig.material_id
        mat_vig_form.old_quantity_used = mat_vig.quantity_used
        mat_vig_form.new_quantity_used = mat_vig.quantity_used
        mat_vig_form.material_data = (
            mat_vig.material.asset_category.commercial_name + " | " +
            str(mat_vig.material.actual_quantity) + " " +
            constants.UNITIES[mat_vig.material.asset_category.unity][1] )

        clinic_report_form.materials_used.append_entry(mat_vig_form)

    for clinic_report in sorted(appointment.clinic_reports, 
                                    key=lambda clinic_report: (
                                        clinic_report.anatomic_location,
                                        clinic_report.sequence )
                                                                        ):
        
        hour_duration = clinic_report.duration.seconds / 3600 * 60
        minute_duration = clinic_report.duration.seconds % 3600 / 60
        cg_duration_form = ClinicGestureDurationForm(request.form)
        cg_duration_form.clinic_report_id = clinic_report.id
        cg_duration_form.clinic_gesture_id = clinic_report.clinic_gesture_id
        cg_duration_form.anatomic_location = clinic_report.anatomic_location
        cg_duration_form.old_duration = str(hour_duration + minute_duration)
        cg_duration_form.new_duration = hour_duration + minute_duration
        cg_duration_form.clinic_gesture_data =\
                                            clinic_report.clinic_gesture.name

        clinic_report_form.clinic_gestures.append_entry(cg_duration_form)

    return render_template('view_clinic_report.html', 
                            patient=patient,
                            appointment=appointment,
                            cotations=cotations,
                            clinic_report_form=clinic_report_form,
                            cotation_form=cotation_form,
                            cg_form=cg_form,
                            material_form=material_form,
                            constants=constants)