2024-05-13 13:02:09 +03:30
using Back.Common ;
2024-07-04 18:49:11 +03:30
using Back.Data.Contracts ;
2024-05-13 13:02:09 +03:30
using Back.Data.Models ;
using Back.Services ;
2025-01-19 17:44:20 +03:30
using Back.Services.Warehouse ;
2024-05-13 13:02:09 +03:30
using Back.Validations ;
2024-05-28 15:03:08 +03:30
using Microsoft.AspNetCore.Authorization ;
2024-05-13 13:02:09 +03:30
using Microsoft.AspNetCore.Http ;
2024-05-29 15:51:06 +03:30
using Microsoft.AspNetCore.Http.HttpResults ;
2024-05-13 13:02:09 +03:30
using Microsoft.AspNetCore.Mvc ;
using Shared.DTOs ;
using Shared.DTOs.Serch ;
2025-01-19 17:44:20 +03:30
using Shared.Enums ;
2024-07-01 15:39:40 +03:30
using System.Diagnostics ;
2024-05-13 13:02:09 +03:30
namespace Back.Controllers
{
[Route("api/[controller] ")]
2024-05-28 15:03:08 +03:30
[Authorize]
2024-05-13 13:02:09 +03:30
[ApiController]
public class InvoiceController : ControllerBase
{
2024-07-04 17:18:59 +03:30
private readonly IConfiguration _configuration ;
2024-05-13 13:02:09 +03:30
private readonly servInvoice _servInvoice ;
private readonly servUser _servUser ;
private readonly AddOrUpdateInvoiceValidation _validationInvoice ;
2024-05-13 16:50:26 +03:30
private readonly servTaxPayer _servTaxPayer ;
2025-01-09 16:01:37 +03:30
private readonly servReport _servReport ;
2024-07-04 18:49:11 +03:30
private readonly IAsyncRepository < rptQueue > _rptQueueRepository ;
2025-01-19 17:44:20 +03:30
private readonly RemittanceService _remittanceService ;
private readonly WarehouseService _warehouseService ;
2025-01-20 14:10:15 +03:30
private readonly ReceiptService _receiptService ;
2025-01-19 17:44:20 +03:30
2025-01-24 19:18:17 +03:30
public InvoiceController ( IConfiguration configuration , servInvoice servInvoice , servUser servUser , AddOrUpdateInvoiceValidation validationInvoice , servTaxPayer servTaxPayer , servReport servReport , IAsyncRepository < rptQueue > rptQueueRepository , RemittanceService remittanceService , WarehouseService warehouseService , ReceiptService receiptService )
2024-05-13 13:02:09 +03:30
{
2025-01-19 17:44:20 +03:30
_configuration = configuration ;
2024-05-13 13:02:09 +03:30
_servInvoice = servInvoice ;
_servUser = servUser ;
_validationInvoice = validationInvoice ;
2024-05-13 16:50:26 +03:30
_servTaxPayer = servTaxPayer ;
2025-01-19 17:44:20 +03:30
_servReport = servReport ;
2024-07-04 18:49:11 +03:30
_rptQueueRepository = rptQueueRepository ;
2025-01-19 17:44:20 +03:30
_remittanceService = remittanceService ;
_warehouseService = warehouseService ;
2025-01-24 19:18:17 +03:30
_receiptService = receiptService ;
2024-05-13 13:02:09 +03:30
}
2025-01-19 17:44:20 +03:30
2024-05-13 13:02:09 +03:30
[HttpPost("GetAll")]
2024-05-17 23:05:46 +03:30
public async Task < ActionResult < PagingDto < InvoiceGridDTO > ? > > GetAll ( [ FromBody ] ItemSerchGetInvoices itemSerch )
2024-05-13 13:02:09 +03:30
{
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
return Ok ( await _servInvoice . GetInvoices ( user . RolUsers . First ( ) . CompanyID , itemSerch ) ) ;
2024-05-17 23:05:46 +03:30
}
2024-05-30 15:08:36 +03:30
[HttpGet("Get/{ID}/{loaddelete}")]
2024-07-03 16:05:28 +03:30
public async Task < ActionResult < InvoiceDTO ? > > GetAll ( int ID , bool loaddelete )
2024-05-17 23:05:46 +03:30
{
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
2024-07-03 16:05:28 +03:30
var result = await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , ID , ! loaddelete ) ;
2024-05-17 23:05:46 +03:30
2024-07-03 16:05:28 +03:30
return result = = null ? BadRequest ( ) : Ok ( result ) ;
2024-05-17 23:05:46 +03:30
2024-05-13 13:02:09 +03:30
}
2024-05-13 16:50:26 +03:30
[HttpPost("Add")]
public async Task < ActionResult < int > > Add ( [ FromBody ] NUInvoiceDTO item )
2024-05-13 13:02:09 +03:30
{
2024-05-26 13:04:53 +03:30
if ( string . IsNullOrEmpty ( item . InvoiceDate ) )
item . InvoiceDate = DateTime . Now . ConvertMiladiToShamsi ( ) ;
2024-05-16 23:40:32 +03:30
if ( string . IsNullOrEmpty ( item . InvoicIssueDate ) )
item . InvoicIssueDate = DateTime . Now . ConvertMiladiToShamsi ( ) ;
2024-05-26 17:25:34 +03:30
//if (!ModelState.IsValid)
// return BadRequest(item);
2024-05-13 13:02:09 +03:30
//-----GetUserAndCompany
2024-07-03 16:05:28 +03:30
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
2024-05-27 18:57:25 +03:30
var UserID = claim . Value ;
2024-05-13 13:02:09 +03:30
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
//-----Validaton
var resultValidationmodel = await _validationInvoice . ValidateAsync ( Tuple . Create ( user . RolUsers . First ( ) . CompanyID , item , eActionValidation . add ) ) ;
if ( ! resultValidationmodel . IsValid )
return BadRequest ( resultValidationmodel . Errors . Select ( s = > s . ErrorMessage ) . ToList ( ) ) ;
//if (item.BillReference.HasValue)
//{
// Invoice ReferenceInvoice = await _servInvoice.GetInvoiceByInvoiceID(item.BillReference.Value);
// if (ReferenceInvoice == null) return NotFound("صورتحساب مرجع یافت نشد");
// if (await _servCompany.ExsistCompanyByComoanyIDandUserID(UserID, ReferenceInvoice.CompanyID.Value)) return Forbid("صورتحساب مرجع برای شما در دسترس نمی باشد");
//}
2024-05-27 18:57:25 +03:30
return Ok ( await _servInvoice . AddInvoice ( new Invoice ( )
2024-05-26 13:04:53 +03:30
{
Title = item . Title ,
Des = item . Des ,
invoiceType = InvoiceType . Bidding ,
CustomerID = item . CustomerID ,
CompanyID = user . RolUsers . First ( ) . CompanyID ,
InvoicIssueDate = item . InvoicIssueDate . Replace ( "/" , "" ) ,
InvoiceDate = item . InvoicIssueDate . Replace ( "/" , "" ) ,
LastChangeUserID = Convert . ToInt32 ( UserID ) ,
BillReference = null ,
IsDeleted = false ,
2024-06-08 21:48:26 +03:30
PatternID = item . PatternID ,
2024-07-03 16:05:28 +03:30
setm = 1
2024-05-26 13:04:53 +03:30
} ) ) ;
2024-05-13 13:02:09 +03:30
2024-05-13 16:50:26 +03:30
}
[HttpPut("Update")]
2024-05-27 22:01:14 +03:30
public async Task < ActionResult < bool > > Update ( [ FromBody ] NUInvoiceDTO item )
2024-05-13 16:50:26 +03:30
{
2024-05-27 22:01:14 +03:30
//if (!ModelState.IsValid)
// return BadRequest(item);
2024-05-13 16:50:26 +03:30
//-----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 _validationInvoice . ValidateAsync ( Tuple . Create ( user . RolUsers . First ( ) . CompanyID , item , eActionValidation . update ) ) ;
if ( ! resultValidationmodel . IsValid )
return BadRequest ( resultValidationmodel . Errors . Select ( s = > s . ErrorMessage ) . ToList ( ) ) ;
//-----Get invoice
2024-05-26 13:04:53 +03:30
Invoice invoice = await _servInvoice . GetInvoiceByInvoiceID ( user . RolUsers . First ( ) . CompanyID , item . ID . Value ) ;
2024-05-13 16:50:26 +03:30
if ( invoice = = null )
return BadRequest ( new List < string > { "invoice notFound..." } ) ;
2025-01-20 14:10:15 +03:30
if ( invoice . PatternID ! = item . PatternID & & invoice . invoice ! = null )
2024-07-23 22:30:52 +03:30
{
return BadRequest ( new List < string > { "این صورتحساب دارای مرجع می باشد" + '\n' +
"امکان تغییر الگو امکان پذیر نیست" } ) ;
}
2024-08-08 00:28:17 +03:30
var CheckTaxPayer = await _servTaxPayer . ExistSuccessfulorSendorpendingInvoice ( invoice ) ;
if ( invoice . PatternID ! = item . PatternID | | invoice . CustomerID ! = item . CustomerID )
2024-05-13 16:50:26 +03:30
{
//----Check TaxPayer
2025-01-20 14:10:15 +03:30
2024-08-08 00:28:17 +03:30
if ( CheckTaxPayer )
2024-05-13 16:50:26 +03:30
return BadRequest ( new List < string > { "این صورتحساب به سازمان ارسال شده" + '\n' +
2024-05-26 13:04:53 +03:30
"برای تغییر ،صورتحساب را ابطال/اصلاح یا برگشت بزنید" } ) ;
2025-01-20 14:10:15 +03:30
else if ( invoice . invoiceType = = InvoiceType . BackFrmSale )
2024-05-26 13:04:53 +03:30
{
return BadRequest ( new List < string >
2024-08-08 00:28:17 +03:30
{ "صورتحساب در وضعیت برگشت از فروش امکان تغییر مشتری یا الگو را ندارد" + '\n' +
"بهتر است صورتحساب دیگر صادر کنید" } ) ;
2024-12-11 15:33:33 +03:30
}
else if ( invoice . invoiceType = = InvoiceType . Repair )
{
return BadRequest ( new List < string >
{ "صورتحساب در وضعیت اصلاحی امکان تغییر مشتری یا الگو را ندارد" + '\n' +
"بهتر است صورتحساب دیگر صادر کنید" } ) ;
2024-05-26 13:04:53 +03:30
}
2024-05-25 21:30:11 +03:30
else if ( invoice . invoiceType ! = InvoiceType . Bidding
2024-05-26 13:04:53 +03:30
& & invoice . invoiceType ! = InvoiceType . Sale & & invoice . invoiceType ! = InvoiceType . Repair )
2024-05-25 21:30:11 +03:30
{
2024-05-26 13:04:53 +03:30
return BadRequest ( new List < string > { $"صورتحساب در حالت {invoice.invoiceType.GetEnumDisplayName()} نمی تواند ویرایش شود" + '\n' +
$"فقط در حالت پیش نویس ، فاکتور و اصلاح (که به سازمان ارسال نشده باشد) میتوان سند را ویرایش کرد" } ) ;
2024-05-25 21:30:11 +03:30
}
2024-05-13 16:50:26 +03:30
}
2024-08-08 00:28:17 +03:30
else if ( invoice . InvoicIssueDate ! = item . InvoicIssueDate | | invoice . InvoiceDate ! = item . InvoiceDate )
{
2025-01-20 14:10:15 +03:30
if ( CheckTaxPayer )
return BadRequest ( new List < string > { "این صورتحساب به سازمان ارسال شده" + '\n' +
2024-08-08 00:28:17 +03:30
"امکان تغییر تاریخ را ندارد" } ) ;
2025-01-20 14:10:15 +03:30
else if ( invoice . BillReference . HasValue )
2024-08-08 00:28:17 +03:30
{
if ( invoice . InvoicIssueDate ! = item . InvoicIssueDate & & Convert . ToInt32 ( invoice . invoice . InvoicIssueDate ) > Convert . ToInt32 ( item . InvoicIssueDate ) )
{
return BadRequest ( new List < string > { "این صورتحساب مرجع دارد" + '\n' +
$"تاریخ صدور نمیتواند از تاریخ صدور مرجع ({invoice.invoice.InvoicIssueDate.ShamciToFormatShamci()}) کمتر باشد" } ) ;
}
if ( invoice . InvoiceDate ! = item . InvoiceDate & & Convert . ToInt32 ( invoice . invoice . InvoiceDate ) > Convert . ToInt32 ( item . InvoiceDate ) )
{
return BadRequest ( new List < string > { "این صورتحساب مرجع دارد" + '\n' +
$"تاریخ صورتحساب نمیتواند از تاریخ صورتحساب مرجع ({invoice.invoice.InvoiceDate.ShamciToFormatShamci()}) کمتر باشد" } ) ;
}
}
}
2024-05-16 23:40:32 +03:30
2024-05-13 16:50:26 +03:30
//-----change invoice
2024-05-16 23:40:32 +03:30
if ( ! string . IsNullOrEmpty ( item . Title ) )
invoice . Title = item . Title ;
2024-05-13 16:50:26 +03:30
invoice . PatternID = item . PatternID ;
2024-05-16 23:40:32 +03:30
2024-05-26 13:04:53 +03:30
if ( item . CustomerID > 0 )
2024-05-16 23:40:32 +03:30
invoice . CustomerID = item . CustomerID ;
if ( ! string . IsNullOrEmpty ( item . InvoicIssueDate ) )
invoice . InvoicIssueDate = item . InvoicIssueDate ;
if ( ! string . IsNullOrEmpty ( item . InvoiceDate ) )
invoice . InvoiceDate = item . InvoiceDate ;
2024-05-13 16:50:26 +03:30
invoice . Des = item . Des ;
invoice . LastChangeUserID = Convert . ToInt32 ( UserID ) ;
2025-01-19 17:44:20 +03:30
2024-05-13 16:50:26 +03:30
return Ok ( await _servInvoice . UpdateInvoice ( invoice ) ) ;
}
[HttpDelete("Delete/{ID}")]
public async Task < ActionResult < bool > > Delete ( int ID )
{
//-----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
2024-05-26 13:04:53 +03:30
Invoice invoice = await _servInvoice . GetInvoiceByInvoiceID ( user . RolUsers . First ( ) . CompanyID , ID ) ;
2024-05-13 16:50:26 +03:30
if ( invoice = = null )
return NotFound ( ) ;
2024-05-25 21:30:11 +03:30
//----Check TaxPayer
if ( await _servTaxPayer . ExistSuccessfulorSendorpendingInvoice ( invoice ) )
2024-07-03 16:05:28 +03:30
return BadRequest ( new List < string > { "این صورتحساب به سازمان ارسال شده" } ) ;
2024-05-26 13:04:53 +03:30
//else if (invoice.invoiceType != InvoiceType.Bidding
// && invoice.invoiceType != InvoiceType.Sale)
//{
// return BadRequest(new List<string> { $"صورتحساب در حالت {invoice.invoiceType.GetEnumDisplayName()} نمی تواند ویرایش شود" });
//}
2025-01-25 12:57:07 +03:30
//if (invoice.invoiceType!=InvoiceType.Cancellation)
//{
//bool InvoiceHasaRemittanceBillReference = invoice.BillReference.HasValue && await _remittanceService.HasaRemittance(invoice.BillReference.Value);
await _receiptService . DeleteByInvoiceID ( invoice . ID , user . RolUsers . First ( ) . CompanyID ) ;
await _remittanceService . DeleteByInvoiceID ( invoice . ID , user . RolUsers . First ( ) . CompanyID ) ;
//foreach (var item in invoice.invoiceDetails)
//{
// if (await _remittanceService.HasaRemittance(invoice.ID, item.CODID))
// {
// await _receiptService.ADD(new Shared.DTOs.Warehouse.ReceiptDto()
// {
// CODID = item.CODID,
// Count = item.am.GetValueOrDefault(),
// Date = DateTime.Now.ConvertMiladiToShamsi(),
// ForSale = true,
// InvoiceID = item.InvoiceID,
// Type = TypeReceipt.Shopping,
// info = $"حذف صورتحساب {item.InvoiceID}",
// }, user.RolUsers.First().CompanyID, true);
// }
//}
// }
2025-01-24 19:18:17 +03:30
2024-05-13 16:50:26 +03:30
invoice . LastChangeUserID = Convert . ToInt32 ( UserID ) ;
//----Update and sendResult
return Ok ( await _servInvoice . DeleteInvoice ( invoice ) ) ;
}
[HttpPost("ChangeInvoiceType/{InvoiceID}")] // ok
2024-05-30 15:08:36 +03:30
public async Task < ActionResult < InvoiceDTO > > ChangeInvoiceType ( int InvoiceID , int invoiceType )
2024-05-13 16:50:26 +03:30
{
//-----GetUserAndCompany
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
2024-05-26 13:04:53 +03:30
Invoice ? Invoice = await _servInvoice . GetInvoiceByInvoiceID ( user . RolUsers . First ( ) . CompanyID , InvoiceID ) ;
2024-05-13 16:50:26 +03:30
if ( Invoice = = null ) return NotFound ( ) ;
2024-05-26 13:04:53 +03:30
2024-05-30 15:08:36 +03:30
if ( Invoice . invoiceType = = InvoiceType . Cancellation ) return BadRequest ( new List < string > { "این صورتحساب ابطال شده" } ) ;
2024-05-13 16:50:26 +03:30
var sent = await _servTaxPayer . ExistSuccessfulorSendorpendingInvoice ( Invoice ) ;
Invoice . LastChangeUserID = Convert . ToInt32 ( UserID ) ;
if ( Invoice . invoiceType = = InvoiceType . Bidding )
{
switch ( invoiceType )
{
2024-05-30 15:08:36 +03:30
case 1 :
return Ok ( await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . Sale ) ) ;
case 3 :
return Ok ( await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . Cancellation ) ) ;
2024-05-13 16:50:26 +03:30
default :
2024-05-30 15:08:36 +03:30
return BadRequest ( new List < string > { $"تغییر وضعیت از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()} امکان پذیر نیست" } ) ;
2024-05-13 16:50:26 +03:30
}
}
if ( Invoice . invoiceType = = InvoiceType . Sale )
{
2024-07-08 16:10:06 +03:30
2024-07-03 16:05:28 +03:30
switch ( invoiceType )
{
2025-01-20 14:10:15 +03:30
//ابطال
2024-07-03 16:05:28 +03:30
case 3 :
2025-01-20 14:10:15 +03:30
foreach ( var item in Invoice . invoiceDetails )
{
if ( await _remittanceService . HasaRemittance ( Invoice . ID , item . CODID ) )
{
await _receiptService . ADD ( new Shared . DTOs . Warehouse . ReceiptDto ( )
{
CODID = item . CODID ,
Count = item . am . GetValueOrDefault ( ) ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
ForSale = true ,
InvoiceID = item . InvoiceID ,
Type = TypeReceipt . Shopping ,
info = $"ابطال شدن صورتحساب {item.InvoiceID}" ,
} , user . RolUsers . First ( ) . CompanyID , true ) ;
}
}
2024-07-03 16:05:28 +03:30
return Ok ( await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . Cancellation ) ) ;
2025-01-20 14:10:15 +03:30
//اصلاح
2024-07-03 16:05:28 +03:30
case 2 :
await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . Repair , false ) ;
var result = await _servInvoice . AddInvoice ( new Invoice ( )
{
Title = Invoice . Title ,
Des = Invoice . Des ,
invoiceType = InvoiceType . Repair ,
CustomerID = Invoice . CustomerID ,
CompanyID = Invoice . CompanyID ,
2024-12-13 16:04:57 +03:30
InvoicIssueDate = DateTime . Now . ConvertMiladiToShamsi ( ) ,
InvoiceDate = DateTime . Now . ConvertMiladiToShamsi ( ) ,
2024-07-03 16:05:28 +03:30
LastChangeUserID = Convert . ToInt32 ( UserID ) ,
BillReference = Invoice . ID ,
IsDeleted = false ,
PatternID = Invoice . PatternID ,
setm = Invoice . setm ,
2024-07-28 17:31:40 +03:30
crn = Invoice . crn ,
CottageDateOfCustomsDeclaration = Invoice . CottageDateOfCustomsDeclaration ,
ft = Invoice . ft ,
cdcn = Invoice . cdcn ,
insp = Invoice . insp ,
billid = Invoice . billid ,
scc = Invoice . scc ,
scln = Invoice . scln ,
seventeentax = Invoice . seventeentax ,
tinc = Invoice . tinc ,
2024-07-03 16:05:28 +03:30
invoiceDetails = Invoice . invoiceDetails . Select ( s = > new InvoiceItem
2024-05-13 16:50:26 +03:30
{
2024-07-03 16:05:28 +03:30
CODID = s . CODID ,
am = s . am ,
fee = s . fee ,
dis = s . dis ,
2024-07-28 17:31:40 +03:30
bros = s . bros ,
bsrn = s . bsrn ,
consfee = s . consfee ,
cut = s . cut ,
exr = s . exr ,
nw = s . nw ,
odam = s . odam ,
odr = s . odr ,
odt = s . odt ,
olam = s . olam ,
olr = s . olr ,
olt = s . olt ,
spro = s . spro ,
sscv = s . sscv ,
2024-08-15 19:15:51 +03:30
ssrv = s . ssrv ,
pspd = s . pspd ,
cui = s . cui ,
} ) . ToList ( ) ,
2025-01-20 14:10:15 +03:30
payments = Invoice . payments . Select ( s = > new InvoicePayment ( )
2024-08-15 19:15:51 +03:30
{
2025-01-20 14:10:15 +03:30
acn = s . acn ,
iinn = s . iinn ,
PaymentDateTime = s . PaymentDateTime ,
pcn = s . pcn ,
pid = s . pid ,
pmt = s . pmt ,
pv = s . pv ,
trmn = s . trmn ,
trn = s . trn ,
2024-07-03 16:05:28 +03:30
} ) . ToList ( )
} , false ) ;
if ( result > 0 )
2025-01-20 14:10:15 +03:30
{
foreach ( var item in Invoice . invoiceDetails )
{
if ( await _remittanceService . HasaRemittance ( Invoice . ID , item . CODID ) )
2025-01-24 19:18:17 +03:30
{
await _remittanceService . DeleteByCODIDAndInvoiceID ( Invoice . ID , item . CODID , user . RolUsers . First ( ) . CompanyID ) ;
//await _receiptService.ADD(new Shared.DTOs.Warehouse.ReceiptDto()
//{
// CODID = item.CODID,
// Count = item.am.GetValueOrDefault(),
// Date = DateTime.Now.ConvertMiladiToShamsi(),
// ForSale = true,
// InvoiceID = item.InvoiceID,
// Type = TypeReceipt.Shopping,
// info = $"رسید خودکار: صورتحساب {item.InvoiceID} از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()}",
//}, user.RolUsers.First().CompanyID, true);
await _remittanceService . ADD ( new Shared . DTOs . Warehouse . RemittanceDto ( )
{
CODID = item . CODID ,
Count = item . am . GetValueOrDefault ( ) ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
InvoiceID = result ,
Type = TypeRemittance . Sale ,
info = $"حواله خودکار: از صورتحساب {result}"
} ) ;
}
2025-01-20 14:10:15 +03:30
}
2024-07-03 16:05:28 +03:30
return Ok ( await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , result ) ) ;
2025-01-20 14:10:15 +03:30
}
2024-07-03 16:05:28 +03:30
break ;
2025-01-20 14:10:15 +03:30
//برگشت
2024-07-03 16:05:28 +03:30
case 4 :
await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . BackFrmSale , false ) ;
var result1 = await _servInvoice . AddInvoice ( new Invoice ( )
{
Title = Invoice . Title ,
Des = Invoice . Des ,
invoiceType = InvoiceType . BackFrmSale ,
CustomerID = Invoice . CustomerID ,
CompanyID = Invoice . CompanyID ,
2024-12-13 16:04:57 +03:30
InvoicIssueDate = DateTime . Now . ConvertMiladiToShamsi ( ) ,
InvoiceDate = DateTime . Now . ConvertMiladiToShamsi ( ) ,
2024-07-03 16:05:28 +03:30
LastChangeUserID = Convert . ToInt32 ( UserID ) ,
BillReference = Invoice . ID ,
IsDeleted = false ,
PatternID = Invoice . PatternID ,
setm = Invoice . setm ,
2024-07-28 17:31:40 +03:30
crn = Invoice . crn ,
CottageDateOfCustomsDeclaration = Invoice . CottageDateOfCustomsDeclaration ,
ft = Invoice . ft ,
cdcn = Invoice . cdcn ,
insp = Invoice . insp ,
billid = Invoice . billid ,
scc = Invoice . scc ,
scln = Invoice . scln ,
seventeentax = Invoice . seventeentax ,
tinc = Invoice . tinc ,
2024-07-03 16:05:28 +03:30
invoiceDetails = Invoice . invoiceDetails . Select ( s = > new InvoiceItem
2024-05-13 16:50:26 +03:30
{
2024-07-03 16:05:28 +03:30
CODID = s . CODID ,
am = s . am ,
fee = s . fee ,
dis = s . dis ,
2024-07-28 17:31:40 +03:30
bros = s . bros ,
bsrn = s . bsrn ,
consfee = s . consfee ,
cut = s . cut ,
exr = s . exr ,
nw = s . nw ,
odam = s . odam ,
odr = s . odr ,
odt = s . odt ,
olam = s . olam ,
olr = s . olr ,
olt = s . olt ,
spro = s . spro ,
sscv = s . sscv ,
2024-08-15 19:15:51 +03:30
ssrv = s . ssrv ,
pspd = s . pspd ,
cui = s . cui ,
} ) . ToList ( ) ,
payments = Invoice . payments . Select ( s = > new InvoicePayment ( )
{
acn = s . acn ,
iinn = s . iinn ,
PaymentDateTime = s . PaymentDateTime ,
pcn = s . pcn ,
pid = s . pid ,
pmt = s . pmt ,
pv = s . pv ,
trmn = s . trmn ,
trn = s . trn ,
2024-07-03 16:05:28 +03:30
} ) . ToList ( )
} , false ) ;
if ( result1 > 0 )
2025-01-20 14:10:15 +03:30
{
foreach ( var item in Invoice . invoiceDetails )
{
if ( await _remittanceService . HasaRemittance ( Invoice . ID , item . CODID ) )
2025-01-24 19:18:17 +03:30
{
await _remittanceService . DeleteByCODIDAndInvoiceID ( Invoice . ID , item . CODID , user . RolUsers . First ( ) . CompanyID ) ;
//await _receiptService.ADD(new Shared.DTOs.Warehouse.ReceiptDto()
//{
// CODID = item.CODID,
// Count = item.am.GetValueOrDefault(),
// Date = DateTime.Now.ConvertMiladiToShamsi(),
// ForSale = true,
// InvoiceID = item.InvoiceID,
// Type = TypeReceipt.Shopping,
// info = $"رسید خودکار: صورتحساب {item.InvoiceID} از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()}",
//}, user.RolUsers.First().CompanyID, true);
await _remittanceService . ADD ( new Shared . DTOs . Warehouse . RemittanceDto ( )
{
CODID = item . CODID ,
Count = item . am . GetValueOrDefault ( ) ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
InvoiceID = result1 ,
Type = TypeRemittance . Sale ,
info = $"حواله خودکار: از صورتحساب {result1}"
} ) ;
}
2025-01-20 14:10:15 +03:30
}
2024-07-03 16:05:28 +03:30
return Ok ( await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , result1 ) ) ;
2025-01-20 14:10:15 +03:30
}
2024-07-03 16:05:28 +03:30
break ;
default :
return BadRequest ( new List < string > { $"تغییر وضعیت از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()} امکان پذیر نیست این صورتحساب به سامانه مودیان ارسال شده" } ) ;
}
2024-05-13 16:50:26 +03:30
}
if ( Invoice . invoiceType = = InvoiceType . Repair )
{
2024-07-03 16:05:28 +03:30
switch ( invoiceType )
{
case 3 :
2025-01-20 14:10:15 +03:30
foreach ( var item in Invoice . invoiceDetails )
{
if ( await _remittanceService . HasaRemittance ( Invoice . ID , item . CODID ) )
{
await _receiptService . ADD ( new Shared . DTOs . Warehouse . ReceiptDto ( )
{
CODID = item . CODID ,
Count = item . am . GetValueOrDefault ( ) ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
ForSale = true ,
InvoiceID = item . InvoiceID ,
Type = TypeReceipt . Shopping ,
info = $"ابطال شدن صورتحساب {item.InvoiceID}" ,
} , user . RolUsers . First ( ) . CompanyID , true ) ;
}
}
2024-07-03 16:05:28 +03:30
return Ok ( await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . Cancellation ) ) ;
case 4 :
await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . BackFrmSale , false ) ;
var result2 = await _servInvoice . AddInvoice ( new Invoice ( )
{
Title = Invoice . Title ,
Des = Invoice . Des ,
invoiceType = InvoiceType . BackFrmSale ,
CustomerID = Invoice . CustomerID ,
CompanyID = Invoice . CompanyID ,
2024-12-13 16:04:57 +03:30
InvoicIssueDate = DateTime . Now . ConvertMiladiToShamsi ( ) ,
InvoiceDate = DateTime . Now . ConvertMiladiToShamsi ( ) ,
2024-07-03 16:05:28 +03:30
LastChangeUserID = Convert . ToInt32 ( UserID ) ,
BillReference = Invoice . ID ,
IsDeleted = false ,
PatternID = Invoice . PatternID ,
setm = Invoice . setm ,
2024-07-28 17:31:40 +03:30
crn = Invoice . crn ,
CottageDateOfCustomsDeclaration = Invoice . CottageDateOfCustomsDeclaration ,
ft = Invoice . ft ,
cdcn = Invoice . cdcn ,
insp = Invoice . insp ,
billid = Invoice . billid ,
scc = Invoice . scc ,
scln = Invoice . scln ,
seventeentax = Invoice . seventeentax ,
tinc = Invoice . tinc ,
2024-07-03 16:05:28 +03:30
invoiceDetails = Invoice . invoiceDetails . Select ( s = > new InvoiceItem
2024-05-13 16:50:26 +03:30
{
2024-07-03 16:05:28 +03:30
CODID = s . CODID ,
am = s . am ,
fee = s . fee ,
dis = s . dis ,
2024-07-28 17:31:40 +03:30
bros = s . bros ,
bsrn = s . bsrn ,
consfee = s . consfee ,
cut = s . cut ,
exr = s . exr ,
nw = s . nw ,
odam = s . odam ,
odr = s . odr ,
odt = s . odt ,
olam = s . olam ,
olr = s . olr ,
olt = s . olt ,
spro = s . spro ,
sscv = s . sscv ,
2024-08-15 19:15:51 +03:30
ssrv = s . ssrv ,
pspd = s . pspd ,
cui = s . cui ,
} ) . ToList ( ) ,
payments = Invoice . payments . Select ( s = > new InvoicePayment ( )
{
acn = s . acn ,
iinn = s . iinn ,
PaymentDateTime = s . PaymentDateTime ,
pcn = s . pcn ,
pid = s . pid ,
pmt = s . pmt ,
pv = s . pv ,
trmn = s . trmn ,
trn = s . trn ,
2024-07-03 16:05:28 +03:30
} ) . ToList ( )
} , false ) ;
if ( result2 > 0 )
2025-01-20 14:10:15 +03:30
{
foreach ( var item in Invoice . invoiceDetails )
{
if ( await _remittanceService . HasaRemittance ( Invoice . ID , item . CODID ) )
2025-01-24 19:18:17 +03:30
{
await _remittanceService . DeleteByCODIDAndInvoiceID ( Invoice . ID , item . CODID , user . RolUsers . First ( ) . CompanyID ) ;
//await _receiptService.ADD(new Shared.DTOs.Warehouse.ReceiptDto()
//{
// CODID = item.CODID,
// Count = item.am.GetValueOrDefault(),
// Date = DateTime.Now.ConvertMiladiToShamsi(),
// ForSale = true,
// InvoiceID = item.InvoiceID,
// Type = TypeReceipt.Shopping,
// info = $"رسید خودکار: صورتحساب {item.InvoiceID} از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()}",
//}, user.RolUsers.First().CompanyID, true);
await _remittanceService . ADD ( new Shared . DTOs . Warehouse . RemittanceDto ( )
{
CODID = item . CODID ,
Count = item . am . GetValueOrDefault ( ) ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
InvoiceID = result2 ,
Type = TypeRemittance . Sale ,
info = $"حواله خودکار: از صورتحساب {result2}"
} ) ;
}
2025-01-20 14:10:15 +03:30
}
2024-07-03 16:05:28 +03:30
return Ok ( await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , result2 ) ) ;
2025-01-20 14:10:15 +03:30
}
2024-07-03 16:05:28 +03:30
break ;
default :
return BadRequest ( new List < string > { $"تغییر وضعیت از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()} امکان پذیر نیست این صورتحساب به سامانه مودیان ارسال شده" } ) ;
2024-05-13 16:50:26 +03:30
2024-07-03 16:05:28 +03:30
}
2024-05-13 16:50:26 +03:30
}
if ( Invoice . invoiceType = = InvoiceType . BackFrmSale )
{
2024-07-03 16:05:28 +03:30
switch ( invoiceType )
{
case 3 :
2025-01-20 14:10:15 +03:30
foreach ( var item in Invoice . invoiceDetails )
{
if ( await _remittanceService . HasaRemittance ( Invoice . ID , item . CODID ) )
{
await _receiptService . ADD ( new Shared . DTOs . Warehouse . ReceiptDto ( )
{
CODID = item . CODID ,
Count = item . am . GetValueOrDefault ( ) ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
ForSale = true ,
InvoiceID = item . InvoiceID ,
Type = TypeReceipt . Shopping ,
info = $"ابطال شدن صورتحساب {item.InvoiceID}" ,
} , user . RolUsers . First ( ) . CompanyID , true ) ;
}
}
2024-07-03 16:05:28 +03:30
return Ok ( await _servInvoice . ChangeInvoiceType ( Invoice , InvoiceType . Cancellation ) ) ;
default :
return BadRequest ( new List < string > { $"تغییر وضعیت از {Invoice.invoiceType.GetEnumDisplayName()} به {((InvoiceType)invoiceType).GetEnumDisplayName()} امکان پذیر نیست" } ) ;
}
2024-05-13 16:50:26 +03:30
}
2024-07-23 22:30:52 +03:30
return NoContent ( ) ;
}
[HttpPost("CopyInvoice/{InvoiceID}")] // ok
public async Task < ActionResult < InvoiceDTO > > CopyInvoice ( int InvoiceID )
{
//-----GetUserAndCompany
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
Invoice ? Invoice = await _servInvoice . GetInvoiceByInvoiceID ( user . RolUsers . First ( ) . CompanyID , InvoiceID ) ;
if ( Invoice = = null ) return NotFound ( ) ;
//-----Validaton
var resultValidationmodel = await _validationInvoice . ValidateAsync ( Tuple . Create ( user . RolUsers . First ( ) . CompanyID , new NUInvoiceDTO ( ) , eActionValidation . copy ) ) ;
if ( ! resultValidationmodel . IsValid )
return BadRequest ( resultValidationmodel . Errors . Select ( s = > s . ErrorMessage ) . ToList ( ) ) ;
var result = await _servInvoice . AddInvoice ( new Invoice ( )
{
Title = Invoice . Title ,
Des = Invoice . Des ,
invoiceType = InvoiceType . Bidding ,
CustomerID = Invoice . CustomerID ,
CompanyID = Invoice . CompanyID ,
InvoicIssueDate = Invoice . InvoicIssueDate . Replace ( "/" , "" ) ,
InvoiceDate = Invoice . InvoicIssueDate . Replace ( "/" , "" ) ,
LastChangeUserID = Convert . ToInt32 ( UserID ) ,
IsDeleted = false ,
PatternID = Invoice . PatternID ,
setm = Invoice . setm ,
2024-07-24 22:56:46 +03:30
crn = Invoice . crn ,
CottageDateOfCustomsDeclaration = Invoice . CottageDateOfCustomsDeclaration ,
ft = Invoice . ft ,
cdcn = Invoice . cdcn ,
insp = Invoice . insp ,
billid = Invoice . billid ,
scc = Invoice . scc ,
scln = Invoice . scln ,
seventeentax = Invoice . seventeentax ,
2025-01-20 14:10:15 +03:30
tinc = Invoice . tinc ,
2024-07-23 22:30:52 +03:30
invoiceDetails = Invoice . invoiceDetails . Select ( s = > new InvoiceItem
{
CODID = s . CODID ,
am = s . am ,
fee = s . fee ,
dis = s . dis ,
2024-07-24 22:56:46 +03:30
bros = s . bros ,
bsrn = s . bsrn ,
consfee = s . consfee ,
cut = s . cut ,
exr = s . exr ,
nw = s . nw ,
odam = s . odam ,
odr = s . odr ,
odt = s . odt ,
olam = s . olam ,
olr = s . olr ,
olt = s . olt ,
2025-01-20 14:10:15 +03:30
spro = s . spro ,
2024-07-24 22:56:46 +03:30
sscv = s . sscv ,
2024-08-15 19:15:51 +03:30
ssrv = s . ssrv ,
2025-01-20 14:10:15 +03:30
pspd = s . pspd ,
cui = s . cui ,
2024-08-15 19:15:51 +03:30
} ) . ToList ( ) ,
payments = Invoice . payments . Select ( s = > new InvoicePayment ( )
{
acn = s . acn ,
iinn = s . iinn ,
PaymentDateTime = s . PaymentDateTime ,
pcn = s . pcn ,
pid = s . pid ,
pmt = s . pmt ,
pv = s . pv ,
trmn = s . trmn ,
trn = s . trn ,
2024-07-23 22:30:52 +03:30
} ) . ToList ( )
} , true ) ;
if ( result > 0 )
return Ok ( await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , result ) ) ;
2024-05-13 16:50:26 +03:30
return NoContent ( ) ;
2024-05-13 13:02:09 +03:30
}
2024-05-16 23:40:32 +03:30
[HttpGet("GetPatterns")]
public async Task < ActionResult < List < IdName < int > > > > GetPatterns ( )
{
return Ok ( await _servTaxPayer . GetPatterns ( ) ) ;
}
2024-06-14 22:37:22 +03:30
[HttpGet("GetReport/{InvoiceID}")]
2024-07-01 15:39:40 +03:30
public async Task < ActionResult < string > > GetReport ( int InvoiceID )
2024-05-30 15:08:36 +03:30
{
2024-07-01 15:39:40 +03:30
//-----GetUserAndCompany
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
2024-07-03 16:05:28 +03:30
var CompanyID = user ? . RolUsers . First ( ) . CompanyID ;
2024-07-01 15:39:40 +03:30
2024-07-01 22:59:01 +03:30
if ( ! await _servInvoice . ExistInvoiceByInvoiceID ( CompanyID . Value , InvoiceID ) )
2024-07-01 15:39:40 +03:30
return NotFound ( ) ;
2024-07-04 18:49:11 +03:30
2025-01-20 14:10:15 +03:30
var result = await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , InvoiceID ) ;
2024-07-01 15:39:40 +03:30
2025-01-20 14:10:15 +03:30
string base64 = await _servReport . CreateImage ( result , user ? . RolUsers . First ( ) . Company . Logo = = null ? "" : Convert . ToBase64String ( user ? . RolUsers . First ( ) . Company . Logo ) , user ? . RolUsers . First ( ) . Company . Name ) ;
2025-01-09 16:01:37 +03:30
return Ok ( base64 ) ;
2024-05-30 15:08:36 +03:30
}
2025-01-19 17:44:20 +03:30
[HttpPost("IssuingRemittance/{InvoiceID}")]
public async Task < ActionResult < string > > IssuingRemittance ( int InvoiceID )
{
//-----GetUserAndCompany
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
var CompanyID = user ? . RolUsers . First ( ) . CompanyID ;
if ( ! await _servInvoice . ExistInvoiceByInvoiceID ( CompanyID . Value , InvoiceID ) )
return NotFound ( ) ;
if ( await _remittanceService . HasaRemittance ( InvoiceID ) )
{
return BadRequest ( new List < string > ( ) { "این صورتحساب حواله دارد" } ) ;
}
else
{
2025-01-24 19:18:17 +03:30
if ( _servInvoice . checkFatherInvoiceByInvoiceID ( user . RolUsers . First ( ) . CompanyID , InvoiceID ) . Result )
return BadRequest ( new List < string > { "این صورتحساب، مرجع چند صورتحساب دیگر می باشد " + '\n' + '\r' +
"نمیتواند برای این صورتحساب حواله صادر کنید، ابتدا صورتحساب هایی که ارتباط دارند را حذف کنید" } ) ;
2025-01-19 17:44:20 +03:30
List < string > errors = new List < string > ( ) ;
var result = await _servInvoice . GetInvoice ( user . RolUsers . First ( ) . CompanyID , InvoiceID ) ;
2025-01-20 14:10:15 +03:30
if ( result . invoiceType = = InvoiceType . Bidding | | result . invoiceType = = InvoiceType . Cancellation )
{
return BadRequest ( new List < string > ( ) { $"در وضعیت {result.invoiceType.GetEnumDisplayName()} امکان صدور حواله ممکن نیست" } ) ;
}
2025-01-19 17:44:20 +03:30
//check
foreach ( var item in result . items
2025-01-20 14:10:15 +03:30
. GroupBy ( i = > i . CODID ) . Select ( g = > new { CODID = g . Key , TotalAm = g . Sum ( i = > i . am ) } ) )
2025-01-19 17:44:20 +03:30
{
2025-01-20 14:10:15 +03:30
var Inventory = await _warehouseService . Inventory ( CompanyID . Value , item . CODID ) ;
2025-01-24 19:18:17 +03:30
if ( Inventory - item . TotalAm < 0 )
2025-01-19 17:44:20 +03:30
{
2025-01-24 19:18:17 +03:30
errors . Add ( $"موجودی کالا {result.items.First(w => w.CODID == item.CODID).sstt} کمتر از درخواست شماست" ) ;
2025-01-19 17:44:20 +03:30
}
}
2025-01-20 14:10:15 +03:30
if ( errors . Count = = 0 )
2025-01-19 17:44:20 +03:30
{
//save
await _remittanceService . AddRange ( result . items . Select ( s = > new Data . Models . Warehouse . Remittance ( )
{
CODID = s . CODID ,
Count = s . am ,
Date = DateTime . Now . ConvertMiladiToShamsi ( ) ,
info = $"حواله خودکار از صورتحساب {InvoiceID}" ,
Type = TypeRemittance . Sale ,
InvoiceID = InvoiceID ,
Deleted = false ,
2025-01-25 20:46:47 +03:30
CreateDt = DateTime . Now
2025-01-19 17:44:20 +03:30
} ) . ToList ( ) ) ;
return Ok ( ) ;
}
else
{
return BadRequest ( errors ) ;
}
2025-01-20 14:10:15 +03:30
2025-01-19 17:44:20 +03:30
}
2025-01-20 14:10:15 +03:30
2025-01-24 19:18:17 +03:30
}
[HttpPost("FreeRemittance/{InvoiceID}")]
public async Task < ActionResult > FreeRemittance ( int InvoiceID )
{
//-----GetUserAndCompany
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
var CompanyID = user ? . RolUsers . First ( ) . CompanyID ;
if ( ! await _servInvoice . ExistInvoiceByInvoiceID ( CompanyID . Value , InvoiceID ) )
return NotFound ( ) ;
await _receiptService . DeleteByInvoiceID ( InvoiceID , CompanyID . Value ) ;
await _remittanceService . DeleteByInvoiceID ( InvoiceID , CompanyID . Value ) ;
return Ok ( ) ;
//return BadRequest(new List<string>() { $"حواله ای یافت نشد" });
2025-01-20 14:10:15 +03:30
}
[HttpGet("HasaRemittance/{InvoiceID}")]
public async Task < ActionResult > HasaRemittance ( int InvoiceID )
{
//-----GetUserAndCompany
var claim = HttpContext . User . Claims . First ( c = > c . Type = = "UserID" ) ;
var UserID = claim . Value ;
var user = await _servUser . GetUserByUserID ( Convert . ToInt32 ( UserID ) ) ;
var CompanyID = user ? . RolUsers . First ( ) . CompanyID ;
if ( ! await _servInvoice . ExistInvoiceByInvoiceID ( CompanyID . Value , InvoiceID ) )
return NotFound ( ) ;
if ( await _remittanceService . HasaRemittance ( InvoiceID ) )
return NotFound ( ) ;
return Ok ( ) ;
2025-01-19 17:44:20 +03:30
}
2024-05-13 13:02:09 +03:30
}
}