Files
moadiran/Back/Controllers/InvoiceItemController.cs
mmrbnjd 48072d6e00 ...
2025-01-24 19:18:17 +03:30

285 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Back.Common;
using Back.Data.Models;
using Back.Services;
using Back.Services.Warehouse;
using Back.Validations;
using FluentValidation;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Shared.DTOs;
using Shared.Enums;
using System.Net;
using System.Runtime.ConstrainedExecution;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Back.Controllers
{
[Route("api/[controller]")]
[Authorize]
[ApiController]
public class InvoiceItemController : ControllerBase
{
private readonly servInvoiceItem _servInvoiceItem;
private readonly servUser _servUser;
private readonly AUInvoiceItemValidation _validationInvoiceItem;
private readonly servInvoice _servInvoice;
private readonly RemittanceService _remittanceService;
private readonly WarehouseService _warehouseService;
public InvoiceItemController(servInvoiceItem servInvoiceItem, servUser servUser, AUInvoiceItemValidation validationInvoiceItem, servInvoice servInvoice, RemittanceService remittanceService, WarehouseService warehouseService)
{
_servInvoiceItem = servInvoiceItem;
_servUser = servUser;
_validationInvoiceItem = validationInvoiceItem;
_servInvoice = servInvoice;
_remittanceService = remittanceService;
_warehouseService = warehouseService;
}
[HttpPost("AddItem")]
public async Task<ActionResult<bool>> AddItem([FromBody] InvoiceItemAction<InvoiceItemDTO> model)
{
//-----GetUserAndCompany
var claim = HttpContext.User.Claims.First(c => c.Type == "UserID");
var UserID = claim.Value;
var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID));
//-----Validaton
var resultValidationmodel = await _validationInvoiceItem.ValidateAsync(Tuple.Create(user.RolUsers.First().CompanyID, model.invoiceID, model.item, eActionValidation.add));
if (!resultValidationmodel.IsValid)
return BadRequest(resultValidationmodel.Errors.Select(s => s.ErrorMessage).ToList());
//-----Get invoice
Invoice invoice = await _servInvoice.GetInvoiceByInvoiceID(user.RolUsers.First().CompanyID, model.invoiceID);
if (invoice == null)
return BadRequest(new List<string> { "invoice notFound..." });
if (_servInvoice.checkFatherInvoiceByInvoiceID(user.RolUsers.First().CompanyID, model.invoiceID).Result)
return BadRequest(new List<string> {"این صورتحساب، مرجع چند صورتحساب دیگر می باشد " +'\n'+
"برای تغییر در آیتم ها ابتدا صورتحساب هایی که ارتباط دارند را حذف کنید" });
if (invoice.invoiceType == InvoiceType.Repair)
{
return BadRequest(new List<string> { "امکان افزودن کالا جدید در صورتحساب اصلاحی وجود ندارد" });
}
if (invoice.invoiceType == InvoiceType.BackFrmSale)
{
return BadRequest(new List<string> { "امکان افزودن کالا جدید در صورتحساب برگشت از فروش وجود ندارد" });
}
invoice.LastChangeUserID = Convert.ToInt32(UserID);
if (await _servInvoice.UpdateInvoice(invoice))
{
//check mojodi
//add
var lastitemCOD= invoice.invoiceDetails.OrderByDescending(o => o.ID).Select(s => s.CODID).FirstOrDefault();
if (lastitemCOD!=null && lastitemCOD!=0 && await _remittanceService.HasaRemittance(invoice.ID, lastitemCOD))
{
var inv = await _warehouseService.Inventory(user.RolUsers.First().CompanyID, model.item.CODID);
if (inv - model.item.am <= 0)
{
return BadRequest(new List<string> { "موجودی کالا کمتر از درخواست شماست" });
}
else
{
await _remittanceService.ADD(new Shared.DTOs.Warehouse.RemittanceDto()
{
CODID = model.item.CODID,
Count = model.item.am,
Date = DateTime.Now.ConvertMiladiToShamsi(),
info = $"حواله خودکار از صورتحساب {model.invoiceID}",
InvoiceID = model.invoiceID,
Type = TypeRemittance.Sale
});
}
}
return Ok(await _servInvoiceItem.Add(new InvoiceItem
{
am = model.item.am,
fee = model.item.fee,
dis = model.item.dis,
CODID = model.item.CODID,
InvoiceID = model.invoiceID,
}));
}
else return BadRequest(new List<string> { "خطایی رخ داده" });
}
[HttpPut("UpdateItem")]
public async Task<ActionResult<bool>> UpdateItem([FromBody] InvoiceItemAction<InvoiceItemDTO> model)
{
//-----GetUserAndCompany
var claim = HttpContext.User.Claims.First(c => c.Type == "UserID");
var UserID = claim.Value;
var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID));
//-----Get invoice
Invoice invoice = await _servInvoice.GetInvoiceByInvoiceID(user.RolUsers.First().CompanyID, model.invoiceID);
if (invoice == null)
return BadRequest(new List<string> { "invoice notFound..." });
if (_servInvoice.checkFatherInvoiceByInvoiceID(user.RolUsers.First().CompanyID, model.invoiceID).Result)
return BadRequest(new List<string> {"این صورتحساب، مرجع چند صورتحساب دیگر می باشد " +'\n'+
"برای تغییر در آیتم ها ابتدا صورتحساب هایی که ارتباط دارند را حذف کنید" });
//-----Validaton
var resultValidationmodel = await _validationInvoiceItem.ValidateAsync(Tuple.Create(user.RolUsers.First().CompanyID, model.invoiceID, model.item, eActionValidation.update));
if (!resultValidationmodel.IsValid)
{
if (invoice.invoiceType != InvoiceType.BackFrmSale || (invoice.invoiceType != InvoiceType.BackFrmSale
&& resultValidationmodel.Errors.Count > 1))
{
return BadRequest(resultValidationmodel.Errors.Select(s => s.ErrorMessage).ToList());
}
}
var invoiceitem = await _servInvoiceItem.Getinvoiceitem(user.RolUsers.First().CompanyID, model.invoiceID, model.item.ID.Value);
if (invoiceitem == null)
return BadRequest(new List<string> { "invoice Item notFound..." });
if (invoice.invoiceType == InvoiceType.Repair && invoiceitem.CODID != model.item.CODID)
{
return BadRequest(new List<string> { "در صورتحساب اصلاجی نمیتوان کالا را تغییر داد" });
}
if (invoice.invoiceType == InvoiceType.BackFrmSale && invoiceitem.CODID != model.item.CODID)
{
return BadRequest(new List<string> { "در صورتحساب برگشت از فروش نمیتوان کالا را تغییر داد" });
}
if (invoice.invoiceType == InvoiceType.Repair && invoiceitem.fee != model.item.fee)
{
return BadRequest(new List<string> { "در صورتحساب اصلاجی نمیتوان مبلغ واحد را تغییر داد" });
}
if (invoice.invoiceType == InvoiceType.BackFrmSale && invoiceitem.fee != model.item.fee)
{
return BadRequest(new List<string> { "در صورتحساب برگشت از فروش نمیتوان مبلغ واحد را تغییر داد" });
}
if (invoice.invoiceType == InvoiceType.Repair && invoiceitem.dis != model.item.dis)
{
return BadRequest(new List<string> { "در صورتحساب اصلاحی نمیتوان مبلغ تخفیف را تغییر داد" });
}
if (invoice.invoiceType == InvoiceType.BackFrmSale && invoiceitem.dis != model.item.dis)
{
return BadRequest(new List<string> { "در صورتحساب برگشت از فروش نمیتوان مبلغ تخفیف را تغییر داد" });
}
if (invoice.invoiceType == InvoiceType.BackFrmSale && invoiceitem.am < model.item.am)
return BadRequest(new List<string> { "در صورتحساب برگشت از فروش تعداد آیتم فقط میتواند کاهشی باشد" });
invoice.LastChangeUserID = Convert.ToInt32(UserID);
var copyInvoice = (InvoiceItem)invoiceitem.Clone();
if (invoice.invoiceType == InvoiceType.BackFrmSale)
invoiceitem.am = model.item.am;
else
{
invoiceitem.am = model.item.am;
invoiceitem.fee = model.item.fee;
invoiceitem.dis = model.item.dis;
invoiceitem.CODID = model.item.CODID;
}
if (await _servInvoice.UpdateInvoice(invoice))
{
if (copyInvoice.am != model.item.am || copyInvoice.CODID != model.item.CODID)
{
if (await _remittanceService.HasaRemittance(model.invoiceID, copyInvoice.CODID))
{
var inv = await _warehouseService.Inventory(user.RolUsers.First().CompanyID, model.item.CODID);
if (inv+ copyInvoice.am - model.item.am < 0)
return BadRequest(new List<string> { "خطای انبار :"+"موجودی کالا کمتر از درخواست شماست" });
else await _remittanceService.DeleteByInvoiceIDandCODID(model.invoiceID, copyInvoice.CODID);
// حواله جئدید
await _remittanceService.ADD(new Shared.DTOs.Warehouse.RemittanceDto()
{
CODID = model.item.CODID,
Count = model.item.am,
Date = DateTime.Now.ConvertMiladiToShamsi(),
info = $"حواله خودکار از صورتحساب {model.invoiceID}",
Type = TypeRemittance.Sale,
InvoiceID = model.invoiceID
});
}
}
return Ok(await _servInvoiceItem.Update(invoiceitem));
}
else return BadRequest(new List<string> { "خطایی رخ داده" });
}
[HttpDelete("DeleteItem/{InvoiceItemID}")]
public async Task<ActionResult<bool>> DeleteItem(int InvoiceItemID)
{
//-----GetUserAndCompany
var claim = HttpContext.User.Claims.First(c => c.Type == "UserID");
var UserID = claim.Value;
var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID));
//-----Get invoice
var invoiceitem = await _servInvoiceItem.GetInvoiceItemByInvoiceItemID(user.RolUsers.First().CompanyID, InvoiceItemID);
if (invoiceitem == null)
return NotFound(new List<string> { "invoice Item notFound..." });
if (_servInvoice.checkFatherInvoiceByInvoiceID(user.RolUsers.First().CompanyID, InvoiceItemID).Result)
return BadRequest(new List<string> {"این صورتحساب، مرجع چند صورتحساب دیگر می باشد " +'\n'+
"برای تغییر در آیتم ها ابتدا صورتحساب هایی که ارتباط دارند را حذف کنید" });
//-----Validaton
var resultValidationmodel = await _validationInvoiceItem.ValidateAsync(Tuple.Create(user.RolUsers.First().CompanyID, invoiceitem.InvoiceID.Value, new InvoiceItemDTO(), eActionValidation.delete));
if (!resultValidationmodel.IsValid)
return BadRequest(resultValidationmodel.Errors.Select(s => s.ErrorMessage).ToList());
if (invoiceitem.invoice.invoiceType == InvoiceType.Repair)
{
return BadRequest(new List<string> { "در صورتحساب اصلاجی نمیتوان کالا را حذف کذد" });
}
if (invoiceitem.invoice.invoiceType == InvoiceType.BackFrmSale)
{
return BadRequest(new List<string> { "در صورتحساب برگشت از فروش نمیتوان کالا را حذف کذد" });
}
invoiceitem.invoice.LastChangeUserID = Convert.ToInt32(UserID);
if (await _servInvoice.UpdateInvoice(invoiceitem.invoice))
{
if (await _remittanceService.HasaRemittance(invoiceitem.invoice.ID, invoiceitem.CODID))
await _remittanceService.DeleteByInvoiceIDandCODID(invoiceitem.invoice.ID, invoiceitem.CODID);
return Ok(await _servInvoiceItem.Delete(invoiceitem));
}
else return BadRequest(new List<string> { "خطایی رخ داده" });
}
}
}