Beispiel #1
0
        public void Execute(IServiceProvider serviceProvider)
        {
            myService = new MyService(serviceProvider);

            #region bsd_Action_CreateDeliveryBill_1Request
            if (myService.context.MessageName == "bsd_Action_CreateDeliveryBill_1Request")
            {
                if (myService.context.Depth > 1)
                {
                    return;
                }
                myService.StartService();
                GoodsIssueNote_Manager goodsIssueNote_Manager = new GoodsIssueNote_Manager(myService.service);
                EntityReference        target = myService.getTargetEntityReference();

                Entity          request = myService.service.Retrieve(target.LogicalName, target.Id, new ColumnSet(true));
                EntityReference DeliverySchedule_Ref = (EntityReference)request["bsd_deliveryplan"];
                if ((bool)request["bsd_warehousestatus"] == false)
                {
                    "No quantity to create Goods Issue Note !".Throw();
                }

                // Danh sách request product còn dư số lượng.
                EntityCollection list_requestdeliveryproduct = myService.FetchXml(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                  <entity name='bsd_requestdeliveryproduct'>
                    <attribute name='bsd_requestdeliveryproductid' />
                    <attribute name='bsd_warehousestatus' />
                    <attribute name='bsd_warehousequantity' />
                    <attribute name='bsd_warehouse' />
                    <attribute name='bsd_uomid' />
                    <attribute name='bsd_totalquantity' />
                    <attribute name='bsd_requestedquantity' />
                    <attribute name='bsd_requestdelivery' />
                    <attribute name='bsd_remainingquantity' />
                    <attribute name='overriddencreatedon' />
                    <attribute name='bsd_quantity' />
                    <attribute name='bsd_product' />
                    <attribute name='bsd_netquantity' />
                    <attribute name='bsd_name' />
                    <attribute name='bsd_productid' />
                    <attribute name='bsd_freeitem' />
                    <attribute name='bsd_descriptionproduct' />
                    <filter type='and'>
                      <condition attribute='bsd_requestdelivery' operator='eq' value='" + request.Id + @"' />
                      <condition attribute='bsd_remainingquantity' operator='gt' value='0' />
                    </filter>
                  </entity>
                </fetch>");

                if (list_requestdeliveryproduct.Entities.Any())
                {
                    // Distinct theo warehouse, là 1 danh sách request product có warehouse không trùng nhau.
                    var list_distinct = list_requestdeliveryproduct.Entities.GroupBy(i => ((EntityReference)i["bsd_warehouse"]).Id, (key, group) => group.First()).ToList();
                    // lọc qua từng thằng này để tìm những cái request product có cùng sản phẩm và warehouse thì tạo 1 phiếu xuất kho
                    foreach (var distinct_item in list_distinct)
                    {
                        // danh sach request product. nhung line nao co warehouse o tren.
                        EntityCollection list_requestdeliveryproduct_sub = new EntityCollection();
                        foreach (var requestdeliveryproduct in list_requestdeliveryproduct.Entities)
                        {
                            if (((EntityReference)distinct_item["bsd_warehouse"]).Id.Equals(((EntityReference)requestdeliveryproduct["bsd_warehouse"]).Id))
                            {
                                list_requestdeliveryproduct_sub.Entities.Add(requestdeliveryproduct);
                            }
                        }


                        Entity          deliverybill     = new Entity("bsd_deliverybill");
                        EntityReference deliveryplan_ref = (EntityReference)request["bsd_deliveryplan"];
                        Entity          deliveryplan     = myService.service.Retrieve(deliveryplan_ref.LogicalName, deliveryplan_ref.Id, new ColumnSet(true));
                        deliverybill["bsd_requestdelivery"] = new EntityReference(request.LogicalName, request.Id);
                        deliverybill["bsd_deliveryplan"]    = request["bsd_deliveryplan"];
                        if (request.HasValue("bsd_order"))
                        {
                            deliverybill["bsd_order"] = request["bsd_order"];
                        }
                        else if (request.HasValue("bsd_quote"))
                        {
                            deliverybill["bsd_quote"] = request["bsd_quote"];
                        }
                        deliverybill["bsd_customer"]             = request["bsd_account"];
                        deliverybill["bsd_shiptoaddress"]        = request["bsd_shiptoaddress"];
                        deliverybill["bsd_requestedshipdate"]    = deliveryplan["bsd_requestedshipdate"];
                        deliverybill["bsd_requestedreceiptdate"] = deliveryplan["bsd_requestedreceiptdate"];
                        deliverybill["bsd_warehouse"]            = distinct_item["bsd_warehouse"];
                        deliverybill["bsd_site"] = request["bsd_site"];

                        Guid?deliverybill_id = null;
                        foreach (var item in list_requestdeliveryproduct_sub.Entities)
                        {
                            EntityReference product_ref   = (EntityReference)item["bsd_product"];
                            EntityReference warehouse_ref = (EntityReference)distinct_item["bsd_warehouse"];

                            decimal request_quantity    = (decimal)item["bsd_quantity"];
                            decimal request_netquantity = (decimal)item["bsd_netquantity"];

                            // Số lượng còn lại của sản phẩm này chưa xuất kho trên Delivery Schedule.
                            decimal DeliveryScheduleProduct_Remaining_Quantity = goodsIssueNote_Manager.GetRemainingQuantitybyProduct(product_ref.Id, DeliverySchedule_Ref.Id);

                            // số lượng còn lại chưa xuất của Request Delivery
                            decimal bill_quantity = request_quantity - request_netquantity;
                            bill_quantity = GetRemainingQuantityToCreateDeliveryBill(DeliveryScheduleProduct_Remaining_Quantity, bill_quantity);
                            // Kiểm tra yêu cầu giao hàng này có product bill này kho này sản phẩm này chưa. có rồi thì cộng dồn chưa có thì tạo mới. !
                            EntityCollection list = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                  <entity name='bsd_deliveryproductbill'>
                                    <attribute name='bsd_deliveryproductbillid' />
                                    <attribute name='bsd_netquantity' />
                                    <filter type='and'>
                                      <condition attribute='bsd_product' operator='eq' uitype='product' value='{0}' />
                                      <condition attribute='bsd_requestdelivery' operator='eq' value='{1}' />
                                    </filter>
                                    <link-entity name='bsd_deliverybill' from='bsd_deliverybillid' to='bsd_deliverybill' alias='ab'>
                                      <filter type='and'>
                                        <condition attribute='bsd_createddeliverynote' operator='eq' value='0' />
                                        <condition attribute='bsd_warehouse' operator='eq' uitype='bsd_warehouseentity' value='{2}' />
                                      </filter>
                                    </link-entity>
                                  </entity>
                                </fetch>", product_ref.Id, request.Id, warehouse_ref.Id)));

                            if (list.Entities.Any())
                            {
                                Entity  productbill     = list.Entities.First();
                                decimal old_netquantity = (decimal)productbill["bsd_netquantity"];
                                decimal net_quantity    = old_netquantity + bill_quantity;
                                Entity  new_productbill = new Entity(productbill.LogicalName, productbill.Id);
                                new_productbill["bsd_netquantity"] = net_quantity;
                                myService.service.Update(new_productbill);

                                // phần này sẽ chạy cả bên Update bên Delivery Product Bill
                            }
                            else
                            {
                                if (deliverybill_id == null)
                                {
                                    deliverybill_id = myService.service.Create(deliverybill);
                                }
                                Entity bsd_deliveryproductbill = new Entity("bsd_deliveryproductbill");
                                bsd_deliveryproductbill["bsd_deliverybill"]    = new EntityReference("bsd_deliverybill", (Guid)deliverybill_id);
                                bsd_deliveryproductbill["bsd_requestdelivery"] = new EntityReference("bsd_requestdelivery", request.Id);
                                bsd_deliveryproductbill["bsd_name"]            = item["bsd_name"];
                                bsd_deliveryproductbill["bsd_product"]         = product_ref;
                                if (item.HasValue("bsd_productid"))
                                {
                                    bsd_deliveryproductbill["bsd_productid"] = item["bsd_productid"];
                                }
                                if (item.HasValue("bsd_descriptionproduct"))
                                {
                                    bsd_deliveryproductbill["bsd_descriptionproduct"] = item["bsd_descriptionproduct"];
                                }
                                if (item.HasValue("bsd_freeitem"))
                                {
                                    bsd_deliveryproductbill["bsd_freeitem"] = (bool)item["bsd_freeitem"];
                                }
                                bsd_deliveryproductbill["bsd_uomid"]       = item["bsd_uomid"];
                                bsd_deliveryproductbill["bsd_quantity"]    = bill_quantity;
                                bsd_deliveryproductbill["bsd_netquantity"] = bill_quantity;
                                myService.service.Create(bsd_deliveryproductbill);

                                #region UpdateDeliveryScheduleProduct
                                goodsIssueNote_Manager.UpdateDeliveryScheduleProduct(request, deliveryplan.Id, product_ref.Id, 0, bill_quantity);
                                #endregion

                                #region cập nhật số lượng đã xuất trên request delivery product.
                                UpdateRequestDeliveryProduct_QuantityOnCreate(item.LogicalName, item.Id, bill_quantity);
                                #endregion
                            }
                        }

                        #region update lại request là đã tạo rồi
                        Entity new_request = new Entity(request.LogicalName, request.Id);
                        new_request["bsd_createddeliverybill"] = true;
                        myService.Update(new_request);
                        #endregion
                    }
                }
                else
                {
                    "Product quantities on Delivery Request are no longer enough to create Goods Issue Note.".Throw();
                }
            }
            #endregion

            #region Update
            else if (myService.context.MessageName == "Update")
            {
                Entity target = myService.getTarget();
                if (target.Contains("bsd_deliverynote") && target["bsd_deliverynote"] == null)
                {
                    target["bsd_createddeliverynote"] = false;
                }
            }
            #endregion

            #region bsd_Action_CreateDeliveryBill
            else if (myService.context.MessageName == "bsd_Action_CreateDeliveryBill")
            {
                if (myService.context.Depth > 1)
                {
                    return;
                }
                EntityReference target = myService.getTargetEntityReference();
                myService.StartService();

                EntityCollection list_requestdelivery = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                  <entity name='bsd_requestdelivery'>
                    <all-attributes />
                    <filter type='and'>
                      <condition attribute='bsd_deliveryplan' operator='eq' uitype='bsd_deliveryplan' value='{0}' />
                      <condition attribute='bsd_createddeliverybill' operator='eq' value='0' />
                      <condition attribute='bsd_warehousestatus' operator='eq' value='1' />
                    </filter>
                  </entity>
                </fetch>", target.Id)));

                foreach (var request in list_requestdelivery.Entities)
                {
                    //EntityCollection list_requestdeliveryproduct = myService.RetrieveOneCondition("bsd_requestdeliveryproduct", "bsd_requestdelivery", request.Id);
                    //var list_distinct = list_requestdeliveryproduct.Entities.GroupBy(i => ((EntityReference)i["bsd_warehouse"]).Id, (key, group) => group.First()).ToList();
                    //foreach (var distinct_item in list_distinct)
                    //{
                    //    Entity deliverybill = new Entity("bsd_deliverybill");
                    //    Entity deliveryplan = myService.service.Retrieve(target.LogicalName, target.Id, new ColumnSet(true));
                    //    deliverybill["bsd_name"] = "Phiếu xuất kho - " + request["bsd_name"];
                    //    deliverybill["bsd_requestdelivery"] = new EntityReference(request.LogicalName, request.Id);
                    //    deliverybill["bsd_deliveryplan"] = request["bsd_deliveryplan"];
                    //    deliverybill["bsd_order"] = request["bsd_order"];
                    //    deliverybill["bsd_customer"] = request["bsd_account"];
                    //    deliverybill["bsd_shiptoaddress"] = request["bsd_shiptoaddress"];
                    //    deliverybill["bsd_requestedshipdate"] = deliveryplan["bsd_requestedshipdate"];
                    //    deliverybill["bsd_requestedreceiptdate"] = deliveryplan["bsd_requestedreceiptdate"];
                    //    deliverybill["bsd_warehouse"] = distinct_item["bsd_warehouse"];
                    //    Guid deliverybill_id = myService.service.Create(deliverybill);

                    //    EntityCollection list_requestdeliveryproduct_sub = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                    //      <entity name='bsd_requestdeliveryproduct'>
                    //        <attribute name='bsd_requestdeliveryproductid' />
                    //        <attribute name='bsd_name' />
                    //        <attribute name='createdon' />
                    //        <attribute name='bsd_uomid' />
                    //        <attribute name='bsd_quantity' />
                    //        <attribute name='bsd_product' />
                    //        <order attribute='bsd_name' descending='false' />
                    //        <filter type='and'>
                    //          <condition attribute='bsd_requestdelivery' operator='eq' uitype='bsd_requestdelivery' value='{0}' />
                    //          <condition attribute='bsd_warehouse' operator='eq' uitype='bsd_warehouseentity' value='{1}' />
                    //        </filter>
                    //      </entity>
                    //    </fetch>", request.Id, ((EntityReference)distinct_item["bsd_warehouse"]).Id)));
                    //    foreach (var item in list_requestdeliveryproduct_sub.Entities)
                    //    {
                    //        Entity bsd_deliveryproductbill = new Entity("bsd_deliveryproductbill");
                    //        bsd_deliveryproductbill["bsd_deliverybill"] = new EntityReference("bsd_deliverybill", deliverybill_id);
                    //        bsd_deliveryproductbill["bsd_requestdelivery"] = new EntityReference("bsd_requestdelivery", request.Id);
                    //        bsd_deliveryproductbill["bsd_name"] = item["bsd_name"];
                    //        bsd_deliveryproductbill["bsd_product"] = item["bsd_product"];
                    //        bsd_deliveryproductbill["bsd_uomid"] = item["bsd_uomid"];
                    //        bsd_deliveryproductbill["bsd_quantity"] = item["bsd_quantity"];
                    //        bsd_deliveryproductbill["bsd_netquantity"] = item["bsd_quantity"];
                    //        myService.service.Create(bsd_deliveryproductbill);
                    //    }

                    //}
                    //#region update lại request là đã tạo rồi
                    //Entity new_request = new Entity(request.LogicalName, request.Id);
                    //new_request["bsd_createddeliverybill"] = true;
                    //myService.Update(new_request);
                    //#endregion
                    EntityCollection list_requestdeliveryproduct = myService.RetrieveOneCondition("bsd_requestdeliveryproduct", "bsd_requestdelivery", request.Id);
                    // distinct theo warehouse
                    var list_distinct = list_requestdeliveryproduct.Entities.GroupBy(i => ((EntityReference)i["bsd_warehouse"]).Id, (key, group) => group.First()).ToList();
                    foreach (var distinct_item in list_distinct)
                    {
                        // danh sach request product. nhung line nao co warehouse o tren.
                        EntityCollection list_requestdeliveryproduct_sub     = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                          <entity name='bsd_requestdeliveryproduct'>
                            <attribute name='bsd_requestdeliveryproductid' />
                            <attribute name='bsd_name' />
                            <attribute name='bsd_uomid' />
                            <attribute name='bsd_quantity' />
                            <attribute name='bsd_netquantity' />
                            <attribute name='bsd_product' />
                            <filter type='and'>
                              <condition attribute='bsd_requestdelivery' operator='eq' uitype='bsd_requestdelivery' value='{0}' />
                              <condition attribute='bsd_warehouse' operator='eq' uitype='bsd_warehouseentity' value='{1}' />
                            </filter>
                          </entity>
                        </fetch>", request.Id, ((EntityReference)distinct_item["bsd_warehouse"]).Id)));
                        bool             flag_check_requestdelivery_quantity = false; // kiem tra so luong tao phieu xuat kho con khong.
                        foreach (var item in list_requestdeliveryproduct_sub.Entities)
                        {
                            decimal request_quantity    = (decimal)item["bsd_quantity"];
                            decimal request_netquantity = (decimal)item["bsd_netquantity"];
                            decimal bill_quantity       = request_quantity - request_netquantity;
                            if (bill_quantity > 0)
                            {
                                flag_check_requestdelivery_quantity = true;
                            }
                        }

                        if (flag_check_requestdelivery_quantity == true) // du so luong moi lam tiep.
                        {
                            Entity deliverybill = new Entity("bsd_deliverybill");

                            EntityReference deliveryplan_ref = (EntityReference)request["bsd_deliveryplan"];
                            Entity          deliveryplan     = myService.service.Retrieve(deliveryplan_ref.LogicalName, deliveryplan_ref.Id, new ColumnSet(true));
                            deliverybill["bsd_name"]                 = "Phiếu xuất kho - " + request["bsd_name"];
                            deliverybill["bsd_requestdelivery"]      = new EntityReference(request.LogicalName, request.Id);
                            deliverybill["bsd_deliveryplan"]         = request["bsd_deliveryplan"];
                            deliverybill["bsd_order"]                = request["bsd_order"];
                            deliverybill["bsd_customer"]             = request["bsd_account"];
                            deliverybill["bsd_shiptoaddress"]        = request["bsd_shiptoaddress"];
                            deliverybill["bsd_requestedshipdate"]    = deliveryplan["bsd_requestedshipdate"];
                            deliverybill["bsd_requestedreceiptdate"] = deliveryplan["bsd_requestedreceiptdate"];
                            deliverybill["bsd_warehouse"]            = distinct_item["bsd_warehouse"];
                            Guid deliverybill_id = myService.service.Create(deliverybill);

                            foreach (var item in list_requestdeliveryproduct_sub.Entities)
                            {
                                EntityReference product_ref   = (EntityReference)item["bsd_product"];
                                EntityReference warehouse_ref = (EntityReference)distinct_item["bsd_warehouse"];

                                decimal request_quantity    = (decimal)item["bsd_quantity"];
                                decimal request_netquantity = (decimal)item["bsd_netquantity"];
                                decimal bill_quantity       = request_quantity - request_netquantity;
                                if (bill_quantity > 0) // kiểm tra
                                {
                                    // Kiểm tra yêu cầu giao hàng này có product bill này kho này sản phẩm này chưa. có rồi thì cộng dồn chưa có thì tạo mới. !
                                    EntityCollection list = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                  <entity name='bsd_deliveryproductbill'>
                                    <attribute name='bsd_deliveryproductbillid' />
                                    <attribute name='bsd_netquantity' />
                                    <filter type='and'>
                                      <condition attribute='bsd_product' operator='eq' uitype='product' value='{0}' />
                                      <condition attribute='bsd_requestdelivery' operator='eq' value='{1}' />
                                    </filter>
                                    <link-entity name='bsd_deliverybill' from='bsd_deliverybillid' to='bsd_deliverybill' alias='ab'>
                                      <filter type='and'>
                                        <condition attribute='bsd_createddeliverynote' operator='eq' value='0' />
                                        <condition attribute='bsd_warehouse' operator='eq' uitype='bsd_warehouseentity' value='{2}' />
                                      </filter>
                                    </link-entity>
                                  </entity>
                                </fetch>", product_ref.Id, request.Id, warehouse_ref.Id)));
                                    if (list.Entities.Any())
                                    {
                                        Entity  productbill     = list.Entities.First();
                                        decimal old_netquantity = (decimal)productbill["bsd_netquantity"];
                                        Entity  new_productbill = new Entity(productbill.LogicalName, productbill.Id);
                                        new_productbill["bsd_netquantity"] = old_netquantity + bill_quantity;
                                        myService.service.Update(new_productbill);
                                    }
                                    else
                                    {
                                        Entity bsd_deliveryproductbill = new Entity("bsd_deliveryproductbill");
                                        bsd_deliveryproductbill["bsd_deliverybill"]    = new EntityReference("bsd_deliverybill", deliverybill_id);
                                        bsd_deliveryproductbill["bsd_requestdelivery"] = new EntityReference("bsd_requestdelivery", request.Id);
                                        bsd_deliveryproductbill["bsd_name"]            = item["bsd_name"];
                                        bsd_deliveryproductbill["bsd_product"]         = product_ref;
                                        bsd_deliveryproductbill["bsd_uomid"]           = item["bsd_uomid"];
                                        bsd_deliveryproductbill["bsd_quantity"]        = bill_quantity;
                                        bsd_deliveryproductbill["bsd_netquantity"]     = bill_quantity;
                                        myService.service.Create(bsd_deliveryproductbill);
                                    }


                                    // kiểm tra cái phiếu xuất kho này có sản phẩm không, không có thì xóa,. !
                                    EntityCollection list_productbill = myService.service.RetrieveMultiple(
                                        new FetchExpression(
                                            string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' aggregate='true'>
                                  <entity name='bsd_deliveryproductbill' >
                                    <attribute name='bsd_deliveryproductbillid' alias='count_line' aggregate='count' />
                                    <filter type='and'>
                                      <condition attribute='bsd_deliverybill' operator='eq' uitype='bsd_deliverybill' value='{0}' />
                                    </filter>
                                  </entity>
                                </fetch>", deliverybill_id)));
                                    if (list_productbill.Entities.Any())
                                    {
                                        var   c     = list_productbill.Entities.First();
                                        Int32 count = (Int32)((AliasedValue)c["count_line"]).Value;
                                        if (count > 0)
                                        {
                                            #region cập nhật số lượng đã xuất trên request delivery product.
                                            Entity new_requestdeliveryproduct = new Entity(item.LogicalName, item.Id);
                                            new_requestdeliveryproduct["bsd_netquantity"] = request_quantity;
                                            myService.service.Update(new_requestdeliveryproduct);
                                            #endregion
                                        }
                                        else
                                        {
                                            myService.service.Delete("bsd_deliverybill", deliverybill_id);
                                        }
                                    }
                                }
                            }
                            #region update lại request là đã tạo rồi
                            Entity new_request = new Entity(request.LogicalName, request.Id);
                            new_request["bsd_createddeliverybill"] = true;
                            myService.Update(new_request);
                            #endregion
                        }
                    }
                }
            }
            #endregion

            #region bsd_Action_DeleteDeliveryBill
            else if (myService.context.MessageName == "bsd_Action_DeleteDeliveryBill")
            {
                EntityReference target = myService.getTargetEntityReference();
                myService.StartService();
                EntityCollection list_deliverybill = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                  <entity name='bsd_deliverybill'>
                    <attribute name='bsd_deliverybillid' />
                    <attribute name='bsd_name' />
                    <link-entity name='bsd_requestdelivery' from='bsd_requestdeliveryid' to='bsd_requestdelivery' alias='ac'>
                      <filter type='and'>
                        <condition attribute='bsd_requestdeliveryid' operator='eq' uitype='bsd_requestdelivery' value='{0}' />
                        <condition attribute='bsd_createddeliverynote' operator='eq' value='0' />
                        <condition attribute='bsd_createddeliverybill' operator='eq' value='1' />
                      </filter>
                    </link-entity>
                  </entity>
                </fetch>", target.Id)));
                // Lấy danh phiếu xuất kho từ yêu cầu giao hàng (đẫ xuất kho, chưa tạo phiếu giao hàng).
                if (list_deliverybill.Entities.Any())
                {
                    foreach (var item in list_deliverybill.Entities)
                    {
                        myService.service.Delete(item.LogicalName, item.Id);
                    }
                    Entity new_request = new Entity(target.LogicalName, target.Id);
                    new_request["bsd_createddeliverybill"] = false;
                    myService.Update(new_request);
                }
                else
                {
                    // ngược lại mới kiểm tra xem bị gì. !
                    Entity request = myService.service.Retrieve(target.LogicalName, target.Id, new ColumnSet("bsd_createddeliverybill", "bsd_createddeliverynote"));
                    if ((bool)request["bsd_createddeliverybill"] == false)
                    {
                        throw new Exception("Chưa tạo phiếu xuất kho ");
                    }
                    else if ((bool)request["bsd_createddeliverynote"] == true)
                    {
                        throw new Exception("Đã tạo phiếu giao hàng");
                    }
                }
            }
            #endregion

            #region Delete
            else if (myService.context.MessageName == "Delete")
            {
                EntityReference target = myService.getTargetEntityReference();
                myService.StartService();
                Entity deliverybill = myService.service.Retrieve(target.LogicalName, target.Id, new ColumnSet("bsd_createddeliverynote", "bsd_requestdelivery"));
                if (deliverybill.HasValue("bsd_createddeliverynote") && (bool)deliverybill["bsd_createddeliverynote"] == true)
                {
                    throw new Exception("Delivery Note has been created. Cannot delete Goods Issue Note. !");
                }

                #region Kiểm tra nếu xóa hết bill thì cập nhật là chưa tạo
                EntityReference  requestdelivery_ref = (EntityReference)deliverybill["bsd_requestdelivery"];
                EntityCollection list_deliverybill   = myService.RetrieveOneCondition("bsd_deliverybill", "bsd_requestdelivery", requestdelivery_ref.Id);
                if (list_deliverybill.Entities.Count == 1)
                {
                    Entity new_requestdelivery = new Entity(requestdelivery_ref.LogicalName, requestdelivery_ref.Id);
                    new_requestdelivery["bsd_createddeliverybill"] = false;
                    myService.service.Update(new_requestdelivery);
                }
                #endregion
            }
            #endregion
        }
        public void Execute(IServiceProvider serviceProvider)
        {
            myService = new MyService(serviceProvider);
            if (myService.context.Depth > 2)
            {
                return;
            }

            if (myService.context.MessageName == "Update")
            {
                myService.StartService();
                Entity target = myService.getTarget();
                if (target.HasValue("bsd_netquantity"))
                {
                    Entity preimage = myService.context.PreEntityImages["PreImage"];
                    GoodsIssueNote_Manager goodsIssueNote_Manager = new GoodsIssueNote_Manager(myService.service);

                    #region Lấy delivery bill dettail (target) + lấy warehouse ở delivery bill.
                    Entity deliverybilldetail = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                      <entity name='bsd_deliveryproductbill'>
                        <attribute name='bsd_deliveryproductbillid' />
                        <attribute name='bsd_requestdelivery' />
                        <attribute name='bsd_product' />
                        <filter type='and'>
                          <condition attribute='bsd_deliveryproductbillid' operator='eq' uitype='bsd_deliveryproductbill' value='{0}' />
                        </filter>
                        <link-entity name='bsd_deliverybill' from='bsd_deliverybillid' to='bsd_deliverybill' alias='ad'>
                          <attribute name='bsd_warehouse' />
                          <attribute name='bsd_deliveryplan' />
                        </link-entity>
                      </entity>
                    </fetch>", target.Id)))?.Entities?.First();

                    EntityReference warehouse_ref       = (EntityReference)((AliasedValue)deliverybilldetail["ad.bsd_warehouse"]).Value;
                    EntityReference requestdelivery_ref = (EntityReference)deliverybilldetail["bsd_requestdelivery"];
                    EntityReference product_ref         = (EntityReference)deliverybilldetail["bsd_product"];
                    #endregion

                    #region Lấy request delivery product để cập nhật.
                    Entity requestdeliveryproduct = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                      <entity name='bsd_requestdeliveryproduct'>
                        <attribute name='bsd_requestdeliveryproductid' />
                        <attribute name='bsd_netquantity' />
                        <attribute name='bsd_quantity' />
                        <attribute name='bsd_requestdelivery' />
                        <filter type='and'>
                          <condition attribute='bsd_warehouse' operator='eq' uitype='bsd_warehouseentity' value='{0}' />
                          <condition attribute='bsd_product' operator='eq' uitype='product' value='{1}' />
                          <condition attribute='bsd_requestdelivery' operator='eq' uitype='bsd_requestdelivery' value='{2}' />
                        </filter>
                      </entity>
                    </fetch>", warehouse_ref.Id, product_ref.Id, requestdelivery_ref.Id)))?.Entities?.First();
                    if (requestdeliveryproduct == null)
                    {
                        throw new Exception("requestdeliveryproduct null");
                    }

                    EntityReference request_ref = (EntityReference)requestdeliveryproduct["bsd_requestdelivery"];

                    decimal requestdeliveryproduct_netquantity = (decimal)requestdeliveryproduct["bsd_netquantity"];
                    decimal request_quantity           = (decimal)requestdeliveryproduct["bsd_quantity"];
                    decimal old_netquantity            = (decimal)preimage["bsd_netquantity"];
                    decimal new_quantity               = (decimal)target["bsd_netquantity"];
                    Entity  new_requestdeliveryproduct = new Entity(requestdeliveryproduct.LogicalName, requestdeliveryproduct.Id);
                    new_requestdeliveryproduct["bsd_netquantity"]       = requestdeliveryproduct_netquantity - old_netquantity + new_quantity;
                    new_requestdeliveryproduct["bsd_remainingquantity"] = request_quantity - (requestdeliveryproduct_netquantity - old_netquantity + new_quantity);
                    myService.service.Update(new_requestdeliveryproduct);
                    #endregion

                    #region UpdateDeliveryScheduleProduct
                    EntityReference deliverySchedule_ref = (EntityReference)((AliasedValue)deliverybilldetail["ad.bsd_deliveryplan"]).Value;
                    Entity          request = myService.service.Retrieve(request_ref.LogicalName, request_ref.Id, new ColumnSet(true));
                    goodsIssueNote_Manager.UpdateDeliveryScheduleProduct(request, deliverySchedule_ref.Id, product_ref.Id, old_netquantity, new_quantity);
                    #endregion
                }
            }
            else if (myService.context.MessageName == "Delete")
            {
                myService.StartService();
                EntityReference target = myService.getTargetEntityReference();

                GoodsIssueNote_Manager goodsIssueNote_Manager = new GoodsIssueNote_Manager(myService.service);

                #region Lấy delivery bill dettail (target) + lấy warehouse ở delivery bill.
                Entity          deliverybilldetail  = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                      <entity name='bsd_deliveryproductbill'>
                        <attribute name='bsd_deliveryproductbillid' />
                        <attribute name='bsd_requestdelivery' />
                        <attribute name='bsd_product' />
                        <attribute name='bsd_netquantity' />
                        <filter type='and'>
                          <condition attribute='bsd_deliveryproductbillid' operator='eq' uitype='bsd_deliveryproductbill' value='{0}' />
                        </filter>
                        <link-entity name='bsd_deliverybill' from='bsd_deliverybillid' to='bsd_deliverybill' alias='ad'>
                          <attribute name='bsd_warehouse' />
                          <attribute name='bsd_deliveryplan' />
                        </link-entity>
                      </entity>
                    </fetch>", target.Id)))?.Entities?.First();
                EntityReference warehouse_ref       = (EntityReference)((AliasedValue)deliverybilldetail["ad.bsd_warehouse"]).Value;
                EntityReference requestdelivery_ref = (EntityReference)deliverybilldetail["bsd_requestdelivery"];
                EntityReference product_ref         = (EntityReference)deliverybilldetail["bsd_product"];

                #endregion

                #region Lấy request delivery product để cập nhật.
                Entity requestdeliveryproduct = myService.service.RetrieveMultiple(new FetchExpression(string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                      <entity name='bsd_requestdeliveryproduct'>
                        <attribute name='bsd_requestdeliveryproductid' />
                        <attribute name='bsd_netquantity' />
                        <attribute name='bsd_quantity' />
                        <attribute name='bsd_requestdelivery' />
                        <filter type='and'>
                          <condition attribute='bsd_warehouse' operator='eq' uitype='bsd_warehouseentity' value='{0}' />
                          <condition attribute='bsd_product' operator='eq' uitype='product' value='{1}' />
                          <condition attribute='bsd_requestdelivery' operator='eq' uitype='bsd_requestdelivery' value='{2}' />
                        </filter>
                      </entity>
                    </fetch>", warehouse_ref.Id, product_ref.Id, requestdelivery_ref.Id)))?.Entities?.First();

                EntityReference request_ref = (EntityReference)requestdeliveryproduct["bsd_requestdelivery"];

                decimal requestdeliveryproduct_netquantity = (decimal)requestdeliveryproduct["bsd_netquantity"];
                decimal delete_quantity            = (decimal)deliverybilldetail["bsd_netquantity"];
                Entity  new_requestdeliveryproduct = new Entity(requestdeliveryproduct.LogicalName, requestdeliveryproduct.Id);
                decimal request_quantity           = (decimal)requestdeliveryproduct["bsd_quantity"];
                decimal net_quantity = requestdeliveryproduct_netquantity - delete_quantity;
                new_requestdeliveryproduct["bsd_netquantity"]       = net_quantity;
                new_requestdeliveryproduct["bsd_remainingquantity"] = request_quantity - net_quantity;
                myService.service.Update(new_requestdeliveryproduct);
                #endregion

                #region UpdateDeliveryScheduleProduct
                EntityReference deliverySchedule_ref = (EntityReference)((AliasedValue)deliverybilldetail["ad.bsd_deliveryplan"]).Value;
                Entity          request = myService.service.Retrieve(request_ref.LogicalName, request_ref.Id, new ColumnSet(true));
                goodsIssueNote_Manager.UpdateDeliveryScheduleProduct(request, deliverySchedule_ref.Id, product_ref.Id, delete_quantity, 0);
                #endregion
            }
        }