Home Manual Reference Source

Getting Started

Important Notice

In the upcoming months, we are planning to change the IDs of, line items, metrics, fields, components, datatables, assemblies, component groups, and field groups. The IDs will switch to an alpha-numerical format. Project and Bid IDs are expected to remain as an integer and unchanged. All legacy bid data in our system will be updated. Breaking changes will be minimal, but are expected.

Concepts

A Project contains multiple Bids and summations of the bid results. Projects also have statuses (ie. open/closed/win/loss), and can have assigned users.

Bids are self-contained, self-assessing instances that have many types of bid entities. Line Items, Metrics, Fields, Assemblies, and Components are the most common. A bid sums up the line items' values.

A Line Item is a bid entity that represents a specific cost. The line item contain basic information like cost, markup, tax, and price. Line items compute their values based on the fields, metrics, and other bid entities it depends on.

Metrics are another type of bid entity the represent only numerical values. Metrics can be configured to depend on any other bid entity and apply a mathmatical formula.

Fields have multiple type of inputs: number, boolean, list, and text. They are the primary way to manipulate a bid, though other bid entities can have their values overridden.

Components help organize line items in a nested format. Components sum the nested line items' values. Changing a component value, for example component.cost = 5000.00, will proportionally apply the value to the nested line items.

An Assembly is a special type of bid entity, that represents a package of Fields, Line Items, and Metrics. Assemblies can be inserted into a bid, adding new bid entities.

Datatables are simple object stores, typically used for pricing tables and other structured data. Fields can reference datatables to generate a selectable list with associated values.

Code Examples

The following demonstrates how to set up an authorized context, loading a project, making changes, and saving.

Create a context with an authorization token

const config = { token: "Bearer auth_token" };
const pvbid = PVBid.createContext(config);

Important Note: the token string passed to the config.token property should include Bearer prefix.

Load a self assessing Project instance

let project = await pvbid.getProject(projectId);

Setup autosave

project.onDelay("changed", 1500, "requesterId", () => project.save());

Create a new project (w/bid)

const newProject = await pvbid.repositories.projects.create({ title: "New Project" }); // initializes the new project
const project = await pvbid.getProject(newProject.id); // gets the self assessing project instance

Create a new bid in a project

const newBid = await project.createBid("Bid Title");

Choose a bid to modify

Project instances contain a list of their child bids.

let bid = project.bids[bidId];

Load bids only when you need them You can defer loading all the bids in a project. This can save load time.

const project = await pvbid.getProject(projectId, { loadBidEntities: false });

// load a bid's data when you need it...
const bid = project.bids[bidId];
await bid.load();
// self assessing bid is ready to use!

Making changes to the bid's properties

Many properties will trigger the bid to self assess. For example setting the bid.cost property will fire its assessing event. bid.title will not assess, but will flag the bid as dirty.

bid.title = "New Title";
bid.cost = 155555.99;

Find a Field by its title and modify its value

The type of bid entities include: line_item, metric, field, component, assembly, datatable, component_group, and field_group.

let fields = bid.entities.searchByTitle("field", "Customer Name");
if(fields.length > 0){
    fields[0].value = "John Doe";
}

Find a Metric by its id and modify its value

let metric = bid.entities.metrics(metricId);
if (metric) metric.value = 123.45;

Get a datatable row key by a linked part

const rowKey = datatable.findRowByExternalPartId('sundat', 75); // 'x4gw' (datatable row key)
field.value = rowKey; // for a list type field connected to datatable

Manually assessing the bid

It is a good idea to assess (calculate) the bid after making changes to Metrics, Fields and Variables.

bid.assess();
// OR
bid.reassessAll(true); // forces a full reassessment of ALL entities within the bid

Manually save the bid, underlying bid entities, and parent project

Saving a project also saves the bids and underlying data. You can immediately save a project any time. However, if an underlying bid is still calculating its results, any futher changes after saving the project will not persist. When a project and bids are finished calculating, the project instance will pass an assessed event.

project.save();
// OR
project.once("assessed", () => project.save());

Log a summary of the bid

console.log(`
    ${bid.title}:
     + ${bid.cost} (cost)
     + ${bid.tax} (tax)
     + ${bid.markup} (markup)
    ------------------
     = ${bid.price} (price)
`);

Log a summary of the bid with a top-level component cost breakdown

Components are organized in ComponentGroups such as "Cost Codes" or "PVBid Standard". Looking at the top-level components in a group gives us a general overview of the cost breakdown within a bid.

// First, select a component group (ie. "Cost Codes" or "PVBid Standard")
const groups = bid.entities.componentGroups();
const group = Object.values(groups)
    .find(group => group.title === 'PVBid Standard');

// Next, get the top-level (summary) components for the group
const allComponents = bid.entities.components();
const componentsInGroup = Object.values(allComponents)
    .filter(component => component.componentGroupId === group.id);
const topLevelComponents = componentsInGroup
    .filter(component => !component.config.is_nested);

// Finally, display a cost summary
const componentCostSummary = topLevelComponents
    .map(c => `[$${c.cost}] ${c.title}`)
    .join('\n');
console.log(componentCostSummary);
console.log(`Total: ${bid.cost}`);

Getting Started

Important Notice

In the upcoming months, we are planning to change the IDs of, line items, metrics, fields, components, datatables, assemblies, component groups, and field groups. The IDs will switch to an alpha-numerical format. Project and Bid IDs are expected to remain as an integer and unchanged. All legacy bid data in our system will be updated. Breaking changes will be minimal, but are expected.

Concepts

A Project contains multiple Bids and summations of the bid results. Projects also have statuses (ie. open/closed/win/loss), and can have assigned users.

Bids are self-contained, self-assessing instances that have many types of bid entities. Line Items, Metrics, Fields, Assemblies, and Components are the most common. A bid sums up the line items' values.

A Line Item is a bid entity that represents a specific cost. The line item contain basic information like cost, markup, tax, and price. Line items compute their values based on the fields, metrics, and other bid entities it depends on.

Metrics are another type of bid entity the represent only numerical values. Metrics can be configured to depend on any other bid entity and apply a mathmatical formula.

Fields have multiple type of inputs: number, boolean, list, and text. They are the primary way to manipulate a bid, though other bid entities can have their values overridden.

Components help organize line items in a nested format. Components sum the nested line items' values. Changing a component value, for example component.cost = 5000.00, will proportionally apply the value to the nested line items.

An Assembly is a special type of bid entity, that represents a package of Fields, Line Items, and Metrics. Assemblies can be inserted into a bid, adding new bid entities.

Datatables are simple object stores, typically used for pricing tables and other structured data. Fields can reference datatables to generate a selectable list with associated values.

Code Examples

The following demonstrates how to set up an authorized context, loading a project, making changes, and saving.

Create a context with an authorization token

const config = { token: "Bearer auth_token" };
const pvbid = PVBid.createContext(config);

Important Note: the token string passed to the config.token property should include Bearer prefix.

Load a self assessing Project instance

let project = await pvbid.getProject(projectId);

Setup autosave

project.onDelay("changed", 1500, "requesterId", () => project.save());

Create a new project (w/bid)

const newProject = await pvbid.repositories.projects.create({ title: "New Project" }); // initializes the new project
const project = await pvbid.getProject(newProject.id); // gets the self assessing project instance

Create a new bid in a project

const newBid = await project.createBid("Bid Title");

Choose a bid to modify

Project instances contain a list of their child bids.

let bid = project.bids[bidId];

Load bids only when you need them You can defer loading all the bids in a project. This can save load time.

const project = await pvbid.getProject(projectId, { loadBidEntities: false });

// load a bid's data when you need it...
const bid = project.bids[bidId];
await bid.load();
// self assessing bid is ready to use!

Making changes to the bid's properties

Many properties will trigger the bid to self assess. For example setting the bid.cost property will fire its assessing event. bid.title will not assess, but will flag the bid as dirty.

bid.title = "New Title";
bid.cost = 155555.99;

Find a Field by its title and modify its value

The type of bid entities include: line_item, metric, field, component, assembly, datatable, component_group, and field_group.

let fields = bid.entities.searchByTitle("field", "Customer Name");
if(fields.length > 0){
    fields[0].value = "John Doe";
}

Find a Metric by its id and modify its value

let metric = bid.entities.metrics(metricId);
if (metric) metric.value = 123.45;

Get a datatable row key by a linked part

const rowKey = datatable.findRowByExternalPartId('sundat', 75); // 'x4gw' (datatable row key)
field.value = rowKey; // for a list type field connected to datatable

Manually assessing the bid

It is a good idea to assess (calculate) the bid after making changes to Metrics, Fields and Variables.

bid.assess();
// OR
bid.reassessAll(true); // forces a full reassessment of ALL entities within the bid

Manually save the bid, underlying bid entities, and parent project

Saving a project also saves the bids and underlying data. You can immediately save a project any time. However, if an underlying bid is still calculating its results, any futher changes after saving the project will not persist. When a project and bids are finished calculating, the project instance will pass an assessed event.

project.save();
// OR
project.once("assessed", () => project.save());

Log a summary of the bid

console.log(`
    ${bid.title}:
     + ${bid.cost} (cost)
     + ${bid.tax} (tax)
     + ${bid.markup} (markup)
    ------------------
     = ${bid.price} (price)
`);

Log a summary of the bid with a top-level component cost breakdown

Components are organized in ComponentGroups such as "Cost Codes" or "PVBid Standard". Looking at the top-level components in a group gives us a general overview of the cost breakdown within a bid.

// First, select a component group (ie. "Cost Codes" or "PVBid Standard")
const groups = bid.entities.componentGroups();
const group = Object.values(groups)
    .find(group => group.title === 'PVBid Standard');

// Next, get the top-level (summary) components for the group
const allComponents = bid.entities.components();
const componentsInGroup = Object.values(allComponents)
    .filter(component => component.componentGroupId === group.id);
const topLevelComponents = componentsInGroup
    .filter(component => !component.config.is_nested);

// Finally, display a cost summary
const componentCostSummary = topLevelComponents
    .map(c => `[$${c.cost}] ${c.title}`)
    .join('\n');
console.log(componentCostSummary);
console.log(`Total: ${bid.cost}`);

Repositories

Included in the SDK are multiple repositories to easily access data from the server. The repositories are initialized within the PVBidContext.

Available Repositories

These repositories are available as read-only (they should be modified through the pvbid application):

Code Examples

Retrieving an array of projects

let params = {
    order_by: "created_at",
    sort_order: "asc",
    per_page: 50
}

try {
    let projects = await pvbid.repositories.projects.get(params);
    console.log(projects) //prints an array of project data.
} catch(error) {
    //handle error;
}

Retrieving a line item definition

const lineItemDefId = 123;
try {
    const lineItemDef = await pvbid.repositories.lineItemDefs.findById(lineItemDefId);
} catch (e) {
    // handle error
}

Data Models

Project

{
    "id": 461,
    "account_id": 3,
    "title": "New Project",
    "cost": 1200,
    "taxable_cost": 0,
    "price": 1587,
    "tax_percent": 0,
    "markup_percent": 0,
    "margin_percent": 13.0435,
    "labor_cost": 0,
    "labor_hours": 0,
    "tax": 180,
    "markup": 207,
    "watts": 1350,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-27T01:10:54+00:00",
    "project_status_id": 28,
    "closed_at": null,
    "reconciled_at": null,
    "actual_hours": null,
    "actual_cost": null,
    "project_status": {
        "id": 28,
        "account_id": 3,
        "title": "Open",
        "core_status": "open",
        "is_reserved": true,
        "is_won": false,
        "order_index": 0,
        "created_at": "2017-09-26T22:46:28+00:00",
        "updated_at": "2017-09-26T22:46:28+00:00"
    },
    "bids": [
        {
            "id": 190,
            "project_id": 461
        }
    ]
}

Bid

{
    "id": 190,
    "account_id": 3,
    "user_id": 7,
    "title": "New Bid",
    "cost": 1200,
    "taxable_cost": 1200,
    "price": 1587,
    "tax_percent": 0,
    "markup_percent": 0,
    "margin_percent": 13.04,
    "tax": 180,
    "markup": 207,
    "variables": {
        "tax": {
            "type": "number",
            "title": "Tax Percent",
            "value": 15,
            "is_reserved": true
        },
        "wage": {
            "type": "number",
            "title": "Wage",
            "value": 35,
            "is_reserved": true
        },
        "burden": {
            "type": "number",
            "title": "Burden",
            "value": 5,
            "is_reserved": true
        },
        "labels": {
            "type": "list",
            "title": "Labels",
            "value": [
                {
                    "text": "Labor"
                },
                {
                    "text": "Materials"
                },
                {
                    "text": "Equipment"
                }
            ],
            "is_reserved": true
        },
        "markup": {
            "type": "number",
            "title": "Markup Percent",
            "value": 15,
            "is_reserved": true
        },
        "escalator": {
            "type": "number",
            "title": "Escalator",
            "value": 1,
            "is_reserved": true
        },
        "sub_margins": {
            "type": "input_list",
            "title": "Sub Margins",
            "value": [],
            "is_reserved": true
        },
        "markup_strategy": {
            "type": "boolean",
            "title": "Include Tax in Markup",
            "value": true,
            "is_reserved": true
        },
        "predictive_pricing": {
            "type": "boolean",
            "title": "Predictive Pricing Enabled",
            "value": false,
            "is_reserved": true
        },
        "use_computed": {
            "type": "boolean",
            "title": "Use computed values when available (Predictive Pricing)",
            "value": true,
            "is_reserved": true
        },

    },
    "system_version": 1,
    "definition_id": 0,
    "definition_version": 1,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-27T01:10:54+00:00",
    "integrations": [],
    "config": {
        "predicted_values": [],
        "undefined_prop_flags": [],
    },
    "is_locked": false,
    "is_shell": false,
    "reconciled_at": null,
    "actual_hours": null,
    "actual_cost": null,
    "bid_status_id": null,
    "closed_at": null,
    "project_id": 461,
    "watts": 1350,
    "labor_hours": 0,
    "labor_cost": 0,
    "margin_of_error": 0,
    "is_active": true,
    "user": {
        "id": 7,
        "name": "Test User",
        "license": "estimator",
        "roles": [
            {
                "id": 2,
                "name": "admin",
                "display_name": "Admin",
                "description": "User is allowed to manage account wide settings, bids, and definitions.",
                "created_at": "2017-09-12 18:13:37",
                "updated_at": "2017-09-12 18:13:37",
                "pivot": {
                    "user_id": 7,
                    "role_id": 2
                }
            },
            {
                "id": 4,
                "name": "estimator",
                "display_name": "Estimator",
                "description": "User is allowed to create and edit bids with advance estimating tools.",
                "created_at": "2017-09-12 18:13:37",
                "updated_at": "2017-09-12 18:13:37",
                "pivot": {
                    "user_id": 7,
                    "role_id": 4
                }
            }
        ]
    }
}

Line Item

{
    "id": 49661,
    "bid_id": 190,
    "account_id": 3,
    "title": "General Line Item",
    "is_active": true,
    "is_included": true,
    "config": {
        "comments": [],
        "order_index": 0,
        "assembly_id": null,
        "type": "dollar",
        "quantity": {
            "type": "value",
            "value": 0
        },
        "per_quantity": {
            "type": "value",
            "value": 0
        },
        "base": 0,
        "formula": "1",
        "is_predicted_cost": false,
        "is_predicted_labor_hours": false,
        "dependencies": {
            "tax": {
                "type": "bid_variable",
                "field": "tax",
                "bid_entity_id": "bid_variable"
            },
            "wage": {
                "type": "bid_variable",
                "field": "wage",
                "bid_entity_id": "bid_variable"
            },
            "burden": {
                "type": "bid_variable",
                "field": "burden",
                "bid_entity_id": "bid_variable"
            },
            "markup": {
                "type": "bid_variable",
                "field": "markup",
                "bid_entity_id": "bid_variable"
            },
            "scalar": [],
            "quantity": [],
            "escalator": {
                "type": "bid_variable",
                "field": "escalator",
                "bid_entity_id": "bid_variable"
            },
            "per_quantity": []
        },
        "rules": [
            {
                "type": "always_include",
                "title": "Always Include"
            }
        ],
        "undefined_prop_flags": [],
        "rule_inclusion": "any",
        "overrides": {},
        "short_code": "line:general_line_item",
        "description": ""
    },
    "cost": 0,
    "taxable_cost": 0,
    "price": 0,
    "tax": 0,
    "tax_percent": 15,
    "markup": 0,
    "markup_percent": 15,
    "quantity": 0,
    "per_quantity": 0,
    "multiplier": 1,
    "burden": 5,
    "wage": 35,
    "base": 0,
    "escalator": 1,
    "labor_hours": 0,
    "actual_cost": null,
    "acutal_hours": null,
    "definition_id": 1577,
    "definition_version": 2,
    "type": "line_item",
    "created_at": "2017-09-26 23:04:55",
    "updated_at": "2017-09-27 01:10:55",
    "prediction_model": {}
}

Field

{
    "id": 18262,
    "account_id": 3,
    "bid_id": 190,
    "title": "Module Type",
    "value": "mhzk",
    "is_active": true,
    "anchor": "module_type",
    "anchor_id": 2,
    "config": {
        "type": "list",
        "constraint": "Whole",
        "short_code": "field:module_type",
        "description": "",
        "dependencies": {
            "auto_a": {
                "type": null,
                "field": null
            },
            "datatable": {
                "type": "datatable",
                "field": null,
                "bid_entity_id": 7580
            }
        },
        "has_null_dependency": false,
        "is_auto_selected": false
    },
    "definition_id": 903,
    "definition_version": 2,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-27T01:10:55+00:00",
    "actual_value": null,
    "type": "field"
}

Metric

{
    "id": 36093,
    "account_id": 3,
    "bid_id": 190,
    "title": "Watts",
    "value": 1350,
    "config": {
        "formula": "a*b",
        "short_code": "metric:watts",
        "dependencies": {
            "a": {
                "type": "field",
                "field": "clpa",
                "bid_entity_id": 18262
            },
            "b": {
                "type": "field",
                "field": "value",
                "bid_entity_id": 18263
            }
        }
    },
    "definition_id": 840,
    "definition_version": 9,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-27T01:10:55+00:00",
    "has_null_dependency": false,
    "actual_value": null,
    "is_active": true,
    "type": "metric"
}

Datatable

 {
    "id": 7580,
    "account_id": 3,
    "bid_id": 190,
    "title": "Modules",
    "config": {
        "rows": [
            {
                "id": "mhzk",
                "values": ["Module 1", "400.00", "450"],
                "$$hashKey": "object:527"
            },
            {
                "id": "be6f",
                "values": ["Module 2", "300.00", "250"],
                "$$hashKey": "object:528"
            }
        ],
        "columns": [
            {
                "id": "at57",
                "type": "string",
                "title": "Module",
                "is_key": true,
                "$$hashKey": "object:521"
            },
            {
                "id": "tp7q",
                "type": "string",
                "title": "Unit Price",
                "is_key": false,
                "$$hashKey": "object:522"
            },
            {
                "id": "clpa",
                "type": "string",
                "title": "Watts",
                "is_key": false,
                "$$hashKey": "object:523"
            }
        ]
    },
    "definition_id": 266,
    "definition_version": 3,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-27T01:10:55+00:00",
    "is_active": 1,
    "type": "datatable"
}

Component

{
    "id": 62470,
    "bid_id": 190,
    "account_id": 3,
    "title": "Modules",
    "is_active": true,
    "config": {
        "is_nested": false,
        "components": [],
        "line_items": [49665],
        "component_group_id": 813,
        "parent_component_id": null,
        "comments": [],
        "description": null,
        "order_index": 0,
        "undefined_prop_flags": [],
        "predicted_values": [],
        "short_code": "component:modules"
    },
    "properties": {
        "base": {
            "value": 0,
            "config": {
                "data_type": "number"
            }
        },
        "wage": {
            "value": 35,
            "config": {
                "data_type": "number"
            }
        },
        "burden": {
            "value": 5,
            "config": {
                "data_type": "number"
            }
        },
        "base_avg": {
            "value": 0,
            "config": {
                "data_type": "number"
            }
        },
        "quantity": {
            "value": 3,
            "config": {
                "data_type": "number"
            }
        },
        "wage_avg": {
            "value": 0,
            "config": {
                "data_type": "number"
            }
        },
        "burden_avg": {
            "value": 0,
            "config": {
                "data_type": "number"
            }
        },
        "per_quantity": {
            "value": 400,
            "config": {
                "data_type": "number"
            }
        },
        "quantity_avg": {
            "value": 3,
            "config": {
                "data_type": "number"
            }
        },
        "included_count": {
            "value": 1,
            "config": {
                "data_type": "number"
            }
        },
        "per_quantity_avg": {
            "value": 400,
            "config": {
                "data_type": "number"
            }
        },
        "included_labor_count": {
            "value": 0,
            "config": {
                "data_type": "number"
            }
        }
    },
    "cost": 1200,
    "taxable_cost": 1200,
    "price": 1587,
    "tax_percent": 15,
    "markup_percent": 15,
    "tax": 180,
    "markup": 207,
    "labor_hours": 0,
    "labor_cost": 0,
    "non_labor_cost": 1200,
    "actual_hours": null,
    "actual_cost": null,
    "definition_id": 1726,
    "definition_version": 3,
    "type": "component",
    "created_at": "2017-09-26 23:04:55",
    "updated_at": "2017-09-27 01:10:55"
}

Component Group

 {
    "id": 813,
    "account_id": 3,
    "bid_id": 190,
    "title": "Cost Codes",
    "config": [],
    "definition_id": 43,
    "definition_version": 2,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-26T23:04:55+00:00",
    "is_active": 1,
    "type": "component_group"
}

Dynamic Group

{
    "bid_id": 556
    "burden": {"value": 8.3, "is_overridden": false, "has_null_dependency": false, "is_predicted": false}
    "components": []
    "cost": {"value": 1000, "is_overridden": true, "has_null_dependency": false, "is_predicted": false}
    "created_at": "2019-08-27 11:06:44"
    "definition_id": null
    "dynamic_groups": ["5d680c53b8e45d471141d1d2", "5d680c50b8e45d41af5d2ef2", "5d680c4cb8e45d41b030d844"]
    "id": "5d650ec4b8e45d03471a7d54"
    "included_count": 1
    "is_included": {"value": true, "is_overridden": false}
    "is_rootable": true
    "line_items": [1234, 55]
    "markup": {"value": 150, "is_overridden": false, "has_null_dependency": false, "is_predicted": false}
    "markup_percent": {"value": 15}
    "non_labor_cost": {"value": 1000, "is_overridden": true, "has_null_dependency": false, "is_predicted": false}
    "order_index": 0
    "price": {"value": 1210, "is_overridden": false, "has_null_dependency": false, "is_predicted": false}
    "tax": {"value": 60, "is_overridden": false, "has_null_dependency": false, "is_predicted": false}
    "tax_percent": {"value": 6}
    "taxable_cost": {"value": 1000, "is_overridden": true, "has_null_dependency": false, "is_predicted": false}
    "title": "Racking labor DG"
    "type": "dynamic_group"
    "updated_at": "2019-08-30 20:44:19"
    "wage": {"value": 22, "is_overridden": false, "has_null_dependency": false, "is_predicted": false}
}

Field Group

{
    "id": 4108,
    "account_id": 3,
    "bid_id": 190,
    "title": "General",
    "config": {
        "fields": [18262, 18263],
        "order_index": 0
    },
    "definition_id": 109,
    "definition_version": 4,
    "created_at": "2017-09-26T23:04:55+00:00",
    "updated_at": "2017-09-26T23:04:55+00:00",
    "is_active": 1,
    "type": "field_group"
}

CHANGELOG

1.3.49 (2024-02-09)

  • Patch minor issues during Bid Creation

1.3.48 (2024-02-08)

  • Add Industry Wide Predictions Sanity Checks

1.3.47 (2024-02-01)

  • Add Industry Wide Prediction Basics

1.3.46 (2024-01-29)

  • Add "predictedType" to cache values as either 'labor' or 'cost'

1.3.45 (2023-06-14)

  • Skip Null Line Items in Bid Validator.

1.3.44 (2023-06-12)

  • Skip Null Line Items in Components.

1.3.43 (2023-05-11)

  • Fix Base Repository save that was broken by code auto-formatting.

1.3.41 (2023-05-09)

  • Add API Queue Service and Queue the majority of Repository Endpoints to improve Concurrency.

1.3.40 (2023-04-24)

  • Figure out why Build Number is being included in semver when releasing new versions of the SDK and update documentation.

1.3.40 (2023-04-13)

  • Disabled console logging for most output to increase performance and resolved an issue with Calculations -vs- Predictions not being saved on a per Bid Line Item basis.

1.3.39 (2023-04-13)

  • Implemented Z-Factors which allow the values of certain Bid Line Items to be multiplied using specific Bid Metric Formulas.

1.3.38 (2023-02-01)

  • Improve performance by only calling math ceiling when absolutely necessary and checking for exponential in numbers.

1.3.37 (2023-01-26)

  • Reduced the math ceiling by half due to dependent calculations hitting validation errors in the MySQL database.

1.3.36 (2023-01-26)

  • Raise math ceiling to the maximum - 1, to the whole number, for a 17 precision decimal to be safe.

1.3.35 (2023-01-25)

  • Added a math ceiling to deal with exponentials from Prediction Models

1.3.34 (2022-10-19)

Improvements

Bids, Projects, & All Bid Entities

  • Updated the entity change log to be disabled or enabled via bid creation

1.3.33 (2022-09-18)

Improvements

Bids, Projects, & All Bid Entities

  • Implemented a change log to keep a history of changes to bids, projects and bid entities

1.3.32 (2022-08-01)

BugFix

  • Bids & Projects - Fixes a bug where the total kw ac (pv) or total kw ac metrics predicted values were not displaying correctly.
  • Bids & Projects - Path 1.3.31 follow up with assembly deletion auto save and reload race conditions.

1.3.31 (2022-07-21)

BugFix

  • Bids & Projects - Applies changes that prevents bid validation errors during project auto saving when removing assemblies

1.3.30 (2022-07-19)

BugFix

  • Bids - Applied changes to enable predictions when Total Kw AC is non-zero in addition to watts. Essentially creating a conditional that states If Watts or Total Kw AC is non-zero, then enable predictions

1.3.29 (2022-06-3)

BugFix

  • Bids - Fixed a bug where when a bid is set to locked and requires a indicative pricing calculation, the application would not render the price correctly.

1.3.28 (2022-05-13)

Improvements

Updated Projects & Bids with the ability to move bids to another project.

1.3.27 (2021-10-09)

Improvements

For Metrics, LineItems, and Fields - Previous patch changes now only apply to bids created on or after October 9th, 2021

1.3.26 (2021-09-25)

Improvements

For Metrics, LineItems, and Fields - Updated the assessment of these entities when reading from a datatable reference. Entities now properly determine if referencing a null or undefined entity that is a datatable where the referenced column/row value is empty or is linked to a pvbid_inventory part with an empty or undefined value.

Note This only applies to bids created after 09/24/2021

1.3.25 (2021-07-21)

Improvements

  • Datatables - Added audit log information to all datatables logging the user name and datetime of their latest changes

1.3.24 (2021-06-16)

Bug Fix

  • Field - Minor Tweak/Bugfix to handle reference chains for number fields referencing invalidated dependencies

1.3.23 (2021-05-19)

Minor Tweaks

  • FieldAutoPopulateService - Minor Tweak/Bugfix to handle field reference chains.

1.3.22 (2021-05-17)

Clean Up

  • FieldAutoPopulateService - Small statement clean up within the autoToggleBoolean function.

1.3.21 (2021-05-14)

Improvements

  • Field - Boolean toggles and fields referencing boolean toggles now properly flag predictions on or off based on their value.

1.3.20 (2021-05-12)

Bug Fixes:

  • Field - More improvements and tweaks to the new dependency referencing, auto-population and auto-toggle functionality for boolean and text fields.

1.3.19 (2021-05-07)

Improvements:

  • Field - Improve the dependency referencing, auto-population and auto-toggle functionality.

1.3.18 (2021-04-29)

Bug Fixes:

  • Field - This update includes fixed to dependency referencing, auto-population and auto-toggle functionality.

1.3.17 (2021-04-20)

Adjustments:

  • Field - Added bid dependency referencing, auto-population and auto-toggle functionality to boolean and text fields.

1.3.16 (2021-04-05)

Adjustments:

  • Bid - Re-added the errorAdjustedMarginMultipler. This value is multiplied by the bid price when the margin of error is greater than zero.

1.3.15 (2021-03-30)

Bug Fixs:

  • Bid - Updated the indicative pricing helper to properly calculate the indicative price based on the bounds (WeightedValues of a Bid.)

1.3.14 (2021-03-25)

Improvements:

  • Stoplight Indicator: - Improved the indicator's bid level calculation speed.
  • Bid - Updated the Indicative Pricing Helper to calculate the Indicative Price based on the calculated weighted values.

1.3.13 (2021-03-18)

Improvements:

  • Stoplight Indicator:
    • LineItem Level - Modified calculations to properly apply contribution weight to weighted normal values.
    • Component Level - Minor optimization for fast calculation times
    • Bid Level - Added stoplight indicator to bid summary and fields page.
    • System - Removed the unnecessary Yellow ! icon and re-aligned the logic to determine the stoplight prediction.

1.3.12 (2021-03-08)

Bug Fix:

  • Stoplight Indicator: - Modified line item and component level calculations to properly apply contribution weight to line item values.

1.3.11 (2021-03-04)

Improvements:

  • Stoplight Indicator:

    • Modified Component level stoplight indicator to properly display the correct indicator based on whether or not a line item is predicted, has prediction models, and is included in calculations.

    • Modified Component level getWeightedNormalValue & getPredictedValue to filter the line items by their isincluded property.

    • Modified LineItem level stoplight indicator to properly display the correct indicator based on whether or not a line item is predicted, has prediction models, and is included in calculations.

    • Minor calculation fixes to the Component level when calculating the weightedLaborHourCost for labor line items.

1.3.10 (2021-03-02)

Improvements:

  • Stoplight Indicator: - Component level stoplight indication now accurately calculates its prediction from the associated line items.

1.3.9 (2021-02-26)

Bug Fix:

  • Stoplight Indicator: Fixed a bug where line items with a predicted value equal to zero were skewing component level calculations

1.3.8 (2021-02-25)

Bug Fix:

  • Stoplight Indicator: The indicator has been updated to properly calculate the weightedNormalValues for a line item.

1.3.7 (2021-02-22)

Improvements:

  • Stoplight Indicator:
    • Modified the stoplight calculations to pass up the line items calculated value to the component level if the line item is contributing but does not have any prediction models.
    • Modified distribution ranges to be received from bid variables instead of being hardcoded. This allows the ranges to be dynamically inserted by the user in Admin->BidVariables.

1.3.6 (2021-02-12)

Improvements:

  • Stoplight Indicator: The indicator now displays a Data Not Available for line items that are currently being predicted

  • Line Item: Modified getWeightedNormalValues to filter out all values less than 0

Bug Fixes:

  • Stoplight Indicator: Fixed a bug where the indicator was not properly calculating the converted weighted normal values for labor line items.

1.3.5 (2021-02-11)

Improvements:

  • Stoplight Indicator:

    • Added a check to determine if a line item’s predicted value exists and is not zero. This will prevent the indicator from showing for line items without predicted values
    • Added a check to line items that include or exclude the line item from stoplight calculations based on its set isIncluded attribute.
  • Line Item:

    • Added two new functions called getWeightedLaborHourCost and calculateWeightedLaborCost that converts the weighted normal values for line items typed as labor into weighted labor cost. This function is called upon at the component level to convert the labor hours for those line items into a centralized value (cost)

1.3.4 (2021-02-09)

Bug Fixes:

  • Line Item: Fixed a bug where the stoplight indicator was pulling cost instead of labor_hours for line items typed as labor_hours

1.3.3 (2021-02-04)

Improvements:

  • Line Item: Optimized the _getStoplightIndicator for better performance.
  • Component: Added getStoplightIndicator to return stoplight predictions and a related indicator for components and subcomponents

1.3.2 (2021-01-27)

Improvements:

  • PVBid: Updated the SDK's dependencies
  • Line Item: Changed _getStoplightPredictions to _getStoplightIndicator
  • Line Item: Updated the stoplight indicator to show positive and negative Out of Bounds for a lineItem if its cost is too far above or too far below its predicted value.
  • Line Item: Added a check to prevent the stoplight indicator from showing for a specific lineItem if its cost or labor cost is predicted
  • Line Item: Removed the check preventing the stoplight indicator from showing if predictions are enabled
  • Line Item: Updated Line Item tests

1.3.1 (2021-01-26)

Improvements:

  • PVBid: Updated the SDK's dependencies

1.3.0 (2021-01-25)

Improvements:

  • Line Item: Added _getStoplightPrediction to return stoplight predictions and a related indicator

1.2.20 (2020-06-20)

  • Project: Only enable the change event listener on Bids if the Project's autoSave flag is enabled

1.2.19 (2020-06-19)

Improvements:

  • Helpers: Removed stripping of square brackets in _cleanFormula and made _cleanValues safer with types

1.2.18 (2020-06-11)

Bug Fixes:

  • Component: Updated Component wage and burden aggregation calculations. The new formulas are: wage = sum of all labor Line Items' (wage _ hours) / sum of all labor Line Items' hours burden = sum of all labor Line Items' (burden _ hours) / sum of all labor Line Items' hours

1.2.17 (2020-04-16)

Bug Fixes:

  • Line Item: Ensure prediction status flags are updated to false when cost is overridden.

1.2.16 (2020-04-09)

Improvements:

  • Project: Added batchUpdate auto save flag (as query string parameter). Improves visibility into when auto save requests are being made.
  • Project: Added disableAutoSave setting to be used in congruence with enableAutoSave.

Bug Fixes:

  • PVBid: Include prediction models in the virtual project clone's line items.

1.2.15 (2020-03-24)

Improvements:

  • Bid: getUncategorizedLineItems now returns the line items keyed by their ID instead of an array

1.2.14 (2020-03-20)

Improvements:

  • Bid Entities: Added getDatatableByDefId method.
  • Bid Entities: Added 'component', 'datatable' & 'line_item' types to getBidEntitiesByDefId method. These will return an array with a single entity and it is still recommended to use the more specific get*ByDefId for datatables and components if you can.

1.2.13 (2020-02-26)

Improvements:

  • Bid|Component|DynamicGroup: Added "Cost w/Markup" property.

1.2.12 (2020-02-19)

Improvements:

  • Bid: Price overrides are applied as a markup adjustment.

Features:

  • Bid Variables: - Include a variable option for applying tax after markup.

1.2.11 (2020-01-17)

Improvements:

  • Line Item: Better handling for prediction model results

1.2.10 (2020-01-10)

Improvements:

  • Line Item: Minor performance improvements when saving.
  • Validator: Now checks for line item duplicates within component groups.

Bug Fixes:

  • Field Group: Fixed the potential to return an undefined field entity if an invalid field reference exists in the group

1.2.9 (2019-12-24)

Bug Fixes:

  • Bid Entities: Return null from bid.entities.getDependency(contract) when contract.bid_entity_id is not defined.

1.2.8 (2019-12-16)

Bug Fixes:

  • Line Item: Empty workups were sometimes unable to be edited.

1.2.7 (2019-12-05)

Features:

  • Bid: bid.costWithTax property is now available representing the sum of the bid's cost and tax value.

1.2.6 (2019-11-15)

Improvements:

  • LineItem: Rules will no longer consider whether or not their dependencies are fully defined when predictive pricing is not being used.

1.2.5 (2019-11-08)

Improvements:

  • Helpers: calculateFormula method now accepts an options object. This may contain the options flag [castValuesToNumbers=true] which will force all given values and the formula result to a number. Set the flag to false if you wish to use/evaluate anything with booleans, strings, or nulls.

1.2.4 (2019-11-05)

Bug Fixes:

  • Component: Added a helper method for safely accessing virtual properties such as "included_count". This method shouldn't be used externally and will likely be deprecated when the component structure is refactored.

1.2.3 (2019-10-21)

Bug Fixes:

  • Helpers: The evalExpression method (used mostly in line item rules) was casting all variables to numbers. It will now maintain the provided type. Casting to number is appropriate for the formula calculator but not for evaluating logical expressions.
  • Field: List fields without a datatable dependency were causing new bids to fail on load. The misconfiguration will now be handled gracefully with a validation warning.

1.2.2 (2019-10-03)

Improvements:

  • LineItems: Prediction Models are now statically embedded in the Line Item so that they are more deterministic.
  • Project: Prediction Models are no longer loaded with the Project.

1.2.1 (2019-09-10)

Bug Fixes:

  • LineItem: A bug was causing some line item rule expressions to act unexpectedly when there were unused dependencies.

1.2.0 (2019-08-30)

Features:

  • DynamicGroup: Introduces a new assessable bid entity type, DynamicGroup. Dynamic Groups provide a flexible way to organize Line Items and Components within a bid. They provide an alternative to the rigid organizational elements of components and component groups. bid.addDynamicGroup() creates a new dynamic group within the bid. Now just start adding components, line items, or other dynamic groups with dynamicGroup.addChild(lineItem). The group will provide with a similar interface to the component. dynamicGroup.cost for example is the sum of its child costs. Dynamic groups are for organization only and they do not contribute to bid totals. If a dynamic group should appear in the UI alongside component groups, set dynamicGroup.isRootable to true.

Improvements:

  • Component: isIncluded has been added to the component interface. A component is considered to be included if it contains any included line items.

1.1.27 (2019-08-01)

Features:

  • LineItem: Workups have been improved to allow per quantity values to be a reference. Use lineItem.setWorkupField(field) to link the workup to a field (list fields only - ie connected to a datatable). Once connected, any workup item's per quantity value can be set to the 4 character string value of the datatable column. Then call lineItem.assessWorkup() to recalculate the workup value using the reference. To gain access to a line item's workup instance, use lineItem.getWorkup().

1.1.26 (2019-07-11)

Improvements:

  • Bid: Indicative prices for indicative bids have been "shifted" upwards by 25% of the margin of error.

1.1.25 (2019-07-01)

Features:

  • LineItem: Now has a "workup" value that can contribute to perQuantity through the formula as WORKUP. The current workup value can be accessed via lineItem.workup. The workup value cannot be set directly at this time and must be edited via a calculator in the PVBid UI.

Improvements:

  • BidEntity: Added a hasAssembly property which indicates whether or not the entity is in an assembly. Line Items, Metrics, Fields, and Field Groups may be in an assembly.
  • LineItem|Metric|Field|FieldGroup: added several methods to make working with assemblies easier and more consistent. To get the assembly that the entity belongs to, just call entity.getAssembly(). Methods for adding or removing the entity from an assembly have been added as well (setAssembly(assembly) and unsetAssembly()).
  • FieldGroup: Add getFields() method that returns the Field entities belonging to that group keyed by their reference id.
  • ComponentGroup: Add getComponents() method that returns the components belonging to that group keyed by their reference id. Pass componentGroup.getComponents(true) (passing true as an arg) with return just the top-level components in the group.

1.1.24 (2019-06-19)

Bug Fixes:

  • Bid: Fixed bug preventing bid's active status from persisting before bid.load is called.

1.1.23 (2019-06-06)

Bug Fixes:

  • Datatable: findRowByExternalPartId updated due to data structure changes.

1.1.22 (2019-06-04)

Features:

  • Repositories: Account definition can now be accessed (read-only) through the PVBid SDK's repository. Please see the repository documentation for more information.

1.1.21 (2019-05-27)

Improvements:

  • PVBid.getProject(): Now accepts options as a second parameter. The loadBidEntities option flag determines if the full bid instance (with all entities) should be loaded for each bid in the project. Performance can be increased by setting this flag to false when loading a project with many bids. loadBidEntities is set to true by default. Bids loaded without entities may still be renamed, cloned, activated/deactivated, and deleted. They CANNOT be assessed or edited.
  • Bid: Bids will need to be loaded before they can be edited or assessed if they are loaded without entities using the loadBidEntities = false flag detailed above. The asynchronous bid.load() method will fetch the full bid and return a promise which resolves once loading is complete.
  • Bid: Bids now have an isLoaded property to indicate whether it has been loaded yet or not.

1.1.20 (2019-05-13)

Improvements:

  • LineItem: The default value of perQuantity has been changed from 0 to 1. This is a step to encourage users to favor Scalar over perQuantity. PerQuantity will be deprecated in a future release due to its limitations compared to Scalar.

1.1.19 (2019-04-30)

Features:

  • Repositories: datatables.findById and datatables.save methods are now supported.
  • Datatable: Introducing Inventory Links. Datatables may now contain reference to items in a shared PVBid inventory. If a datatable is linked, the inventoryLink property will indicate which inventory the datatable is linked to. Linked datatables will be able to reference the columns of the linked inventory and rows within the datatable that reference specific inventory items will contain all the data associated with that item. All the existing datatable methods (getValue, getOptions, getColumnValues) support this feature. To access the raw row or column data, the datatable.columns and datatable.rows properties must be used. Rows and columns should NOT be accessed through the datatable.config property.
  • Datatable: datatable.reload() is an async method that persists and reloads the datatable entity. This is useful in scenarios where an inventory link changes and fresh data is required. Modifying inventory links on a datatable instance is not recommended but it is possible with a Bulk Update in the PVBid application.
  • Datatable: add datatable.findRowByExternalPartId method to lookup a row in a datatable by its linked part's 3rd party vendor ID. This is useful for making field list selections based on information coming from an external source.

1.1.18 (2019-04-29)

Improvements:

  • Bid: Immediately trigger a save upon toggling the bid's active state.

1.1.17 (2019-04-17)

Improvements:

  • Bid: reassessAsync will force assess the bid and all its entities until the price has converged. It returns a promise that resolves when the reassessment is complete. It rejects if the price has not converged within a limited number of reassessments.

1.1.16 (2019-04-04)

Bug Fixes:

  • Bid: Fixes bug that prevented watts from automatically recalculating after removing assemblies on some occasions.

1.1.15 (2019-04-01)

Bug Fixes:

  • pvbid.getAuthToken: Skips setting the auth token for this request.

1.1.14 (2019-03-25)

Bug Fixes:

  • LineItem: isPredicted(prop) now checks all properties prediction statuses if the prop is omitted.
  • Bid: markupPercent is calculated based on the bids line items and can be dynamically overridden.

Features:

  • PVBid: It is now possible to generate virtual clones/copies of a project instance. These virtual clones are fully assessable but have restricted access to repository and persistence related methods. They are useful for "what if" scenarios. For instance, you could make a virtual clone and reset all line items and metrics to see what the bid total would be had you not made any overwrites without affecting the original bid. To generate a virtual clone from a project instance: pvbid.getVirtualProjectClone(projectInstance). Optionally, you can limit the bids that will be included in the clone by passing an inclusive array of bid ids as the second parameter.
  • Assembly: getFieldByAnchor(anchor) is now available to quickly find a field belonging to an assembly by it's anchor string value.

Improvements:

  • Bid: The bid data object can now be exported from a Bid instance including all its entities with bid.exportDataWithEntities()
  • BidEntity: The exportData() method now accepts a boolean parameter to ensure that the entity's config object is included in the export if set to true. If false, the config will only be included if a change has been detected (this helps with save performance). This parameter is false by default.

1.1.13 (2019-03-19)

Bug Fixes:

  • Bid: Resolves an issue that prevented locked bids from saving their active/included status.

1.1.12 (2019-02-27)

Bug Fixes:

  • Project: createBid() now returns the newly created Bid entity

1.1.11 (2019-02-25)

Features:

  • Component: Expose actualCostConfidenceFactor and actualHoursConfidenceFactor which indicate the confidence of the actualCost and actualHours. The confidence values are set automatically when the actual values are imported. A confidence of 1 means the value was manually input. Confidence values of 2+ indicate that the actual value was propagated from a related actual value. Higher numbers mean lower confidence. A confidence of 0 indicates that no actual value was given or propagated and the actual value was taken from the bids estimation.

1.1.10 (2019-02-22)

Bug Fixes:

  • LineItem: isDirty() better indicates changes to the config property

1.1.9 (2019-02-19)

Features:

  • Component: Add an isOverridden() method that returns the override status of the component. A component is considered to be overridden if any of its sub-components or line items are overridden.

Improvements:

  • LineItem: isOverridden()'s parameter is now optional. Calling isOverridden without a param returns the override status of the whole line item.

1.1.8 (2019-01-30)

Documentation:

  • Added summary of bid and cost breakdown with code examples.
  • Improved anchors documentation

1.1.7 (2019-01-28)

Improvements:

  • BidEntities: Add flag for exactMatch when searching for a bid entity by title (bid.entities.searchByTitle(type, query, exactMatch)). The exact match flag defaults to false. Think of exactMatch=false as wrapping wildcard characters around the query string ((%<query>%)). Note that both methods are case insensitive.

1.1.7 (2019-01-28)

Improvements:

  • BidEntities: Add flag for exactMatch when searching for a bid entity by title (bid.entities.searchByTitle(type, query, exactMatch)). The exact match flag defaults to false. Think of exactMatch=false as wrapping wildcard characters around the query string ((%<query>%)). Note that both methods are case insensitive.

1.1.6 (2019-01-14)

Features:

  • Bid Variable: Add a new bid variables to a bid with bid.addBidVariable().
  • LineItem: Labor type line items may now consider tax if the taxable_labor bid variable is set to true (false by default).

1.1.5 (2019-01-11)

Features:

  • Field: Introduced the anchor property. Anchors are a means for identifying similar entities universally across any assembly and any account

Improvements:

  • Bid: bid.addAssemblies() now returns the newly created entities.
  • Assembly: Exposed assembly.definitionId

1.1.4 (2018-11-02)

Bug Fixes:

  • Formula Constant Evaluation: Fixed problem with variables and math constants (e.g. pi) conflicting during evaluation

1.1.3 (2018-10-24)

Features:

  • PredictionModels Repository: repositories.predictionModels.getData(id) retrieves specific prediction model and the model data

1.1.2 (2018-10-23)

Improvements:

  • Documentation: Add additional examples to the Getting Started section of the Manual

Bug Fixes:

  • Documentation: Fix broken links

1.1.1 (2018-10-18)

Features:

  • Predictive Pricing: Introduced services to handle the evaluation of prediction models
  • LineItem: Line items can now determine their value by evaluating a prediction model if configured to do so. A predicted value will be used if the predictive_pricing bid variable is true and the line item's value cannot be computed by evaluating its dependencies. The computed value may be overridden by setting the use_computed bid variable to false or lineItem.useComputedValueWhenAvailable to false. The bid must have a non-zero value for Watts.
  • LineItem: LineItem.isWeighted determine or set a line items weighted switch. Predicted line items can optionally be weighted by their total historic inclusion count
  • LineItem: LineItem.getPredicted('cost') determines the predicted cost of the line item using its prediction models
  • Bid|LineItem|Component: Bid|LineItem|Component.isPredicted(property) determines if a property is being predicted
  • BidEntity: BidEntity.hasNullDependency(property) determines if the property depends on an undefined dependency

Improvements:

  • BidVariable: Expose isReserved property
  • PredictionModels Repository: repositories.predictionModels.get() retrieves prediction models for account or specified lineItemDefId
  • Project: predictionModels property allows access to project's prediction models

Bug Fixes:

  • BidVariable: execute a full reassessment when markup_strategy is changed
  • Bid: bid.entities.getDependencyValue now returns null instead of 0 for undefined dependencies

1.0.39 (2018-08-30)

Bug Fixes:

  • Project: Improve tracking of changes to the data while project is saving

1.0.38 (2018-08-29)

Bug Fixes:

  • Bid: Fix bug in submargin back-calculation

1.0.37 (2018-08-20)

Changes:

  • Field: For number type fields, getters return value typed as number (instead of string)

1.0.36 (2018-07-12)

Bug Fixes:

  • Bid Validation Improved formula reference validation

1.0.35 (2018-06-21)

Improvements:

  • LineItem & Component Added new editable and computable costWatt and priceWatt properties.
  • LineItem & Component Added new read-only costWithTax property.

1.0.34 (2018-06-19)

Bug Fixes:

  • ProjectRepository: Project save() hotfix to prevent saving when a project is pristine.

1.0.33 (2018-06-18)

Bug Fixes:

  • ProjectRepository: Project save() persists changes even if no bids were modified

1.0.32 (2018-05-30)

Changes:

  • Component: Expose the componentGroupId property

1.0.31 (2018-05-29)

Bug Fixes:

  • Snapshot: Expose the save() method from the snapshot repository
  • CacheRepository: The cache is invalidated when the create() method is used

1.0.30 (2018-05-24)

Bug Fixes:

  • Documentation: Link to the changelog from the docs

1.0.29 (2018-05-24)

Bug Fixes:

  • Bid: Return a promise rejection from the bid.lock() method if the bid cannot be locked

LICENSE

1. Preamble: This Agreement, signed on Sep 16, 2017 (hereinafter: Effective Date) governs the relationship between any Entity, (hereinafter: Licensee) and PVBid, Inc, a duly registered company in whose principal place of business is Denver (hereinafter: Licensor). This Agreement sets the terms, rights, restrictions and obligations on using PVBid SDK (hereinafter: The Software) created and owned by Licensor, as detailed herein

2. License Grant: Licensor hereby grants Licensee a Personal, Non-assignable & non-transferable, Commercial, Royalty free, Without the rights to create derivative works, Non-exclusive license, all with accordance with the terms set forth and other legal restrictions set forth in 3rd party software used while running Software.

  • 2.1. Limited: Licensee may use Software for the purpose of:
    • 2.1.1. Running Software on Licensee’s Website[s] and Server[s];
    • 2.1.2. Allowing 3rd Parties to run Software on Licensee’s Website[s] and Server[s];
    • 2.1.3. Publishing Software’s output to Licensee and 3rd Parties;
    • 2.1.4. Distribute verbatim copies of Software’s output (including compiled binaries);
    • 2.1.5. Modify Software to suit Licensee’s needs and specifications.
  • 2.2. Binary Restricted: Licensee may sublicense Software as a part of a larger work containing more than Software, distributed solely in Object or Binary form under a personal, non-sublicensable, limited license. Such redistribution shall be limited to unlimited codebases.
  • 2.3. Non Assignable & Non-Transferable: Licensee may not assign or transfer his rights and duties under this license.
  • 2.4. Commercial, Royalty Free: Licensee may use Software for any purpose, including paid-services, without any royalties

3. Term & Termination: The Term of this license shall be until terminated. Licensor may terminate this Agreement, including Licensee’s license in the case where Licensee :

  • 3.1. became insolvent or otherwise entered into any liquidation process; or
  • 3.2. exported The Software to any jurisdiction where licensor may not enforce his rights under this agreements in; or
  • 3.3. Licensee was in breach of any of this license's terms and conditions and such breach was not cured, immediately upon notification; or
  • 3.4. Licensee in breach of any of the terms of clause 2 to this license; or
  • 3.5. Licensee otherwise entered into any arrangement which caused Licensor to be unable to enforce his rights under this License.

4. Payment: In consideration of the License granted under clause 2, Licensee shall pay Licensor a fee, via Credit-Card, PayPal or any other mean which Licensor may deem adequate. Failure to perform payment shall construe as material breach of this Agreement.

5. Upgrades, Updates and Fixes: Licensor may provide Licensee, from time to time, with Upgrades, Updates or Fixes, as detailed herein and according to his sole discretion. Licensee hereby warrants to keep The Software up-to-date and install all relevant updates and fixes, and may, at his sole discretion, purchase upgrades, according to the rates set by Licensor. Licensor shall provide any update or Fix free of charge; however, nothing in this Agreement shall require Licensor to provide Updates or Fixes.

  • 5.1. Upgrades: for the purpose of this license, an Upgrade shall be a material amendment in The Software, which contains new features and or major performance improvements and shall be marked as a new version number. For example, should Licensee purchase The Software under version 1.X.X, an upgrade shall commence under number 2.0.0.
  • 5.2. Updates for the purpose of this license, an update shall be a minor amendment in The Software, which may contain new features or minor improvements and shall be marked as a new sub-version number. For example, should Licensee purchase The Software under version 1.1.X, an upgrade shall commence under number 1.2.0.
  • 5.3. Fix: for the purpose of this license, a fix shall be a minor amendment in The Software, intended to remove bugs or alter minor features which impair the The Software's functionality. A fix shall be marked as a new sub-sub-version number. For example, should Licensee purchase Software under version 1.1.1, an upgrade shall commence under number 1.1.2.

6. Support: Software is provided under an AS-IS basis and without any support, updates or maintenance. Nothing in this Agreement shall require Licensor to provide Licensee with support or fixes to any bug, failure, mis-performance or other defect in The Software.

  • 6.1. Bug Notification: Licensee may provide Licensor of details regarding any bug, defect or failure in The Software promptly and with no delay from such event; Licensee shall comply with Licensor's request for information regarding bugs, defects or failures and furnish him with information, screenshots and try to reproduce such bugs, defects or failures.
  • 6.2. Feature Request: Licensee may request additional features in Software, provided, however, that (i) Licensee shall waive any claim or right in such feature should feature be developed by Licensor; (ii) Licensee shall be prohibited from developing the feature, or disclose such feature request, or feature, to any 3rd party directly competing with Licensor or any 3rd party which may be, following the development of such feature, in direct competition with Licensor; (iii) Licensee warrants that feature does not infringe any 3rd party patent, trademark, trade-secret or any other intellectual property right; and (iv) Licensee developed, envisioned or created the feature solely by himself.

7. Liability: To the extent permitted under Law, The Software is provided under an AS-IS basis. Licensor shall never, and without any limit, be liable for any damage, cost, expense or any other payment incurred by Licensee as a result of Software’s actions, failure, bugs and/or any other interaction between The Software and Licensee’s end-equipment, computers, other software or any 3rd party, end-equipment, computer or services. Moreover, Licensor shall never be liable for any defect in source code written by Licensee when relying on The Software or using The Software’s source code.

8. Warranty:

  • 8.1. Intellectual Property: Licensor hereby warrants that The Software does not violate or infringe any 3rd party claims in regards to intellectual property, patents and/or trademarks and that to the best of its knowledge no legal action has been taken against it for any infringement or violation of any 3rd party intellectual property rights.
  • 8.2. No-Warranty: The Software is provided without any warranty; Licensor hereby disclaims any warranty that The Software shall be error free, without defects or code which may cause damage to Licensee’s computers or to Licensee, and that Software shall be functional. Licensee shall be solely liable to any damage, defect or loss incurred as a result of operating software and undertake the risks contained in running The Software on License’s Server[s] and Website[s].
  • 8.3. Prior Inspection: Licensee hereby states that he inspected The Software thoroughly and found it satisfactory and adequate to his needs, that it does not interfere with his regular operation and that it does meet the standards and scope of his computer systems and architecture. Licensee found that The Software interacts with his development, website and server environment and that it does not infringe any of End User License Agreement of any software Licensee may use in performing his services. Licensee hereby waives any claims regarding The Software's incompatibility, performance, results and features, and warrants that he inspected the The Software.

9. No Refunds: Licensee warrants that he inspected The Software according to clause 7(c) and that it is adequate to his needs. Accordingly, as The Software is intangible goods, Licensee shall not be, ever, entitled to any refund, rebate, compensation or restitution for any reason whatsoever, even if The Software contains material flaws.

10. Indemnification: Licensee hereby warrants to hold Licensor harmless and indemnify Licensor for any lawsuit brought against it in regards to Licensee’s use of The Software in means that violate, breach or otherwise circumvent this license, Licensor's intellectual property rights or Licensor's title in The Software. Licensor shall promptly notify Licensee in case of such legal action and request Licensee’s consent prior to any settlement in relation to such lawsuit or claim.

11. Governing Law, Jurisdiction: Licensee hereby agrees not to initiate class-action lawsuits against Licensor in relation to this license and to compensate Licensor for any legal fees, cost or attorney fees should any claim brought by Licensee against Licensor be denied, in part or in full.