/* * MIT License * * Copyright (c) 2018-2019 Daniel Cortes * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package danielcortes.xyz.models.caja; import danielcortes.xyz.data.DAOManager; import danielcortes.xyz.data.SQLiteConnectionHolder; import danielcortes.xyz.models.documentos.Documentos; import danielcortes.xyz.models.efectivo.Efectivo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; import java.time.YearMonth; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; public class SQLiteCajaDAO implements CajaDAO { private static final Logger LOGGER = Logger.getLogger(SQLiteCajaDAO.class.getName()); private SQLiteConnectionHolder connectionHolder; public SQLiteCajaDAO() { this.connectionHolder = new SQLiteConnectionHolder(); } @Override public List getAll() { List cajaList = new ArrayList<>(); try (Connection conn = connectionHolder.getConnection()) { String query = "select * from caja"; PreparedStatement ps = conn.prepareStatement(query); ResultSet rs = ps.executeQuery(); LOGGER.log(Level.FINE, "QUERY: {0}", new Object[]{query}); while (rs.next()) { Caja caja = new Caja(); caja.setId(rs.getInt("id")); caja.setFecha(LocalDate.parse(rs.getString("fecha"))); caja.setFondo(rs.getInt("fondo")); cajaList.add(caja); } rs.close(); ps.close(); } catch (SQLException e) { LOGGER.log(Level.SEVERE, e.toString(), e); } return cajaList; } @Override public Optional getById(int id) { Caja caja = null; try (Connection conn = connectionHolder.getConnection()) { String query = "select * from caja where id = ?"; PreparedStatement ps = conn.prepareStatement(query); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); LOGGER.log(Level.FINE, "QUERY: {0} | values: {1}", new Object[]{query, id}); while (rs.next()) { caja = new Caja(); caja.setId(rs.getInt("id")); caja.setFecha(LocalDate.parse(rs.getString("fecha"))); caja.setFondo(rs.getInt("fondo")); } rs.close(); ps.close(); } catch (SQLException e) { LOGGER.log(Level.SEVERE, e.toString(), e); } return Optional.ofNullable(caja); } @Override public Optional getByFecha(LocalDate fecha) { Caja caja = null; try (Connection conn = connectionHolder.getConnection()) { String query = "select * from caja where fecha = ?"; PreparedStatement ps = conn.prepareStatement(query); ps.setString(1, fecha.toString()); ResultSet rs = ps.executeQuery(); LOGGER.log(Level.FINE, "QUERY: {0} | values: {1}", new Object[]{query, fecha}); while (rs.next()) { caja = new Caja(); caja.setId(rs.getInt("id")); caja.setFecha(LocalDate.parse(rs.getString("fecha"))); caja.setFondo(rs.getInt("fondo")); } rs.close(); ps.close(); } catch (SQLException e) { LOGGER.log(Level.SEVERE, e.toString(), e); } return Optional.ofNullable(caja); } @Override public void insert(Caja caja) { try (Connection conn = connectionHolder.getConnection()) { String query = "insert into caja (fecha, fondo) values (?, ?)"; PreparedStatement ps = conn.prepareStatement(query); ps.setString(1, caja.getFecha().toString()); ps.setInt(2, caja.getFondo()); ps.executeUpdate(); LOGGER.log(Level.FINE, "QUERY: {0} | values: {1}, {2}", new Object[]{query, caja.getFecha(), caja.getFondo()}); ps.close(); query = "select last_insert_rowid()"; ps = conn.prepareStatement("select last_insert_rowid()"); ResultSet rs = ps.executeQuery(); LOGGER.log(Level.FINE, "QUERY: {0}", new Object[]{query}); rs.next(); caja.setId(rs.getInt(1)); rs.close(); ps.close(); } catch (SQLException e) { LOGGER.log(Level.SEVERE, e.toString(), e); } } @Override public void insert(List cajas) { String query = "insert into caja (fecha, fondo) values (?, ?)"; try (Connection conn = connectionHolder.getConnection(); PreparedStatement ps = conn .prepareStatement(query)) { for (Caja caja : cajas) { ps.setString(1, caja.getFecha().toString()); ps.setInt(2, caja.getFondo()); ps.addBatch(); } ps.executeBatch(); } catch (SQLException e) { LOGGER.log(Level.SEVERE, e.toString(), e); } } @Override public void update(Caja caja) { try (Connection conn = connectionHolder.getConnection()) { String query = "update caja set fecha = ?, fondo = ? where id = ?"; PreparedStatement ps = conn.prepareStatement(query); ps.setString(1, caja.getFecha().toString()); ps.setInt(2, caja.getFondo()); ps.setInt(3, caja.getId()); ps.executeUpdate(); LOGGER.log(Level.FINE, "QUERY: {0} | values: {1}, {2}, {3}", new Object[]{query, caja.getFecha(), caja.getFondo(), caja.getId()}); ps.close(); } catch (SQLException e) { LOGGER.log(Level.SEVERE, e.toString(), e); } } @Override public void createCajasForMonth(YearMonth mes) { LocalDate startDate = mes.atDay(1); LocalDate endDatePlusOne = mes.atEndOfMonth().plusDays(1); List cajas = new ArrayList<>(); while (startDate.isBefore(endDatePlusOne)) { if (this.getByFecha(startDate).isPresent()) { startDate = startDate.plusDays(1); } else { Caja caja = new Caja(); caja.setFecha(startDate); cajas.add(caja); startDate = startDate.plusDays(1); } } this.insert(cajas); for (Caja caja : cajas) { Efectivo efectivo = new Efectivo(); efectivo.setCaja(caja); DAOManager.getEfectivoDAO().insertDefaultEfectivo(efectivo); Documentos documentos = new Documentos(); documentos.setCaja(caja); DAOManager.getDocumentosDAO().insertDefaultDocumentos(documentos); } } }