viernes, 20 de diciembre de 2024

Set Period Status By Date in iDempiere

import java.sql.Timestamp;

import java.util.List;

import java.util.Arrays;


import org.compiere.model.MPeriod;

import org.compiere.model.MPeriodControl;

import org.compiere.util.DB;

import org.compiere.util.Env;

import org.compiere.util.Trx;


public class PeriodManagement {


    public static void setPeriodStatusByDate(Timestamp date, String status) {

        Trx trx = Trx.get(Trx.createTrxName("PeriodTrx"), true);

        

        try {

            // Buscar el período activo, estándar, y de tipo 'S' para la fecha proporcionada

            String sql = "SELECT C_Period_ID FROM C_Period "

                       + "WHERE ? BETWEEN StartDate AND EndDate "

                       + "AND IsActive='Y' AND PeriodType='S' AND AD_Client_ID=?";

            

            int C_Period_ID = DB.getSQLValue(trx.getTrxName(), sql, date, Env.getAD_Client_ID(Env.getCtx()));

            

            if (C_Period_ID <= 0) {

                System.out.println("No se encontró un período estándar (PeriodType='S') activo para la fecha: " + date);

                return;

            }

            

            MPeriod period = new MPeriod(Env.getCtx(), C_Period_ID, trx.getTrxName());

            

            // Cambiar el estado de cada control del período

            List<MPeriodControl> periodControls = Arrays.asList(period.getPeriodControls(true));

            

            for (MPeriodControl control : periodControls) {

                control.setPeriodStatus(status);

                control.saveEx(trx.getTrxName());

            }

            

            trx.commit();

            System.out.println("El estado del período estándar para la fecha " + date + " fue actualizado a: " + status);

        } catch (Exception e) {

            trx.rollback();

            e.printStackTrace();

        } finally {

            trx.close();

        }

    }

    

    public static void main(String[] args) {

        // Ejemplo: Abrir un período para la fecha actual

        Timestamp date = new Timestamp(System.currentTimeMillis());

        setPeriodStatusByDate(date, MPeriodControl.PERIODSTATUS_Open);

        

        // Ejemplo: Cerrar un período para una fecha específica

        Timestamp specificDate = Timestamp.valueOf("2024-12-01 00:00:00");

        setPeriodStatusByDate(specificDate, MPeriodControl.PERIODSTATUS_Closed);

    }

}

No hay comentarios:

Publicar un comentario