Sounds like a very bad hack.
Zero mention of the word encrypted so clearly the information was stolen as it was inputted. This can only therefore be rogue code in BA's website, or a compromised third party hosted JavaScript library.
Given the stolen information was only personal and payment information it sounds like a compromised third party script used during the booking process and nowhere else.
Otherwise if you had access to add rogue code to the website, why would you stop at personal information and not travel or passport details.
We've seen third-party hosted library attacks a few times recently, and it is one of the reasons I dislike relying on third-party hosted content
....
Now, if the *developer* was to go to jail for errant and grossly negligent practices (i.e. using off-the-shelf code and libraries, externally hosted or not, with zero understanding or care of the potential implications), then perhaps these *ups wouldn't happen at all. As it stands we have an IT market flooded with polyglot morons who think plugging frameworks and libraries together like lego bricks is actually worthy of £600/day, before they run off to their next contract and leave the steaming pile of non-performant and insecure crap behind them..