package com.leadwinner.gpms.works.dao;

import com.leadwinner.gpms.works.entities.NewBOQEntity;
import com.leadwinner.gpms.works.entities.SubstituteBOQHistoryEntity;
import java.util.ArrayList;
import com.leadwinner.gpms.works.entities.SubstituteBOQEntity;
import com.leadwinner.gpms.support.PaginationResponseEntity;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import com.leadwinner.gpms.util.StringUtil;
import com.leadwinner.gpms.works.entities.BillEntity;
import org.hibernate.transform.Transformers;
import java.util.Collection;
import org.hibernate.Query;
import com.leadwinner.gpms.works.entities.AbstractMBookEntity;
import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.Type;
import com.leadwinner.gpms.works.entities.MBRecordingBOQMeasurementHistory;
import com.leadwinner.gpms.works.entities.MBRecordingBOQHistory;
import com.leadwinner.gpms.works.entities.MBRecordingImageHistory;
import java.util.HashMap;
import com.leadwinner.gpms.dto.ImportMeasurementsBOQMeasurementsDTO;
import com.leadwinner.gpms.dto.ImportMeasurementsBOQDTO;
import com.leadwinner.gpms.dto.ImportMeasurementsDTO;
import org.json.simple.JSONArray;
import java.util.Iterator;
import org.hibernate.Session;
import com.leadwinner.gpms.works.entities.MBRecordingApprovalStatusHistoryEntity;
import com.leadwinner.gpms.works.entities.MBRecordingImage;
import com.leadwinner.gpms.works.entities.MBRecordingBOQMeasurement;
import com.leadwinner.gpms.util.TableAliases;
import java.util.Arrays;
import java.io.Serializable;
import com.leadwinner.gpms.util.BaseDAOConstants;
import com.leadwinner.gpms.util.RecordsRestrictions;
import com.leadwinner.gpms.works.entities.MBRecordingBOQ;
import com.leadwinner.gpms.util.QueryBuilder;
import com.leadwinner.gpms.constants.EnumConstants;
import com.leadwinner.gpms.util.Utility;
import org.springframework.beans.BeanUtils;
import java.util.Set;
import com.leadwinner.gpms.works.entities.MBRecordingHistory;
import org.hibernate.criterion.Subqueries;
import org.hibernate.criterion.DetachedCriteria;
import com.leadwinner.gpms.works.entities.BOQEntity;
import org.hibernate.sql.JoinType;
import java.util.Date;
import com.leadwinner.gpms.works.entities.MilestoneInspectionEntity;
import java.util.List;
import org.hibernate.criterion.Order;
import com.leadwinner.gpms.works.entities.MBookApprovalsEntity;
import com.leadwinner.gpms.util.MaxIdProperties;
import com.leadwinner.gpms.works.entities.MBRecording;
import org.json.simple.JSONObject;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projection;
import com.leadwinner.gpms.works.entities.WorksEntity;
import org.hibernate.criterion.Projections;
import java.util.Map;
import com.leadwinner.gpms.SessionInfo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Autowired;
import com.leadwinner.gpms.general.service.GeneralService;
import org.springframework.stereotype.Repository;
import com.leadwinner.gpms.base.dao.BaseDAOImpl;

@Repository("workExecutionDAOImpl")
public class WorkExecutionDAOImpl extends BaseDAOImpl implements WorkExecutionDAO
{
    @Autowired
    @Qualifier("generalServiceImpl")
    private GeneralService generalService;
    @Autowired
    @Qualifier("sessionInfo")
    private SessionInfo sessionInfo;
    
    public Map<String, Object> checkAgreementDetails(final String winCode) {
        final ProjectionList workOrderProjections = Projections.projectionList();
        workOrderProjections.add(Projections.property("agreementDate").as("agreementDate")).add(Projections.property("agreementNumber").as("agreementNumber")).add(Projections.property("startDate").as("startDate")).add(Projections.property("areAgreementDetailsUpdated").as("areAgreementDetailsUpdated")).add(Projections.property("endDate").as("endDate")).add(Projections.property("contractPeriod").as("contractPeriod")).add(Projections.property("defectLiabilityPeriod").as("defectLiabilityPeriod")).add(Projections.property("ddNumber").as("ddNumber")).add(Projections.property("ddAmount").as("ddAmount")).add(Projections.property("emdAmount").as("emdAmount")).add(Projections.property("emd1Amount").as("emd1Amount")).add(Projections.property("emd1Branch").as("emd1Branch")).add(Projections.property("emd1Date").as("emd1Date")).add(Projections.property("emd2Document").as("emd2Document")).add(Projections.property("workOrderNumber").as("workOrderNumber")).add(Projections.property("workOrderDate").as("workOrderDate")).add(Projections.property("workOrderCreatedAt").as("workOrderCreatedAt")).add(Projections.property("workOrderTemplateName").as("workOrderTemplateName")).add(Projections.property("woTemplateId").as("woTemplateId")).add(Projections.property("defectLiabilityPeriod").as("defectLiabilityPeriod")).add(Projections.property("contractPeriod").as("contractPeriod")).add(Projections.property("loaDate").as("loaDate"));
        return (Map<String, Object>)this.sessionFactory.getCurrentSession().createCriteria((Class)WorksEntity.class).setProjection((Projection)workOrderProjections).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).uniqueResult();
    }
    
    public JSONObject getMbookDetails(final String winCode) {
        final JSONObject jsonObject = new JSONObject();
        final WorksEntity worksEntity = (WorksEntity)this.sessionFactory.getCurrentSession().createCriteria((Class)WorksEntity.class).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).uniqueResult();
        jsonObject.put((Object)"winCode", (Object)worksEntity.getWinCode());
        jsonObject.put((Object)"estimatedAmount", (Object)worksEntity.getEstimatedAmount());
        jsonObject.put((Object)"estimatedContractValue", (Object)worksEntity.getEstimatedContractValue());
        jsonObject.put((Object)"agreementAmount", (Object)worksEntity.getAgreementAmount());
        jsonObject.put((Object)"contractorName", (Object)worksEntity.getContractorName());
        jsonObject.put((Object)"asnBy", (Object)worksEntity.getAdminSanctionBy());
        jsonObject.put((Object)"tsnBy", (Object)worksEntity.getTechnicalSanctionBy());
        jsonObject.put((Object)"isMovedToActiveData", (Object)worksEntity.isMovedToActiveData());
        jsonObject.put((Object)"areAgreementDetailsUpdated", (Object)worksEntity.isAreAgreementDetailsUpdated());
        jsonObject.put((Object)"isActiveMBookHierarchyCreated", (Object)worksEntity.isActiveMBookHierarchyCreated());
        jsonObject.put((Object)"mbRefNumber", (Object)worksEntity.getMbRefNumber());
        jsonObject.put((Object)"mbReferenceNumber", (Object)worksEntity.getMbookReferenceNumber());
        jsonObject.put((Object)"mbookCreatedAt", (Object)worksEntity.getMbookCreatedAt());
        jsonObject.put((Object)"mbookDescription", (Object)worksEntity.getMbookDescription());
        jsonObject.put((Object)"currentPageNumber", (Object)this.getMaxId(new MaxIdProperties("pageNumber", "winCode", worksEntity.getWinCode(), (Class)MBRecording.class)));
        jsonObject.put((Object)"status", (Object)true);
        jsonObject.put((Object)"areFunctionariesAssigned", (Object)worksEntity.isAreFunctionariesAssigned());
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("employeeName").as("name")).add(Projections.property("employeeDesignation").as("designationName")).add(Projections.property("hierarchyOrder").as("hierarchyOrder"));
        final List<MBookApprovalsEntity> approvals = (List<MBookApprovalsEntity>)this.sessionFactory.getCurrentSession().createCriteria((Class)MBookApprovalsEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)worksEntity.getWinCode())).add((Criterion)Restrictions.eq("isLatest", (Object)true)).addOrder(Order.asc("hierarchyOrder")).setProjection((Projection)projectionList).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();
        jsonObject.put((Object)"escalationDetails", (Object)approvals);
        return jsonObject;
    }
    
    public JSONObject getRecentCheckList(final String milestoneNumber, final boolean isRecent) {
        final JSONObject jsonObject = new JSONObject();
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)MilestoneInspectionEntity.class).add((Criterion)Restrictions.eq("milestoneNumber", (Object)milestoneNumber)).add((Criterion)Restrictions.eq("isTransitRecord", (Object)false)).setProjection((Projection)Projections.max("createdAt"));
        final Date maxDate = (Date)criteria.uniqueResult();
        if (isRecent) {
            final MilestoneInspectionEntity mileStonesInspectionsEntity = (MilestoneInspectionEntity)this.sessionFactory.getCurrentSession().createCriteria((Class)MilestoneInspectionEntity.class).createAlias("milestoneEntity", "milestoneEntity").createAlias("worksEntity", "worksEntity").createAlias("creator", "creator").createAlias("creator.employeeEntity", "employeeEntity").createAlias("creator.designationsEntity", "designationsEntity").setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add((Criterion)Restrictions.eq("milestoneNumber", (Object)milestoneNumber)).add((Criterion)Restrictions.eq("isTransitRecord", (Object)false)).add((Criterion)Restrictions.eq("createdAt", (Object)maxDate)).uniqueResult();
            jsonObject.put((Object)"inspections", (Object)mileStonesInspectionsEntity);
        }
        else {
            final List<MilestoneInspectionEntity> mileStonesInspectionsList = (List<MilestoneInspectionEntity>)this.sessionFactory.getCurrentSession().createCriteria((Class)MilestoneInspectionEntity.class).createAlias("milestoneEntity", "milestoneEntity", JoinType.LEFT_OUTER_JOIN).createAlias("creator", "creator", JoinType.LEFT_OUTER_JOIN).createAlias("creator.employeeEntity", "employeeEntity", JoinType.LEFT_OUTER_JOIN).createAlias("creator.designationsEntity", "designationsEntity", JoinType.LEFT_OUTER_JOIN).createAlias("worksEntity", "worksEntity").setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add((Criterion)Restrictions.eq("milestoneNumber", (Object)milestoneNumber)).add((Criterion)Restrictions.eq("isTransitRecord", (Object)false)).add((Criterion)Restrictions.lt("createdAt", (Object)maxDate)).list();
            jsonObject.put((Object)"inspections", (Object)mileStonesInspectionsList);
        }
        return jsonObject;
    }
    
    public List<BOQEntity> getBOQsWhichAreNotMappedToMilestones(final String winCode) {
        final DetachedCriteria detachedCriteria = DetachedCriteria.forClass((Class)BOQEntity.class).createAlias("milestoneEntity", "milestoneEntity", JoinType.INNER_JOIN).setProjection((Projection)Projections.projectionList().add((Projection)Projections.property("boqItemNumber")));
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).setProjection((Projection)Projections.projectionList().add(Projections.property("boqItemNumber").as("boqItemNumber")).add(Projections.property("shortName").as("shortName")).add(Projections.property("itemDescription").as("itemDescription"))).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).addOrder(Order.asc("createdAt")).add(Subqueries.propertyNotIn("boqItemNumber", detachedCriteria)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        return (List<BOQEntity>)criteria.list();
    }
    
    public List<Map<String, Object>> getmbRecordingHistory(final String mbReferenceNumber) {
        final ProjectionList projectionList = Projections.projectionList().add(Projections.property("id").as("id")).add(Projections.property("mbReferenceNumber").as("mbReferenceNumber")).add(Projections.property("winCode").as("winCode")).add(Projections.property("currentStatus").as("status")).add(Projections.property("pageNumber").as("pageNumber")).add(Projections.property("gpsLocation").as("gpsLocation")).add(Projections.property("gpsAddress").as("gpsAddress")).add(Projections.property("contractorSignature").as("contractorSignature")).add(Projections.property("engineerSignature").as("engineerSignature")).add(Projections.property("recordingDate").as("recordingDate")).add(Projections.property("comments").as("comments")).add(Projections.property("worksEntity.workName").as("workName")).add(Projections.property("worksEntity.mbookReferenceNumber").as("mbookReferenceNumber")).add(Projections.property("worksEntity.contractorName").as("contractorName")).add(Projections.property("createdAt").as("createdAt")).add(Projections.property("submittedByEmployeeName").as("submittedByEmployeeName")).add(Projections.property("submittedByEmployeeDesignation").as("submittedByEmployeeDesignation"));
        return (List<Map<String, Object>>)this.sessionFactory.getCurrentSession().createCriteria((Class)MBRecordingHistory.class).createAlias("worksEntity", "worksEntity").setProjection(Projections.distinct((Projection)projectionList)).add((Criterion)Restrictions.eq("mbReferenceNumber", (Object)mbReferenceNumber)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).addOrder(Order.desc("createdAt")).list();
    }
    
    public void mappingAdhocRevised(final String mbReferenceNumber, final String adhocMbRecordingBOQId, final String boqItemNumber, final String winCode) {
        final Session session = this.sessionFactory.getCurrentSession();
        final MBRecording adhocMBookRecording = (MBRecording)session.createCriteria((Class)MBRecording.class).createAlias("mbRecordingBOQs", "mbRecordingBOQs").add((Criterion)Restrictions.eq("mbReferenceNumber", (Object)mbReferenceNumber)).uniqueResult();
        final Set<MBRecordingBOQ> adhocMbRecordingBOQs = (Set<MBRecordingBOQ>)adhocMBookRecording.getMbRecordingBOQs();
        adhocMBookRecording.setWinCodeForAdhoc(winCode);
        adhocMBookRecording.setMbRecordingImages((Set)null);
        adhocMBookRecording.setMbRecordingBOQs((Set)null);
        if (!adhocMBookRecording.isMbRecordCreated()) {
            final MBRecording mbRecording = new MBRecording();
            BeanUtils.copyProperties((Object)adhocMBookRecording, (Object)mbRecording);
            mbRecording.setMbReferenceNumber("ADHOC_REC/" + this.generalService.getNextSequence("gpms.works_mb_recording_mbreferencenumber") + "/" + Utility.getFinancialYear());
            mbRecording.setPageNumber(this.generalService.getMaxId(new MaxIdProperties("pageNumber", (Class)MBRecording.class)) + 1);
            mbRecording.setCurrentStatus(EnumConstants.ApprovalConstants.SUBMITTED);
            mbRecording.setCurrentApprover(adhocMBookRecording.getCurrentApprover());
            mbRecording.setNextApprover(this.generalService.getNextApproverInHierarchy(adhocMBookRecording.getCreatedBy(), winCode));
            mbRecording.setWinCode(winCode);
            mbRecording.setAdhocRecord(false);
            adhocMBookRecording.setAdhocMbReferenceNumber(mbRecording.getMbReferenceNumber());
            final String mbReferenceNumber2 = (String)this.save((Object)mbRecording);
            mbRecording.setMbRecordingBOQs((Set)null);
            final QueryBuilder queryBuilder = new QueryBuilder();
            queryBuilder.setClassType((Class)MBRecordingBOQ.class);
            queryBuilder.setRecordsAndRestrictions((List)Arrays.asList(new RecordsRestrictions("id", (Serializable)adhocMbRecordingBOQId, BaseDAOConstants.RestrictionType.EQUAL, false)));
            queryBuilder.setTableAliases((List)Arrays.asList(new TableAliases("mbRecordingBOQMeasurements", "mbRecordingBOQMeasurements", JoinType.LEFT_OUTER_JOIN.getJoinTypeValue())));
            final MBRecordingBOQ adhocMbRecordingBOQ = (MBRecordingBOQ)this.getRecord(queryBuilder);
            final MBRecordingBOQ mbRecordingBOQ = new MBRecordingBOQ();
            mbRecordingBOQ.setBoqItemNumber(boqItemNumber);
            mbRecordingBOQ.setMeasuredQuantity(adhocMbRecordingBOQ.getMeasuredQuantity());
            mbRecordingBOQ.setDeductionQuantity(adhocMbRecordingBOQ.getDeductionQuantity());
            mbRecordingBOQ.setMbReferenceNumber(mbReferenceNumber2);
            final String mbRecordingBOQId = (String)this.save((Object)mbRecordingBOQ);
            final Set<MBRecordingBOQMeasurement> adhocMbRecordingBOQMeasurements = (Set<MBRecordingBOQMeasurement>)adhocMbRecordingBOQ.getMbRecordingBOQMeasurements();
            for (final MBRecordingBOQMeasurement adhocMbRecordingBOQMeasurement : adhocMbRecordingBOQMeasurements) {
                final MBRecordingBOQMeasurement mbRecordingBOQMeasurement = new MBRecordingBOQMeasurement();
                mbRecordingBOQMeasurement.setLength(adhocMbRecordingBOQMeasurement.getLength());
                mbRecordingBOQMeasurement.setWidth(adhocMbRecordingBOQMeasurement.getWidth());
                mbRecordingBOQMeasurement.setHeight(adhocMbRecordingBOQMeasurement.getHeight());
                mbRecordingBOQMeasurement.setNumbers(adhocMbRecordingBOQMeasurement.getNumbers());
                mbRecordingBOQMeasurement.setDescription(adhocMbRecordingBOQMeasurement.getDescription());
                mbRecordingBOQMeasurement.setGpsLocation(adhocMbRecordingBOQMeasurement.getGpsLocation());
                mbRecordingBOQMeasurement.setGpsAddress(adhocMbRecordingBOQMeasurement.getGpsAddress());
                mbRecordingBOQMeasurement.setMeasurementsQuantity(adhocMbRecordingBOQMeasurement.getMeasurementsQuantity());
                mbRecordingBOQMeasurement.setMeasurementsOrder(adhocMbRecordingBOQMeasurement.getMeasurementsOrder());
                mbRecordingBOQMeasurement.setColorCoding(adhocMbRecordingBOQMeasurement.getColorCoding());
                mbRecordingBOQMeasurement.setColorCodingReferenceNumber(adhocMbRecordingBOQMeasurement.getColorCodingReferenceNumber());
                mbRecordingBOQMeasurement.setMbRecordBOQId(mbRecordingBOQId);
                mbRecordingBOQMeasurement.setCoefficient(adhocMbRecordingBOQMeasurement.getCoefficient());
                mbRecordingBOQMeasurement.setDiameter(adhocMbRecordingBOQMeasurement.getDiameter());
                final String s = (String)this.save((Object)mbRecordingBOQMeasurement);
            }
            final QueryBuilder queryBuilder2 = new QueryBuilder();
            queryBuilder2.setClassType((Class)MBRecordingImage.class);
            queryBuilder2.setRecordsAndRestrictions((List)Arrays.asList(new RecordsRestrictions("mbReferenceNumber", (Serializable)mbReferenceNumber, BaseDAOConstants.RestrictionType.EQUAL, false)));
            final List<MBRecordingImage> adhocMbRecordingImages = (List<MBRecordingImage>)this.getRecords(queryBuilder2);
            for (final MBRecordingImage adhocMbRecordingImage : adhocMbRecordingImages) {
                final MBRecordingImage mbRecordingImage = new MBRecordingImage();
                mbRecordingImage.setImage(adhocMbRecordingImage.getImage());
                mbRecordingImage.setMbReferenceNumber(mbReferenceNumber2);
                mbRecordingImage.setGpsAddress(adhocMbRecordingImage.getGpsAddress());
                mbRecordingImage.setGpsLocation(adhocMbRecordingImage.getGpsLocation());
                mbRecordingImage.setCreatedAt(new Date());
                this.save((Object)mbRecordingImage);
            }
            adhocMbRecordingBOQ.setMoved(true);
            adhocMBookRecording.setMbRecordCreated(true);
            final MBRecordingApprovalStatusHistoryEntity mbRecordingApprovalStatusHistoryEntity = new MBRecordingApprovalStatusHistoryEntity();
            mbRecordingApprovalStatusHistoryEntity.setEmployeeId(mbRecording.getCreatedBy());
            mbRecordingApprovalStatusHistoryEntity.setMbReferenceNumber(mbRecording.getMbReferenceNumber());
            mbRecordingApprovalStatusHistoryEntity.setStatus(EnumConstants.ApprovalConstants.SUBMITTED);
            mbRecordingApprovalStatusHistoryEntity.setCreatedDate(new Date());
            this.save((Object)mbRecordingApprovalStatusHistoryEntity);
            Boolean flag = true;
            for (final MBRecordingBOQ adhocMbRecordingBOQ2 : adhocMbRecordingBOQs) {
                if (!adhocMbRecordingBOQ2.isMoved()) {
                    flag = false;
                }
            }
            if (flag) {
                adhocMBookRecording.setMoved(true);
            }
        }
        else {
            QueryBuilder queryBuilder3 = new QueryBuilder();
            queryBuilder3.setClassType((Class)MBRecording.class);
            queryBuilder3.setRecordsAndRestrictions((List)Arrays.asList(new RecordsRestrictions("mbReferenceNumber", (Serializable)adhocMBookRecording.getAdhocMbReferenceNumber(), BaseDAOConstants.RestrictionType.EQUAL, false)));
            final MBRecording mbRecording2 = (MBRecording)this.getRecord(queryBuilder3);
            queryBuilder3 = new QueryBuilder();
            queryBuilder3.setClassType((Class)MBRecordingBOQ.class);
            queryBuilder3.setRecordsAndRestrictions((List)Arrays.asList(new RecordsRestrictions("id", (Serializable)adhocMbRecordingBOQId, BaseDAOConstants.RestrictionType.EQUAL, false)));
            queryBuilder3.setTableAliases((List)Arrays.asList(new TableAliases("mbRecordingBOQMeasurements", "mbRecordingBOQMeasurements", JoinType.LEFT_OUTER_JOIN.getJoinTypeValue())));
            final MBRecordingBOQ adhocMbRecordingBOQ3 = (MBRecordingBOQ)this.getRecord(queryBuilder3);
            final MBRecordingBOQ mbRecordingBOQ2 = new MBRecordingBOQ();
            mbRecordingBOQ2.setBoqItemNumber(boqItemNumber);
            mbRecordingBOQ2.setMeasuredQuantity(adhocMbRecordingBOQ3.getMeasuredQuantity());
            mbRecordingBOQ2.setDeductionQuantity(adhocMbRecordingBOQ3.getDeductionQuantity());
            mbRecordingBOQ2.setMbReferenceNumber(mbRecording2.getMbReferenceNumber());
            final String mbRecordingBOQId2 = (String)this.save((Object)mbRecordingBOQ2);
            final Set<MBRecordingBOQMeasurement> adhocMbRecordingBOQMeasurements2 = (Set<MBRecordingBOQMeasurement>)adhocMbRecordingBOQ3.getMbRecordingBOQMeasurements();
            for (final MBRecordingBOQMeasurement adhocMbRecordingBOQMeasurement2 : adhocMbRecordingBOQMeasurements2) {
                final MBRecordingBOQMeasurement mbRecordingBOQMeasurement2 = new MBRecordingBOQMeasurement();
                mbRecordingBOQMeasurement2.setLength(adhocMbRecordingBOQMeasurement2.getLength());
                mbRecordingBOQMeasurement2.setWidth(adhocMbRecordingBOQMeasurement2.getWidth());
                mbRecordingBOQMeasurement2.setHeight(adhocMbRecordingBOQMeasurement2.getHeight());
                mbRecordingBOQMeasurement2.setNumbers(adhocMbRecordingBOQMeasurement2.getNumbers());
                mbRecordingBOQMeasurement2.setDescription(adhocMbRecordingBOQMeasurement2.getDescription());
                mbRecordingBOQMeasurement2.setGpsLocation(adhocMbRecordingBOQMeasurement2.getGpsLocation());
                mbRecordingBOQMeasurement2.setGpsAddress(adhocMbRecordingBOQMeasurement2.getGpsAddress());
                mbRecordingBOQMeasurement2.setMeasurementsQuantity(adhocMbRecordingBOQMeasurement2.getMeasurementsQuantity());
                mbRecordingBOQMeasurement2.setMeasurementsOrder(adhocMbRecordingBOQMeasurement2.getMeasurementsOrder());
                mbRecordingBOQMeasurement2.setMbRecordBOQId(mbRecordingBOQId2);
                mbRecordingBOQMeasurement2.setCoefficient(adhocMbRecordingBOQMeasurement2.getCoefficient());
                mbRecordingBOQMeasurement2.setDiameter(adhocMbRecordingBOQMeasurement2.getDiameter());
                this.save((Object)mbRecordingBOQMeasurement2);
            }
            adhocMbRecordingBOQ3.setMoved(true);
            Boolean flag2 = true;
            for (final MBRecordingBOQ mbRecordingBOQ3 : adhocMbRecordingBOQs) {
                if (!mbRecordingBOQ3.isMoved()) {
                    flag2 = false;
                }
            }
            if (flag2) {
                adhocMBookRecording.setMoved(true);
            }
        }
    }
    
    public JSONObject employeesForFilter(final String ulbCode) {
        final JSONObject jsonObject = new JSONObject();
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("creator.employeeDesignationId").as("employeeDesignationId")).add(Projections.property("employeeEntity.name").as("name")).add(Projections.property("departmentsEntity.name").as("department")).add(Projections.property("designationsEntity.name").as("designation"));
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)MBRecording.class).createAlias("creator", "creator", JoinType.INNER_JOIN).createAlias("creator.employeeEntity", "employeeEntity", JoinType.INNER_JOIN).createAlias("employeeEntity.departmentsEntity", "departmentsEntity", JoinType.INNER_JOIN).createAlias("creator.designationsEntity", "designationsEntity", JoinType.INNER_JOIN).add((Criterion)Restrictions.eq("isDeleted", (Object)false)).add((Criterion)Restrictions.eq("isAdhocRecord", (Object)true)).setProjection(Projections.distinct((Projection)projectionList)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        if (this.sessionInfo.getEmployeeEntity().isSuperAdmin() && !this.sessionInfo.getEmployeeEntity().isAdmin()) {
            if (ulbCode != null) {
                criteria.add((Criterion)Restrictions.eq("ulbCode", (Object)ulbCode));
            }
        }
        else {
            criteria.add((Criterion)Restrictions.eq("ulbCode", (Object)this.sessionInfo.getUlbCode()));
        }
        jsonObject.put((Object)"employees", (Object)criteria.list());
        return jsonObject;
    }
    
    public void restoreTransitData(final String id, final int type) {
        if (type == 1) {
            final String query = "update MBRecording set isTransitRecord=:transitstatus,modifiedAt=:modat where mbReferenceNumber=:mbReferenceNumber";
            this.sessionFactory.getCurrentSession().createQuery(query).setParameter("transitstatus", (Object)false).setParameter("mbReferenceNumber", (Object)id).setParameter("modat", (Object)new Date()).executeUpdate();
        }
        if (type == 2) {
            final String query = "update MilestoneInspectionEntity set isTransitRecord=:transitstatus,modifiedAt=:modat where milestoneNumber=:milestoneNumber";
            this.sessionFactory.getCurrentSession().createQuery(query).setParameter("transitstatus", (Object)false).setParameter("milestoneNumber", (Object)id).setParameter("modat", (Object)new Date()).executeUpdate();
        }
    }
    
    public JSONArray getMessagesStatus(final String employeeDesignationId) {
        return null;
    }
    
    public String saveSubmittedRecord(final ImportMeasurementsDTO importMeasurementsDTO, final String winCode, final String referenceNumber) {
        final Session session = this.sessionFactory.getCurrentSession();
        final MBRecording mbRecording = new MBRecording();
        mbRecording.setWinCode(winCode);
        mbRecording.setCreatedBy(importMeasurementsDTO.getEmployeeId());
        mbRecording.setSubmittedByEmployeeName(importMeasurementsDTO.getEmployeeName());
        mbRecording.setSubmittedByEmployeeDesignation(importMeasurementsDTO.getEmployeeDesignation());
        mbRecording.setCreatedAt(new Date());
        mbRecording.setRecordingDate(importMeasurementsDTO.getDate());
        mbRecording.setModifiedAt(new Date());
        if (referenceNumber == null) {
            mbRecording.setMbReferenceNumber("MG/REC/" + this.generalService.getNextSequence("gpms.works_mb_recording_mbreferencenumber") + "/" + Utility.getFinancialYear());
        }
        else {
            mbRecording.setMbReferenceNumber(referenceNumber);
        }
        final List<RecordsRestrictions> recordsRestrictions = Arrays.asList(new RecordsRestrictions("winCode", (Serializable)winCode));
        mbRecording.setPageNumber(this.getMaxId(new MaxIdProperties("pageNumber", (Class)MBRecording.class, (List)recordsRestrictions)) + 1);
        mbRecording.setCurrentApprover(importMeasurementsDTO.getEmployeeId());
        mbRecording.setCurrentStatus(EnumConstants.ApprovalConstants.SUBMITTED);
        mbRecording.setCurrentDate(importMeasurementsDTO.getDate());
        final String mbReferenceNumber = (String)session.save((Object)mbRecording);
        final List<ImportMeasurementsBOQDTO> importMeasurementsBOQDTOs = (List<ImportMeasurementsBOQDTO>)importMeasurementsDTO.getImportMeasurementsBOQDTOs();
        for (final ImportMeasurementsBOQDTO importMeasurementsBOQDTO : importMeasurementsBOQDTOs) {
            final MBRecordingBOQ mbRecordingBOQ = new MBRecordingBOQ();
            mbRecordingBOQ.setBoqItemNumber(importMeasurementsBOQDTO.getBoqId());
            mbRecordingBOQ.setMeasuredQuantity(importMeasurementsBOQDTO.getMeasuredQuantity());
            mbRecordingBOQ.setDeductionQuantity(importMeasurementsBOQDTO.getDeviationsDeduction());
            mbRecordingBOQ.setMbReferenceNumber(mbReferenceNumber);
            final String mbRecordingBOQId = (String)session.save((Object)mbRecordingBOQ);
            final List<ImportMeasurementsBOQMeasurementsDTO> importMeasurementsBOQMeasurementsDTOs = (List<ImportMeasurementsBOQMeasurementsDTO>)importMeasurementsBOQDTO.getImportMeasurementsBOQMeasurementsDTOs();
            for (final ImportMeasurementsBOQMeasurementsDTO importMeasurementsBOQMeasurementsDTO : importMeasurementsBOQMeasurementsDTOs) {
                final MBRecordingBOQMeasurement mbRecordingBOQMeasurement = new MBRecordingBOQMeasurement();
                mbRecordingBOQMeasurement.setNumbers(importMeasurementsBOQMeasurementsDTO.getNumbers());
                mbRecordingBOQMeasurement.setLength(importMeasurementsBOQMeasurementsDTO.getLength());
                mbRecordingBOQMeasurement.setWidth(importMeasurementsBOQMeasurementsDTO.getWidth());
                mbRecordingBOQMeasurement.setHeight(importMeasurementsBOQMeasurementsDTO.getHeight());
                mbRecordingBOQMeasurement.setCount(importMeasurementsBOQMeasurementsDTO.getCount());
                mbRecordingBOQMeasurement.setDeviation(importMeasurementsBOQMeasurementsDTO.isDeviation());
                mbRecordingBOQMeasurement.setMeasurementsQuantity(importMeasurementsBOQMeasurementsDTO.getMeasurementsQuantity());
                mbRecordingBOQMeasurement.setMeasurementsOrder(Integer.valueOf(importMeasurementsBOQMeasurementsDTO.getMeasurementsOrder()));
                mbRecordingBOQMeasurement.setCoefficient(importMeasurementsBOQMeasurementsDTO.getCoefficient());
                mbRecordingBOQMeasurement.setDiameter(importMeasurementsBOQMeasurementsDTO.getDiameter());
                final JSONObject descJSON = new JSONObject();
                final JSONObject jsonObject2 = new JSONObject();
                jsonObject2.put((Object)"calculation", (Object)null);
                jsonObject2.put((Object)"remarks", (Object)importMeasurementsBOQMeasurementsDTO.getDescription());
                descJSON.put((Object)"description", (Object)jsonObject2);
                mbRecordingBOQMeasurement.setDescription(descJSON.toJSONString());
                final Long randomNumber = Math.round(Math.random() * 1000000.0);
                final JSONObject jsonObject3 = new JSONObject();
                jsonObject3.put((Object)"numbers", (Object)false);
                jsonObject3.put((Object)"length", (Object)false);
                jsonObject3.put((Object)"width", (Object)false);
                jsonObject3.put((Object)"height", (Object)false);
                jsonObject3.put((Object)"coefficient", (Object)false);
                jsonObject3.put((Object)"diameter", (Object)false);
                mbRecordingBOQMeasurement.setColorCoding(jsonObject3.toJSONString());
                mbRecordingBOQMeasurement.setColorCodingReferenceNumber(this.generalService.getNextSequence("gpms.works_measurements_colorcodingrefnumber") + randomNumber.toString());
                mbRecordingBOQMeasurement.setMbRecordBOQId(mbRecordingBOQId);
                mbRecordingBOQMeasurement.setMbReferenceNumber(mbReferenceNumber);
                session.save((Object)mbRecordingBOQMeasurement);
            }
        }
        final MBRecordingApprovalStatusHistoryEntity mbRecordingApprovalStatusHistoryEntity = new MBRecordingApprovalStatusHistoryEntity();
        mbRecordingApprovalStatusHistoryEntity.setEmployeeId(importMeasurementsDTO.getEmployeeId());
        mbRecordingApprovalStatusHistoryEntity.setEmployeeName(importMeasurementsDTO.getEmployeeName());
        mbRecordingApprovalStatusHistoryEntity.setEmployeeDesignation(importMeasurementsDTO.getEmployeeDesignation());
        mbRecordingApprovalStatusHistoryEntity.setMbReferenceNumber(mbRecording.getMbReferenceNumber());
        mbRecordingApprovalStatusHistoryEntity.setStatus(EnumConstants.ApprovalConstants.SUBMITTED);
        mbRecordingApprovalStatusHistoryEntity.setCreatedDate(importMeasurementsDTO.getDate());
        session.save((Object)mbRecordingApprovalStatusHistoryEntity);
        final WorksEntity worksEntity = (WorksEntity)this.getRecord((Class)WorksEntity.class, (Serializable)winCode);
        worksEntity.setStatus(EnumConstants.WorkOrderStatus.IN_PROGRESS);
        worksEntity.setAreMeasurementsEntered(true);
        session.saveOrUpdate((Object)worksEntity);
        session.flush();
        return mbRecording.getMbReferenceNumber();
    }
    
    public void saveCheckMeasureRecord(final ImportMeasurementsDTO importMeasurementsDTO, final String winCode) {
        final MBRecording mbBookRecordings = new MBRecording();
        mbBookRecordings.setWinCode(winCode);
        mbBookRecordings.setCreatedBy(importMeasurementsDTO.getEmployeeId());
        mbBookRecordings.setSubmittedByEmployeeName(importMeasurementsDTO.getEmployeeName());
        mbBookRecordings.setSubmittedByEmployeeDesignation(importMeasurementsDTO.getEmployeeDesignation());
        mbBookRecordings.setCreatedAt(new Date());
        mbBookRecordings.setRecordingDate(importMeasurementsDTO.getDate());
        mbBookRecordings.setModifiedAt(new Date());
        mbBookRecordings.setMbReferenceNumber(importMeasurementsDTO.getRecordId());
        final Session session = this.sessionFactory.getCurrentSession();
        final MBRecording mBookRecordings2 = (MBRecording)session.createCriteria((Class)MBRecording.class).createAlias("mbRecordingImages", "mbRecordingImages", JoinType.LEFT_OUTER_JOIN).createAlias("mbRecordingBOQs", "mbRecordingBOQs").createAlias("mbRecordingBOQs.boqEntity", "boqEntity").createAlias("mbRecordingBOQs.mbRecordingBOQMeasurements", "mbRecordingBOQMeasurements").add((Criterion)Restrictions.eq("mbReferenceNumber", (Object)mbBookRecordings.getMbReferenceNumber())).uniqueResult();
        final Map<String, Set<MBRecordingBOQMeasurement>> colorCodingExistingData = new HashMap<String, Set<MBRecordingBOQMeasurement>>();
        for (final MBRecordingBOQ boqMeasurementsEntity : mBookRecordings2.getMbRecordingBOQs()) {
            colorCodingExistingData.put(boqMeasurementsEntity.getBoqItemNumber(), boqMeasurementsEntity.getMbRecordingBOQMeasurements());
        }
        final Set<MBRecordingImage> bookRecordingImages = (Set<MBRecordingImage>)mBookRecordings2.getMbRecordingImages();
        final Set<MBRecordingBOQ> measurementsEntities = (Set<MBRecordingBOQ>)mBookRecordings2.getMbRecordingBOQs();
        session.delete((Object)mBookRecordings2);
        session.flush();
        mBookRecordings2.setMbRecordingImages((Set)null);
        mBookRecordings2.setMbRecordingBOQs((Set)null);
        mbBookRecordings.setCurrentStatus(EnumConstants.ApprovalConstants.CHECK_MEASURED);
        mbBookRecordings.setReadyForHigherAuthorityApproval(true);
        mbBookRecordings.setPageNumber(mBookRecordings2.getPageNumber());
        final String mbReferenceNumber = (String)session.save((Object)mbBookRecordings);
        final List<ImportMeasurementsBOQDTO> importMeasurementsBOQDTOs = (List<ImportMeasurementsBOQDTO>)importMeasurementsDTO.getImportMeasurementsBOQDTOs();
        for (final ImportMeasurementsBOQDTO importMeasurementsBOQDTO : importMeasurementsBOQDTOs) {
            final MBRecordingBOQ mbRecordingBOQ = new MBRecordingBOQ();
            mbRecordingBOQ.setBoqItemNumber(importMeasurementsBOQDTO.getBoqId());
            mbRecordingBOQ.setMeasuredQuantity(importMeasurementsBOQDTO.getMeasuredQuantity());
            mbRecordingBOQ.setDeductionQuantity(importMeasurementsBOQDTO.getDeviationsDeduction());
            mbRecordingBOQ.setMbReferenceNumber(mbReferenceNumber);
            final String mbRecordingBOQId = (String)session.save((Object)mbRecordingBOQ);
            final List<ImportMeasurementsBOQMeasurementsDTO> importMeasurementsBOQMeasurementsDTOs = (List<ImportMeasurementsBOQMeasurementsDTO>)importMeasurementsBOQDTO.getImportMeasurementsBOQMeasurementsDTOs();
            for (final ImportMeasurementsBOQMeasurementsDTO importMeasurementsBOQMeasurementsDTO : importMeasurementsBOQMeasurementsDTOs) {
                final MBRecordingBOQMeasurement mbRecordingBOQMeasurement = new MBRecordingBOQMeasurement();
                mbRecordingBOQMeasurement.setNumbers(importMeasurementsBOQMeasurementsDTO.getNumbers());
                mbRecordingBOQMeasurement.setLength(importMeasurementsBOQMeasurementsDTO.getLength());
                mbRecordingBOQMeasurement.setWidth(importMeasurementsBOQMeasurementsDTO.getWidth());
                mbRecordingBOQMeasurement.setHeight(importMeasurementsBOQMeasurementsDTO.getHeight());
                mbRecordingBOQMeasurement.setCount(importMeasurementsBOQMeasurementsDTO.getCount());
                mbRecordingBOQMeasurement.setDeviation(importMeasurementsBOQMeasurementsDTO.isDeviation());
                mbRecordingBOQMeasurement.setMeasurementsQuantity(importMeasurementsBOQMeasurementsDTO.getMeasurementsQuantity());
                mbRecordingBOQMeasurement.setMeasurementsOrder(Integer.valueOf(importMeasurementsBOQMeasurementsDTO.getMeasurementsOrder()));
                mbRecordingBOQMeasurement.setCoefficient(importMeasurementsBOQMeasurementsDTO.getCoefficient());
                mbRecordingBOQMeasurement.setDiameter(importMeasurementsBOQMeasurementsDTO.getDiameter());
                final JSONObject descJSON = new JSONObject();
                final JSONObject jsonObject2 = new JSONObject();
                jsonObject2.put((Object)"calculation", (Object)null);
                jsonObject2.put((Object)"remarks", (Object)importMeasurementsBOQMeasurementsDTO.getDescription());
                descJSON.put((Object)"description", (Object)jsonObject2);
                mbRecordingBOQMeasurement.setDescription(descJSON.toJSONString());
                final Long randomNumber = Math.round(Math.random() * 1000000.0);
                final JSONObject jsonObject3 = new JSONObject();
                jsonObject3.put((Object)"numbers", (Object)false);
                jsonObject3.put((Object)"length", (Object)false);
                jsonObject3.put((Object)"width", (Object)false);
                jsonObject3.put((Object)"height", (Object)false);
                jsonObject3.put((Object)"coefficient", (Object)false);
                jsonObject3.put((Object)"diameter", (Object)false);
                mbRecordingBOQMeasurement.setColorCoding(jsonObject3.toJSONString());
                mbRecordingBOQMeasurement.setColorCodingReferenceNumber(this.generalService.getNextSequence("gpms.works_measurements_colorcodingrefnumber") + randomNumber.toString());
                mbRecordingBOQMeasurement.setMbRecordBOQId(mbRecordingBOQId);
                mbRecordingBOQMeasurement.setMbReferenceNumber(mbReferenceNumber);
                session.save((Object)mbRecordingBOQMeasurement);
            }
        }
        session.flush();
        final MBRecordingHistory mBookRecordingsHistory = new MBRecordingHistory();
        try {
            BeanUtils.copyProperties((Object)mBookRecordings2, (Object)mBookRecordingsHistory);
            mBookRecordingsHistory.setCurrentStatus(mBookRecordings2.getCurrentStatus());
            mBookRecordingsHistory.setPageNumber(mBookRecordings2.getPageNumber());
            mBookRecordingsHistory.setSubmittedByEmployeeName(mBookRecordings2.getSubmittedByEmployeeName());
            mBookRecordingsHistory.setId((String)null);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        mBookRecordingsHistory.setMbRecordingImages((Set)null);
        final String mBookRecordingsHistoryId = (String)session.save((Object)mBookRecordingsHistory);
        if (bookRecordingImages != null) {
            for (final MBRecordingImage mBookRecordingImages : bookRecordingImages) {
                final MBRecordingImageHistory mBookRecordingImagesHistory = new MBRecordingImageHistory();
                mBookRecordingImagesHistory.setImage(mBookRecordingImages.getImage());
                mBookRecordingImagesHistory.setGpsLocation(mBookRecordingImages.getGpsLocation());
                mBookRecordingImagesHistory.setGpsAddress(mBookRecordingImages.getGpsAddress());
                mBookRecordingImagesHistory.setCreatedAt(mBookRecordingImages.getCreatedAt());
                mBookRecordingImagesHistory.setMbRecordingId(mBookRecordingsHistoryId);
                this.save((Object)mBookRecordingImagesHistory);
            }
        }
        for (final MBRecordingBOQ measurementsEntity : measurementsEntities) {
            final MBRecordingBOQHistory mbRecordingBOQHistory = new MBRecordingBOQHistory();
            mbRecordingBOQHistory.setBoqItemNumber(measurementsEntity.getBoqItemNumber());
            mbRecordingBOQHistory.setMbRecordingId(mBookRecordingsHistoryId);
            mbRecordingBOQHistory.setMbReferenceNumber(mBookRecordingsHistory.getMbReferenceNumber());
            mbRecordingBOQHistory.setDeductionQuantity(measurementsEntity.getDeductionQuantity());
            mbRecordingBOQHistory.setMeasuredQuantity(measurementsEntity.getMeasuredQuantity());
            mbRecordingBOQHistory.setSerialNo(measurementsEntity.getSerialNo());
            final String mbRecordingBOQHistoryId = (String)session.save((Object)mbRecordingBOQHistory);
            final Set<MBRecordingBOQMeasurement> mbRecordingBOQMeasurements = (Set<MBRecordingBOQMeasurement>)measurementsEntity.getMbRecordingBOQMeasurements();
            for (final MBRecordingBOQMeasurement mbRecordingBOQMeasurement : mbRecordingBOQMeasurements) {
                final MBRecordingBOQMeasurementHistory mbRecordingBOQMeasurementHistory = new MBRecordingBOQMeasurementHistory();
                mbRecordingBOQMeasurementHistory.setNumbers(mbRecordingBOQMeasurement.getNumbers());
                mbRecordingBOQMeasurementHistory.setLength(mbRecordingBOQMeasurement.getLength());
                mbRecordingBOQMeasurementHistory.setHeight(mbRecordingBOQMeasurement.getHeight());
                mbRecordingBOQMeasurementHistory.setWidth(mbRecordingBOQMeasurement.getWidth());
                mbRecordingBOQMeasurementHistory.setCount(mbRecordingBOQMeasurement.getCount());
                mbRecordingBOQMeasurementHistory.setDeviation(mbRecordingBOQMeasurement.isDeviation());
                mbRecordingBOQMeasurementHistory.setDescription(mbRecordingBOQMeasurement.getDescription());
                mbRecordingBOQMeasurementHistory.setGpsLocation(mbRecordingBOQMeasurement.getGpsLocation());
                mbRecordingBOQMeasurementHistory.setGpsAddress(mbRecordingBOQMeasurement.getGpsAddress());
                mbRecordingBOQMeasurementHistory.setMeasurementsOrder(mbRecordingBOQMeasurement.getMeasurementsOrder());
                mbRecordingBOQMeasurementHistory.setMeasurementsQuantity(mbRecordingBOQMeasurement.getMeasurementsQuantity());
                mbRecordingBOQMeasurementHistory.setColorCoding(mbRecordingBOQMeasurement.getColorCoding());
                mbRecordingBOQMeasurementHistory.setNewRecord(mbRecordingBOQMeasurement.isNewRecord());
                mbRecordingBOQMeasurementHistory.setMbRecordBOQId(mbRecordingBOQHistoryId);
                mbRecordingBOQMeasurementHistory.setCoefficient(mbRecordingBOQMeasurement.getCoefficient());
                mbRecordingBOQMeasurementHistory.setDiameter(mbRecordingBOQMeasurement.getDiameter());
                session.save((Object)mbRecordingBOQMeasurementHistory);
            }
        }
        session.flush();
        final MBRecordingApprovalStatusHistoryEntity mBookApprovalHistoryEntity = new MBRecordingApprovalStatusHistoryEntity();
        mBookApprovalHistoryEntity.setEmployeeId(mbBookRecordings.getCreatedBy());
        mBookApprovalHistoryEntity.setEmployeeName(importMeasurementsDTO.getEmployeeName());
        mBookApprovalHistoryEntity.setEmployeeDesignation(importMeasurementsDTO.getEmployeeDesignation());
        mBookApprovalHistoryEntity.setMbReferenceNumber(mbBookRecordings.getMbReferenceNumber());
        mBookApprovalHistoryEntity.setCreatedDate(importMeasurementsDTO.getDate());
        mBookApprovalHistoryEntity.setStatus(EnumConstants.ApprovalConstants.CHECK_MEASURED);
        session.save((Object)mBookApprovalHistoryEntity);
    }
    
    public void saveTestCheckRecord(final ImportMeasurementsDTO importMeasurementsDTO, final String winCode) {
        final MBRecording mbRecording = new MBRecording();
        mbRecording.setWinCode(winCode);
        mbRecording.setCreatedBy(importMeasurementsDTO.getEmployeeId());
        mbRecording.setSubmittedByEmployeeName(importMeasurementsDTO.getEmployeeName());
        mbRecording.setSubmittedByEmployeeDesignation(importMeasurementsDTO.getEmployeeDesignation());
        mbRecording.setCreatedAt(new Date());
        mbRecording.setRecordingDate(importMeasurementsDTO.getDate());
        mbRecording.setModifiedAt(new Date());
        mbRecording.setMbReferenceNumber(importMeasurementsDTO.getRecordId());
        mbRecording.setNextApprover(importMeasurementsDTO.getEmployeeId());
        final Session session = this.sessionFactory.getCurrentSession();
        final MBRecording mbRecording2 = (MBRecording)session.createCriteria((Class)MBRecording.class).createAlias("mbRecordingImages", "mbRecordingImages", JoinType.LEFT_OUTER_JOIN).createAlias("mbRecordingBOQs", "mbRecordingBOQs").createAlias("mbRecordingBOQs.boqEntity", "boqEntity").createAlias("mbRecordingBOQs.mbRecordingBOQMeasurements", "mbRecordingBOQMeasurements").add((Criterion)Restrictions.eq("mbReferenceNumber", (Object)mbRecording.getMbReferenceNumber())).uniqueResult();
        final Map<String, Set<MBRecordingBOQMeasurement>> colorCodingExistingData = new HashMap<String, Set<MBRecordingBOQMeasurement>>();
        for (final MBRecordingBOQ mbRecordingBOQ : mbRecording2.getMbRecordingBOQs()) {
            colorCodingExistingData.put(mbRecordingBOQ.getBoqItemNumber(), mbRecordingBOQ.getMbRecordingBOQMeasurements());
        }
        final Set<MBRecordingImage> mbRecordingImages = (Set<MBRecordingImage>)mbRecording2.getMbRecordingImages();
        final Set<MBRecordingBOQ> mbRecordingBOQs = (Set<MBRecordingBOQ>)mbRecording2.getMbRecordingBOQs();
        session.delete((Object)mbRecording2);
        session.flush();
        mbRecording2.setMbRecordingImages((Set)null);
        mbRecording2.setMbRecordingBOQs((Set)null);
        mbRecording.setCurrentStatus(EnumConstants.ApprovalConstants.TEST_CHECKED);
        mbRecording.setReadyForHigherAuthorityApproval(true);
        mbRecording.setTestChecked(true);
        mbRecording.setAbstractGenerated(true);
        mbRecording.setPageNumber(mbRecording2.getPageNumber());
        final String mbReferenceNumber = (String)session.save((Object)mbRecording);
        final List<ImportMeasurementsBOQDTO> importMeasurementsBOQDTOs2 = (List<ImportMeasurementsBOQDTO>)importMeasurementsDTO.getImportMeasurementsBOQDTOs();
        for (final ImportMeasurementsBOQDTO importMeasurementsBOQDTO : importMeasurementsBOQDTOs2) {
            final MBRecordingBOQ mbRecordingBOQ2 = new MBRecordingBOQ();
            mbRecordingBOQ2.setBoqItemNumber(importMeasurementsBOQDTO.getBoqId());
            mbRecordingBOQ2.setMeasuredQuantity(importMeasurementsBOQDTO.getMeasuredQuantity());
            mbRecordingBOQ2.setDeductionQuantity(importMeasurementsBOQDTO.getDeviationsDeduction());
            mbRecordingBOQ2.setMbReferenceNumber(mbReferenceNumber);
            final String mbRecordingBOQId = (String)session.save((Object)mbRecordingBOQ2);
            final List<ImportMeasurementsBOQMeasurementsDTO> importMeasurementsBOQMeasurementsDTOs = (List<ImportMeasurementsBOQMeasurementsDTO>)importMeasurementsBOQDTO.getImportMeasurementsBOQMeasurementsDTOs();
            for (final ImportMeasurementsBOQMeasurementsDTO importMeasurementsBOQMeasurementsDTO : importMeasurementsBOQMeasurementsDTOs) {
                final MBRecordingBOQMeasurement mbRecordingBOQMeasurement = new MBRecordingBOQMeasurement();
                mbRecordingBOQMeasurement.setNumbers(importMeasurementsBOQMeasurementsDTO.getNumbers());
                mbRecordingBOQMeasurement.setLength(importMeasurementsBOQMeasurementsDTO.getLength());
                mbRecordingBOQMeasurement.setWidth(importMeasurementsBOQMeasurementsDTO.getWidth());
                mbRecordingBOQMeasurement.setHeight(importMeasurementsBOQMeasurementsDTO.getHeight());
                mbRecordingBOQMeasurement.setCount(importMeasurementsBOQMeasurementsDTO.getCount());
                mbRecordingBOQMeasurement.setDeviation(importMeasurementsBOQMeasurementsDTO.isDeviation());
                mbRecordingBOQMeasurement.setMeasurementsQuantity(importMeasurementsBOQMeasurementsDTO.getMeasurementsQuantity());
                mbRecordingBOQMeasurement.setMeasurementsOrder(Integer.valueOf(importMeasurementsBOQMeasurementsDTO.getMeasurementsOrder()));
                mbRecordingBOQMeasurement.setCoefficient(importMeasurementsBOQMeasurementsDTO.getCoefficient());
                mbRecordingBOQMeasurement.setDiameter(importMeasurementsBOQMeasurementsDTO.getDiameter());
                final JSONObject descJSON = new JSONObject();
                final JSONObject jsonObject2 = new JSONObject();
                jsonObject2.put((Object)"calculation", (Object)null);
                jsonObject2.put((Object)"remarks", (Object)importMeasurementsBOQMeasurementsDTO.getDescription());
                descJSON.put((Object)"description", (Object)jsonObject2);
                mbRecordingBOQMeasurement.setDescription(descJSON.toJSONString());
                final JSONObject jsonObject3 = new JSONObject();
                jsonObject3.put((Object)"numbers", (Object)false);
                jsonObject3.put((Object)"length", (Object)false);
                jsonObject3.put((Object)"width", (Object)false);
                jsonObject3.put((Object)"height", (Object)false);
                jsonObject3.put((Object)"coefficient", (Object)false);
                jsonObject3.put((Object)"diameter", (Object)false);
                mbRecordingBOQMeasurement.setColorCoding(jsonObject3.toJSONString());
                mbRecordingBOQMeasurement.setMbRecordBOQId(mbRecordingBOQId);
                mbRecordingBOQMeasurement.setMbReferenceNumber(mbReferenceNumber);
                session.save((Object)mbRecordingBOQMeasurement);
            }
        }
        session.flush();
        final MBRecordingHistory mbRecordingHistory = new MBRecordingHistory();
        try {
            BeanUtils.copyProperties((Object)mbRecording2, (Object)mbRecordingHistory);
            mbRecordingHistory.setCurrentStatus(mbRecording2.getCurrentStatus());
            mbRecordingHistory.setPageNumber(mbRecording2.getPageNumber());
            mbRecordingHistory.setCreatedAt(mbRecording2.getCreatedAt());
            mbRecordingHistory.setId((String)null);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        mbRecordingHistory.setMbImagesList((Set)null);
        final String mbRecordingHistoryId = (String)session.save((Object)mbRecordingHistory);
        if (mbRecordingImages != null) {
            for (final MBRecordingImage mbRecordingImage : mbRecordingImages) {
                final MBRecordingImageHistory mbRecordingImageHistory = new MBRecordingImageHistory();
                mbRecordingImageHistory.setImage(mbRecordingImage.getImage());
                mbRecordingImageHistory.setGpsLocation(mbRecordingImage.getGpsLocation());
                mbRecordingImageHistory.setGpsAddress(mbRecordingImage.getGpsAddress());
                mbRecordingImageHistory.setCreatedAt(mbRecordingImage.getCreatedAt());
                mbRecordingImageHistory.setMbRecordingId(mbRecordingHistoryId);
                this.save((Object)mbRecordingImageHistory);
            }
        }
        final Iterator<MBRecordingBOQ> iterator5 = mbRecordingBOQs.iterator();
        while (iterator5.hasNext()) {
            final MBRecordingBOQ mbRecordingBOQ2 = iterator5.next();
            final MBRecordingBOQHistory mbRecordingBOQHistory = new MBRecordingBOQHistory();
            mbRecordingBOQHistory.setBoqItemNumber(mbRecordingBOQ2.getBoqItemNumber());
            mbRecordingBOQHistory.setMbRecordingId(mbRecordingHistoryId);
            mbRecordingBOQHistory.setMbReferenceNumber(mbReferenceNumber);
            mbRecordingBOQHistory.setDeductionQuantity(mbRecordingBOQ2.getDeductionQuantity());
            mbRecordingBOQHistory.setMeasuredQuantity(mbRecordingBOQ2.getMeasuredQuantity());
            mbRecordingBOQHistory.setSerialNo(mbRecordingBOQ2.getSerialNo());
            final String mbRecordingBOQHistoryId = (String)session.save((Object)mbRecordingBOQHistory);
            final Set<MBRecordingBOQMeasurement> mbRecordingBOQMeasurements = (Set<MBRecordingBOQMeasurement>)mbRecordingBOQ2.getMbRecordingBOQMeasurements();
            for (final MBRecordingBOQMeasurement mbRecordingBOQMeasurement : mbRecordingBOQMeasurements) {
                final MBRecordingBOQMeasurementHistory mbRecordingBOQMeasurementHistory = new MBRecordingBOQMeasurementHistory();
                mbRecordingBOQMeasurementHistory.setNumbers(mbRecordingBOQMeasurement.getNumbers());
                mbRecordingBOQMeasurementHistory.setLength(mbRecordingBOQMeasurement.getLength());
                mbRecordingBOQMeasurementHistory.setHeight(mbRecordingBOQMeasurement.getHeight());
                mbRecordingBOQMeasurementHistory.setWidth(mbRecordingBOQMeasurement.getWidth());
                mbRecordingBOQMeasurementHistory.setCount(mbRecordingBOQMeasurement.getCount());
                mbRecordingBOQMeasurementHistory.setDeviation(mbRecordingBOQMeasurement.isDeviation());
                mbRecordingBOQMeasurementHistory.setDescription(mbRecordingBOQMeasurement.getDescription());
                mbRecordingBOQMeasurementHistory.setGpsLocation(mbRecordingBOQMeasurement.getGpsLocation());
                mbRecordingBOQMeasurementHistory.setGpsAddress(mbRecordingBOQMeasurement.getGpsAddress());
                mbRecordingBOQMeasurementHistory.setMeasurementsOrder(mbRecordingBOQMeasurement.getMeasurementsOrder());
                mbRecordingBOQMeasurementHistory.setMeasurementsQuantity(mbRecordingBOQMeasurement.getMeasurementsQuantity());
                mbRecordingBOQMeasurementHistory.setColorCoding(mbRecordingBOQMeasurement.getColorCoding());
                mbRecordingBOQMeasurementHistory.setNewRecord(mbRecordingBOQMeasurement.isNewRecord());
                mbRecordingBOQMeasurementHistory.setMbRecordBOQId(mbRecordingBOQHistoryId);
                mbRecordingBOQMeasurementHistory.setCoefficient(mbRecordingBOQMeasurement.getCoefficient());
                mbRecordingBOQMeasurementHistory.setDiameter(mbRecordingBOQMeasurement.getDiameter());
                session.save((Object)mbRecordingBOQMeasurementHistory);
            }
        }
        session.flush();
        final MBRecordingApprovalStatusHistoryEntity mBookApprovalHistoryEntity = new MBRecordingApprovalStatusHistoryEntity();
        mBookApprovalHistoryEntity.setEmployeeId(mbRecording.getCreatedBy());
        mBookApprovalHistoryEntity.setEmployeeName(importMeasurementsDTO.getEmployeeName());
        mBookApprovalHistoryEntity.setEmployeeDesignation(importMeasurementsDTO.getEmployeeDesignation());
        mBookApprovalHistoryEntity.setMbReferenceNumber(mbRecording.getMbReferenceNumber());
        mBookApprovalHistoryEntity.setCreatedDate(importMeasurementsDTO.getDate());
        mBookApprovalHistoryEntity.setStatus(EnumConstants.ApprovalConstants.TEST_CHECKED);
        session.save((Object)mBookApprovalHistoryEntity);
        session.flush();
    }
    
    public double getTotalExecutedAmount(final String winCode) {
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.sqlGroupProjection("sum(executedAmount) as executedAmount", "winCode", new String[] { "executedAmount" }, new Type[] { (Type)StandardBasicTypes.DOUBLE }));
        return (double)this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).setProjection((Projection)projectionList).uniqueResult();
    }
    
    public void updateWorkProgressStatus(final String winCode) {
        this.sessionFactory.getCurrentSession().createQuery("UPDATE WorksEntity set status=:status, isAbstractGenerated=:isAbstractGenerated where winCode=:winCode").setParameter("status", (Object)EnumConstants.WorkOrderStatus.IN_PROGRESS).setParameter("isAbstractGenerated", (Object)true).setParameter("winCode", (Object)winCode).executeUpdate();
    }
    
    public Map<String, Object> getTotalAmounts(final String winCode) {
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.sum("approvedAmount").as("totalAsPerEstimateAmount"));
        final Map<String, Object> map = (Map<String, Object>)this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).setProjection((Projection)projectionList).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).uniqueResult();
        final ProjectionList projectionList2 = Projections.projectionList();
        projectionList2.add(Projections.sum("uptoDateBillAmount").as("totalCumulativeBillAmount")).add(Projections.sum("uptoPreviousBillAmount").as("totalPreviousBillAmount")).add(Projections.sum("currentBillAmount").as("totalCurrentBillAmount"));
        final Map<String, Object> map2 = (Map<String, Object>)this.sessionFactory.getCurrentSession().createCriteria((Class)AbstractMBookEntity.class).setProjection((Projection)projectionList2).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("isLatestRecord", (Object)true)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).uniqueResult();
        final Query query = (Query)this.sessionFactory.getCurrentSession().createSQLQuery("select  sum((abstract.uptodatebillqty *boqentity1_.approvedRate)/boqentity1_.units) as total from gpms_etl.works_abstract_mbook abstract  inner join gpms_etl.de_detail boqentity1_ on abstract.boqItemNumber=boqentity1_.boqItemNumber where abstract.isLatestRecord=true and abstract.wincode= (:winCode)");
        query.setParameter("winCode", (Object)winCode);
       BigDecimal totalCumulativeBillAmount = null;
		if (query.uniqueResult() != null)
			totalCumulativeBillAmount = (BigDecimal) query.uniqueResult();
        final JSONObject jsonObject = new JSONObject();
        jsonObject.put((Object)"totalAsPerEstimateAmount", map.get("totalAsPerEstimateAmount"));
        jsonObject.put((Object)"totalCumulativeBillAmount", (query.uniqueResult() != null) ? query.uniqueResult() : Integer.valueOf(0));
        jsonObject.put((Object)"totalPreviousBillAmount", map2.get("totalPreviousBillAmount"));
        return (Map<String, Object>)jsonObject;
    }
    
    public List<Map<String, Object>> getBOQDetails(final List<String> boqItemNumber) {
        return (List<Map<String, Object>>)this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).add(Restrictions.in("boqItemNumber", (Collection)boqItemNumber)).setProjection((Projection)Projections.projectionList().add(Projections.property("boqItemNumber").as("boqItemNumber")).add(Projections.property("itemDescription").as("itemDescription")).add(Projections.property("uomName").as("uomName")).add(Projections.property("units").as("units")).add(Projections.property("executedQuantity").as("executedQuantity")).add(Projections.property("approvedQuantity").as("approvedQuantity")).add(Projections.property("isNewBOQ").as("isNewBOQ")).add(Projections.property("shortName").as("shortName")).add(Projections.property("approvedRate").as("approvedRate"))).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();
    }
    
    public JSONObject validatingBillCreate(final String winCode) {
        final JSONObject jsonObject = new JSONObject();
        boolean hasPendingQty = false;
        boolean hasPendingRate = false;
        final Session session = this.sessionFactory.getCurrentSession();
        final List<AbstractMBookEntity> abstractMBookEntities = (List<AbstractMBookEntity>)session.createCriteria((Class)AbstractMBookEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("isLatestRecord", (Object)true)).list();
        for (final AbstractMBookEntity abstractMBookEntity : abstractMBookEntities) {
            if (abstractMBookEntity.getCurrentBillQty() != 0.0) {
                hasPendingQty = true;
                break;
            }
            if (abstractMBookEntity.getPartRate() < abstractMBookEntity.getApprovedRate()) {
                hasPendingRate = true;
                break;
            }
        }
        jsonObject.put((Object)"hasPendingQty", (Object)hasPendingQty);
        jsonObject.put((Object)"hasPendingRate", (Object)hasPendingRate);
        return jsonObject;
    }
    
    public BOQEntity getUom(final String boqNo) {
        return (BOQEntity)this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).setProjection((Projection)Projections.projectionList().add(Projections.property("uomName").as("uomName")).add(Projections.property("executedQuantity").as("executedQuantity")).add(Projections.property("numberOfFields").as("numberOfFields")).add(Projections.property("hasDiameter").as("hasDiameter"))).add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqNo)).setResultTransformer(Transformers.aliasToBean((Class)BOQEntity.class)).uniqueResult();
    }
    
    public double getPreviousBillGrossAmount(final String winCode) {
        int billOrder = 0;
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)BillEntity.class).setProjection((Projection)Projections.projectionList().add((Projection)Projections.max("billOrder"))).add((Criterion)Restrictions.eq("winCode", (Object)winCode));
        if (criteria.uniqueResult() != null) {
            billOrder = (int)criteria.uniqueResult();
        }
        if (billOrder != 0) {
            return (double)this.sessionFactory.getCurrentSession().createCriteria((Class)BillEntity.class).setProjection((Projection)Projections.projectionList().add(Projections.property("uptoDateGrossAmount").as("uptoDateGrossAmount"))).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("billOrder", (Object)billOrder)).uniqueResult();
        }
        return 0.0;
    }
    
    public List<Map<String, Object>> boqSearchList(final String winCode, final String searchValue, final List<String> boqItemNumbers) {
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("winCode").as("winCode")).add(Projections.property("progressPercentage").as("percentComplete")).add(Projections.property("boqItemNumber").as("boqItemNumber")).add(Projections.property("itemDescription").as("itemDescription")).add(Projections.property("executedQuantity").as("executedQuantity")).add(Projections.property("executedAmount").as("executedAmount")).add(Projections.property("shortName").as("shortName")).add(Projections.property("approvedRate").as("approvedRate")).add(Projections.property("isNewBOQ").as("isNewBOQ")).add(Projections.property("approvedQuantity").as("approvedQuantity")).add(Projections.property("approvedAmount").as("approvedAmount")).add(Projections.property("serialNumber").as("serialNumber")).add(Projections.property("uomName").as("uomName")).add(Projections.property("units").as("units")).add(Projections.property("deApprovedQuantity").as("deApprovedQuantity")).add(Projections.property("deApprovedAmount").as("deApprovedAmount")).add(Projections.property("isSubstitutedOnce").as("isSubstitutedOnce")).add(Projections.property("oldQuantity").as("oldQuantity")).add(Projections.property("oldAmount").as("oldAmount")).add(Projections.property("isApproved").as("isApproved")).add(Projections.property("isNewBOQApproved").as("isNewBOQApproved")).add(Projections.property("isSOR").as("isSOR"));
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).setProjection((Projection)projectionList).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).addOrder(Order.asc("createdAt")).addOrder(Order.asc("serialNumber")).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        final Disjunction disjunction = Restrictions.disjunction();
        if (!StringUtil.isNullOrEmpty(searchValue)) {
            disjunction.add(Restrictions.ilike("boqItemNumber", searchValue, MatchMode.ANYWHERE));
            disjunction.add(Restrictions.ilike("itemDescription", searchValue, MatchMode.ANYWHERE));
            disjunction.add(Restrictions.ilike("uomName", searchValue, MatchMode.ANYWHERE));
        }
        if (!StringUtil.isNullOrEmpty(searchValue)) {
            criteria.add((Criterion)Restrictions.or(new Criterion[] { (Criterion)disjunction }));
        }
        if (boqItemNumbers != null && !boqItemNumbers.isEmpty()) {
            criteria.add(Restrictions.not(Restrictions.in("boqItemNumber", (Collection)boqItemNumbers)));
        }
        return (List<Map<String, Object>>)criteria.list();
    }
    
    public <T> T lockOrSubstituteBOQList(Integer offset, final Integer pageSize, final String winCode) {
        final PaginationResponseEntity<SubstituteBOQEntity> paginationResponseEntity = (PaginationResponseEntity<SubstituteBOQEntity>)new PaginationResponseEntity();
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("winCode").as("winCode")).add(Projections.property("substitutionReferenceNumber").as("substitutionReferenceNumber")).add(Projections.property("substituteBOQItemNumbersData").as("substituteBOQItemNumbersData")).add(Projections.property("newBOQItemNumbersData").as("newBOQItemNumbersData")).add(Projections.property("changedBOQItemNumbersQtyData").as("changedBOQItemNumbersQtyData")).add(Projections.property("isLockOrSubstituteBOQApproved").as("isLockOrSubstituteBOQApproved")).add(Projections.property("currentStatus").as("currentStatus")).add(Projections.property("nextApproverEmployeeId").as("nextApproverEmployeeId")).add(Projections.property("createdAt").as("createdAt")).add(Projections.property("listOfSelectedBOQItems").as("listOfSelectedBOQItems")).add(Projections.property("sumOfNewBOQsApprovedAmount").as("sumOfNewBOQsApprovedAmount")).add(Projections.property("sumOfNewBOQsSubstitutedAmount").as("sumOfNewBOQsSubstitutedAmount")).add(Projections.property("substitutedDifferenceAmount").as("substitutedDifferenceAmount")).add(Projections.property("excessBOQsAmount").as("excessBOQsAmount")).add(Projections.property("savedBOQsAmount").as("savedBOQsAmount")).add(Projections.property("totalValueOfWorkAfterSubstitution").as("totalValueOfWorkAfterSubstitution")).add(Projections.property("percentageOfNewBOQsApprovedAmount").as("percentageOfNewBOQsApprovedAmount")).add(Projections.property("percentageOfNewBOQsSubstitutedAmount").as("percentageOfNewBOQsSubstitutedAmount")).add(Projections.property("financialComments").as("financialComments")).add(Projections.property("percentageOfTotalValueOfWorkAfterSubstitution").as("percentageOfTotalValueOfWorkAfterSubstitution")).add(Projections.property("substituteFile").as("substituteFile")).add(Projections.property("submittedBy").as("submittedBy")).add(Projections.property("approverName").as("approverName")).add(Projections.property("approverDesignation").as("approverDesignation")).add(Projections.property("isMovedToActive").as("isMovedToActive"));
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQEntity.class).setProjection((Projection)projectionList).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).addOrder(Order.desc("createdAt")).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        final Criteria countCriteria = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).setProjection(Projections.rowCount());
        final List<SubstituteBOQEntity> boqList = (List<SubstituteBOQEntity>)criteria.list();
        if (pageSize != null && pageSize != 0 && offset != null && offset != 0) {
            criteria.setMaxResults((int)pageSize);
            paginationResponseEntity.setPageSize((int)pageSize);
            --offset;
            criteria.setFirstResult(offset * pageSize);
            ++offset;
            paginationResponseEntity.setOffset((int)offset);
        }
        paginationResponseEntity.setResults((List)boqList);
        paginationResponseEntity.setTotalRecords(((Long)countCriteria.uniqueResult()).intValue());
        return (T)paginationResponseEntity;
    }
    
    public void lockOrSubstituteBOQSave(final SubstituteBOQEntity substituteBOQEntity) {
        final List<String> listBOQItemNumber = new ArrayList<String>();
        final List<String> lockedBOQs = new ArrayList<String>();
        final int serialNo = this.gettingMaxSubstitutionId();
        final String substitutionReferenceNumber = String.valueOf(this.sessionInfo.getNewBoqLabel()) + "/MG/" + serialNo;
        substituteBOQEntity.setSubstitutionReferenceNumber(substitutionReferenceNumber);
        substituteBOQEntity.setSerialNo(serialNo);
        substituteBOQEntity.setCreatedBy(this.sessionInfo.getEmployeeId());
        substituteBOQEntity.setModifiedBy(this.sessionInfo.getEmployeeId());
        substituteBOQEntity.setCreatedAt(new Date());
        substituteBOQEntity.setModifiedAt(new Date());
        substituteBOQEntity.setCurrentStatus(EnumConstants.WorkApprovalStatus.APPROVED);
        substituteBOQEntity.setListOfSelectedBOQItems(substituteBOQEntity.getListOfSelectedBOQItems());
        substituteBOQEntity.setLockOrSubstituteBOQApproved(true);
        if (substituteBOQEntity.getSubstituteBOQItemNumbersData() != null && !substituteBOQEntity.getSubstituteBOQItemNumbersData().isEmpty()) {
            final JSONArray substituteBoqsForLockedJsonArray = new JSONArray();
            final JSONArray substituteBoqsJsonArray = new JSONArray();
            substituteBOQEntity.setSubstituteBOQItemNumbersData(substituteBOQEntity.getSubstituteBOQItemNumbersData());
            for (final Map<String, Object> map : substituteBOQEntity.getSubstituteBOQItemNumbersData()) {
                if (map.get("oneToMany")) {
                    for (final Map<String, Object> boqsToBeSubstituted : map.get("boqsToBeSubstituted")) {
                        listBOQItemNumber.add(boqsToBeSubstituted.get("boqItemNumber"));
                        lockedBOQs.add(boqsToBeSubstituted.get("boqItemNumber"));
                        substituteBoqsForLockedJsonArray.add((Object)boqsToBeSubstituted.get("boqItemNumber"));
                        this.saveSubstituteHistoryTableAndUpdateTempQty(substituteBOQEntity.getSubstitutionReferenceNumber(), boqsToBeSubstituted.get("boqItemNumber"), new Double(boqsToBeSubstituted.get("executedQuantity").toString()), new Double(boqsToBeSubstituted.get("executedAmount").toString()), new Double(boqsToBeSubstituted.get("approvedQuantity").toString()), substituteBOQEntity.getWinCode(), false, substituteBOQEntity.getNextApproverEmployeeId(), substituteBOQEntity.getApproverName(), substituteBOQEntity.getApproverDesignation());
                    }
                    for (final Map<String, Object> substitutedWithBoqs : map.get("substitutedWithBoqs")) {
                        this.updateNewBOQApprovedFlag(substitutedWithBoqs.get("boqItemNumber"));
                        listBOQItemNumber.add(substitutedWithBoqs.get("boqItemNumber"));
                        substituteBoqsJsonArray.add((Object)substitutedWithBoqs.get("boqItemNumber"));
                        this.updateBOQEntityWithApprovedQtyAndAmount(substitutedWithBoqs.get("boqItemNumber"), substitutedWithBoqs.get("tempSubstituteQuantity"), substitutedWithBoqs.get("tempSubstituteAmount"));
                        this.saveSubstituteHistoryTableAndUpdateTempQty(substituteBOQEntity.getSubstitutionReferenceNumber(), substitutedWithBoqs.get("boqItemNumber"), new Double(substitutedWithBoqs.get("tempSubstituteQuantity").toString()), new Double(substitutedWithBoqs.get("tempSubstituteAmount").toString()), new Double(substitutedWithBoqs.get("approvedQuantity").toString()), substituteBOQEntity.getWinCode(), true, substituteBOQEntity.getNextApproverEmployeeId(), substituteBOQEntity.getApproverName(), substituteBOQEntity.getApproverDesignation());
                    }
                }
                else {
                    for (final Map<String, Object> boqsToBeSubstituted : map.get("boqsToBeSubstituted")) {
                        substituteBoqsForLockedJsonArray.add((Object)boqsToBeSubstituted.get("boqItemNumber"));
                        listBOQItemNumber.add(boqsToBeSubstituted.get("boqItemNumber"));
                        lockedBOQs.add(boqsToBeSubstituted.get("boqItemNumber"));
                        this.saveSubstituteHistoryTableAndUpdateTempQty(substituteBOQEntity.getSubstitutionReferenceNumber(), boqsToBeSubstituted.get("boqItemNumber"), new Double(boqsToBeSubstituted.get("executedQuantity").toString()), new Double(boqsToBeSubstituted.get("executedAmount").toString()), new Double(boqsToBeSubstituted.get("approvedQuantity").toString()), substituteBOQEntity.getWinCode(), false, substituteBOQEntity.getNextApproverEmployeeId(), substituteBOQEntity.getApproverName(), substituteBOQEntity.getApproverDesignation());
                    }
                    for (final Map<String, Object> substitutedWithBoqs : map.get("substitutedWithBoqs")) {
                        this.updateNewBOQApprovedFlag(substitutedWithBoqs.get("boqItemNumber"));
                        listBOQItemNumber.add(substitutedWithBoqs.get("boqItemNumber"));
                        substituteBoqsJsonArray.add((Object)substitutedWithBoqs.get("boqItemNumber"));
                        this.updateOldApprovedAndOldQtyInBOQEntity(substitutedWithBoqs.get("boqItemNumber"));
                        this.updateBOQEntityWithApprovedQtyAndAmount(substitutedWithBoqs.get("boqItemNumber"), substitutedWithBoqs.get("tempSubstituteQuantity"), substitutedWithBoqs.get("tempSubstituteAmount"));
                        this.saveSubstituteHistoryTableAndUpdateTempQty(substituteBOQEntity.getSubstitutionReferenceNumber(), substitutedWithBoqs.get("boqItemNumber"), new Double(substitutedWithBoqs.get("tempSubstituteQuantity").toString()), new Double(substitutedWithBoqs.get("tempSubstituteAmount").toString()), new Double(substitutedWithBoqs.get("approvedQuantity").toString()), substituteBOQEntity.getWinCode(), true, substituteBOQEntity.getNextApproverEmployeeId(), substituteBOQEntity.getApproverName(), substituteBOQEntity.getApproverDesignation());
                    }
                }
            }
            this.updateBOQWithSubstitutionItems(substituteBoqsForLockedJsonArray, true);
            this.updateBOQWithIsSubstitute(substituteBoqsJsonArray, true);
        }
        if (substituteBOQEntity.getChangedBOQItemNumbersQtyData() != null && !substituteBOQEntity.getChangedBOQItemNumbersQtyData().isEmpty()) {
            final JSONArray changedBOQsQtyJsonArray = new JSONArray();
            substituteBOQEntity.setChangedBOQItemNumbersQtyData(substituteBOQEntity.getChangedBOQItemNumbersQtyData());
            for (final Map<String, Object> map2 : substituteBOQEntity.getChangedBOQItemNumbersQtyData()) {
                changedBOQsQtyJsonArray.add((Object)map2.get("boqItemNumber"));
                listBOQItemNumber.add(map2.get("boqItemNumber"));
                this.updateOldApprovedAndOldQtyInBOQEntity(map2.get("boqItemNumber"));
                this.updateBOQEntityWithApprovedQtyAndAmount(map2.get("boqItemNumber"), map2.get("tempSubstituteQuantity"), map2.get("tempSubstituteAmount"));
                this.saveSubstituteHistoryTableAndUpdateTempQty(substituteBOQEntity.getSubstitutionReferenceNumber(), map2.get("boqItemNumber"), new Double(map2.get("tempSubstituteQuantity").toString()), new Double(map2.get("tempSubstituteAmount").toString()), new Double(map2.get("approvedQuantity").toString()), substituteBOQEntity.getWinCode(), true, substituteBOQEntity.getNextApproverEmployeeId(), substituteBOQEntity.getApproverName(), substituteBOQEntity.getApproverDesignation());
            }
            this.updateBOQWithIsSubstitute(changedBOQsQtyJsonArray, true);
        }
        if (substituteBOQEntity.getNewBOQItemNumbersData() != null && !substituteBOQEntity.getNewBOQItemNumbersData().isEmpty()) {
            substituteBOQEntity.setNewBOQItemNumbersData(substituteBOQEntity.getNewBOQItemNumbersData());
            final JSONArray newBOQJsonArray = new JSONArray();
            for (final Map<String, Object> map2 : substituteBOQEntity.getNewBOQItemNumbersData()) {
                newBOQJsonArray.add((Object)map2.get("boqItemNumber"));
                this.updateNewBOQApprovedFlag(map2.get("boqItemNumber"));
            }
            this.updateSubstitutionNumberInNewBOQ(newBOQJsonArray, substitutionReferenceNumber);
        }
        this.updateNumberOfSubstitutionAttemp(listBOQItemNumber);
        final SubstituteBOQEntity entity = (SubstituteBOQEntity)this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQEntity.class).add((Criterion)Restrictions.eq("isLatest", (Object)true)).add((Criterion)Restrictions.eq("winCode", (Object)substituteBOQEntity.getWinCode())).uniqueResult();
        if (entity != null) {
            substituteBOQEntity.setCumulativeNewBOQAmount(entity.getCumulativeNewBOQAmount() + substituteBOQEntity.getSumOfNewBOQsApprovedAmount());
            substituteBOQEntity.setCumulativeSubstitutionAmount(entity.getCumulativeSubstitutionAmount() + substituteBOQEntity.getSumOfNewBOQsSubstitutedAmount());
            substituteBOQEntity.setPreviousCumulativeNewBOQAmount(substituteBOQEntity.getCumulativeNewBOQAmount() - substituteBOQEntity.getSumOfNewBOQsApprovedAmount());
            substituteBOQEntity.setPreviousCumulativeSubstitutionAmount(substituteBOQEntity.getCumulativeSubstitutionAmount() - substituteBOQEntity.getSumOfNewBOQsSubstitutedAmount());
            substituteBOQEntity.setLatest(true);
            substituteBOQEntity.setCumulativeSavingSubstitutionAmount(entity.getCumulativeSavingSubstitutionAmount() + substituteBOQEntity.getSavedBOQsAmount());
            substituteBOQEntity.setOverallPreviousSubstitutionAmount(entity.getOverallCurrentSubstitutionAmount());
            this.save((Object)substituteBOQEntity);
            this.updateIsLatestFlagInSubatitutionEntity(entity.getSubstitutionReferenceNumber());
            this.updateAsPerSubstitutionModifiedAmountInWorkEntity(substituteBOQEntity.getOverallCurrentSubstitutionAmount(), substituteBOQEntity.getWinCode());
        }
        else {
            this.updateAsPerSubstitutionModifiedAmountInWorkEntity(substituteBOQEntity.getOverallCurrentSubstitutionAmount(), substituteBOQEntity.getWinCode());
            substituteBOQEntity.setCumulativeNewBOQAmount(substituteBOQEntity.getSumOfNewBOQsApprovedAmount());
            substituteBOQEntity.setCumulativeSubstitutionAmount(substituteBOQEntity.getSumOfNewBOQsSubstitutedAmount());
            substituteBOQEntity.setLatest(true);
            substituteBOQEntity.setCumulativeSavingSubstitutionAmount(substituteBOQEntity.getCumulativeSavingSubstitutionAmount() + substituteBOQEntity.getSavedBOQsAmount());
            this.save((Object)substituteBOQEntity);
        }
    }
    
    private void saveSubstituteHistoryTableAndUpdateTempQty(final String substitutionReferenceNumber, final String boqItemNumber, final Double tempSubstituteQuantity, final Double tempSubstituteAmount, final Double approvedQuantity, final String winCode, final boolean isSubstituted, final String approverId, final String approverName, final String approverDesignation) {
        final SubstituteBOQHistoryEntity substituteBOQHistoryEntity = new SubstituteBOQHistoryEntity();
        final int serialNumber = this.getSerialNo();
        substituteBOQHistoryEntity.setSerialNumber(serialNumber);
        substituteBOQHistoryEntity.setBoqItemNumber(boqItemNumber);
        substituteBOQHistoryEntity.setSubstitutionReferenceNumber(substitutionReferenceNumber);
        substituteBOQHistoryEntity.setCreatedAt(new Date());
        substituteBOQHistoryEntity.setCreatedBy(this.sessionInfo.getEmployeeId());
        substituteBOQHistoryEntity.setNewApprovedQuantity((double)tempSubstituteQuantity);
        substituteBOQHistoryEntity.setOldApprovedQuantity((double)approvedQuantity);
        substituteBOQHistoryEntity.setWinCode(winCode);
        substituteBOQHistoryEntity.setSubstituted(isSubstituted);
        substituteBOQHistoryEntity.setApproverId(approverId);
        substituteBOQHistoryEntity.setApproverName(approverName);
        substituteBOQHistoryEntity.setApproverDesignation(approverDesignation);
        this.save((Object)substituteBOQHistoryEntity);
    }
    
    private int getSerialNo() {
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQHistoryEntity.class);
        criteria.setProjection((Projection)Projections.max("serialNumber"));
        if (criteria.uniqueResult() != null) {
            final int serialNo = (int)criteria.uniqueResult();
            return serialNo + 1;
        }
        return 1;
    }
    
    private void updateBOQEntityWithApprovedQtyAndAmount(final String boqItemNumber, final Double tempSubstituteQuantity, final Double tempSubstituteAmount) {
        final Session session = this.sessionFactory.getCurrentSession();
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("executedQuantity").as("executedQuantity"));
        final Double executedQuantity = (Double)session.createCriteria((Class)BOQEntity.class).add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqItemNumber)).setProjection((Projection)projectionList).uniqueResult();
        final double progressPercentage = executedQuantity / tempSubstituteQuantity * 100.0;
        session.createQuery("UPDATE BOQEntity set approvedAmount=:tempSubstituteAmount,approvedQuantity=:tempSubstituteQuantity,  progressPercentage=:progressPercentage where boqItemNumber=:boqItemNumber").setParameter("tempSubstituteAmount", (Object)tempSubstituteAmount).setParameter("tempSubstituteQuantity", (Object)tempSubstituteQuantity).setParameter("boqItemNumber", (Object)boqItemNumber).setParameter("progressPercentage", (Object)progressPercentage).executeUpdate();
        session.flush();
    }
    
    private void updateIsLatestFlagInSubatitutionEntity(final String substitutionReferenceNumber) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE SubstituteBOQEntity  set isLatest=:isLatest  where substitutionReferenceNumber=:substitutionReferenceNumber").setParameter("substitutionReferenceNumber", (Object)substitutionReferenceNumber).setParameter("isLatest", (Object)false).executeUpdate();
        session.flush();
    }
    
    private void updateAsPerSubstitutionModifiedAmountInWorkEntity(final double asPerSubstitutionModifiedAmount, final String winCode) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE WorksEntity  set asPerSubstitutionModifiedAmount=:asPerSubstitutionModifiedAmount where winCode=:winCode").setParameter("asPerSubstitutionModifiedAmount", (Object)asPerSubstitutionModifiedAmount).setParameter("winCode", (Object)winCode).executeUpdate();
        session.flush();
    }
    
    private void updateNumberOfSubstitutionAttemp(final List<String> listBOQItemNumber) {
        for (final String boqItemNumber : listBOQItemNumber) {
            final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class);
            criteria.add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqItemNumber));
            criteria.setProjection((Projection)Projections.max("numberOfSubstituteBOQAttemp"));
            if (criteria.uniqueResult() != null) {
                final int serialNo = (int)criteria.uniqueResult() + 1;
                this.updateAttempInBOQEntity(boqItemNumber, serialNo);
            }
        }
    }
    
    private void updateAttempInBOQEntity(final String boqItemNumber, final int serialNo) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE BOQEntity set numberOfSubstituteBOQAttemp=:numberOfSubstituteBOQAttemp, isSubstitutedOnce=:isSubstitutedOnce where boqItemNumber=:boqItemNumber").setParameter("numberOfSubstituteBOQAttemp", (Object)serialNo).setParameter("isSubstitutedOnce", (Object)true).setParameter("boqItemNumber", (Object)boqItemNumber).executeUpdate();
        session.flush();
    }
    
    private void updateOldApprovedAndOldQtyInBOQEntity(final String boqItemNumber) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE BOQEntity this_ set oldAmount=this_.approvedAmount,oldQuantity=this_.approvedQuantity where boqItemNumber=:boqItemNumber").setParameter("boqItemNumber", (Object)boqItemNumber).executeUpdate();
        session.flush();
    }
    
    private void updateNewBOQApprovedFlag(final String boqItemNumber) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE NewBOQEntity set isNewBOQApproved=:isNewBOQApproved, newBOQApprovalStatus=:newBOQApprovalStatus, approvedFrom=:approvedFrom where boqItemNumber in (:boqItemNumber)").setParameter("isNewBOQApproved", (Object)true).setParameter("newBOQApprovalStatus", (Object)EnumConstants.NewBOQApprovalConstants.APPROVED).setParameter("approvedFrom", (Object)EnumConstants.FromType.CLOUD).setParameter("boqItemNumber", (Object)boqItemNumber).executeUpdate();
        session.flush();
    }
    
    private void updateSubstitutionNumberInNewBOQ(final JSONArray newBOQJsonArray, final String substitutionReferenceNumber) {
        final Session session = this.sessionFactory.getCurrentSession();
        for (final String boqItemNumber : newBOQJsonArray) {
            final ProjectionList projectionList = Projections.projectionList();
            projectionList.add(Projections.property("substitutionReferenceNumber").as("substitutionReferenceNumber"));
            final Criteria criteria = session.createCriteria((Class)NewBOQEntity.class).add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqItemNumber)).setProjection((Projection)projectionList).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
            if (criteria.uniqueResult() != null) {
                final Map<String, Object> map = (Map<String, Object>)criteria.uniqueResult();
                if (map.get("substitutionReferenceNumber") != null) {
                    continue;
                }
                session.createQuery("UPDATE NewBOQEntity set substitutionReferenceNumber=:substitutionReferenceNumber where boqItemNumber=:boqItemNumber)").setParameter("substitutionReferenceNumber", (Object)substitutionReferenceNumber).setParameter("boqItemNumber", (Object)boqItemNumber).executeUpdate();
                session.flush();
            }
        }
    }
    
    private void updateBOQWithIsSubstitute(final JSONArray boqItemNumber, final boolean isForSubstitute) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE BOQEntity set isForSubstitute=:isForSubstitute where boqItemNumber in (:boqItemNumber)").setParameter("isForSubstitute", (Object)isForSubstitute).setParameterList("boqItemNumber", (Collection)boqItemNumber).executeUpdate();
        session.flush();
    }
    
    private void updateBOQWithSubstitutionItems(final JSONArray boqItemNumber, final boolean isForSubstitute) {
        final Session session = this.sessionFactory.getCurrentSession();
        session.createQuery("UPDATE BOQEntity set isForSubstitute=:isForSubstitute where boqItemNumber in (:boqItemNumber)").setParameter("isForSubstitute", (Object)isForSubstitute).setParameterList("boqItemNumber", (Collection)boqItemNumber).executeUpdate();
        session.flush();
        final double progressPercentage = 100.0;
        session.createQuery("UPDATE BOQEntity this_ set approvedAmount=this_.executedAmount,approvedQuantity=this_.executedQuantity, progressPercentage=:progressPercentage where boqItemNumber in (:boqItemNumber)").setParameterList("boqItemNumber", (Collection)boqItemNumber).setParameter("progressPercentage", (Object)progressPercentage).executeUpdate();
        session.flush();
    }
    
    private int gettingMaxSubstitutionId() {
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQEntity.class);
        criteria.setProjection((Projection)Projections.max("serialNo"));
        if (criteria.uniqueResult() != null) {
            final int serialNo = (int)criteria.uniqueResult();
            return serialNo + 1;
        }
        return 1;
    }
    
    public JSONObject financialStatementView(final String winCode, final String substitutionReferenceNumber, final String currentStatus, final boolean hasBillAdjustment) {
        final JSONObject jsonObject = new JSONObject();
        final ProjectionList projectionList1 = Projections.projectionList();
        double newBOQApprovedAmount = 0.0;
        double substituteNewBOQApprovedAmount = 0.0;
        double paidAmount = 0.0;
        double totalApprovedAmount = 0.0;
        projectionList1.add(Projections.sqlGroupProjection("sum(approvedAmount) as newBOQApprovedAmount", "winCode, isApproved", new String[] { "newBOQApprovedAmount" }, new Type[] { (Type)StandardBasicTypes.DOUBLE }));
        final Criteria criteria1 = this.sessionFactory.getCurrentSession().createCriteria((Class)NewBOQEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("isApproved", (Object)true)).setProjection((Projection)projectionList1);
        if (criteria1.uniqueResult() != null) {
            newBOQApprovedAmount = (double)criteria1.uniqueResult();
        }
        jsonObject.put((Object)"newBOQApprovedAmount", (Object)newBOQApprovedAmount);
        final ProjectionList projectionList2 = Projections.projectionList();
        projectionList2.add(Projections.sqlGroupProjection("sum(approvedAmount) as substituteNewBOQApprovedAmount", "winCode, isApproved, isForSubstitute", new String[] { "substituteNewBOQApprovedAmount" }, new Type[] { (Type)StandardBasicTypes.DOUBLE }));
        final Criteria criteria2 = this.sessionFactory.getCurrentSession().createCriteria((Class)NewBOQEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("isForSubstitute", (Object)true)).add((Criterion)Restrictions.eq("isApproved", (Object)true)).setProjection((Projection)projectionList2);
        if (criteria2.uniqueResult() != null) {
            substituteNewBOQApprovedAmount = (double)criteria2.uniqueResult();
        }
        jsonObject.put((Object)"substituteNewBOQApprovedAmount", (Object)substituteNewBOQApprovedAmount);
        final ProjectionList projectionList3 = Projections.projectionList();
        if (hasBillAdjustment) {
            projectionList3.add(Projections.sum("grossAmtIncludesTax").as("grossAmtIncludesTax"));
        }
        else {
            projectionList3.add(Projections.sum("grossAmount").as("grossAmount"));
        }
        final Criteria criteria3 = this.sessionFactory.getCurrentSession().createCriteria((Class)BillEntity.class).setProjection((Projection)projectionList3).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("status", (Object)EnumConstants.BillApprovalStatus.APPROVED));
        if (criteria3.uniqueResult() != null) {
            paidAmount = (double)criteria3.uniqueResult();
        }
        jsonObject.put((Object)"paidAmount", (Object)paidAmount);
        final ProjectionList projectionList4 = Projections.projectionList();
        projectionList4.add(Projections.sqlGroupProjection("sum(approvedAmount) as totalApprovedAmount", "winCode", new String[] { "totalApprovedAmount" }, new Type[] { (Type)StandardBasicTypes.DOUBLE }));
        final Criteria criteria4 = this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("isApproved", (Object)true)).setProjection((Projection)projectionList4);
        if (criteria4.uniqueResult() != null) {
            totalApprovedAmount = (double)criteria4.uniqueResult();
        }
        jsonObject.put((Object)"remainingAmount", (Object)(totalApprovedAmount - paidAmount));
        final ProjectionList projectionList5 = Projections.projectionList();
        projectionList5.add(Projections.property("winCode").as("winCode")).add(Projections.property("workName").as("workName")).add(Projections.property("contractorName").as("contractorName")).add(Projections.property("tenderNumber").as("tenderNumber")).add(Projections.property("tenderPercentage").as("tenderPercentage")).add(Projections.property("asPerSubstitutionModifiedAmount").as("asPerSubstitutionModifiedAmount")).add(Projections.property("estimatedContractValue").as("estimatedContractValue")).add(Projections.property("agreementAmount").as("agreementAmount")).add(Projections.property("estimatedAmount").as("estimatedAmount"));
        final Criteria criteria5 = this.sessionFactory.getCurrentSession().createCriteria((Class)WorksEntity.class).setProjection((Projection)projectionList5).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        jsonObject.put((Object)"workDetails", criteria5.uniqueResult());
        if (substitutionReferenceNumber != null && currentStatus.equals("APPROVED")) {
            final ProjectionList projectionList6 = Projections.projectionList();
            projectionList6.add(Projections.property("winCode").as("winCode")).add(Projections.property("overallPreviousSubstitutionAmount").as("overallPreviousSubstitutionAmount")).add(Projections.property("overallCurrentSubstitutionAmount").as("overallCurrentSubstitutionAmount")).add(Projections.property("previousCumulativeNewBOQAmount").as("previousCumulativeNewBOQAmount")).add(Projections.property("previousCumulativeSubstitutionAmount").as("previousCumulativeSubstitutionAmount")).add(Projections.property("substitutedDifferenceAmount").as("substitutedDifferenceAmount")).add(Projections.property("excessBOQsAmount").as("excessBOQsAmount")).add(Projections.property("savedBOQsAmount").as("savedBOQsAmount")).add(Projections.property("percentageOfNewBOQsApprovedAmount").as("percentageOfNewBOQsApprovedAmount")).add(Projections.property("percentageOfNewBOQsSubstitutedAmount").as("percentageOfNewBOQsSubstitutedAmount")).add(Projections.property("financialComments").as("financialComments")).add(Projections.property("percentageOfTotalValueOfWorkAfterSubstitution").as("percentageOfTotalValueOfWorkAfterSubstitution")).add(Projections.property("cumulativeNewBOQAmount").as("cumulativeNewBOQAmount")).add(Projections.property("cumulativeSubstitutionAmount").as("cumulativeSubstitutionAmount")).add(Projections.property("cumulativeSavingSubstitutionAmount").as("cumulativeSavingSubstitutionAmount")).add(Projections.property("currentStatus").as("currentStatus"));
            final Criteria criteria6 = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQEntity.class).setProjection((Projection)projectionList6).add((Criterion)Restrictions.eq("substitutionReferenceNumber", (Object)substitutionReferenceNumber)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
            if (criteria6 != null) {
                jsonObject.put((Object)"substitutionDetails", criteria6.uniqueResult());
                final Map<String, Object> map = (Map<String, Object>)criteria6.uniqueResult();
                jsonObject.put((Object)"totalSavingAmount", map.get("cumulativeSavingSubstitutionAmount"));
            }
        }
        else if (currentStatus == null || currentStatus.isEmpty() || !currentStatus.equals("APPROVED")) {
            final ProjectionList projectionList6 = Projections.projectionList();
            projectionList6.add(Projections.property("winCode").as("winCode")).add(Projections.property("overallPreviousSubstitutionAmount").as("overallPreviousSubstitutionAmounts")).add(Projections.property("overallCurrentSubstitutionAmount").as("overallPreviousSubstitutionAmount")).add(Projections.property("cumulativeNewBOQAmount").as("previousCumulativeNewBOQAmount")).add(Projections.property("cumulativeSubstitutionAmount").as("previousCumulativeSubstitutionAmount")).add(Projections.property("cumulativeSavingSubstitutionAmount").as("cumulativeSavingSubstitutionAmount"));
            final Criteria criteria6 = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQEntity.class).setProjection((Projection)projectionList6).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("isLatest", (Object)true)).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
            if (criteria6 != null) {
                jsonObject.put((Object)"substitutionDetails", criteria6.uniqueResult());
            }
        }
        return jsonObject;
    }
    
    public JSONObject getBOQDetails(final String boqItemNumber) {
        final Session session = this.sessionFactory.getCurrentSession();
        final JSONObject jsonObject = new JSONObject();
        final Map<String, Object> map = (Map<String, Object>)session.createCriteria((Class)BOQEntity.class).add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqItemNumber)).setProjection((Projection)Projections.projectionList().add(Projections.property("boqItemNumber").as("boqItemNumber")).add(Projections.property("deApprovedQuantity").as("deApprovedQuantity")).add(Projections.property("deApprovedAmount").as("deApprovedAmount")).add(Projections.property("executedQuantity").as("executedQuantity")).add(Projections.property("executedAmount").as("executedAmount")).add(Projections.property("shortName").as("shortName")).add(Projections.property("itemDescription").as("itemDescription")).add(Projections.property("approvedRate").as("approvedRate")).add(Projections.property("uomName").as("uomName")).add(Projections.property("units").as("units"))).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).uniqueResult();
        jsonObject.putAll((Map)map);
        return jsonObject;
    }
    
    public List<Map<String, Object>> SubstituteBOQLogsHistory(final String boqItemNumber) {
        final ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("winCode").as("winCode")).add(Projections.property("substitutionReferenceNumber").as("substitutionReferenceNumber")).add(Projections.property("oldApprovedQuantity").as("oldApprovedQuantity")).add(Projections.property("newApprovedQuantity").as("newApprovedQuantity")).add(Projections.property("approverName").as("approverName")).add(Projections.property("approverDesignation").as("approverDesignation")).add(Projections.property("createdAt").as("createdAt")).add(Projections.property("isSubstituted").as("isSubstituted")).add(Projections.property("isDeleted").as("isDeleted"));
        final Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria((Class)SubstituteBOQHistoryEntity.class).setProjection((Projection)projectionList).add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqItemNumber)).setProjection((Projection)projectionList).addOrder(Order.asc("createdAt")).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        return (List<Map<String, Object>>)criteria.list();
    }
    
    public boolean checkBoq(final String boqItemNumber, final String winCode) {
        final int count = (int)(long)this.sessionFactory.getCurrentSession().createCriteria((Class)BOQEntity.class).add((Criterion)Restrictions.eq("winCode", (Object)winCode)).add((Criterion)Restrictions.eq("boqItemNumber", (Object)boqItemNumber)).setProjection(Projections.rowCount()).uniqueResult();
        return count > 0;
    }
} 

Java online compiler

Write, Run & Share Java code online using OneCompiler's Java online compiler for free. It's one of the robust, feature-rich online compilers for Java language, running the Java LTS version 17. Getting started with the OneCompiler's Java editor is easy and fast. The editor shows sample boilerplate code when you choose language as Java and start coding.

Taking inputs (stdin)

OneCompiler's Java online editor supports stdin and users can give inputs to the programs using the STDIN textbox under the I/O tab. Using Scanner class in Java program, you can read the inputs. Following is a sample program that shows reading STDIN ( A string in this case ).

import java.util.Scanner;
class Input {
    public static void main(String[] args) {
    	Scanner input = new Scanner(System.in);
    	System.out.println("Enter your name: ");
    	String inp = input.next();
    	System.out.println("Hello, " + inp);
    }
}

Adding dependencies

OneCompiler supports Gradle for dependency management. Users can add dependencies in the build.gradle file and use them in their programs. When you add the dependencies for the first time, the first run might be a little slow as we download the dependencies, but the subsequent runs will be faster. Following sample Gradle configuration shows how to add dependencies

apply plugin:'application'
mainClassName = 'HelloWorld'

run { standardInput = System.in }
sourceSets { main { java { srcDir './' } } }

repositories {
    jcenter()
}

dependencies {
    // add dependencies here as below
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
}

About Java

Java is a very popular general-purpose programming language, it is class-based and object-oriented. Java was developed by James Gosling at Sun Microsystems ( later acquired by Oracle) the initial release of Java was in 1995. Java 17 is the latest long-term supported version (LTS). As of today, Java is the world's number one server programming language with a 12 million developer community, 5 million students studying worldwide and it's #1 choice for the cloud development.

Syntax help

Variables

short x = 999; 			// -32768 to 32767
int   x = 99999; 		// -2147483648 to 2147483647
long  x = 99999999999L; // -9223372036854775808 to 9223372036854775807

float x = 1.2;
double x = 99.99d;

byte x = 99; // -128 to 127
char x = 'A';
boolean x = true;

Loops

1. If Else:

When ever you want to perform a set of operations based on a condition If-Else is used.

if(conditional-expression) {
  // code
} else {
  // code
}

Example:

int i = 10;
if(i % 2 == 0) {
  System.out.println("i is even number");
} else {
  System.out.println("i is odd number");
}

2. Switch:

Switch is an alternative to If-Else-If ladder and to select one among many blocks of code.

switch(<conditional-expression>) {    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
...    
    
default:     
 //code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition. Usually for loop is preferred when number of iterations is known in advance.

for(Initialization; Condition; Increment/decrement){  
    //code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while(<condition>){  
 // code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {
  // code 
} while (<condition>); 

Classes and Objects

Class is the blueprint of an object, which is also referred as user-defined data type with variables and functions. Object is a basic unit in OOP, and is an instance of the class.

How to create a Class:

class keyword is required to create a class.

Example:

class Mobile {
    public:    // access specifier which specifies that accessibility of class members 
    string name; // string variable (attribute)
    int price; // int variable (attribute)
};

How to create a Object:

Mobile m1 = new Mobile();

How to define methods in a class:

public class Greeting {
    static void hello() {
        System.out.println("Hello.. Happy learning!");
    }

    public static void main(String[] args) {
        hello();
    }
}

Collections

Collection is a group of objects which can be represented as a single unit. Collections are introduced to bring a unified common interface to all the objects.

Collection Framework was introduced since JDK 1.2 which is used to represent and manage Collections and it contains:

  1. Interfaces
  2. Classes
  3. Algorithms

This framework also defines map interfaces and several classes in addition to Collections.

Advantages:

  • High performance
  • Reduces developer's effort
  • Unified architecture which has common methods for all objects.
CollectionDescription
SetSet is a collection of elements which can not contain duplicate values. Set is implemented in HashSets, LinkedHashSets, TreeSet etc
ListList is a ordered collection of elements which can have duplicates. Lists are classified into ArrayList, LinkedList, Vectors
QueueFIFO approach, while instantiating Queue interface you can either choose LinkedList or PriorityQueue.
DequeDeque(Double Ended Queue) is used to add or remove elements from both the ends of the Queue(both head and tail)
MapMap contains key-values pairs which don't have any duplicates. Map is implemented in HashMap, TreeMap etc.