Diff -- /var/www/vhosts/3dshawn.com/repricer.3dshawn.com/_attic/shipping_settings.cgi
Diff

/var/www/vhosts/3dshawn.com/repricer.3dshawn.com/_attic/shipping_settings.cgi

added on local at 2026-07-01 21:47:35

Added
+228
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to cc612161b04d
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
1#!/usr/bin/perl
2#======================================================================
3# RePricer -- Shipping setup.
4#
5# Three sections on one page:
6# 1. Origin address + per-seller defaults
7# 2. Carriers (USPS / UPS / FedEx / DHL / Other) -- enable, save
8# account number / API creds (placeholders until live APIs land)
9# 3. Shipping zones -- the rate-rule table the estimator walks
10#======================================================================
11use strict;
12use warnings;
13
14use lib '/var/www/vhosts/3dshawn.com/repricer.3dshawn.com';
15use CGI;
16use MODS::Template;
17use MODS::DBConnect;
18use MODS::Login;
19use MODS::RePricer::Config;
20use MODS::RePricer::Wrapper;
21use MODS::RePricer::Permissions;
22use MODS::RePricer::Shipping;
23
24$| = 1;
25
26my $q = CGI->new;
27my $form = $q->Vars;
28my $auth = MODS::Login->new;
29my $tfile = MODS::Template->new;
30my $db = MODS::DBConnect->new;
31my $cfg = MODS::RePricer::Config->new;
32my $wrap = MODS::RePricer::Wrapper->new;
33my $perm = MODS::RePricer::Permissions->new;
34my $ship = MODS::RePricer::Shipping->new;
35my $DB = $cfg->settings('database_name');
36
37my $userinfo = $auth->login_verify();
38unless ($userinfo) {
39 print "Status: 302 Found\nLocation: /login.cgi?return=/shipping_settings.cgi\n\n"; exit;
40}
41$perm->require_feature($userinfo, 'edit_models');
42
43my $uid = $userinfo->{user_id}; $uid =~ s/[^0-9]//g;
44my $owner_uid = $userinfo->{owner_user_id} || $uid;
45$owner_uid =~ s/[^0-9]//g;
46
47my $dbh = $db->db_connect();
48
49unless ($ship->schema_ready($db, $dbh, $DB)) {
50 $db->db_disconnect($dbh);
51 print "Content-Type: text/html; charset=utf-8\n\n";
52 $wrap->render({
53 userinfo => $userinfo,
54 page_key => 'shipping',
55 title => 'Shipping setup',
56 body => qq~<div class="module"><div class="module-body" style="padding:40px;text-align:center">
57 <h1 style="font-family:var(--font-display);color:#fff">Shipping not installed yet</h1>
58 <p style="color:var(--col-text-2);margin-top:12px">Run the fulfillment migration, then refresh.</p>
59 </div></div>~,
60 });
61 exit;
62}
63
64# POST handler
65if (($ENV{REQUEST_METHOD} || '') eq 'POST') {
66 my $act = lc($form->{_act} || ''); $act =~ s/[^a-z_]//g;
67 if ($act eq 'save_origin') {
68 $ship->save_settings($db, $dbh, $DB, $owner_uid,
69 origin_name => $form->{origin_name},
70 origin_company => $form->{origin_company},
71 origin_line1 => $form->{origin_line1},
72 origin_line2 => $form->{origin_line2},
73 origin_city => $form->{origin_city},
74 origin_region => $form->{origin_region},
75 origin_postal => $form->{origin_postal},
76 origin_country => $form->{origin_country},
77 origin_phone => $form->{origin_phone},
78 origin_email => $form->{origin_email},
79 default_carrier => $form->{default_carrier},
80 default_service => $form->{default_service},
81 auto_email_tracking => $form->{auto_email_tracking},
82 require_signature => $form->{require_signature},
83 handling_fee_cents => $form->{handling_fee_cents},
84 default_handling_days => $form->{default_handling_days},
85 insurance_default_cents => $form->{insurance_default_cents},
86 );
87 }
88 elsif ($act eq 'save_carrier') {
89 $ship->upsert_carrier($db, $dbh, $DB, $owner_uid,
90 carrier => $form->{carrier},
91 display_name => $form->{display_name},
92 is_enabled => $form->{is_enabled},
93 is_live => $form->{is_live},
94 account_number => $form->{account_number},
95 api_key => $form->{api_key},
96 api_secret => $form->{api_secret},
97 default_service => $form->{default_service},
98 notes => $form->{notes},
99 );
100 }
101 elsif ($act eq 'zone_create') {
102 $ship->zone_create($db, $dbh, $DB, $owner_uid,
103 name => $form->{name},
104 country_codes => $form->{country_codes},
105 base_cents => $form->{base_cents},
106 per_kg_cents => $form->{per_kg_cents},
107 free_over_cents => $form->{free_over_cents},
108 delivery_days_min => $form->{delivery_days_min},
109 delivery_days_max => $form->{delivery_days_max},
110 carrier_hint => $form->{carrier_hint},
111 sort_order => $form->{sort_order},
112 is_enabled => exists $form->{is_enabled} ? 1 : 1,
113 );
114 }
115 elsif ($act eq 'zone_update') {
116 my $id = $form->{id} || 0; $id =~ s/[^0-9]//g;
117 $ship->zone_update($db, $dbh, $DB, $id, $owner_uid,
118 name => $form->{name},
119 country_codes => $form->{country_codes},
120 base_cents => $form->{base_cents},
121 per_kg_cents => $form->{per_kg_cents},
122 free_over_cents => $form->{free_over_cents},
123 delivery_days_min => $form->{delivery_days_min},
124 delivery_days_max => $form->{delivery_days_max},
125 carrier_hint => $form->{carrier_hint},
126 sort_order => $form->{sort_order},
127 is_enabled => exists $form->{is_enabled} ? 1 : 0,
128 );
129 }
130 elsif ($act eq 'zone_delete') {
131 my $id = $form->{id} || 0; $id =~ s/[^0-9]//g;
132 $ship->zone_delete($db, $dbh, $DB, $id, $owner_uid);
133 }
134 $db->db_disconnect($dbh);
135 print "Status: 302 Found\nLocation: /shipping_settings.cgi?ok=1\n\n"; exit;
136}
137
138my $settings = $ship->get_settings($db, $dbh, $DB, $owner_uid) || {};
139my $carriers_cfg = $ship->list_carriers($db, $dbh, $DB, $owner_uid);
140my $zones = $ship->list_zones($db, $dbh, $DB, $owner_uid);
141my $carrier_meta = $ship->carriers_static;
142
143$db->db_disconnect($dbh);
144
145# Map saved carrier rows by slug for easy lookup
146my %carrier_by_slug = map { $_->{carrier} => $_ } @$carriers_cfg;
147my @carrier_blocks;
148foreach my $slug (qw(usps ups fedex dhl other)) {
149 my $meta = $carrier_meta->{$slug};
150 my $saved = $carrier_by_slug{$slug} || {};
151 push @carrier_blocks, {
152 slug => $slug,
153 name => $meta->{name},
154 full => $meta->{full},
155 connect_help => $meta->{connect_help},
156 display_name => _h($saved->{display_name} || $meta->{name}),
157 is_enabled => $saved->{is_enabled} ? 'checked' : '',
158 is_live => $saved->{is_live} ? 'checked' : '',
159 account_number=> _h($saved->{account_number} || ''),
160 api_key => _h($saved->{api_key} || ''),
161 api_secret_set=> length($saved->{api_secret} || '') ? 1 : 0,
162 default_service => _h($saved->{default_service} || $meta->{default_service}),
163 services_list => join(', ', @{ $meta->{services} || [] }),
164 notes => _h($saved->{notes} || ''),
165 is_configured => exists $carrier_by_slug{$slug} ? 1 : 0,
166 };
167}
168
169my @zone_rows;
170foreach my $z (@$zones) {
171 push @zone_rows, {
172 id => $z->{id},
173 name => _h($z->{name}),
174 country_codes => _h($z->{country_codes} || ''),
175 base => sprintf('%.2f', ($z->{base_cents} || 0) / 100),
176 per_kg => sprintf('%.2f', ($z->{per_kg_cents} || 0) / 100),
177 free_over => defined $z->{free_over_cents} ? sprintf('%.2f', $z->{free_over_cents} / 100) : '',
178 delivery_days_min => $z->{delivery_days_min} // '',
179 delivery_days_max => $z->{delivery_days_max} // '',
180 carrier_hint => _h($z->{carrier_hint} || ''),
181 sort_order => $z->{sort_order} || 0,
182 is_enabled => $z->{is_enabled} ? 1 : 0,
183 is_enabled_chk => $z->{is_enabled} ? 'checked' : '',
184 };
185}
186
187my $tvars = {
188 has_flash => defined $form->{ok} ? 1 : 0,
189 flash_msg => 'Saved.',
190 flash_kind => 'ok',
191 origin_name => _h($settings->{origin_name} || ''),
192 origin_company => _h($settings->{origin_company}|| ''),
193 origin_line1 => _h($settings->{origin_line1} || ''),
194 origin_line2 => _h($settings->{origin_line2} || ''),
195 origin_city => _h($settings->{origin_city} || ''),
196 origin_region => _h($settings->{origin_region} || ''),
197 origin_postal => _h($settings->{origin_postal} || ''),
198 origin_country => _h($settings->{origin_country}|| 'US'),
199 origin_phone => _h($settings->{origin_phone} || ''),
200 origin_email => _h($settings->{origin_email} || ''),
201 default_carrier => _h($settings->{default_carrier} || 'manual'),
202 default_service => _h($settings->{default_service} || ''),
203 auto_email_tracking_chk => ($settings->{auto_email_tracking} // 1) ? 'checked' : '',
204 require_signature_chk => ($settings->{require_signature} // 0) ? 'checked' : '',
205 handling_fee_cents => $settings->{handling_fee_cents} // 0,
206 default_handling_days => $settings->{default_handling_days} // 2,
207 insurance_default_cents => $settings->{insurance_default_cents} // '',
208 carriers => \@carrier_blocks,
209 zones => \@zone_rows,
210 has_zones => scalar(@zone_rows) ? 1 : 0,
211};
212
213print "Content-Type: text/html; charset=utf-8\nCache-Control: no-cache\n\n";
214my $body = join('', $tfile->template('repricer_shipping_settings.html', $tvars, $userinfo));
215$wrap->render({
216 userinfo => $userinfo,
217 page_key => 'shipping',
218 title => 'Shipping setup',
219 body => $body,
220});
221exit;
222
223sub _h {
224 my $s = shift // '';
225 $s =~ s/&/&amp;/g; $s =~ s/</&lt;/g; $s =~ s/>/&gt;/g;
226 $s =~ s/"/&quot;/g; $s =~ s/'/&#39;/g;
227 return $s;
228}
Keyboard: j next diff k previous diff g top G bottom r restore c compile-check ? help