public async Task <ResponseDTO> RegisterContractAsync(ContractRegisterRequest request)
        {
            request.ContractCode = await GetNextCode(request);

            request.PeriodId = await GetPeriodByCode(request.ContractCode.Substring(2, 6));

            request.ContractDate = DateTime.Now;

            //TODO: Matodo para agregar informacion a la tabla Obligation, conceptos del tipo obligations
            var response = await ValidateEntityRegister(request);

            if (response.IsValid)
            {
                //await CreateContractDetail(request);

                //await CreateContractDetailObligation(request);

                var command = _mapper.Map <ContractRegisterRequest, ContractRegisterCommand>(request);

                command.ContractStatusId = await GetStatusbyEntityAndCodeAsync(Constants.EntityCode.Contract, Constants.EntityStatus.Contract.Draft);

                var resp = await _bus.SendAsync(command);

                return(ResponseBuilder.Correct(resp, command.ContractId, command.ContractCode));
            }

            return(response);
        }
        private async Task CreateContractDetailObligation(ContractRegisterRequest request)
        {
            var obligations = await _conceptApplicationService.GetConceptsByTypeCodeAsync(Constants.GeneralTableCode.ConceptType.Obligation);

            var contractDetailObligationList = new List <ContractDetailObligationRegisterRequest>();
            var contractDetailFirst          = request.ContractDetails.First();
            var c = 1;

            foreach (var item in obligations.Data)
            {
                var contractDetailObligation = new ContractDetailObligationRegisterRequest();
                contractDetailObligation.ContractDetailId           = contractDetailFirst.ContractDetailId;
                contractDetailObligation.ContractDetailObligationId = c * -1;
                contractDetailObligation.ObligationDate             = DateTime.Now;
                contractDetailObligation.ConceptId      = item.ConceptId;
                contractDetailObligation.EntityStatusId = await GetStatusbyEntityAndCodeAsync(Constants.EntityCode.ContractDetail, Constants.EntityStatus.ContractDetail.Pending);

                contractDetailObligation.Comment          = item.Description;
                contractDetailObligation.InfractionAmount = item.ConceptAmount;
                contractDetailObligation.PeriodId         = request.PeriodId;
                contractDetailObligation.TenantId         = request.TenantId;
                contractDetailObligation.RowStatus        = true;
                contractDetailObligation.CreatedBy        = request.UserId;
                contractDetailObligation.CreationDate     = DateTime.Now;
                contractDetailObligation.UpdatedBy        = request.UserId;
                contractDetailObligation.UpdatedDate      = DateTime.Now;
                contractDetailObligationList.Add(contractDetailObligation);
            }

            contractDetailFirst.ContractDetailObligations = contractDetailObligationList;
        }
        public async Task <ResponseDTO> ValidateEntityRegister(ContractRegisterRequest request)
        {
            bool isValid = true;
            Expression <Func <ContractRegisterRequest, bool> > queryFilter = p => true;
            var errorMessage = "";

            queryFilter = queryFilter.And(p => p.ContractCode == request.ContractCode);
            var contract = await _contractDataAccess.FirstOrDefaultAsync(queryFilter);

            if (contract != null)
            {
                isValid      = false;
                errorMessage = "Contract already Exists";
            }

            //Existe un Lease para el mismo tenant Activo o Futuro
            if (isValid)
            {
                queryFilter = p => p.TenantId == request.TenantId;
                queryFilter = queryFilter.And(p => p.ContractStatusCode == Constants.EntityStatus.Contract.Formalized && p.RowStatus);
                contract    = await _contractDataAccess.FirstOrDefaultAsync(queryFilter);

                if (contract != null)
                {
                    isValid      = false;
                    errorMessage = "Already Exists a tenant associated to other Lease Formalized";
                }
            }

            //Validate Period
            if (isValid)
            {
                var period = await _periodApplicationService.GetLastPeriodAsync();

                if (period != null && period.Data.EndDate < request.EndDate)
                {
                    isValid      = false;
                    errorMessage = "There is no period configurated to support the end date of this Lease, please create period";
                }
            }


            var response = new ResponseDTO()
            {
                IsValid  = string.IsNullOrEmpty(errorMessage),
                Messages = new List <ApplicationMessage>()
            };

            response.Messages.Add(new ApplicationMessage()
            {
                Key     = string.IsNullOrEmpty(errorMessage) ? "Ok" : "Error",
                Message = errorMessage
            });

            return(response);
        }
Beispiel #4
0
        [HttpPost, Route("register")] //, AmigoTenantClaimsAuthorize(ActionCode = ConstantsSecurity.ActionCode.ContractCreate)]
        public async Task <ResponseDTO> Register(ContractRegisterRequest contract)
        {
            if (ModelState.IsValid)
            {
                var response = await _contractApplicationService.RegisterContractAsync(contract);

                return(response);
            }
            return(ModelState.ToResponse());
        }
        private async Task CreateContractDetail(ContractRegisterRequest request)
        {
            var isLastPeriod         = false;
            var period               = (await _periodApplicationService.GetPeriodByIdAsync(request.PeriodId)).Data;
            var contractEndDate      = request.EndDate;
            var currentPeriodDueDate = period.DueDate.Value.AddMonths(1);
            var id = -1;
            var contractDetails = new List <ContractDetailRegisterRequest>();
            var paymentsPeriod  = new List <PaymentPeriodRegisterRequest>();
            var rentConceptId   = await GetConceptIdByCode(Constants.GeneralTableCode.ConceptType.Rent);

            var depositConceptId = await GetConceptIdByCode(Constants.GeneralTableCode.ConceptType.Deposit);

            var entityStatusId = await GetStatusbyEntityAndCodeAsync(Constants.EntityCode.PaymentPeriod, Constants.EntityStatus.PaymentPeriod.Pending);

            var paymentTypeRentId = await GetGeneralTableIdByTableNameAndCode(Constants.GeneralTableName.PaymentType, Constants.GeneralTableCode.PaymentType.Rent);

            var paymentTypeDepositId = await GetGeneralTableIdByTableNameAndCode(Constants.GeneralTableName.PaymentType, Constants.GeneralTableCode.PaymentType.Deposit);



            while (contractEndDate > currentPeriodDueDate)
            {
                //SetContractDetail(contractDetails, request, period, id, isLastPeriod);
                SetPaymentsPeriod(paymentsPeriod, request, period, id, isLastPeriod, rentConceptId, entityStatusId, paymentTypeRentId, depositConceptId, paymentTypeDepositId);

                //TODO: nO HA SEQUENCE 13 SE ESTA CAYENDO
                period = (await _periodApplicationService.GetPeriodBySequenceAsync(period.Sequence + 1)).Data;
                currentPeriodDueDate = period.DueDate.Value.AddMonths(1);
                id--;

                if (contractEndDate.Value.Year == currentPeriodDueDate.Year && contractEndDate.Value.Month == currentPeriodDueDate.Month)
                {
                    isLastPeriod = true;
                    //SetContractDetail(contractDetails, request, period, id, isLastPeriod);
                    SetPaymentsPeriod(paymentsPeriod, request, period, id, isLastPeriod, rentConceptId, entityStatusId, paymentTypeRentId, depositConceptId, paymentTypeDepositId);
                    //request.ContractDetails = contractDetails;
                    request.PaymentsPeriod = paymentsPeriod;
                    return;
                }
                else if (currentPeriodDueDate.CompareTo(contractEndDate) > 0)
                {
                    //request.ContractDetails = contractDetails;
                    request.PaymentsPeriod = paymentsPeriod;
                    return;
                }
            }
        }
        private async Task <string> GetNextCode(ContractRegisterRequest request)
        {
            var year  = String.Format("{0:D3}", request.BeginDate.Value.Year);
            var month = String.Format("{0:D2}", request.BeginDate.Value.Month);
            var prefixContractCode = "LE" + year + month;
            var lastCode           = await GetLastCode(prefixContractCode);

            string value = "001";

            if (lastCode.Data != null)
            {
                var code = lastCode.Data.ContractCode;
                value = String.Format("{0:D3}", int.Parse(code.Substring(code.Length - 3, 3)) + 1);
            }
            return(prefixContractCode + value);
        }
        private void SetPaymentsPeriod(List <PaymentPeriodRegisterRequest> paymentsPeriod, ContractRegisterRequest request, PeriodDTO period, int id, bool isLastPeriod, int?rentId, int?entityStatusId, int?paymentTypeId, int?depositConceptId, int?paymentTypeDepositId)
        {
            ///////////////////
            //SETTING FOR  DEPOSIT
            ///////////////////

            if (Math.Abs(id) == 1)
            {
                var paymentPeriodDeposit = new PaymentPeriodRegisterRequest();
                paymentPeriodDeposit.PaymentPeriodId       = id;
                paymentPeriodDeposit.ConceptId             = depositConceptId; //"CODE FOR CONCEPT"; //TODO:
                paymentPeriodDeposit.ContractId            = request.ContractId;
                paymentPeriodDeposit.TenantId              = request.TenantId;
                paymentPeriodDeposit.PeriodId              = period.PeriodId;
                paymentPeriodDeposit.PaymentPeriodStatusId = entityStatusId; //TODO: PONER EL CODIGO CORRECTO PARA EL CONTRACTDETAILSTATUS
                paymentPeriodDeposit.RowStatus             = true;
                paymentPeriodDeposit.CreatedBy             = request.UserId;
                paymentPeriodDeposit.CreationDate          = DateTime.Now;
                paymentPeriodDeposit.UpdatedBy             = request.UserId;
                paymentPeriodDeposit.UpdatedDate           = DateTime.Now;
                paymentPeriodDeposit.PaymentTypeId         = paymentTypeDepositId;
                paymentPeriodDeposit.PaymentAmount         = request.RentDeposit;
                paymentPeriodDeposit.DueDate = period.DueDate;
                paymentsPeriod.Add(paymentPeriodDeposit);
            }

            ///////////////////
            //SETTING FOR  RENT
            ///////////////////

            var paymentPeriodRent = new PaymentPeriodRegisterRequest();

            paymentPeriodRent.PaymentPeriodId       = id;
            paymentPeriodRent.ConceptId             = rentId; //"CODE FOR CONCEPT"; //TODO:
            paymentPeriodRent.ContractId            = request.ContractId;
            paymentPeriodRent.TenantId              = request.TenantId;
            paymentPeriodRent.PeriodId              = period.PeriodId;
            paymentPeriodRent.PaymentPeriodStatusId = entityStatusId; //TODO: PONER EL CODIGO CORRECTO PARA EL CONTRACTDETAILSTATUS
            paymentPeriodRent.RowStatus             = true;
            paymentPeriodRent.CreatedBy             = request.UserId;
            paymentPeriodRent.CreationDate          = DateTime.Now;
            paymentPeriodRent.UpdatedBy             = request.UserId;
            paymentPeriodRent.UpdatedDate           = DateTime.Now;
            paymentPeriodRent.PaymentTypeId         = paymentTypeId;

            if (!isLastPeriod)
            {
                paymentPeriodRent.PaymentAmount = Math.Abs(id) == 1? CalculateFirstRent(request.BeginDate, request.RentPrice) : request.RentPrice;
            }
            else
            {
                paymentPeriodRent.PaymentAmount = CalculateLastRent(request.EndDate, request.RentPrice);
            }
            paymentPeriodRent.DueDate = period.DueDate;
            paymentsPeriod.Add(paymentPeriodRent);
        }