package br.com.elotech.saude.scripts;

public abstract class InventarioScript {

    private static StringBuilder builder;

    public static String getSqlProdutos(){
        builder = new StringBuilder();
        builder.append("SELECT")
               .append(" p.pro_nome                    AS produto,")
               .append(" invp.invplq_lote              AS lote,")
               .append(" invp.invplq_validade          AS validade,")
               .append(" invp.invplq_quantidade_saldo  AS saldoInicial,")
               .append(" invp.invplq_quantidade        AS saldoFinal,")
               .append(" invp.invplq_dose_atual        AS fracao")
               .append(" FROM inventario_produto_lote_quantidade_tmp invp")
               .append("  JOIN inventario_produto_tmp tmp ON tmp.invp_codigo = invp.invp_codigo")
               .append("  JOIN produto p ON p.pro_codigo = tmp.pro_codigo")
               .append(" WHERE invp.invp_codigo =:invp_codigo");
        return builder.toString();
    }

    public static String getSqlInventarioAberto(){
      builder = new StringBuilder();
      builder.append(" SELECT DISTINCT")
             .append("   u.uni_desc              AS unidade,")
             .append("   s.set_nome              AS setor,")
             .append("   g.gru_nome              AS grupo,")
             .append("   inv.inv_codigo          AS codigo,")
             .append("   p.pro_nome              AS produto,")
             .append("   tmp.invp_lote           AS lote,")
             .append("   tmp.invp_codigo         AS inv_pro,")
             .append("   im.ite_validade         AS validade,")
             .append("   sa.sal_qtde             AS saldoInicial,")
             .append("   tmp.invp_quantidade     AS saldoFinal,")
             .append("   tmp.invp_dose_atual     AS fracao")
             .append(" FROM produto p")
             .append("   LEFT JOIN itens_movimento im ON im.pro_codigo = p.pro_codigo")
             .append("                                 AND im.ite_validade >= now()")
             .append("   JOIN inventario_produto_tmp tmp ON tmp.pro_codigo = p.pro_codigo AND tmp.invp_lote = im.ite_lote")
             .append("   JOIN inventario inv ON inv.inv_codigo = tmp.inv_codigo")
             .append("   JOIN grupo g ON p.gru_codigo = g.gru_codigo")
             .append("   JOIN setor s ON s.set_codigo = inv.set_codigo")
             .append("   JOIN unidade u ON u.uni_codigo = s.uni_codigo")
             .append("   JOIN saldo sa ON p.pro_codigo = sa.pro_codigo")
             .append("                 AND s.set_codigo = sa.set_codigo")
             .append("                 AND upper(im.ite_lote) = upper(sa.sal_lote)")
             .append(" WHERE inv.inv_codigo = :codigo")
             .append(" ORDER BY p.pro_nome, tmp.invp_lote DESC");
      return builder.toString();
    }

  public static String getSqlInventarioFinalizado(){
    builder = new StringBuilder();
    builder.append(" SELECT DISTINCT")
           .append("  u.uni_desc              AS unidade,")
           .append("  s.set_nome              AS setor,")
           .append("  g.gru_nome              AS grupo,")
           .append("  inv.inv_codigo          AS codigo,")
           .append("  p.pro_nome              AS produto,")
           .append("  im.ite_lote             AS lote,")
           .append("  im.ite_validade         AS validade,")
           .append("  CASE mov.mov_tipo")
           .append("    WHEN 'E' THEN (sa.sal_qtde - im.ite_quantidade)")
           .append("    WHEN 'S' THEN (sa.sal_qtde + im.ite_quantidade)")
           .append("  END						          AS saldoInicial,")
           .append("  sa.sal_qtde 			      AS saldoFinal")
           .append(" FROM inventario inv")
           .append(" JOIN movimento mov ON mov.inv_codigo = inv.inv_codigo")
           .append(" JOIN itens_movimento im ON im.mov_codigo = mov.mov_codigo")
           .append(" JOIN produto p ON im.pro_codigo = p.pro_codigo")
           .append(" JOIN grupo g ON p.gru_codigo = g.gru_codigo")
           .append(" JOIN setor s ON s.set_codigo = inv.set_codigo")
           .append(" JOIN unidade u ON u.uni_codigo = s.uni_codigo")
           .append(" JOIN saldo sa ON p.pro_codigo = sa.pro_codigo")
           .append(" AND s.set_codigo = sa.set_codigo")
           .append(" AND upper(im.ite_lote) = upper(sa.sal_lote)")
           .append(" WHERE inv.inv_codigo = :codigo")
           .append(" ORDER BY p.pro_nome, im.ite_lote DESC");
    return builder.toString();
  }
}
