To Do: All (Complete)

/
Project #
CyrpusVillasDirect #: 25
27-Oct-2026
09:57

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
27-Oct-2026
09:57

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.

Complete
27-Oct-2026
09:43

Villa screen

  • When clicking on the Previous/Next month, the screen jumps down so you can't read the full page
Complete
27-Oct-2026
09:32

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
27-Oct-2026
09:10

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
23-Oct-2026
10:22

ICS export  (AirbnbIcalSyncCommand)

  • Is this working for each villa?   Test with TheaVista?
Complete
23-Oct-2026
08:46

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
23-Oct-2026
08:45

Objective: Automatically discover and import villas from an Airbnb search results page into our existing Villa database (eg villas in Pissouri or Coral Bay).  

Example: https://www.airbnb.co.uk/s/Coral-Bay--Pegeia/homes?place_id=ChIJEe9tmjwI5xQRb4uBfixUqUc&refinement_paths%5B%5D=%2Fhomes&location_bb=Qgt6hkIBiHtCC2PYQgFrnQ%3D%3D&acp_id=t-g-ChIJEe9tmjwI5xQRb4uBfixUqUc&date_picker_type=calendar&search_type=autocomplete_click 

Search URL Input

  • 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
23-Oct-2026
08:45

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
16-Oct-2026
09:45

Amenities

  • If the Amenity description is not in the Translations list, show a warning sign
Complete
14-Oct-2026
16:13

Client-show-villa

  • Photos don't size/re-size properly and cut off heads etc
Complete
14-Oct-2026
16:13

HomePage

  • Add region search to the search box 
Complete
13-Oct-2026
14:04

Confirmation email

  • Villa address is incorrect - needs to be villa specific
  • Contact tel number is incorrect  - needs to be villa specific
Complete
09-Oct-2026
06:56

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
09-Oct-2026
06:56

Export and imports 

  • Build export and import for Bookings (SN to do)
Complete
09-Oct-2026
06:56

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
07-Oct-2026
07:52

On mobile

  • Date fields are not aligned nicely
Complete
07-Oct-2026
06:47

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
06-Oct-2026
09:44

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
01-Oct-2026
11:11

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
01-Oct-2026
11:11

Main CyprusVillasDirectHomePage

  • This should show ALL villas
  • See https://www.villaplus.com/  
    • 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
01-Oct-2026
11:11

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
23-Sep-2026
08:34

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
23-Sep-2026
08:15

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
23-Sep-2026
08:15

Calendar synchronisation with Airbnb

  • 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
ATS Template #: 196
26-Oct-2026
12:41

CMS export.

  • Allow export of the actual copy to enable upload into ChatGPT etc
Complete
16-Oct-2026
09:44

Business contacts

  • Buttons at the top to be sorted in ranking order not alphabetically (SN to do)
Complete
16-Oct-2026
09:05

CMS Photo

  • If the English text (for the title) is not translated into all the available languages show a warning sign
Complete
07-Sep-2026
10:40

User - Email to UserGroups

  • Email sending error
Complete
27-Aug-2026
10:09

Business Contacts

  • Add Town/Region
  • Show distance from home venue
  • Add all emergency and health contacts
Complete
27-Aug-2026
00:01

User Import

  • Make flexible so that it looks at the title of the column to determine the field to populate
Complete
25-Aug-2026
17:29

User

  • Groups (eg London. Cyprus.  Tennis). And messages by group.  Send all or by one
Complete
24-Aug-2026
10:32

CMS formatting

In Techarete the CMS edit does not increase the height of the edit box

Complete
—

Contact form

  • Fails to create a Website contact anymore
Complete
—

Contact form

  • No longer saving a record in Website Contacts
Complete
—

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
—

OfficeAddress

  • Why doesn't it occupy full page, especially on mobile?
Complete
—

SQL download

  • Learn how to import into local
Complete
—

HomePage

  • Allow multi-selections in the Contact Us form
  • Add Product-include in Contact form field

 

Complete
—

Useful files

  • E-mail functionality doesn't work
  • Edit issue
Complete
—

User

  • Reset passwords etc
Complete
—

Photos

  • Header Link should go to the Show By Location if sole location
Complete
—

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
—

Users

  • Link the list of fields viewable to the CompanyDetails settings
    • Home Address
    • Business Address
    • Personal Details
    • Job Details
Complete
—

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
—

Create a Help entity

  • Ability to show video of implementing each function
Complete
—

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
—

Product List

  • Button to make Active/Inactive from the Index
  • Buttons to Change the Ranking and Renumber
Complete
—

Translations

  • Create import/export buttons for the translations
  • Replace records with same English
Complete
—

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
—

CMS Photos

  • Movie files in Interests/Products or Home page don't seem to size correctly
Complete
—

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
—

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
—

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
—

Map Icons

  • Button to delete icons and hide/show the form field as appropriate
Complete
—

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
—

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
—

Company Details

  • Need to make email and Default password mandatory, if using the contact form. 
Complete
—

Referrals log

  • Date Time function
Complete
—

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
—

Photos

  • In the CountService, for the CountPrivateLocations, don't just count those Private locations, but those where the user has access to
Complete
—

HomePage (Photos only)

  • Closer together
Complete
—

ATS Company Details Show

  • Fix slider
  • hide facebook months and registration email if deselected 
Complete
—

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
—

Email server

  • Emails failing in many projects
Complete
—

Home page (photos only)

  • Looks terrible on Ipad Pro 
    • Looks ok on iPad Mini
Complete
—
  • 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
—

User

  • Add photo, which should be part of personal details
  • Improve views
Complete
—

Business Contacts

  • Counter fix.  Don't display Business Types if Counter =0
Complete
—

Products

  • CkEditor in Products
Complete
—

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
—

Photo Locations

  • New Photo Location creates an error
Complete
—

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
—

User

  • Reset password doesn't work
Complete
—

Website contacts

  • How do I see what Product they are interested in?
Complete
—

Security

  • Email verification for New users
Complete
—

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
—

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
—

Login Direction

  • Doesn't seem to do anything anymore
Complete
—

Logout time

  • How do I control the time til the systems logs you out?
Complete
—

User Log

  • Edit function error
Complete
—

Backdoor

Doesn't work: Password Encoder error

Complete
—

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
—

Website contacts

  • Ordering of products according to ranking
  • Similarly in email
Complete
—

Weather

  • Index - Link to the live google weather page doesn't find the location specfied
  • Create a daily chron job
Complete
—

Edit the bat file to add the new project specific inflation 

Complete
—

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
—

Facebook Groups and Products

  • Not sorting
Complete
—

Header & Footer

  • Product list should be sorted by Ranking number 
Complete
—

Instructions

  • Import Media file
  • Display media file
  • And launch
Complete
—

QR page

  • Look and feel on full and small screen
Complete
—

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
—

Users

  • Edit User fails because
    • Password is not visible
    • If the user has 2 or more than 3 names in the fullName 
Complete
—

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
—

Company Details

  • Include Contact Details or not in the headers
Complete
—

Server clean-up

  • Button to clean up the attachments for all directories
  • Button to import the mapicon files 
Complete
—

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
—

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:

  1. 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:

  1. zoomLevel = maxZoom - log(d / maxDistance) * scaleFactor
    • 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
—

HomePage (Photos) and Interests Page

  • If the hyperlink is blank it should do anything when clicked.
Complete
—

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
—

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
—

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
—

Company Details

  • Doesn't save the Driving Instructions. Can't save edits
  • Wrap google map link
Complete
—

Website contacts

  • Add a delete all button
  • Include the phoneChceker into the index view
Complete
—

Project specific landing page post login for different access rights

Complete
—

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
—

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
—

Photos

  • Individual photo doesn't resize well when viewed by a mobile
Complete
—

HomePage - All photos

  • The photos don't have the hyerlink or the title pop-up working

 

Complete
—

Header

  • Useful links show/hide doesn't seem to be in all projects
Complete
—

Multi-lingual

  • Make the titles in Indexes language-specific
Complete
—

Competitors

  • Improve field names
Complete
—

User Import

  • No longer works as the SetRoles line needs to reference the Roles entity
Complete
—

ROLES

  • Doesn't seem to work

User

  • Photo field showing when populated.   
Complete
—

Photos

  • E-mail fails
  • Handling of favourites

 

Complete
—

User log

  • Build out a more comprehensive user tracking log.  Not just logins .  Google analytics
Complete
—

Business contacts

  • The File and Photo fields show when not empty.  Copy JS found in Company Details Edit form
Complete
—

Header

  • Photo Gallery and Photos appear twice in the Header if logged in as ADMIN
Complete
—

Useful Articles

  • Create a “Useful articles page” with some helpful topics.    
Complete
—

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
—

Delete from phphmyadmin:

  • aphroditetenniscup
  • chartwellcourt
  • irishpassport (dev name is irishpassports)
  • parknride
  • visitweimar
Complete
—

Multi-currency flags don't work

Complete
—

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
—

Instructions page

  • Nesting problem
Complete
—

User

  • Default language - order by ranking
Complete
—

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
—

Helpful guides

  • Seems to take Products as well as Helpful Guides.   Do I need the checkbox if picking Helpful Gudes?
Complete
—

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
—

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
Complete
—

User photo 

  • Delete doesnt work
Complete
—

Photos

  • Handling HEIC photos
Complete
Complete
—

Office directions

  • Ensure is multi-lingual
  • Waze icon
Complete
—

User import

  • Doesn't seem to work
Complete
—


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
—

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
—

Login Direction

  • Table too wide

 

Complete
—

Photos

  • Don't change the filename upon upload
Complete
—

CMS Copy

  • Sort the CMSCopy by Product ranking
Complete
—

File Attachments

  • The delete file button doesn't work and the file input is viewable when populated
Complete
—

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
—

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…

For example, have a look at this site for example:   https://www.stgeorges.ch/school-life/school-transport and specifically at this subpage:   https://stgeorges-enrichment.lovable.app/

Things we can;t do:

  • Grid of links under Enrichment Activities or
  • Carousel under the World Class Facilities. 

 

In ATS

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
—

Homepage link

  • Include a icon for the jump to the homepage
Complete
—

Homepage

  • Skinny up the Contact us block.  Looks silly so wide.
Complete
—

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
—

Translation

  • Dynamic languages in translation entity 
Complete
—

Company Details

  • Boolean checkbox can't not be checked
Complete
—

Products Index

  • Main/Sub label should follow the label in the CompanyDetails 
Complete
—

CMS

  • Launching the photo into view mode doesn't work
Complete
—

Products

  • Re-numbering/re-ordering button
Complete
—

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
—

Weather

  • Weather refresh is only every 3 hours
Complete
—

Company details

  • The show pages is not device responsive.  Unreadable in mobile
Complete
—

User

  • Languages spoken
Complete
—

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
—

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
—

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
—

Languages

  • Confirm you can delete an icon from within a record
  • Save file name in lowercase upon saving or editing
Complete
—

User log

  • Create a user log for pages visited even if not logged in
Complete
—

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
—

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
—

Multi-lingual support

  • Registration e-mails
  • Products in Menu
  • Menu titles
Complete
—

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
—

User

  • The display parameters in CompanyDetails no longer seem to trigger different displays in the User form
Complete
—

CSS

  • Seem to have lost some CSS (eg the formatting of CKeditor)
Complete
—

Delete ChartwellCourt and VisitWeimar

  • I have deleted the project on C,  and the git repositories
  • Please delete anything else?
Complete
—

Security/Login

  • I can login with a new user if their access is Admin or Super_Admin,   but not User (ROLE_USER)
Complete
—

Photos

  • If the photo file is missing, you can't delete the record
Complete
—

Clear all attachments

  • Button to clear public directory - assume that the directories will be made as files are saved for the first time?
Complete
—

 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
—

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
—

Chrome vs Firefox

  • The login script doesn't work in Chrome
Complete
—

vCard export (Team Bio)

  • Can't handle a birthday (string expected)
  • Check all fields in user and business contacts
Complete
—

SQL Upload into Live

  • How do I upload my local sql into the live server?  TennisFInder.sql
Complete
—

Bugs

  • CMS_photo view requires login, so errors for non users
  • The secret wizard (pending reach-outs) is viewable by all
Complete
—

Footer

  • Don't display Product title if count = 0
Complete
—

Autologin

  • Check auto-login is working.
  • Pause for bookmark
Complete
—

Database download

  • Test the download database required to copy the live database to dev
Complete
—

CSS 

  • Should these files be copied from the ATS Template?
Complete
—

Dynamic Header

  • Review the include/exclude logic
Complete
—

Competitor

  • Get Location buttons don't work in Index or Show
Complete
—

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
—

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
—

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
—

Languages

  • Can't edit any record.
Complete
—

Company details

  • Change the vCard download to the posh one 
Complete
—

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
—

Header

  • Include a checkbox that says include Photo in the Title when not logged in. 
Complete
—

Header

  • Photo header appears if there are no photos stored
Complete
—

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
—

Business contacts

  • Handle re-imports well
  • if a field is updated in import then import it, otherwise don't change
Complete
—

Helpful files 

  • View of Useful URLs on the mobile
  • Email fails with one file
  • Email fails when more than one file (different error)
Complete
—

User Indexes

  • Dynamic control of sorting in Index 
Complete
—

Business Contacts and Competitors

  • The export function should mirror the import and add back in the Company name accordingly
Complete
—

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
—

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
—

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
—

User registration

  • More elegant handling of a duplicate user
Complete
—

Contact Us

  • Don't show the Interested in… and list of Products if there is only 1 product on offer
Complete
—

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
—

Languages

  • CompanyDetails page fails if no languages in database or no English
  • Doesn't seem to work in TennisClub.
Complete
—

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
—

CMS

  • On each product.html page include a link for admin to the product. To change the name of the product
Complete
—

Multi-lingual

  • In Company Details control the default language, with one setting being to look at the browser language?
Complete
—

Business contacts map

  • Map not displaying
Complete
—

Products

  • Deleting a Product when the CMS is populated drives an error
Complete
—

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
—

Multi-Lingual (Languages)

  • Flag import fails.  Possibly because file already exists?
Complete
—

Registration

  • Email fails
  • Need to test the full process
Complete
—

Map Icons

  • New/Edit:  Selection of icons to be sorted alphabetically
Complete
—

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
—

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
—

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
—

Login Directions

  • Functionality doesn't seem to work
Complete
—

Business contacts

  • Test that the file attachment and photo get deleted if you delete a contact
Complete
—

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
—

WhatsApp number

  • Develop a service that checks if a number is a valid WhatsApp number or not

 

Complete
—

Doctrine update - Entities not working

  • Instructions
  • Weather
  • Facebook Groups
  • Competitor
  • Competitor Service
Complete
—

Check backdoor functionality

  • Doesn't work in ComfyCats (live)
Complete
—

Company Details 

  • Button to add Longitude and Latitude into the Company Details record
  • Can't save changes (since adding Photos)
Complete
—

Photo Gallery

  • Email button doesn't work
  • Favoured/unfavoured button don't work
Complete
AX Tools #: 43
—

Transfer

  • Clicking out an accommodation does not delete it
Complete
—

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
—
  • 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
—

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
—

Transfers

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

 

Complete
—

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
—

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
—

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
—

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
—

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
—

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
—

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
—

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
—

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
—

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
—

Affiliates

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

Accommodation

 

Resort contacts

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

 

Clients

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

 

Complete
—

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
—

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
—

Customer confirmations

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

Booking

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

 

Imported emails

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

Confirmations

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

 

Complete
—

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
—

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
—

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
—

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
—

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
—

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
—

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
—

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
—

Populate flights

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

 

Complete
—

Transfer_macro

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

Live site.

  • Setting up the login https://axtools.atts-systems.com/backdoor   causes an error. This is part of ATS, but I can't replicate on ATS
    • “An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'pause_for_bookmark' cannot be null”
Complete
—

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
—

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
—

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
—

Client confirmations

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

Email fragments

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

 

Complete
—

New Booking.

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

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

  • The dropdowns are slow and repeatedly trigger.   Most notable is for the Client Name/email/tel  and the flight details
Complete
—

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
—

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
—

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
—

Client phone numbers

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

Client site (public pages)

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

Dashboard

  • Create a AXTools specific dashboard (ie not Standard/Advanced) as this is getting crowded
Complete
—

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
—

Calendar page

Complete
Payroll #: 8
—

Payment Made

  • Ability to add multiple in one pop up
Complete
—

Payments made

  • Summary table by month that shows:
    • Month
    • Total # of payments
    • Total $ amount
  • Duplicates produced on import
  • Checked versus bank flag
Complete
—

Objective is to do AVS and other payment calculations.

Strip out of AX tools

Complete
—

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
—

 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
—

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. 
Complete
—

Forms

  • Share all the Official forms required for Payroll
Complete
—

Have a look at http://hr.alpinexpress.com/admin/dashboard

  • Login: VBC
  • Password: Sn0wman!
Complete
LinkSync #: 15
22-Sep-2026
09:20

Homepage

Improve the front end given the new CmsCopyItems 

Complete
—

Scheduling the scrapes

  • 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)
  • I have created a linked-inexport@atts-systems.com email address (password Descartes99) for the email to be sent from
Complete
—

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
—

Search

  • Ability to build a search that they can save  (eg Re-run JPM XVA guy)
Complete
—

Search

  • Add a gender and languages spoken selector
Complete
—

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
—

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
—

Languages

  • For every connection that doesn't have a languages section, we save a ‘null' results   
    • We shouldn't save the null case
    • https://linkedinexport.atts-systems.com/languages_spoken/index

Birthday

  • 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
—

Reports

  • Build Industry and Candidate Moves reports
Complete
—

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
—

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
—

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
—

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
—

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
Complete
—

LinkSync User view

  • Error due to PhoneAnalyzer
Complete
Immigration Services #: 3
—

Flight scrapper

  • Copy over from stephen-nurse.com
Complete
—

Need to upgrade all the controllers/forms

Complete
—

eMAIL

  • Include the email upload functionality (similar to AXTools)
Complete
Criminal Record Checks #: 2
—

Signature 

  • Insert the signature image into the Authorisation Letter and the Application Form
Complete
—

Text for CRC

Application forms can be obtained through the Internet from the official Police website: www.police.gov.cy - Previous Conviction Registry

Every application must be accompanied by:

  1. An official receipt for the payment of the amount of €20.00.  The payment could be made:
  • in cash at any Divisional Police Headquarters or at any Embassy or Consulate of the Republic of Cyprus
  • remittance to the Central Bank of Cyprus in the name of the Chief of Cyprus Police
  • (SWIFT CODE CBCYCY2NACC, Government General Account, account no. CY1600 10000100000000006001010) -only in Euro
  1.  Identity Car, Passport, for Cypriot citizens
  2. Alien Book, Pink or Yellow and passport for Aliens
  3. Written authorisation in case that the application is submitted from a third person besides the applicant.

Note: The content of this application are subject to the provisions of the General Data Protection Regulation (EU) 2016/679 and of the Law 125(1)/2018

Complete
Tennis Finder #: 18
—

Court and Player Availability

  • Courts and players view needs work
Complete
—

New venues

  • Define the defaults and make fields nullable to enable quick saving of new venues (partially done, but need to change the Edit function)
  • Import: MyCourts venues 
Complete
—

Tennis Venues

  • 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
—

Venues 

  • Show all venues on a single map (multiple dots)
Complete
—

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
—

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
—

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
—

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
—

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
—

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
—

Helpful links

  •  https://breakstolove.com/
Complete
—

ATS Template upload

Complete
—

Tennis Venues

  • Show the court surface/floodlights details in the booking popup
Complete
—

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
—

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
—

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
—

Scraping

  • Check performance now we have 20+ sites live
  • Complate the ParkSport scrape (very similar to ClubSpark) 
Complete
—

Tennis venues

  • Complete update of all venue details 
Complete
Whistles & Bells #: 2
—

Client Details

  • Hide Long and Latitude as an input.  
  • Show map icon
  •  
Complete
—

Whistles and Bells

  • New Dog, New Client Details
Complete
Tennis Club #: 1
—

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
Financial Advisor #: 5
—

News coverage

  • 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 
  • Link to news scrapper
Complete
—

Financial advice and also generic website template

  • Create a copy of SN, and strip out all non-investment sections
  • Then copy and strip out everything except the user, CMS and basic framework
Complete
—

Updating contributor site

  • Rich text editor for the Summary and Comments fields
Complete
—

Updating Podcasts

Goal

I want to:

  • Track the top 5–10 podcasters in Personal Financial Advice
  • Pull in their latest podcast episodes automatically
  • Then manually add summaries, topics, and comments

How It Should Work

1. Podcasters (Directory)

Page: http://localhost:8000/podcast/directory/

Contains:

  • Podcaster name
  • Link to their YouTube or Apple channel

2. Episodes (Output)

Page: http://localhost:8000/podcast/episodes/index

  • This is where all scraped episodes should appear

 

What the Scraper Should Do

On the Episodes index http://localhost:8000/podcast/episodes/index, when the  “Update (scrape)” is pressed, the scraper: 

  • Goes to their YouTube channel
  • Find their Videos episodes
  • For each episode, store:
    • YouTube URL
    • Podcast title
    • Date published (open link)
    • Duration (if possible)
    • # views
  • Save the episodes into the database (avoid duplicates (don’t re-save the same episode)

What I Will Do Manually

  • Add topics
  • Write summaries
  • Add comments

Current Problem

The “Update (scrape)” button does nothing

  • No data is being pulled in
  • No error message is shown

 

Technical comment

  • I noticed if you open up a link to a video in YouTube you can see : 
    • Date of the podcast
    • # views

 

  • Does it make sense to first scrape the links from the Podcast subscriber view (eg https://www.youtube.com/channel/UCLXQalldcm6gMYMQfLMliww)   and then open each one (each an episode) to capture the  date and views data?
  • Also can we capture the text below the date/views (save in the “summary” field) and also pull in the ‘transcript’ (new field called ‘transcript’)?
  • My idea is that I could then get ChatGPT to summarise each podcast from the transcript? 

 

 

Complete
—

Mortgage

Background (Non-Technical Explanation)

  • A mortgage is a loan used to buy a property (house or apartment).
  • The borrower repays the loan over time with interest.

Key Concepts

1. Interest Rate

  • This is the cost of borrowing money, expressed as a percentage per year.
  • Example: 5% means you pay 5% of the loan amount per year as interest

2. Fixed vs Variable Mortgages

Fixed Rate Mortgage

  • The interest rate is locked (fixed) for a set period

Common fixed periods:

  • 2 years
  • 3 years
  • 5 years
  • 10 years

Example:
“5-year fixed at 4.5%”
→ Rate stays 4.5% for 5 years, then changes

Variable Rate Mortgage

  • The rate moves over time (can go up or down)
  • Often linked to central bank rates or market rates

3. Fees, Cashback, Legal/Valuation Frees/Other terms

Mortgages often include upfront costs:

  • Fixed fee (e.g. £999)
  • Or % of loan (e.g. 1%)
  • Cashback (essentially a negative fee)
  • Maximum Loan-to-Value (LTV)

These must be included when comparing deals.

4. Why Compare Mortgages?

The goal is to find the cheapest total cost, not just the lowest rate.

 

======================================================================

2. “Swap Rates?” (Important Context)

  • 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
  1. Fixed amount (£)
  2. Percentage (%) if available
  3. 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

 

Complete
Stephen-Nurse #: 139
27-Oct-2026
11:47

Flight pages

  • Add a timestamp to the flight scrape
  • Add a setting in settings for how ‘stale’ a flight scrape can be before it is deleted/hidden
    • Display #days in brackets
  • Enable users (not just Admin) to refresh flights
    • Add +7D button next to a stale flight that scrapes the next 7 days
Complete
27-Oct-2026
11:03

To Do List

  • The Top Priorities are not sorted by project
Complete
29-Sep-2026
21:29

Flight scrape

  • Stops after a few days
Complete
29-Sep-2026
17:10

To Do List

  • When deleting an item, return them to the page they left from. ie the filtered index page
Complete
29-Sep-2026
17:00

Useful files

  • New - Formatting doesn't work
  • Index - formatting
Complete
23-Aug-2026
22:07

Flight routes

  • Button to reset all route dates to the default in the view
  • The dropdown list includes airports not in flight prices.
  • Remove ‘Are you sure’ when clicking Admin or Active on/off
  • In House Calendar view have a link to the Flight Destinations, not just New destination

 

Airport view

  • Show Active and Inactive in two tables side by side
Complete
23-Aug-2026
21:45

Birthdays

  • Go through an old Contacts saved file and check the birthdays vs current
  • Best to do with 2 screens
Complete
23-Aug-2026
21:45

Server problem

  • Can't edit (change status) of a ToDoList item
Complete
23-Aug-2026
21:44

To do list

  • Add a date completed field 
  • For completed tasks, sort by date completed
Complete
—

ToDoList

  • The list of projects at the top of the page look
    • If RoleAdmin show all projects 
    • Also for adding new projects
  • Allow non-admin to access the +/- button
  • Sorting broken
Complete
—

To Do List

  • Button to collapse all the projects. 
  • Pressing the Admin-ToDo List should trigger this button
Complete
—

Tourist Attractions

  • For both the download GPS locations, and the clear GPS locations, do an on-submit check
  • The desktop/mobile distinction doesn't work anymore
Complete
—

House Guest

  • Create ability to put in notes (eg need to fly to Frankfurt, dentist appointment etc)
  • Will entail having a ‘blank’ guest, which does/doesn't trigger a blockout period
Complete
—

CV

  • Emailing of CV doesn;t work
  • Emailing of Useful files doesn't work either
Complete
—

Fixed Rate Deposits

  • Separate by category
  • Add a field for if an EBT (list the 3) so we can build a view of the value of the EBTs separately
Complete
—

Useful links

  • Deleting useful links button doesn't work
Complete
—

House guest

  • Doesn't look good in mobile
Complete
—

Flight destinations

  • They seem to have been deleted.   Crawler/bot problem?
Complete
—

Flight Destinations

  • Add buttons to include/exclude
  • If excluded (inactive), don't include in scrape
Complete
—

Useful links

  • Add an entity that dynamically allows new categories for useful links
Complete
—

User import

  • Handling conflicts and allocation of contacts to Business Contacts
Complete
—

Useful files

  • ChkEditor added to base.html but didnt work when added to new and edit file.  Why?
  • Size of text box 
  • Email doesn't work on live, but works on dev
Complete
—

To Do List

Clicking on the project should reset the index to that project, similar to the buttons above

Complete
—

JPM share price

  • Ability to import JPM share price daily
Complete
—

Settings

  • Create a control function to determine if the various Interests tabs are shown
Complete
—

Helpful files

Complete
—

Recruiters

  • Firstly, before uploading the new User entity from ATS Template,  fix the current Recruiter links in the dashboard
  • Create new entity for Recruiter that is is linked to User
    • Includes Region, Priority and Area of interest and also tracks email sent and received
    • Creates a new User if User does not exist
      • User list export to Outlook includes the Recruiters.
Complete
—

To Do List

  • In the Projects list have a flag for whether the live website is working or not
  • In the ToDoList items, show that checkbox and in the title show the C:\dev directory name
Complete
—

ToDoList

  • Copy buttons
Complete
—

Travel Notes

  • Make it a long text format. 
Complete
—

Birthday cron

  • No longer works
  • php bin/console app:send-birthday-reminders works ok, so it is just the cron 
Complete
—

Base contains entity specific formatting  

  • Why do these have to be in base.html? Can we put it in the edit.html for each form? 
  • Would that be quicker?
  • This includes form specific details (Editor).  
Complete
—

CMS Photo and Company Details not pushing through to Live

In Company Details hide the Favicon and QR fields when completed

Complete
—

FX Rates

  • Write a Service to find the FX Rates on the AsOFDate
  • Write a chron chron job to save the FX Rates each day
  • When updating the FX Rate button, show the date and also update the Historical FX Rates 

 

Total PVs

  • Total computation doesn't work.
  • Compute total in GBP or USD
Complete
—

House Guest/Flights

  • Include a date range for each flight combination
Complete
—

Days out of UK 

  • Compute the days in each country in UK tax year
Complete
—

To Do List

  • The Project should be the default choice but editable.
Complete
—

ToDoList

  • When you Save and Close a ToDoList entity it returns you to the Pending Items for that project
Complete
—

To Do List Item

  • The attachment field has fallen off the bottom
Complete
—

Helpful files (File Attachments)

  • The “Notes” appear to delete upon saving
  • Ability to delete each file attachment individually
  • E-mail functionality only works in local
    • Check including multiple files
Complete
—

Users 

  • Handling of Recruiters and other ‘role-conditional’ fields when editing a User
  • Birthdays: Cronjob that Sends email to SN to warn of a birthday next [3] days 
Complete
—

Flights

  • Scrape time not in the correct format
  • New entity to define destinations. 
  • Button to create the “Return” leg that 
    • Add a new field for “Return leg”
    • And an Order field?
  • Numbering of routes to group them in pairs.  
Complete
—

Photos (tennis)

  • Why don't some of the photos show?

Copy

  • Improve the copy for various Interests pages
Complete
—

HouseGuest

  • Add a button to scrape the one destiniation/route only. 
  • Copy over to Immigration Services
Complete
—

Users

  • PaulCoolen example. (paulcoolen@gmail.com, federer)
    • When he edits his profile, he shouldn't be able to change :
      • Company field  (rename as SN Category).  In fact hide this from the non-admin user
      • Londoner checkboxes
      • Save buttons- don't show the send welcome email button
      • Webpage seems to want to populate with my sn email address?
Complete
—

Photos

  • What photos and videos can I upload.  Different formats for photos and movies
Complete
—

ToDoList

  • Needs Research.  Field options should be:
    • No
    • Yes - Minor
    • Yes - Major (beyond skillset)
  • Include in view the Needs Research and Hours Allocated fields
    • :Research needed displayed as coloured blobs
      • No - Yes
      • Yes - Minor - Orange
      • Yes - Major (beyond skillset) - Red
  • Fast buttons:
    • Edit the Needs Research field
  • Hours Allocated field
    • Limited to positive numbers
    • Only shows when Yes-Major (beyond skilset) is picked
  • Move the Needs Research on the same line as Hours Allocated to prevent wrapping. 
    • Reduce Status, Hours Allocated and Needs Research to col-1 
    • No delete button?
    • Height is too high
  • Edit the title on the ToDoList to remove the words “Project item”
  • Create a Save, but don't close button? (equivalent to Control-S).  
    • Can one create fast keys?

 

Complete
—
Make to do list viewable on the phone
Complete
—

Contact details

  • Remove the VCF if in Mobile mode
  • Add a QR code with my VCF details on the home page
Complete
—

ToDo List items

  • Format of rich text.  Can't see bullet points, colour etc
  • Make readable without a login, but not editable
Complete
—

ToDo List

  • Include buttons at the top to show each Project 
    • Reduce the view to the list of ToDos in that specific project  
Complete
—

Photos

  • Thumbnail view vs full view 
Complete
—

Guest View

  • Can I freeze the pane in a table
Complete
—

Users

  • Duplicate users when importing from Outlook don't look too different
  • Deleting users creates an error
  • Add Recruiters-All
Complete
—

Security

  • Photos link doesnt work for Sandra
Complete
—

Why isn't ATS appearing in the list of projects in the ToDo List?

Complete
—

Tourist Attraction

  • Photo doesn't seem to work
Complete
—

Flight destinations

  • Default is ‘IsActive’ = Yes; ‘IsAdmin’ = No
Complete
—

Flight destinations

  • Add country to the airport, and sort the list
  • Ability to create a return journey with one click
    • Popup:
      • From,  To..
      • Then creates 2 entries, one outbound, one return, with a grouping of max current plus 1
Complete
—

Todo list

  • Sort the list of Project buttons alphabetically
Complete
—

ToDo List

  • Create a Save button that Saves the ToDlist item and reopens it. 
  • Perhaps show in red the latest saved time in the edit view next to the button
Complete
—

ToDo List

  • Buttons to flag priorities as Top or not
Complete
—

To Do List

  • When a new Item is added, inherit the Project name from the location of the button
Complete
—

Useful URL

  • Mark as either Public or Private
    • Private only viewable by ROLE_ADMIN
  • Doesn't sort when not logged in as Admin
Complete
—

Photos: Mobile version

  • Buttons, 
  • Full page view of the specific photo
Complete
—

Blood tests

  • Can't select by date
Complete
—

Photos

  • Link may not work
Complete
—

ToDo List (Project Priorities)

  • Doesn't sort by ATS-upload date
Complete
—

To Do List

  • Sort the buttons alphabetically in the New ToDoList by project name 
  • Change width and height to remove need to scroll
Complete
—

Tourist attraction

  • Can't delete
Complete
—

Need to provide a MTM over-ride on the loans

Complete
—

Helpful files

  • Main notes don't save
Complete
—

Map icon import fails (similar to Whistles and Bells)

Complete
—

User - Messages and Londoner

  • Create “Outreach” entity
    • User (relational)
    • Category
      • Visiting London
      • Festive message
        • Festive message
        • Message sent timestamp
      • Recruiter
  • Create “OutreachTemplate” entity
    • User Category 
Complete
—

Medical Test Results 

  • Does not sort correctly
Complete
—

Photos

  • The page that directs users to the location of the photos doesn't work well on mobiles.  Reduce width
Complete
—

CMS

  • Remove edit link (for Admin) and replace with a separate fa-pen link
  • Similarly for photos
  • Update CMS for the Interests pages
Complete
—

UK days count 

  • Colour coding for the background colour for the tax year
  • Ability to load up multiple attachments rather than just one
  • Day count on each line.  A service?
Complete
—

To do list

  • Formatting of this section.  Why light grey - unreadable
Complete
—

ToDoList:

  • Can't delete a ToDo List item
  • Error message when saving a new ToDoList Item or deleting an item
Complete
—

Weather and Company Docs

  • Link to GPS picture. 
Complete
—

To Do List

  • In the buttons, include a count of Pending items 
  • Sort by # of Pending items or can we sort the buttons by priority?
Complete
—

File Attachments (Useful files)

  • Errors when editing
Complete
—

Photos

  • Only be able to delete your own photos 
Complete
—

Photos

  • Clean up the photos directory in live server
  • When deleting a photo,  delete the file to save disc space
Complete
—

Bank balances -New in Dev

  • Error: IntlException HTTP 500 Internal Server Error - datefmt_create: invalid locale: U_ILLEGAL_ARGUMENT_ERROR
  • I have seen this multiple times.  Why does it occur and how do I correct?
Complete
—

Garmin files

  • ChekEditor
Complete
—

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
—

Email

  • Email to be able to be sent from the logged user rather than the same email address for all user
Complete
—

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
—

Security on ToDoList

  • Buttons for only the relevant projects
  • Dropdown list of the relevant projects
    • Access rights to the Add ToDoList projects
Complete
—

To Do List

  • Clicking on a Project button should take you to the list by that project, but to the Pending items
Complete
—

On local, no favicon 

Complete
—

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
—

ToDoList

  • Error attaching attachments and deleting records
Complete
—

User View

  • Why do the buttons not spread across the page?
Complete
—

Events listener

  • Appears on bottom of every page
Complete
—

Helpful links categories dynamic 

Complete
—

To Do List:  List of Projects

-New button has wrong URL

Complete
—

CV

  • Upload, download and Email CV doesn't work
Complete
—

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
—

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
—

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
—

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
—

Users 

  • Users: create a field for ‘ComingToLondon’ and Settings entry to type in the message
Complete
—

Emails

Complete
—

Flying 

  • Add save and re-edit button to the flying entity
  • Add a file attachment 
Complete
—

Todo list

  • Create and compete date.   Remove ranking in complete
Complete
—

To Do List

  • When you complete a task, save the date time Completed and save chronologically. 
Complete
—

CKeditor formatting 

  • On ToDoList Items and Projects
Complete
—

To Do List Projects

  • Filter for Active/Inactive projects
  • Sort by Latest ATS update
Complete
—

Flights

  • Improve the line on left/right 
Complete
—

To Do List

  • Only show projects with non-zero items
Complete
—

ToDo list item

  • Make the default setting for Status to be Pending
Complete
—

Email

Complete
Complete
—

UK Days

  • JSON file field still showing
Complete
—

Flights

  • 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
—

To Do List

  • Delete button shouldn't require a Check
  • In the Index, the indentations don't show
    • Second indentation
      • Third indentation
Complete
—

Useful files

  • Unable to edit
  • Hide the input field if populated. Tidy up the show form.
Complete
—

Photos

  • Edit the screen that allows me (Admin) to pick which location to see.  
Complete
—

Project TO-Do List Priorities

  • Need the EditorChekr for the summary of each new project
Complete
—

ATS Update (Paginator)

  • Causes an error
  • Note the additional processes needed for all updates (save in update.bat in notes)
Complete
—

Emails - Chron job?

  • Emails getting sent and returned?
Complete
—

Latest git pull failed on live

Complete
—

ToDo List

  • New does todolist_item not formatted the same as Edit.  
    • Edit box is smaller
Complete
—

Londoner email

  • Londoner email functionality

 

Complete
—

Flights

  • Kayak scrape failing
Complete
—

House Guest

  • New: 
    • If ‘Internal Note’ or ‘Block Out’ is checked, it should hide the GuestName.
  • Email alert doesn't work
Complete
—

Helpful files

  • New and edit can't change some fields
Complete
—

Flights

  • Deleting a destination should delete flights
  • Copy destinations 
  • Multiple destinations 
Complete
—

Birthday

  • Cron job
Complete
—

File attachments

  • Multiple files not updating
Complete
—

To Do List

  • Sort the Projects by their Priority rank.
Complete
—

SQL Download

  • Error message on live  (works on ATS -Live)
Complete
—

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
—

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
—

Helpful files

  • In show, it shows the attachment icon when it is null.
  • Widen the notes column in view  - test on mobile
Complete
—

All projects

  • Button that downloads the Live database to the Local version doesn't seem to work on all sites.
Complete
Limassol School Run #: 4
—

Childrens index

  • Need a button that will show all the children on a map, with tooltip showing child/parent name and the pickup/drop off order number

Day log

  • Each day create log of pickup times and drop off times.

 

Payments taken entity

  • Start and end date of payments by child
Complete
—

Set up new project and live site 

Complete
—

Schools

  • Add the school logo
  • Make HomePage a collage of the school icons
Complete
—

Adding new entity

  • I can't seem to add a new entity to the project.  I think the setup may be incomplete
Complete
Tech Arete #: 6
—

Company Description: TECHARETE SYSTEMS LTD.

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
—

No password hasher has been configured for account "App\Entity\User".

Complete
—

Backup

  • Is there a way to export the live database and upload it to local an automatic basis
Complete
—

Page

  • The pages for each product don't look great on mobile
Complete
—

Live site no longer works after pushing changes to live. It is a simple copy of ATS template with no customisation

Complete
—

Create a “The Team” page

Complete
Yasser Physio #: 1
—

Day Dairy 

  • Example: https://yasserphysio.atts-systems.com/booking/day/2026-06-10
  • Tab title: should be the date (not ‘Day Diary’)
    • Ensure the Day can change with language picked
  • Top heading (in red H1), should again show the date eg  “Wed 10 June 2026” (in H1 red)
  • On either side of the date show << or >> to indicate a function to move back/forward 1 day
  • In the table, bold the times

 

When not logged in:

  • It shows an unwanted column “Client”.      Hide please
  • The first column… The phrase “Your appointment” isn’t necessary.
    • The first column should show the venue (i.e. “Pathos studio” (then show address and map-marker) or “Home” (then show address and map marker))
  • Add a second column:
    • Cancel appointment button
  • Add a third column for the repeat bookings (use a dropdown)
  • Objective is to get it all on 1-line
  • Make sure it looks good on mobile too

 

 

When logged in as a User 

 

 

 

 

When logged as ROLE_ADMIN

  • Add a fa fa-user icon that edits the User
  • Be able to take a payment from the Day view screen 
  • Show balance of kitty for each client -new column after telephone
    • (Note: the balance should not include Future bookings – ie if someone books 5 appointments now, it should not show €500 owed…. Just €100 on each)
  • Show the eye icon to Show the booking (rather than clicking on the name) – new column at the end
  • Show the pen icon to Edit the booking  - new column at the end

 

Complete
Thea Vista Pissouri #: 3
—

New booking

  • Implement minimum stay parameter, additional guest surcharge as required
Complete
—

Translation

  • Translate copy and all headings into required languages (to be agreed with John and Catherine)
Complete
—

Booking process

  • Create ‘Flying from’
  • Make booking ‘Pending’ until confirmed by John/Catherine
Complete
News-scrapper #: 34
—

Market Data

  • Future T+2 data….  
Complete
—

Market stats

  • Scrape doesn't work in live
Complete
—

Update scrapers which have broken over time

WorkingNot 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
—

User Passwords

  • List the users in alphabetical order
  • When you edit a User Password it changes the User name
Complete
—

LinkedIn Contacts

  • Deleting LinkedIn Contacts -just the owner's contact and the languages spoken
Complete
—

Favicon

  •  Not working, both in bookmark and in tab, but only when on the home page… Odd
Complete
—

LinkedIN scrape (https://www.linkedin.com/in/stephen-j-nurse/)

  • Include the summary experience and the employment history
Complete
—

LinkedIn Contacts

  • Don't save a Language Spoken for the null case
Complete
—

Login

  • Add ability to register
Complete
—

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
—

Linkedin contacts 

  • Create a User-Settings upon scrape
Complete
—

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:
    • Headline categories (eg Macro, CV19, Corp, Cryp, Pol, Ukraine, Clearing, x)
    • What to include/exclude for the email
    • What economic stats are key to them
    • Their own list of favourites and commentaries
  • 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
—

Settings

  • Add VCard code (Jeroen)
Complete
—

Favicon

Complete
—

Bugs

  • subscriptions_buttons line 45
    • Make this dynamic?
  • source\index line 43
    • Make this dynamic?
  • Favicon issue on live (when favcicon file exists)
Complete
—

 New sites to scrape

Complete
—

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
—

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
—

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
—

User memberships

  • Dates
Complete
—

CompanyDetails

  • The HideOther inputs not coming through into Live
Complete
—

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
—

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
—

User

Add time zones

Complete
—

Security

  • Add role heirachy in security.yaml
Complete
—
  • Review of security (Dashboard -changed to ROLE_USER)
Complete
—

Users

  • Delete doesn't work
  • Include in user view.
    • Membership
Complete
—

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
—

Removed the CMS and Settings entities

Why isn't LinkedIn password appearing on the list in a User's profile?

Complete
—

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
—

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
—

Economic Market Statistics

  • Chron job.  Refresh every 15mins
    • Button to refresh manually if >10mins 
  • Historical view by stat
Complete
—

Bugs

  • Merge the ‘Highlight/Standard/Low’ buttons into a pop-up.  To avoid confusion. 
  • Set User bug in Market Stats
Complete
—

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
Complete
XVA Consulting #: 4
—

Dev→Live

  • 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
—

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.

 

 

XVA

1. Collateral optimisation/CSA renegotiation/Differential Discounting (DD) recognition

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
—

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
—

Consulting website

  • Create a new website that is largely a billboard site.  Call it “XVA Consulting” 
  • Create a live website and SSL
Complete
Irish Passport Consultants #: 1
—

Add a new project and site called “IrishPassportApplicationExperts.com”.

Copy from ATS

Complete
ParkRide #: 1
—

Initial setup

  • Create a live URL
  • Establishg the SSL
  • Get working for basic version
Complete
Aphrodite Winter Cash Cup #: 1
07-Sep-2026
10:55

Need to update the User entity to include Playing Singles/Doubles

Complete
Harcourt #: 1
—

User- Doubles Partner

  • Show?hide Doubles Partner if playing doubles
  • Present a list of player who are playing doubles, and not yet already taken
Complete
Personal Admin #: 1
—

Admin

  • Populate medical stats online 
Complete