Obsługa zamówień dla Centrów logistycznych

Aplikacja umożliwia wystawianie nowych zamówień przez Odbiorcę oraz akceptację zamówień przez Dostawcę i generowanie rezerwacji tzn. zarządzanie oknami czasowymi z myślą o dostawach do magazynów centralnych i centrów logistycznych.

Kod źródłowy aplikacji do pobrania – tutaj.

Aplikację można wypróbować tutaj.

W tym wpisie przedstawię funkcję new_booking(id), która obsługuje rezerwację terminu dla konkretnego zamówienia. Jako parametr przyjmuje ona numer id zamówienia tzn.

@bp.route('/booking/<int:id>', methods=['GET', 'POST'])
@login_required
def new_booking(id):

Następnie w funkcji new_booking() tworzę formularz do rezerwacji oraz pobieram obiekt rezerwacji dla danego zamówienia tzn.

    form = BookingForm()
    result = Booking.query.filter_by(contract_id=id).first()

Dalej ustalam obiekt zamówienia dla rezerwacji tzn.

    current_contract = Contract.query.get(id)     # Returns contract for current booking

W kolejnych wierszach uzyskuję listę zamówień, które były wygenerowane dla konkretnego magazynu na dzień dostawy tzn.

# Filtering by one column gives a list of tuple(s) so I converted it to a list of values
    contracts = [ids[0] for ids in Contract.query.with_entities(Contract.id).filter_by(
        date_of_delivery=current_contract.date_of_delivery).filter_by(
        warehouse=current_contract.warehouse).all()]

Następnie przeprowadzam walidację, jeśli formularz został przesłany. W zależności od tego, czy rezerwacja dla danego zamówienia jest już utworzona to uaktualniam dane w bazie danych na podstawie danych z formularza. Jeśli obiekt rezerwacji nie istnieje to tworzę nowy obiekt rezerwacji i zapisuję go do bazy danych tzn.

    if form.validate_on_submit():
        if result:
            result.booking_time = form.booking_time.data
            result.driver_full_name = form.driver_full_name.data
            result.driver_phone_number = form.driver_phone_number.data
            result.truck_reg_number = form.truck_reg_number.data
            db.session.commit()
        else:
            booking = Booking(booking_time=form.booking_time.data, 
                            contract_id = id,
                            driver_full_name=form.driver_full_name.data,
                            driver_phone_number=form.driver_phone_number.data,
                            truck_reg_number=form.truck_reg_number.data)
            db.session.add(booking)
            db.session.commit()

W dalszej kolejności zmieniam status zamówienia na zaakceptowane i przekierowuję do funkcji wyświetlającej wszystkie zamówienia dla danego kontrahenta tzn.

        contract = Contract.query.get(id)
        contract.status = 'accepted'
        db.session.commit()
        page = session.get('page')
        per_page = session.get('per_page')
        return redirect(url_for('contracts.contracts', page=page, per_page=per_page))

Jeśli strona zostaje wczytana za pomocą metody GET to w zależności czy rezerwacja jest już obecna w systemie, czy dopiero jest tworzona to uzupełniane są dane w formularzu tzn. jeśli rezerwacja jest dostępna i otwieramy ją np. w celu edycji danych to formularz zostanie uzupełniony o poprzednio wpisane dane. Natomiast jeśli rezerwacja jest dopiero tworzona to formularz będzie zawierał modyfikację, których terminów nie można wybrać, bo już zostały wybrane przez innych dostawców tzn.

    if result is not None:
        reserved_booking_time = [times[0] for times in 
            Booking.query.with_entities(Booking.booking_time).filter(
            Booking.contract_id.in_(contracts)).all() if times[0]!=result.booking_time]   
        form.booking_time.data = result.booking_time
        form.driver_full_name.data = result.driver_full_name
        form.driver_phone_number.data = result.driver_phone_number
        form.truck_reg_number.data = result.truck_reg_number   
    else:
        reserved_booking_time = [times[0] for times in 
            Booking.query.with_entities(Booking.booking_time).filter(
            Booking.contract_id.in_(contracts)).all()] 
    return render_template('booking.html', form=form, reserved_booking_time=reserved_booking_time)

Kompletny kod funkcji new_booking() jest dostępny tutaj.

Tak zaakceptowane zamówienie może być edytowane tylko przez wystawiającego zamówienie, przy czym jeśli zamówienie zostało już zaakceptowane i została dokonana rezerwacja, to zmiana zamówienia zmienia status zamówienia z zaakceptowanego z powrotem na otwarty i wymaga powtórnego zaakceptowania zmian przez dostawcę (ale wpisane dane są obecne i rezerwacja nie wymaga powtórnego uzupełnienia danych).

Dostawca może również pobrać dokument pdf rezerwacji jeśli zamówienie jest zaakceptowane (dla otwartych zamówień opcja pobrania pdf-a jest nieaktywna).

Rezerwacja dokonana – można teraz wygenerować pdf-a

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *