/**
   * Encargado de guardar la informacion suministrada por el usuario para una siembra
   *
   * @return Estado del proceso
   */
  public String saveData() {
    if (!usrDao.getPrivilegeUser(idUsrSystem, "crop/create")
        || !usrDao.getPrivilegeUser(idUsrSystem, "crop/modify")) {
      return BaseAction.NOT_AUTHORIZED;
    }
    String action = "";
    //        System.out.println("Entre a guardar la info");
    /*
     * Se evalua dependiendo a la accion realizada:
     * 1) create: Al momento de guardar un registro por primera ves
     * 2) modify: Al momento de modificar un registro
     * 3) delete: Al momento de borrar un registro
     */
    if (actExe.equals("create")) {
      action = "C";
    } else if (actExe.equals("modify")) {
      action = "M";
    }

    SessionFactory sessions = HibernateUtil.getSessionFactory();
    Session session = sessions.openSession();
    Transaction tx = null;
    //        info = "La siembra ha sido modificado con exito";

    try {
      tx = session.beginTransaction();

      String dmy = new SimpleDateFormat("yyyy-MM-dd").format(sowing.getDateSow());
      Date dateSow = new SimpleDateFormat("yyyy-MM-dd").parse(dmy);

      //            event.setFields(event.getFields());
      //            event.setCropsTypes(new CropsTypes(2));
      //            event.setIdProjectProEve(event.getIdProjectProEve());
      //            event.setStatus(event.isStatus());
      session.saveOrUpdate(event);

      if (sowing.getIdSow() == null) {
        Sowing sowTemp = sowDao.objectById(idCrop);
        if (sowTemp != null) {
          sowing.setIdSow(sowTemp.getIdSow());
        }
      }

      sowing.setProductionEvents(new ProductionEvents(idCrop));
      sowing.setDateSow(dateSow);
      if (sowing.getChemicalsSowing().getIdCheSow() == -1) {
        sowing.setChemicalsSowing(null);
      }

      if (sowing.getDoseUnits() != null
          && (sowing.getDoseUnits().getIdDosUni() == -1
              || sowing.getChemicalsSowing().getIdCheSow() == 3)) {
        sowing.setDoseUnits(null);
      }
      //            sowing.setSowingTypes(new SowingTypes(idCrop));
      sowing.setStatus(true);
      session.saveOrUpdate(sowing);

      Maize maizeOld = maizeDao.objectById(this.getIdCrop());
      if (maizeOld != null) session.delete(maizeOld);

      Beans beansOld = beansDao.objectById(this.getIdCrop());
      if (beansOld != null) session.delete(beansOld);

      if (typeCrop == 1) {
        maize.setProductionEvents(new ProductionEvents(idCrop));
        maize.setStatus(true);
        session.saveOrUpdate(maize);
      } else if (typeCrop == 2) {
        beans.setSeedsTypes(null);
        beans.setProductionEvents(new ProductionEvents(idCrop));
        beans.setStatus(true);
        session.saveOrUpdate(beans);
      } else if (typeCrop == 3) {
        //                Cassavas ca = new Cassavas();
        //                ca.setIdCas(null);
        //                ca.setProductionEvents(pro);
      }

      LogEntities log = new LogEntities();
      log.setIdLogEnt(null);
      log.setIdEntityLogEnt(idEntSystem);
      log.setIdObjectLogEnt(sowing.getIdSow());
      log.setTableLogEnt("sowing");
      log.setDateLogEnt(new Date());
      log.setActionTypeLogEnt(action);
      session.saveOrUpdate(log);

      tx.commit();
      state = "success";
      if (action.equals("C")) {
        info = "La siembra ha sido agregada con exito";
        //                return "list";
      } else if (action.equals("M")) {
        info = "La siembra ha sido modificada con exito";
        //                return "list";
      }
      SfGuardUserDao sfDao = new SfGuardUserDao();
      SfGuardUser sfUser = sfDao.getUserByLogin(user.getCreatedBy(), user.getNameUserUsr(), "");
      GlobalFunctions.sendInformationCrop(idCrop, typeCrop, sfUser.getId());
    } catch (HibernateException e) {
      if (tx != null) {
        tx.rollback();
      }
      e.printStackTrace();
      //            System.out.println("error->"+e.getMessage());
      state = "failure";
      info = "Fallo al momento de agregar una siembra";
    } catch (ParseException e) {

    } finally {
      session.close();
    }

    //        return ERROR;
    return "states";
  }
  /** Metodo encargado de validar el formulario de Siembra */
  @Override
  public void validate() {
    /*
     * Se evalua dependiendo a la accion realizada:
     * 1) create: Al momento de guardar un registro por primera ves
     * 2) modify: Al momento de modificar un registro
     * 3) delete: Al momento de borrar un registro
     */
    //        numberFormatter = NumberFormat.getNumberInstance(new Locale("en_US"));
    //        quantityOut = numberFormatter.format(rasta.getLatitudRas());
    if (actExe.equals("create") || actExe.equals("modify")) {
      boolean enter = false;
      HashMap required = new HashMap();
      required.put("sowing.dateSow", sowing.getDateSow());
      required.put("sowing.sowingTypes.idSowTyp", sowing.getSowingTypes().getIdSowTyp());
      required.put("sowing.seedsNumberSow", sowing.getSeedsNumberSow());
      required.put("sowing.treatedSeedsSow", sowing.isTreatedSeedsSow());
      required.put("sowing.genotypes.idGen", sowing.getGenotypes().getIdGen());
      required.put("event.expected_production_pro_eve", event.getExpectedProductionProEve());
      required.put("sowing.furrowsDistanceSow", sowing.getFurrowsDistanceSow());
      required.put("sowing.sitesDistanceSow", sowing.getSitesDistanceSow());

      //            if (sowing.getGenotypesSowing().getIdGenSow()==1000000) {
      if (sowing.getGenotypes().getIdGen() != null && sowing.getGenotypes().getIdGen() == 1000000) {
        required.put("sowing.otherGenotypeSow", sowing.getOtherGenotypeSow());
      }

      if (typeCrop == 1) {
        required.put("sowing.genotypesSowing.idGenSow", sowing.getGenotypesSowing().getIdGenSow());
        required.put("maize.seedsColors.idSeeCol", maize.getSeedsColors().getIdSeeCol());
        required.put("maize.seedsNumberSiteMai", maize.getSeedsNumberSiteMai());
      } else if (typeCrop == 2) {
        required.put("beans.seedsNumberSiteBea", beans.getSeedsNumberSiteBea());
        required.put("sowing.seedsOrigins.idSeeOri", sowing.getSeedsOrigins().getIdSeeOri());
        //              required.put("beans.seedsTypes.idSeeTyp",
        // beans.getSeedsTypes().getIdSeeTyp());
        //              required.put("beans.seedsInoculations.idSeeIno",
        // beans.getSeedsInoculations().getIdSeeIno());
        required.put(
            "beans.growingEnvironment.idGroEnv", beans.getGrowingEnvironment().getIdGroEnv());

        if (beans.getOtroInoculationBea().equals("1000000")) {
          required.put("sowing.otherGenotypeSow", sowing.getOtherGenotypeSow());
        }
      }

      for (Iterator it = required.keySet().iterator(); it.hasNext(); ) {
        String sK = (String) it.next();
        String sV = String.valueOf(required.get(sK));
        //                System.out.println(sK + " : " + sV);
        if (StringUtils.trim(sV).equals("null")
            || StringUtils.trim(sV) == null
            || StringUtils.trim(sV).equals("")
            || sV.equals("-1")) {
          addFieldError(sK, "El campo es requerido");
          enter = true;
        }
      }

      if (enter) {
        addActionError("Faltan campos por ingresar por favor digitelos");
      }

      //            if (typeCrop==2) {
      required.put("sowing.furrowsDistanceSow", sowing.getFurrowsDistanceSow());
      if (sowing.getFurrowsDistanceSow() != null
          && sowing.getFurrowsDistanceSow() != 0
          && (sowing.getFurrowsDistanceSow() < 0 || sowing.getFurrowsDistanceSow() > 10)) {
        addFieldError("sowing.furrowsDistanceSow", "Dato invalido valor entre 0 y 10");
        addActionError(
            "Se ingreso una distancia entre surcos invalida, por favor ingresar un valor entre 0 y 10");
      }

      required.put("sowing.sitesDistanceSow", sowing.getSitesDistanceSow());
      if (sowing.getFurrowsDistanceSow() != null
          && sowing.getSitesDistanceSow() != 0
          && (sowing.getSitesDistanceSow() < 0 || sowing.getSitesDistanceSow() > 10)) {
        addFieldError("sowing.sitesDistanceSow", "Dato invalido valor entre 0 y 10");
        addActionError(
            "Se ingreso una distancia entre sitios invalida, por favor ingresar un valor entre 0 y 10");
      }

      if (typeCrop == 2) {
        required.put("beans.seedsNumberSiteBea", beans.getSeedsNumberSiteBea());
        if (beans.getSeedsNumberSiteBea() != 0
            && (beans.getSeedsNumberSiteBea() < 1 || beans.getSeedsNumberSiteBea() > 10)) {
          addFieldError("beans.seedsNumberSiteBea", "Dato invalido valor entre 1 y 10");
          addActionError(
              "Se ingreso un numero de semillas por sitio invalido, por favor ingresar un valor entre 1 y 10");
        }
      } else if (typeCrop == 1) {
        required.put("maize.seedsNumberSiteMai", maize.getSeedsNumberSiteMai());
        if (maize.getSeedsNumberSiteMai() != null
            && maize.getSeedsNumberSiteMai() != 0
            && (maize.getSeedsNumberSiteMai() < 1 || maize.getSeedsNumberSiteMai() > 10)) {
          addFieldError("maize.seedsNumberSiteMai", "Dato invalido valor entre 1 y 10");
          addActionError(
              "Se ingreso un numero de semillas por sitio invalido, por favor ingresar un valor entre 1 y 10");
        }
      }

      if (event.getExpectedProductionProEve() != null && event.getExpectedProductionProEve() != 0) {
        if (event.getExpectedProductionProEve() < 0
            || event.getExpectedProductionProEve() > 30000) {
          addFieldError("event.expected_production_pro_eve", "Dato invalido valor entre 0 y 30000");
          addActionError(
              "Se ingreso un rendimiento histórico obtenido invalido, por favor ingresar un valor entre 0 y 30000");
        }
      }
    }
  }