public void Init()
        {
            Customer customerForTest  = new Customer("FirstName SecondName", 0711535724, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest1 = new Customer("FirstName SecondName", 0711593911, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest2 = new Customer("FirstName SecondName", 0711593912, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest3 = new Customer("FirstName SecondName", 0711593913, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest4 = new Customer("FirstName SecondName", 0711593914, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest5 = new Customer("FirstName SecondName", 0711593915, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest6 = new Customer("FirstName SecondName", 0711593916, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest7 = new Customer("FirstName SecondName", 0711593917, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'A');
            Customer customerForTest8 = new Customer("FirstName SecondName", 0711535725, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'B');
            Customer customerForTest9 = new Customer("FirstName SecondName", 0711535726, "Address1, Address2.", new DateTime(2010, 5, 27, 10, 0, 0), 'B');

            listOfCustomers.Add(customerForTest);
            listOfCustomers.Add(customerForTest1);
            listOfCustomers.Add(customerForTest2);
            listOfCustomers.Add(customerForTest3);
            listOfCustomers.Add(customerForTest4);
            listOfCustomers.Add(customerForTest5);
            listOfCustomers.Add(customerForTest6);
            listOfCustomers.Add(customerForTest7);
            listOfCustomers.Add(customerForTest8);
            listOfCustomers.Add(customerForTest9);

            _sut = new BillingEngine(listOfCustomers);
        }
        public void Calculate_Free_Minutes_Correctly()
        {
            var customers = new List <Customer>()
            {
                new Customer()
                {
                    PhoneNumber = "077-7342345",
                    PackageCode = "Package C"
                }
            };

            var cdrs = new List <CallDetailsRecord>()
            {
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 1, 10, 30, 0), // 01-01-2017  10:30 PM (Peak call)
                    DurationInSeconds = 120
                }
            };

            var target = new BillingEngine();
            var bills  = target.Generate(customers, cdrs);

            Assert.AreEqual(1, bills[0].CallList.Count);
            Assert.AreEqual(2, bills[0].CallList[0].Charge);
        }
        public void Calculate_OffPeak_Billing_Charges_for_Local_Calls_Before_Peak_Correctly()
        {
            var customers = new List <Customer>()
            {
                new Customer()
                {
                    PhoneNumber = "077-7342345",
                    PackageCode = "Package A"
                }
            };

            var cdrs = new List <CallDetailsRecord>()
            {
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                 //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 1, 7, 30, 0), // 01-01-2017  7:30 AM (Off-peak call)
                    DurationInSeconds = 120
                }
            };

            var target = new BillingEngine();
            var bills  = target.Generate(customers, cdrs);

            Assert.AreEqual(1, bills[0].CallList.Count);
            Assert.AreEqual(4, bills[0].CallList[0].Charge);
        }
        public void Calculate_Peak_Billing_Charges_for_Long_Distance_Calls_Correctly()
        {
            var customers = new List <Customer>()
            {
                new Customer()
                {
                    PhoneNumber = "077-7342345",
                    PackageCode = "Package A"
                }
            };

            var cdrs = new List <CallDetailsRecord>()
            {
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "071-2342345",                  //Long distance call (different extensions)
                    StartTime         = new DateTime(2017, 1, 1, 10, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 120
                }
            };

            var target = new BillingEngine();
            var bills  = target.Generate(customers, cdrs);

            Assert.AreEqual(1, bills[0].CallList.Count);
            Assert.AreEqual(10, bills[0].CallList[0].Charge);
        }
示例#5
0
        static void Main(string[] args)
        {
            for (int i = 0; i < 999; i++)
            {
                Console.WriteLine("Enter Customer Number: XXX-XXXXXXX"); // Prompt
                string input_val = Console.ReadLine();                   // Get string from user
                Console.WriteLine("-----------------------");
                BillingEngine bil = new BillingEngine();
                bil.Genarate(input_val);
            }



            Console.WriteLine();
        }
        public void Generate_Bills_For_Each_Customer()
        {
            var customers = new List <Customer>()
            {
                new Customer()
                {
                    PhoneNumber    = "077-7342345",
                    FullName       = "Customer Name 1",
                    BillingAddress = "Billing Address 1",
                    PackageCode    = "Package A"
                },
                new Customer()
                {
                    PhoneNumber    = "077-2345434",
                    FullName       = "Customer Name 2",
                    BillingAddress = "Billing Address 2",
                    PackageCode    = "Package B"
                },
                new Customer()
                {
                    PhoneNumber    = "077-2345343",
                    FullName       = "Customer Name 3",
                    BillingAddress = "Billing Address 3",
                    PackageCode    = "Package A"
                },
            };

            var cdrs = new List <CallDetailsRecord>()
            {
            };

            var target = new BillingEngine();
            var bills  = target.Generate(customers, cdrs);

            Assert.AreEqual(3, bills.Count);

            var bill1 = bills.FirstOrDefault(b => b.PhoneNumber == "077-7342345");

            Assert.IsNotNull(bill1);
            Assert.AreEqual("Customer Name 1", bill1.FullName);
            Assert.AreEqual("Billing Address 1", bill1.BillingAddress);

            var bill2 = bills.FirstOrDefault(b => b.PhoneNumber == "077-2345434");

            Assert.IsNotNull(bill2);
            Assert.AreEqual("Customer Name 2", bill2.FullName);
            Assert.AreEqual("Billing Address 2", bill2.BillingAddress);
        }
        public void Calculate_Summery_With_Discount_Correctly()
        {
            var customers = new List <Customer>()
            {
                new Customer()
                {
                    PhoneNumber = "077-7342345",
                    PackageCode = "Package A"
                }
            };

            var cdrs = new List <CallDetailsRecord>()
            {
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 1, 10, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 12000
                },
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 1, 10, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 3000
                },
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 1, 10, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 7000
                }
            };

            var target = new BillingEngine();
            var bills  = target.Generate(customers, cdrs);

            Assert.AreEqual(1, bills.Count);
            Assert.AreEqual(3, bills[0].CallList.Count);
            Assert.AreEqual(100, bills[0].Rental);
            Assert.AreEqual(1101, bills[0].TotalCallChareges);
            Assert.AreEqual(440.4M, bills[0].Discounts);
            Assert.AreEqual(240.2M, bills[0].Tax);
            Assert.AreEqual(1000.8M, bills[0].BillAmount);
        }
 public void init()
 {
     _but = new BillingEngine();
 }
        public void Generate_Bills_For_Each_Customer_With_Correct_CDRs()
        {
            var customers = new List <Customer>()
            {
                new Customer()
                {
                    PhoneNumber    = "077-7342345",
                    FullName       = "Customer Name 1",
                    BillingAddress = "Billing Address 1",
                    PackageCode    = "Package A"
                },
                new Customer()
                {
                    PhoneNumber    = "077-2345434",
                    FullName       = "Customer Name 2",
                    BillingAddress = "Billing Address 2",
                    PackageCode    = "Package B"
                },
            };

            var cdrs = new List <CallDetailsRecord>()
            {
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-2345434",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 1, 10, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 10
                },
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                 //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 2, 8, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 20
                },
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-2345434",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 3, 10, 00, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 30
                },
                new CallDetailsRecord()
                {
                    OriginatingPhoneNumber = "077-7342345",
                    RecievingPhoneNumber   = "077-2342345",                  //Local call (same extension)
                    StartTime         = new DateTime(2017, 1, 4, 20, 30, 0), // 01-01-2017  10:30 AM (Peak call)
                    DurationInSeconds = 40
                }
            };

            var target = new BillingEngine();
            var bills  = target.Generate(customers, cdrs);

            var bill1 = bills.FirstOrDefault(b => b.PhoneNumber == "077-7342345");

            Assert.IsNotNull(bill1);
            Assert.AreEqual(2, bill1.CallList.Count);

            var call1 = bill1.CallList.FirstOrDefault(c => c.StartTime == new DateTime(2017, 1, 2, 8, 30, 0));

            Assert.IsNotNull(call1);
            Assert.AreEqual(20, call1.DurationInSeconds);

            var call2 = bill1.CallList.FirstOrDefault(c => c.StartTime == new DateTime(2017, 1, 4, 20, 30, 0));

            Assert.IsNotNull(call2);
            Assert.AreEqual(40, call2.DurationInSeconds);
        }
示例#10
0
        public override bool Sync()
        {
            //Get orders placed since last sync (based on Order's id) from Nop using Web Service

            using (Main Mercator = new Main(directory, null, ConfigurationManager.AppSettings["MercatorLogin"], ConfigurationManager.AppSettings["MercatorMdp"]))
            {
                //@"\\serveur\dossier_mercator"
                using (SqlConnection connection = new SqlConnection(dataSettings.DataConnectionString))
                {
                    try
                    {
                        connection.Open();

                        if (Mercator != null)
                        {
                            MercatorApi.Api.IsWeb = true;
                            string jsonCommandes = "";

                            jsonCommandes = WebService.Get(new UrlBuilder("GenericAttribute").And().FilterEq("KeyGroup", ENTITY).FilterEq("Key", KEY_SYNCED).FilterEq("Value", "0").BuildQuery());
                            //jsonCommandes = WebService.Get(WebServiceUrls.ORDER_UNSYNCED);

                            JToken[] commandes = ParserJSon.ParseResultToJTokenList(jsonCommandes);
                            if (commandes.Length == 0)
                            {
                                Program.WriteLine("Pas de nouvelles commandes");
                            }

                            foreach (JToken co in commandes)
                            {
                                try
                                {
                                    string orderResult = WebService.Get(urlBuilder
                                                                        .Id((int)co["EntityId"])
                                                                        .Expand("OrderItems")
                                                                        .BuildQuery());

                                    //JToken[] orderToken = ParserJSon.ParseResultToJTokenList(orderResult);
                                    JObject order = JObject.Parse(orderResult);

                                    //if (order.FirstOrDefault() != null)
                                    //{
                                    //    JToken c = orderToken.FirstOrDefault();
                                    if (((int)order["PaymentStatusId"] == 30 || (int)order["PaymentStatusId"] == 20) || (order["PaymentMethodSystemName"].ToString() == "Payments.CheckMoneyOrder"))
                                    {
                                        JObject syncMarker = new JObject();

                                        List <int> syncedOrderIds = new List <int>();

                                        var items = (order["OrderItems"]).ToArray();
                                        int id    = int.Parse(order["CustomerId"].ToString());
                                        //Get web client
                                        SigCli sigCli = new SigCli();
                                        bool   exists = sigCli.ReadWhere(String.Format("C_ID_WEB = '{0}'", id));

                                        if (!exists)
                                        {
                                            Program.log("Commande n°" + order["Id"].ToString() + " non synchronisée car le client " + id + " n'a pas été trouvé dans Mercator.");
                                        }
                                        else
                                        {
                                            //Get the journal in which the order has to be placed
                                            using (BillingEngine be = BillingEngine.InitNew(Billing.TypeVAEnum.V, 3, journal))
                                            {
                                                be.ApplyCustomerSupplier(sigCli.GetField("C_ID").Value.ToString());
                                                if (be.PIEDS != null)

                                                {
                                                    be.PIEDS["DATE"] = DateTime.Parse(order["CreatedOnUtc"].ToString());
                                                }
                                                else
                                                {
                                                    throw new Exception("An error occured - please check that the journal exists");
                                                }



                                                foreach (JToken i in items)
                                                {
                                                    //Get product ids by SKU (Nop's SKU = S_CLE_1)
                                                    JObject o   = JObject.Parse(WebService.Get(new UrlBuilder("Product").Id((int)i["ProductId"]).Select("Sku").BuildQuery()));
                                                    string  sku = o["Sku"].ToString();

                                                    int index = be.AppendLine();
                                                    //get from db stock using cle_1 then Add ID
                                                    be.InsertItem(sku, index, 1);

                                                    //Use price/vat used when the order was placed : might have been some changes in Mercator since then
                                                    be.LIGNES.Rows[index]["Q"]  = i["Quantity"].Value <Double>() /** condit*/;
                                                    be.LIGNES.Rows[index]["PU"] = i["UnitPriceExclTax"].Value <Decimal>();   /* * (1 + (i["Remise"].Value<Decimal>() / 100));*/
                                                }

                                                //Shipping tax
                                                //TODO: faire un doc avec les étapes de l'installation + vérifications à faire
                                                //TODO: Verif: Présence d'un article frais de livraison dans le Mercator cible
                                                if (Double.Parse(order["OrderShippingInclTax"].ToString()) > 0)
                                                {
                                                    string fraislivraisonId = OptionsMercator.GetOptionValue("NOP_LIV_ID").ToString();

                                                    SigStock sigStock      = new SigStock();
                                                    bool     fraisLivFound = sigStock.ReadWhere(String.Format("S_CLE1 = '{0}'", fraislivraisonId));

                                                    if (fraisLivFound)
                                                    {
                                                        int n = be.AppendLine();
                                                        be.InsertItem(sigStock.GetField("S_ID").Value.ToString(), n, 1);
                                                        be.LIGNES.Rows[n]["PU"]       = Double.Parse(order["OrderShippingInclTax"].ToString()) / 1.21;
                                                        be.LIGNES.Rows[n]["TAUX_TVA"] = 21;
                                                    }
                                                }

                                                //CODE PROMO SUR TOTAL COMMANDE
                                                //TODO:CODE PROMO - UNCOMMENT IF NECESSARY
                                                //if (Double.Parse(c["OrderDiscount"].ToString()) > 0)
                                                //{
                                                //    string codepromocommandecle1 = ConfigurationManager.AppSettings["CODEPROMOCOMMANDE"];
                                                //    SigStock sigStock = new SigStock();
                                                //    bool codePromoFound = sigStock.ReadWhere(String.Format("S_CLE1 = '{0}'", codepromocommandecle1));
                                                //    if (codePromoFound)
                                                //    {
                                                //        int n = be.AppendLine();
                                                //        be.InsertItem(sigStock.GetField("S_ID").Value.ToString().S_ID.TrimEnd(), n, 1);
                                                //        be.LIGNES.Rows[n]["PU"] = (Double.Parse(c["OrderDiscount"].ToString())) * -1;
                                                //        be.LIGNES.Rows[n]["TAUX_TVA"] = 0;
                                                //    }
                                                //}

                                                be.UpdateAmounts();

                                                #region payments

                                                //Check if order is paid : c["PaymentStatusId"] -> 10 pending, 30 paid
                                                if (order["PaymentStatusId"].ToString() == "10")
                                                {
                                                    switch (order["PaymentMethodSystemName"].ToString())
                                                    {
                                                    case PaymentMethods.NOP_VIREMENT: be.PIEDS["TYP_PAIEM1"] = PaymentMethods.M_VIREMENT; break;

                                                    case PaymentMethods.NOP_PAYPAL: be.PIEDS["TYP_PAIEM1"] = PaymentMethods.M_PAYPAL; break;

                                                    default:
                                                        be.PIEDS["TYP_PAIEM1"] = PaymentMethods.M_VIREMENT; break;
                                                    }
                                                }
                                                else if (order["PaymentStatusId"].ToString() == "30")
                                                {
                                                    double tot = Convert.ToDouble(be.PIEDS["TOT_TTC_DV"].ToString());

                                                    switch (order["PaymentMethodSystemName"].ToString())
                                                    {
                                                    case PaymentMethods.NOP_VIREMENT: be.PIEDS["TYP_PAIEM1"] = PaymentMethods.M_VIREMENT; break;

                                                    case PaymentMethods.NOP_PAYPAL: be.PIEDS["TYP_PAIEM1"] = PaymentMethods.M_PAYPAL; break;

                                                    default:
                                                        be.PIEDS["TYP_PAIEM1"] = PaymentMethods.M_VIREMENT; break;
                                                    }
                                                    //be.PIEDS["TYP_PAIEM1"] = 10;
                                                    be.PIEDS["TOT_PAIEM1"] = tot;
                                                    be.PIEDS["NET_DV"]     = tot;
                                                    be.PIEDS["NET_FB"]     = tot;
                                                }

                                                #endregion

                                                #region shipment
                                                if (order["PickUpInStore"].ToString() == "True")
                                                {
                                                    be.AppendLine();
                                                    int nAdresse = be.AppendLine();
                                                    be.LIGNES.Rows[nAdresse]["DESIGNATIO"] = "Retrait en magasin";
                                                }
                                                else
                                                {
                                                    Address billingA  = AddressConverter.ParseJsonToAddress(WebService.Get(new UrlBuilder("Address").Id((int)order["BillingAddressId"]).BuildQuery()));
                                                    Address shippingA = AddressConverter.ParseJsonToAddress(WebService.Get(new UrlBuilder("Address").Id((int)order["ShippingAddressId"]).BuildQuery()));
                                                    if (!billingA.Equals(shippingA))
                                                    {
                                                        //be.ApplyCliLiv("ID_CLI_LIV");
                                                        be.AppendLine();
                                                        int nAdresse = be.AppendLine();
                                                        be.LIGNES.Rows[nAdresse]["DESIGNATIO"] = "Adresse de livraison: ";
                                                        int nN = be.AppendLine();
                                                        be.LIGNES.Rows[nN]["DESIGNATIO"] = shippingA.FirstName + " " + shippingA.LastName;
                                                        int nA = be.AppendLine();
                                                        be.LIGNES.Rows[nA]["DESIGNATIO"] = shippingA.Street;
                                                        int nP = be.AppendLine();
                                                        be.LIGNES.Rows[nP]["DESIGNATIO"] = shippingA.ZipPostalCode;
                                                        int nV = be.AppendLine();
                                                        be.LIGNES.Rows[nV]["DESIGNATIO"] = String.Format("{0}, {1}", shippingA.City, shippingA.Country);
                                                        int nPh = be.AppendLine();
                                                        be.LIGNES.Rows[nPh]["DESIGNATIO"] = shippingA.PhoneNumber;

                                                        //TODO: Mode de livraison UPS + suppléments
                                                    }
                                                }

                                                #endregion



                                                #region CheckoutAttributes
                                                //Récupère les attributs de commandes associés à la commande et les affiches dans les lignes_v
                                                //if (order["CheckoutAttributeDescription"].ToString() != "" && order["CheckoutAttributeDescription"].ToString() != "null")
                                                //{
                                                //    Dictionary<string, string> attributes = extractAttributes(order["CheckoutAttributesXml"].ToString());

                                                //    if (attributes.ContainsKey(ATTRIBUT_COMM))
                                                //    {
                                                //        if (attributes[ATTRIBUT_COMM] != "")
                                                //        {
                                                //            be.AppendLine();
                                                //            int n = be.AppendLine();
                                                //            be.LIGNES.Rows[n]["DESIGNATIO"] = "Commentaires: ";

                                                //            string[] commLines = attributes[ATTRIBUT_COMM].Split(new string[] { "\r" }, StringSplitOptions.None);
                                                //            foreach (string s in commLines)
                                                //            {
                                                //                int nLine = be.AppendLine();
                                                //                be.LIGNES.Rows[nLine]["DESIGNATIO"] = s;
                                                //            }
                                                //        }
                                                //    }
                                                //}
                                                #endregion

                                                be.PIEDS["ID_WEB"]    = order["Id"].ToString();
                                                be.PIEDS["REFERENCE"] = REF_WEB;


                                                if (be.Save())
                                                {
                                                    be.Close();
                                                    syncMarker.Add("Value", "1");
                                                    //WebService.Patch(String.Format(WebServiceUrls.ORDER_ID, (int)c["Id"]), syncMarker.ToString());
                                                    WebService.Patch(String.Format(new UrlBuilder("GenericAttribute").Id((int)co["Id"]).BuildQuery()), syncMarker.ToString());
                                                }
                                                else
                                                {
                                                    //Erreur
                                                    return(false);
                                                }
                                            }
                                            //}
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    Program.log(e.Message);
                                    Program.log(e.StackTrace);
                                    return(false);
                                }
                            }

                            //****** UPDATE STATUS ********//
                            Program.WriteLine("Updating Nop Order status...");
                            string   ordersUncomplete = WebService.Get(urlBuilder.FilterEq("OrderStatusId", 20).BuildQuery());
                            JToken[] orders           = ParserJSon.ParseResultToJTokenList(ordersUncomplete);

                            if (orders.Count() > 0)
                            {
                                foreach (JToken o in orders)
                                {
                                    int    oId    = (int)o["Id"];
                                    PiedsV piedsV = new PiedsV();
                                    bool   exists = piedsV.Read(oId, "ID_WEB");

                                    if (exists)
                                    {
                                        JObject patch = new JObject();
                                        patch.Add("OrderStatusId", 30);
                                        if (Convert.ToInt32(piedsV.GetField("TYPE").Value) == 2)
                                        {
                                            patch.Add("PaymentStatusId", 30);
                                            patch.Add("ShippingStatusId", 30);
                                        }
                                        else
                                        if (Convert.ToInt32(piedsV.GetField("TYPE").Value) == 1)
                                        {
                                            patch.Add("OrderStatusId", 30);
                                            patch.Add("PaymentStatusId", 30);
                                            patch.Add("ShippingStatusId", 40);
                                        }

                                        WebService.Patch(urlBuilder.Id(oId).BuildQuery(), patch.ToString());
                                    }
                                }
                            }
                            Program.WriteLine("Updated");
                        }
                    }
                    catch (Exception e)
                    {
                        Program.log(e.Message);
                        Program.log(e.StackTrace);
                    }
                    finally
                    {
                        connection.Close();
                    }
                }
                //context.SaveChanges();

                return(true);
            }
        }