public static void Daily(ISession session) { var parties = new Parties(session).Extent(); foreach (Party party in parties) { party.DeriveRelationships(); } }
public static void BaseMonthly(ISession session) { var customers = new Parties(session).Extent(); customers.Filter.AddEquals(M.Party.CollectiveWorkEffortInvoice, true); var workTasks = new WorkTasks(session).Extent(); workTasks.Filter.AddEquals(M.WorkEffort.WorkEffortState, new WorkEffortStates(session).Completed); workTasks.Filter.AddContainedIn(M.WorkEffort.Customer, (Extent)customers); var workTasksByCustomer = workTasks.Select(v => v.Customer).Distinct() .ToDictionary(v => v, v => v.WorkEffortsWhereCustomer.Where(w => w.WorkEffortState.Equals(new WorkEffortStates(session).Completed)).ToArray()); SalesInvoice salesInvoice = null; foreach (var customerWorkTasks in workTasksByCustomer) { var customer = customerWorkTasks.Key; var customerWorkTasksByInternalOrganisation = customerWorkTasks.Value .GroupBy(v => v.TakenBy) .Select(v => v) .ToArray(); if (customerWorkTasks.Value.Any(v => v.CanInvoice)) { foreach (var group in customerWorkTasksByInternalOrganisation) { if (group.Any(v => v.CanInvoice)) { salesInvoice = new SalesInvoiceBuilder(session) .WithBilledFrom(group.Key) .WithBillToCustomer(customer) .WithInvoiceDate(session.Now()) .WithSalesInvoiceType(new SalesInvoiceTypes(session).SalesInvoice) .Build(); } var timeEntriesByBillingRate = group.SelectMany(v => v.ServiceEntriesWhereWorkEffort.OfType <TimeEntry>()) .Where(v => (v.IsBillable && !v.BillableAmountOfTime.HasValue && v.AmountOfTime.HasValue) || v.BillableAmountOfTime.HasValue) .GroupBy(v => v.BillingRate) .Select(v => v) .ToArray(); foreach (var rateGroup in timeEntriesByBillingRate) { var timeEntries = rateGroup.ToArray(); var invoiceItem = new SalesInvoiceItemBuilder(session) .WithInvoiceItemType(new InvoiceItemTypes(session).Service) .WithAssignedUnitPrice(rateGroup.Key) .WithQuantity(timeEntries.Sum(v => v.BillableAmountOfTime ?? v.AmountOfTime ?? 0.0m)) .Build(); salesInvoice.AddSalesInvoiceItem(invoiceItem); foreach (var billableEntry in timeEntries) { new TimeEntryBillingBuilder(session) .WithTimeEntry(billableEntry) .WithInvoiceItem(invoiceItem) .Build(); } } foreach (var workEffort in group) { if (workEffort.CanInvoice) { if (string.IsNullOrEmpty(salesInvoice.CustomerReference)) { salesInvoice.CustomerReference = $"WorkOrder(s): {workEffort.WorkEffortNumber}"; } else { salesInvoice.CustomerReference += $", {workEffort.WorkEffortNumber}"; } foreach (WorkEffortInventoryAssignment inventoryAssignment in workEffort.WorkEffortInventoryAssignmentsWhereAssignment) { var part = inventoryAssignment.InventoryItem.Part; var invoiceItem = new SalesInvoiceItemBuilder(session) .WithInvoiceItemType(new InvoiceItemTypes(session).PartItem) .WithPart(part) .WithAssignedUnitPrice(inventoryAssignment.UnitSellingPrice) .WithQuantity(inventoryAssignment.DerivedBillableQuantity) .Build(); salesInvoice.AddSalesInvoiceItem(invoiceItem); new WorkEffortBillingBuilder(session) .WithWorkEffort(workEffort) .WithInvoiceItem(invoiceItem) .Build(); } foreach (WorkEffortPurchaseOrderItemAssignment purchaseOrderItemAssignment in workEffort.WorkEffortPurchaseOrderItemAssignmentsWhereAssignment) { var invoiceItem = new SalesInvoiceItemBuilder(session) .WithInvoiceItemType(new InvoiceItemTypes(session).Service) .WithAssignedUnitPrice(purchaseOrderItemAssignment.UnitSellingPrice) .WithQuantity(purchaseOrderItemAssignment.Quantity) .Build(); salesInvoice.AddSalesInvoiceItem(invoiceItem); new WorkEffortBillingBuilder(session) .WithWorkEffort(workEffort) .WithInvoiceItem(invoiceItem) .Build(); } workEffort.WorkEffortState = new WorkEffortStates(session).Finished; } } } } } }