Techarete Systems Ltd (‘Company’) is a pioneering technology company headquartered in Cyprus. The Company specialises in the development of cutting-edge software solutions designed to transform client booking and CRM systems used in various industries. Our commitment to innovation, efficiency, and customer-centricity drives the creation of software that optimizes resources, enhances marketing potential, and revolutionizes how businesses manage their booking processes.
Vision and Mission: At TECHARETE SYSTEMS, our vision is to empower businesses with innovative software solutions that not only streamline their booking processes but also amplify their marketing potential. Our mission is to be a driving force behind positive change, leveraging technology to optimize resource allocation and deliver unparalleled user experiences.
Core Activities: Our core focus lies in the creation of advanced software solutions that cater to diverse business needs. Our expertise extends to industries such as sports facilities, medical centres, and transportation. Through our solutions, we bring efficiency, convenience, and precision to the booking experience and improved economics for all parties.
Optimizing Resources: Our software solutions are designed to optimize the allocation of resources. In sports facilities, we ensure that every booking maximizes facility usage and minimizes conflicts. Our software streamlines appointment scheduling, resource allocation, and client management, leading to enhanced operational efficiency. In the transport industry, our software enhances dispatching, route optimization, and customer engagement, resulting in better resource utilization.
Enhancing Marketing Potential: TECHARETE SYSTEMS' software solutions go beyond functional enhancements. We recognize the importance of marketing in today's competitive landscape. Our software includes features that empower businesses to showcase their services, promotions, and special offers, thereby increasing their marketing potential. This integrated approach enables our clients to not only manage bookings effectively but also to attract and retain customers more effectively.
Innovation and Growth: Innovation is at the heart of the Company. We pride ourselves on staying ahead of industry trends and technological advancements. Our dedicated team of experts, including software engineers, UI/UX designers, and data analysts, continuously explores new avenues to refine our solutions and introduce features that drive growth and innovation for our clients.
Collaboration and Partnerships: Collaboration is a cornerstone of our approach. We actively seek partnerships with industry stakeholders, valuing their insights and needs. By working closely with our partners, we co-create customized solutions that address specific challenges within each sector. Our collaborative spirit extends to businesses of all sizes, from startups to established enterprises.
In conclusion, Techarete Systems Ltd. is synonymous with innovation and transformation. Our software solutions are designed to optimize resources, enhance marketing potential, and elevate the booking experience across industries. With a strong commitment to excellence and customer success, we are excited to shape the future of booking systems and contribute to the growth of businesses across the globe.
To create an improved version of https://www.ski-jobs.co.uk/, which we started before (the ‘recruitment’ site).
We can restart looking at that in parallel to #1 and #2 as I think once this is working I can do a lot of the development work myself. I want to first make the workflow superior to this site and then I want to scrape all the jobs from this site and a few others.
It will become evident as we build this , but first priority is to get it working with fresh (manually entered) data.
Competitor sites
Aman: Please work out how to scrape all the jobs from the following sites:
Salary: Competitive/ 1,700 Euro net per month (French contract; food and ski hire included) – Chalet Hosts? Driver & hospitality assistant @ Meriski/ 2,100 Euro net per month for Chalet Chefs (working 5 days a week)
Nationality: EU passport or Carte de sejour/ New Zealand, Australian, Canadian, or South African passport holders who have obtained a working holiday visa for France
For candidates
Candidate CV review
Referal fees
For employers:
Ask clients what they want
Success based (no hires, no fees)
Target audience may be France
Transport from UK to France/Austrai( check fllght costs with lots of luggage in early dec)
One person will have to first buy the court, but the functionality I want is for that person to then be able to split the bill across the other players
Create a “My Bookings” link - that shows the bookings where the logged-user is one of the players (either player1, player2, player3 or player 4).
This view shows who has currently paid for the court (and the split after some reallocation) and includes a button that “Pays my share”,
That process involves the non-paying player(s) to send their share of the cost to the kitty of the person that paid the bill. It will shows as a like a TopUp on the account of the recipient and a debit on the Account of the sender
Email functionality to send a reminder to the non-payers
Once the broken scrapers are fixed, the main ‘ask’ is to make it “user-specific” (ie each user can define their own list of stories and categories to include in the summary email). So the following need to be linked to the logged user:
At the moment each of these fields are attached to the news article so we need to create a User-News field relationship to achieve this. Does that make sense to you?
When you register for the club as if permanent or temporary login.
Have feature that emails logged members with expired memberships to remove them from the main list.
Field. Temp membership - date. And remove those from the drop-down menus etc.
Prepare a confirmation email to be sent to all bookings (each night and upon making the booking). In terms of the reference I don’t think we can use the court availability I’d as that changes if they change court. For the coaching booking that can work though?
When a new user logs in, have a field that asks if they are a temporary visitor or a long-term member
Approach public schools to ‘rent’ their tennis courts over the summer
Simultaneously book a Court(s) for Coaches and for Group Sessions.
What happens if the court is not free?
For a coaching session book a clay and a hard court and release one when booked. And release the backup 24 hours before the lesson
When adding a tennis Group Session that is chaperoned by a coach, add that to the coaches calendar too.
Cancellations of a coaching booking would free up the coach/court (or back to the ‘bagsy’)
Q: When should the system release a court if the coach is not booked and there is demand for the court (ie when does the bagsy run out)?
Q: Should the coach reserve a hard or clay court. How should you handle a client who wants to choose (suggestion - the coach bagsies a hard court and if available at the time of booking then it can move to a clay). Do you want to differentiate between courts (eg 8v 9 etc)?
Add calendar invite when someone makes a coach or session of court booking
Have a tennis coaches view that shows today and tomorrow, that is not password protected (but hidden link) allowing the coaches to see their calendar with 1 click. Make it work on phones
Q: What phone do Wyn, Steve, Elena have?
Decide order of priority for court usage
Show account balance/kitty in Header
Improve ergonomics of the the coach bio page.
Ask Wyn for a bio, 2-3 photos and a video for him Steve and Elena
Track no-shows
Q: Should a “no-show” prevents new bookings for [x] weeks. On the first/second/third strike?
Track canclled bookings?
Cancel bookings should be saved in a new entity and perhaps tracked. What limit to put on that?
Flexi memberships: Track number of flexi court vouchers remaining
Compute/summarise:
Court stats by month (# $$$)….. Hard, clay by hour - broken down by the DoW and hour. ie should you change prices at different times of the day to balance the loads better
Coach stats by month (# $$$)
Member stats by month
Number of court booiings, number of coaching and group sessions.
Which members break-even vs their membership cost etc? Should you increase/decrease the annual subscription?
Membership reminders
Excel import/export of all users to upload members for the admin - test
As you know, we haven’t yet managed to get the Alpex software to work standalone, but once we have that working I would like to adapt it in a number of ways. My first objective is to enable it to work for at a number of new airports and more strategically I want to move away from the owner-operator model (where I own the cars and employ the drivers) to an aggregator model where we outsource to other single driver operators. This will be quite a build change. In addition I want to build a iPhone (and maybe Android) version of the client website so we can use the client tracking features.
Park-To-Fly
I have seen a company here in Cyprus that could benefit from most of the functionality of the Alpex software. The company essentially provides a car park close to the airport, where passengers can park their cars near the airport while they are on holiday, and the company drops them to/from the airport in small buses.
In essence, from an IT perspective, their business is very similar to my Swiss bus company (Alpex), so I was proposing to strip down the Alpex system to automate that business. The key is that it requires the company to track flights, and move people on/off a shared bus to/from the airport. So there are lots of synergies.
Accommodation software
I was going to buy a house in Cyprus and rent it out in the summer months. I would like to build a website for to advertise that house and others around. Similar to booking.com
Kids Travel Lite
I met the owner of a company called KidsTravelLite.com. In short, that company hires children’s equipment to tourists while they are holiday (e.g. prams, cots, toys). Her site is aesthetically beautiful but very simple, and I offered to improve it. It does not do inventory management or track flights and this could synch into the taxi app. One idea is to integrate the hiring with the taxi to/from the airport
Recruitment site
Overall app
I thought I would ultimately combine all the with the tennis club website into a single offering (single resort app) as they all rely on some similar info (e.g. accommodation details, flight details)and I can see synergies if customers only have 1 login. In future I can add restaurant bookings, baby sitters etc. Perhaps that ‘single login’ is something we should talk about at the start?
Add a Court Surface entity, containing court surface and also floodlight, so we can identify by court the surface and floodlight status - may not be consistent across all courts at a venue.
Allow users to book repeat reservations targeting mutliple venues, where their choice will prioritise either the venue or the times or the time on court
In the popup to book a court,in the title confim the venue and time (to reassure the user that they clicked the right button) and include the court surface and floodlight data
Where the surface and floodlight specs are consistent for all courts at a venue, display in the title. When different by court, display at the court level.
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)
Proposed solution is to scrape using a local copy of the site that posts the results to the live site
Question: How do we overcome the IP block that is applied to our site for the making of bookings? is the IP address already blocked? Note this will be far less frequent than the scrape, so we could use a dynamic IP address for that component of the site as the volumes will be far lower?
With a career spanning several prestigious institutions, I have accumulated a wealth of experience and expertise that can be of significant value to your organization. I invite you to explore my journey and accomplishments in various roles across the financial industry.
During my tenure at JPMorgan, I led a transformative initiative within the Clearing and F&O business. By introducing front-office risk-management and pricing discipline to this previously considered "agency" business, I successfully revamped the risk and capital infrastructure. This endeavor resulted in doubling the revenue of the Clearing business while reducing the capital, GSIB, and residual interest footprint. Notably, my team's contributions led JPMorgan to win the Risk award for best OTC Client Clearer in 2019 and 2021.
Prior to that, I played a pivotal role in implementing funding adjustments (FVA) and lifetime cost of capital (KVA) for the derivative franchise globally, which had a substantial impact on the firm's performance. Furthermore, I spearheaded the introduction of single and multi-currency OIS discounting for collateralized derivatives, establishing a centralized firm-wide utility for managing funding risks across all lines of business and regions.
The idea of capturing value in trades through recognition of different eligible assets (i.e. initially the issue of moving from Libor to OIS discounting, but also extending to other assets in the CSA) has been well known since around 2009-10 (when GS reputedly made the majority of their FICC revenue optimising for this). Most dealers have updated their systems to avoid this arbitrage in their bilateral business (crystallizing considerable costs for the late movers).
However, this concept is not completely efficiently captured in every aspect of the market, for example where the trades are “given-in” under a Clearing Agreement. That market is a post trade approval market and essentially DD-agnostic and hence it is still open to arbitrage. Specifically, when a client goes to market, the Executing Broker (EB) prices the trade according to their DD curve facing the Clearing Agent. These can be different from different EBs, and is not the same curve as the DD curve the Clearing Agent has with the client. So, in effect, the trade is priced on the “wrong” discount (DD) curve and a client could potentially identify backwardation opportunities particularly for trades with large funding deltas.
2. CVA mining and IM optimisation – XVA Hub
Should a corporate or hedge fund have any uncollateralised risk, a Central Hub function could help mine bank’s CVA reserves where there are offsetting risk and or credit deltas across counterparties.
Similar to CVA mining, moving trades between counterparties can optimise the availability of the $50m threshold under the Non-Cleared Margin Rules (NCMR), reducing total IM funding needs. For example, if their cost of debt is 5%, adding 5 dealers and optimising for threshold could save 5*$50m*5% = 12.5m per annum
Another specific variant of the IM optimisation idea is to convert Cleared IR delta into uncleared put and call swaptions, where the IM can be bilaterally negotiated and offset bilateral risk. In essence, it can result in free funding.
A large hedge fund, recently set up a Central Hub to manage the relationships and XVAs with all their dealers, to prevent unnecessary credit costs/exposures and to minimise margin funding costs.
Consulting Services in CVA and XVA: Issues and Offerings
As a highly accomplished derivatives risk manager with extensive experience spanning trading, marketing, and risk management at JPMorgan, your expertise uniquely positions your consulting firm to offer comprehensive services in the field of Counterparty Value Adjustment (CVA) and XVA (X-Value Adjustments). Drawing from your vast experience, your consulting firm can address a multitude of critical issues and provide valuable insights to clients in the financial industry. Here's a detailed exploration of the issues and offerings your consulting service may provide:
CVA and XVA Methodologies and Implementations:
Offer guidance on implementing and enhancing CVA and XVA methodologies, leveraging your experience in pioneering CVA trading and defining philosophies for derivative counterparty risk management.
Provide expertise in designing and implementing systems for comprehensive XVA calculations, including CVA, DVA (Debit Value Adjustment), FVA (Funding Value Adjustment), and others.
Market and Regulatory Developments:
Stay abreast of evolving regulatory frameworks related to counterparty risk, including Basel III and IV, ISDA SIMM (Standard Initial Margin Model), and other regulatory changes impacting derivatives trading and risk management.
Offer insights into regulatory changes affecting non-cleared margin requirements, capital metrics (e.g., SLR, LCR, NSFR), and their implications on derivatives pricing and risk management.
Risk Management and Optimization:
Provide guidance on optimizing counterparty risk management strategies, incorporating differential discounting and collateral funding optimization techniques pioneered during your tenure.
Assist clients in developing comprehensive risk management frameworks to mitigate credit, funding, and capital risks across the entire derivatives portfolio.
Product Structuring and Pricing:
Offer expertise in structuring complex derivative products tailored to clients' specific risk profiles and investment objectives.
Provide pricing analytics and model validation services for structured products, drawing from your experience in executing derivative transactions for structured finance businesses.
Client Clearing and Margin Optimization:
Assist clients in optimizing client clearing operations and margin requirements to enhance profitability while maintaining risk discipline.
Provide guidance on establishing market risk-aware pricing frameworks for client clearing services, based on your experience leading the implementation of FVA (Funding Valuation Adjustment) and KVA (Capital Valuation Adjustment).
Technology and Infrastructure Enhancement:
Offer guidance on technology and infrastructure enhancements necessary to support advanced risk management and pricing analytics, leveraging your experience in technology and infrastructure change management.
Assist clients in implementing cutting-edge risk management systems and tools to streamline operations and enhance decision-making processes.
Industry Engagement and Thought Leadership:
Provide thought leadership and industry insights through participation in industry forums, conferences, and regulatory initiatives.
Offer bespoke training and educational programs to disseminate best practices in CVA and XVA methodologies and risk management techniques.
Client-specific Solutions and Advisory:
Tailor consulting services to meet the unique needs and challenges of individual clients, spanning investment banks, asset managers, hedge funds, and other financial institutions.
Offer bespoke advisory services to address specific client concerns, such as optimizing derivative trading strategies, managing counterparty exposures, and enhancing regulatory compliance.
In summary, your consulting firm's offerings would encompass a broad spectrum of services, ranging from methodological expertise in CVA and XVA calculations to strategic advisory on risk management, regulatory compliance, and technology enhancements. Leveraging your extensive experience and thought leadership in derivatives risk management, your firm is well-positioned to provide invaluable guidance and solutions to clients navigating the complexities of counterparty risk in derivatives trading.
Issue is that the buttons trigger a refresh and slow.
Can one overcome this with a javascrpt flag and a press to do all button at the end
Users
Centrally scrape the content of the articles. Check once the login of the user at their login stage, and track if good. Then show in the title page if the login is confirmed as valid
Include useful market information page with podcasts from our top providers – e.g. Merryn@FT; Prof G. Include date and link, and summary of the content and my commentary. Important for social media engagement
For the 129 MyCourts clubs, can you try to convert the Longitude and Latitude data that we captured into the “embedded html” needed for the maplink, so the map-marker icon works?
Can you run the postcode distance calculator for one player across all the MyCourt clubs to see if they all ok compute
The Map All button (showing the position of all the Active Courts on a single page) doesn’t seem to include the MyCourts clubs
MyCourt Scraper
Can you build a scraper to extract the Court (whether tennis, squash or badminton) Availability for the “MyCourts” clubs
Can you bring in the data as to whether it is available and the price if it is a given
Booking a Court (ClubSpark)
Can we test the client emails when you book a court
Can you look to see if you can complete the single-click book for the courts?
Complex reservation (multiple days where we book the first court that comes available)
Can we create a chron that runs through all the complex reservations and makes a booking (and cancels others) that meet the criteria. For example,
If the #1 preference is free it books that and cancels the others
Question: Do we wait for all the first choices to be available before ‘hitting’ a second choice? Or do we go through each hour and hitting the best one? (Do you see the problem?)
Perhaps we should make that a question : “Would you like us to immediately book a non-first preference option if there are some courts at your first preference still to be released? Be aware if we then wait those second/third/fourth choice options might have gone?”
We also have to think about how we use the bidding process...
For a single venue/hour…. Do we give them a choice of court, or any court?
And do we charge the full bid price, or the next best bid +£1? How will the client know? Do we show the current highest bid to encourage a higher bid- Yes? And do we tell the first bidder that they have been out-bid?
I think we just take the full amount and the client
The objective is to build up a database of all future airline/flight numbers/departure/arrival times for a given airport (eg PFO).
The objective is to get data about every flight scheduled in to/out of Pathos airport (or Geneva airport). So each day going forward, i want to see the flight number, airline, destination/departure airports, schedule time and actual departure/arrival times.
The flight database is designed to provide data to the AXtools and the ParkNRide projects.
To do this I want to list all the destinations served by an airport (eg for PFO it is LGW, FRA, LHR, LSN, etc)
For each date and route (eg LGW-PFO), return the flight details.
Look for direct (non-stop) flights only
Return the list of flights (date, airline, take-off and landing time, price)
We will match that to a database of flights (airline, route, time) to get a flight number. If a new flight, add a new record to look up the flight number.
Popup that checks that the LinkedIn login and password are successful
The first result should return the number of connections and estimate the time to download them, before proceeding.
Advise the user how long it will take to download and that a file will be emailed to them
Email csv file - one-step directly after the scrape - ie save a file in the database at the end of the scrap and email (ie merge the 3 buttons we have)
I am building a system to manage client bookings and although i would prefer that clients book online directly, some do email me. I would like to build the ability to import the content, subject line and sender and date from my email system (eg Outlook) email into a record in the database
My plans is that emails that need to be brought into the booking system would be moved to a specific directory (eg “Upload to system”) and these are the emails that the booking system would see and extract the data from. The booking system would need access to the email
Export all clients or VCF, that aggregates across both the User, Client and Dog entities.
Contact form included that will upload to client CRM (checking for duplicates)
Client contact details (and notes re dog) can be exported to a VCF or CSV so you can upload your client details directly into your phone/contacts (so you recognized in-coming calls/emails etc)
Searching for tournaments (https://www.itftennis.com/en/tournament-calendar/world-tennis-masters-tour-calendar/)
When searching, you can filter/sort by date or country….. but not by Category, or Surface
The Name of the Tournament is always a concatenation of the City and the Category, so in effect is superfluous
Some of the Cities are in CAPS, some not.
The Country filter doesn't work terribly well. Specifically, if I am searching for "Cyprus" yet have selected a month where there are no tournaments in Cyprus, then the search fails to recognize Cyprus. In addition your search function can be configured to capture structured to look for other a couple of ways of spelling a country. For example, I looked for “England”, and found nothing. It should suggest Great Britain. Similarly United States doesn't trigger, the code is USA. However you can easily configure where your country database has 2 or 3 alternative search names (hidden) that will then show “Great Britain” if I were to type any of the following "UK, GB, England, Wales, Scotland, Northern Ireland etc)
Registering/Applying for a tournament
Checking out the draw for tournament (this page→https://www.itftennis.com/en/tournament/mt400-limassol/cyp/2024/s-mt400-cyp-2024-004/draws-and-results/)
Each tournament has a single URL for all the draws (Mens, Womens, Mixed…. All age groups), and they control the display with Javascript
That means you can't share the URL to direct family/friends/partners for specific draw. You have to tell them to navigate to say "Mens / Singles, Over 45)
Moreover, the site doesn't remember anything about the user, so refreshing the Age category resets the gender of the user.
I would recommend tracking the default with a cookie or alternatively providing a unique URL (trade-off is that it is slightly to flick between tournaments, but most users are not doing that)
The order of play page doesn't optimally use the screen width. On high resolution screens you could see 12 courts simultaneously, rather than clicking across screens
Similarly the court numbering at the top is confusing.
Work out a way to share some common features of the User entity but allowing for adaptions for each different project
ChatGPT: I am building about 10 different websites that all work on Symfony/PHP. They will all share the same foundations or basic architecture (basic USER handling, a CMS, and other standard features) and any changes in one are updated across all by copying the Entity, Controller, Form, Repository and Templates. The each site will have some specific code unique to each site. The problem I have is that the USER entity needs to be slightly different for each site, so I can't copy those across. How can I maintain consistency and the uniqueness. My thought was to split the user entity in two and embed the second (different) USER2 contents within the USER form. Any suggestions
To calculate the optimal zoom level for a Google Map that just fits all of your venues without scrolling, you need to determine the bounding box that encompasses all the venue locations. Based on the bounding box, you can compute the zoom level that ensures all the venues are visible. Here’s how you can approach this:
Steps to Calculate Optimal Zoom Level
Find the bounding box: For all your venues, compute the min and max latitudes and min and max longitudes:
minLat = minimum latitude of all venues
maxLat = maximum latitude of all venues
minLng = minimum longitude of all venues
maxLng = maximum longitude of all venues
Calculate the geographical range:
The latitude range is: latRange = maxLat - minLat
The longitude range is: lngRange = maxLng - minLng
Calculate the center of the map: The center of the map is simply the average of the latitudes and longitudes:
centerLat = (maxLat + minLat) / 2
centerLng = (maxLng + minLng) / 2
Calculate the diagonal distance: The diagonal distance between the top-left and bottom-right corners of the bounding box is critical for determining the zoom level. You can use the Haversine formula or a simplified approximation to compute the distance.
The Haversine formula is:
a = sin²(Δφ/2) + cos(φ1) ⋅ cos(φ2) ⋅ sin²(Δλ/2) c = 2 ⋅ atan2(√a, √(1−a)) d = R ⋅ c
Where:
Δφ = difference in latitude (in radians)
Δλ = difference in longitude (in radians)
φ1, φ2 = latitude values in radians
R = radius of the Earth (mean radius = 6,371 km)
d = the distance between the two points (diagonal distance)
Estimate zoom level: Based on the diagonal distance, Google Maps provides a rough way to estimate the zoom level, which is typically from 0 (world) to 21 (street level). A common approach is to map the diagonal distance to zoom levels using a logarithmic scale, but this depends on the map's current bounds and the projection used. Generally, a simplified formula is:
maxZoom = the maximum zoom level allowed (usually 21)
maxDistance = the maximum diagonal distance you want to show (e.g., distance across your entire map's viewable range)
scaleFactor adjusts for the desired map fit
Using Google Maps API to Simplify:
You can simplify this calculation by using the Google Maps API, which has a method to fit markers within a viewport using fitBounds():
// Assuming you have an array of venue locations in {lat, lng} format: const locations = [ {lat: 40.748817, lng: -73.985428}, {lat: 40.748217, lng: -73.985128}, // Add other venues here ]; // Create a bounds object const bounds = new google.maps.LatLngBounds(); // Extend bounds to include each venue locations.forEach(location => { bounds.extend(new google.maps.LatLng(location.lat, location.lng)); }); // Create a map with the bounds set const map = new google.maps.Map(document.getElementById("map"), { center: bounds.getCenter(), // Center map at the average of the venues zoom: 15 // You can let Google automatically choose the zoom or set a default }); // Fit map to the bounds map.fitBounds(bounds);
This method will automatically adjust the zoom level and center based on your venues, ensuring all the locations are visible without scrolling. You don't need to manually calculate the zoom level if you're using this approach.
Response from Website Inquiry Contact Form process (in Payroll Project)
As in ATS, the process of submitting an inquiring will create a new User. Ensure that the role of that new user include ROLE_EMPLOYER
New Employers can choose the services they want to avail themselves of
Monthly payroll
Employment contract negotiations
Health insurance set-up
Employee permits (including managing capturing and checking the data from the employees)
Employee admin (housing, transport, training)
Ski hire for the season
Use the Product entity to control the text for each service (including pricing)
Check box for each Product that each Employer wants to take up
When a User logs in, if they are ROLE_EMPLOYER but do not have an associated Employer details set up, it will show a page designed to walk them through setting up an Employer.
Employer page should include a question as to what services they would like to use. (See above)
If an Employer has been set up, it will direct them to their own dashboard page with their Employer(s) (likely 1 but can cater for others) with the links to their various pages with some sort of summary info.
If a a ROLE_EMPLOYEE or ROLE_USER, then design a dashboard page for an Employee
Access to their personal details
Store of permits
Payslips
General information and help
When uploading an Employee, be sure to track Default Language
Payroll – Other tasks
Create a Pricing entity
Product (relational field)
# Employee and price (thoughts – single entry of multiple entries per product)?
Create a Communications Template entity
Name
Text in EN, FR, DE etc
When uploading a new Employee be sure to include their country so the User Default language can be set.
Edit the Employee upload function (New or Edit or Import) to check the employee language setting
Don't open the photo-locations page unless an Admin and there are at least [15] different locations
Instead show the name (and date and # photos) of each location in the dropdown. Listed either alphabetically or by date (make that a control in the Settings)
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
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
Cycle through the list of accommodations and extract all the details. All info available in the Index and no need to go into each record, but need to open 23 different pages
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
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
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
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
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
‘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”
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
Schedule the scrapes to run in batches (e.g. 20 at a time, once every 6 hours - i.e 80 a day - to minimise the chance of LinkedIn security blocking the IP
I recognise that for someone like me with 1.5k contacts, the process will take ~20 days, but that is ok.
Perhaps email progress report (and a file with a subset of the users) after each run with the updates so far (once we have fully tested this)
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)
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
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 3 new fields – 1) “Price Adjustment” (float) and 2) “isSharedAllowed” (boolean) and “sharedTransfers” (relation linked to Transfer Entity – ManyToMany).
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?
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.
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….
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?
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
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
When a LinkedIn contact has something unusual in their name (eg the maiden name in brackets, or a same or PhD in brackets) then it fails to allocate the first name and last name successfully.
Suggestion: Take anything in between brackets and delete (including deleting the brackets)
See attachment for examples in my Connections list (6 out 1,222 ‘fail’)
Scraping of gender from linkedIn needs to be trimmed for it to be effective - returns “…….She/Her……”
Let's test it
Settings
The settings for MaxLinkedInContacts and LinkedInScrapeBatch don't seem to be effective. We should use these fields to reduce the initial scrape to make testing quicker
Popup Message
The popup message appears each time your launch Index - “There are 1222 connections. The system pulls data in the batch of 20 per hour. It will take approximately 62 hours or 2 days and 14 hours to completely fetch all the data of 1222 connections. Our system will auto pull data in the interval of 1 hour. You can check status in every one hour. To continue please start the process.”
Build the forward schedule (so clients can book a trip say 2 weeks in advance
Check and update live times on the day of the flight.
And the objective is to then marry that data
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
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
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
Currently the code tracks the status - basic details scraped, then full scrape. I think we need to consider how we refresh the basic scrape (check # connections count?) to see if a new scrape is required
So how should it work
First time use:
Hide “Import and Email button”, and “Export” and "Email" buttons
Hide Connections Scraped info button
Scrape button should show: 1) Import Connections.
This should popup the following text box: “Step 1. Our servers will now login to Linkedin and pull in the basic details of all your [1,234] connections. ….
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).
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
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
It would be great if we could find a screen share solution that shares 2 screens and doesn't fall off connections as frequently as Chrome Remote Desktop
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?
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
I have added a new field in the FlightStats entity called “lowestPriceOneStop”
Amend the Kayak scrape to include 1-Stop flights as well as Direct-only (currently the search specifies Direct-flights only) and store 2 prices for each route/date…. the best Direct flight price in the field “lowestPrice” and the best 1-stop price in “lowestPriceOneStop”
I have adapted the calendarindex twig and the controller to show the choice of the user (button at the top to toggle between showing both Direct and Direct+1-stop)
Don't wait for each scrape to update the screen. Update after each scrape (ie per day/route)
Add a flag to determine if you would like to share connections across the firm fully or vertically only. How to motivate non-admin users to participate -
If vertically, need to identify the admin users at the firm
Settings
Add language for each profile improvement point:
Missing Photo / Poor Quality Photo
Missing Contact Details
missing phone
missing international format
missing email
Missing Skills or Too Few Skills
“People in your industry typically list 10–20 skills. You currently list 3.”
Missing Languages
Current job end date missing
Job has no description
Outdated Education
no graduation year
no degree
Missing Summary / About Section
Weak Headline You can compare headline vs job title.
If headline = job title → suggest improvement: “Your headline is identical to your job title. Stronger headlines include expertise or niche.”
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.
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?
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’
Don't refresh with a cron, but check the last time it was refreshed. Store in settings. and if longer than x then refresh automatically upon the index being called