@merchi/sdk 1.40.2 → 1.42.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entities/cart.js +40 -0
- package/dist/entities/cart.test.js +21 -0
- package/dist/entities/domain.js +4 -0
- package/dist/entities/domain.test.js +10 -0
- package/dist/entities/invoice.js +4 -0
- package/dist/entities/job.js +40 -0
- package/dist/entities/job.test.js +25 -0
- package/dist/entity.js +6 -0
- package/dist/request.js +11 -3
- package/dist/request.test.js +21 -2
- package/package.json +1 -1
- package/src/entities/cart.test.ts +23 -0
- package/src/entities/cart.ts +30 -0
- package/src/entities/domain.test.ts +14 -0
- package/src/entities/domain.ts +3 -0
- package/src/entities/invoice.ts +3 -0
- package/src/entities/job.test.ts +27 -0
- package/src/entities/job.ts +30 -0
- package/src/entity.ts +8 -0
- package/src/request.test.ts +23 -2
- package/src/request.ts +12 -3
- package/.turbo/turbo-test.log +0 -849
- package/coverage/clover.xml +0 -5057
- package/coverage/coverage-final.json +0 -133
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -191
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov-report/src/constants/auto_assign_production_on_actions.ts.html +0 -103
- package/coverage/lcov-report/src/constants/call_to_actions.ts.html +0 -127
- package/coverage/lcov-report/src/constants/discount_types.ts.html +0 -100
- package/coverage/lcov-report/src/constants/domain_types.ts.html +0 -121
- package/coverage/lcov-report/src/constants/errors.ts.html +0 -181
- package/coverage/lcov-report/src/constants/event_types.ts.html +0 -100
- package/coverage/lcov-report/src/constants/field_types.ts.html +0 -133
- package/coverage/lcov-report/src/constants/index.html +0 -551
- package/coverage/lcov-report/src/constants/index.ts.html +0 -238
- package/coverage/lcov-report/src/constants/input_types.ts.html +0 -124
- package/coverage/lcov-report/src/constants/inventory_statuses.ts.html +0 -103
- package/coverage/lcov-report/src/constants/invoice_types.ts.html +0 -100
- package/coverage/lcov-report/src/constants/item_types.ts.html +0 -100
- package/coverage/lcov-report/src/constants/job/drafting_status.ts.html +0 -106
- package/coverage/lcov-report/src/constants/job/index.html +0 -176
- package/coverage/lcov-report/src/constants/job/payment_status.ts.html +0 -106
- package/coverage/lcov-report/src/constants/job/production_status.ts.html +0 -121
- package/coverage/lcov-report/src/constants/job/shipment_status.ts.html +0 -118
- package/coverage/lcov-report/src/constants/job/supply_chain_request_status.ts.html +0 -103
- package/coverage/lcov-report/src/constants/job_priorities.ts.html +0 -103
- package/coverage/lcov-report/src/constants/job_status.ts.html +0 -232
- package/coverage/lcov-report/src/constants/job_types.ts.html +0 -133
- package/coverage/lcov-report/src/constants/notification_sections.ts.html +0 -124
- package/coverage/lcov-report/src/constants/notification_types.ts.html +0 -385
- package/coverage/lcov-report/src/constants/notification_urgencies.ts.html +0 -106
- package/coverage/lcov-report/src/constants/payment_types.ts.html +0 -115
- package/coverage/lcov-report/src/constants/platform.ts.html +0 -103
- package/coverage/lcov-report/src/constants/product_types.ts.html +0 -163
- package/coverage/lcov-report/src/constants/rights.ts.html +0 -100
- package/coverage/lcov-report/src/constants/robots_meta_directives.ts.html +0 -118
- package/coverage/lcov-report/src/constants/roles.ts.html +0 -223
- package/coverage/lcov-report/src/constants/shipment_companies.ts.html +0 -142
- package/coverage/lcov-report/src/constants/shipment_services.ts.html +0 -94
- package/coverage/lcov-report/src/constants/system_roles.ts.html +0 -94
- package/coverage/lcov-report/src/constants/theme_status.ts.html +0 -100
- package/coverage/lcov-report/src/constants/user_types.ts.html +0 -136
- package/coverage/lcov-report/src/constants/white_label_accessibilities.ts.html +0 -103
- package/coverage/lcov-report/src/cookie.ts.html +0 -133
- package/coverage/lcov-report/src/entities/address.ts.html +0 -280
- package/coverage/lcov-report/src/entities/agent_conversation.ts.html +0 -202
- package/coverage/lcov-report/src/entities/agent_skill.ts.html +0 -382
- package/coverage/lcov-report/src/entities/agent_skill_approval.ts.html +0 -163
- package/coverage/lcov-report/src/entities/agent_skill_version.ts.html +0 -277
- package/coverage/lcov-report/src/entities/agent_token_usage.ts.html +0 -349
- package/coverage/lcov-report/src/entities/assignment.ts.html +0 -382
- package/coverage/lcov-report/src/entities/automatic_payment_relationship.ts.html +0 -172
- package/coverage/lcov-report/src/entities/bank.ts.html +0 -220
- package/coverage/lcov-report/src/entities/cart.ts.html +0 -391
- package/coverage/lcov-report/src/entities/cart_item.ts.html +0 -340
- package/coverage/lcov-report/src/entities/cart_shipment_group.ts.html +0 -148
- package/coverage/lcov-report/src/entities/cart_shipment_quote.ts.html +0 -184
- package/coverage/lcov-report/src/entities/category.ts.html +0 -262
- package/coverage/lcov-report/src/entities/company.ts.html +0 -1276
- package/coverage/lcov-report/src/entities/company_invitation.ts.html +0 -184
- package/coverage/lcov-report/src/entities/country_tax.ts.html +0 -223
- package/coverage/lcov-report/src/entities/discount.ts.html +0 -235
- package/coverage/lcov-report/src/entities/discount_group.ts.html +0 -214
- package/coverage/lcov-report/src/entities/domain.ts.html +0 -3349
- package/coverage/lcov-report/src/entities/domain_chat_settings.ts.html +0 -331
- package/coverage/lcov-report/src/entities/domain_invitation.ts.html +0 -193
- package/coverage/lcov-report/src/entities/domain_tag.ts.html +0 -211
- package/coverage/lcov-report/src/entities/draft.ts.html +0 -322
- package/coverage/lcov-report/src/entities/draft_comment.ts.html +0 -274
- package/coverage/lcov-report/src/entities/draft_preview.ts.html +0 -196
- package/coverage/lcov-report/src/entities/draft_preview_layer.ts.html +0 -148
- package/coverage/lcov-report/src/entities/draft_template.ts.html +0 -328
- package/coverage/lcov-report/src/entities/email_address.ts.html +0 -157
- package/coverage/lcov-report/src/entities/email_counter.ts.html +0 -145
- package/coverage/lcov-report/src/entities/enrolled_domain.ts.html +0 -205
- package/coverage/lcov-report/src/entities/exchange_rate.ts.html +0 -151
- package/coverage/lcov-report/src/entities/file.ts.html +0 -580
- package/coverage/lcov-report/src/entities/index.html +0 -1271
- package/coverage/lcov-report/src/entities/internal_tag.ts.html +0 -238
- package/coverage/lcov-report/src/entities/inventory.ts.html +0 -274
- package/coverage/lcov-report/src/entities/inventory_group.ts.html +0 -193
- package/coverage/lcov-report/src/entities/inventory_unit_variation.ts.html +0 -172
- package/coverage/lcov-report/src/entities/invoice.ts.html +0 -661
- package/coverage/lcov-report/src/entities/item.ts.html +0 -262
- package/coverage/lcov-report/src/entities/job.ts.html +0 -1288
- package/coverage/lcov-report/src/entities/job_comment.ts.html +0 -244
- package/coverage/lcov-report/src/entities/job_note.ts.html +0 -205
- package/coverage/lcov-report/src/entities/job_operation_log.ts.html +0 -208
- package/coverage/lcov-report/src/entities/matching_inventory.ts.html +0 -172
- package/coverage/lcov-report/src/entities/notification.ts.html +0 -403
- package/coverage/lcov-report/src/entities/payment.ts.html +0 -316
- package/coverage/lcov-report/src/entities/payment_device.ts.html +0 -175
- package/coverage/lcov-report/src/entities/phone_number.ts.html +0 -193
- package/coverage/lcov-report/src/entities/product.ts.html +0 -1543
- package/coverage/lcov-report/src/entities/product_form.ts.html +0 -238
- package/coverage/lcov-report/src/entities/product_form_version.ts.html +0 -238
- package/coverage/lcov-report/src/entities/product_review.ts.html +0 -748
- package/coverage/lcov-report/src/entities/production_comment.ts.html +0 -244
- package/coverage/lcov-report/src/entities/quote.ts.html +0 -505
- package/coverage/lcov-report/src/entities/quote_item.ts.html +0 -298
- package/coverage/lcov-report/src/entities/reminder.ts.html +0 -307
- package/coverage/lcov-report/src/entities/session.ts.html +0 -169
- package/coverage/lcov-report/src/entities/shipment.ts.html +0 -673
- package/coverage/lcov-report/src/entities/shipment_item.ts.html +0 -130
- package/coverage/lcov-report/src/entities/shipment_item_fulfillment.ts.html +0 -130
- package/coverage/lcov-report/src/entities/shipment_log.ts.html +0 -196
- package/coverage/lcov-report/src/entities/shipment_method.ts.html +0 -268
- package/coverage/lcov-report/src/entities/shipment_method_variation.ts.html +0 -202
- package/coverage/lcov-report/src/entities/short_url.ts.html +0 -193
- package/coverage/lcov-report/src/entities/subscription_plan.ts.html +0 -304
- package/coverage/lcov-report/src/entities/supply_domain.ts.html +0 -166
- package/coverage/lcov-report/src/entities/support_conversation.ts.html +0 -280
- package/coverage/lcov-report/src/entities/support_message.ts.html +0 -175
- package/coverage/lcov-report/src/entities/system_role.ts.html +0 -136
- package/coverage/lcov-report/src/entities/theme.ts.html +0 -331
- package/coverage/lcov-report/src/entities/theme_css_setting.ts.html +0 -154
- package/coverage/lcov-report/src/entities/user.ts.html +0 -1369
- package/coverage/lcov-report/src/entities/user_company.ts.html +0 -166
- package/coverage/lcov-report/src/entities/variation.ts.html +0 -277
- package/coverage/lcov-report/src/entities/variation_field.ts.html +0 -889
- package/coverage/lcov-report/src/entities/variation_fields_option.ts.html +0 -406
- package/coverage/lcov-report/src/entities/variation_option.ts.html +0 -259
- package/coverage/lcov-report/src/entities/variations_group.ts.html +0 -208
- package/coverage/lcov-report/src/entity.ts.html +0 -3379
- package/coverage/lcov-report/src/index.html +0 -221
- package/coverage/lcov-report/src/index.ts.html +0 -652
- package/coverage/lcov-report/src/merchi.ts.html +0 -1420
- package/coverage/lcov-report/src/pricing/discount.ts.html +0 -136
- package/coverage/lcov-report/src/pricing/estimate.ts.html +0 -1015
- package/coverage/lcov-report/src/pricing/index.html +0 -206
- package/coverage/lcov-report/src/pricing/index.ts.html +0 -106
- package/coverage/lcov-report/src/pricing/inventory.ts.html +0 -352
- package/coverage/lcov-report/src/pricing/matrix.ts.html +0 -736
- package/coverage/lcov-report/src/pricing/round.ts.html +0 -166
- package/coverage/lcov-report/src/pricing/visibility.ts.html +0 -418
- package/coverage/lcov-report/src/request.ts.html +0 -673
- package/coverage/lcov-report/src/test_util.ts.html +0 -139
- package/coverage/lcov-report/src/toasts.ts.html +0 -187
- package/coverage/lcov-report/src/util/float.ts.html +0 -121
- package/coverage/lcov-report/src/util/index.html +0 -161
- package/coverage/lcov-report/src/util/index.ts.html +0 -106
- package/coverage/lcov-report/src/util/query_string.ts.html +0 -124
- package/coverage/lcov-report/src/util/validation.ts.html +0 -91
- package/coverage/lcov-report/src/uuid.ts.html +0 -109
- package/coverage/lcov.info +0 -7758
|
@@ -1,1015 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for src/pricing/estimate.ts</title>
|
|
7
|
-
<meta charset="utf-8" />
|
|
8
|
-
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
-
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
-
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
-
<style type='text/css'>
|
|
13
|
-
.coverage-summary .sorter {
|
|
14
|
-
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
-
}
|
|
16
|
-
</style>
|
|
17
|
-
</head>
|
|
18
|
-
|
|
19
|
-
<body>
|
|
20
|
-
<div class='wrapper'>
|
|
21
|
-
<div class='pad1'>
|
|
22
|
-
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/pricing</a> estimate.ts</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">98.36% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>180/183</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">88.07% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>96/109</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">100% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>23/23</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">100% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>136/136</span>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</div>
|
|
54
|
-
<p class="quiet">
|
|
55
|
-
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
-
</p>
|
|
57
|
-
<template id="filterTemplate">
|
|
58
|
-
<div class="quiet">
|
|
59
|
-
Filter:
|
|
60
|
-
<input type="search" id="fileSearch">
|
|
61
|
-
</div>
|
|
62
|
-
</template>
|
|
63
|
-
</div>
|
|
64
|
-
<div class='status-line medium'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
-
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
-
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
-
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
-
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
-
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
-
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
-
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
-
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
-
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
-
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
-
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
-
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
-
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
-
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
-
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
-
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
-
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
-
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
-
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
-
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
-
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
-
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
-
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
-
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
-
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
-
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
-
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
-
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
-
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
-
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
-
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
-
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
-
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
-
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
-
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
-
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
-
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
-
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
-
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
-
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
-
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
-
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
-
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
-
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
-
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
-
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
-
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
-
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
-
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
-
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
-
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
-
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
-
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
-
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
-
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
-
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
-
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
-
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
-
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
-
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
-
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
-
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
-
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
-
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
-
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
-
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
-
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
-
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
-
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
-
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
-
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
-
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
-
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
-
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
-
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
-
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
-
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
-
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
-
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
-
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
-
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
-
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
-
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
-
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
-
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
-
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
-
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
-
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
-
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
-
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
-
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
-
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
-
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
-
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
-
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
-
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
-
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
-
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
-
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
-
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
-
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
-
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
-
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
-
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
-
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
-
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
-
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
-
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
-
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
-
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
-
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
-
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
-
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
-
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
-
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
-
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
-
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
-
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
-
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
-
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
-
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
-
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
-
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
-
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
-
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
-
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
-
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
-
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
-
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
-
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
-
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
-
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
-
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
-
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
-
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
-
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
-
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
-
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
-
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
-
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
-
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
-
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
-
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
-
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
-
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
-
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
-
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
-
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
-
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
-
<a name='L311'></a><a href='#L311'>311</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
377
|
-
<span class="cline-any cline-neutral"> </span>
|
|
378
|
-
<span class="cline-any cline-neutral"> </span>
|
|
379
|
-
<span class="cline-any cline-neutral"> </span>
|
|
380
|
-
<span class="cline-any cline-yes">4x</span>
|
|
381
|
-
<span class="cline-any cline-yes">4x</span>
|
|
382
|
-
<span class="cline-any cline-yes">4x</span>
|
|
383
|
-
<span class="cline-any cline-yes">4x</span>
|
|
384
|
-
<span class="cline-any cline-neutral"> </span>
|
|
385
|
-
<span class="cline-any cline-neutral"> </span>
|
|
386
|
-
<span class="cline-any cline-neutral"> </span>
|
|
387
|
-
<span class="cline-any cline-neutral"> </span>
|
|
388
|
-
<span class="cline-any cline-yes">103x</span>
|
|
389
|
-
<span class="cline-any cline-yes">103x</span>
|
|
390
|
-
<span class="cline-any cline-neutral"> </span>
|
|
391
|
-
<span class="cline-any cline-neutral"> </span>
|
|
392
|
-
<span class="cline-any cline-neutral"> </span>
|
|
393
|
-
<span class="cline-any cline-neutral"> </span>
|
|
394
|
-
<span class="cline-any cline-neutral"> </span>
|
|
395
|
-
<span class="cline-any cline-yes">8x</span>
|
|
396
|
-
<span class="cline-any cline-yes">14x</span>
|
|
397
|
-
<span class="cline-any cline-yes">7x</span>
|
|
398
|
-
<span class="cline-any cline-yes">7x</span>
|
|
399
|
-
<span class="cline-any cline-yes">7x</span>
|
|
400
|
-
<span class="cline-any cline-yes">7x</span>
|
|
401
|
-
<span class="cline-any cline-yes">7x</span>
|
|
402
|
-
<span class="cline-any cline-yes">7x</span>
|
|
403
|
-
<span class="cline-any cline-neutral"> </span>
|
|
404
|
-
<span class="cline-any cline-neutral"> </span>
|
|
405
|
-
<span class="cline-any cline-neutral"> </span>
|
|
406
|
-
<span class="cline-any cline-yes">83x</span>
|
|
407
|
-
<span class="cline-any cline-yes">83x</span>
|
|
408
|
-
<span class="cline-any cline-yes">83x</span>
|
|
409
|
-
<span class="cline-any cline-yes">1x</span>
|
|
410
|
-
<span class="cline-any cline-neutral"> </span>
|
|
411
|
-
<span class="cline-any cline-yes">83x</span>
|
|
412
|
-
<span class="cline-any cline-neutral"> </span>
|
|
413
|
-
<span class="cline-any cline-neutral"> </span>
|
|
414
|
-
<span class="cline-any cline-neutral"> </span>
|
|
415
|
-
<span class="cline-any cline-neutral"> </span>
|
|
416
|
-
<span class="cline-any cline-neutral"> </span>
|
|
417
|
-
<span class="cline-any cline-neutral"> </span>
|
|
418
|
-
<span class="cline-any cline-yes">42x</span>
|
|
419
|
-
<span class="cline-any cline-yes">42x</span>
|
|
420
|
-
<span class="cline-any cline-yes">14x</span>
|
|
421
|
-
<span class="cline-any cline-neutral"> </span>
|
|
422
|
-
<span class="cline-any cline-yes">42x</span>
|
|
423
|
-
<span class="cline-any cline-neutral"> </span>
|
|
424
|
-
<span class="cline-any cline-neutral"> </span>
|
|
425
|
-
<span class="cline-any cline-neutral"> </span>
|
|
426
|
-
<span class="cline-any cline-neutral"> </span>
|
|
427
|
-
<span class="cline-any cline-neutral"> </span>
|
|
428
|
-
<span class="cline-any cline-neutral"> </span>
|
|
429
|
-
<span class="cline-any cline-yes">42x</span>
|
|
430
|
-
<span class="cline-any cline-yes">42x</span>
|
|
431
|
-
<span class="cline-any cline-neutral"> </span>
|
|
432
|
-
<span class="cline-any cline-yes">42x</span>
|
|
433
|
-
<span class="cline-any cline-yes">15x</span>
|
|
434
|
-
<span class="cline-any cline-yes">2x</span>
|
|
435
|
-
<span class="cline-any cline-neutral"> </span>
|
|
436
|
-
<span class="cline-any cline-yes">14x</span>
|
|
437
|
-
<span class="cline-any cline-yes">14x</span>
|
|
438
|
-
<span class="cline-any cline-yes">14x</span>
|
|
439
|
-
<span class="cline-any cline-neutral"> </span>
|
|
440
|
-
<span class="cline-any cline-neutral"> </span>
|
|
441
|
-
<span class="cline-any cline-yes">27x</span>
|
|
442
|
-
<span class="cline-any cline-neutral"> </span>
|
|
443
|
-
<span class="cline-any cline-yes">43x</span>
|
|
444
|
-
<span class="cline-any cline-neutral"> </span>
|
|
445
|
-
<span class="cline-any cline-neutral"> </span>
|
|
446
|
-
<span class="cline-any cline-neutral"> </span>
|
|
447
|
-
<span class="cline-any cline-yes">45x</span>
|
|
448
|
-
<span class="cline-any cline-yes">32x</span>
|
|
449
|
-
<span class="cline-any cline-yes">21x</span>
|
|
450
|
-
<span class="cline-any cline-neutral"> </span>
|
|
451
|
-
<span class="cline-any cline-neutral"> </span>
|
|
452
|
-
<span class="cline-any cline-neutral"> </span>
|
|
453
|
-
<span class="cline-any cline-yes">11x</span>
|
|
454
|
-
<span class="cline-any cline-neutral"> </span>
|
|
455
|
-
<span class="cline-any cline-neutral"> </span>
|
|
456
|
-
<span class="cline-any cline-neutral"> </span>
|
|
457
|
-
<span class="cline-any cline-neutral"> </span>
|
|
458
|
-
<span class="cline-any cline-neutral"> </span>
|
|
459
|
-
<span class="cline-any cline-neutral"> </span>
|
|
460
|
-
<span class="cline-any cline-neutral"> </span>
|
|
461
|
-
<span class="cline-any cline-neutral"> </span>
|
|
462
|
-
<span class="cline-any cline-neutral"> </span>
|
|
463
|
-
<span class="cline-any cline-neutral"> </span>
|
|
464
|
-
<span class="cline-any cline-neutral"> </span>
|
|
465
|
-
<span class="cline-any cline-neutral"> </span>
|
|
466
|
-
<span class="cline-any cline-yes">8x</span>
|
|
467
|
-
<span class="cline-any cline-yes">8x</span>
|
|
468
|
-
<span class="cline-any cline-yes">8x</span>
|
|
469
|
-
<span class="cline-any cline-yes">1x</span>
|
|
470
|
-
<span class="cline-any cline-neutral"> </span>
|
|
471
|
-
<span class="cline-any cline-yes">7x</span>
|
|
472
|
-
<span class="cline-any cline-yes">7x</span>
|
|
473
|
-
<span class="cline-any cline-neutral"> </span>
|
|
474
|
-
<span class="cline-any cline-neutral"> </span>
|
|
475
|
-
<span class="cline-any cline-neutral"> </span>
|
|
476
|
-
<span class="cline-any cline-neutral"> </span>
|
|
477
|
-
<span class="cline-any cline-neutral"> </span>
|
|
478
|
-
<span class="cline-any cline-neutral"> </span>
|
|
479
|
-
<span class="cline-any cline-yes">7x</span>
|
|
480
|
-
<span class="cline-any cline-neutral"> </span>
|
|
481
|
-
<span class="cline-any cline-neutral"> </span>
|
|
482
|
-
<span class="cline-any cline-neutral"> </span>
|
|
483
|
-
<span class="cline-any cline-neutral"> </span>
|
|
484
|
-
<span class="cline-any cline-neutral"> </span>
|
|
485
|
-
<span class="cline-any cline-neutral"> </span>
|
|
486
|
-
<span class="cline-any cline-yes">7x</span>
|
|
487
|
-
<span class="cline-any cline-neutral"> </span>
|
|
488
|
-
<span class="cline-any cline-neutral"> </span>
|
|
489
|
-
<span class="cline-any cline-neutral"> </span>
|
|
490
|
-
<span class="cline-any cline-neutral"> </span>
|
|
491
|
-
<span class="cline-any cline-neutral"> </span>
|
|
492
|
-
<span class="cline-any cline-neutral"> </span>
|
|
493
|
-
<span class="cline-any cline-neutral"> </span>
|
|
494
|
-
<span class="cline-any cline-yes">7x</span>
|
|
495
|
-
<span class="cline-any cline-neutral"> </span>
|
|
496
|
-
<span class="cline-any cline-neutral"> </span>
|
|
497
|
-
<span class="cline-any cline-neutral"> </span>
|
|
498
|
-
<span class="cline-any cline-neutral"> </span>
|
|
499
|
-
<span class="cline-any cline-neutral"> </span>
|
|
500
|
-
<span class="cline-any cline-neutral"> </span>
|
|
501
|
-
<span class="cline-any cline-neutral"> </span>
|
|
502
|
-
<span class="cline-any cline-yes">7x</span>
|
|
503
|
-
<span class="cline-any cline-neutral"> </span>
|
|
504
|
-
<span class="cline-any cline-yes">7x</span>
|
|
505
|
-
<span class="cline-any cline-neutral"> </span>
|
|
506
|
-
<span class="cline-any cline-neutral"> </span>
|
|
507
|
-
<span class="cline-any cline-neutral"> </span>
|
|
508
|
-
<span class="cline-any cline-neutral"> </span>
|
|
509
|
-
<span class="cline-any cline-yes">7x</span>
|
|
510
|
-
<span class="cline-any cline-yes">7x</span>
|
|
511
|
-
<span class="cline-any cline-yes">7x</span>
|
|
512
|
-
<span class="cline-any cline-neutral"> </span>
|
|
513
|
-
<span class="cline-any cline-yes">7x</span>
|
|
514
|
-
<span class="cline-any cline-yes">7x</span>
|
|
515
|
-
<span class="cline-any cline-yes">7x</span>
|
|
516
|
-
<span class="cline-any cline-neutral"> </span>
|
|
517
|
-
<span class="cline-any cline-yes">7x</span>
|
|
518
|
-
<span class="cline-any cline-neutral"> </span>
|
|
519
|
-
<span class="cline-any cline-neutral"> </span>
|
|
520
|
-
<span class="cline-any cline-neutral"> </span>
|
|
521
|
-
<span class="cline-any cline-neutral"> </span>
|
|
522
|
-
<span class="cline-any cline-neutral"> </span>
|
|
523
|
-
<span class="cline-any cline-neutral"> </span>
|
|
524
|
-
<span class="cline-any cline-neutral"> </span>
|
|
525
|
-
<span class="cline-any cline-yes">53x</span>
|
|
526
|
-
<span class="cline-any cline-neutral"> </span>
|
|
527
|
-
<span class="cline-any cline-yes">53x</span>
|
|
528
|
-
<span class="cline-any cline-yes">8x</span>
|
|
529
|
-
<span class="cline-any cline-neutral"> </span>
|
|
530
|
-
<span class="cline-any cline-yes">45x</span>
|
|
531
|
-
<span class="cline-any cline-yes">17x</span>
|
|
532
|
-
<span class="cline-any cline-neutral"> </span>
|
|
533
|
-
<span class="cline-any cline-yes">29x</span>
|
|
534
|
-
<span class="cline-any cline-yes">28x</span>
|
|
535
|
-
<span class="cline-any cline-yes">19x</span>
|
|
536
|
-
<span class="cline-any cline-yes">19x</span>
|
|
537
|
-
<span class="cline-any cline-yes">19x</span>
|
|
538
|
-
<span class="cline-any cline-yes">26x</span>
|
|
539
|
-
<span class="cline-any cline-yes">26x</span>
|
|
540
|
-
<span class="cline-any cline-yes">26x</span>
|
|
541
|
-
<span class="cline-any cline-neutral"> </span>
|
|
542
|
-
<span class="cline-any cline-yes">20x</span>
|
|
543
|
-
<span class="cline-any cline-yes">20x</span>
|
|
544
|
-
<span class="cline-any cline-yes">20x</span>
|
|
545
|
-
<span class="cline-any cline-yes">19x</span>
|
|
546
|
-
<span class="cline-any cline-yes">19x</span>
|
|
547
|
-
<span class="cline-any cline-yes">20x</span>
|
|
548
|
-
<span class="cline-any cline-neutral"> </span>
|
|
549
|
-
<span class="cline-any cline-yes">19x</span>
|
|
550
|
-
<span class="cline-any cline-neutral"> </span>
|
|
551
|
-
<span class="cline-any cline-yes">9x</span>
|
|
552
|
-
<span class="cline-any cline-neutral"> </span>
|
|
553
|
-
<span class="cline-any cline-neutral"> </span>
|
|
554
|
-
<span class="cline-any cline-neutral"> </span>
|
|
555
|
-
<span class="cline-any cline-neutral"> </span>
|
|
556
|
-
<span class="cline-any cline-neutral"> </span>
|
|
557
|
-
<span class="cline-any cline-yes">4x</span>
|
|
558
|
-
<span class="cline-any cline-neutral"> </span>
|
|
559
|
-
<span class="cline-any cline-neutral"> </span>
|
|
560
|
-
<span class="cline-any cline-neutral"> </span>
|
|
561
|
-
<span class="cline-any cline-yes">83x</span>
|
|
562
|
-
<span class="cline-any cline-yes">1x</span>
|
|
563
|
-
<span class="cline-any cline-neutral"> </span>
|
|
564
|
-
<span class="cline-any cline-neutral"> </span>
|
|
565
|
-
<span class="cline-any cline-yes">82x</span>
|
|
566
|
-
<span class="cline-any cline-yes">82x</span>
|
|
567
|
-
<span class="cline-any cline-neutral"> </span>
|
|
568
|
-
<span class="cline-any cline-neutral"> </span>
|
|
569
|
-
<span class="cline-any cline-neutral"> </span>
|
|
570
|
-
<span class="cline-any cline-neutral"> </span>
|
|
571
|
-
<span class="cline-any cline-neutral"> </span>
|
|
572
|
-
<span class="cline-any cline-neutral"> </span>
|
|
573
|
-
<span class="cline-any cline-neutral"> </span>
|
|
574
|
-
<span class="cline-any cline-neutral"> </span>
|
|
575
|
-
<span class="cline-any cline-neutral"> </span>
|
|
576
|
-
<span class="cline-any cline-yes">82x</span>
|
|
577
|
-
<span class="cline-any cline-yes">82x</span>
|
|
578
|
-
<span class="cline-any cline-yes">49x</span>
|
|
579
|
-
<span class="cline-any cline-yes">49x</span>
|
|
580
|
-
<span class="cline-any cline-yes">28x</span>
|
|
581
|
-
<span class="cline-any cline-yes">28x</span>
|
|
582
|
-
<span class="cline-any cline-yes">28x</span>
|
|
583
|
-
<span class="cline-any cline-neutral"> </span>
|
|
584
|
-
<span class="cline-any cline-yes">28x</span>
|
|
585
|
-
<span class="cline-any cline-yes">49x</span>
|
|
586
|
-
<span class="cline-any cline-yes">49x</span>
|
|
587
|
-
<span class="cline-any cline-yes">49x</span>
|
|
588
|
-
<span class="cline-any cline-yes">49x</span>
|
|
589
|
-
<span class="cline-any cline-neutral"> </span>
|
|
590
|
-
<span class="cline-any cline-neutral"> </span>
|
|
591
|
-
<span class="cline-any cline-neutral"> </span>
|
|
592
|
-
<span class="cline-any cline-yes">49x</span>
|
|
593
|
-
<span class="cline-any cline-yes">13x</span>
|
|
594
|
-
<span class="cline-any cline-yes">13x</span>
|
|
595
|
-
<span class="cline-any cline-neutral"> </span>
|
|
596
|
-
<span class="cline-any cline-neutral"> </span>
|
|
597
|
-
<span class="cline-any cline-neutral"> </span>
|
|
598
|
-
<span class="cline-any cline-neutral"> </span>
|
|
599
|
-
<span class="cline-any cline-neutral"> </span>
|
|
600
|
-
<span class="cline-any cline-yes">36x</span>
|
|
601
|
-
<span class="cline-any cline-neutral"> </span>
|
|
602
|
-
<span class="cline-any cline-neutral"> </span>
|
|
603
|
-
<span class="cline-any cline-neutral"> </span>
|
|
604
|
-
<span class="cline-any cline-yes">36x</span>
|
|
605
|
-
<span class="cline-any cline-yes">36x</span>
|
|
606
|
-
<span class="cline-any cline-yes">20x</span>
|
|
607
|
-
<span class="cline-any cline-yes">18x</span>
|
|
608
|
-
<span class="cline-any cline-yes">18x</span>
|
|
609
|
-
<span class="cline-any cline-neutral"> </span>
|
|
610
|
-
<span class="cline-any cline-yes">36x</span>
|
|
611
|
-
<span class="cline-any cline-yes">36x</span>
|
|
612
|
-
<span class="cline-any cline-yes">36x</span>
|
|
613
|
-
<span class="cline-any cline-neutral"> </span>
|
|
614
|
-
<span class="cline-any cline-neutral"> </span>
|
|
615
|
-
<span class="cline-any cline-yes">28x</span>
|
|
616
|
-
<span class="cline-any cline-yes">48x</span>
|
|
617
|
-
<span class="cline-any cline-neutral"> </span>
|
|
618
|
-
<span class="cline-any cline-neutral"> </span>
|
|
619
|
-
<span class="cline-any cline-neutral"> </span>
|
|
620
|
-
<span class="cline-any cline-neutral"> </span>
|
|
621
|
-
<span class="cline-any cline-neutral"> </span>
|
|
622
|
-
<span class="cline-any cline-yes">28x</span>
|
|
623
|
-
<span class="cline-any cline-neutral"> </span>
|
|
624
|
-
<span class="cline-any cline-neutral"> </span>
|
|
625
|
-
<span class="cline-any cline-neutral"> </span>
|
|
626
|
-
<span class="cline-any cline-yes">28x</span>
|
|
627
|
-
<span class="cline-any cline-yes">3x</span>
|
|
628
|
-
<span class="cline-any cline-yes">2x</span>
|
|
629
|
-
<span class="cline-any cline-yes">4x</span>
|
|
630
|
-
<span class="cline-any cline-yes">2x</span>
|
|
631
|
-
<span class="cline-any cline-neutral"> </span>
|
|
632
|
-
<span class="cline-any cline-neutral"> </span>
|
|
633
|
-
<span class="cline-any cline-yes">54x</span>
|
|
634
|
-
<span class="cline-any cline-yes">54x</span>
|
|
635
|
-
<span class="cline-any cline-yes">54x</span>
|
|
636
|
-
<span class="cline-any cline-yes">54x</span>
|
|
637
|
-
<span class="cline-any cline-neutral"> </span>
|
|
638
|
-
<span class="cline-any cline-neutral"> </span>
|
|
639
|
-
<span class="cline-any cline-yes">54x</span>
|
|
640
|
-
<span class="cline-any cline-yes">54x</span>
|
|
641
|
-
<span class="cline-any cline-yes">35x</span>
|
|
642
|
-
<span class="cline-any cline-yes">33x</span>
|
|
643
|
-
<span class="cline-any cline-yes">33x</span>
|
|
644
|
-
<span class="cline-any cline-neutral"> </span>
|
|
645
|
-
<span class="cline-any cline-neutral"> </span>
|
|
646
|
-
<span class="cline-any cline-neutral"> </span>
|
|
647
|
-
<span class="cline-any cline-neutral"> </span>
|
|
648
|
-
<span class="cline-any cline-neutral"> </span>
|
|
649
|
-
<span class="cline-any cline-neutral"> </span>
|
|
650
|
-
<span class="cline-any cline-yes">82x</span>
|
|
651
|
-
<span class="cline-any cline-yes">82x</span>
|
|
652
|
-
<span class="cline-any cline-yes">5x</span>
|
|
653
|
-
<span class="cline-any cline-yes">1x</span>
|
|
654
|
-
<span class="cline-any cline-yes">3x</span>
|
|
655
|
-
<span class="cline-any cline-yes">2x</span>
|
|
656
|
-
<span class="cline-any cline-yes">2x</span>
|
|
657
|
-
<span class="cline-any cline-neutral"> </span>
|
|
658
|
-
<span class="cline-any cline-neutral"> </span>
|
|
659
|
-
<span class="cline-any cline-yes">4x</span>
|
|
660
|
-
<span class="cline-any cline-neutral"> </span>
|
|
661
|
-
<span class="cline-any cline-neutral"> </span>
|
|
662
|
-
<span class="cline-any cline-neutral"> </span>
|
|
663
|
-
<span class="cline-any cline-neutral"> </span>
|
|
664
|
-
<span class="cline-any cline-neutral"> </span>
|
|
665
|
-
<span class="cline-any cline-neutral"> </span>
|
|
666
|
-
<span class="cline-any cline-neutral"> </span>
|
|
667
|
-
<span class="cline-any cline-neutral"> </span>
|
|
668
|
-
<span class="cline-any cline-yes">82x</span>
|
|
669
|
-
<span class="cline-any cline-yes">82x</span>
|
|
670
|
-
<span class="cline-any cline-yes">82x</span>
|
|
671
|
-
<span class="cline-any cline-yes">82x</span>
|
|
672
|
-
<span class="cline-any cline-yes">82x</span>
|
|
673
|
-
<span class="cline-any cline-neutral"> </span>
|
|
674
|
-
<span class="cline-any cline-neutral"> </span>
|
|
675
|
-
<span class="cline-any cline-neutral"> </span>
|
|
676
|
-
<span class="cline-any cline-neutral"> </span>
|
|
677
|
-
<span class="cline-any cline-neutral"> </span>
|
|
678
|
-
<span class="cline-any cline-neutral"> </span>
|
|
679
|
-
<span class="cline-any cline-neutral"> </span>
|
|
680
|
-
<span class="cline-any cline-neutral"> </span>
|
|
681
|
-
<span class="cline-any cline-neutral"> </span>
|
|
682
|
-
<span class="cline-any cline-yes">49x</span>
|
|
683
|
-
<span class="cline-any cline-neutral"> </span>
|
|
684
|
-
<span class="cline-any cline-neutral"> </span>
|
|
685
|
-
<span class="cline-any cline-neutral"> </span>
|
|
686
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {
|
|
687
|
-
PricingRules, PricingField, PricingOption, Selections, FieldSelection,
|
|
688
|
-
QuoteResult, UnsupportedResult, DiscountGroup,
|
|
689
|
-
} from './types.js';
|
|
690
|
-
import { applyDiscount } from './discount.js';
|
|
691
|
-
import { roundHalfEven } from './round.js';
|
|
692
|
-
import { resolveVisibleFields } from './visibility.js';
|
|
693
|
-
import { FieldType } from '../constants/field_types.js';
|
|
694
|
-
|
|
695
|
-
/** Form inputs often supply quantities as strings. Coerce before any arithmetic
|
|
696
|
-
* so `reduce((a,b)=>a+b)` cannot concatenate ("100"+"1" → "01001" → 1001). */
|
|
697
|
-
function toQuantity(value: unknown): number {
|
|
698
|
-
const n = Number(value);
|
|
699
|
-
return Number.isFinite(n) ? n : 0;
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
function parseAreaMm(
|
|
703
|
-
value: string | number | null | undefined
|
|
704
|
-
): { heightMm: number; widthMm: number } | null {
|
|
705
|
-
if (value === undefined || value === null || value === '') return null;
|
|
706
|
-
const parts = String(value).split(',').map((p) => p.trim());
|
|
707
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (parts.length !== 2) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
708
|
-
const heightMm = Number(parts[0]);
|
|
709
|
-
const widthMm = Number(parts[1]);
|
|
710
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!Number.isFinite(heightMm) || !Number.isFinite(widthMm)) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
711
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (heightMm <= 0 || widthMm <= 0) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
712
|
-
return { heightMm, widthMm };
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
function unitPriceAt(rules: PricingRules, qty: number): number {
|
|
716
|
-
let unitPrice = applyDiscount(rules.product.unitPrice, qty, rules.product.discountGroup);
|
|
717
|
-
const mop = rules.product.minimumPrice;
|
|
718
|
-
if (qty > 0 && mop && unitPrice * qty < mop) {
|
|
719
|
-
unitPrice = mop / qty;
|
|
720
|
-
}
|
|
721
|
-
return unitPrice;
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
function variationSetupCost(
|
|
725
|
-
source: { variationCost: number; variationCostDiscountGroup: DiscountGroup | null },
|
|
726
|
-
totalQty: number
|
|
727
|
-
): number {
|
|
728
|
-
let cost = source.variationCost;
|
|
729
|
-
if (source.variationCostDiscountGroup) {
|
|
730
|
-
cost = applyDiscount(cost, totalQty, source.variationCostDiscountGroup);
|
|
731
|
-
}
|
|
732
|
-
return roundHalfEven(cost, 3);
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
function variationUnitCosts(
|
|
736
|
-
source: { variationUnitCost: number; variationUnitCostDiscountGroup: DiscountGroup | null },
|
|
737
|
-
groupQuantities: number[]
|
|
738
|
-
): number[] {
|
|
739
|
-
const uc = source.variationUnitCost;
|
|
740
|
-
const group = source.variationUnitCostDiscountGroup;
|
|
741
|
-
let list: number[];
|
|
742
|
-
if (group) {
|
|
743
|
-
if (group.groupRestricted) {
|
|
744
|
-
list = groupQuantities.map((q) => applyDiscount(uc, q, group));
|
|
745
|
-
} else {
|
|
746
|
-
const total = groupQuantities.reduce((a, b) => a + b, 0);
|
|
747
|
-
const discounted = applyDiscount(uc, total, group);
|
|
748
|
-
list = groupQuantities.map(() => discounted);
|
|
749
|
-
}
|
|
750
|
-
} else {
|
|
751
|
-
list = groupQuantities.map(() => uc);
|
|
752
|
-
}
|
|
753
|
-
return list.map((c) => roundHalfEven(c, 3));
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
function isEmpty(field: PricingField, sel: FieldSelection | undefined): boolean {
|
|
757
|
-
if (!sel) return true;
|
|
758
|
-
if (field.isSelectable) {
|
|
759
|
-
return !sel.selectedOptionIds || sel.selectedOptionIds.length === 0;
|
|
760
|
-
}
|
|
761
|
-
// Server `is_empty` non-selectable branch is `return not self.value`, so
|
|
762
|
-
// numeric 0 is empty (but string '0' stays non-empty, since `not '0'` is False).
|
|
763
|
-
return (
|
|
764
|
-
sel.value === undefined ||
|
|
765
|
-
sel.value === null ||
|
|
766
|
-
sel.value === '' ||
|
|
767
|
-
sel.value === 0
|
|
768
|
-
);
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
function areaCostFactor(
|
|
772
|
-
field: PricingField,
|
|
773
|
-
sel: FieldSelection | undefined,
|
|
774
|
-
groupQuantities: number[]
|
|
775
|
-
): { setup: number; unitList: number[] } {
|
|
776
|
-
const n = groupQuantities.length;
|
|
777
|
-
const parsed = parseAreaMm(sel<span class="branch-0 cbranch-no" title="branch not covered" >?.v</span>alue ?? <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>;
|
|
778
|
-
if (!parsed) {
|
|
779
|
-
return { setup: 0, unitList: new Array(n).fill(0) };
|
|
780
|
-
}
|
|
781
|
-
const totalQty = groupQuantities.reduce((a, b) => a + b, 0);
|
|
782
|
-
const heightSetup = variationSetupCost(
|
|
783
|
-
{
|
|
784
|
-
variationCost: field.heightVariationCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
|
|
785
|
-
variationCostDiscountGroup: field.heightVariationCostDiscountGroup ?? null,
|
|
786
|
-
},
|
|
787
|
-
totalQty
|
|
788
|
-
);
|
|
789
|
-
const widthSetup = variationSetupCost(
|
|
790
|
-
{
|
|
791
|
-
variationCost: field.widthVariationCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
|
|
792
|
-
variationCostDiscountGroup: field.widthVariationCostDiscountGroup ?? null,
|
|
793
|
-
},
|
|
794
|
-
totalQty
|
|
795
|
-
);
|
|
796
|
-
const heightUcs = variationUnitCosts(
|
|
797
|
-
{
|
|
798
|
-
variationUnitCost: field.heightVariationUnitCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
|
|
799
|
-
variationUnitCostDiscountGroup:
|
|
800
|
-
field.heightVariationUnitCostDiscountGroup ?? null,
|
|
801
|
-
},
|
|
802
|
-
groupQuantities
|
|
803
|
-
);
|
|
804
|
-
const widthUcs = variationUnitCosts(
|
|
805
|
-
{
|
|
806
|
-
variationUnitCost: field.widthVariationUnitCost || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
|
|
807
|
-
variationUnitCostDiscountGroup:
|
|
808
|
-
field.widthVariationUnitCostDiscountGroup ?? null,
|
|
809
|
-
},
|
|
810
|
-
groupQuantities
|
|
811
|
-
);
|
|
812
|
-
const areaUnit = (field.areaUnit || 'mm').toLowerCase();
|
|
813
|
-
const mmPerUnit =
|
|
814
|
-
areaUnit === 'm' ? <span class="branch-0 cbranch-no" title="branch not covered" >1000</span>
|
|
815
|
-
: areaUnit === 'cm' ? <span class="branch-0 cbranch-no" title="branch not covered" >10</span>
|
|
816
|
-
: areaUnit === 'in' || areaUnit === 'inch' || areaUnit === 'inches' ? <span class="branch-0 cbranch-no" title="branch not covered" >25.4</span>
|
|
817
|
-
: areaUnit === 'ft' || areaUnit === 'foot' || areaUnit === 'feet' ? <span class="branch-0 cbranch-no" title="branch not covered" >304.8</span>
|
|
818
|
-
: 1;
|
|
819
|
-
const heightU = parsed.heightMm / mmPerUnit;
|
|
820
|
-
const widthU = parsed.widthMm / mmPerUnit;
|
|
821
|
-
const area = heightU * widthU;
|
|
822
|
-
// onceOff/unit = rateH × rateW × height_u × width_u (in field areaUnit)
|
|
823
|
-
const setup = roundHalfEven(heightSetup * widthSetup * area, 3);
|
|
824
|
-
const unitList = heightUcs.map((hu, i) =>
|
|
825
|
-
roundHalfEven(hu * widthUcs[i] * area, 3)
|
|
826
|
-
);
|
|
827
|
-
return { setup, unitList };
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
function costFactor(
|
|
831
|
-
field: PricingField,
|
|
832
|
-
sel: FieldSelection | undefined,
|
|
833
|
-
groupQuantities: number[]
|
|
834
|
-
): { setup: number; unitList: number[] } {
|
|
835
|
-
const n = groupQuantities.length;
|
|
836
|
-
// Coerce: JSON/APIs occasionally deliver fieldType as a string.
|
|
837
|
-
if (Number(field.fieldType) === FieldType.AREA) {
|
|
838
|
-
return areaCostFactor(field, sel, groupQuantities);
|
|
839
|
-
}
|
|
840
|
-
if (isEmpty(field, sel)) {
|
|
841
|
-
return { setup: 0, unitList: new Array(n).fill(0) };
|
|
842
|
-
}
|
|
843
|
-
const totalQty = groupQuantities.reduce((a, b) => a + b, 0);
|
|
844
|
-
if (field.isSelectable) {
|
|
845
|
-
let setup = 0;
|
|
846
|
-
const unitList = new Array(n).fill(0);
|
|
847
|
-
const optById = new Map<number, PricingOption>();
|
|
848
|
-
for (const o of field.options) {
|
|
849
|
-
optById.set(o.id, o);
|
|
850
|
-
if (o.originalId != null) optById.set(o.originalId, o);
|
|
851
|
-
}
|
|
852
|
-
for (const optId of sel!.selectedOptionIds!) {
|
|
853
|
-
const opt = optById.get(optId);
|
|
854
|
-
if (!opt) continue;
|
|
855
|
-
setup += variationSetupCost(opt, totalQty);
|
|
856
|
-
const ucs = variationUnitCosts(opt, groupQuantities);
|
|
857
|
-
for (let i = 0; i < n; i++) unitList[i] += ucs[i];
|
|
858
|
-
}
|
|
859
|
-
return { setup, unitList };
|
|
860
|
-
}
|
|
861
|
-
return {
|
|
862
|
-
setup: variationSetupCost(field, totalQty),
|
|
863
|
-
unitList: variationUnitCosts(field, groupQuantities),
|
|
864
|
-
};
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
export function estimateQuote(
|
|
868
|
-
rules: PricingRules,
|
|
869
|
-
selections: Selections
|
|
870
|
-
): QuoteResult | UnsupportedResult {
|
|
871
|
-
if (rules.unsupported) {
|
|
872
|
-
return { unsupported: rules.unsupported };
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
const groupCosts: number[] = [];
|
|
876
|
-
let cost = 0;
|
|
877
|
-
let costPerUnit: number;
|
|
878
|
-
let groupQuantities: number[];
|
|
879
|
-
|
|
880
|
-
// Mirror the server's `update_group_variations_cost_and_job_cost`
|
|
881
|
-
// (jobs.py ~3321): the group-vs-single branch keys off whether the *job*
|
|
882
|
-
// actually has variation groups (`if self.variations_groups:`), NOT the
|
|
883
|
-
// product's `hasGroups` capability. A group-capable product with no groups
|
|
884
|
-
// submitted is priced as a single non-group job (the server's `else` branch
|
|
885
|
-
// sets `group_quantities = [self.quantity or 0]`).
|
|
886
|
-
const groups = selections.groups || [];
|
|
887
|
-
if (groups.length > 0) {
|
|
888
|
-
groupQuantities = groups.map((g) => toQuantity(g.quantity));
|
|
889
|
-
const totalQty = groupQuantities.reduce((a, b) => a + b, 0);
|
|
890
|
-
const restricted = Boolean(rules.product.discountGroup?.groupRestricted);
|
|
891
|
-
const baseUnitPrice = unitPriceAt(rules, totalQty);
|
|
892
|
-
const perGroupCpu: number[] = [];
|
|
893
|
-
|
|
894
|
-
for (let gi = 0; gi < groups.length; gi++) {
|
|
895
|
-
const group = groups[gi];
|
|
896
|
-
const gQty = groupQuantities[gi];
|
|
897
|
-
const cpu = restricted ? unitPriceAt(rules, gQty) : baseUnitPrice;
|
|
898
|
-
perGroupCpu.push(cpu);
|
|
899
|
-
// Server `VariationsGroups.update_cost` (variations_groups.py ~238):
|
|
900
|
-
// `if not self.quantity: self.group_cost = 0; return` — a zero-qty group
|
|
901
|
-
// contributes exactly 0 and adds NO field/variation costs.
|
|
902
|
-
if (!gQty) {
|
|
903
|
-
groupCosts.push(0);
|
|
904
|
-
continue;
|
|
905
|
-
}
|
|
906
|
-
// A group's field visibility is scoped to that group's own selections
|
|
907
|
-
// plus the job-level (independent) selections — NOT other groups'
|
|
908
|
-
// (server `VariationsGroups.selected_options` = group.variations +
|
|
909
|
-
// job.variations, variations_groups.py ~252).
|
|
910
|
-
const groupVisible = resolveVisibleFields(rules, {
|
|
911
|
-
fieldValues: selections.fieldValues,
|
|
912
|
-
groups: [group],
|
|
913
|
-
});
|
|
914
|
-
let groupVariationCost = 0;
|
|
915
|
-
for (const field of rules.groupFields) {
|
|
916
|
-
if (!groupVisible.has(field.id)) continue;
|
|
917
|
-
const { setup, unitList } = costFactor(field, group.fieldValues[field.id], [gQty]);
|
|
918
|
-
groupVariationCost += setup + unitList[0] * gQty;
|
|
919
|
-
}
|
|
920
|
-
const groupCost = gQty * cpu + groupVariationCost;
|
|
921
|
-
groupCosts.push(groupCost);
|
|
922
|
-
cost += groupCost;
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
costPerUnit = totalQty > 0
|
|
926
|
-
? perGroupCpu.reduce((acc, cpu, i) => acc + cpu * groupQuantities[i], 0) / totalQty
|
|
927
|
-
: baseUnitPrice;
|
|
928
|
-
|
|
929
|
-
// Independent (job-level) field visibility is scoped to independent
|
|
930
|
-
// selections only (server `Jobs.selected_options` = job.variations,
|
|
931
|
-
// jobs.py ~1392), so other groups' selections never reveal them.
|
|
932
|
-
const independentVisible = resolveVisibleFields(rules, {
|
|
933
|
-
quantity: selections.quantity,
|
|
934
|
-
fieldValues: selections.fieldValues,
|
|
935
|
-
});
|
|
936
|
-
for (const field of rules.fields) {
|
|
937
|
-
if (!independentVisible.has(field.id)) continue;
|
|
938
|
-
const { setup, unitList } = costFactor(field, selections.fieldValues[field.id], groupQuantities);
|
|
939
|
-
const unitTotal = unitList.reduce((acc, uc, i) => acc + uc * groupQuantities[i], 0);
|
|
940
|
-
cost += setup + unitTotal;
|
|
941
|
-
}
|
|
942
|
-
} else {
|
|
943
|
-
const qty = toQuantity(selections.quantity);
|
|
944
|
-
groupQuantities = [qty];
|
|
945
|
-
costPerUnit = unitPriceAt(rules, qty);
|
|
946
|
-
cost = costPerUnit * qty;
|
|
947
|
-
// No groups: single-job scope (resolveVisibleFields with no groups uses
|
|
948
|
-
// only the top-level selections and considers only independent fields).
|
|
949
|
-
const visible = resolveVisibleFields(rules, selections);
|
|
950
|
-
for (const field of rules.fields) {
|
|
951
|
-
if (!visible.has(field.id)) continue;
|
|
952
|
-
const { setup, unitList } = costFactor(field, selections.fieldValues[field.id], groupQuantities);
|
|
953
|
-
cost += setup + unitList[0] * qty;
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
// Server `Jobs.apply_product_setup_price`: product setup fee once per job,
|
|
958
|
-
// or once per non-empty group when setupPerGroup is true. With no groups the
|
|
959
|
-
// job is a single group, so setup is charged once either way.
|
|
960
|
-
const setupPrice = rules.product.setupPrice || 0;
|
|
961
|
-
if (setupPrice) {
|
|
962
|
-
if (groups.length > 0 && rules.product.setupPerGroup) {
|
|
963
|
-
for (let gi = 0; gi < groups.length; gi++) {
|
|
964
|
-
if (!groupQuantities[gi]) continue;
|
|
965
|
-
groupCosts[gi] += setupPrice;
|
|
966
|
-
cost += setupPrice;
|
|
967
|
-
}
|
|
968
|
-
} else {
|
|
969
|
-
cost += setupPrice;
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
// Server `Jobs.update_cost` (jobs.py ~3452-3454) accumulates `self.cost` at
|
|
974
|
-
// full precision and computes `self.tax_amount = tax(self.cost, ...)` on the
|
|
975
|
-
// UNROUNDED cost (money_protocol.py `tax` does NOT round). `cost` and
|
|
976
|
-
// `taxAmount` are then rounded INDEPENDENTLY at serialization to 2dp
|
|
977
|
-
// (jobs.py ~2169-2171). So tax must be derived from the unrounded cost.
|
|
978
|
-
const unroundedCost = cost;
|
|
979
|
-
const roundedCost = roundHalfEven(unroundedCost, 2);
|
|
980
|
-
const unroundedTax = (unroundedCost * rules.taxPercent) / 100;
|
|
981
|
-
const taxAmount = roundHalfEven(unroundedTax, 2);
|
|
982
|
-
return {
|
|
983
|
-
costPerUnit: roundHalfEven(costPerUnit, 3),
|
|
984
|
-
cost: roundedCost,
|
|
985
|
-
taxAmount,
|
|
986
|
-
// `totalCost` mirrors `Jobs.all_total_cost` = `self.cost + self.tax_amount`
|
|
987
|
-
// (jobs.py ~1724), serialized UNROUNDED at jobs.py ~1899. We round to 3dp to
|
|
988
|
-
// strip float noise while matching the server's effective Numeric scale.
|
|
989
|
-
totalCost: roundHalfEven(unroundedCost + unroundedTax, 3),
|
|
990
|
-
// `result["groupCost"] = self.group_cost` is serialized UNROUNDED
|
|
991
|
-
// (variations_groups.py ~154); round to 3dp to match the Numeric scale.
|
|
992
|
-
groupCosts: groupCosts.map((c) => roundHalfEven(c, 3)),
|
|
993
|
-
currency: rules.currency,
|
|
994
|
-
};
|
|
995
|
-
}
|
|
996
|
-
</pre></td></tr></table></pre>
|
|
997
|
-
|
|
998
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
999
|
-
</div><!-- /wrapper -->
|
|
1000
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
1001
|
-
Code coverage generated by
|
|
1002
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1003
|
-
at 2026-09-17T00:23:15.194Z
|
|
1004
|
-
</div>
|
|
1005
|
-
<script src="../../prettify.js"></script>
|
|
1006
|
-
<script>
|
|
1007
|
-
window.onload = function () {
|
|
1008
|
-
prettyPrint();
|
|
1009
|
-
};
|
|
1010
|
-
</script>
|
|
1011
|
-
<script src="../../sorter.js"></script>
|
|
1012
|
-
<script src="../../block-navigation.js"></script>
|
|
1013
|
-
</body>
|
|
1014
|
-
</html>
|
|
1015
|
-
|