Objective; To avoid double-bookings between the two platforms
Both systems support iCal calendar synchronisation. In practice this means the two calendars exchange availability information automatically:
The website will publish a calendar feed showing dates that are already booked or blocked. Airbnb can read this and automatically mark those dates as unavailable on Airbnb.
Airbnb also provides its own calendar feed.
The website will read that feed regularly and automatically block those dates on the website if an Airbnb booking is made.
I have made that link in the TheaVistaPissouri project to make bookings made on our site available to AirBnB, but not the reverse – can you research?
ToDo:
In the ‘pull’ from AirBnB can you display the name of the booking?
Complete
1.01
Villa import from Airbnb
Can we extract the GPS location?
Pending
1.02
Villa slug into other entities
Photos
CmsCopyItems
Think about
Weather: How to handle more than one weather location
Business Contacts: Should these be unique by villa? Seems a shame not to share. Thoughts
Complete
1.02
Villa description
Need to translate the “About this villa” text into every language.
Should we use the Translation entity or multiple entities in the Villa entity? I think the Translation entity. Agree?
Pending
1.03
Individual websites
This is the key challenge.
Let's assume to begin with that each villa holds their ‘unique’ villa website on the atts-systems.com domain…
Then what I would ideally like to happen is that as soon as we create a villa entry for a new villla (eg Villa RogerFederer, website: www.villarogerfederer@atts-systms.com) then it is immediately available as a unique site (rather than a directory under villacyprusdirect). Is that possible?
Let's assume each villa wants their own URL (which is not part of atts-system eg VillaRogerFederer.com), I am sure we have to buy the URL and redirect in the DNS our own sub-directory to that external, non ATS, site)?
Is that how you would do it?
Controlling the CMS on each individual website
We can;t use the CmsCopy entity in CyprusVillaDirect to control the CMS on say “TheaVistaPissouri.com” because the CMSCopy has no unique villa ID
And we can't add villa_id to the CmsCopy entity (and CmsPhoto entity) as that will be over-written by ATS copy bat file (and we need the CmsCopy for the CyprusVillaDirect site….
So what do we do. I think we need to create a villa-specific CmsCopy and CmsPhoto entities.
Do you agree? If you agree let's call them: CmsCopyVilla and CmsPhotoVilla
Complete
1.03
New Booking (when not logged in, ie as consumer user, not admin or user)
Apply the phone Analyser to the Guest phone field
Hide the Language field, but store it (records what language they looked at the website in)
Make the confirmation in English and their preferred language
See how you can search by dates, # bedrooms, and then click on a villa.
The info section gives a good example of the extra fields we need to add in the Villa entity (I will do that)
Complete
1.05
Seasonal Rates
There are 2 new fields in Seasonal Rates - “weeklyBookingsOnly” flag and “weekStartDay”
These are used if a villa only allows bookings by the week- eg Saturday→Saturday.
This is common in ski resorts so that they don't have 1 of 2 days empty as the visitors don't fit exactly
So if this Boolean is checked, then customers can only book in 1 week slots (eg Saturday to Saturday). In that case the price per night is really price per week (so multiply by 7), And the weekday (eg Saturday) is controlled here too.
Also we need to change the Booking calendar to only accept week-long bookings
Complete
1.05
Owner
Test logging in as non-Admin, but as an owner and see what you can do.
Owners (non-Admin) should be able to edit their villa(s) including the text, rates and see bookings for their villa only.
Pending
1.06
HomePage (VillaIndex)
Make the HomePageIndex the homepage (settings?)
Make the “View villa URL”, Show (eye) and Edit (Pen) buttons only available to ROLE_ADMIN.
Clicking on the picture of villa should launch the villa's show page (not their OWN website) which includes the Availability
Search functionality
Initially the Homepage should show all villas
Once the Search function (dates, #bedrooms) is selected, it should only show villas that are available in the full date range and meets the bedroom and region criteria
Can we add a dropdown list of Amenities that the villa needs to have (eg must have swimming pool)
Villa-Show
Move the Availability to top right
Remove the Villa Location box.
Make the map-market at the top of the page launch the map/directions page,
Looks like you have replaced the map-marker icon with the villa favicon - no…. it should be the map-marker and pressing it should open the location/directions page
Availability grid
Info icon appears on days when you can't book (hide it)
When I have Sep highlighted it looks like you can't book 1-4 Oct... which you can
Weekly only doesn't look good on mobile
When the villa is weekly booking only, I think we need to change the display and just show the weeks. And not show the weekly price in every day. Perhaps only show the price on the [Saturday] and change the text to $700/week
Clicking on Book should show only bookings for 1 or 2 weeks from the prescribed start date
Remove the word "Book" - it is implied
Complete
1.06
Villa Photos
Photos not filling the page very well and being top/tailed on homepage
Pending
1.07
Multi-lingual
How do i handle the option that different villas want different languages?
Pending
1.07
Show villa
Remove “Select an available date on the calendar to book this villa directly. Direct booking. About 15% cheaper than Airbnb”
Change text to: “Save versus AirBnB by booking direct. Compare price: ” then include the AirBnB link under the AirBnB icon
For ROLE_ADMIN include an icon (next to the map-marker?) with a link to their unique site
Complete
1.08
Stripe
Set up Stripe to take payments
Pending
1.08
Homepage
At the bottom of index_homepage.html.twig: Include a map of the island with each villa location shown.
Restrict the map markers to those that meet the search criteria
Hovering over the map maker shows the name of the villa, and number of bedrooms in brackets and price (lowest daily/weekly rate in the date range)
Clicking on the map marker launches the show-villa page
Complete
1.09
"Owner" entity
Objective is to define which User (or Users) have admin rights to each villa
This entity has two fields: Villa and User
Both are relational fields and the User one is multi
Villa field cannot be null
Sort each dropdown by fullName (User) and name (villa) respectively.
In the index show some of the key villa_details as a lookup into the Villa entity
Address
Contact First/Last name
Wesbite URL (which launches in new window)
Admin rights enables those permitted users to:
Administer the “Villa” settings
Set Seasonal Rates
See and reply to bookings
Have link to it on the Standard Dashboard, say near the seasonal rates
Pending
1.09
On mobile
Date fields are not aligned nicely
Complete
1.10
Voucher scheme
Establish a discount code system for returner
Pending
1.10
New Booking
In booking/new, the user (non ROLE_ADMIN) should not be able to edit:
Status
isAirBnB booking
Checkin & Checkout Dates (should be set from the button and depends on availability)
OK to made these editable so long as it knows the availability schedule
Handling availability in the booking dropdown: We need to handle cases where the available booking basis changes between Daily and Weekly during the period shown.
For example: 1–3 January is available on a daily basis.
From 4 January onwards, availability is weekly only:
4–10 January
11–17 January
18–24 January, etc.
In this case, the permitted departure dates for an arrival on 1 January should be:
2 Jan, 3 Jan, 4 Jan, 10 Jan, 17 Jan, 24 Jan, etc.
It should not allow departure dates such as 5–9 January or 11–16 January, because once the booking crosses into the weekly-only period, the departure date must align with the end of one of the available weekly blocks.
The dropdown therefore needs to build valid departure dates by considering changes in the availability/rate basis across the booking period, rather than assuming the entire stay is either daily or weekly.
Complete
1.11
Seasonal rates.
Include a Villa field in each seasonal rate (DONE)
Index view:
Not available to non-logged in users
Non-Admin Users (ie ROLE_USERS) see only their villas (as defined in Owner entity)
ROLE_ADMIN users see all
The view should be by single villa (you never want to see all villas on one page) - so you select the villa you want to see
The error messages (checking continuity) are by villa (Make sense?)
And finally it might be great to show a graph of prices by dates. Again ROLE_ADMIN see all graphs, ROLE_USER see their own only.
Complete
1.11
Version of Calendar
Create a table view of the Calendar so Users, Admin and Owners can see multiple villas in one view
See attached xls to illustrate what it should look like
Filter buttons for Month and City of Villa
Pending
1.12
Export and imports
Build export and import for Bookings (SN to do)
Complete
1.12
1. Market Intelligence — highest development priority
Your current scraper collects valuable raw observations: 30 different stay durations for each arrival date, repeated across villas.
But owners won't want to look at 30 columns of numbers. They want to know whether they're charging the right price, how their competitors are performing and what they should change.
Daily price reconstruction
P0- Convert total stay prices into understandable daily rates: Minimum stay and discount detection
P0 - Identify 3-, 7-, 14- and 28-night restrictions or discounts Competitor comparison dashboard
P0 - Compare similar villas over the same dates. Scheduled scraping
P1 -Identify newly blocked or reopened dates.Pricing recommendations
P1 -Highlight where an owner appears expensive or cheap.Historical pricing charts
P1 - Show how prices change as arrival dates approach. Automated owner reports
P2 - Send weekly insights by email
A. Daily pricing reconstruction
This is probably the most intellectually interesting part of the project.
Your existing T+1 to T+30 observations are total stay prices, not daily prices. The task is to infer underlying nightly rates and distinguish them from length-of-stay discounts.
Ordinary nightly rates, potentially varying by day.
Minimum stay requirements.
Weekly and monthly discounts.
Additional cleaning and service fees.
Inconsistent or incomplete observations.
Prices that cannot be reliably decomposed.
My suggestion: Create a derived DailyRate dataset while preserving the original PriceHistory observations. Assign a confidence level to estimated nightly rates rather than assuming every price can be explained perfectly.
B. Competitor comparison
I would let an owner select their villa and see comparable properties within the same resort.
Importantly, compare like with like. A beachfront four-bedroom villa with a heated pool isn't directly comparable to an inland three-bedroom property.
C. Availability and estimated occupancy
Because you'll collect snapshots over time, you can observe when previously available dates become unavailable.
That gives you a potentially valuable occupancy indicator.
However, unavailable does not necessarily mean booked. The owner may have blocked dates for personal use, maintenance or bookings through another channel.
I would distinguish between:
Confirmed bookings on your own platform.
Dates unavailable on Airbnb.
Estimated booking activity inferred from changes.
Uncertain or missing observations.
Market these as estimated occupancy and booking signals, not verified competitor revenue.
2. Direct Booking Platform — what still needs doing
I would concentrate on six areas. You already have pieces of several of these, so the objective is to close the gaps rather than rebuild them.
A. Villa onboarding and website generation
P0 - Make it possible for a new owner to go from an Airbnb listing to a usable direct-booking website with minimal manual work.
Import or enter descriptions, photographs, facilities, bedrooms, occupancy, check-in rules, location and seasonal prices. Add a publication-readiness checklist and website preview.
B. Booking and availability reliability
P0 - Ensure the pricing engine handles seasonal boundaries, Saturday-to-Saturday restrictions, gap nights, cleaning fees, deposits, discounts and cancellation rules.
Test overlapping bookings, delayed calendar synchronisation, simultaneous booking requests and failed payments. Provide a booking confirmation and modification workflow.
C. Owner portal
P0 - Owners should be able to update their own photographs, descriptions, rates and blocked dates, view upcoming bookings, and see enquiries and customer details.
Keep permissions restricted to their own properties, with straightforward navigation rather than a large administrative CMS.
D. Direct booking conversion
P0- Add a clear booking quote, mobile-friendly date selection, visible total pricing, WhatsApp enquiry, guest reviews where legitimately available, and a simple reservation process.
Crucially, show the customer the benefit of booking directly rather than through an OTA.
E. Repeat-customer marketing and CRM
P1 - You already have Return Clients and discount functionality. Extend this to guest history, discount codes, repeat-booking links, targeted offers and scheduled campaigns.
Include consent/marketing preference records, unsubscribe functionality and access controls.
F. Owner financial reporting
P1 - Show booking income, occupancy, average daily rate, revenue per available night and estimated commission savings.
This creates a tangible financial explanation of why owners should continue using CyprusVillasDirect.
One particularly important point is calendar synchronisation. Airbnb currently states that imported calendars refresh automatically every three hours, rather than instantaneously. Your system therefore needs to handle the double-booking risk inherent in iCal synchronisation, especially if you offer instant booking.
3. Commercial features — potentially more important than further coding
You need a repeatable way of acquiring and retaining villa owners.
I would build a simple owner acquisition funnel:
Identify villa owners - Target villas in Pissouri, Aphrodite Hills, Coral Bay and Polis - Show an individual market report - How their villa compares with similar local properties - Offer a direct-booking website - Demonstrate commission savings and repeat-customer benefits - Convert to paying customer
Booking commission, intelligence subscription or combined package
I'd add an internal sales CRM to track the owner, villa, location, contact status, demonstration, activation and first booking. Keep it very simple.
Your previous assumption was that 100 villas might be achievable and that perhaps 20% of their bookings could migrate away from Airbnb.
The commercial question I'd test first is whether owners will pay for Market Intelligence without first receiving additional bookings. That would make it a much more attractive standalone business.
4. Infrastructure and product risks
There are several areas I'd address before investing heavily in scale.
Airbnb data access. Airbnb's current European terms prohibit unauthorised automated scraping. Your batch scraper therefore has a genuine contractual and business-continuity risk.1
Before making the entire Market Intelligence product dependent on it, evaluate licensed short-term-rental datasets or authorised integration arrangements. Providers such as AirROI advertise market and calendar data products, but coverage, reliability and commercial usage rights need validation.
Data integrity. Save observation timestamps, query parameters, currency, guest count, fee treatment, failures and the source of each price. Otherwise, historical price comparisons can easily be misleading.
Scalability. Move bulk acquisition into queued jobs with retries, checkpoints, request limits and monitoring. Keep historical snapshots instead of overwriting earlier observations.
Privacy and payment security. Protect guest contact records, handle consent correctly, use a payment service provider rather than storing payment-card details, and implement role-based access and audit trails. For marketing, existing-customer relationships do not automatically permit unrestricted promotional emailing.
5. My recommended development sequence
Given your limited development resources, this is the order I would follow.
Development priorities
Check items off as you implement them
0/12 complete
Phase 1 — Make the existing data useful
Daily price reconstruction
Normalise total stay quotes and identify discounts
Competitor comparison screen
Show prices for comparable villas and dates
Scrape scheduling and monitoring
Automate reliable, permitted data acquisition
Initial owner report
Produce a useful, understandable pricing report
Phase 2 — Complete the booking proposition
Villa onboarding
Import or enter a villa and publish it quickly
Booking reliability
Test pricing, payments, synchronisation and double bookings
Owner self-service
Allow owners to maintain their listings and availability
Mobile booking flow
Make guest enquiry and booking straightforward
Phase 3 — Commercialise
Owner acquisition CRM
Track prospective owners and conversion
Pricing and subscriptions
Test paid Market Intelligence plans
Guest marketing
Repeat-customer campaigns and discounts
Owner analytics
Measure bookings, revenue and commission savings
Copy checklist
6. What I would deliberately not build yet
I would postpone native mobile apps, elaborate AI chatbots, sophisticated dynamic-pricing automation, full accounting integrations, multi-country expansion and extensive property-management functionality.
You don't yet need to compete with established property-management systems feature-for-feature.
Your advantage could be a much narrower proposition: a villa owner gets a website for direct bookings, can market to their previous guests, and receives better local competitor intelligence.
I would aim for an initial pilot of 10 real villa owners in Pissouri or Aphrodite Hills. Measure how many activate their websites, whether anyone receives direct bookings, and — most importantly — whether owners find the competitor reports useful enough to pay for.
That will tell you far more about the project's prospects than adding another dozen technical features.
My strongest priority would be the Market Intelligence comparison screen. You already have much of the difficult data-collection work underway; turning those observations into an immediately useful report is the shortest path to determining whether the intelligence product has commercial value.
Pending
1.13
Confirmation email
Villa address is incorrect - needs to be villa specific
Contact tel number is incorrect - needs to be villa specific
Complete
1.14
Client-show-villa
Photos don't size/re-size properly and cut off heads etc
Complete
1.15
HomePage
Add region search to the search box
Complete
1.16
Amenities
If the Amenity description is not in the Translations list, show a warning sign
Complete
1.17
CyprusVillasDirect — Market Intelligence
1. Background
We want to build a Market Intelligence feature for CyprusVillasDirect that collects pricing and availability information for holiday villas listed on Airbnb.
For example, we could collect data for villas in Pissouri and market this information to other villa owners in Pissouri, helping them understand whether they are overpricing or underpricing their properties relative to competitors.
The commercial objective is to develop a historical database that tells us:
What each villa is charging for different arrival dates and lengths of stay.
Which dates appear available or unavailable.
What minimum-stay restrictions appear to apply.
Whether discounts are being offered.
How prices and availability change over time.
How competitively each villa is priced relative to other villas.
Over time, this should allow us to estimate occupancy, identify pricing trends and compare the performance of competing properties.
Today's task is to build the collection and storage functionality, not the analytics or reporting.
2. Existing application
Villa entity
Already exists and contains:
villaName
airbnbUrl
PriceHistory entity
Already created with:
Villa — ManyToOne relationship
StartDate — proposed arrival date
T1Price through T30Price — total prices for stays of 1–30 nights
createdAt — timestamp recording when the information was collected
There is also an existing CRUD interface, including an index showing all 30 prices and a manual form.
Each collection should create a new record rather than overwrite an existing record, allowing us to track historical price changes.
No new entities or changes to existing entities are required.
3. Data collection methodology
For each villa, investigate every possible arrival date over the next six months (initially 180 days).
For each arrival date, obtain prices for stays of between 1 and 30 nights.
For example:
Villa: TheaVista Arrival date: 1 July 2027
1 night: Checkout 2 July 2027 — Price £xxx
2 nights: Checkout 3 July 2027 — Price £xxx
3 nights: Checkout 4 July 2027 — Price £xxx
And so on, up to:
30 nights: Checkout 31 July 2027 — Price £xxx
The checkout date is always calculated as: checkoutDate = startDate + numberOfNights
The proposed coverage per villa is: 180 arrival dates × 30 stay lengths = 5,400 quotes.
Some requests will not return a price because dates are unavailable, minimum-stay rules prevent booking, or another restriction applies.
Where no valid price is returned, store NULL, not zero.
A missing price does not necessarily mean the villa is occupied.
If we collect prices today and again tomorrow, both observations must be retained for historical comparison.
All prices should be collected in a consistent currency (GBP initially) and represent the total quoted price for the requested stay.
4. Implementation
Create a Symfony service named:
VillaMarketIntelligenceService
The service should accept:
Villa ID
Arrival date
The service will:
Load the Villa entity.
Check that airbnbUrl exists and an authorised pricing data source is available.
For the specified arrival date, request prices for stays of 1–30 nights, or obtain equivalent information in bulk if the source supports it.
Parse and validate the returned information.
Create a new PriceHistory record with the Villa, StartDate and collection timestamp.
Save the prices in T1Price through T30Price.
Record errors in the application logs without aborting the complete collection.
Batch collection
Also provide a method that accepts:
Villa ID
Start date
Number of arrival dates to investigate (default 180)
This should call the single-arrival-date method for each date.
For 180 arrival dates, the process should create 180 PriceHistory records per villa, each containing up to 30 prices.
Use a permitted data source, respect its rate limits and avoid unnecessary requests where equivalent bulk pricing information is available.
5. Testing
Initially, test the functionality on one villa and one arrival date.
Verify that:
The correct Airbnb listing is identified.
The 30 checkout dates are calculated correctly.
Valid returned prices are saved against the correct T1Price–T30Price fields.
Missing prices are saved as NULL.
The existing collection timestamp is populated.
Running the same collection twice creates two separate historical records.
An individual quote failure does not stop the other quotes being collected.
Once this works, test collecting several arrival dates for the same villa.
6. Scope for today
Build:
VillaMarketIntelligenceService.
Pricing collection for 1–30 nights.
Storage of collected prices in the existing PriceHistory entity.
Historical snapshots without overwriting previous collections.
Batch collection across multiple arrival dates.
Basic error handling and testing.
Do not build today:
Any new entities or entity changes.
Competitor comparison reports.
Occupancy calculations.
Pricing recommendations.
Charts or dashboards.
Automatic scheduled collections.
The priority is to establish a reliable database of historical prices using the existing PriceHistory entity. We can develop the analytics once the underlying data collection is working.
Complete
1.18
Objective: Automatically discover and import villas from an Airbnb search results page into our existing Villa database (eg villas in Pissouri or Coral Bay).
Create a page where an administrator can paste an Airbnb search URL (e.g. a search for villas in Pissouri, Cyprus).
Add a "Discover Villas" button to initiate the process.
Scrape Airbnb Search Results
Open the supplied URL and extract all villas returned by the search.
Handle pagination/infinite scrolling to capture all available results, not just the first page.
For each villa, capture:
Airbnb listing URL (permanent URL without search dates or tracking parameters).
Airbnb listing ID.
Property title/name.
Maximum number of guests (sleeps X).
Number of bedrooms, beds and bathrooms (where available).
Location/area.
Main property image URL (if available).
Create Villa Records
Check whether each Airbnb listing (eg the villa's unique ID) already exists in our Villa database, using the Airbnb listing ID or canonical URL to identify duplicates.
If it exists, skip it (do not overwrite existing data).
If it does not exist, create a new Villa entity and populate the available fields, including airBnBUrl.
Reuse the existing Villa entity and fields wherever possible. Do not create another entity.
Results Summary
Display the number of villas discovered.
Number of new Villa records created.
Number already in the database (skipped).
Number of failures, with error details.
Other Considerations
The process should work for any Airbnb search URL, allowing us to discover villas in Pissouri, Aphrodite Hills, Coral Bay, Polis, etc.
Avoid duplicate records when the same villa appears in multiple searches.
Handle missing property information without failing the entire import.
Purpose: Build up our database of competing villas automatically so that our existing Market Intelligence / Price History functionality can subsequently track their prices, availability and pricing trends.
Complete
1.19
Batch Scrape
Create a service that has 3 inputs
VillaID (eg Columbia) - selected from Villas with a AirBnBUrl
First Start Date (e.g. 22-Oct26)
Number of Dates to run (e.g. 10)
This will create 10 records in the database, changing the StartDate (22-Oct, 23-Oct, …. 2 Nov)
Run the scraper we had before
…. So this will get 10 x 300 prices, saved in 10 records.
Complete
1.20
ICS export (AirbnbIcalSyncCommand)
Is this working for each villa? Test with TheaVista?
Complete
1.21
Adding Region to the Discovery process
In the Discover Villas form, add a Resort dropdown (linked to the existing Resort entity).
When new Villa records are created through the discovery process, automatically populate their Resort field using the selected Region.
This will ensure that all villas discovered in a particular search are assigned to the correct resort without requiring manual updates.
Complete
1.22
Villa Status — Replace “testingMode” field
Rename the existing testingMode field in the Villa entity to villaStatus.
The field should have three possible values:
Live — Villa is published on the public booking website and available for customers to browse and book.
Draft — Villa is being prepared for publication. It can be edited by authorised users but is not visible to customers.
Market Intelligence — Villa is maintained solely for competitor monitoring, Airbnb price discovery and market analysis. It is not available for booking through our platform.
Implementation requirements
Reuse the existing Testing Mode field if practical, renaming it to status.
Update the Villa form to use a dropdown with the three options above.
Only villas with status Live should appear on the public villa listings, search results and booking selection pages.
Both Draft and Market Intelligence villas must be excluded from all public booking pages.
All three statuses should remain visible in the admin Villa index, with a status filter and colour-coded labels:
Live — Green
Draft — Amber
Market Intelligence — Blue
New villas created through the normal admin interface should default to Draft.
Villas automatically imported through Airbnb Villa Discovery should default to Market Intelligence.The Market Intelligence and Price History tools should be able to access villas of any status, provided they have a valid Airbnb URL.
Allow administrators to change a villa's status at any time, including promoting a Market Intelligence villa to Draft or Live.
Migrate existing Testing Mode values appropriately, ensuring no villas are inadvertently published or hidden.
Important: Villa Status determines whether a villa is displayed publicly. It should not restrict its inclusion in market intelligence reporting or price discovery.
Complete
1.23
Villa screen
When clicking on the Previous/Next month, the screen jumps down so you can't read the full page
Complete
1.24
Multi-language handling
Handling of dates in availability calendar when changing to GR
Refreshing the page reverts to English, if not logged in. A problem in ATS not CDV specfically
Complete
1.25
Batch Scrape — Add "Scrape All Villas" Button
The existing Batch Scrape functionality is complete and working. I would like to extend it to support scraping multiple villas in a single operation.
1. Existing functionality (no changes)
Keep the current Batch Scrape option, which accepts:
Villa ID (selected from villas with an Airbnb URL)
First Start Date (e.g. 22-Oct-2026)
Number of Dates (e.g. 10)
This runs the existing scraper and creates one PriceHistory record per start date for the selected villa.
2. New functionality — Scrape All Villas
Add a second button labelled "Scrape All Villas".
This should use the same First Start Date and Number of Dates inputs, but automatically run the existing Batch Scrape process for every villa that meets both conditions:
Villa Status is Live or Market Intelligence.
Villa has a valid Airbnb URL.
Villas marked Draft should be excluded.
3. Processing
Reuse the existing Batch Scrape service rather than duplicating the scraping logic.
Process each qualifying villa using the same date range.
Save the resulting PriceHistory records against the correct Villa.
One villa failing should not prevent the remaining villas from being processed.
Display a summary showing the number of villas processed, PriceHistory records created and any failures.
4. Example
If there are 100 qualifying villas and the Number of Dates is set to 10:
100 villas × 10 start dates = 1,000 PriceHistory records.
Each record contains the existing T+1 to T+30 price observations.
Total: up to 30,000 price observations.
5. Additional considerations
As this could involve thousands of Airbnb requests, the process should ideally run in the background using a Symfony Messenger queue or equivalent, rather than within a single HTTP request?
The interface should display progress and prevent accidentally launching the same batch multiple times.
Include in the bat file that will copy the Language-Icon files
Blocked
2.01
Contact form
Fails to create a Website contact anymore
Complete
2.01
Bat file to update all projects at once
Assumes that each project is saved in c:\dev
Pending
2.02
Roles entity
Create a ranking of roles. See if you can mimic the hierarchy.
ie Create a list of other roles that are granted by association
Blocked
2.02
Contact form
No longer saving a record in Website Contacts
Complete
2.02
Header
Include image in header. Like Olivios
Pending
2.03
CMS Photo
Default the rotate to zero
When editing, if it was a Product it reverts to Static upon opening
If photo.photo is blank, it should be ignored in the controller (displaying product.html.twig)
Complete
2.03
Backup plan
Can the live server copy the database to c:\dev every [x] hours. Controlled in the settings
Blocked
2.03
Cms copy
Ability to be able to add a CmsCopy and insert it as desired - effectively a re-number button
Pending
2.04
OfficeAddress
Why doesn't it occupy full page, especially on mobile?
Complete
2.04
Payment link
Set up a link to Stripe or similar. Be able to copy to other projects
Payment entity linked to the User
Account at Stripe (use nurse_stephen@hotmail.com)
Blocked
2.04
User
Button when no email/mobile to ask for via WhatsApp or email respectfully.
Show last login and or no address or gps.
Pending
2.05
SQL download
Learn how to import into local
Complete
2.05
Homepage on iPhone screen
When one adds the URL link to a site on your iPhone, it would be great if the icon on the homepages had some sort of icon
Ability to resend the homescreen
Waze button from map directions (check if works from GPS or Address)
Pending
2.06
HomePage
Allow multi-selections in the Contact Us form
Add Product-include in Contact form field
Complete
2.06
Product/Sub Product
A way to control the URL for Interests
Pending
2.07
Useful files
E-mail functionality doesn't work
Edit issue
Complete
2.07
CMS
Ability to click to the point on the page
SEO optimisation
Business Contacts
Check count
Translation export
Finish export of Translation text for upload into ChatGPT and import into Translations
Stripe integration
Pending
2.08
User
Reset passwords etc
Complete
2.08
Contact form responses
Link permanently the record in Translation with the record in Company Details (ie avoid them getting out of sync)
Pending
2.09
Photos
Header Link should go to the Show By Location if sole location
Complete
2.09
WeatherService still active and causing a deprecation
[2025-02-07T12:25:03.392918+00:00] deprecation.INFO: Deprecated: Creation of dynamic property App\Services\WeatherService::$companyDetailsRepository is deprecated {"exception":"[object] (ErrorException(code: 0): Deprecated: Creation of dynamic property App\\Services\\WeatherService::$companyDetailsRepository is deprecated at /var/www/html/atstemplate2/src/Services/WeatherService.php:111)"} []
Write a batch file that will copy the Map-Icon and Language-Icon files, to all the projects (or have them uploaded in the git process)
Pending
2.10
CMS
Home Page. if the flag for Photos only is not checked and there is no CMS page Static-Home, then show an error message
Complete
2.11
Users
Link the list of fields viewable to the CompanyDetails settings
Home Address
Business Address
Personal Details
Job Details
Complete
2.12
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.13
Create a Help entity
Ability to show video of implementing each function
Complete
2.14
CMS Copy
Headlings and Titles in CMS_Copy should be be hidden unless Ranking ==1
Default Ranking =1 for first one and 2 thereafter
Complete
2.15
Product List
Button to make Active/Inactive from the Index
Buttons to Change the Ranking and Renumber
Complete
2.16
Translations
Create import/export buttons for the translations
Replace records with same English
Complete
2.17
Business Contacts
Index: Need to sort by the ranking of the Business Types
In Business Contact form
Java-script to hide the First/Last Name if the BusinessOrPerson= “Business”. if Person selected, show both
Add GPS location button that picks current location. Activate from the view too.
When deleting a business contact, cascade to the Referrals log
Complete
2.18
CMS Photos
Movie files in Interests/Products or Home page don't seem to size correctly
Complete
2.19
Facebook Reviews
List of users : FindByRole function should have up to 3 roles
Include a setting for limit review history (eg 3 months), and show/hide the reviews according to that limit
Import Reviews needs to find the User and the Facebook Group from the entity
Complete
2.20
Registration
Settings. Have a flag for enable registrations
Email templates:
Registration - Thank you registering and has a verification link to confirm
Referral
Display QR code on home page
Complete
2.21
ATS Template
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.22
Map Icons
Button to delete icons and hide/show the form field as appropriate
Complete
2.23
User
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
Complete
2.24
Company Details
Boolean flag to show/hide Contact Details in the Headers
Other flags to hide/show other functionality from the Dashboard
Weather, Facebook groups, Business contacts, Instructions, Competitors.
Complete
2.25
Company Details
Need to make email and Default password mandatory, if using the contact form.
Complete
2.26
Referrals log
Date Time function
Complete
2.27
Company Details
Index view - The i icon for Directions doesn't slice or raw
Weather - Fails with GMT as time zone
Map link field - increase height
Complete
2.28
Photos
In the CountService, for the CountPrivateLocations, don't just count those Private locations, but those where the user has access to
Complete
2.29
HomePage (Photos only)
Closer together
Complete
2.30
ATS Company Details Show
Fix slider
hide facebook months and registration email if deselected
Complete
2.31
Services.yaml
The only directory that doesn't work is the favicons_directory and mapicons_directory
However it works in the CompanyDetailsController, it only fails to work in twig (company-details-index, QR-homepage, base.html)
In each of those twigs, they don't accept other directories from the service.yaml and favicon_directory works in other twigs
Complete
2.32
Email server
Emails failing in many projects
Complete
2.33
Home page (photos only)
Looks terrible on Ipad Pro
Looks ok on iPad Mini
Complete
2.34
Add useful contacts – copy from Stephen-nurse or Immigration
Include a map that shows the location of each restaurant/hotel etc
Restaurant entity to include opening times (for on and off peak season)
Menu entity
Linked to restaurants
Add all to the copy batch file
Complete
2.35
User
Add photo, which should be part of personal details
Improve views
Complete
2.36
Business Contacts
Counter fix. Don't display Business Types if Counter =0
Complete
2.37
Products
CkEditor in Products
Complete
2.38
Languages
Add a link on the Active/Inactive to turn off/off instantly
Add a ranking number to control the order of the flags in the dropdown
Import feature to upload all the countries. Delete all
Complete
2.39
Photo Locations
New Photo Location creates an error
Complete
2.40
Mobile view needs to be improved
Dashboard
Company Details
Change from a table to a single record to display across whole page (Show)
Show function doesn't work as is
CMS_Copy - restrict content
CMS_Photo - restrict content
Complete
2.41
User
Reset password doesn't work
Complete
2.42
Website contacts
How do I see what Product they are interested in?
Complete
2.43
Security
Email verification for New users
Complete
2.44
Interests/Products
In the hyperlink in the Products/Interests entity - in the index correct for https or www to launch even if lazily entered. Same for business contacts
Complete
2.45
CMS Copy
Can't save Edits
Increase height of the content box
Define different page layout formats and have the CMS copy be applied to that format
Complete
2.46
Login Direction
Doesn't seem to do anything anymore
Complete
2.47
Logout time
How do I control the time til the systems logs you out?
Complete
2.48
User Log
Edit function error
Complete
2.49
Backdoor
Doesn't work: Password Encoder error
Complete
2.50
Products
Notes field should be better positioned (on the right, col-8) and be editable with CKEditor.
As you hover over the Links for the Products in the menu it should show you the Notes
Complete
2.51
Website contacts
Ordering of products according to ranking
Similarly in email
Complete
2.52
Weather
Index - Link to the live google weather page doesn't find the location specfied
Create a daily chron job
Complete
2.53
Edit the bat file to add the new project specific inflation
Complete
2.54
Product list (header)
If there is only one product in the ProductList, then it should become the Header
Same for SubProducts
HomePage Contact Form
Still shows the DateTime sent.
Phone number should be optional
Workflow
Auto registration
Complete
2.55
Facebook Groups and Products
Not sorting
Complete
2.56
Header & Footer
Product list should be sorted by Ranking number
Complete
2.57
Instructions
Import Media file
Display media file
And launch
Complete
2.58
QR page
Look and feel on full and small screen
Complete
2.59
Project specific roles maintain in settings
Create an entity to define the roles available in the project
Also in the User form, be able to control which fields are active as a function of the role
Complete
2.60
Users
Edit User fails because
Password is not visible
If the user has 2 or more than 3 names in the fullName
Complete
2.61
Business contacts
New contact: Sort categories alphabetically
FIle and photo field show in edit mode when not empty. Copy JS in Edit for CompanyDetails
Index: Desktop class doesn’t work
Count contacts where maplocation is not empty service
Git fails
Copy to Whistles and Bells
Complete
2.62
Company Details
Include Contact Details or not in the headers
Complete
2.63
Server clean-up
Button to clean up the attachments for all directories
Button to import the mapicon files
Complete
2.64
CMS Copy
When switching between Static Page and Product, deleting the field for Static page/Product respectively
New CMS: Product list to be ordered by ranking
Complete
2.65
Maps
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.
Complete
2.66
HomePage (Photos) and Interests Page
If the hyperlink is blank it should do anything when clicked.
Complete
2.67
CMS Photo
When editing, if the file is loaded, don't show the input box
Make the unique identifier just three letters
Increase the size of the photo in the Edit field much larger
Make the Hyperlink adaptable to include rhe https// and www
Improve the title on the Edit page
Complete
2.68
Bugs in live systems vs ATSTemplate
MapIcon, Business Types and Business Contacts imports don't work on stephen-nurse.com
Winter Cash Cup: Upgrade from ATS didn't work
Complete
2.69
Users
VCF export not built
Show each user's log count, counting the number of times the number has logged in.
Hover to show the date/time of the last [5] view
Complete
2.70
Company Details
Doesn't save the Driving Instructions. Can't save edits
Wrap google map link
Complete
2.71
Website contacts
Add a delete all button
Include the phoneChceker into the index view
Complete
2.72
Project specific landing page post login for different access rights
Complete
2.73
Have in the Settings a flag for if site is still in testing mode.
If in Testing mode, then:
Login screen contains the test login buttons
Complete
2.74
Photo gallery
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)
Then have the private groups listed, in red
Complete
2.75
Photos
Individual photo doesn't resize well when viewed by a mobile
Complete
2.76
HomePage - All photos
The photos don't have the hyerlink or the title pop-up working
Complete
2.77
Header
Useful links show/hide doesn't seem to be in all projects
Complete
2.78
Multi-lingual
Make the titles in Indexes language-specific
Complete
2.79
Competitors
Improve field names
Complete
2.80
User Import
No longer works as the SetRoles line needs to reference the Roles entity
Complete
2.81
ROLES
Doesn't seem to work
User
Photo field showing when populated.
Complete
2.82
Photos
E-mail fails
Handling of favourites
Complete
2.83
User log
Build out a more comprehensive user tracking log. Not just logins . Google analytics
Complete
2.84
Business contacts
The File and Photo fields show when not empty. Copy JS found in Company Details Edit form
Complete
2.85
Header
Photo Gallery and Photos appear twice in the Header if logged in as ADMIN
Complete
2.86
Useful Articles
Create a “Useful articles page” with some helpful topics.
Complete
2.87
New functionality: Import from Outlook
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
I am using Symfony/PHP - how can i build this?
Complete
2.88
Delete from phphmyadmin:
aphroditetenniscup
chartwellcourt
irishpassport (dev name is irishpassports)
parknride
visitweimar
Complete
2.89
Multi-currency flags don't work
Complete
2.90
Instructions
Control in Company Details to include a link to instructions functionality.
Show in dashboard if selected.
Include in Header display selections
Contacts details (Company Details settings)
Flag to include business card or not
Business card to include only the information permissioned
Perhaps include email as
Complete
2.91
Instructions page
Nesting problem
Complete
2.92
User
Default language - order by ranking
Complete
2.93
Workflow from Website Contact to User
The objective here is to automate the process of converting a Website Inquiry into a User
Form received from client (in Website contacts).
To do
Allow multiple entries on the checklist
Add field in Products for “Include in Contact Form” and references in the Contact Us form
Add input in CompanyDetails as to whether to receive an alert with a new Inquiry
And ‘Email’ text in Product form
Office_Staff decides to accept a Website Inquiry or not (perhaps automate this).
Converting to User creates a New User with the credentials provided in the Website Inquiry.
Sends a generic email
Complete
2.94
Helpful guides
Seems to take Products as well as Helpful Guides. Do I need the checkbox if picking Helpful Gudes?
Complete
2.95
Useful links to pages
Create a page (thinking of gwenny) that contains a list of topics.
In Product, create a boolean “includeInHelpfulGuides” which brings the Products into the Guide
Complete
2.96
Business Contacts
Use the White-space:No wrap and in-line style settings to make sure the names line up and the map icon appears on the same line as address
Allow export of the actual copy to enable upload into ChatGPT etc
Complete
3.01
Business contacts
Buttons at the top to be sorted in ranking order not alphabetically (SN to do)
Complete
3.02
CMS Photo
If the English text (for the title) is not translated into all the available languages show a warning sign
Complete
3.03
User - Email to UserGroups
Email sending error
Complete
3.04
Business Contacts
Add Town/Region
Show distance from home venue
Add all emergency and health contacts
Complete
3.05
User Import
Make flexible so that it looks at the title of the column to determine the field to populate
Complete
3.06
User
Groups (eg London. Cyprus. Tennis). And messages by group. Send all or by one
Complete
3.07
CMS formatting
In Techarete the CMS edit does not increase the height of the edit box
Complete
3.08
Office directions
Ensure is multi-lingual
Waze icon
Complete
3.09
User import
Doesn't seem to work
Complete
3.10
Deprecated: Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\DoctrineParamConverter::__construct(): Implicitly marking parameter $registry as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/Request/ParamConverter/DoctrineParamConverter.php on line 46
Deprecated: Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\DoctrineParamConverter::__construct(): Implicitly marking parameter $expressionLanguage as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/Request/ParamConverter/DoctrineParamConverter.php on line 46
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::__construct(): Implicitly marking parameter $twig as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/TemplateListener.php on line 39
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::__construct(): Implicitly marking parameter $language as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/SecurityListener.php on line 43
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::__construct(): Implicitly marking parameter $trustResolver as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/SecurityListener.php on line 43
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::__construct(): Implicitly marking parameter $roleHierarchy as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/SecurityListener.php on line 43
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::__construct(): Implicitly marking parameter $tokenStorage as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/SecurityListener.php on line 43
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::__construct(): Implicitly marking parameter $authChecker as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/SecurityListener.php on line 43
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::__construct(): Implicitly marking parameter $logger as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/SecurityListener.php on line 43
Deprecated: Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::__construct(): Implicitly marking parameter $authChecker as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/EventListener/IsGrantedListener.php on line 33
Deprecated: Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter::__construct(): Implicitly marking parameter $class as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/Configuration/ParamConverter.php on line 61
Deprecated: Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter::__construct(): Implicitly marking parameter $converter as nullable is deprecated, the explicit nullable type must be used instead in /var/www/html/linkedinexport/vendor/sensio/framework-extra-bundle/src/Configuration/ParamConverter.php on line 61
Complete
3.11
Page visits.
Can we remove certain IP addresses (ie me) to avoid overwhelming the count
What about adding google analytics to show original of links
Complete
3.12
Login Direction
Table too wide
Complete
3.13
Photos
Don't change the filename upon upload
Complete
3.14
CMS Copy
Sort the CMSCopy by Product ranking
Complete
3.15
File Attachments
The delete file button doesn't work and the file input is viewable when populated
Complete
3.16
CMS Copy/Format
I have placeholder field in all the CMS_Copy records called CMS_Format. It includes the different tricks to format the page (Accordian etc).
Can you wire them up and make them work so we can have a different formatted page?
Complete
3.17
I want to improve the look and feel of our websites. My plan would be to build a set of different CMS type inputs (initially in ATS) and then rollout to all all projects.
At the moment, I only have the ability to split the pages into “with photo” or “no photo”, The photo is on the right and I can include a carousel if I add >1 photo. But there are lots of other things that I can't do…
I started thinkg about this in the past, but never finished it.
I defined a set of ‘formats’ to apply to each CMS page. The list is in the entity “CMSPageFormats” which is what I was going to employ to generate the various features, using diffent twigs.
At the moment, they all do the same. So I think I will need to create blocks that I can use the standard page, then a carousel, then a xxx etc. But each of these may need us to define info other than a single text box as currently designed (eg how many boxes, what is the text and link in each box)….
Have a think about this and then let's discuss tomorrow
Complete
3.18
Homepage link
Include a icon for the jump to the homepage
Complete
3.19
Homepage
Skinny up the Contact us block. Looks silly so wide.
Complete
3.20
Product
In the Product Index, check to see if there is an entry in the Translation entity for the Product. If not, add a button to create it
How the Product translation in a tool-tip in the Index twig
Complete
3.21
Translation
Dynamic languages in translation entity
Complete
3.22
Company Details
Boolean checkbox can't not be checked
Complete
3.23
Products Index
Main/Sub label should follow the label in the CompanyDetails
Complete
3.24
CMS
Launching the photo into view mode doesn't work
Complete
3.25
Products
Re-numbering/re-ordering button
Complete
3.26
SQL export
Is the export SQL database functionality working – this will help us with testing if we can make the dev versions more similar to live to data purposes
Complete
3.27
Weather
Weather refresh is only every 3 hours
Complete
3.28
Company details
The show pages is not device responsive. Unreadable in mobile
Complete
3.29
User
Languages spoken
Complete
3.30
Company Details
In the form, The “delete VCF photo” button deletes the QR code not the VCF photo.
There is no controller for delete VCF phoot.
Copy the QR code delete button (line 240 in the controller) and link to the button in the twig
The WeatherLastScraped field is not well shown in the CompanyDetails edit twig.
Complete
3.31
User
Create fields for the GPSLocations for both HomeAddress and BusinessAddress
businessGpsLongitude
businessGpsLatitude
homeGpsLongitude
homeGpsLatitude
DONE
Include buttons to take current location and populate either Home or Business gpsLocations TODO
Improve the user/show twig (compare to business card show) and include a map with both the addresses on them DONE
Hide Business or Home buttons depending on settings in CompanyDetails DONE
In User index include the red map-marker icon if the gps longitude/latitude are present (like business contacts) DONE
Include in CompanyDetails, in the User Profile, a flag to include GPS (one flag for Home, one for Business) DONE
Complete
3.32
Website contacts
Capture the products asked about.
In the reply it should include a list of products asks for and their description
Team bio
Button on user to show team members
Complete
3.33
Languages
Confirm you can delete an icon from within a record
Save file name in lowercase upon saving or editing
Complete
3.34
User log
Create a user log for pages visited even if not logged in
Complete
3.35
Services Consolidator
Let's write a quick summary of what each service does and where it is used.
And then merge some more of the ATS services to make the list easier in a way that is logical:
Create a Help.doc saved in Services which contains the info we need about each one
Suggested consolidations:
ATS_UtilitiesService
AgeService
CheckIfUserService
EmailFetcher
ICAL
HeicImageService
LanguagesSerivce
LogService
PageVisitStatsService
RoleService
StringReplaceService
TranslastionService
WeatherService
ATS_CountService (all 10)
CountAllocatedWebsites (what does this do?)
CountBusinessContacReferrealsService
…..
CountUserLogsService
ATS_PhoneService:
FakesWhatsAppValidator[Service]
PhoneAnalyser
PhoneNumberValidator
WhatsAppValidator
Complete
3.36
CMS Photo
Add an input field in the entity that puts a title on the photo (or a flag to move it from a tooltip to a title)
Complete
3.37
Multi-lingual support
Registration e-mails
Products in Menu
Menu titles
Complete
3.38
Useful URLs
Security issues. Non admin can't see any of the records. Inconsistent with being able to see the URL.
I think control it through the CompanyDetails menu and hide the login and passwords. Not secure info
Complete
3.39
User
The display parameters in CompanyDetails no longer seem to trigger different displays in the User form
Complete
3.40
CSS
Seem to have lost some CSS (eg the formatting of CKeditor)
Complete
3.41
Delete ChartwellCourt and VisitWeimar
I have deleted the project on C, and the git repositories
Please delete anything else?
Complete
3.42
Security/Login
I can login with a new user if their access is Admin or Super_Admin, but not User (ROLE_USER)
Complete
3.43
Photos
If the photo file is missing, you can't delete the record
Complete
3.44
Clear all attachments
Button to clear public directory - assume that the directories will be made as files are saved for the first time?
Complete
3.45
2 Jan 2026 update
1) Please pull latest changes (ATSTemplate)
Please git pull on ATSTemplate. I made minor changes overnight (not related to Services consolidation):
Fix 1 bug in CompanyDetails
Fix 1 bug in HomeController
2) Testing of Services consolidation
I tested the latest consolidation of Services in ATSTemplate and everything appeared to work.
I then propagated the changes using the BAT file (attached) into:
techarete
linkedinexport
I updated the BAT file to delete duplicate/legacy versions of some Services that have been renamed over time (mainly the “Import…” related ones). The aim is that simple projects (e.g., techarete, whistlesandbells) don’t accumulate superfluous files after running the script.
Post-update testing
techarete (closest to “pure ATS”, minimal bespoke code): worked fine after composer dump-autoload.
linkedinexport: initially failed until I restored these files (so they are still required somewhere in that project):
PhoneAnalyzer.php
CountPhoneLocationsService.php
CountUserLogsService.php
Request: Please help identify where linkedinexport still depends on these (direct usage, service wiring, or indirect dependency), and whether we should:
keep them in ATSUtilities, or
keep them project-local to linkedinexport, or
refactor linkedinexport to remove dependency.
3) Next Services to consolidate into ATSUtilities
Please add these currently unconsolidated Services into ATSUtilities (with the usual wiring/config updates as needed):
BusinessContactVCFExport
CompanyDetailsService
FindUser
PhotoAuthorsByLocationService
ProductService
TranslationWorkerService
4) Repo structure tidy-up ideas (seeking your recommendation)
I’m considering two structural changes:
Controllers: create src/Controller/ATS/ (or similar) and move ATS template controllers into it.
Templates: create templates/ATS/ and move ATS template templates into it.
Please advise whether either change causes issues in Symfony, and if so what’s the cleanest way to do it. My expectation:
Controllers move should be low-risk (assuming routing attributes / service discovery still work).
Templates move will require updating template references (render(), extends, include, etc.) and should be done systematically to avoid broken links.
My view on the sub-directory changes:
A) Controllers under a sub-directory: generally safe
Moving controllers from src/Controller to src/Controller/ATS is normally fine in Symfony provided you are using attribute routes (you are) and Composer autoloading covers src/. Symfony will still discover the classes.
Common “gotchas”:
Namespace must match folder path (e.g., namespace App\Controller\ATS;), and any references/imports updated.
If you have any config that targets controller paths explicitly (rare, but possible), it may need updating. Examples:
services.yaml resource patterns for autowire/autoconfigure (often src/ so it’s fine)
security access control rules relying on controller class names (uncommon)
Route names and paths are unaffected as long as the attributes remain unchanged.
Net: this is mostly an organisational refactor; low functional risk.
B) Templates under a sub-directory: also safe, but requires systematic reference updates
Moving templates under templates/ATS/ won’t “break Symfony” per se, but you must update every template reference that uses the old path.
So, do you think this is a good idea, or will it take too long?
Complete
3.46
Team Bio inclusion
Think of a way to not just have ROLE_ADMIN in Team Bio
Flag in User, only visible to ROLE_ADMIN?
Complete
3.47
Chrome vs Firefox
The login script doesn't work in Chrome
Complete
3.48
vCard export (Team Bio)
Can't handle a birthday (string expected)
Check all fields in user and business contacts
Complete
3.49
SQL Upload into Live
How do I upload my local sql into the live server? TennisFInder.sql
Complete
3.50
Bugs
CMS_photo view requires login, so errors for non users
The secret wizard (pending reach-outs) is viewable by all
Complete
3.51
Footer
Don't display Product title if count = 0
Complete
3.52
Autologin
Check auto-login is working.
Pause for bookmark
Complete
3.53
Database download
Test the download database required to copy the live database to dev
Complete
3.54
CSS
Should these files be copied from the ATS Template?
Complete
3.55
Dynamic Header
Review the include/exclude logic
Complete
3.56
Competitor
Get Location buttons don't work in Index or Show
Complete
3.57
Services consolidation
Does it make sense to consolidate all the ImportServices into a single one?
And the Count Services into a single Service?
Does it make sense to rename the Services with a ATS prefix?
Complete
3.58
Weather
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
Complete
3.59
Contact Box on HomePage
if there is only 1 active product, don't show the checkbox
Include in the CompanyDetails a checkbox to ask whether to include the tel number and or the Message question in the contact us box
Complete
3.60
Languages
Can't edit any record.
Complete
3.61
Company details
Change the vCard download to the posh one
Complete
3.62
Page Visits
Check that this is working ok
Data at top of page should be hashed out
Ability to reset the Homepage
Colour code dates
Weekday, weekdates
Complete
3.63
Header
Include a checkbox that says include Photo in the Title when not logged in.
Complete
3.64
Header
Photo header appears if there are no photos stored
Complete
3.65
Users
I introduced sorting for all the columns (ie post pagination functionality) for the Users index. Curiously, some work but not all.
Business contacts
Tried to insert the PhoneAnalyzer into Business Contacts, but it fails
Complete
3.66
Business contacts
Handle re-imports well
if a field is updated in import then import it, otherwise don't change
Complete
3.67
Helpful files
View of Useful URLs on the mobile
Email fails with one file
Email fails when more than one file (different error)
Complete
3.68
User Indexes
Dynamic control of sorting in Index
Complete
3.69
Business Contacts and Competitors
The export function should mirror the import and add back in the Company name accordingly
Complete
3.70
Business contacts
Map not working. Creates an error
Add a button for each Business Type.
Improve the Admin View - Show GPS Long/Lat to 4 dps
Index: Sort by the ranking of the Business Types
In Business Contact form
GPS button doesn't work from within the record
In Business Contacts index, fix the count function. Don't show empty Type to the Users (only to Admin)
Complete
3.71
Business contacts
In Business Contacts index, fix the count function. Don't show empty Type to the Users (only to Admin)
Map
Buttons to restrict to one business type don't work.
Complete
3.72
CMS Copy and Photo overlap
Increase size of text box
Decide to split the screen as a function of the text ranking
Check what happens to Accordian in CMS Format Styles?
If non GB text is blank, return the GB text prefixed by (Awaiting translation…)
Complete
3.73
User registration
More elegant handling of a duplicate user
Complete
3.74
Contact Us
Don't show the Interested in… and list of Products if there is only 1 product on offer
Complete
3.75
CMS Photos
It is possible to select Video for a JPG
When switching between Product and Static Page it keeps the Static Page name and therefore impacts the Save
Complete
3.76
Languages
CompanyDetails page fails if no languages in database or no English
Doesn't seem to work in TennisClub.
Complete
3.77
Competitor Page
We collect the address and GPS locations of the competitors but don't use that anywhere.
Perhaps create a map and a VCF download - similar to business contacts
Complete
3.78
CMS
On each product.html page include a link for admin to the product. To change the name of the product
Complete
3.79
Multi-lingual
In Company Details control the default language, with one setting being to look at the browser language?
Complete
3.80
Business contacts map
Map not displaying
Complete
3.81
Products
Deleting a Product when the CMS is populated drives an error
Complete
3.82
Product
Formatting of New and Edit are different
From Index be able to launch the Page
Nowrap on arrows
Add a button to add 3 CMS and 3 Photos or +new from the index
Complete
3.83
Multi-Lingual (Languages)
Flag import fails. Possibly because file already exists?
Complete
3.84
Registration
Email fails
Need to test the full process
Complete
3.85
Map Icons
New/Edit: Selection of icons to be sorted alphabetically
Complete
3.86
New functionality: Glossary
Add a new entity called Glossary or Help
Creates a page with some background that can be linked from another page. But shouldn't be in the main drop-down menus
Complete
3.87
Mobile view - needs work.
CompanyDetails Show/Edit
Products
CMS- Edit/New is good
SubPage
CMSPhoto- index only
UsefulLinks - ok
Instructions -New
Weather -ok
Business contacts - New and Edit
Map Icons - edit
Facebook Groups - Index and Edit
Competitors - New
Complete
3.88
User
Create a field in CompanyDetails that permits or not “Auto login” from a given unique URL
Each User gets a unique URL, which will log them into the site with their name
Construct a controller that does that login for them
Complete
3.89
Login Directions
Functionality doesn't seem to work
Complete
3.90
Business contacts
Test that the file attachment and photo get deleted if you delete a contact
Complete
3.91
Users
Error message when adding a birthday “datefmt_create: invalid locale: U_ILLEGAL_ARGUMENT_ERROR”
Make the flags on the User/index saveable fields in the CompanyDetails page, so the standard can be saved for each application
Add conditionality so that unnecessary flags are hidden in both the User View and in Company Details
Complete
3.92
WhatsApp number
Develop a service that checks if a number is a valid WhatsApp number or not
Complete
3.93
Doctrine update - Entities not working
Instructions
Weather
Facebook Groups
Competitor
Competitor Service
Complete
3.94
Check backdoor functionality
Doesn't work in ComfyCats (live)
Complete
3.95
Company Details
Button to add Longitude and Latitude into the Company Details record
Add a GPS location for each Accommodation Street and Destination
Blocked
3.01
Transfer
Clicking out an accommodation does not delete it
Complete
3.01
On AXTools-> Book Now
Once you type in a flight manually, it still shows the “Can’t find flight? Enter time manually”
Pending
3.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
3.02
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
3.02
Partner website
Similar to the aggregator functionality in CyprusVillasDirect I want to be able to offer individual taxi drivers their own website that feeds into the same booking engine
Partner ATS URL field
Partner CMS and ancillary fields
Pending
3.03
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
3.03
Updated Transfer Arrival time and Driver Snail trail
On the day of a transfer, the system should continuously update the driver's estimated arrival time (ETA) using their live GPS location and Google's traffic-aware routing.
Rather than relying on a fixed journey duration (e.g. Verbier → Geneva Airport = 2 hours), the system should use the driver's current position together with the destination to request a live ETA from Google Maps (or the Google Routes API). This automatically takes into account current traffic conditions, road closures and delays.
Example
Standard journey time: Verbier → Geneva Airport = approximately 2 hours.
On a busy Sunday evening, Google may predict a journey time of 3 hours due to congestion.
The system should display this live ETA rather than the scheduled duration.
ETA Refresh
Refresh the driver's location approximately every [10] minutes while the transfer is in progress.
After each location update:
Request a new Google traffic-adjusted ETA.
Update the expected arrival time shown throughout the system.
If the ETA changes materially (e.g. by more than 10–15 minutes), highlight the change so operations staff can react if necessary.
Journey Tracking ("Snail Trail")
From the Calendar, provide a Track Journey button for active transfers.
Selecting this should display:
The driver's current location.
The route driven so far ("snail trail").
The planned route to the destination.
Current traffic conditions.
Current Google-estimated arrival time.
The tracking should only display data for the current transfer, from the moment the journey started until it is completed. It should not show the driver's movements before the pickup or after the transfer finishes.
This provides operations staff with a live view of exactly where the vehicle is, how the journey is progressing, and whether any delays are likely to impact the scheduled arrival time.
Pending
3.04
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
3.04
Booking - checking phone numbers (backend system, Book Now is ok already)
Install the PhoneAnalyser (to check phone is good) in the New Booking and Booking Index
Pending
3.05
Transfers
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?
Complete
3.05
Homepage
Design homepage with links etc
Description of:
Private transfers from anywhere. You will be given the name, tel number of your driver 1 day in advance
Introduce the concept of a Shared taxi. For arrivals at an airport/train station you must be on the exact same flight/train (not juts expected times, as flight delays can introduce large delays) and travelling to the exact same resort – so there is mimimal extra delay. The trip price will be split with afunction of passengers/drop off locations with a bias towards the person that offered to share.
Pages for each resorts (Verbier, Veyzsonnaz, La Tsmoumaz, Nendaz)
Town Map (ie chalet location finder), Train times, useful Business contacts (Restaurants, shops, pharmacies, doctors, businesses like ski hire and rental, chalet compnaies etc), what else should I add/
Transport links pages
Flight times (including latest info)
Train times
Business contacts shouldn’t have VCF as want to drive traffic to the site
Confirmations
Why does the map logo for a chalet with no GPS location go to Accommodation id 1001 etc
Test the Edit my Booking
Pending
3.06
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)
Pending
3.06
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
3.07
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
3.07
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
3.08
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
3.08
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
3.09
“Shared” Private Transfers
Pricing, there should be a discount for the first taker as they are taking the no-share risk.
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
3.09
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
3.10
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
3.10
Accommodation
Ability for the user to add a new address
Pending
3.11
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
3.11
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
3.12
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
3.12
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
3.13
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
3.13
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
3.14
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
3.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
3.15
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
3.15
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
3.16
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
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
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
3.17
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
3.17
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
3.18
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
3.18
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
3.19
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
3.19
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
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
The text includes formatting code “1 private transfer from V-Verbier to GVA. To get flight to LGW at 3pm. 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
3.20
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
3.21
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
3.22
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
3.23
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
3.24
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
3.25
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
3.26
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
3.27
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
3.28
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.
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
On Tuesday, can you work on the scrapers for PFO and GVA?
Complete
3.29
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
“An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'pause_for_bookmark' cannot be null”
Complete
3.31
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
3.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
3.33
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
3.34
Client confirmations
As well as saving the client confirmations, can the confirmation be sent out
The dropdowns are slow and repeatedly trigger. Most notable is for the Client Name/email/tel and the flight details
Complete
3.36
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
3.37
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
3.38
Accommodation
Dropdown list in a new Transfer to show only relevant accommodations (ie those from that City
Include a chalet name (no GPS) for testing purposes
If no chalet GPS show location of street?
Complete
3.39
Client phone numbers
Including details of the tel number (country code, PhoneAnalyser - confirm if the number is “verified”)
Complete
3.40
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.
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
Complete
3.41
Dashboard
Create a AXTools specific dashboard (ie not Standard/Advanced) as this is getting crowded
Complete
3.42
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
Complete
3.43
Calendar page
Develop a calendar page with the same look/feel as alpinexpress.com
Derive the Impot classification from Married/Single/Divorced and Children
Pending
4.01
Payment Made
Ability to add multiple in one pop up
Complete
4.02
Payments made
Summary table by month that shows:
Month
Total # of payments
Total $ amount
Duplicates produced on import
Checked versus bank flag
Complete
4.02
Review the Service that checks whether all fields are populated (before generating a form)
Check this service: CheckEmployeeDataByDocumentTemplateService.checkDataComplete(employee.id, document_template.id)
It is used in “index_create_forms.html.twig”
It appears that this gives a ‘Incomplete’ even when both the Employee and Employer has all the fields populated
Make the service popup (tooltip) with the missing field(s) to be filled in. Hide the generate button until ‘Complete’ criteria is met
Pending
4.03
Objective is to do AVS and other payment calculations.
Strip out of AX tools
Complete
4.03
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
Pending
4.04
Form Fields
Index. When the sorting feature is turned on, I can't alter the width of the category column
Add Import and Export function
Complete
4.05
Employee import
Creation of a User for the employee upon import and or manual input
Make sure email doesn't exist already
And if email added
Service to check if email is in the User list (see view in Employees, currently 1==1 is the check
Complete
4.06
Injection of Fields from a Record into PDF forms
The objective of the website is to automate the production of and the collection of data for various PDF forms.
Your role is to understand the tech required to take an entry (the name of the employee) and “inject” it into a form.
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)
User uploads their phone book and LinkSync compares which are connections already and which are not. Shows link to connect to the others in 1 go.
Pending
5.02
Cookie view
Add in the dashboard the list of cookies (was user_password)?
Perhaps show in the user list if the cookies are not added
Create a help email for users to add their cookie
Complete
5.02
SetUp file
Remove the warning messages for users
Single connections - Full Scrape
Add a button to update a single connections Full details or Contact Details
Languages
Split languages with a comma into multiple languages
Make work for MacOs (not yet unless easy)
Pending
5.03
Exports
For the PartnerFirm export add extra columns to the XLS export
Name of PartnerFirm Users who is connected to the LinkedInContact
Search-Results
In the Ownership section, only show the owners if they are in the same partner firm, and then just initials
Pending
5.03
Search
Ability to build a search that they can save (eg Re-run JPM XVA guy)
Complete
5.04
Tracking profile changes
Think about how I can track a change to the profile and flag it is as a change
Handling a change of LinkedInURL
Consider a way to address when someone changes their LinkedIn URL (one of the suggestions)
If URL link fails, send to a separate view for manual correction
Include a flag for failed LinkedInURL
Cron for updates/refreshing stale profil
Add a page to search for Users that have updated their profile
First Name and Last Name the same
Different URL
Pending
5.04
Search
Add a gender and languages spoken selector
Complete
5.05
CRM (SN will do this)
Create a User/Firm level set of comments on a Connection.
Pending
5.05
Full Scrape: Improvements
1. Add new languages (DONE, right?)
You might have noticed that in he LinkedInConnections index and in the SearchResults, I have consolidated the languages-spoken into a single column (as real estate is a premium), and I have also built “Languages spoken” into the search functionality
This means that I can handle any number of languages (without expanding columns and destroying the visual impact), so I no longer need to restrict languages outside the top 5 to ‘Other’.
Therefore when we scrape a profile, in the language section, can we add the new language into the Language entity, if it doesn’t exist already.
I can manually add the 2-letter acronym and the flag manually later to maintain that, but capturing the new Language at scrape would be terrific.
2. Additional connections scrape (DONE)
If you recall, I asked that when you were processing a full-profile scrape that we capture the ‘Basic’ scrape of the details of the suggested names, that are displayed on the right. See below for an example.
This is a critical function in order for us to quickly build out our population set as fast as possible
On reflection, I think you are correct when you suggested we assign a ‘system-user’ as the owner of these ‘orphan’ connections, as ultimately we will want to perform the full scrape on this profile, and it will need a user to marry up against in them to trigger that. Do you agree, or could the system-linkedin cooke just look for non-owned (orphaned) users.
If we could do it without a system-owner it might make it easier to maintain the database ? Open to ideas
Complete
5.06
Profile suggestions
Build out a page that contains suggestions for a profile:: Connection Strength Score
Number and seniority distribution of connections
Cross-industry diversity
Complete
5.07
Languages
For every connection that doesn't have a languages section, we save a ‘null' results
The birthday fields not being scraped (my profile has my birthday in it as an example)
Linkedin only gives day-month. Save as dd-mmm-2000 (we will display only as dd-mmm)
Photo
Correct the mistake whereby a profile with no photo is allocated someone else's photo
Complete
5.08
Reports
Build Industry and Candidate Moves reports
Complete
5.09
Access control for the search functionality
Limit the access to the search facilities to those recruiters that have paid for the search functionality
For others, hide the name and link and export function (unless their connections)
Pricing and licensing for recruiters.
Recruiter engagement
Detail the recruiter value in pages online, but which are not available from the menu
Complete
5.10
Scrape
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.”
Complete
5.11
Recruiter firm
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
Complete
5.12
User - own profile
Ensure that the user's own profile is included in the scrape
Launch a page that gives them their own report.
Complete
5.13
Full Scrape: Improvements
Trim the Employers
When scraping, trim the name of the employer(s) to remove any leading/extra spaces (IS THIS DONE?)
The search function was struggling to handle cases where there were/were not additional ‘spaces’, so I figured that the best way to do that was to trim as far upstream as possible
The import function does not respect the CheckedDetails and IsActive flags
Tennis Venue index doesn't sort in non logged in mode
Increase column height on Travel Directions and reduce the Maplink one
Complete
9.04
Meet new players
E-mail functionality test
To make contact with a new player, the system should not show their email/phone number, but rather wait until the recipient has accepted the request
Show list of reach-outs in my Connections list as Pending.
Mark contacts as Agreed(tick), Pending (?), or Rejected (cross).
Ability to download a Outlook contact file
Pending
9.04
Venues
Show all venues on a single map (multiple dots)
Complete
9.05
Venues
Add a new field - “Details checked”
Display as a tick for Admin users
Add button to reset tick and also a refresh all button that sets all the fields to TBA
For various inputs (toilet, parking, floodlights etc) add a “TBA” option to the choices
In view, if TBA, show as a grey question mark
Add a photo of the venue
Complete
9.05
Scraping courts
MyCourts (generic code that will then apply to all the MyCourts clubs)
Duke’s Meadow – requires a bespoke scrape
Aphrodite Hills
Pending
9.06
Email functionality
Work on the confirmation emails
Punter confirmation
Complex reservation
Aceify booking
Pending
9.06
Court reservation
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.
Complete
9.07
Court view
Include the court utilisation stats (e.g. 3/5) – perhaps as a bubble? Kill the £ sign and roundup the price (for Aceify only)
On the expanded day view show the court surface and the floodlights
Complete
9.07
Tennisfinder
Tennis Venue entity:
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
Pending
9.08
Splitting the court cost bill
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
Pending
9.08
Tennis court availability
Include the links to the clubspark site from the Expanded day page
Include the titles (Today, Tomorrow, This Week, Next Week, Following Week) in the tab and the title
Colour code the buttons to illustrate the current selection
Shrink the row height to minimal level to allow more court availability to be seen on a single page
Complete
9.09
Hit with me
Players upload a video of their game
Gets rated by a coach (£2 charge)
Grid of pricing for player vs others for relative standards Punter playing brings the balls and the court.
No show - cost of court and a fine of 5quid
Pending
9.09
Tennis venues
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.
Complete
9.10
ClubSpark
Buy smart card per venue. Limit bookings to one per day and 5 per week per smart card to avoid scrutiny.
Pending
9.10
Bug - Tennis Venues
When you edit a venue and delete the photos and then resave new photos, then the ‘old’ photos get shown
So the delete photo button should either delete the file, or the edit button should replace the file when re-editing
Complete
9.11
Helpful links
https://breakstolove.com/
Complete
9.11
Tennis coaches
Create an user-type of “Aceify Coach”
When selecting a user, also select their chosen coach
Show the coaches bookings on the court screen.
Book court in name of coach, and cc the player
Pending
9.12
Management statistics
History of court usage
The states of the court are:
No data => 1
Available => 2
Booked => 3
Closed => 4
Lifecycle (assuming not closed): 1>2>3
What do you need to know
New fields:
A) timeFirstScrape - Done
B) timeCourtReleased - Done
C) timeCourtTaken (ie time on a scrape when the court was Available before but is now Booked) - Done
Compute
SnapUpTime: (C-Max(A,B))
LeadTime: (PlayTime-C) - Done
Pending
9.12
ATS Template upload
Complete
9.13
Tennis Venues
Show the court surface/floodlights details in the booking popup
Complete
9.13
Overcome the IP blocking issue
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?
Pending
9.14
Complex Reservations
Allow a user to specify one of multiple venues/tennis and a court ranking preference
1 or 2 hours.
Ok for just one hour?
Book as soon as any are available or wait for preferences to be released?
Complete
9.14
Complex reservations
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
Pending
9.15
Bug fixes
Error message shows when Adding a new Venue
Error message when ‘signed-in’ as an Aceify client – looks to be with the mileage to courts?
Court view – check the display of the floodlight and surface data (I saw some were missing in the demo)
Complete
9.15
Scraping
Solve how to “prompt” a court availability scrape from the live site
Scrape history view not working
Pending
9.16
ATP tickets
include a link that contains the Wimbledon/French/Queens/Boodles tickets (and to tennis club site)
Import export to csv to aid importing of data
Complete
9.16
Bookings
Allow non-logged in users to book (ie straight to CC provider, take email)
Email confirmation
Pending
9.17
Cancellations
Re-use a cancelled court?
Setting up a 1st reserve for any cancellations
Pending
9.17
Scraping
Check performance now we have 20+ sites live
Complate the ParkSport scrape (very similar to ClubSpark)
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)
Handling of visitors - visitor fee applied to members Tournie and leagues Platinum vs good memberships
Pending
10.03
CMS
Change CompanyName etc to ClubName etc in all forms etc
Work on the Index page, and maybe use a table
Rename Twitter to X. Update icon
Complete
10.04
Management reporting stats pages
Pending
10.05
Other
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
Ability to process emails into a booking easily.
Pending
10.06
Users
Have ability to create a user from an Outlook lookup. ie press a button to call up Outlook and search your VCFs and import in the necessary fields
Pending
10.07
Bugs to fix
Group Session Index - how do I sort them differently if logged in or not (different column count)
My availability grid and the “I am away button” (line 110 in Index). Seem to have lost the functionality on these buttons altogetherPayroll
Pending
10.08
Tournament
Create the draw and the matches
Including scheduling futures rounds
Show the contact details of one's next opponent
Pending
10.09
New entity with Courtey rankings vs User
Import/export function or ability for user to edit their own ranking points
tennisClub (relation), box league number (1, 2…. x), sets, promotion count, demotion count, date for completion
== players
Member of a specific box league at a specific club(s)
Box league then creates a list of fixture (grid), allows the users to enter their own score and.or the administrator. Includes walkover
Computer the winner/loser
Computes next season starting point.
Pending
10.12
Tennis Court Availability
Future bookings count - had to change
Pending
10.13
Formatting
Photo handling on the Interests page
Background colour on footer and header
Height of the header, overshadowing the content
Pending
10.14
Premiership table view of players
Show last 5 wins/losses
Button for Single or Doubles
However over for date, player, score
Scrape ITF player rankings weekly
Pending
10.15
User
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
Field:
Add Google Analytics
Pending
10.16
Create a unique page for a user, that doesn't require a login and allows them to sign up for sessions
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
Swap rates are market interest rates used by banks.
They represent the true cost of fixed-rate lending in financial markets.
Why They Matter
Banks price mortgages based on swap rates
If:
5-year swap = 3%
Mortgage = 5% 👉 Bank margin ≈ 2%
This allows us to:
Compare banks
Identify overpriced or cheap mortgages
3. System Objective
Build a system that:
Collects mortgage offers from aggregators (e.g. MoneySuperMarket)
Stores them in a structured format
Collects daily swap rates
Enables mathematical comparison of mortgage deals vs market rates
CODING TO DO
4. Mortgage Rates Scraper
See: http://localhost:8000/mortgage/rates/
This page contains buttons:
2-year
3-year
5-year
10-year
Each button leads to a page showing mortgage offers for that maturity term
What to Scrape (Per Mortgage Product)
For each mortgage on the page, extract:
Link on moneysupermarket
Bank Name
Term (ie fixed period in years (eg 2yr, 3yr, 5yr or 10yr)
Interest Rate (%)
Rate Type
Fees
Fixed amount (£)
Percentage (%) if available
Cashback
Maximum LTV
Free Legals
Free Valuation
Storage
Create a new record via: http://localhost:8000/mortgage/rates/new
Scraper Logic
For each term (2, 3, 5, 10):
Open the page (2yr, 3yr, 5yr, 10yr)
Loop through all mortgage deals available
Extract required fields
Save one record per mortgage deal available
Maintaining a record over time… (let's tackle handling versioning over time after we have the scrape working)
If the Mortgage Deal already exists in the database (same Lender, same maturity term, same rate, same fees, status=Active) then don't create a new one record
If it is a Mortgage Deal, set “DateLaunched” as today and set status as Active
If a mortgage record (Active) is no longer present, mark the date "DateWithdrawn" as today
5. Swap Rate Scraper Specification
See: http://localhost:8000/swap/rates/
What to Extract
For each tenor:
2-year
3-year
5-year
10-year
Extract:
Rate (%)
Tenor
Date (today’s date)
Execution
Run once per day (cron job)
6. End Goal (Why This Matters)
This system allows comparison of mortgage deals on a like-for-like basis. I can explain why to you, but not important for the coding exercise
I have seen this multiple times. Why does it occur and how do I correct?
Complete
12.78
Garmin files
ChekEditor
Complete
12.79
Login page
Remove the buttons to login on the live site (all sites)
Not controlled by the env file, but by reference to the live server?
Complete
12.80
Email
Email to be able to be sent from the logged user rather than the same email address for all user
Complete
12.81
ToDoList Items
Move the buttons at the bottom of the page to the top and stretch the Task box longer and full screen width
Complete
12.82
Security on ToDoList
Buttons for only the relevant projects
Dropdown list of the relevant projects
Access rights to the Add ToDoList projects
Complete
12.83
To Do List
Clicking on a Project button should take you to the list by that project, but to the Pending items
Complete
12.84
On local, no favicon
Complete
12.85
Photos
Include name of uploader
Sort by favourite photos
View buttons. Favourites first. By uploaded by Show all or by user.
Sort by who uploaded
Complete
12.86
ToDoList
Error attaching attachments and deleting records
Complete
12.87
User View
Why do the buttons not spread across the page?
Complete
12.88
Events listener
Appears on bottom of every page
Complete
12.89
Helpful links categories dynamic
Complete
12.90
To Do List: List of Projects
-New button has wrong URL
Complete
12.91
CV
Upload, download and Email CV doesn't work
Complete
12.92
To Do List
Deleting an item should return the user to referrer
Top priority items no longer showing in search
Include a Show button, and make sure works well in mobile (as with Edit)
When clicking on a given project, collapse all others, and only expand the one (so when you return to index it is collapsed)
Complete
12.93
Kayak Scrape
Have the ability to scrape either (1) Direct flights only (2) Direct and 1-stop and (3) Both.
So have 3 download buttons for each route
And 3 Scrape All buttons
When finishing the scrape, display the view including the 1-stop searches as default. If null (no 1-stop searches) don't display null or no flights but leave blank
Complete
12.94
To Do List
Delete button should take one back to the referrer page
Saving a new item should bring you back to the Index but for that project only
Check what the grey number on the top left is indicating #… Is it correct (i thought it was number of Pending items)
Save button at top of page to avoid need to scroll down. Immmediate Priority box can be reduced in size
Complete
12.95
ToDoList Projects
LiveSiteWorking- Convert to string and include a N/A.
Enable sorting by LiveSiteWorking
Sort ATSUpdateDate to include h:m
Show including h:m (to test)
Website link to correct for no https:
And show only the part without https
ToDoList
Ability to collapse/expand a given project
Complete
12.96
Users
Users: create a field for ‘ComingToLondon’ and Settings entry to type in the message
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)
Complete
13.17
To Do List
Delete button shouldn't require a Check
In the Index, the indentations don't show
Second indentation
Third indentation
Complete
13.18
Useful files
Unable to edit
Hide the input field if populated. Tidy up the show form.
Complete
13.19
Photos
Edit the screen that allows me (Admin) to pick which location to see.
Complete
13.20
Project TO-Do List Priorities
Need the EditorChekr for the summary of each new project
Complete
13.21
ATS Update (Paginator)
Causes an error
Note the additional processes needed for all updates (save in update.bat in notes)
Complete
13.22
Emails - Chron job?
Emails getting sent and returned?
Complete
13.23
Latest git pull failed on live
Complete
13.24
ToDo List
New does todolist_item not formatted the same as Edit.
Edit box is smaller
Complete
13.25
Londoner email
Londoner email functionality
Complete
13.26
Flights
Kayak scrape failing
Complete
13.27
House Guest
New:
If ‘Internal Note’ or ‘Block Out’ is checked, it should hide the GuestName.
Email alert doesn't work
Complete
13.28
Helpful files
New and edit can't change some fields
Complete
13.29
Flights
Deleting a destination should delete flights
Copy destinations
Multiple destinations
Complete
13.30
Birthday
Cron job
Complete
13.31
File attachments
Multiple files not updating
Complete
13.32
To Do List
Sort the Projects by their Priority rank.
Complete
13.33
SQL Download
Error message on live (works on ATS -Live)
Complete
13.34
User profile
On all projects (e.g. stephen-nurse.com) I am continually having to run ‘backdoor’ to reset my rights.
User_roles keeps getting deleted
I have renamed the roles to add a ‘2’ to them to see if that is the problem too
Roles
Login directions seems to have gone too.
Helpful Links
Helpful Links data keeps getting erased - this seems to have stopped (no reason why) (happened again over the weekend)
Helpful files
Record remains but the attachments get deleted
Photos - Both CMS and Photo gallery
Seem to get deleted
Complete
13.35
ToDo List
Top Priority
Change Controller such that the list of ToDoList is only those that have a Top Priority Item . Lines 42-48 in ToDoListController
Top Priority field doesn't save
Add ability to add files to the ToDoListItems
ToDoListItems Controller line 95-110
Increase height of the box that shows the number of individuals who can edit a project.
Cascade - When you delete a ToDoList, delete all the associated ToDoListItems
Complete
13.36
Helpful files
In show, it shows the attachment icon when it is null.
Widen the notes column in view - test on mobile
Complete
13.37
All projects
Button that downloads the Live database to the Local version doesn't seem to work on all sites.
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.
Complete
14.02
No password hasher has been configured for account "App\Entity\User".
Complete
14.03
Backup
Is there a way to export the live database and upload it to local an automatic basis
Complete
14.04
Page
The pages for each product don't look great on mobile
Complete
14.05
Live site no longer works after pushing changes to live. It is a simple copy of ATS template with no customisation
Add a “ranking” field and a “group” field so we can order and group the messages
Pending
16.03
Time slots
1 hour, 1.5 hour, 2 hours
Always Lunch - time variable
Gap between appointments: 15’ at office. 30 otherwise
Starts in Pathos and can be volatile.
Addresses not stored.
Pending
16.04
Add a client history page
Shows bookings and payments by date for a given client
By date range (eg month)
League table: List of clients and number of bookings and total €
Total number of bookings per day graph and total for month
Break out of home/studio
Pending
16.05
Create business stats page
By date range (eg month)
League table: List of clients and number of bookings and total €
Total number of bookings per day graph and total for month
Break out of home/studio
Pending
16.06
Add a “Venue” field to each booking, which is either the “Pathos studio” or “Client home” (background: Yasser either travels to the home of the client, or the client comes to his studio). DONE- Show Client address in the form and also the in Day view
Allow clients to cancel appointments themselves (eg X hours before the appointment). Control “X” in Settings DONE
When showing the list of available slots, each client would only see appointments you are happy for them to take (eg if you are in Peyia, it won’t show an empty slot after to me as I am too far away
Calculate realistic travel times between appointments so your schedule reflects operational reality rather than simply appointment duration.
You could set rules as to how you control this (eg set certain days as “AH zone” or “Limassol zone” etc) – “Geolocation rules”.
Allow clients to quickly rebook repeat appointments (eg weekly), which probably increases overall bookings and convenience. DONE
Button that “Book Same Time Next Week” - it checks to see if available before booking
Button “Book for X weeks”
Upon booking, in the confirmation, include an ICS file to add to calendar. DONE
Send automatic WhatsApp/email reminders and confirmations to reduce no-shows Email Done and WHatsapp Pending
Set up a Chron that emails and whatsapps clients the day before appointments to remind them of date, time, venue.
Control time to resend reminders in Settings (eg day before at 9am, day-of at 9am, one day T-2hours). Ok for multiple
If the User does not have a GPS co-ordinates, include in the Day View a button (to be pressed by ROLE_ADMIN) that takes the current location and adds that to the User DONE Send reminders, ‘haven’t seen you in a while’ messages, offers etc to clients who haven’t used you for a while
Create a view and allow Yasser to trigger sending (don't want to over send)
Track payments, balances and treatment packages automatically. DONE
This requires a payment entity with three fields
Date
Payment amount
Booking ID which can be null (if clients want to pay each booking as it comes, rather than run a kitty system (https://www.worldwidewords.org/qa-kit2.html)
Pending
16.07
The very basic solution
A simple “billboard’ website advertising your business would be straightforward and could get it up and running for you in 1–2 days:
Other than a contact me button, that site wouldn’t “do anything “ (i.e. could not organise a calendar, store names/addresses of clients, track payments etc) so while cheap to do is only real value is on online business card. But quick and cheap to do for you if that’s all you want.
A proper website that include booking and intelligence
My sense is that the real value is building a proper booking and operational platform specifically around how your business actually works, and automate your admin and booking
The website/platform could do the following for you and your customers:
Allow clients to see your availability live and book appointments themselves online rather than exchanging multiple WhatsApp messages backwards and forwards.
Each client would only see appointments you are happy for them to take (eg if you are in Peyia, it won’t show an empty slot after to me as I am too far away
Calculate realistic travel times between appointments so your schedule reflects operational reality rather than simply appointment duration.
You could set rules as to how you control this (eg set certain days as “AH zone” or “Limassol zone” etc) – “Geolocation rules”.
Allow clients to quickly rebook repeat appointments, which probably increases overall bookings and convenience.
Allow clients to reschedule appointments themselves (for example up to 24 hours beforehand) without needing manual coordination (again subset to the geolocation rules)
Send automatic WhatsApp/email reminders and confirmations to reduce no-shows and administration.
Send calendar invites automatically so appointments appear directly in the client’s phone calendar.
Provide direct Google Maps / Apple Maps directions to your Paphos studio.
Save client names, emails, telephone and addresses - launch navigation apps (Waze) directly from your phone on your daily schedule
Sync client contacts to your phone too
Send reminders, ‘haven’t seen you in a while’ messages, offers etc to clients who haven’t used you for a while
Send Xmas, birthday wishes automatically and any offers
Manage driving time and therefore know what appointment is ‘available’ to each client
This is probably one of the most valuable features.
For a mobile professional, the challenge is not really managing a diary — it is managing geography and driving efficiently between appointments.
The system could maintain a client location database and calculate driving times between all customer locations.
With approximately 250 clients, the platform could effectively maintain a travel-time relationship matrix between all customer addresses (ie compute 250 x 250 combinations)
This allows the system to:
avoid impossible adjacent bookings (ie clients too far from each other)
group appointments geographically
create “zone days” (Aphrodite Hills day, Sea Caves day etc)
reduce wasted driving
reduce stress/fatigue
potentially fit more appointments into each day
The objective is simple: more treatment time and less driving time.
Other features
Allow quick one-click operational messages such as:
“Sorry - Running 10 mins late”
“I’ve arrived”
• Support referral rewards and vouchers.
• Allow clients to scan a QR code to:
save your contact details
book instantly
Fast links to leave Google reviews
recommend you to friends
Support multiple languages
English
Greek
Russian
Israeli etc
• Track payments, balances and treatment packages automatically.
Taking Payments
I actually think it probably makes sense for you to continue mainly using cash and/or Revolut rather than forcing card payments as much as you can, as this avoid paying unnecessary fees. However, it does create problems when you don’t have change etc.
However, the platform could still recognise cash payments as well as credit cards (usually 1-2% fee) or Revolut (free):
track who has paid
track prepaid balances/packages
maintain client credit (“kitty”) balances
reduce the need to remember everything manually
What’s available on the market (ie off the shelf) as comparison
I also looked properly at systems already “in the market” - ie essentially off the shelf where you benefit from economies of scale. The market leader is called “Fresha”, which seems to be used by a number of salons, podiatrists etc in Pathos… My podiatrist in Pathos uses it for example. To be clear Fresha is not their site but just the calendar/payment system embedded in it. But you test it here -> https://www.nynpodiatry.com/ Start to make a booking (but don’t confirm it obviously!)
From the reviews, Fresha is good as a generic booking platform for salons and clinics. Fresha changes about €2.50 per booking, once payment processing and messaging/SMS reminder costs are included. For you doing approximately 40 appointments per week, and if all are on line that’s around €400/month. Plus they charge 20% on the first booking for new clients and their first appointment. Plus you still need to build the simple website to plug into it.
The other problem with Fresha is that it is designed around fixed-location businesses rather than mobile therapists driving between appointments all day. So it will not be able to optimise across geographies and plan an optimal day including driving. Think of a barber similar business. So ito does not really give you:
your own bespoke operational system
your own fully customised website
your own independent platform
reviews are internal and not google specific
Instead, you are effectively operating inside somebody else’s ecosystem and pricing structure.
The platform I am proposing would instead be:
your own branded system
multilingual
specifically designed around mobile massage/physio work
operationally focused around geography, travel time and scheduling efficiency
fixed predictable monthly cost
no marketplace commissions (ie 20% commission on new clients)
fully adaptable as the business evolves
Realistically, I think this is 4–6 weeks of development work (I have 2 guys in India who help me) and if priced commercially would likely cost ~€10k. That’s a lot, I know.
Here’s my proposal, I think the fairest structure is probably:
I will pay all the upfront development costs
Use it for free for 1–2 months as a live pilot period while we refine the workflow around how you actually operate in practice.
If you don’t like it and don’t think it offers you any value we can dump the project, at no cost to you; I am confident it will make a difference and you will want to take it.
During our sessions you can give me feedback on the system and I can improve it.
Then, after the trial and you accept it: monthly fee: €200-250 month depending on what you want (so I am assuming you will run it for 5yrs for me to break even)
Includes platform/support fee, your own website URL (you should pick something that will drive more business to you – e.g. paphosmobilemassage.com)
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
Pending
18.01
Market Data
Future T+2 data….
Complete
18.02
Scrape content
Check that the scraping of all the news sites works
Also ensure that the content and not just the headline are scraped saved in the ‘fullContent’ field in the news entity.
In the view, hovering over the title will display the full content
For websites where the content is behind a firewall, then login and scrape where available.
Pending
18.02
Market stats
Scrape doesn't work in live
Complete
18.03
Update scrapers which have broken over time
Working
Not working
CNBC
Teletrader
FT Markets
Economist
FIA
Matt Levine
ISDA
BIS
Clarus
Economist Expresso
FirstFT, FT Main
Reuters
Economist Special Reports
Risk
EACH
FN
Global Custodian
Securities Finance
Complete
18.03
Set up a Payment gateway- Stripe?
Pending
18.04
User Passwords
List the users in alphabetical order
When you edit a User Password it changes the User name
Complete
18.04
Deleting LinkedIn Users
Delete MY Linkedin contacts should not delete them but mark them as hidden
How to handle when we have a contact shared with multiple "owners"?
Pending
18.05
LinkedIn Contacts
Deleting LinkedIn Contacts -just the owner's contact and the languages spoken
Complete
18.05
User Password checks
Need to develop an algorithm to check the passwords upon login
Pending
18.06
Favicon
Not working, both in bookmark and in tab, but only when on the home page… Odd
Include the summary experience and the employment history
Complete
18.08
LinkedIn Contacts
Don't save a Language Spoken for the null case
Complete
18.09
Login
Add ability to register
Complete
18.10
Read count
The new count needs to be user specific.
So this is the number of unread articles in the past 24 hours by user. Service by user and source
The read all button should not affect archives
Perhaps in archive you can have unread shown separately.
Complete
18.11
Linkedin contacts
Create a User-Settings upon scrape
Complete
18.12
User-specific summary email
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?
Complete
18.13
Settings
Add VCard code (Jeroen)
Complete
18.14
Favicon
Error message occurs when I try to save the Favicon in live.
Put a 5-6 min gap between each article to avoid access denial
Complete
18.17
Other
Make the Economic Stats scrape time 1am and 8.30am
Cron does not include FirstFT
Add a button to test that the FT.com login is working
Full content button (FT) only shows in first block (unassigned)
Upon user login, run a check on the user's logins and passwords and determine access accordingly
Complete
18.18
LinkedIn:
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)
Complete
18.19
Bugs
Market Economic Stats scraper doesn't work in live. Not just United States (filters). Aman is re-writing the scrape
Chron job for MarketStats doesn't work
Complete
18.20
User memberships
Dates
Complete
18.21
CompanyDetails
The HideOther inputs not coming through into Live
Complete
18.22
Formatting
Login button
Subscription page to show when not logged in
Ability to look at each headline
User Edit page -
Show categories
Button to delete photo
Show photo
Hide Status from user
New stories
No like/read buttons
Complete
18.23
Memberships
Create a 30-day free trial period
Unable to extend
Link the systems login to LinkedIn login and other site logins to avoid gaming
Buttons to upgrade
Complete
18.24
User
Add time zones
Complete
18.25
Security
Add role heirachy in security.yaml
Complete
18.26
Review of security (Dashboard -changed to ROLE_USER)
Complete
18.27
Users
Delete doesn't work
Include in user view.
Membership
Complete
18.28
Pricing
The functions of the website are
LinkedIn scrape
News:
Single place to read articles
Summary access only
Hover for full article
Abilty to mark articles as read, to avoid re-reading
Abiliy to select key articles and send summary email
Mark economic stats as favourite - to generate an email
See what others are liking - are you missing an important well read article?
Summary Read-only
Full articles available via a link
One-stop Read access
However
Complete
18.29
Removed the CMS and Settings entities
Why isn't LinkedIn password appearing on the list in a User's profile?
Complete
18.30
LinkedIn contact export
Develop a view of the contacts that can be expanded/contracted [like Excel]
Import photo and save file
Export file - two types: Full CSV and Outlook
Export to directory per user
Develop a concatenated Notes for the Outlook export
Control the number of exports (2 now)
Don't show the flashing screen. Warn on timings
Automatically email file
Complete
18.31
Economic stats
Highlight and suppress buttons not working
Button to use the Teletrader defaults
Button to remove your highlight or take standard
Or if blank use the default - over-ride
Complete
18.32
Economic Market Statistics
Chron job. Refresh every 15mins
Button to refresh manually if >10mins
Historical view by stat
Complete
18.33
Bugs
Merge the ‘Highlight/Standard/Low’ buttons into a pop-up. To avoid confusion.
Set User bug in Market Stats
Complete
18.34
Subscription page/Memberships
Check whether a user has a membership upon opening the Subscription page
If not, create a New membership, initially a Free membership
The new Membership button shouldn't open the form, but just save the details as per the button
Include Today's date
The new membership button shows all users to Non-Admin users
The project “XVAconsulting” is working on dev, but not on live
I had problems with installing the pagination module in composer and we might be on the wrong version of php
To push to live: ssh -p 55101 ubuntu@54.36.163.14 Password: Decartes99
Complete
18.05
Introduction
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.
Complete
18.06
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.
Complete
18.07
Consulting website
Create a new website that is largely a billboard site. Call it “XVA Consulting”
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.
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)
Separate out the Flight scraping software from the AX Tools and the StephenNurse site and consolidate into a single site.
Scrape all flights to/from PFO and Larnaca airports and tracks prices over time as well as flight times and actual arrival and depart times
Pending
23.02
Flight database
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.