Dúvida com lógica de recuperação de venda

Fala pessoal, estou nos finalmentes da minha aplicação, porém, cheguei em uma parte q me tomou alguns diass já, e é o seguinte, eu estou finalizando um sistema de frente de caixa e nele tenho um “backup” pra caso de um “pique” de luz ou algo que feche de forma errada a aplicação, e até ai funciona, me é retornado o id do cupom que eu utilizo para poder buscar os produtos cadastrados com aqueles itens, e ai que entra meu problema, na parte de finalização da venda eu consigo o valor total da compra, mas não se já foi pago algo, ou o percentual de desconto da compra, até tentei uma lógica mas na hora de validar não consegui pensar em nada…detalhe é que tenho 3 tabelas que compõe isto, Cupom, CupomItens, CupomMeiosPag, onde no primeiro é armazenado todos os dados do cupom, como datas, cliente, vendedor, etc. O segundo cadastra cada produto adicionado com o id do cupom, e o terceiro armazena as formas de pagamento e os valores(é a tabela que pensei em usar para poder fazer essa parte). segue meu código de “backup”->

public class RecuperaVenda {
	/* Esta classe fica responsável por pegar 
	 * vendas ainda não finalizadas('cupomfechado == false'),
	 * para recuperar os itens e valores em caso de queda 
	 * de energia ou semelhantesS
	 */
	
	private static BigDecimal prodQtde = BigDecimal.ZERO;
	private static BigDecimal valorTotalPago;
	private static double percDesconto;
	private static BigDecimal valorRestante;
	
	public static boolean isOpenedSale = false;
	public static boolean finalizaVendaIsOpened = false;
	
	public RecuperaVenda() {
		retrieveOpenedCupom();
	}

	//Pega o ultimo cupom aberto que tem e retorna o id do cupom
	public void retrieveOpenedCupom() {
		Connection conn = DefaultConnection.openConnectionADefaultConnection();
		ResultSet result;
		int idCupom = 0;
	
		try {
			Statement stmt = conn.createStatement();
			result = stmt.executeQuery("SELECT idcupom, valortotalpago, percdesconto, valorrestante FROM cupom WHERE cupomfechado = 'false' ORDER BY idcupom DESC LIMIT(1);");
			while(result.next()) { 
				idCupom = result.getInt("idcupom"); 
				if(idCupom != 0) {
					isOpenedSale = true;
					percDesconto = Double.parseDouble(result.getString("percdesconto"));
					
					Venda.cupom = new Cupom();
					Venda.cupom.setIdCupom(idCupom);
					retrieveCupomItens(idCupom);
				}
				else { 
					return;
					}
				}
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
				
	}
	
	//Recupera o codigo dos produtos baseados no id do cupom capturado acima
	private void retrieveCupomItens(int idCupom) {
		Connection conn = DefaultConnection.openConnectionADefaultConnection();
		ResultSet result;
	
		try {
			Statement stmt = conn.createStatement();
			result = stmt.executeQuery("SELECT codigo, qtde FROM cupomitens WHERE idcupom = '"+idCupom+"'");
			while(result.next()) { 
				String prodCod = result.getString("codigo");
				prodQtde = new BigDecimal(result.getString("qtde"));
				retrieveProductFromCupomIten(prodCod);
				}
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//busca pelos produtos com os códigos retornados acima e preenche na tela novamente
	private void retrieveProductFromCupomIten(String prcod) {
		Connection conn = DefaultConnection.openConnectionADefaultConnection();
		ResultSet result;
		List<Produto> produtoList = new ArrayList<>();
		try {
			Statement stmt = conn.createStatement();
			result = stmt.executeQuery("SELECT * FROM produto WHERE prodcod = '"+prcod+"'");
			while(result.next()) { 
				int idProd = result.getInt("idprod");
				String prodCod = result.getString("prodcod");
				String unMedCod = result.getString("unmedcod");
				String prodDesc = result.getString("proddesc");
				BigDecimal aliquota = new BigDecimal(result.getString("aliquota"));
				String cstCod = result.getString("cstcod");
				BigDecimal custoMedio = new BigDecimal(result.getString("customedio"));
				String cfop = result.getString("cfop");
				String iat = result.getString("iat");
				String ippt = result.getString("ippt");
				String horaEstImportacao = result.getString("horaestimportacao");
				GregorianCalendar dataEstImportacao = toCalendar(result.getString("dataestimportacao"));
				BigDecimal quantEstImportacao = new BigDecimal(result.getString("quantestimportacao"));
				BigDecimal quantFisica = new BigDecimal(result.getString("quantfisica"));
				BigDecimal precoLista = new BigDecimal(result.getString("precolista"));
				
				produtoList.add(new Produto(idProd, prodCod, unMedCod, prodDesc,
											aliquota, cstCod, custoMedio, cfop,
											iat, ippt, horaEstImportacao, dataEstImportacao,
											quantEstImportacao, quantFisica, precoLista));
				JFrameTelaDeVendas.getFrameDeVenda().numberTextFieldQtde.setText(String.valueOf(prodQtde));
				for(Produto produto : produtoList) {
						PreencheCamposTelas.glassNf(produto);
						prodQtde = BigDecimal.ZERO;
					}
				}
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	private static GregorianCalendar toCalendar(String dateToConvert) {
		DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
		GregorianCalendar cal = null;
		Date date = null;
		try {
			date = df.parse(dateToConvert);
			cal = new GregorianCalendar();
			cal.setTime(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return cal;
	}
	
	private static void retrieveOpenedPayment(int idCupom) {
		Connection conn = DefaultConnection.openConnectionADefaultConnection();
		Statement stmt;
		try {
			stmt = conn.createStatement();
			ResultSet result = stmt.executeQuery("SELECT forpagvencod, valorpago FROM cupommeiospag WHERE idcupom = '"+idCupom+"';");
			valorTotalPago = new BigDecimal(result.getString("valorpago"));
			valorRestante = new BigDecimal(result.getString("valorrestante"));
			
			JFrameFinalizacaoVenda.getFrameFinalizacaoVenda().textFieldTotalPago.setText(String.valueOf(valorTotalPago));
			JFrameFinalizacaoVenda.getFrameFinalizacaoVenda().textFieldDesconto.setText(String.valueOf(percDesconto));
			JFrameFinalizacaoVenda.getFrameFinalizacaoVenda().textFieldValorASerPago.setText(String.valueOf(valorRestante));
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

quem puder me ajudar com algum artigo, lógica ou tiver algum exemplo me ajudaria muito