locked
Retrieve the custom attributes using plugin RRS feed

  • Question

  • Hi,

    I am new to the MS CRM and am using MS CRM4.0. I have the following requirement.

    - I have a custom fields in my quote and order form.

    - I am developing a  Async - child pipeline plugin that will transfer the data from quote's custom attributes to order's custom attribute when a quote is tranformed to order.

    I am using the dynamic entity, but I am not been able to get the values of the custom attributes.

    This is urgent. Please help me.

    Here is my code .

     

    DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];

     

    if (entity.Name == EntityName.salesorder.ToString())

    {

     

    Guid idCommandes = (Guid)context.OutputParameters.Properties["Id"];

     

    Key myKey = new Key(idCommandes);

     

    CrmService service = CreateCrmService(context, true);

     

    ColumnSet colsetDevis = new ColumnSet();

     

    Microsoft.Crm.Sdk.Query.

    QueryExpression query = new Microsoft.Crm.Sdk.Query.QueryExpression("salesorder");

    query.EntityName =

    EntityName.salesorder.ToString();

    query.ColumnSet.AddColumn(

    "new_paymenttermscode");

    query.ColumnSet.AddColumn(

    "new_dlaidelivraison");

     

     

    RetrieveMultipleRequest requestAccount = new RetrieveMultipleRequest();

     

    requestAccount.Query = query;

    requestAccount.ReturnDynamicEntities =

    true;

     

    RetrieveMultipleResponse result = (RetrieveMultipleResponse)service.Execute(requestAccount);

     

    if (result.BusinessEntityCollection.BusinessEntities.Count > 0)

    {

     

    DynamicEntity myEntity = (DynamicEntity)result.BusinessEntityCollection.BusinessEntities[0];

     

    string strName = "";

     

    CrmNumber intNumber ;

     

     

    if (myEntity.Properties.Contains("new_paymenttermscode"))

    intNumber = ((

    CrmNumber)myEntity.Properties["new_paymenttermscode"]);

     

    if (myEntity.Properties.Contains("new_dlaidelivraison"))

    strName = myEntity.Properties[

    "new_dlaidelivraison"].ToString();

    }

     

     

     

    }

     

     

    Monday, February 14, 2011 2:34 PM

Answers

  • thanks pat, for your advise..I relanalysed my code and solved the issue. My logic was completely wrong. Here is my final code that does the task.

    public void Execute(IPluginExecutionContext context)

    {
    DynamicEntity entityCommandes = (DynamicEntity)context.InputParameters.Properties["Target"];

    if (entityCommandes.Name == EntityName.salesorder.ToString())

    {

    try

    {

    Guid idCommandes = (Guid)context.OutputParameters.Properties["Id"];

    CrmService service = CreateCrmService(context, true);

    //retrieve the salesorder record to get the quoteid

    salesorder commandes = (salesorder)service.Retrieve(EntityName.salesorder.ToString(), idCommandes, new AllColumns());

    //retrieve the quote record from the quoteid

    TargetRetrieveQuote TargetRetrieveDevis = new TargetRetrieveQuote();

    TargetRetrieveDevis.EntityId = commandes.quoteid.Value;

    RetrieveRequest RetrieveRequestDevis = new RetrieveRequest();

    RetrieveRequestDevis.ReturnDynamicEntities = true;

    RetrieveRequestDevis.Target = TargetRetrieveDevis;

    RetrieveRequestDevis.ColumnSet = new AllColumns();

    RetrieveResponse RetrieveResponseDevis = (RetrieveResponse)(service.Execute(RetrieveRequestDevis));

    DynamicEntity DynEntDevis = (DynamicEntity)(RetrieveResponseDevis.BusinessEntity);

    String strName = "";

    String strRefresh = "Test";

    Picklist Paymenttermscode = null;

    if (DynEntDevis.Properties.Contains("new_dlaidelivraison"))

    {

    strName = DynEntDevis.Properties["new_dlaidelivraison"].ToString();

    //DynEntDevis.Properties.Add(new StringProperty("new_dlaidelivraison", strName));

    }

    if (DynEntDevis.Properties.Contains("new_paymenttermscode"))

    {

    Paymenttermscode = (Picklist)DynEntDevis.Properties["new_paymenttermscode"];

    //DynEntDevis.Properties.Add(new StringProperty("new_dlaidelivraison", strName));

    }


    TargetRetrieveSalesOrder TargetRetrieveCommandes = new TargetRetrieveSalesOrder();

    TargetRetrieveCommandes.EntityId = idCommandes;

    RetrieveRequest RetrieveRequestCommandes = new RetrieveRequest();

    RetrieveRequestCommandes.ReturnDynamicEntities = true;

    RetrieveRequestCommandes.Target = TargetRetrieveCommandes;

    RetrieveRequestCommandes.ColumnSet = new AllColumns();

    RetrieveResponse RetrieveResponseCommandes = (RetrieveResponse)(service.Execute(RetrieveRequestCommandes));

    DynamicEntity DynEntCommandes = (DynamicEntity)(RetrieveResponseCommandes.BusinessEntity);

    if (DynEntCommandes.Properties.Contains("new_dlaidelivraison"))

    {

    strName = DynEntCommandes.Properties["new_dlaidelivraison"].ToString();

    }

    else

    {

    DynEntCommandes.Properties.Add(new StringProperty("new_dlaidelivraison", strName));

    }

    if (DynEntCommandes.Properties.Contains("new_refresh"))

    {

    strRefresh = DynEntCommandes.Properties["new_refresh"].ToString();

    }

    else

    {

    DynEntCommandes.Properties.Add(new StringProperty("new_refresh", strRefresh));

    }

    PicklistProperty plPaymentterms = new PicklistProperty();

    plPaymentterms.Name = "new_paymenttermscode";

    plPaymentterms.Value = new Picklist();

    plPaymentterms.Value.Value = Paymenttermscode.Value;

    DynEntCommandes.Properties.Add(plPaymentterms);

    //Update the salesorder entity

    service.Update(DynEntCommandes);

    DynamicEntity EntityCommandeProduit = null;

    QueryExpression queryCommandeProduit = new QueryExpression("salesorderdetail");

    queryCommandeProduit.EntityName = EntityName.salesorderdetail.ToString();

    queryCommandeProduit.ColumnSet = new AllColumns();

    ConditionExpression conditionCommandeProduit = new ConditionExpression();

    conditionCommandeProduit.AttributeName = "salesorderid";

    conditionCommandeProduit.Operator = ConditionOperator.Equal;

    conditionCommandeProduit.Values = new string[] { idCommandes.ToString() };

    FilterExpression filterCommandeProduit = new FilterExpression();

    filterCommandeProduit.Conditions.Add(conditionCommandeProduit);

    queryCommandeProduit.Criteria = filterCommandeProduit;

    RetrieveMultipleRequest requestCommandeProduit = new RetrieveMultipleRequest();

    requestCommandeProduit.Query = queryCommandeProduit;

    requestCommandeProduit.ReturnDynamicEntities = true;

    RetrieveMultipleResponse ResponseCommandeProduit = (RetrieveMultipleResponse)service.Execute(requestCommandeProduit);

    CrmService service1 = CreateCrmService(context, true);

    Key IdCommandeProduitNew = null;

    String ProductDescription = "";

    if (ResponseCommandeProduit.BusinessEntityCollection.BusinessEntities.Count > 0)

    {

    foreach (BusinessEntity be in ResponseCommandeProduit.BusinessEntityCollection.BusinessEntities)

    {

    EntityCommandeProduit = (DynamicEntity)be;

    if (EntityCommandeProduit.Properties.Contains("salesorderdetailid"))

    {

    IdCommandeProduitNew = (Key)EntityCommandeProduit.Properties["salesorderdetailid"];

    }

    if (EntityCommandeProduit.Properties.Contains("productdescription"))

    {

    ProductDescription = EntityCommandeProduit.Properties["productdescription"].ToString();

    }

    //DynamicEntity EntityDevisProduit = null;

    //Retrieve the values from the quotedetails

    QueryExpression queryDevisProduit = new QueryExpression("quotedetail");

    queryDevisProduit.EntityName = EntityName.quotedetail.ToString();

    queryDevisProduit.ColumnSet = new AllColumns();

    ConditionExpression conditionDevisProduit = new ConditionExpression();

    conditionDevisProduit.AttributeName = "productdescription";

    conditionDevisProduit.Operator = ConditionOperator.Equal;

    conditionDevisProduit.Values = new string[] { ProductDescription };

    ConditionExpression conditionDevisProduit1 = new ConditionExpression();

    conditionDevisProduit1.AttributeName = "quoteid";

    conditionDevisProduit1.Operator = ConditionOperator.Equal;

    conditionDevisProduit1.Values = new string[] { commandes.quoteid.Value.ToString() };

    FilterExpression filterDevisProduit = new FilterExpression();

    filterDevisProduit.FilterOperator = LogicalOperator.And;

    filterDevisProduit.Conditions.Add(conditionDevisProduit);

    filterDevisProduit.Conditions.Add(conditionDevisProduit1);

    queryDevisProduit.Criteria = filterDevisProduit;

    RetrieveMultipleRequest requestDevisProduit = new RetrieveMultipleRequest();

    requestDevisProduit.Query = queryDevisProduit;

    requestDevisProduit.ReturnDynamicEntities = true;

    RetrieveMultipleResponse responseDevisProduit = (RetrieveMultipleResponse)service.Execute(requestDevisProduit);

    String Titre = "";

    String Rfrencefournisseur = "";

    Picklist Priodicit = null;

    Picklist TauxTva = null;

    decimal contributionDEE = 0;

    if (responseDevisProduit.BusinessEntityCollection.BusinessEntities.Count > 0)

    {

    DynamicEntity EntityDevisProduit = (DynamicEntity)responseDevisProduit.BusinessEntityCollection.BusinessEntities[0];

    if (EntityDevisProduit.Properties.Contains("new_titre"))

    {

    Titre = EntityDevisProduit.Properties["new_titre"].ToString();

    }

    if (EntityDevisProduit.Properties.Contains("new_rfrencefournisseur"))

    {

    Rfrencefournisseur = EntityDevisProduit.Properties["new_rfrencefournisseur"].ToString();

    }

    if (EntityDevisProduit.Properties.Contains("new_priodicit"))

    {

    Priodicit = ((Picklist)EntityDevisProduit.Properties["new_priodicit"]);

    }

    if (EntityDevisProduit.Properties.Contains("new_taux_tva"))

    {

    TauxTva = ((Picklist)EntityDevisProduit.Properties["new_taux_tva"]);

    }

    if (EntityDevisProduit.Properties.Contains("new_contributiondeee"))

    {

    contributionDEE = ((CrmMoney)EntityDevisProduit.Properties["new_contributiondeee"]).Value;

    }


    TargetRetrieveSalesOrderDetail ret = new TargetRetrieveSalesOrderDetail();

    ret.EntityId = IdCommandeProduitNew.Value;

    RetrieveRequest req = new RetrieveRequest();

    req.ReturnDynamicEntities = true;

    req.Target = ret;

    string[] attributes = new string[] { "new_titre", "new_rfrencefournisseur", "new_priodicit", "new_taux_tva", "new_contributiondeee" };

    req.ColumnSet = new ColumnSet(attributes);

    RetrieveResponse resp = (RetrieveResponse)(service.Execute(req));

    DynamicEntity ent = (DynamicEntity)(resp.BusinessEntity);

    if (ent.Properties.Contains("new_titre"))

    {

    strName = ent.Properties["new_titre"].ToString();

    }

    else

    {

    ent.Properties.Add(new StringProperty("new_titre", Titre));

    }

    if (ent.Properties.Contains("new_rfrencefournisseur"))

    {

    strName = ent.Properties["new_rfrencefournisseur"].ToString();

    }

    else

    {

    ent.Properties.Add(new StringProperty("new_rfrencefournisseur", Rfrencefournisseur));

    }


    PicklistProperty plPriodicit = new PicklistProperty();

    plPriodicit.Name = "new_priodicit";

    plPriodicit.Value = new Picklist();

    plPriodicit.Value.Value = Priodicit.Value;

    ent.Properties.Add(plPriodicit);

    PicklistProperty plTauxTVA = new PicklistProperty();

    plTauxTVA.Name = "new_taux_tva";

    plTauxTVA.Value = new Picklist();

    plTauxTVA.Value.Value = TauxTva.Value;

    ent.Properties.Add(plTauxTVA);

    if (ent.Properties.Contains("new_contributiondeee"))

    {

    ((CrmMoney)ent.Properties["new_contributiondeee"]).Value = contributionDEE;

    }

    else

    {

    ent.Properties.Add(new CrmMoneyProperty("new_contributiondeee", new CrmMoney(contributionDEE)));

    }


    //Update the salesorder entity

    service.Update(ent);

    }

    }

    }

     


    }

    catch (SoapException ex)

    {

    throw new InvalidPluginExecutionException(ex.Detail.InnerText);

    }

     

    }

    }

     

    • Marked as answer by pradips Monday, February 21, 2011 2:33 PM
    Monday, February 21, 2011 2:32 PM

All replies

  • I'm not sure I'm following what you're trying to do, but it looks from the code like you're attempting to retrieve the values of the custom attributes assigned to the Sales Order entity instance; but given that you are trying to populate them, they don't yet have a value.

    In any event, you can achieve what you require without a plugin; you can map custom attributes from the Quote entity to Order entity via standard CRM customisation.

    1. Navigate to Settings / Customization / Customize Entities
    2. Open the 'Order' entity customisation dialog
    3. Navigate to 'N:1 Relationships'
    4. Opent the 'quote_orders' relationship dialog (Quote is primary, Order is related)
    5. Navigate to Mappings
    6. Click 'New'
    7. Choose the applicable Source and Target attributes
    8. Repeat for your 2nd attribute
    9. Publish changes

    If you really wish to go down the plugin route, your pseudo-code should look something like:

    1. Query 'Quote' entity with 'quoteid' assigned to this new 'Order'
    2. Retrieve custom attributes
    3. Create new Dynamic entity of type 'Order'
    4. Create and append Properties for new custom attributes
    5. Assign values retrieved in (2)
    6. Call crmService.Update()

    --pogo (pat)
    Monday, February 14, 2011 10:19 PM
  • thanks pat, for your advise..I relanalysed my code and solved the issue. My logic was completely wrong. Here is my final code that does the task.

    public void Execute(IPluginExecutionContext context)

    {
    DynamicEntity entityCommandes = (DynamicEntity)context.InputParameters.Properties["Target"];

    if (entityCommandes.Name == EntityName.salesorder.ToString())

    {

    try

    {

    Guid idCommandes = (Guid)context.OutputParameters.Properties["Id"];

    CrmService service = CreateCrmService(context, true);

    //retrieve the salesorder record to get the quoteid

    salesorder commandes = (salesorder)service.Retrieve(EntityName.salesorder.ToString(), idCommandes, new AllColumns());

    //retrieve the quote record from the quoteid

    TargetRetrieveQuote TargetRetrieveDevis = new TargetRetrieveQuote();

    TargetRetrieveDevis.EntityId = commandes.quoteid.Value;

    RetrieveRequest RetrieveRequestDevis = new RetrieveRequest();

    RetrieveRequestDevis.ReturnDynamicEntities = true;

    RetrieveRequestDevis.Target = TargetRetrieveDevis;

    RetrieveRequestDevis.ColumnSet = new AllColumns();

    RetrieveResponse RetrieveResponseDevis = (RetrieveResponse)(service.Execute(RetrieveRequestDevis));

    DynamicEntity DynEntDevis = (DynamicEntity)(RetrieveResponseDevis.BusinessEntity);

    String strName = "";

    String strRefresh = "Test";

    Picklist Paymenttermscode = null;

    if (DynEntDevis.Properties.Contains("new_dlaidelivraison"))

    {

    strName = DynEntDevis.Properties["new_dlaidelivraison"].ToString();

    //DynEntDevis.Properties.Add(new StringProperty("new_dlaidelivraison", strName));

    }

    if (DynEntDevis.Properties.Contains("new_paymenttermscode"))

    {

    Paymenttermscode = (Picklist)DynEntDevis.Properties["new_paymenttermscode"];

    //DynEntDevis.Properties.Add(new StringProperty("new_dlaidelivraison", strName));

    }


    TargetRetrieveSalesOrder TargetRetrieveCommandes = new TargetRetrieveSalesOrder();

    TargetRetrieveCommandes.EntityId = idCommandes;

    RetrieveRequest RetrieveRequestCommandes = new RetrieveRequest();

    RetrieveRequestCommandes.ReturnDynamicEntities = true;

    RetrieveRequestCommandes.Target = TargetRetrieveCommandes;

    RetrieveRequestCommandes.ColumnSet = new AllColumns();

    RetrieveResponse RetrieveResponseCommandes = (RetrieveResponse)(service.Execute(RetrieveRequestCommandes));

    DynamicEntity DynEntCommandes = (DynamicEntity)(RetrieveResponseCommandes.BusinessEntity);

    if (DynEntCommandes.Properties.Contains("new_dlaidelivraison"))

    {

    strName = DynEntCommandes.Properties["new_dlaidelivraison"].ToString();

    }

    else

    {

    DynEntCommandes.Properties.Add(new StringProperty("new_dlaidelivraison", strName));

    }

    if (DynEntCommandes.Properties.Contains("new_refresh"))

    {

    strRefresh = DynEntCommandes.Properties["new_refresh"].ToString();

    }

    else

    {

    DynEntCommandes.Properties.Add(new StringProperty("new_refresh", strRefresh));

    }

    PicklistProperty plPaymentterms = new PicklistProperty();

    plPaymentterms.Name = "new_paymenttermscode";

    plPaymentterms.Value = new Picklist();

    plPaymentterms.Value.Value = Paymenttermscode.Value;

    DynEntCommandes.Properties.Add(plPaymentterms);

    //Update the salesorder entity

    service.Update(DynEntCommandes);

    DynamicEntity EntityCommandeProduit = null;

    QueryExpression queryCommandeProduit = new QueryExpression("salesorderdetail");

    queryCommandeProduit.EntityName = EntityName.salesorderdetail.ToString();

    queryCommandeProduit.ColumnSet = new AllColumns();

    ConditionExpression conditionCommandeProduit = new ConditionExpression();

    conditionCommandeProduit.AttributeName = "salesorderid";

    conditionCommandeProduit.Operator = ConditionOperator.Equal;

    conditionCommandeProduit.Values = new string[] { idCommandes.ToString() };

    FilterExpression filterCommandeProduit = new FilterExpression();

    filterCommandeProduit.Conditions.Add(conditionCommandeProduit);

    queryCommandeProduit.Criteria = filterCommandeProduit;

    RetrieveMultipleRequest requestCommandeProduit = new RetrieveMultipleRequest();

    requestCommandeProduit.Query = queryCommandeProduit;

    requestCommandeProduit.ReturnDynamicEntities = true;

    RetrieveMultipleResponse ResponseCommandeProduit = (RetrieveMultipleResponse)service.Execute(requestCommandeProduit);

    CrmService service1 = CreateCrmService(context, true);

    Key IdCommandeProduitNew = null;

    String ProductDescription = "";

    if (ResponseCommandeProduit.BusinessEntityCollection.BusinessEntities.Count > 0)

    {

    foreach (BusinessEntity be in ResponseCommandeProduit.BusinessEntityCollection.BusinessEntities)

    {

    EntityCommandeProduit = (DynamicEntity)be;

    if (EntityCommandeProduit.Properties.Contains("salesorderdetailid"))

    {

    IdCommandeProduitNew = (Key)EntityCommandeProduit.Properties["salesorderdetailid"];

    }

    if (EntityCommandeProduit.Properties.Contains("productdescription"))

    {

    ProductDescription = EntityCommandeProduit.Properties["productdescription"].ToString();

    }

    //DynamicEntity EntityDevisProduit = null;

    //Retrieve the values from the quotedetails

    QueryExpression queryDevisProduit = new QueryExpression("quotedetail");

    queryDevisProduit.EntityName = EntityName.quotedetail.ToString();

    queryDevisProduit.ColumnSet = new AllColumns();

    ConditionExpression conditionDevisProduit = new ConditionExpression();

    conditionDevisProduit.AttributeName = "productdescription";

    conditionDevisProduit.Operator = ConditionOperator.Equal;

    conditionDevisProduit.Values = new string[] { ProductDescription };

    ConditionExpression conditionDevisProduit1 = new ConditionExpression();

    conditionDevisProduit1.AttributeName = "quoteid";

    conditionDevisProduit1.Operator = ConditionOperator.Equal;

    conditionDevisProduit1.Values = new string[] { commandes.quoteid.Value.ToString() };

    FilterExpression filterDevisProduit = new FilterExpression();

    filterDevisProduit.FilterOperator = LogicalOperator.And;

    filterDevisProduit.Conditions.Add(conditionDevisProduit);

    filterDevisProduit.Conditions.Add(conditionDevisProduit1);

    queryDevisProduit.Criteria = filterDevisProduit;

    RetrieveMultipleRequest requestDevisProduit = new RetrieveMultipleRequest();

    requestDevisProduit.Query = queryDevisProduit;

    requestDevisProduit.ReturnDynamicEntities = true;

    RetrieveMultipleResponse responseDevisProduit = (RetrieveMultipleResponse)service.Execute(requestDevisProduit);

    String Titre = "";

    String Rfrencefournisseur = "";

    Picklist Priodicit = null;

    Picklist TauxTva = null;

    decimal contributionDEE = 0;

    if (responseDevisProduit.BusinessEntityCollection.BusinessEntities.Count > 0)

    {

    DynamicEntity EntityDevisProduit = (DynamicEntity)responseDevisProduit.BusinessEntityCollection.BusinessEntities[0];

    if (EntityDevisProduit.Properties.Contains("new_titre"))

    {

    Titre = EntityDevisProduit.Properties["new_titre"].ToString();

    }

    if (EntityDevisProduit.Properties.Contains("new_rfrencefournisseur"))

    {

    Rfrencefournisseur = EntityDevisProduit.Properties["new_rfrencefournisseur"].ToString();

    }

    if (EntityDevisProduit.Properties.Contains("new_priodicit"))

    {

    Priodicit = ((Picklist)EntityDevisProduit.Properties["new_priodicit"]);

    }

    if (EntityDevisProduit.Properties.Contains("new_taux_tva"))

    {

    TauxTva = ((Picklist)EntityDevisProduit.Properties["new_taux_tva"]);

    }

    if (EntityDevisProduit.Properties.Contains("new_contributiondeee"))

    {

    contributionDEE = ((CrmMoney)EntityDevisProduit.Properties["new_contributiondeee"]).Value;

    }


    TargetRetrieveSalesOrderDetail ret = new TargetRetrieveSalesOrderDetail();

    ret.EntityId = IdCommandeProduitNew.Value;

    RetrieveRequest req = new RetrieveRequest();

    req.ReturnDynamicEntities = true;

    req.Target = ret;

    string[] attributes = new string[] { "new_titre", "new_rfrencefournisseur", "new_priodicit", "new_taux_tva", "new_contributiondeee" };

    req.ColumnSet = new ColumnSet(attributes);

    RetrieveResponse resp = (RetrieveResponse)(service.Execute(req));

    DynamicEntity ent = (DynamicEntity)(resp.BusinessEntity);

    if (ent.Properties.Contains("new_titre"))

    {

    strName = ent.Properties["new_titre"].ToString();

    }

    else

    {

    ent.Properties.Add(new StringProperty("new_titre", Titre));

    }

    if (ent.Properties.Contains("new_rfrencefournisseur"))

    {

    strName = ent.Properties["new_rfrencefournisseur"].ToString();

    }

    else

    {

    ent.Properties.Add(new StringProperty("new_rfrencefournisseur", Rfrencefournisseur));

    }


    PicklistProperty plPriodicit = new PicklistProperty();

    plPriodicit.Name = "new_priodicit";

    plPriodicit.Value = new Picklist();

    plPriodicit.Value.Value = Priodicit.Value;

    ent.Properties.Add(plPriodicit);

    PicklistProperty plTauxTVA = new PicklistProperty();

    plTauxTVA.Name = "new_taux_tva";

    plTauxTVA.Value = new Picklist();

    plTauxTVA.Value.Value = TauxTva.Value;

    ent.Properties.Add(plTauxTVA);

    if (ent.Properties.Contains("new_contributiondeee"))

    {

    ((CrmMoney)ent.Properties["new_contributiondeee"]).Value = contributionDEE;

    }

    else

    {

    ent.Properties.Add(new CrmMoneyProperty("new_contributiondeee", new CrmMoney(contributionDEE)));

    }


    //Update the salesorder entity

    service.Update(ent);

    }

    }

    }

     


    }

    catch (SoapException ex)

    {

    throw new InvalidPluginExecutionException(ex.Detail.InnerText);

    }

     

    }

    }

     

    • Marked as answer by pradips Monday, February 21, 2011 2:33 PM
    Monday, February 21, 2011 2:32 PM