Beispiel #1
0
        public static void Daily(ISession session)
        {
            var parties = new Parties(session).Extent();

            foreach (Party party in parties)
            {
                party.DeriveRelationships();
            }
        }
Beispiel #2
0
        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;
                            }
                        }
                    }
                }
            }
        }