public static void InformProductionEvent(ProductionInProgress productionInProgress, Command command)
        {
            if (!productionInProgress.useCorporationWallet)
            {
                return;
            }

            var replyDict      = new Dictionary <string, object>();
            var productionDict = productionInProgress.ToDictionary();

            replyDict.Add(k.production, productionDict);

            const CorporationRole roleMask = CorporationRole.CEO | CorporationRole.DeputyCEO | CorporationRole.ProductionManager | CorporationRole.Accountant;

            Message.Builder.SetCommand(command)
            .WithData(replyDict)
            .ToCorporation(productionInProgress.character.CorporationEid, roleMask)
            .Send();
        }
        private void EndProduction(ProductionInProgress productionInProgress, bool forced)
        {
            Logger.Info("ending production. " + productionInProgress);

            var facility = GetFacility(productionInProgress.facilityEID);

            if (facility == null)
            {
                Logger.Error("facility not found in endProduction. facility EID:" + productionInProgress.facilityEID);

                _pipRepository.Delete(productionInProgress);
                RemoveFromRunningProductions(productionInProgress);

                Logger.Error("failed endProduction for " + productionInProgress);
                return;
            }

            using (var scope = Db.CreateTransaction())
            {
                try
                {
                    var replyDict = facility.EndProduction(productionInProgress, forced);

                    //delete from sql
                    _pipRepository.Delete(productionInProgress);

                    productionInProgress.SendProductionEventToCorporationMembersOnCommitted(Commands.ProductionRemoteEnd);

                    var ep = CalculateEp(facility, productionInProgress);

                    productionInProgress.character.AddExtensionPointsBoostAndLog(EpForActivityType.Production, ep);


                    if (replyDict != null)
                    {
                        Transaction.Current.OnCommited(() =>
                        {
                            //if the player is online we report the facility load
                            replyDict.Add(k.production, productionInProgress.ToDictionary());

                            var facilityInfo = facility.GetFacilityInfo(productionInProgress.character);
                            replyDict.Add(k.facility, facilityInfo);

                            Message.Builder.SetCommand(Commands.ProductionFinished)
                            .WithData(replyDict)
                            .ToCharacter(productionInProgress.character)
                            .Send();
                        });
                    }

                    productionInProgress.WriteLog();

                    Transaction.Current.OnCompleted((c) =>
                    {
                        RemoveFromRunningProductions(productionInProgress);
                    });

                    scope.Complete();
                }
                catch (Exception ex)
                {
                    Logger.Exception(ex);
                }
            }
        }