Any help would be appreciated.
I have some help for you, but it's probably not the help you are looking for.
My advice is this: stop thinking of your problem as a philosophical one. It has nothing at all to do with ontology or metaphysics-- it is a problem of applied computer programming. The fact that certain groups within CS have adopted the terminology of a philosophical tradition is unfortunate, because it leads to confusions of this type.
Objects in an object-oriented system are just containers for behaviors (methods) and system state (properties). They have very little to do with ontology. and reading Heidegger or Husserl isn't going to help.
Take your problem to StackOverflow, and describe the actual problem in detail-- not the abstractions, but the concrete problem you are trying to solve. I'm sure they will be able to help you out.
I tell you this as one who has both an academic background in philosophy and more than 20 years of professional experience in software development.
EDIT: As the questioner has complained that I have not properly engaged with the philosophical content of the question, I will attempt here to recast the question in a philosophical light, and answer in that form. I apologize in advance for the length of this.
Products, let's say consumer electronics, are represented by classes which describe different properties or groups of properties. Some classes can be same as categories, e.g. "smartphones".
Already, we are in a bit of trouble here. "Category" is a philosophical term, dating back to Aristotle, and "smartphone" is not a category in this sense. "Class" used in this manner is not; it is a software engineering term. Since we are speaking of groups of properties, let us propose "entity" as a philosophical replacement.
Now let's say we have "Samsung Galaxy S II" as one of the items under "smartphones" class. This item, although it exists in physical world, is still abstract to our users - they can't touch it, they don't own it.
This is a mistake. The fact that the item is outside of the reach of our users does not make it abstract. The Eiffel Tower is real, even though I cannot (at present) lay my hands on it.
It exists somewhere in a store or a warehouse. And it really doesn't matter that it exists at all unless it exists in user's posession.
Again, this is a mistake from a philosophical perspective. Whether or not an item exists matters. Whether or not a particular individual can touch it, by and large, doesn't.
So, "Samsung Galaxy S II" is a representation of real actual physical Galaxies II.
It is not clear what you are after here. Are you pointing out the commonplace notion that the words "Samsung Galaxy S II" represent an actual Samsung Galaxy S II?
And finally there's Jill, a user, and she owns a "Samsung Galaxy S II".
OK, now I'm confused. A minute ago we said that the phrase "Samsung Galaxy S II" was just a representation of an actual Samsung Galaxy S II. does she own a Samsung Galaxy S II, or a "Samsung Galaxy S II"?
I want to represent her Galaxy II as an object inheriting attributes of the class "Samsung Galaxy S II" and from another class, which has attributes that make this an actual thing that exists somewhere and may be in someone's possession.
This is purely a software engineering concept. We don't speak of object inheritance in this manner in the philosophical context. We can say that Jill's Samsung Galaxy S II partakes of the Platonic Ideal of a Samsung Galaxy S II, and thus has certain essential qualities that constitute its Samsung Galaxy S II-ness; and we can also stipulate that it has certain accidental qualities, such as a serial number, that are purely aleatory or contingent, and are thus time-dependent. Is that what you are after?
All attributes I can think of are these:
Geolocation (the thing has specific coordinates)
From a philosophical perspective, we would say "Location"-- but yes, every physical object exists at a particular location at a particular point in time.
Condition (in most cases, once the thing has been purchased, it's become used)
We can certainly stipulate such a quality, of "degree-of-usedness" which changes over time.
Posessor (although products in a warehouse or on Amazon.com also technically have an owner, this is not something we people have intuition about - to us they are still abstract products)
They are not abstract products, as we have seen; they are actual. We can definitely stipulate a "posessor", and talk about which person (or corporate entity) "possesses" the phone at any point in time.
I also considered the following attributes:
Existence - but that's incorrect as once manufactured, products exist somewhere
Most philosophers will tell you that existence is not a property, but there are large bodies of philosophical debate on this point. In any event, as you point out, it is not useful here as we are only dealing with phones that actually exist.
Related events - but even non-existing things can have related events
I can't even begin to fathom what this would mean. How can a non-existing thing partake of an event? And how are we to conceptualize an event as a quality?
Any help would be appreciated.
And here's the crux of the problem: we still don't know, from a philosophical perspective, what you are trying to do? I mean, it's clear from a software engineering perspective what you are after, but in philosophical terms, your project is not clear. Are you attempting to catalog all of the accidental and contingent properties that could possibly be applied to a Samsung Galaxy S II (or a "Samsung Galaxy S II")?
If so, I'd suggest you take a look at the famous description of Borges's Chinese Encyclopedia, and see if you can figure out the problem you face.
To summarize: your problem is a practical one, not a philosophical one. Ontology is not of any help to you.