Thursday, April 23, 2015

Create a new return record for each unique value of invoice ID within the claim detail lines


Client needs to create a return(s) from warranty claims that are processed by the external dealers.  Claims will be entered via the dealer in the portal and could have multiple lines of detail for multiple parts that will need to be automatically added to a return(s) when the claim has been approved.  Returns will be created as a CRM Quote with a Quote type of “Return”. 

Plugin Trigger
·        Record col_claiminitiation
·        Fire plugin when the claim status is changed to “Approved”.  Field name is statuscode and the option value is “181400004”.

Plugin logic
Once the claim has been approved, loop through the associated line items (col_ claimdetail) to add each claim detail item to the related return.  (Quote)

Step 1:
Create a new return record for each unique value of col_invoiceid within the claim detail lines.  Claim detail records where col_invoiceid are null should also create a return.  Only claim detail records where col_approved is equal to true should be added to the return.

Step 2:
A line items to the return based on the field mapping provided at the bottom of this document.  Only claim detail records where col_approved is equal to true should be added to the return.

Step 3: 
Sum the amount stored in col_approvedlaboramount by col_invoiceid create a single line item on the return for dealer labor.  Only labor amounts on the claim detail records where col_approved is equal to true should be added to the return.

If the labor amount is > 0 then create a new line item according to the table below, but use the following replacement values.

Source Record
Source Field
Target Record
Target Field
Static Value
ProductID associated with productnumber “4211002”
Quotedetail
productid
Static Value
1
Quotedetail
ispriceoverridden
Static Value
“EACH” D30CEE58-B8D6-E311-88F0-005056884483
Quotedetail
uomid
Static Value
1
Quotedetail
quantity
Col_claimdetail
Sum(col_approvedlaboramount) grouped by invoice
Quotedetail
priceperunit
Col_claimdetail
Sum(col_approvedlaboramount) grouped by invoice
Quotedetail
extendedamount




Field Mapping

Source Record
Source Field
Target Record
Target Field
Col_claimInitiation
Col_dealer
Quote(Purchasing Dealer)
Customerid
Col_claimInitiation
Col_name + Last 3 digits of Invoice #
Quote
QuoteNumber
Static Value
“Dealer” list
Quote
Pricelist
Static Value
181400002
Quote
Col_QuoteType
Col_claiminitiation
Col_name
Quote
Col_ponumber
Col_claiminitiaition
Col_name
Quote
Name
col_claiminitiation
col_boatid
Quote
Col_boatid
Static Value
USD”
Quote
TransactionCurrencyid
Col_claimdetail
Col_invoicedpartid
QuoteDetail
productid
Static Value
1
QuoteDetail
ispriceoverridden
Static Value
“EACH”
QuoteDetail
uomid
col_claimdetail
Col_quantity
QuoteDetail
quantity
Col_claimdetail
ExtendCostAmt
QuoteDetail
priceperunit
Col_claimdetail
ExtendCostAmt
QuoteDetail
extendedamount


Refer to example Below Example

Claim Number: C012115-0002
Claim Date: 05-03-2015
Customer: Test Dealer

Item Number
Item Description Invoice Qty Amount Labour Amt
006047.1 Freight Reimbursement, Warranty Claim 1 $75.00
6395209 Cable, iPod Extension w/SD, UBS, Aux, '14 1 $73.14
005022 Labor Reimbursement, Warranty Claim 1 $300.00
3541601 Propeller, 14" x 16" x 1-1/8", 4 Blade, Promo - OJ INV-01163-G2H8P9 1 $362.16 75
3962059 Bluetooth, Model Year 2015, Malibu Bluetooth Backup INV-01162-J6F1Y8 1 $86.29 112.5
4211006 Pump, Bilge, Automatic, Whale 650 GPH, w/Delphi WeatherPack, '14 INV-01162-J6F1Y8 1 $124.68 150
Total Claim $1,021.27 337.5
The claim above would generate 3 unique returns based on the fact that 3 of the items are related to 2 separate invoices and the other 3 are not related to any invoice.
Return Number: C012115-0002-01 (Claim Number plus unique 2 digit number)
Return Date 03/05/15
Invoice # INV00101 (Based on Invoice INV-01163-G2H8P9)
Customer:  Test Dealer
Item Description Quantity U of M Unit Price Extended Price
3541601 Propeller, 14" x 16" x 1-1/8", 4 Blade, Promo - OJ 1 Each $362.16 $362.16
05022 Labor Reimbursement, Warranty Claim 1 EACH $75.00 $75.00
Return Total $225.00
Return Number: C012115-0002-02 (Claim Number plus unique 2 digit number)
Return Date 03/05/15
Invoice # INV00101 (Based on Invoice INV-01162-J6F1Y8)
Customer: Test Dealer
Item Description Quantity U of M Unit Price Extended Price
3962059 Bluetooth, Model Year 2015, Malibu Bluetooth Backup 1 Each $86.29 $86.29
4211006 Pump, Bilge, Automatic, Whale 650 GPH, w/Delphi WeatherPack, '14 1 Each $124.68 $124.68
005022 Labor Reimbursement, Warranty Claim 1 Each $262.50 $262.50
Return Total $210.97
Return Number: C012115-0002-03 (Claim Number plus unique 2 digit number)
Return Date 03/05/15
Invoice #
Customer: Test Dealer
Item Description Quantity U of M Unit Price Extended Price
006047.1 Freight Reimbursement, Warranty Claim 1 Each $75.00 $75.00
6395209 Cable, iPod Extension w/SD, UBS, Aux, '14 1 Each $73.14 $73.14
005022 Labor Reimbursement, Warranty Claim 1 Each $300.00 $300.00
Return Total $448.14




#region Reference
using System;
using System.ServiceModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
using System.Data;
#endregion

namespace MalibuReturnPlugins
{
    public class ReturnClaim : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            StringBuilder sb = new StringBuilder("starting; ");


            if (context.Depth == 1 && string.Equals(context.MessageName, "Update", StringComparison.OrdinalIgnoreCase))
            {
                #region Variable

                Guid ClaimID = Guid.Empty;
                Guid Dealer = Guid.Empty;
                string ClaimName = string.Empty;
                Guid BoatID = Guid.Empty;
                Guid QuoteID = Guid.Empty;
                Guid QuoteDetailID = Guid.Empty;
                Guid InvoiceID = Guid.Empty;
                string Quantity = string.Empty;
                Guid Customerid = Guid.Empty;
                string Ordernumber = string.Empty;
                Guid Pricelevel = Guid.Empty;
                string quoteType = "181400002";
                Guid currencyID = Guid.Empty;
                decimal ApprLaboutAmount = 0;
                decimal ApprAmt = 0;
                bool _ispriceoverridden = true;
                Guid uomid = Guid.Empty;
                decimal _quantity = 1;
                Guid _labourProductID = Guid.Empty;

                #endregion

                try
                {
                    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                    {
                        Entity entity = (Entity)context.InputParameters["Target"];
                        ClaimID = entity.Id;
                        if (entity.LogicalName != "col_claiminitiation") return;

                        try
                        {
                            // Price list fetchxml for Reurn 
                            string queryPricelist = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                      <entity name='pricelevel'>
                                        <attribute name='name' />                                        
                                        <attribute name='pricelevelid' />
                                        <order attribute='name' descending='false' />
                                        <filter type='and'>
                                          <condition attribute='name' operator='eq' value='Dealer' />
                                        </filter>
                                      </entity>
                                    </fetch>";

                            queryPricelist = string.Format(queryPricelist);
                            EntityCollection FetchPricelistResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryPricelist));

                            if (FetchPricelistResult.Entities.Count > 0)
                            {
                                foreach (Entity Pricelistent in FetchPricelistResult.Entities)
                                {
                                    if (Pricelistent.Attributes.Contains("pricelevelid"))
                                    {
                                        Pricelevel = Pricelistent.GetAttributeValue<Guid>("pricelevelid");
                                    }
                                }
                            }

                            // Currency Fetch XML for Reurn 
                            string querycurrency = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                          <entity name='transactioncurrency'>
                                            <attribute name='transactioncurrencyid' />
                                            <attribute name='currencyname' />
                                            <attribute name='isocurrencycode' />   
                                            <order attribute='currencyname' descending='false' />
                                            <filter type='and'>
                                              <condition attribute='isocurrencycode' operator='eq' value='USD' />
                                            </filter>
                                          </entity>
                                        </fetch>";

                            querycurrency = string.Format(querycurrency);
                            EntityCollection FetchcurrencyResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(querycurrency));

                            if (FetchcurrencyResult.Entities.Count > 0)
                            {
                                foreach (Entity Currencyent in FetchcurrencyResult.Entities)
                                {
                                    if (Currencyent.Attributes.Contains("transactioncurrencyid"))
                                    {
                                        currencyID = Currencyent.GetAttributeValue<Guid>("transactioncurrencyid");
                                    }
                                }
                            }

                            // Product ID Fetch XML for Return Detail Labour line item
                            string queryLabourProduct = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                              <entity name='product'>
                                                <attribute name='name' />
                                                <attribute name='productnumber' />                                               
                                                <attribute name='productid' />
                                                <order attribute='productnumber' descending='false' />
                                                <filter type='and'>
                                                  <condition attribute='productnumber' operator='eq' value='005022' />
                                                </filter>
                                              </entity>
                                            </fetch>";

                            queryLabourProduct = string.Format(queryLabourProduct);
                            EntityCollection FetchLabourProductResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryLabourProduct));

                            if (FetchLabourProductResult.Entities.Count > 0)
                            {
                                foreach (Entity LabourProductent in FetchLabourProductResult.Entities)
                                {
                                    if (LabourProductent.Attributes.Contains("productid"))
                                    {
                                        _labourProductID = LabourProductent.GetAttributeValue<Guid>("productid");
                                    }
                                }
                            }



                            // Claim FetchXML
                            string query = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                  <entity name='col_claiminitiation'>
                                    <attribute name='col_claiminitiationid' />
                                    <attribute name='col_name' />
                                    <attribute name='col_dealer' />
                                    <attribute name='col_boat' />                                   
                                    <filter type='and'>
                                      <condition attribute='col_claiminitiationid' operator='eq'  value='{0}' />
                                      <condition attribute='statuscode' operator='eq' value='181400004' />
                                    </filter>
                                  </entity>
                                </fetch>";

                            query = string.Format(query, ClaimID);
                            EntityCollection FetchClamResults = (EntityCollection)service.RetrieveMultiple(new FetchExpression(query));

                            if (FetchClamResults.Entities.Count > 0)
                            {
                                foreach (Entity ent in FetchClamResults.Entities)
                                {
                                    if (ent.Attributes.Contains("col_dealer") && ent.GetAttributeValue<EntityReference>("col_dealer") != null)
                                    {
                                        Dealer = ent.GetAttributeValue<EntityReference>("col_dealer").Id;
                                    }
                                    if (ent.Attributes.Contains("col_boat") && ent.GetAttributeValue<EntityReference>("col_boat") != null)
                                    {
                                        BoatID = ent.GetAttributeValue<EntityReference>("col_boat").Id;
                                    }
                                    if (ent.Attributes.Contains("col_name") && ent.GetAttributeValue<String>("col_name") != null)
                                    {
                                        ClaimName = ent.GetAttributeValue<String>("col_name").ToString();
                                    }
                                }

                                // Claim Detail FetchXML
                                string queryFetchClamDetail = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
                                        <entity name='col_claimdetail'> 
                                           <attribute name='col_approvedlaboramount' /> 
                                      <attribute name='col_invoicenumberid' />                              
                                      <attribute name='col_claimdetailid' /> 
                                           <attribute name='col_quantity' />
                                           <attribute name='col_noninvoicedpartid' />
                                           <attribute name='col_approvedamount' />  
                                           <attribute name='col_unitcost' />
                                           <attribute name='col_extendedcost' />  
                                           <attribute name='col_approvedhours' />
                                           <attribute name='col_subletlaborrate' />  
                                   <filter type='and'>
                                          <condition attribute='col_claimid' operator='eq' value='{0}' />
                                          <condition attribute='col_approved' operator='eq' value='1' />
                                        </filter>
                                        </entity> 
                                    </fetch>";

                                queryFetchClamDetail = string.Format(queryFetchClamDetail, ClaimID);
                                EntityCollection FetchClamDetailResults = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryFetchClamDetail));

                                List<ReturnQuoteClaim> tmpReturns = new List<ReturnQuoteClaim>();

                                sb.AppendFormat("Claim Detail Count : " + FetchClamDetailResults.Entities.Count());

                                if (FetchClamDetailResults.Entities.Count > 0)
                                {
                                    bool emptyInvoice = false;

                                    foreach (Entity enty in FetchClamDetailResults.Entities)
                                    {
                                        if (enty.Attributes.Contains("col_invoicenumberid") && enty.GetAttributeValue<EntityReference>("col_invoicenumberid") != null)
                                        {
                                            InvoiceID = enty.GetAttributeValue<EntityReference>("col_invoicenumberid").Id;
                                            bool status = false;
                                            foreach (ReturnQuoteClaim tmpReturn in tmpReturns)
                                            {
                                                if (tmpReturn.InvID.Equals(InvoiceID))
                                                {
                                                    Decimal ApprLaboutAmt = 0;
                                                    status = true;
                                                    if (enty.Attributes.Contains("col_approvedlaboramount"))
                                                    {
                                                        ApprLaboutAmt = ((Money)enty.Attributes["col_approvedlaboramount"]).Value;
                                                        tmpReturn.sumOfInvoice = ApprLaboutAmt + tmpReturn.sumOfInvoice;
                                                    }
                                                }
                                            }
                                            if (!status)
                                            {
                                                ReturnQuoteClaim tmpRet = new ReturnQuoteClaim();
                                                tmpRet.InvID = InvoiceID;
                                                // need to check
                                                string coninvoiceid = InvoiceID.ToString().Substring(InvoiceID.ToString().Length - 4, 3).ToString();

                                                tmpRet.CustomerID = Dealer != null ? Dealer : Guid.Empty;
                                                tmpRet.quoteNumber = ClaimName + coninvoiceid;
                                                tmpRet.PricelistID = Pricelevel;
                                                tmpRet.ponumber = ClaimName != string.Empty ? ClaimName.ToString() : string.Empty;
                                                tmpRet.quotetype = quoteType.ToString();
                                                tmpRet.Name = ClaimName != string.Empty ? ClaimName.ToString() : string.Empty;
                                                tmpRet.BoatID = BoatID != null ? BoatID : Guid.Empty;
                                                tmpRet.CurrencyID = currencyID;
                                                if (enty.Attributes.Contains("col_approvedlaboramount"))
                                                {
                                                    ApprLaboutAmount = ((Money)enty.Attributes["col_approvedlaboramount"]).Value;
                                                    tmpRet.sumOfInvoice = ApprLaboutAmount + tmpRet.sumOfInvoice;
                                                }
                                                if (enty.Attributes.Contains("col_extendedcost"))
                                                {
                                                    ApprAmt = ((Money)enty.Attributes["col_extendedcost"]).Value;
                                                    tmpRet.ApprovedAmt = ApprAmt + tmpRet.ApprovedAmt;
                                                }
                                                if (enty.Attributes.Contains("col_noninvoicedpartid"))
                                                {
                                                    tmpRet.invoicedpartid = enty.GetAttributeValue<EntityReference>("col_noninvoicedpartid").Id;
                                                }
                                                else
                                                {
                                                    tmpRet.invoicedpartid = Guid.Empty;
                                                }

                                                tmpReturns.Add(tmpRet);

                                            }
                                        }
                                        else
                                        {
                                            if (!emptyInvoice)
                                            {
                                                ReturnQuoteClaim tmpRet = new ReturnQuoteClaim();
                                                tmpRet.InvID = Guid.Empty;
                                                InvoiceID = Guid.Empty;
                                                string coninvoiceid = InvoiceID.ToString().Substring(InvoiceID.ToString().Length - 4, 3).ToString();

                                                tmpRet.CustomerID = Dealer != null ? Dealer : Guid.Empty;
                                                tmpRet.quoteNumber = ClaimName + coninvoiceid;
                                                tmpRet.PricelistID = Pricelevel;
                                                tmpRet.ponumber = ClaimName != string.Empty ? ClaimName.ToString() : string.Empty;
                                                tmpRet.quotetype = quoteType.ToString();
                                                tmpRet.Name = ClaimName != string.Empty ? ClaimName.ToString() : string.Empty;
                                                tmpRet.BoatID = BoatID != null ? BoatID : Guid.Empty;
                                                tmpRet.CurrencyID = currencyID;

                                                if (enty.Attributes.Contains("col_approvedlaboramount"))
                                                {
                                                    ApprLaboutAmount = ((Money)enty.Attributes["col_approvedlaboramount"]).Value;
                                                    tmpRet.sumOfInvoice = ApprLaboutAmount + tmpRet.sumOfInvoice;
                                                }
                                                if (enty.Attributes.Contains("col_extendedcost"))
                                                {
                                                    ApprAmt = ((Money)enty.Attributes["col_extendedcost"]).Value;
                                                    tmpRet.ApprovedAmt = ApprAmt + tmpRet.ApprovedAmt;
                                                }
                                                if (enty.Attributes.Contains("col_noninvoicedpartid"))
                                                {
                                                    tmpRet.invoicedpartid = enty.GetAttributeValue<EntityReference>("col_noninvoicedpartid").Id;
                                                }
                                                else
                                                {
                                                    tmpRet.invoicedpartid = Guid.Empty;
                                                }

                                                tmpReturns.Add(tmpRet);
                                                emptyInvoice = true;
                                            }
                                        }
                                    }
                                    foreach (ReturnQuoteClaim newReturn in tmpReturns)
                                    {
                                        Guid ReturnInvID = newReturn.InvID;

                                        Guid returnQuoteID = CreateReturnRecord(newReturn.CustomerID, newReturn.quoteNumber,
                                               newReturn.PricelistID, newReturn.ponumber.ToString(), newReturn.quotetype.ToString(),
                                               newReturn.Name.ToString(), newReturn.BoatID, newReturn.CurrencyID,
                                             ref service);

                                        sb.AppendFormat("New Return ID : " + returnQuoteID.ToString());

                                        if (returnQuoteID != Guid.Empty && ReturnInvID != Guid.Empty)
                                        {
                                            newReturn.reuturnQuoteID = returnQuoteID;

                                            string queryFetchClamInvoiceartDetail = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
                                                        <entity name='col_claimdetail'> 
                                                           <attribute name='col_approvedlaboramount' /> 
                                                           <attribute name='col_quantity' />
                                                           <attribute name='col_noninvoicedpartid' />
                                                           <attribute name='col_approvedamount' />  
                                                           <attribute name='col_unitcost' />
                                                           <attribute name='col_extendedcost' />  
                                                           <attribute name='col_approvedhours' />
                                                           <attribute name='col_subletlaborrate' />  
                                                   <filter type='and'>
                                                          <condition attribute='col_invoicenumberid' operator='eq' value='{0}' />                                                         
                                                        </filter>
                                                        </entity> 
                                                    </fetch>";


                                            queryFetchClamInvoiceartDetail = string.Format(queryFetchClamInvoiceartDetail, ReturnInvID);
                                            EntityCollection FetchClamInoivePartDetailResults = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryFetchClamInvoiceartDetail));
                                            Decimal InvAprrAmt = 0;

                                            foreach (Entity invoicepart in FetchClamInoivePartDetailResults.Entities)
                                            {
                                                Guid NonInvPartID = Guid.Empty;
                                                Decimal QuoteDetailQuantity = 0;
                                                Decimal ApproveLaboutAmt = 0;
                                                Decimal InvExtendCostAmt = 0;

                                                if (invoicepart.Attributes.Contains("col_quantity"))
                                                {
                                                    QuoteDetailQuantity = Convert.ToDecimal(invoicepart.GetAttributeValue<Decimal>("col_quantity").ToString());
                                                }
                                                if (invoicepart.Attributes.Contains("col_noninvoicedpartid") && invoicepart.GetAttributeValue<EntityReference>("col_noninvoicedpartid") != null)
                                                {
                                                    NonInvPartID = invoicepart.GetAttributeValue<EntityReference>("col_noninvoicedpartid").Id; // Product ID
                                                }                                               
                                                if (invoicepart.Attributes.Contains("col_approvedlaboramount"))
                                                {
                                                    ApproveLaboutAmt = ((Money)invoicepart.Attributes["col_approvedlaboramount"]).Value;
                                                    InvAprrAmt = InvAprrAmt + ApproveLaboutAmt;
                                                }
                                                if (invoicepart.Attributes.Contains("col_extendedcost"))
                                                {
                                                    InvExtendCostAmt = ((Money)invoicepart.Attributes["col_extendedcost"]).Value;                                                   
                                                }

                                                // Uom fetchxml for labour return detail
                                                string queryUOM = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                                              <entity name='col_claimdetail'>
                                                                <attribute name='col_claimdetailid' />
                                                                <attribute name='col_name' />
                                                                <attribute name='createdon' />
                                                                <order attribute='col_name' descending='false' />
                                                                <filter type='and'>
                                                                  <condition attribute='col_claimid' operator='eq' value='{0}' />
                                                                </filter>
                                                                <link-entity name='product' from='productid' to='col_noninvoicedpartid' alias='ae'>
                                                                  <attribute name='defaultuomid' alias='UnitID'/>
                                                                  <filter type='and'>
                                                                    <condition attribute='productid' operator='eq' value='{1}' />
                                                                  </filter>
                                                                </link-entity>
                                                              </entity>
                                                            </fetch>";

                                                queryUOM = string.Format(queryUOM, ClaimID, NonInvPartID);
                                                EntityCollection FetchUOMResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryUOM));

                                                if (FetchUOMResult.Entities.Count > 0)
                                                {
                                                    foreach (Entity UOMent in FetchUOMResult.Entities)
                                                    {
                                                        if (UOMent.Attributes.Contains("UnitID"))
                                                        {
                                                            uomid = ((EntityReference)UOMent.GetAttributeValue<AliasedValue>("UnitID").Value).Id;
                                                        }
                                                    }
                                                }

                                                sb.AppendFormat("Unit of Measure ID for Invoices : " + uomid.ToString());

                                                Guid ReturnClaimDetailID = ReturnClaimDetail(returnQuoteID, NonInvPartID,
                                                    _ispriceoverridden, uomid, QuoteDetailQuantity, InvExtendCostAmt, InvExtendCostAmt, ref service);

                                                sb.AppendFormat("New Return Detail ID : " + ReturnClaimDetailID.ToString());
                                            }

                                            if (InvAprrAmt > 0)
                                            {
                                                // Labor Reimbursement, Warranty Claim Fetch XML 
                                                string querylabour = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                                                          <entity name='product'>
                                                                            <attribute name='name' />
                                                                            <attribute name='productnumber' />
                                                                            <attribute name='defaultuomid' />
                                                                            <attribute name='statecode' />
                                                                            <attribute name='productid' />
                                                                            <order attribute='productnumber' descending='false' />
                                                                            <filter type='and'>
                                                                              <condition attribute='productnumber' operator='eq' value='005022' />
                                                                            </filter>
                                                                          </entity>
                                                                        </fetch>";

                                                querylabour = string.Format(querylabour);
                                                EntityCollection FetchlabourResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(querylabour));
                                                Guid LaboutProductID = Guid.Empty;
                                                Guid LabourUOMID = Guid.Empty;

                                                if (FetchlabourResult.Entities.Count > 0)
                                                {
                                                    foreach (Entity Labourent in FetchlabourResult.Entities)
                                                    {
                                                        if (Labourent.Attributes.Contains("productid"))
                                                        {                                                           
                                                            LaboutProductID = Labourent.GetAttributeValue<EntityReference>("productid").Id;
                                                        }
                                                        if (Labourent.Attributes.Contains("defaultuomid"))
                                                        {
                                                            LabourUOMID = Labourent.GetAttributeValue<EntityReference>("defaultuomid").Id;
                                                        }
                                                    }
                                                }

                                                Guid ReturnClaimDetailID = ReturnClaimDetail(returnQuoteID, LaboutProductID,
                                                    _ispriceoverridden, LabourUOMID, _quantity, InvAprrAmt, InvAprrAmt, ref service);

                                                sb.AppendFormat("New Return Detail ID : " + ReturnClaimDetailID.ToString());
                                            }

                                        }
                                        else
                                        {
                                            string queryFetchNullClamInvoiceDetail = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
                                                        <entity name='col_claimdetail'> 
                                                           <attribute name='col_approvedlaboramount' /> 
                                                           <attribute name='col_quantity' />
                                                           <attribute name='col_noninvoicedpartid' />
                                                           <attribute name='col_approvedamount' />  
                                                           <attribute name='col_unitcost' />
                                                           <attribute name='col_extendedcost' />  
                                                           <attribute name='col_approvedhours' />
                                                           <attribute name='col_subletlaborrate' />  
                                                   <filter type='and'>
                                                          <condition attribute='col_claimid' operator='eq' value='{0}' />  
                                                          <condition attribute='col_invoicenumberid' operator='null' />                                                       
                                                        </filter>
                                                        </entity> 
                                                    </fetch>";


                                            queryFetchNullClamInvoiceDetail = string.Format(queryFetchNullClamInvoiceDetail, ClaimID);
                                            EntityCollection FetchClamInoivePartDetailResults = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryFetchNullClamInvoiceDetail));

                                            foreach (Entity nullinvoicepart in FetchClamInoivePartDetailResults.Entities)
                                            {
                                                Guid NonInvPartID = Guid.Empty;
                                                Decimal QuoteDetailQuantity = 0;
                                                Decimal Extendedcost = 0;                                                
                                                if (nullinvoicepart.Attributes.Contains("col_quantity"))
                                                {
                                                    QuoteDetailQuantity = Convert.ToDecimal(nullinvoicepart.GetAttributeValue<Decimal>("col_quantity").ToString());
                                                }

                                                if (nullinvoicepart.Attributes.Contains("col_noninvoicedpartid") && nullinvoicepart.GetAttributeValue<EntityReference>("col_noninvoicedpartid") != null)
                                                {
                                                    NonInvPartID = nullinvoicepart.GetAttributeValue<EntityReference>("col_noninvoicedpartid").Id; // Product ID
                                                }
                                                if (nullinvoicepart.Attributes.Contains("col_extendedcost"))
                                                {
                                                    Extendedcost = ((Money)nullinvoicepart.Attributes["col_extendedcost"]).Value;
                                                }

                                                // Uom fetchxml for labour return detail
                                                string queryUOM = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                                              <entity name='col_claimdetail'>
                                                                <attribute name='col_claimdetailid' />
                                                                <attribute name='col_name' />
                                                                <attribute name='createdon' />
                                                                <order attribute='col_name' descending='false' />
                                                                <filter type='and'>
                                                                  <condition attribute='col_claimid' operator='eq' value='{0}' />
                                                                </filter>
                                                                <link-entity name='product' from='productid' to='col_noninvoicedpartid' alias='ae'>
                                                                  <attribute name='defaultuomid' alias='UnitID' />
                                                                  <filter type='and'>
                                                                    <condition attribute='productid' operator='eq' value='{1}' />
                                                                  </filter>
                                                                </link-entity>
                                                              </entity>
                                                            </fetch>";

                                                queryUOM = string.Format(queryUOM, ClaimID, NonInvPartID);
                                                EntityCollection FetchUOMResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(queryUOM));

                                                if (FetchUOMResult.Entities.Count > 0)
                                                {
                                                    foreach (Entity UOMent in FetchUOMResult.Entities)
                                                    {
                                                        if (UOMent.Attributes.Contains("UnitID"))
                                                        {
                                                            uomid = uomid = ((EntityReference)UOMent.GetAttributeValue<AliasedValue>("UnitID").Value).Id;
                                                        }
                                                    }
                                                }

                                                sb.AppendFormat("Unit of Measure ID for Non Invoices : " + uomid.ToString());
                                                // Guid ReturnClaimDetailID = ReturnClaimDetail(returnQuoteID, NonInvPartID, _ispriceoverridden, uomid, _quantity, newReturn.sumOfInvoice, newReturn.sumOfInvoice, ref service);

                                                Guid ReturnClaimDetailID = ReturnClaimDetail(returnQuoteID, NonInvPartID,
                                                    _ispriceoverridden, uomid, _quantity, Extendedcost, Extendedcost, ref service);
                                                sb.AppendFormat("New Return Detail ID : " + ReturnClaimDetailID.ToString());
                                            }
                                        }
                                    }
                                }
                            }

                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message.ToString() + "   " + sb.ToString());
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message.ToString());
                }
            }
        }


        /// <summary>
        /// Create New Return Record
        /// </summary>
        /// <param name="CustomerID">Static Value Guid CustomerID</param>
        /// <param name="quoteNumber">string quoteNumber</param>
        /// <param name="PricelistID">Static Guid PricelistID</param>
        /// <param name="ponumber">Guid ponumber</param>
        /// <param name="quotetype">Static Value quote Type</param>
        /// <param name="Name">Claim Name</param>
        /// <param name="BoatID">Guid Boat ID</param>
        /// <param name="CurrencyID">Static Value Currency ID</param>
        /// <param name="ServiceObj">IOrganizationService Object</param>
        /// <returns>new Return Guid</returns>
        public Guid CreateReturnRecord(
                                        Guid CustomerID,
                                        string quoteNumber,
                                        Guid PricelistID,
                                        string ponumber,
                                        string quotetype,
                                        string Name,
                                        Guid BoatID,
                                        Guid CurrencyID, ref IOrganizationService ServiceObj)
        {
            Guid ClamQuoteID = Guid.Empty;

            Entity ReturnObj = new Entity("quote");

            if (CustomerID != Guid.Empty)
            {
                ReturnObj.Attributes.Add("customerid", new EntityReference("account", CustomerID));
            }
            if (quoteNumber != string.Empty)
            {
                ReturnObj.Attributes.Add("quotenumber", quoteNumber);
            }
            if (PricelistID != Guid.Empty)
            {
                ReturnObj.Attributes.Add("pricelevelid", new EntityReference("pricelevel", PricelistID));
            }
            if (quotetype != string.Empty)
            {
                ReturnObj.Attributes.Add("col_quotetype", new OptionSetValue(181400002));
            }
            if (ponumber != string.Empty)
            {
                ReturnObj.Attributes.Add("col_ponumber", ponumber);
            }
            if (Name != string.Empty)
            {
                ReturnObj.Attributes.Add("name", Name);
            }
            if (BoatID != Guid.Empty)
            {
                ReturnObj.Attributes.Add("col_boatid", new EntityReference("col_boat", BoatID));
            }
            if (CurrencyID != Guid.Empty)
            {
                ReturnObj.Attributes.Add("transactioncurrencyid", new EntityReference("transactioncurrency", CurrencyID));
            }

            ClamQuoteID = ServiceObj.Create(ReturnObj);
            return ClamQuoteID;
        }

        /// <summary>
        /// Create retun detail & move the record to quote detail
        /// </summary>
        /// <param name="productid">Guid productid</param>
        /// <param name="ispriceoverridden">Boolean static value 1</param>
        /// <param name="Uomid"> guid uoimd</param>
        /// <param name="quantity">static value 1</param>
        /// <param name="priceperunit">priceperunit</param>
        /// <param name="extendedamt">extendedamt</param>
        /// <param name="col_noninvoicedpartid_ProductID"></param>
        /// <returns></returns>
        public Guid ReturnClaimDetail(
            Guid ReturnID,
            Guid productid,
            Boolean ispriceoverridden,
            Guid Uomid,
            decimal quantity,
            decimal priceperunit,
            decimal extendedamt,
            ref IOrganizationService ServiceObj
            )
        {

            Guid ReturnClaimDetail = Guid.Empty;
            Entity ReturnDetailObj = new Entity("quotedetail");

            if (ReturnID != Guid.Empty)
            {
                ReturnDetailObj.Attributes.Add("quoteid", new EntityReference("quote", ReturnID));
            }
            if (productid != Guid.Empty)
            {
                ReturnDetailObj.Attributes.Add("productid", new EntityReference("product", productid));
            }

            ReturnDetailObj.Attributes.Add("ispriceoverridden", ispriceoverridden);
            ReturnDetailObj.Attributes.Add("uomid", new EntityReference("uom", Uomid));
            ReturnDetailObj.Attributes.Add("quantity", quantity);
            ReturnDetailObj.Attributes.Add("priceperunit", priceperunit);
            ReturnDetailObj.Attributes.Add("extendedamount", extendedamt);

            ReturnClaimDetail = ServiceObj.Create(ReturnDetailObj);
            return ReturnClaimDetail;
        }


    }
    /// <summary>
    /// for each distinct Invoice ID for Claim Detail. create a return for each
    /// </summary>
    public class ReturnQuoteClaim
    {
        public Guid CustomerID;
        public string quoteNumber;
        public Guid PricelistID;
        public Guid BoatID;
        public Guid CurrencyID;
        public string Name;
        public string ponumber;
        public string quotetype;
        public Guid InvID;
        public Guid reuturnQuoteID;
        public Decimal sumOfInvoice = 0;
        public Decimal ApprovedAmt = 0;
        public Guid invoicedpartid;
        public ReturnQuoteClaim() { }
    }
}


















Friday, April 17, 2015

Browser Link in Visual Studio 2013

In this post, we will take a look at the new Browser Link feature in Visual Studio 2013.
We often need to build custom web portals which integrate with Microsoft Dynamics CRM 2011 that need to be tested in multiple browsers during development. It can be quite frustrating having to manually refresh each browser window when making small cosmetic changes to web pages. With Browser Link, you can easily refresh your web application in all browsers with one click!
To enable Browser Link, click on the arrow next to the browser link icon and selectEnable Browser Link.
 Browser Link in Visual Studio 2013
The screenshot below shows simple HTML code and what it looks like when it’s rendered in Internet Explorer.
 Browser Link in Visual Studio 2013
I have changed the text inside the <h1> tag to “Testing Browser Link – Browser Link”. Instead of refreshing the browser in Internet Explorer, I can click on the Browser Linkicon on the Visual Studio 2013 toolbar.
 Browser Link in Visual Studio 2013
The screenshot below shows Browser Link in action with our web application running in both IE and Chrome. Again, we can simply refresh both browsers with the click of one button.
 Browser Link in Visual Studio 2013
Browser Link can be extended to unleash additional functionality both from within Visual Studio and in the web browser itself. The Build Conference showcased a great feature where you can fill out a web form in one browser and automatically populate fields on the same form on another browser.
This feature will be extremely useful when testing your web applications. I will definitely be using it when building custom web portals for Microsoft Dynamics CRM.

Thanks
Rajeev

Import Organization Database Into Microsoft Dynamics CRM 2015

You may need multiple CRM databases for security purposes, or if you are moving your database from one environment/organization to the other. This article shows how to import an organization database into Microsoft Dynamics CRM 2015.
 
Step 1
 
Open Microsoft Dynamics CRM Deployment Manager. You will see the existing organizations as in the following:
 
 
Step 2
 
Right-click on Organizations and choose the Import Organization option.
 
 
Step 3
 
Choose the SQL Server and Organization database name. Please note that this database is the CRM database that is to be imported. You can use the backup and restore options of SQL Server to restore this database to your environment and then run this wizard.
 
 
Step 4
 
Choose the Display Name and the Unique Database Name and click Next.
 
 
Step 5
 
You can choose to Automatically Map Users or Select Custom Mapping Options.
 
 
Step 6
 
You will get a list of options to choose the method for mapping users.
 
 
Step 7
 
System Check is performed and if all checks are okay, you can import the data.
 
 
Step 8
 
If all goes well, you will get the following results. There may be some issues with the Reporting Services installation and user account. You can change the user account to be the Network account and re-run this wizard.
 
 
If Reporting Services Extensions is not installed you will get the following error. Install it and re-run the wizard.
 
 
Step 9
 
Once all the system checks are cleared, you will get the Ready to Import dialog with details. Once you are satisfied with this, click on Import.
 
 
Step 10
 
The data is imported.
 
 
If there are no issues in the user mapping, you should see a success message as in the following, else the log file has the detailed error message.
 

Wednesday, April 15, 2015

Retrieve AliasedValue form fetch xml


string fetchXML = string.Format(@"<fetch version='1.0' output-format='xml-platform' no-lock='true' mapping='logical'> <entity name='account'> <attribute name='name' /> <filter type='and'> <condition attribute='statuscode' operator='eq' value='1' /> <condition attribute='accountid' operator='eq' value='{0}' /> </filter> <link-entity name='contact' from='contactid' to='primarycontactid' alias='ab'> <attribute name='fullname' alias='as_fullname' /> <attribute name='firstname' alias='as_firstname' /> <attribute name='lastname' alias='as_lastname' /> </link-entity> </entity> </fetch>", accountId.ToString()); var fetchExp = new FetchExpression(fetchXML); EntityCollection accountEntity = orgService.RetrieveMultiple(fetchExp); if (accountEntity.Entities.Count > 0) { //Primary Contact Fullname AliasedValue avContactFullname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_fullname"); if (avContactFullname != null) contactFullName = avContactFullname.Value; //Primary Contact Firstname AliasedValue avContactFirstname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_firstname"); if (avContactFirstname != null) contactFirstName = avContactFirstname.Value; //Primary Contact Lastname AliasedValue avContactLastname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_lastname"); if (avContactLastname != null) contactLastName = avContactLastname.Value; }

Get files of last hour in Azure Data Factory

  Case I have a Data Factory pipeline that should run each hour and collect all new files added to the data lake since the last run. What is...