To Do: AX Tools

Priority Project #
2 AX Tools #: 14
2.01

Confirmation emails and clients amending bookings themselves

  • The idea is that it would be nice if clients could edit/correct some details in their booking directly.
  • In my old company clients had to call or email in to make ANY changes to their booking,  but it would be much more efficient if they could amend bookings themselves 
  • However, we can't let them make changes (without us ok'ing them) if they critically change the program for the driver after it is too late.
  • The key concept is that clients shouldn't be able to amend things that mess up the day (if they make last minute changes).  So they can't change the destination or number of passengers (beyond the capacity of the car), or times at the last minute
  • Issue is security - how do we give non-login access to edit a booking without exposing the database? Do we add a specific link to a page that is not login protected that allows changes, and only works for some fields with 24hours notice?  
    • At ANY time (even last minute) they should be able to:
      • Add/correct phone numbers or emails
      • Additional passengers names/details
      • Add address within the resort/cities
      • Reduce baby/child seats (not increase)
      • Change passenger numbers so long as it doesn't change the price (ie the vehicle)
      • Add flights number so long as it doesn't change the time  (probably not allow that change)
    • With more than [36] hours they should be able to change things that make a difference to the driver's program (eg destinations, dates, add trips)
  • Think about the best approach for this. 
    • Give them a unique page  (and include a password on their email?)
    • Do it by buttons?
    • What do you think?

 

Ideas

  • Clients can have a secure webpage (similar to the autologin) to shows each booking/transfer with the ability to edit some fields
    • Security code that times out. 
  • Client acceptance - Give a code to clients to accept the transfer. 
  • Whatsapp message to clients the night before.   Link to summary of transfer (not user protected)
Pending
2.02

Resort Contacts

  • In resort contact entity, add a field called “defaultAccommodation” ,  This is a relation field, referencing the Accommodation entity. And restricted to the list of the accommodations for the resort contact's relevant affiliate
  • Create a view (launched from the Affiliates index - I have created the button created already - see “Host/Chalet” under Assignments) that should create a view a given affiliate, the list of the affiliate's accommodations and the Resort contacts linked to each accommodation.  
    • This may need to be shuffled around over time., so also show the Resort Contacts that are ‘orphans’ (ie no associated Accommodation)
    • Notes an accommodation may have more than one Resort Contact assigned to it
      • Make this easily editable - question,  can we drag a resort contact onto an accommodation?
      • It may be we need to make a time dimension to this, but let's cross that bridge later
- Blocked
2.02

Transfers

  • Add 3 new fields – 1) “Price Adjustment” (float) and 2) “isSharedAllowed” (boolean) and “sharedTransfers” (relation linked to Transfer Entity – ManyToMany).
  1. Price Adjustment:  Each transfer will have a price, which will be composed of the “standard price” plus the possibility of a manual ‘adjustment’ (which most of the time is zero).  The adjustment might be positive or negative and for example might be because the customer wants something special (eg snacks/drinks in the car, or a stopover en route) etc.   The “standard price” will be calculated from the destination combination (eg VRB to GVA), the number of passengers and potentially the time of day, and we will designed an entity to capture that.   And the Price Adjustment is a manual input.   The standard price is  computed dynamically – but I want to save it in case the formula changes as we can’t change a price already given (hence a field is required. Make sense?
  2. IsSharedAllowed.  The concept I want to introduce here is that I want to offer people the ability to share a taxi. Typically the vehicles will take 7 people, so if you are a family of 4, you have 3 spare seats.  I will only allow a share if the others are on the same flight/train (if inbound – as sometimes flights are late and don’t want any additional waiting) or within [10] mins for a flight/train departure.   So if a client says yes to “isSharedAllowed” we will try to combine and split the costs.
    1. To do that we might need  to link transfers together using the sharedTransfers  field which will contain which transfers are being combined  (typically 2 clients (ie 2 transfers) but could be more, eg   4 passengers +2 passengers +1 passenger) And then we can assign all [3] transfers to the same vehicle/driver….
  3. For the train pickup service that is the same concept – we will have a bus (say 13 seats) that can take various combinations of passengers to fill it (could be 13 single travellers).  That service will take people from LeChable train to their chalets in Verbier.    Does that make sense?

 

Complete
2.02

Private + bookings

  • We should create a page showing the Private+ bookings that can be seen externally. 
  • Recap: A Private+ booking is one that the original client (first) has opted to allow others to travel with them, to share the cost, so long as the times and destinations work.
  • The criteria are:
    • Drop-off to an airport - they have to be on flights that leave within [20 - controllable in settings] mins of each other and departing from the same Destination (eg Verbier)
    • Pickup at an airport -  they have to be on the exact same flight…. and obviously going to the same ‘Destination’ (eg Verbier, Chamonix etc)
      • FYI, the 20min rule doesn't apply for pickup at the airport as 1 flight might be early/later and the waiting period could easily extend from 20mins to hours. But for dropoffs that doesn't apply (as we don't know about delayed flights until too late to influence the taxi journey)
  • So, the page should reflect that:
    • Date
    • Seats taken
    • Seats left (assume 7 seats in the car)
    • Pickup (from(
      • If airport, then flight number
    • Drop-Off (to)
      • Don't show the address (eg Ch de la Tinte, 5), but show ‘Verbier’
    • Price for 1,2,3… people  
      • We will work on the formula for that.
Pending
2.02
  • Multi-lingual functionality:
    • Include in the CompanyDetails entity a field called ‘multilingual’ (booelan)
    • Create new entity called ‘Languages’ containing, language (English, French, German, Spanish) , flag icon file,  and abbreviation
    • Selection of flag switches language of text
  • Page count
    • Add field in the Products entity for pageCount and pageCountAdmin
    • When a page is loaded add to the pageCount (and if an Admin user add to pageCountAdmin only
Complete
2.02

Accommodation Street

  • Add a GPS location for each Accommodation Street and Destination
- Blocked
2.03

Driver's page 

  • The driver's schedule should detail THEIR trips for the day and allow them to move forward/back to future days. 
    • Background colours to represent past, tomorrow, today, future 
  • Links to helpful notes.
  • Launch the “Meet & Greet” page for airport/train pickups with the client details/affiliate logo
  • Buttons to register events
    • Non-transfer
      • Driver wake-up / Awake
      • Left home
    • Transfer specific
      • At pickup (including GPS location)
      • ‘Found client’
      • Leaving now
      • Arrived
      • WhatsApps/emails to clients
  •  Essential that this page is optimised for mobile.  Should also be the login-direction for users that are Drivers
Pending
2.03

New booking - from email 

  • Ability to ‘suck in’ an email into a Booking.
  • The contents of the Email  (include To: From,  Date, cc, Subject and the main body) should be brought into a single field which is appended at the bottom of the Booking screen (full width of screen and deep).
  • The email from field should populate the Booking.Email field.  
    • Think of it this way.  Say we get the following email from john.smith@gmail.com “Subject:  Reservation request for Smith family…    Body: Hello Alpinexpress,  I would like to book 2 transfers.  the first on 1 March 2026, picking up at Geneva airport. We are on EZ 1234 from gatwick. we need to go to Chalet Makini in Verbier.  We are 3 people.    And we are returning a week later on the flight EZ23456 at 11.30am.   thank you, John Smith +44 758877444444”
  • We should be able to see the full email (not just the body, but also the email address of sender, date/time and subject) and then we can make sure we have uploaded the email accurately and kept a record of that in the booking.
  • In truth it is really for auditing and to help the booker convert an email to a set of transfers 
  • Systematically, it needs to pull in the From, CC, Subject and Body fields from the email, and format nicely into a single field.   Then it should fill name the client email with the senders email.  That's it.    Does that make sense? 
  • We have some of this functionality already - just not bringing it into a new booking. 
  • The process of adding a new booking should move the email to DONE directory 
  • In Company Details we have fields that define where to look in the email for new bookings and where to place them once uploaded. And the email login and password - do you remember that?
- Complete
2.04

Bookings index

  • In each transfer (T1..T4), show as much info as possible
    • Flights.  Blue for Arrival, Green for Departure.  Hover for flight details including scheduled and actual times.    Show a warning sign if later than x
    • Completed trips background colour green
    • Accommodation via a popup (name, address. afiiliate, diff access)
    • Times shown in icon with error sign if missing or late

Bookings

  • Show updated flight details in each booking, including flight times when departed/arrived 

 

Flight trips

  • I am developing a PHP symfony PS project that looks at flight times.  I have 2 sources for the scheduled flight times (departure and arrival) data and i want to use both to cross-check.  My fields  are respectively  1) scheduledDepartureTime and scheduledDepartureTimeGvach  and 2) scheduledArrivalTime and scheduledArrivalTimeGvach
  • In order to save real estate on the page I want to consolidate this data to a single figure, but have colours identify any discrepancies.   My thought is that the display should be (using departures es the example)
    • If only the scheduledDeparture time is present (and the scheduledDepartureTimeGvach is null), then display the scheduledDeparture, in grey
    • If both scheduledDeparture  and scheduledDepartureTimeGvach  are availablen and the the same then display either one (scheduledDepartureTimeGvach) in black
    • If both are available but are different by more than 10mins, the show scheduledDepartureTimeGvach  in black with red !, with the ability to show the scheduledDepartureTime via a tooltip/hover

 

- Complete
2.04

Client site (public pages)

  • The “Book Now” page on the public site collect a basic booking (One-way or Return to the same routes -  ie only 1 or 2 journeys, same combinations).   
    • The backend can be used for more complex ones.
    • Unlike a backend booking, we should sequence the collection of data….  ie the client wants to know prices and options first, before typing in their details and payment details. 
  • This site does it brilliantly:  https://www.mountaindropoffs.com.  
    • Please try making a fake booking (don't save anything, just click out before payment - they are nice people) their site.  
    • It is amazing and super well thought out site. Best in the business. 
  • This is what you will see.  All on one page but with tabs to make it quick 
    • Step 1 is picking the dates and destinations
      • Number of pax
      • Destination list
        • Nice details: Return date can't be before Outbound date
        • Second journey defaults to the reverse of First journey
          • Dates remembered if you unclick Return and back again
    • Step 2 is flight data or address and then the service type/price
      • If airport: flight
      • if non airport:  Address
        • Then picking the Shared/Private/Private+ with price 
    • Step 3 is collecting contact details, names/emails/telephone/babies etc and luggage
      • Nice way to get international codes
      • Look at the extras (babies, luggage)
    • Step 4 payment
  • The design of this is 100% optimal (the owner is very experienced and logical) and we did exactly the same, but my old site has been changed so I can't show you that

 

Now all of this is the same as the booking entity and the (1 or 2) transfers in that booking.  Make senses?

 

 

- Pending
2.05

Client confirmation button

  • I want to be able to launch the client confirmation button either in (1) new mode or (2) direct to send (with a popup confirming).   
    • This is because if i know I amnot going to edit the confirmation before sending what is the point in shwoing the screen
    • How to display:  Double-click to go stright to send?
  • In the top right corner of the booking, show the history of the confirmations sent similar to the booking index view
Complete
2.06

Client phone numbers

  • Including details of the tel number (country code, PhoneAnalyser - confirm if the number is “verified”) 
Pending
2.06

“Shared” Private Transfers

  • Create a view of all Private transfers where the IsShared = true, sorted by Departure Destination and Arrival Destination and a flag if there is a match 
    • Match is when…
      • Date, and To/From destination (city) is the same
      • For pickups at the Airport or Train, that all customers on the same flight/train
      • For dropoff at the Airport/Train, that the train/flight time are within [10] minutes of each other  (where the 10 is controllable in Settings - but hard code for now)
      • That the total pax combined is <8
  • We should think about if we can automate the matching and we should publish the possible matches on our public website
- Pending
2.07

Background/rational

  • Taxi companies and individual taxi drivers all share the same software and I will be able to see across the various competing taxi drivers and re-allocate trips or new trips to whoever is best placed to offer them.
    • In truth this is to match drivers who are going back empty with a customer who needs taking
    • Do you think this makes sense that there are [20-50] taxidrivers sharing the same database -or should i clone it?
  • Offer each taxi driver their ‘own’ website, so they can give their clients that site and book trips there themselves  (as an incentive to use the system). Assume there are 50 ‘individual’ taxi drivers. 
    • Can I control 50 x CMS (CMS_Copy and CMS_Photo and Product) inputs centrally (ie each CMS page would need to be linked to a taxi driver)
    • Can I point their own URL to my code (eg. www.johnstaxi.com) but where all the bookings go to AXTools?
    • So in each Partner company I would include their URL link if they are adopting my system
    • I think it is ok for ‘their’ link to use the same URL if that is impossible
  • Intro fee for referrals
  • New drivers sign up and need to send bank details, driving license and car details
    • Automate the on-boarding email - in English and French
  • Driver's location is tracked in their response
    • Can we do this via the website or do we need an IOS/Android app?
  • For all bookings the driver's time at location is tracked to prove they were on time and to whatsapp the customer
Pending
2.07

Email Template

  • if the field AffiliateBooking is set to “Direct to Consumer”, then:
    • Set specificAffiliate to null
    • Set aggregateComfirmation to "Single Booking"
      • and hide these 2 fields
- Complete
2.08

Destinations

  • Add the following fields:
    • Default address (used for airports and train stations)
    • Default longitude and latitude 
    • Notes

Accommodation Street

  • Add a field “defaultLongitude” and “defaultLatitude”. 
    • This is used to guide the map function when none of the buildings on that street has a GPS location….  That will allow you to  allocate buildings to the street numbers
Complete
2.08

Accommodation

  • Ability for the user to add a new address
  • When selecting an affiliate, have a map page that shows all the chalets for [Bramble]
  • Create a sorting table for the various scenarios (mobile/desktop,  Admin/User,  Filters selected)
- Pending
2.08

New Booking

  • When switching direction, retain the address (and date).  Delete the flights (if applicable)
  • If Shared, add a link to the SBB train times (on the correct date and direction)
- Complete
2.09

Management: XLS exports:

  • Transfers 
  • Bookings
  • Driver transfers
  • By Affiliate
  • By Private/Private+/Shared
  • Accommodations
  • Revenue reporting
  • Include reports by CreatedBy/CreatedOn
  • Work out how to handle view the revenue comparison across seasons
  • Control start date from an input in Systems Settings
    • Perhaps have a single button that opens multiple versions 
  • Create a service that count/revenue of all private/shared transfers by Client Name (in Client list)
Pending
2.09

Ops Warnings

  • Build out a list of Transfers (not bookings) where certain aspects are unclear on the booking
    • Accommodation unknown
    • Flight unknown
    • Follow-up flag marked 
    • Missing client emails or phone numbers
    • Phone number check
      • Email link to client for confirmation
- Pending
2.10

SBB

  • Fix SBB scrape to include all the trains for the day (currently just taking 4-5 trains (one screen's worth), whereas I would expect there to be 30-40 trains per day (for GVA to Martigny as an example)
  • I think SBB changed the design of their page?
Complete
2.10

Flight scrape

  • Saves the kayak link into the Details Link - whereas this should be used for the GVA.CH scrape
  • Duplicates seem to still being produced (eg if you run the scrape a second time)
  • Doesn't seem to detect or save the airline code.
    • Plus airlines have created a bunch of blank airlines (linked to flights - ie can't delete)
  • Does scraping make more sense, as the airline is shown in the drop-down?   https://www.justfly.com/  
- Complete
2.11

Flight scraper

Populate Kayak data

  • Add a button (under Actions) that ROLE_ADMIN can run to populate flights (Kayak) for all active airports serving GVA, for a period of dates. 
    • Use same date schedule as in the Settings

Populate GVA.CH data

  • On morning of T+1, run the GVA.CH scrape for ‘tomorrow’, on all flights
    • This is a one-off check, mainly to confirm that the scheduled times from Kayak match the times from gva.ch.  ie ScheduledDepartureTimeGvach === ScheduledArrivalTimeGvach
      • Chron: Run at 8am, on T+1 (ie on Monday 8am, run Tuesday's GVA.CH Overview and Details flight scraper) 
  • Throughout T+0, the ‘detailed' refresh should run on “selected” individual flights, where the criteria for selection is:
    • Arrivals:
      • actualArrivalTime is null and
      • scheduledArrivalTimeGvach is after ‘now’ - 1hour 
    • Departures
      • actualDepartureTime is null and
      • status is not cancelled
      • scheduledDeparturelTimeGvach is after ‘now’ - 1hour 

Code-share

  • Code share is no longer a relational field (linked to FlightTrips). 
  • The Codeshare entity has a flightNumber and the record stores the associated other flights. 
    • This enables mutliple flightTrips with the same flightNumber to be linked to the CodeShare
      • So the determination has to be a lookup on a matching flight number
  • The objective is to combine multiple entries for the same flight and return the code-share data in the flight details in the transfer bookings (so a user can search for their flight by any of the flight numbers)
  • Check the scrape functionality on the "Operated by" to identify “child” flights (ie the ones that are going to be deleted)
  • Establish a view  of all flights where there are more than one flight departing at the same time to the same location.
  • Build up a list of code-shares -   question, the gva.ch notes scrape concatenates the flight numbers.  Should we maintain that array or separate into individual code-share identifiers - which will allow us to identify ones to delete?)
  • Write a service that identifies the duplicates and delete
Pending
2.12

Public pages (non-protected)

  • Add links from the HomePage to the following public information - to drive more traffic to the website  (will this adversely affect our performance)
    • Train times (DONE)
    • Flight board (DONE)  
    • Business Contacts (eg restaurants, shops, hotels)  (DONE)
    • Chalet map (DONE)
    • Shuttle available seats (WIP)
    • List of Private+ trips (ie those trips with free seats available)
  • Enure they are optimised for mobile and desktop views
Pending
2.12

Taxi site

  • Track the history of the flights to build up a picture as to the on-going schedule
  • Email Hermes to see if they will send us the scheduled flights
- Complete
2.12

Transfer

  • The number of Child and Babies should be capped at (Total Pax -1)
    • ie If the total passengers is 5, you can't have 3 children + 2 babies.   Assumption is that there is always 1 adult
  • In the booking Notes we should include ages of children.  or should we make this a new field?  (ChildAges,  BabyAges)?  As free text. 
Complete
2.13

Feedback on Transfer Macro

  • Date should show the DoW (eg Sun 16 May 2025) 
  • Destinations
    • Should be sorted by “SortOder” and then alphabetically on "City"-  with a break before ‘20’ (or different colour)  (this is because the first 5 or 6 are the common ones, and the others are rare) 
    • Add buttons change order, but keep 20 as 20
Complete
2.13

Customer Emails Fragment

  • In the first section of the email, where you give the reference number (e.g. “Booking reference: VBC-1234”), create a link from the reference number, so when the client replies to the email we can launch the booking from the email
    • It won't work for clients or be a security risk:  For users (ie clients) without Admin/Staff access the link shouldn't work, and it should just take them to the homepage 
    • For office/admin, it should open the booking
  • Create a new fragment for Baby/Child seats.  If booking has a Baby or a Child then add the fragment to the booking.  Unlike the other fragments the need for it is not a function of Type (Shared/Private) or Destinations, but rather the existence of a baby/child seat

Customer Booking Confirmation

  • At top include status - Confirmed/Enquiry/Cancelled
  • Should include EVERYTHING in the booking that the customer gives us (not driver or actual pick up times)
    • Flight details (Airline, Flight Number, and times (arrival times and dep airport for arrivals, opposite for departures)
    • Chalet name, address and our link too (which should have the map once we had logged all the locations)
  •  Add in the Fragments any Destination specific PickUp or DropOffInstructions (Private Only - Not Shared)
  • And finally add all relevant Fragments at end of Confirmation (eg Company Footer etc)

 

Customer Emails Template

  • New email template required.  It will be used for Shared passengers (arrivals only -ie Uphill).
  • The purpose of the email is to check that they are on the expected train, and if not to get the information as to what train they are actually on. 
  • Roughly, the email should say "We are expecting you on the [11:17] train from GVA to LeChable.. Please click below to confirm you made that train, or if you did not make that train, please confirm which train
    • And present a list of possible other train times.  That button should then reassign the client to the correct train (and pick up shuttle).
      • There is a case where there is no space (or not enough space) available on the adjusted bus - and if so we need to think about the solution for that.  In a sense that is not our problem as they missed their original shuttle
      • Furthermore we should create a public page showing the number of seats available on the buses. (I worry that this gives competitive info away, but let's build it for now
Pending
2.14

Client confirmations

  • Launching Client Confirmations from the Booking Index…. Non editable emails (thunderbolt icon) still launch in new window DONE
  • In emails, the %Total price% is not getting displayed DONE
  • Sender field is at the bottom of the page.  Let's put it at top, to the right of the Subject DONE

Email import

  • No pending emails - is that right? DONE?

New booking

  • Client lookup seems a lot faster, but not instant.  Fair? DONE
  • Transfer: Remove from Destination drop-down list any inactive destinations  NOT DONE
  • Prices are not rounding to the nearest CHF5  (eg 300, 305, 320, 405, 450……   not 302, 452, 519) DONE
  • Pricing parameters now include 14, 20, 23, 26, 32 passenger parameter…. DONE
Pending
2.15

Accommodation: Index

  • Compute the number of transfers, and the value of the transfers, in the “Reporting Period”
  • Create a service called “FinancialReportingService” that has two functions that compute these statistics (placeholder for now)
    • TransferCountByAccommodation
    • TransferValueByAccommodation
  • In the Systems Settings entity add a ReportingStartDate and ReportingEndDate fields that is used in this service.
  • This service will also do 
    • TransferCountByUser
    • TransferValueByUser

Accommodation: Street map 

  • Sizing of map looks wrong.  Take an example with 2 chalets in Rue Barmete….
  • There should be a maximum zoom setting 
  • Filters on Accommodation Index:
    • City (i.e. destination)
    • By “type” in a given Destination (e.g. hotel, restaurant, shop etc in Verbier)  
  •  Map - by Affiliate  (ie show all <<Bramble Ski>> properties
    • Link from the Affiliates page.  Or from the Resort contacts page 
Pending
2.15

Taxi partners

There are different levels of Partners

  • “Independent drivers” who only have 1 car and work for themselves
    • Can login and accept available trips 
  • Larger companies with multiple cars and multiple drivers

Trips to Outsource view

  • Create a "Available trips” 
    • Understand the starting point of each driver and attempt to offer pairs of trips that start/end at their chosen venue
    • But show all trips in case they have a natural offset
    • Press button to accept (how do we refresh first?
Pending
2.15

New booking

  • Flights should be sorted as follows:
    • GVA pickup (ie Flight Arrivals): By scheduled flight arrival time
    • GVA drop-offs (ie Flight Departures).  By scheduled flight departure time 
      • Note, by "scheduled" I mean the gvach if it exists and the plain scheduled one if not
  • Departure times from trips to/from an airport not computed yet.  Should reference the flight arrival or departure times with the formulas agreed.
- Complete
2.16

Flight selector in New Booking

  • Find a date where there are flights available.
  • Select “LGW” (for London Gatwick LGW)….   Initially this will show the LGW flights but then shows others
Complete
2.16

Feedback on Transfer Macro

  • The time box should be a format for time (24hrs) and width should match the dates
  • Date should show the DoW (eg Sun 16 May 2025)  TODO
  • Destination
    • Should be sorted by “SortOder” and then alphabetically on "City"-  with a break before ‘20’ TODO
  • Handling Destination is a "Train Station"
    • If you change the Destination from a City to a train/airport (eg from Verbier to Martigny Train) then the From Address field should switch to  Train time/Flight 
  • When Destination is a City (eg Verbier), the Accommodation dropdown needs to contain all the information (see attached screenshot). 2 lines required for each address: 
    • Symbol to indicate the “Type”
      • ‘House’ for a Chalet
      • ‘Knife and fork’ for a Restaurant
      • ‘Office building’ for a Hotel
    • Then show the Chalet Name, Apartment  details, and then the Affiliate (in brackets)
    • Then line below should have the street and house number
  • Looking at the database entry for the Transfer:
    • PassengerName and PassengerEmail and PassengerMobile should not be inherited from the Booking.  
      • This is an over-ride should the transfer not be in the name of the Booking. So unless populated manully, it should be null
    • Trip date should be not nullable.  Time should not be nullable but have a TBD over-ride or (TBD checkbox)
    • Should we rename TripXX to TransferXX in all the fields?
    • The addressStart and addressEnd still seems to be a string field rather than a relation field related to the Accommodation entity
      • We need this to be linked because the driver will be given various info points from the Accommodation entity (eg Door Code, GPS location, Driver notes, Client notes, Associated Resort Contact).   But there neeeds to be a manual over-ride “Other” available
  • Layout of Pax Child/baby.  Try to get on 1 line

 

  • The Hide/Show extra fields
    • The Passenger Name/Email/Mobile should be here.  (These are the “over-ride ones in case the names is not the same as the Passenger details for the ”Booking" as a whole
    • Delete Button should be hidden
    • There should be a “Cancel trip flag” - which is similar to delete but retains the info for document record keeping purposes
    • Notes needs to be a bigger field
    • The timestamps can be indicated in pop-ups without expanding the section.  The user will only expand if they want to edit  - which is rare as the times are generated by the system.

 

Feedback on the Booking section (on the left)

  • When you save the booking, you should show the ID of the “Booking”.  This is the customer reference number
  • Client email and client mobile should be nullable
  • Client details should be saved in the Clients entity if unique (ie that database grows) 
  • Status should be: Confirmed/Inquiry/Cancelled  (no need for cancel booking field)
  • Booking history:  This should save the logged-user and time of creation
  • Payment link expiry:  First trip date time less 24 hours
  • Still has the word “Transfers” on the bottom left

 

 

Complete
2.18

Private Plus taxi

  • Pricing, there should be a discount for the first taker as they are taking the no-share risk. 
- Pending
2.18

Clients

  • Can't make entity
  • Add new fields:
    • Total PV
    • Summary data
  • Add link to their trips
    • 12month PV
    • List of bookings, with first date and PV
Complete
2.18

Calendar page

Pending
2.18

Transfers

Destination is a City

  • If the Destintaion IS a city (for either the start or end of the transfer), we need to show the dropdown list of accommodations to know where to pickup or drop off.  Include the possibility of "Other"
    • Save the accommodation id if picked from the dropdown (ie not ‘other’)
    • If Other, save the input in a new field
    • We will need 2 fields as we may have new locations in both the pickup and dropoff . Create two new fields
      • addressStartOverRide
      • addressEndOverRide 
  • Note: if the Destination is NOT a city (eg airport or train station), then do not show the address field at all (as there is effectively only 1 address)

 

Destination is a Train Station

  • If the Destination is a Train station, ask for train time and perhaps the origin/destination location.  So the 2 fields are
    • trainTime (time)
    • trainOriginOrDestination (string)
      • Depending on whether Transfer picks up at Martigny or drop offs, we can work out the direction of the journey and check the times.   But as far as capturing data- these are the 2 fields

 

Destination is an Airport (eg GVA)

  • We need to know the flight details (time, airline, city of origin or end) for both for (1) pickups from at airport (ie where the transfer starts at GVA)  and (2) drop-offs at the airport (ie where the transfer ends at GVA)
  • However it is the case that only one of the Start or End is an airport  - (ignoring the case where we are picking someone up at one airport and driving them to a second airport to take another flight - that never happens)
  • So while we need to capture the details of the flight (airline, flight number, destination/origin city, time) if not found in the flight database. we can work out if it is a departure or arrival from whether the Transfer is picking up or dropping off at the airport. So in the Transfer Entity you can use the same fields for Over-rides on the flights
    • flightOverRideAirline
    • flightOverRideFlightNumber
    • flightOverRideFlightTime
    • flightOverRideFlightCity

 

Complete
2.18

Shuttle: Edit Screen

  • Remove at the bottom the SBBTrain dropdown list and the Uphill/Downhill field.  DONE
  • List of Transfers includes ALL trips (PT and Shared), admittedly restricted to that day.   But doesn't show name of Passenger, or Address.  DONE??
  • When you edit a shuttle and press Save, it should go back to the Shuttle page from that shuttle (ie 26-8-2025 in this case).  DONE??
Pending
2.20

Flight Index

  • Where the train times are shown in the view, hover over to show the 2 preceding and 5 following train departure times.
  • When a flight arrival is delayed, show the new expected train time and the previous one in a warning box
Complete
2.20

New booking

  • For taxi drop-offs at train stations, add the ‘10’ mins required to buy their ticket to the travel time
    • eg     Train time : 12;00 ;  drive time =  32mins,   then leave Verbier time is 12.00 - 32mins -10mins = 11:18
  • For all drive times add 5mins and multiply by 1.1  (dynamically controlled in settings).
  • Airport bookings
    • Is showing the Geneva flights for Zurich Airport or Sion Airport.   It needs to match on airport too.  Let's add some Zurich and Sion flights to test 

 

- Complete
2.21

Affiliates

  • if this can be done in less than 1 hours….  as it will only take 2 hours to do it manually…
  • Cycle through each of the afffiliates and extract all of the data (including the icon) and either save to a CSV or import directly into the Affiliates entity
  • Do not need to collect the following data:
    • Image file if difficult - I can collate manually (it is a 10min job to do all of them)
    • SMS recipients (this is probably stale info by now)

Accommodation

 

Resort contacts

  • Import the Resort Contacts.  
  • Need a new entity for them,,  User with ROLE_RESORT_CLIENT
  • Add a new entity ResortContact and create new record alongside new User

 

Clients

  • Extract all client info (188 pages) from this view.
  • http://alpexstage.caponica.com/controlroom/customer/list

 

- Complete
2.23

Pricing

  • In Settings create a formula for the derivation of a price derived from
    • Entity:  HighVolume Days
    • Early start time/ Late finish time/premium
    • Weekend
  • Shared price P1, P2, P3, P4, P5, P6, P7, P8
Complete
2.24

Email received into the mailbox

  • Ability to import in an email into a Booking.
  • Populates the “EmailImport” field with the content
  • Popluates Client-email from the sentFrom field of the email
  • Will need to save in the website the email login and password and the directory (i.e. "_Taxi Bookings To Be Uploaded”)  to look into. 
  • When the import is done, it moves the email to a new directory (i.e. "_Taxi Bookings Uploaded”)
- Complete
2.24

Managing the shuttles

For Arrivals.

  • Look at scheduled flight arrival time
  • Find next train to LeChable that is at least 45mins post scheduled flight arrival

 

For Departures

  • Look at scheduled flight departure  time
  • Find the first train to GVA from LeChable that arrives at least 2 hours before the scheduled flight departure time

 

- Complete
2.24

Customer confirmations

  • Launching the email from the Booking menu - where you have 2 choices, namely to edit or just send as standard.    
    • The edited version should open in a new tab (target =_blank) DONE
  • Looking at the formatting
    • The email fragments placed at the bottom of the page seem to be within the ‘grid’ so don't use the full page. DONE
    • I think at the top of the page you should show the To and CC fields and make them editable.   DONE
    • Can you widen the grid so that the text doesn't wrap? DONE
  • Tab titles - Bookings and Client Confirmation emails DONE
    • Currently they are all the same ("VBC-1234 (Stephen Nurse)"), so you can't tell if it is a booking page, or confirmation page.  
    • Suggest we update the tab title to enable us to distinguish and include some more key details (status and affiliate)
      • Booking: 
        • [B] at the start, to indicate booking.  Or can you have an icon (ticket icon)?
        • [PT] is all Privates, {ST} is all Shared, [PST] if a combination 
        • Can we add green tick/red cross/grey question-mark to indicate status
        • If affiliate, then affiliate code in bracket (eg BS, which is the code for Bramble Ski)?
          • <Ticket-icon> [PT] <green tick>: 13085: Stephen Nurse [BS] 
      • Emails: 
        • Perhaps an envelope icon to start to indicate an email
        • Affiliate code in bracket (eg BS, which is the code for Bramble Ski)?
          • <Envelope-icon> [PT] <green tick>: 13085: Stephen Nurse [BS] Shared Shuttle
    • The heading for Uphill text says “Drop-up address".  Should be “Drop-off”
  • Save vs Send
    • Can the email actually be sent so we can see how it looks in Outlook or on a phone.   STILL TO DO
    • Set send address to nurse_stephen@hotmail.com or your email while we are testing
  • Deleting a booking
    • Should delete all associated confirmations too (cascade).   We will disable this button in live

Booking

  • The status field  (confirmed, enquiry, cancelled) can never be null.   DONE
  • For the Shared Shuttle,  no need to display the text in red at the top (9 km, 20 mins  Suggested Time:xxx).  This is helpful for Private Transfers, but is known for the Shared  DONE

 

Imported emails

  • What's the difference between:
    • http://localhost:8000/emails_import/index
    • http://localhost:8000/booking/index_pending_emails
  • index_pending_emails view:
    • Display date as 12-Nov-25  DONE
    • Sort by date+time DONE
    • The text includes formatting code “1 private transfer from V-Verbier to GVA.&nbsp; To get flight to LGW at 3pm.&nbsp; 5 pax”       DONE
      • Show the first 2-3 lines,   Hover over to show the full text  DONE
    • Perhaps show the number of bookings with that email address as counter (to help indicate if a regular/important customer)  DONE

Confirmations

  • http://localhost:8000/client_confirmations/index
  • Include sorting buttons, similar to booking. 
    • Must be searchable by Booking ID and/or name and/or tel number
  • No wrap on all columns  DONE
  • Include a button on a confirmation that takes you to all emails on that booking specific booking DONE
  • Booking ID→ ID to save space DONE
  • Show content with a hover. DONE
  • By-  show initials and hover over for fullName. Save space.  Auto -  show computer icon   DONE

 

- Complete
2.27

New Bookings (default settings)

  • Automatically add 1 transfer, with certain default assumptions.  
  • Create records in the SystemSettings entity to define the default settings.   
    • DestinationStart  (eg “GVA”)
    • DestinationEnd  (eg “VRB”)
    • Date: Following [Saturday]
    • Passenger #: 1
    • Baby:0 Child: 0 
    • Add 3 buttons on each transfer
      • Delete transfer (in hidden fields, next to cancel)
      • Copy transfer (in hidden fields). This makes an exact copy of the transfer details other than the assigned driver/vehicle and times 
        • Imagine being asked to create a series of transfers like the same pickup from chalet X to go to ski-lifts every day of the week at say 7am. Easiest way to do that is to create it once, then copy changing the day by +1 day
        • Importantly, do not copy the driver/vehicle details as these are not assigned and history is unique (ie when the driver arrrived)
      • Return trip - this reverses the To/From.  Make the date 1 week later.  Same number of passengers.  Not hidden - bottom right (could be an icon)
  • Create fields called lastSaved and savedBy  
    • (I have created them already) , that stores the time of last saved.  
    • Show time and initials in top right. of screen
      • These seem to still appear at the bottom of the booking page on the left
  • CreatedBy and CreatedOn fields  are not being saved at the moment
    • Moved to bottom of page, in light grey
Complete
2.27

Transfer

  • 3 buttons at the top:
    • ‘Save’ -  This updates the database but returns the user to the same screen (ie opens the Edit if new or stays on the Edit if in Edit mode)
    • ‘Discard’ - Closes the screen and doesn't save.  Prompt a "Are you sure?
    • ‘Save & Close’ - Saves the record and returns to the Bookings Index
  • Cancel transfer
    • This is essentially a new field. All the details are saved, but the transfer will disappear from (or zero costs) in any bills or from the driver's manifest
  • City- Address
    • The chalet name disappears after 2-3 seconds.   
    • The search should include the Affiliate name, so I can search for “Bramble”
  • Cancel button should be in Extras

 

- Complete
2.29

Shared Transfers

Conceptual overview:

  • The Shared Service is a bus service from LeChable to Verbier (about 10mins drive) that can be shared by multiple passengers allowing people to complete their journey without hiring an expensive taxi
    •  It is a bus with up to 13 seats.  
    • LeChable is where the train arrives, at the bottom of the mountain. Verbier is the mountain village where the skiers stay.   
      • Uphill (arrivals, at start of holiday):  LeChable→ Verbier 
      • Downhill (departures, at end of holiday): Verbier →  LeChable
  • There is a Shuttle (ie a bus available) for every train that starts/ends at LeChable that goes to/from GVA.  Typical tourist from, say London….
    • Arrival:   
      • Flight: London→ GVA
      • Train:  GVA→ LeChable
      • Shuttle bus:  LeChable→Verbier  (uphill)
    • Departure:   
      • Shuttle bus:  Verbier→LeChable (downhill)
      • Train: LeChable → GVA
      • Flight: GVA→ London
    • Therefore
      • The uphill shuttle (LC→V) is derived from the fight arrivals and then matched train GVA→LC (working forward from the flight arrival time)
      • The downhill shuttle (V→LC) is derived from the fight departures and then matched train LC→GVA (working backwards from the flight departure time)
  • Each passenger is assigned to their best shuttle according to their flight details.  See flight_trip index - which assigns them to the best train time.
  • Let's first assume infinite capacity for the Shuttle and then consider how to limit the seats.

Assigning Transfers to a Shuttle Bus 

  • A “Shared” Transfer (in a booking) needs to be assigned to a shuttle 
  • This is important as there are limited seats and the shuttle driver needs to know who they are picking up and where they are taking them to
  • Also, I want to be able to see the list of shuttles and how many seats are booked (and free = 13 - # booked), as during the day as flights are late/early people may need to be bumped to earlier/later shuttles.   This should only applies to the Arrivals (Uphill) shuttles as  people will take their chosen Shuttle on the Departures (downhill) in time to catch their planes (ie we are ‘upstream’ of any flight delays).  But we should be able to bump people up down the shuttles schedule easily/quickly and indeed enable the user to do that themselves (we should send them an email/whatsapp when we think they are on their train and confirm etc). 

Pricing

  • There is also the pricing of Shared to consider
Complete
2.30

Transfers

  • The Cancel button should be a checkbox, that can be unchecked to allow the transfer to be uncancelled
  • Add a ‘Copy’ button that copies all the details of a given transfer, and does a Save-Re-Open too.     
    • This is because we are often asked to do similar trips (eg pick up the family at 8am to take to school Mon, Tues, Weds)
  • Without opening the Extras section, we should be able to see the content, if populated, in the Transfer main box, using icons and title/hover
    • For Passenger Name
    • For the Driver, show the Departed and Arrived Times via icons and the mins late/early  (see template/transfer/parts/trip_times_body.html.twig)
  • By the accommodation, if picked from the dropdown list, have a link to the accommodation/show record and also a pop-up box(es) with all the content summarised
    • Key icon for door-code
    • Warning icon if Difficult Access
    • 3 Notes fields (Driver Icon, User Icon, Office icon)
    • Map marker

Booking

  • If there are more than 1 transfer, they transfers should be ordered by Date-Time, and ordered Transfer#1, Transfer #2, Transfer #3 etc
  • Cancelled transfers should appear in the list (in order) but without a Transfer number
  • Why does the Zero Commission and Follow-Up Flag display differently?
  • Fields for notes doesn't expand when typing
  • Last edited time/user required 

Email confirmations and history

  • Under the Customer Details (below mobile) have an icon/link to customer confirmations,  It should include the count sent and a link that shows all confirmations for this booking
  • Similarly for WhatsApp messages
- Complete
2.30

New booking 

Client search

  • The client dropdown list of ‘matching’ clients only displays the client name and their email address. The phone number is not displayed 
  • However, you can search by tel number, even if not displayed
  • If you select a client in error, perhaps there could be a quick way to reset? 

 Chalet address

  • If a selected accommodation is picked, it should not show the Other Address
  • And if you do select Other, it seems to maintain the link to a prior address

Date selection

  • Online (users) should not be able to select a date in the past. Nor too far ahead (eg 6months)
  • In the backend, we should allow historic dates but a warning flag to show if the travel date is in the past

Billing

  • Payment link not required if Outstanding = 0
  • Outstanding calculation is not correct.   Doesn't include the surcharges to the Trip prices, nor capture the Paid amount. 
- Complete
2.32

New/Edit Booking

  • When the Destination is a City….
    • Standard: If the address is selected from the list of accommodations, can you put the chalet name in the original dialogue box, with a ‘x’ there to change, and the address etc in the line below. 
    • Other:  If the selected address is ‘Other’, it doesn't display the accommodation details when reopened in Edit mode.   It does save in the DB and can be accessed in the index.html.twig
  • Check database (StartAddress, StartAddressOverRide, EndAddress, EndAddressOverRide) and how they change if you change Destination.  Specifically, changing the Destination (eg Verbier change to [Chamonix]) should clear accommodation if selected from the dropdown list (as that would be in Verbier)

Transfer #1

  • The default transfer #1 on a new booking is a trip from GVA to Verbier on the next [Sunday]. 
    • However the transfer_macro does not offer the user a list of flights.  One has to switch to another destination and back to GVA to trigger the population of flights (need to confirm if still true)   Let's wait to test on Saturday when we can upload some flights to test

Transfer #2

  • When adding a new transfer(trip 2), the defaults should be:
    • Date: Date of trip #1+ 1 week
    • Destinations:  Same as trip #1 but in the opposite direction 
    • Accommodation:  Same as trip #1
- Complete
2.32

Transfer_macro

  • When you have a flight, display the flight details so easy on the eye - presumably this can be der0vied from the flight id:
    • Flight #/airline
    • To/From
    • Either the Scheduled Departure (for depatures) or Arrival (for Arrivals) time
    • Updated time (ie delays etc)
  • In the Transfer_macro, when spooling through the flights, only show the flights where the Date of the flight equals the date of the trip and the ‘direction’ is correct, namely:
    • Airport pickups: (ie meeting clients at the airport and taking to the resort- i.e. destinationStart = Airport) - then we are meeting a flight arrival
      • If transfer.destinationStart = 'GVA",  then look for flightTrips where flightTrip.arrivalAirport = destinationStart  
    • Airport dropoffs: (ie depositing  clients at the airport and starting from the resort- i.e. destinationEnd = Airport) - then we are meeting a flight departure
      • If transfer.destinationEnd = 'GVA",  then look for flightTrips where flightTrip.departureAirport = destinationEnd  
  • Compute the pickup time derived from flight or train times
    • For pickups it is the flight/train arrival time plus the baggage time (eg 20mins for flights, 2mins for trains)
    • For drop-offs  (going to the airport), you have to work backwards from take flight time…. less commute time (see routes entity) and the check-in time allowance ,
      • System Settings contain the airport and train station delays
- Complete
2.33

Populate flights

  • The challenge is to get the Flight data populated such that you have the schedule of flight past and present as far as possible.
  • For the updated times (ie delays/cancellations) you need to scrape the live site from the airport (eg gva.ch for Geneva airport,  https://www.hermesairports.com/flight-info/arrivals-and-departures-pfo for Pathos)
    • So practically there are two tasks, 
      1. Build the forward schedule (so clients can book a trip say 2 weeks in advance
      2. Check and update live times on the day of the flight. 
        1. And the objective is to then marry that data
        2. In absence of the list of flights, can we scrape kayak for all the destinations served by the airport to build a list of flights?
  • Chat GPT tells me the PFO site is easy to scrape as simple HTML, but the GVA site is harder
  • The basic idea is that we should get updated flight info from the live sites (gva.ch for Geneva and https://www.hermesairports.com for Pathos) but use aviationstack free account to get the schedule a rolling 3 months in advance   
  • On Tuesday, can you work on the scrapers for PFO and GVA?

 

Complete
2.35

Client confirmations

  • As well as saving the client confirmations, can the confirmation be sent out
    • While testing hard-code the To field to: nurse_stephen@hotmail.com
    • Should we use the Live/Testing field in CompanyDetails for this?

Email fragments

  • I have added another fragment for Shared_Waiting_List.   
    • That doesn't follow the other logic so the inclusion criteria should look at the Name of the template (eg Shared_Waiting_List) or something similar.  

 

- Complete
2.36

New Booking.

  • When you save a New Booking, it selects ‘1’ for the ZeroCommission and followUpFlag fields, even if unchecked.  This is the form (same for both): 

->add('followUpFlag', CheckboxType::class, [
    'required' => false,
    'empty_data' => false,
    'label' => 'Follow Up',
])

  • The dropdowns are slow and repeatedly trigger.   Most notable is for the Client Name/email/tel  and the flight details
Complete
Loading…
Loading the web debug toolbar…
Attempt #