DocSpace-client/products/ASC.CRM/Server/Controllers/CRMController.Invoices.cs

1511 lines
62 KiB
C#
Raw Normal View History

2021-03-05 20:06:49 +00:00
/*
*
* (c) Copyright Ascensio System Limited 2010-2018
*
* This program is freeware. You can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that
* Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights.
*
* THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales@onlyoffice.com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software. If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute.
* Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks.
*
*/
using ASC.Api.Core;
using ASC.Api.CRM.Wrappers;
using ASC.Api.Documents;
using ASC.Common.Web;
using ASC.Core;
using ASC.CRM.Classes;
using ASC.CRM.Core;
using ASC.CRM.Core.Entities;
using ASC.CRM.Core.Enums;
using ASC.CRM.Model;
using ASC.CRM.Resources;
using ASC.MessagingSystem;
using ASC.Web.Api.Routing;
using ASC.Web.CRM.Classes;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ASC.Api.CRM
{
public partial class CRMController
{
/// <summary>
/// Returns the detailed information about the invoice with the ID specified in the request
/// </summary>
/// <param name="invoiceid">Invoice ID</param>
/// <short>Get invoice by ID</short>
/// <category>Invoices</category>
/// <returns>Invoice</returns>
[Read(@"invoice/{invoiceid:int}")]
public InvoiceWrapper GetInvoiceByID(int invoiceid)
{
if (invoiceid <= 0) throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceid);
if (invoice == null) throw new ItemNotFoundException();
if (!CRMSecurity.CanAccessTo(invoice))
{
throw CRMSecurity.CreateSecurityException();
}
return InvoiceWrapperHelper.Get(invoice);
}
/// <summary>
/// Returns the detailed information about the invoice sample
/// </summary>
/// <short>Get invoice sample</short>
/// <category>Invoices</category>
/// <returns>Invoice</returns>
[Read(@"invoice/sample")]
public InvoiceWrapper GetInvoiceSample()
{
var sample = InvoiceWrapper.GetSample();
sample.Number = DaoFactory.GetInvoiceDao().GetNewInvoicesNumber();
sample.Terms = DaoFactory.GetInvoiceDao().GetSettings().Terms ?? string.Empty;
sample.IssueDate = ApiDateTimeHelper.Get(DateTime.UtcNow);
sample.DueDate = ApiDateTimeHelper.Get(DateTime.UtcNow.AddDays(30));
sample.CreateOn = ApiDateTimeHelper.Get(DateTime.UtcNow);
sample.Currency = CurrencyInfoWrapperHelper.Get(SettingsManager.Load<CRMSettings>().DefaultCurrency);
sample.InvoiceLines.First().Quantity = 1;
return sample;
}
/// <summary>
/// Returns the json data of the invoice with the ID specified in the request
/// </summary>
/// <param name="invoiceid">Invoice ID</param>
/// <short>Get invoice json data</short>
/// <category>Invoices</category>
/// <returns>Json Data</returns>
[Read(@"invoice/jsondata/{invoiceid:int}")]
public string GetInvoiceJsonData(int invoiceid)
{
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceid);
if (invoice == null) throw new ItemNotFoundException();
if (!CRMSecurity.CanAccessTo(invoice))
{
throw CRMSecurity.CreateSecurityException();
}
return invoice.JsonData;
}
/// <summary>
/// Returns the list of invoices matching the creteria specified in the request
/// </summary>
/// <param name="status">Invoice status</param>
/// <param name="issueDateFrom">Invoice issue date from</param>
/// <param name="issueDateTo">Invoice issue date to</param>
/// <param name="dueDateFrom">Invoice due date from</param>
/// <param name="dueDateTo">Invoice due date to</param>
/// <param name="entityType">Invoice entity type</param>
/// <param name="entityid">Invoice entity ID</param>
/// <param name="currency" remark="Allowed values: EUR, RUB etc. You can get the whole list of available currencies by api">Invoice currency</param>
/// <short>Get invoice list</short>
/// <category>Invoices</category>
/// <returns>Invoice list</returns>
[Read(@"invoice/filter")]
public IEnumerable<InvoiceBaseWrapper> GetInvoices(
InvoiceStatus? status,
ApiDateTime issueDateFrom,
ApiDateTime issueDateTo,
ApiDateTime dueDateFrom,
ApiDateTime dueDateTo,
String entityType,
int entityid,
String currency
)
{
if (!String.IsNullOrEmpty(entityType) && !(
String.Compare(entityType, "contact", true) == 0 ||
String.Compare(entityType, "opportunity", true) == 0 ||
String.Compare(entityType, "case", true) == 0))
throw new ArgumentException();
IEnumerable<InvoiceBaseWrapper> result;
InvoiceSortedByType sortBy;
OrderBy invoiceOrderBy;
var searchString = ApiContext.FilterValue;
if (InvoiceSortedByType.TryParse(ApiContext.SortBy, true, out sortBy))
{
invoiceOrderBy = new OrderBy(sortBy, !ApiContext.SortDescending);
}
else if (String.IsNullOrEmpty(ApiContext.SortBy))
{
invoiceOrderBy = new OrderBy(InvoiceSortedByType.Number, true);
}
else
{
invoiceOrderBy = null;
}
var fromIndex = (int)ApiContext.StartIndex;
var count = (int)ApiContext.Count;
if (invoiceOrderBy != null)
{
result = ToListInvoiceBaseWrappers(
DaoFactory.GetInvoiceDao().GetInvoices(
searchString,
status,
issueDateFrom, issueDateTo,
dueDateFrom, dueDateTo,
ToEntityType(entityType), entityid,
currency,
fromIndex, count,
invoiceOrderBy));
ApiContext.SetDataPaginated();
ApiContext.SetDataFiltered();
ApiContext.SetDataSorted();
}
else
{
result = ToListInvoiceBaseWrappers(
DaoFactory.GetInvoiceDao().GetInvoices(
searchString,
status,
issueDateFrom, issueDateTo,
dueDateFrom, dueDateTo,
ToEntityType(entityType), entityid,
currency,
0,
0,
null));
}
int totalCount;
if (result.Count() < count)
{
totalCount = fromIndex + result.Count();
}
else
{
totalCount = DaoFactory.GetInvoiceDao().GetInvoicesCount(
searchString,
status,
issueDateFrom, issueDateTo,
dueDateFrom, dueDateTo,
ToEntityType(entityType), entityid,
currency);
}
ApiContext.SetTotalCount(totalCount);
return result;
}
/// <summary>
/// Returns the list of all invoices associated with the entity with the ID and type specified in the request
/// </summary>
/// <param name="entityType">Invoice entity type</param>
/// <param name="entityid">Invoice entity ID</param>
/// <short>Get entity invoices</short>
/// <category>Invoices</category>
/// <returns>Invoice list</returns>
[Read(@"{entityType:regex(contact|person|company|opportunity)}/invoicelist/{entityid:int}")]
public IEnumerable<InvoiceBaseWrapper> GetEntityInvoices(String entityType, int entityid)
{
if (String.IsNullOrEmpty(entityType) || entityid <= 0) throw new ArgumentException();
return ToListInvoiceBaseWrappers(DaoFactory.GetInvoiceDao().GetEntityInvoices(ToEntityType(entityType), entityid));
}
/// <summary>
/// Updates the status of invoices with the IDs specified in the request
/// </summary>
/// <param name="invoiceids">Invoice ID list</param>
/// <param name="status">Status</param>
/// <short>Update invoice group status</short>
/// <category>Invoices</category>
/// <returns>KeyValuePair of Invoices and InvoiceItems</returns>
[Update(@"invoice/status/{status:int}")]
public KeyValuePair<IEnumerable<InvoiceBaseWrapper>, IEnumerable<InvoiceItemWrapper>> UpdateInvoiceBatchStatus(
int[] invoiceids,
InvoiceStatus status
)
{
if (invoiceids == null || !invoiceids.Any()) throw new ArgumentException();
var oldInvoices = DaoFactory.GetInvoiceDao().GetByID(invoiceids).Where(CRMSecurity.CanAccessTo).ToList();
var updatedInvoices = DaoFactory.GetInvoiceDao().UpdateInvoiceBatchStatus(oldInvoices.ToList().Select(i => i.ID).ToArray(), status);
// detect what really changed
var realUpdatedInvoices = updatedInvoices
.Select(t => oldInvoices.FirstOrDefault(x => x.ID == t.ID && x.Status != t.Status))
.Where(inv => inv != null)
.ToList();
if (realUpdatedInvoices.Any())
{
MessageService.Send(MessageAction.InvoicesUpdatedStatus, MessageTarget.Create(realUpdatedInvoices.Select(x => x.ID)), realUpdatedInvoices.Select(x => x.Number), status.ToLocalizedString());
}
var invoiceItemsUpdated = new List<InvoiceItem>();
if (status == InvoiceStatus.Sent || status == InvoiceStatus.Rejected)
{
var invoiceItemsAll = DaoFactory.GetInvoiceItemDao().GetAll();
var invoiceItemsWithTrackInventory = invoiceItemsAll.Where(item => item.TrackInventory).ToList();
if (status == InvoiceStatus.Sent && invoiceItemsWithTrackInventory != null && invoiceItemsWithTrackInventory.Count != 0)
{
foreach (var inv in updatedInvoices)
{
if (inv.Status == InvoiceStatus.Sent)
{
//could be changed
var oldInv = oldInvoices.FirstOrDefault(i => i.ID == inv.ID);
if (oldInv != null && oldInv.Status == InvoiceStatus.Draft)
{
//was changed to Sent
var invoiceLines = DaoFactory.GetInvoiceLineDao().GetInvoiceLines(inv.ID);
foreach (var line in invoiceLines)
{
var item = invoiceItemsWithTrackInventory.FirstOrDefault(ii => ii.ID == line.InvoiceItemID);
if (item != null)
{
item.StockQuantity -= line.Quantity;
DaoFactory.GetInvoiceItemDao().SaveOrUpdateInvoiceItem(item);
var oldItem = invoiceItemsUpdated.Find(i => i.ID == item.ID);
if (oldItem != null)
{
invoiceItemsUpdated.Remove(oldItem);
}
invoiceItemsUpdated.Add(item);
}
}
}
}
}
}
if (status == InvoiceStatus.Rejected && invoiceItemsWithTrackInventory != null && invoiceItemsWithTrackInventory.Count != 0)
{
foreach (var inv in updatedInvoices)
{
if (inv.Status == InvoiceStatus.Rejected)
{
//could be changed
var oldInv = oldInvoices.FirstOrDefault(i => i.ID == inv.ID);
if (oldInv != null && oldInv.Status == InvoiceStatus.Sent)
{
//was changed from Sent to Rejectes
var invoiceLines = DaoFactory.GetInvoiceLineDao().GetInvoiceLines(inv.ID);
foreach (var line in invoiceLines)
{
var item = invoiceItemsWithTrackInventory.FirstOrDefault(ii => ii.ID == line.InvoiceItemID);
if (item != null)
{
item.StockQuantity += line.Quantity;
DaoFactory.GetInvoiceItemDao().SaveOrUpdateInvoiceItem(item);
var oldItem = invoiceItemsUpdated.Find(i => i.ID == item.ID);
if (oldItem != null)
{
invoiceItemsUpdated.Remove(oldItem);
}
invoiceItemsUpdated.Add(item);
}
}
}
}
}
}
}
var listInvoiceBaseWrappers = ToListInvoiceBaseWrappers(updatedInvoices);
return new KeyValuePair<IEnumerable<InvoiceBaseWrapper>, IEnumerable<InvoiceItemWrapper>>(listInvoiceBaseWrappers, invoiceItemsUpdated.ConvertAll(i => InvoiceItemWrapperHelper.Get(i)));
}
/// <summary>
/// Delete the invoice with the ID specified in the request
/// </summary>
/// <param name="invoiceid">Invoice ID</param>
/// <short>Delete invoice</short>
/// <category>Invoices</category>
/// <returns>Invoice</returns>
[Delete(@"invoice/{invoiceid:int}")]
public InvoiceBaseWrapper DeleteInvoice(int invoiceid)
{
if (invoiceid <= 0) throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().DeleteInvoice(invoiceid);
if (invoice == null) throw new ItemNotFoundException();
MessageService.Send(MessageAction.InvoiceDeleted, MessageTarget.Create(invoice.ID), invoice.Number);
return InvoiceBaseWrapperHelper.Get(invoice);
}
/// <summary>
/// Deletes the group of invoices with the IDs specified in the request
/// </summary>
/// <param name="invoiceids">Invoice ID list</param>
/// <short>Delete invoice group</short>
/// <category>Invoices</category>
/// <returns>Invoice list</returns>
[Delete(@"invoice")]
public IEnumerable<InvoiceBaseWrapper> DeleteBatchInvoices(IEnumerable<int> invoiceids)
{
if (invoiceids == null || !invoiceids.Any()) throw new ArgumentException();
var invoices = DaoFactory.GetInvoiceDao().DeleteBatchInvoices(invoiceids.ToArray());
MessageService.Send(MessageAction.InvoicesDeleted, MessageTarget.Create(invoices.Select(x => x.ID)), invoices.Select(x => x.Number));
return ToListInvoiceBaseWrappers(invoices);
}
/// <summary>
/// Creates the invoice with the parameters (contactId, consigneeId, etc.) specified in the request
/// </summary>
/// <param optional="false" name="number">Invoice number</param>
/// <param optional="false" name="issueDate">Invoice issue date</param>
/// <param optional="true" name="templateType">Invoice template type</param>
/// <param optional="false" name="contactId">Invoice contact ID</param>
/// <param optional="true" name="consigneeId">Invoice consignee ID</param>
/// <param optional="true" name="entityId">Invoice entity ID</param>
/// <param optional="true" name="billingAddressID">Invoice billing address ID</param>
/// <param optional="true" name="deliveryAddressID">Invoice delivery address ID</param>
/// <param optional="false" name="dueDate">Invoice due date</param>
/// <param optional="false" name="language">Invoice language</param>
/// <param optional="false" name="currency" remark="Allowed values: EUR, RUB etc. You can get the whole list of available currencies by api">Invoice currency</param>
/// <param optional="false" name="exchangeRate">Invoice exchange rate</param>
/// <param optional="true" name="purchaseOrderNumber">Invoice purchase order number</param>
/// <param optional="false" name="terms">Invoice terms</param>
/// <param optional="true" name="description">Invoice description</param>
/// <param optional="false" name="invoiceLines">Invoice lines list</param>
/// <short>Create invoice</short>
/// <category>Invoices</category>
/// <returns>Invoice</returns>
/// <example>
/// <![CDATA[
///
/// Data transfer in application/json format:
///
/// data: {
/// number: "invoice000001",
/// issueDate: "2015-06-01T00:00:00",
/// contactId: 10,
/// dueDate: "2025-06-01T00:00:00",
/// language: "es-ES",
/// currency: "rub",
/// exchangeRate: 54.32,
/// terms: "Terms for this invoice",
/// invoiceLines:
/// [{
/// invoiceItemID: 1,
/// invoiceTax1ID: 1,
/// invoiceTax2ID: 2,
/// description: "description for invoice line 1",
/// quantity: 100,
/// price: 7.7,
/// discount: 25
/// }]
/// }
///
/// where invoiceItemID, invoiceTax1ID, invoiceTax2ID - ids of the real existing invoice item and invoice taxes,
/// contactId - id of the existing contact
///
/// ]]>
/// </example>
[Create(@"invoice")]
public InvoiceWrapper CreateInvoice(
CreateOrUpdateInvoiceInDto inDto
)
{
string number = inDto.Number;
ApiDateTime issueDate = inDto.IssueDate;
int templateType = inDto.TemplateType;
int contactId = inDto.ContactId;
int consigneeId = inDto.ConsigneeId;
int entityId = inDto.EntityId;
int billingAddressID = inDto.BillingAddressID;
int deliveryAddressID = inDto.DeliveryAddressID;
ApiDateTime dueDate = inDto.DueDate;
string language = inDto.Language;
string currency = inDto.Currency;
decimal exchangeRate = inDto.ExchangeRate;
string purchaseOrderNumber = inDto.PurchaseOrderNumber;
string terms = inDto.Terms;
string description = inDto.Description;
IEnumerable<InvoiceLine> invoiceLines = inDto.InvoiceLines;
var invoiceLinesList = invoiceLines != null ? invoiceLines.ToList() : new List<InvoiceLine>();
if (!invoiceLinesList.Any() || !IsLinesForInvoiceCorrect(invoiceLinesList)) throw new ArgumentException();
var invoice = new Invoice
{
Status = InvoiceStatus.Draft,
Number = number,
IssueDate = issueDate,
TemplateType = (InvoiceTemplateType)templateType,
ContactID = contactId,
ConsigneeID = consigneeId,
EntityType = EntityType.Opportunity,
EntityID = entityId,
DueDate = dueDate,
Language = language,
Currency = !String.IsNullOrEmpty(currency) ? currency.ToUpper() : null,
ExchangeRate = exchangeRate,
PurchaseOrderNumber = purchaseOrderNumber,
Terms = terms,
Description = description
};
CRMSecurity.DemandCreateOrUpdate(invoice);
if (billingAddressID > 0)
{
var address = DaoFactory.GetContactInfoDao().GetByID(billingAddressID);
if (address == null || address.InfoType != ContactInfoType.Address || address.Category != (int)AddressCategory.Billing || address.ContactID != contactId)
throw new ArgumentException();
}
if (deliveryAddressID > 0)
{
var address = DaoFactory.GetContactInfoDao().GetByID(deliveryAddressID);
if (address == null || address.InfoType != ContactInfoType.Address || address.Category != (int)AddressCategory.Postal || address.ContactID != consigneeId)
throw new ArgumentException();
}
invoice.ID = DaoFactory.GetInvoiceDao().SaveOrUpdateInvoice(invoice);
CreateInvoiceLines(invoiceLinesList, invoice);
DaoFactory.GetInvoiceDao().UpdateInvoiceJsonData(invoice, billingAddressID, deliveryAddressID);
return InvoiceWrapperHelper.Get(invoice);
}
private bool IsLinesForInvoiceCorrect(List<InvoiceLine> invoiceLines)
{
foreach (var line in invoiceLines)
{
if (line.InvoiceItemID <= 0 ||
line.Quantity < 0 || line.Price < 0 ||
line.Discount < 0 || line.Discount > 100 ||
line.InvoiceTax1ID < 0 || line.InvoiceTax2ID < 0)
return false;
if (!DaoFactory.GetInvoiceItemDao().IsExist(line.InvoiceItemID))
return false;
if (line.InvoiceTax1ID > 0 && !DaoFactory.GetInvoiceTaxDao().IsExist(line.InvoiceTax1ID))
return false;
if (line.InvoiceTax2ID > 0 && !DaoFactory.GetInvoiceTaxDao().IsExist(line.InvoiceTax2ID))
return false;
}
return true;
}
private List<InvoiceLine> CreateInvoiceLines(List<InvoiceLine> invoiceLines, Invoice invoice)
{
var result = new List<InvoiceLine>();
for (var i = 0; i < invoiceLines.Count; i++)
{
var line = new InvoiceLine
{
ID = 0,
InvoiceID = invoice.ID,
InvoiceItemID = invoiceLines[i].InvoiceItemID,
InvoiceTax1ID = invoiceLines[i].InvoiceTax1ID,
InvoiceTax2ID = invoiceLines[i].InvoiceTax2ID,
SortOrder = i,
Description = invoiceLines[i].Description,
Quantity = invoiceLines[i].Quantity,
Price = invoiceLines[i].Price,
Discount = Convert.ToInt32(invoiceLines[i].Discount)
};
line.ID = DaoFactory.GetInvoiceLineDao().SaveOrUpdateInvoiceLine(line);
result.Add(line);
}
return result;
}
/// <summary>
/// Updates the selected invoice with the parameters (contactId, consigneeId, etc.) specified in the request
/// </summary>
/// <param optional="false" name="id">Invoice ID</param>
/// <param optional="false" name="issueDate">Invoice issue date</param>
/// <param optional="true" name="templateType">Invoice template type</param>
/// <param optional="false" name="contactId">Invoice contact ID</param>
/// <param optional="true" name="consigneeId">Invoice consignee ID</param>
/// <param optional="true" name="entityId">Invoice entity ID</param>
/// <param optional="true" name="billingAddressID">Invoice billing address ID</param>
/// <param optional="true" name="deliveryAddressID">Invoice delivery address ID</param>
/// <param name="dueDate">Invoice due date</param>
/// <param optional="false" name="language">Invoice language</param>
/// <param optional="false" name="currency" remark="Allowed values: EUR, RUB etc. You can get the whole list of available currencies by api">Invoice currency</param>
/// <param optional="false" name="exchangeRate">Invoice exchange rate</param>
/// <param optional="true" name="purchaseOrderNumber">Invoice purchase order number</param>
/// <param optional="false" name="terms">Invoice terms</param>
/// <param optional="true" name="description">Invoice description</param>
/// <param optional="false" name="invoiceLines">Invoice lines list</param>
/// <short>Update invoice</short>
/// <category>Invoices</category>
/// <returns>Invoice</returns>
/// <example>
/// <![CDATA[
///
/// Data transfer in application/json format:
///
/// data: {
/// id: 5,
/// issueDate: "2015-06-01T00:00:00",
/// contactId: 10,
/// dueDate: "2025-06-01T00:00:00",
/// language: "es-ES",
/// currency: "rub",
/// exchangeRate: 54.32,
/// terms: "Terms for this invoice",
/// invoiceLines:
/// [{
/// invoiceItemID: 1,
/// invoiceTax1ID: 1,
/// invoiceTax2ID: 2,
/// description: "description for invoice line 1",
/// quantity: 100,
/// price: 7.7,
/// discount: 25
/// }]
/// }
///
/// where invoiceItemID, invoiceTax1ID, invoiceTax2ID - ids of the real existing invoice item and invoice taxes,
/// contactId - id of the existing contact
///
/// ]]>
/// </example>
[Update(@"invoice/{id:int}")]
public InvoiceWrapper UpdateInvoice(
int id,
CreateOrUpdateInvoiceInDto inDto)
{
ApiDateTime issueDate = inDto.IssueDate;
int templateType = inDto.TemplateType;
int contactId = inDto.ContactId;
int consigneeId = inDto.ConsigneeId;
int entityId = inDto.EntityId;
int billingAddressID = inDto.BillingAddressID;
int deliveryAddressID = inDto.DeliveryAddressID;
ApiDateTime dueDate = inDto.DueDate;
string language = inDto.Language;
string currency = inDto.Currency;
decimal exchangeRate = inDto.ExchangeRate;
string purchaseOrderNumber = inDto.PurchaseOrderNumber;
string terms = inDto.Terms;
string description = inDto.Description;
IEnumerable<InvoiceLine> invoiceLines = inDto.InvoiceLines;
var invoiceLinesList = invoiceLines != null ? invoiceLines.ToList() : new List<InvoiceLine>();
if (!invoiceLinesList.Any() || !IsLinesForInvoiceCorrect(invoiceLinesList)) throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().GetByID(id);
if (invoice == null || !CRMSecurity.CanEdit(invoice)) throw new ItemNotFoundException();
invoice.IssueDate = issueDate;
invoice.TemplateType = (InvoiceTemplateType)templateType;
invoice.ContactID = contactId;
invoice.ConsigneeID = consigneeId;
invoice.EntityType = EntityType.Opportunity;
invoice.EntityID = entityId;
invoice.DueDate = dueDate;
invoice.Language = language;
invoice.Currency = !String.IsNullOrEmpty(currency) ? currency.ToUpper() : null; ;
invoice.ExchangeRate = exchangeRate;
invoice.PurchaseOrderNumber = purchaseOrderNumber;
invoice.Terms = terms;
invoice.Description = description;
invoice.JsonData = null;
CRMSecurity.DemandCreateOrUpdate(invoice);
if (billingAddressID > 0)
{
var address = DaoFactory.GetContactInfoDao().GetByID(billingAddressID);
if (address == null || address.InfoType != ContactInfoType.Address || address.Category != (int)AddressCategory.Billing || address.ContactID != contactId)
throw new ArgumentException();
}
if (deliveryAddressID > 0)
{
var address = DaoFactory.GetContactInfoDao().GetByID(deliveryAddressID);
if (address == null || address.InfoType != ContactInfoType.Address || address.Category != (int)AddressCategory.Postal || address.ContactID != consigneeId)
throw new ArgumentException();
}
DaoFactory.GetInvoiceDao().SaveOrUpdateInvoice(invoice);
DaoFactory.GetInvoiceLineDao().DeleteInvoiceLines(invoice.ID);
CreateInvoiceLines(invoiceLinesList, invoice);
DaoFactory.GetInvoiceDao().UpdateInvoiceJsonData(invoice, billingAddressID, deliveryAddressID);
if (Global.CanDownloadInvoices)
{
// PdfQueueWorker.StartTask(HttpContext.Current, TenantManager.GetCurrentTenant().TenantId, SecurityContext.CurrentAccount.ID, invoice.ID);
}
return InvoiceWrapperHelper.Get(invoice);
}
/// <summary>
/// Returns the pdf file associated with the invoice with the ID specified in the request
/// </summary>
/// <param name="invoiceid">Invoice ID</param>
/// <short>Get invoice pdf file</short>
/// <category>Invoices</category>
/// <returns>File</returns>
[Read(@"invoice/{invoiceid:int}/pdf")]
public FileWrapper<int> GetInvoicePdfExistOrCreate(int invoiceid)
{
if (invoiceid <= 0) throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceid);
if (invoice == null) throw new ItemNotFoundException();
if (!CRMSecurity.CanAccessTo(invoice))
{
throw CRMSecurity.CreateSecurityException();
}
return FileWrapperHelper.Get<int>(GetInvoicePdfExistingOrCreate(invoice));
}
private ASC.Files.Core.File<int> GetInvoicePdfExistingOrCreate(ASC.CRM.Core.Entities.Invoice invoice)
{
var existingFile = invoice.GetInvoiceFile(DaoFactory);
if (existingFile != null)
{
return existingFile;
}
else
{
var newFile = PdfCreator.CreateFile(invoice, DaoFactory);
invoice.FileID = Int32.Parse(newFile.ID.ToString());
DaoFactory.GetInvoiceDao().UpdateInvoiceFileID(invoice.ID, invoice.FileID);
DaoFactory.GetRelationshipEventDao().AttachFiles(invoice.ContactID, invoice.EntityType, invoice.EntityID, new[] { invoice.FileID });
return newFile;
}
}
/// <summary>
/// Returns information about the generation of the pdf file of the invoice
/// </summary>
/// <param name="invoiceId">Invoice ID</param>
/// <param name="storageUrl">Storage Url</param>
/// <param name="revisionId">Revision ID</param>
/// <short>Check invoice pdf file</short>
/// <category>Invoices</category>
/// <returns>ConverterData</returns>
[Create(@"invoice/converter/data")]
public ConverterData GetInvoiceConverterData(int invoiceId, string storageUrl, string revisionId)
{
if (invoiceId <= 0) throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceId);
if (invoice == null) throw new ItemNotFoundException();
if (!CRMSecurity.CanAccessTo(invoice))
{
throw CRMSecurity.CreateSecurityException();
}
var converterData = new ConverterData
{
StorageUrl = storageUrl,
RevisionId = revisionId,
InvoiceId = invoiceId
};
var existingFile = invoice.GetInvoiceFile(DaoFactory);
if (existingFile != null)
{
converterData.FileId = invoice.FileID;
return converterData;
}
if (string.IsNullOrEmpty(storageUrl) || string.IsNullOrEmpty(revisionId))
{
return PdfCreator.StartCreationFileAsync(invoice);
}
else
{
var convertedFile = PdfCreator.GetConvertedFile(converterData, DaoFactory);
if (convertedFile != null)
{
invoice.FileID = Int32.Parse(convertedFile.ID.ToString());
DaoFactory.GetInvoiceDao().UpdateInvoiceFileID(invoice.ID, invoice.FileID);
DaoFactory.GetRelationshipEventDao().AttachFiles(invoice.ContactID, invoice.EntityType, invoice.EntityID, new[] { invoice.FileID });
converterData.FileId = invoice.FileID;
return converterData;
}
else
{
return converterData;
}
}
}
/// <summary>
/// Returns the existence of the invoice with the Number specified in the request
/// </summary>
/// <param name="number">Invoice number</param>
/// <short>Check invoice existence by number</short>
/// <category>Invoices</category>
/// <returns>IsExist</returns>
[Read(@"invoice/bynumber/exist")]
public Boolean GetInvoiceByNumberExistence(string number)
{
if (String.IsNullOrEmpty(number)) throw new ArgumentException();
return DaoFactory.GetInvoiceDao().IsExist(number);
}
/// <summary>
/// Returns the detailed information about the invoice with the Number specified in the request
/// </summary>
/// <param name="number">Invoice number</param>
/// <short>Get invoice by number</short>
/// <category>Invoices</category>
/// <returns>Invoice</returns>
[Read(@"invoice/bynumber")]
public InvoiceWrapper GetInvoiceByNumber(string number)
{
if (String.IsNullOrEmpty(number)) throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().GetByNumber(number);
if (invoice == null) throw new ItemNotFoundException();
if (!CRMSecurity.CanAccessTo(invoice))
{
throw CRMSecurity.CreateSecurityException();
}
return InvoiceWrapperHelper.Get(invoice);
}
/// <summary>
/// Returns the list of invoice items matching the creteria specified in the request
/// </summary>
/// <param name="status">Status</param>
/// <param optional="true" name="inventoryStock">InventoryStock</param>
/// <short>Get invoice item list</short>
/// <category>Invoices</category>
/// <returns>InvoiceItem list</returns>
[Read(@"invoiceitem/filter")]
public IEnumerable<InvoiceItemWrapper> GetInvoiceItems(int status, bool? inventoryStock)
{
IEnumerable<InvoiceItemWrapper> result;
InvoiceItemSortedByType sortBy;
OrderBy invoiceOrderBy;
var searchString = ApiContext.FilterValue;
if (InvoiceItemSortedByType.TryParse(ApiContext.SortBy, true, out sortBy))
{
invoiceOrderBy = new OrderBy(sortBy, !ApiContext.SortDescending);
}
else if (String.IsNullOrEmpty(ApiContext.SortBy))
{
invoiceOrderBy = new OrderBy(InvoiceItemSortedByType.Name, true);
}
else
{
invoiceOrderBy = null;
}
var fromIndex = (int)ApiContext.StartIndex;
var count = (int)ApiContext.Count;
if (invoiceOrderBy != null)
{
result = DaoFactory.GetInvoiceItemDao().GetInvoiceItems(
searchString,
status,
inventoryStock,
fromIndex, count,
invoiceOrderBy)
.ConvertAll(x => InvoiceItemWrapperHelper.Get(x));
ApiContext.SetDataPaginated();
ApiContext.SetDataFiltered();
ApiContext.SetDataSorted();
}
else
{
result = DaoFactory.GetInvoiceItemDao().GetInvoiceItems(
searchString,
status,
inventoryStock,
0, 0,
null)
.ConvertAll(x => InvoiceItemWrapperHelper.Get(x));
}
int totalCount;
if (result.Count() < count)
{
totalCount = fromIndex + result.Count();
}
else
{
totalCount = DaoFactory.GetInvoiceItemDao().GetInvoiceItemsCount(
searchString,
status,
inventoryStock);
}
ApiContext.SetTotalCount(totalCount);
return result;
}
/// <summary>
/// Returns the detailed information about the invoice item with the ID specified in the request
/// </summary>
/// <param name="invoiceitemid">Invoice Item ID</param>
/// <short>Get invoice item by ID</short>
/// <category>Invoices</category>
/// <returns>Invoice Item</returns>
[Read(@"invoiceitem/{invoiceitemid:int}")]
public InvoiceItemWrapper GetInvoiceItemByID(int invoiceitemid)
{
if (invoiceitemid <= 0) throw new ArgumentException();
var invoiceItem = DaoFactory.GetInvoiceItemDao().GetByID(invoiceitemid);
if (invoiceItem == null) throw new ItemNotFoundException();
return InvoiceItemWrapperHelper.Get(invoiceItem);
}
/// <summary>
/// Creates the invoice line with the parameters (invoiceId, invoiceItemId, etc.) specified in the request
/// </summary>
/// <param optional="false" name="invoiceId">Invoice ID</param>
/// <param optional="false" name="invoiceItemId">Invoice item ID</param>
/// <param optional="true" name="invoiceTax1Id">First invoice tax ID</param>
/// <param optional="true" name="invoiceTax2Id">Second invoice tax ID</param>
/// <param optional="true" name="sortOrder">Sort Order</param>
/// <param optional="true" name="description">Description</param>
/// <param optional="true" name="quantity">Quantity</param>
/// <param optional="true" name="price">Price</param>
/// <param optional="true" name="discount">Discount</param>
/// <short>Create invoice line</short>
/// <category>Invoices</category>
/// <returns>InvoiceLine</returns>
[Create(@"invoiceline")]
public InvoiceLineWrapper CreateInvoiceLine(
CreateOrUpdateInvoiceLineInDto inDto
)
{
int invoiceId = inDto.InvoiceId;
int invoiceItemId = inDto.InvoiceItemId;
int invoiceTax1Id = inDto.InvoiceTax1Id;
int invoiceTax2Id = inDto.InvoiceTax2Id;
int sortOrder = inDto.SortOrder;
string description = inDto.Description;
int quantity = inDto.Quantity;
decimal price = inDto.Price;
int discount = inDto.Discount;
var invoiceLine = new InvoiceLine
{
InvoiceID = invoiceId,
InvoiceItemID = invoiceItemId,
InvoiceTax1ID = invoiceTax1Id,
InvoiceTax2ID = invoiceTax2Id,
SortOrder = sortOrder,
Description = description,
Quantity = quantity,
Price = price,
Discount = discount
};
if (invoiceId <= 0)
throw new ArgumentException();
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceId);
CRMSecurity.DemandCreateOrUpdate(invoiceLine, invoice);
invoiceLine.ID = DaoFactory.GetInvoiceLineDao().SaveOrUpdateInvoiceLine(invoiceLine);
DaoFactory.GetInvoiceDao().UpdateInvoiceJsonDataAfterLinesUpdated(invoice);
if (Global.CanDownloadInvoices)
{
// PdfQueueWorker.StartTask(HttpContext.Current, TenantManager.GetCurrentTenant().TenantId, SecurityContext.CurrentAccount.ID, invoice.ID);
}
return InvoiceLineWrapperHelper.Get(invoiceLine);
}
/// <summary>
/// Updates the selected invoice line with the parameters (invoiceId, invoiceItemId, etc.) specified in the request
/// </summary>
/// <param optional="false" name="id">Line ID</param>
/// <param optional="false" name="invoiceId">Invoice ID</param>
/// <param optional="false" name="invoiceItemId">Invoice item ID</param>
/// <param optional="true" name="invoiceTax1Id">First invoice tax ID</param>
/// <param optional="true" name="invoiceTax2Id">Second invoice tax ID</param>
/// <param optional="true" name="sortOrder">Sort Order</param>
/// <param optional="true" name="description">Description</param>
/// <param optional="true" name="quantity">Quantity</param>
/// <param optional="true" name="price">Price</param>
/// <param optional="true" name="discount">Discount</param>
/// <short>Update invoice line</short>
/// <category>Invoices</category>
/// <returns>InvoiceLine</returns>
[Update(@"invoiceline/{id:int}")]
public InvoiceLineWrapper UpdateInvoiceLine(
int id,
CreateOrUpdateInvoiceLineInDto inDto
)
{
int invoiceId = inDto.InvoiceId;
int invoiceItemId = inDto.InvoiceItemId;
int invoiceTax1Id = inDto.InvoiceTax1Id;
int invoiceTax2Id = inDto.InvoiceTax2Id;
int sortOrder = inDto.SortOrder;
string description = inDto.Description;
int quantity = inDto.Quantity;
decimal price = inDto.Price;
int discount = inDto.Discount;
if (invoiceId <= 0)
throw new ArgumentException();
var invoiceLine = DaoFactory.GetInvoiceLineDao().GetByID(id);
if (invoiceLine == null || invoiceLine.InvoiceID != invoiceId) throw new ItemNotFoundException();
invoiceLine.InvoiceID = invoiceId;
invoiceLine.InvoiceItemID = invoiceItemId;
invoiceLine.InvoiceTax1ID = invoiceTax1Id;
invoiceLine.InvoiceTax2ID = invoiceTax2Id;
invoiceLine.SortOrder = sortOrder;
invoiceLine.Description = description;
invoiceLine.Quantity = quantity;
invoiceLine.Price = price;
invoiceLine.Discount = discount;
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceId);
CRMSecurity.DemandCreateOrUpdate(invoiceLine, invoice);
DaoFactory.GetInvoiceLineDao().SaveOrUpdateInvoiceLine(invoiceLine);
DaoFactory.GetInvoiceDao().UpdateInvoiceJsonDataAfterLinesUpdated(invoice);
if (Global.CanDownloadInvoices)
{
// PdfQueueWorker.StartTask(HttpContext.Current, TenantManager.GetCurrentTenant().TenantId, SecurityContext.CurrentAccount.ID, invoice.ID);
}
return InvoiceLineWrapperHelper.Get(invoiceLine);
}
/// <summary>
/// Deletes the invoice line with the ID specified in the request
/// </summary>
/// <param optional="false" name="id">Line ID</param>
/// <short>Delete invoice line</short>
/// <category>Invoices</category>
/// <returns>Line ID</returns>
[Delete(@"invoiceline/{id:int}")]
public int DeleteInvoiceLine(int id)
{
var invoiceLine = DaoFactory.GetInvoiceLineDao().GetByID(id);
if (invoiceLine == null) throw new ItemNotFoundException();
if (!DaoFactory.GetInvoiceLineDao().CanDelete(invoiceLine.ID)) throw new Exception("Can't delete invoice line");
var invoice = DaoFactory.GetInvoiceDao().GetByID(invoiceLine.InvoiceID);
if (invoice == null) throw new ItemNotFoundException();
if (!CRMSecurity.CanEdit(invoice)) throw CRMSecurity.CreateSecurityException();
DaoFactory.GetInvoiceLineDao().DeleteInvoiceLine(id);
DaoFactory.GetInvoiceDao().UpdateInvoiceJsonDataAfterLinesUpdated(invoice);
if (Global.CanDownloadInvoices)
{
// PdfQueueWorker.StartTask(HttpContext.Current, TenantManager.GetCurrentTenant().TenantId, SecurityContext.CurrentAccount.ID, invoice.ID);
}
return id;
}
/// <summary>
/// Creates the invoice item with the parameters (title, description, price, etc.) specified in the request
/// </summary>
/// <param optional="false" name="title">Item title</param>
/// <param optional="true" name="description">Item description</param>
/// <param optional="false" name="price">Item price</param>
/// <param optional="true" name="sku">Item stock keeping unit</param>
/// <param optional="true" name="quantity">Item quantity</param>
/// <param optional="true" name="stockQuantity">Item stock quantity</param>
/// <param optional="true" name="trackInventory">Track inventory</param>
/// <param optional="true" name="invoiceTax1id">Item first invoice tax ID</param>
/// <param optional="true" name="invoiceTax2id">Item second invoice tax ID</param>
/// <short>Create invoice item</short>
/// <category>Invoices</category>
/// <returns>InvoiceItem</returns>
[Create(@"invoiceitem")]
public InvoiceItemWrapper CreateInvoiceItem(
CreateOrUpdateInvoiceItemInDto inDto
)
{
string title = inDto.Title;
string description = inDto.Description;
decimal price = inDto.Price;
string sku = inDto.Sku;
int quantity = inDto.Quantity;
int stockQuantity = inDto.StockQuantity;
bool trackInventory = inDto.TrackInventory;
int invoiceTax1id = inDto.InvoiceTax1id;
int invoiceTax2id = inDto.InvoiceTax2id;
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (String.IsNullOrEmpty(title) || price <= 0) throw new ArgumentException();
var invoiceItem = new InvoiceItem
{
Title = title,
Description = description,
Price = price,
StockKeepingUnit = sku,
StockQuantity = stockQuantity,
TrackInventory = trackInventory,
InvoiceTax1ID = invoiceTax1id,
InvoiceTax2ID = invoiceTax2id
};
invoiceItem = DaoFactory.GetInvoiceItemDao().SaveOrUpdateInvoiceItem(invoiceItem);
MessageService.Send(MessageAction.InvoiceItemCreated, MessageTarget.Create(invoiceItem.ID), invoiceItem.Title);
return InvoiceItemWrapperHelper.Get(invoiceItem);
}
/// <summary>
/// Updates the selected invoice item with the parameters (title, description, price, etc.) specified in the request
/// </summary>
/// <param optional="false" name="id">Item ID</param>
/// <param optional="false" name="title">Item title</param>
/// <param optional="true" name="description">Item description</param>
/// <param optional="false" name="price">Item price</param>
/// <param optional="true" name="sku">Item stock keeping unit</param>
/// <param optional="true" name="quantity">Item quantity</param>
/// <param optional="true" name="stockQuantity">Item stock quantity</param>
/// <param optional="true" name="trackInventory">Track inventory</param>
/// <param optional="true" name="invoiceTax1id">Item first invoice tax ID</param>
/// <param optional="true" name="invoiceTax2id">Item second invoice tax ID</param>
/// <short>Update invoice item</short>
/// <category>Invoices</category>
/// <returns>InvoiceItem</returns>
[Update(@"invoiceitem/{id:int}")]
public InvoiceItemWrapper UpdateInvoiceItem(int id,
CreateOrUpdateInvoiceItemInDto inDto
)
{
string title = inDto.Title;
string description = inDto.Description;
decimal price = inDto.Price;
string sku = inDto.Sku;
int quantity = inDto.Quantity;
int stockQuantity = inDto.StockQuantity;
bool trackInventory = inDto.TrackInventory;
int invoiceTax1id = inDto.InvoiceTax1id;
int invoiceTax2id = inDto.InvoiceTax2id;
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (id <= 0 || String.IsNullOrEmpty(title) || price <= 0) throw new ArgumentException();
if (!DaoFactory.GetInvoiceItemDao().IsExist(id)) throw new ItemNotFoundException();
var invoiceItem = new InvoiceItem
{
ID = id,
Title = title,
Description = description,
Price = price,
StockKeepingUnit = sku,
StockQuantity = stockQuantity,
TrackInventory = trackInventory,
InvoiceTax1ID = invoiceTax1id,
InvoiceTax2ID = invoiceTax2id
};
invoiceItem = DaoFactory.GetInvoiceItemDao().SaveOrUpdateInvoiceItem(invoiceItem);
MessageService.Send(MessageAction.InvoiceItemUpdated, MessageTarget.Create(invoiceItem.ID), invoiceItem.Title);
return InvoiceItemWrapperHelper.Get(invoiceItem);
}
/// <summary>
/// Deletes the invoice item with the ID specified in the request
/// </summary>
/// <param name="id">Item ID</param>
/// <short>Delete invoice item</short>
/// <category>Invoices</category>
/// <returns>InvoiceItem</returns>
[Delete(@"invoiceitem/{id:int}")]
public InvoiceItemWrapper DeleteInvoiceItem(int id)
{
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (id <= 0) throw new ArgumentException();
var invoiceItem = DaoFactory.GetInvoiceItemDao().DeleteInvoiceItem(id);
if (invoiceItem == null) throw new ItemNotFoundException();
MessageService.Send(MessageAction.InvoiceItemDeleted, MessageTarget.Create(invoiceItem.ID), invoiceItem.Title);
return InvoiceItemWrapperHelper.Get(invoiceItem);
}
/// <summary>
/// Deletes the group of invoice items with the IDs specified in the request
/// </summary>
/// <param name="ids">Item ID list</param>
/// <short>Delete Invoice item group</short>
/// <category>Invoices</category>
/// <returns>InvoiceItem list</returns>
[Delete(@"invoiceitem")]
public IEnumerable<InvoiceItemWrapper> DeleteBatchItems(IEnumerable<int> ids)
{
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (ids == null) throw new ArgumentException();
ids = ids.Distinct();
var items = DaoFactory.GetInvoiceItemDao().DeleteBatchInvoiceItems(ids.ToArray());
MessageService.Send(MessageAction.InvoiceItemsDeleted, MessageTarget.Create(ids), items.Select(x => x.Title));
return items.ConvertAll(x => InvoiceItemWrapperHelper.Get(x));
}
/// <summary>
/// Returns the list of invoice taxes
/// </summary>
/// <short>Get invoice taxes list</short>
/// <category>Invoices</category>
/// <returns>InvoiceTax list</returns>
[Read(@"invoice/tax")]
public IEnumerable<InvoiceTaxWrapper> GetInvoiceTaxes()
{
return DaoFactory.GetInvoiceTaxDao().GetAll().ConvertAll(x => InvoiceTaxWrapperHelper.Get(x));
}
/// <summary>
/// Creates the invoice tax with the parameters (name, description, rate) specified in the request
/// </summary>
/// <param name="name">Tax name</param>
/// <param name="description">Tax description</param>
/// <param name="rate">Tax rate</param>
/// <short>Create invoice tax</short>
/// <category>Invoices</category>
/// <returns>InvoiceTax</returns>
[Create(@"invoice/tax")]
public InvoiceTaxWrapper CreateInvoiceTax(
[FromBody] CreateOrUpdateInvoiceTax inDto)
{
string name = inDto.Name;
string description = inDto.Description;
decimal rate = inDto.Rate;
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (String.IsNullOrEmpty(name)) throw new ArgumentException(CRMInvoiceResource.EmptyTaxNameError);
if (DaoFactory.GetInvoiceTaxDao().IsExist(name)) throw new ArgumentException(CRMInvoiceResource.ExistTaxNameError);
var invoiceTax = new InvoiceTax
{
Name = name,
Description = description,
Rate = rate
};
invoiceTax = DaoFactory.GetInvoiceTaxDao().SaveOrUpdateInvoiceTax(invoiceTax);
MessageService.Send(MessageAction.InvoiceTaxCreated, MessageTarget.Create(invoiceTax.ID), invoiceTax.Name);
return InvoiceTaxWrapperHelper.Get(invoiceTax);
}
/// <summary>
/// Updates the selected invoice tax with the parameters (name, description, rate) specified in the request
/// </summary>
/// <param name="id">Tax ID</param>
/// <param name="name">Tax name</param>
/// <param name="description">Tax description</param>
/// <param name="rate">Tax rate</param>
/// <short>Update invoice tax</short>
/// <category>Invoices</category>
/// <returns>InvoiceTax</returns>
[Update(@"invoice/tax/{id:int}")]
public InvoiceTaxWrapper UpdateInvoiceTax(
int id,
CreateOrUpdateInvoiceTax inDto)
{
string name = inDto.Name;
string description = inDto.Description;
decimal rate = inDto.Rate;
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (id <= 0 || String.IsNullOrEmpty(name)) throw new ArgumentException(CRMInvoiceResource.EmptyTaxNameError);
if (!DaoFactory.GetInvoiceTaxDao().IsExist(id)) throw new ItemNotFoundException();
var invoiceTax = new InvoiceTax
{
ID = id,
Name = name,
Description = description,
Rate = rate
};
invoiceTax = DaoFactory.GetInvoiceTaxDao().SaveOrUpdateInvoiceTax(invoiceTax);
MessageService.Send(MessageAction.InvoiceTaxUpdated, MessageTarget.Create(invoiceTax.ID), invoiceTax.Name);
return InvoiceTaxWrapperHelper.Get(invoiceTax);
}
/// <summary>
/// Delete the invoice tax with the ID specified in the request
/// </summary>
/// <param name="id">Tax ID</param>
/// <short>Delete invoice tax</short>
/// <category>Invoices</category>
/// <returns>InvoiceTax</returns>
[Delete(@"invoice/tax/{id:int}")]
public InvoiceTaxWrapper DeleteInvoiceTax(int id)
{
if (!CRMSecurity.IsAdmin)
{
throw CRMSecurity.CreateSecurityException();
}
if (id <= 0) throw new ArgumentException();
var invoiceTax = DaoFactory.GetInvoiceTaxDao().DeleteInvoiceTax(id);
if (invoiceTax == null) throw new ItemNotFoundException();
MessageService.Send(MessageAction.InvoiceTaxDeleted, MessageTarget.Create(invoiceTax.ID), invoiceTax.Name);
return InvoiceTaxWrapperHelper.Get(invoiceTax);
}
/// <summary>
/// Get default invoice settings
/// </summary>
/// <short>Get default invoice settings</short>
/// <category>Invoices</category>
/// <returns>InvoiceSetting</returns>
[Read(@"invoice/settings")]
public InvoiceSetting GetSettings()
{
return DaoFactory.GetInvoiceDao().GetSettings();
}
/// <summary>
/// Save default invoice number
/// </summary>
/// <param name="autogenerated">Is autogenerated</param>
/// <param name="prefix">Prefix</param>
/// <param name="number">Number</param>
/// <short>Save default invoice number</short>
/// <category>Invoices</category>
/// <returns>InvoiceSetting</returns>
[Update(@"invoice/settings/name")]
public InvoiceSetting SaveNumberSettings(
SaveNumberSettingsInDto inDto
)
{
var autogenerated = inDto.AutoGenerated;
var number = inDto.Number;
var prefix = inDto.Prefix;
if (!CRMSecurity.IsAdmin) throw CRMSecurity.CreateSecurityException();
if (autogenerated && string.IsNullOrEmpty(number))
throw new ArgumentException();
if (autogenerated && DaoFactory.GetInvoiceDao().IsExist(prefix + number))
throw new ArgumentException();
var invoiceSetting = GetSettings();
invoiceSetting.Autogenerated = autogenerated;
invoiceSetting.Prefix = prefix;
invoiceSetting.Number = number;
var settings = DaoFactory.GetInvoiceDao().SaveInvoiceSettings(invoiceSetting);
MessageService.Send(MessageAction.InvoiceNumberFormatUpdated);
return settings;
}
/// <summary>
/// Save default invoice terms
/// </summary>
/// <param name="terms">Terms</param>
/// <short>Save default invoice terms</short>
/// <category>Invoices</category>
/// <returns>InvoiceSetting</returns>
[Update(@"invoice/settings/terms")]
public InvoiceSetting SaveTermsSettings(string terms)
{
if (!CRMSecurity.IsAdmin) throw CRMSecurity.CreateSecurityException();
var invoiceSetting = GetSettings();
invoiceSetting.Terms = terms;
var result = DaoFactory.GetInvoiceDao().SaveInvoiceSettings(invoiceSetting);
MessageService.Send(MessageAction.InvoiceDefaultTermsUpdated);
return result;
}
/// <visible>false</visible>
[Update(@"invoice/{invoiceid:int}/creationdate")]
public void SetInvoiceCreationDate(int invoiceid, ApiDateTime creationDate)
{
var dao = DaoFactory.GetInvoiceDao();
var invoice = dao.GetByID(invoiceid);
if (invoice == null || !CRMSecurity.CanAccessTo(invoice))
throw new ItemNotFoundException();
dao.SetInvoiceCreationDate(invoiceid, creationDate);
}
/// <visible>false</visible>
[Update(@"invoice/{invoiceid:int}/lastmodifeddate")]
public void SetInvoiceLastModifedDate(int invoiceid, ApiDateTime lastModifedDate)
{
var dao = DaoFactory.GetInvoiceDao();
var invoice = dao.GetByID(invoiceid);
if (invoice == null || !CRMSecurity.CanAccessTo(invoice))
throw new ItemNotFoundException();
dao.SetInvoiceLastModifedDate(invoiceid, lastModifedDate);
}
private IEnumerable<InvoiceBaseWrapper> ToListInvoiceBaseWrappers(ICollection<Invoice> items)
{
if (items == null || items.Count == 0) return new List<InvoiceWrapper>();
var result = new List<InvoiceBaseWrapper>();
var contactIDs = items.Select(item => item.ContactID);
contactIDs.ToList().AddRange(items.Select(item => item.ConsigneeID));
var contacts = DaoFactory.GetContactDao().GetContacts(contactIDs.Distinct().ToArray())
.ToDictionary(item => item.ID, x => ContactWrapperHelper.GetContactBaseWithEmailWrapper(x));
2020-04-16 19:41:37 +00:00
2021-03-05 20:06:49 +00:00
foreach (var invoice in items)
{
var invoiceWrapper = InvoiceBaseWrapperHelper.Get(invoice);
2020-04-16 19:41:37 +00:00
2021-03-05 20:06:49 +00:00
if (contacts.ContainsKey(invoice.ContactID))
{
invoiceWrapper.Contact = contacts[invoice.ContactID];
}
2020-04-16 19:41:37 +00:00
2021-03-05 20:06:49 +00:00
if (contacts.ContainsKey(invoice.ConsigneeID))
{
invoiceWrapper.Consignee = contacts[invoice.ContactID];
}
2021-03-02 16:29:07 +00:00
2021-03-05 20:06:49 +00:00
if (invoice.EntityID > 0)
{
invoiceWrapper.Entity = ToEntityWrapper(invoice.EntityType, invoice.EntityID); //Need to optimize
}
2021-03-02 16:29:07 +00:00
2021-03-05 20:06:49 +00:00
invoiceWrapper.Cost = invoice.GetInvoiceCost(DaoFactory);
2021-03-02 16:29:07 +00:00
2021-03-05 20:06:49 +00:00
result.Add(invoiceWrapper);
}
2021-03-02 16:29:07 +00:00
2021-03-05 20:06:49 +00:00
return result;
}
}
}