Changeset 3727767
- Timestamp:
- 10/04/2026 07:52:22 PM (12 days ago)
- Location:
- lagersky-for-woocommerce/trunk
- Files:
-
- 3 edited
-
includes/class-lagersky-client.php (modified) (1 diff)
-
lagersky-for-woocommerce.php (modified) (7 diffs)
-
readme.txt (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lagersky-for-woocommerce/trunk/includes/class-lagersky-client.php
r3717226 r3727767 43 43 } 44 44 45 public function ping() { 46 return $this->post( 'ping', array() ); 45 /** Sjekk lisens. $info kan ta med pluginens valg (f.eks. prepaid_autopost), så LagerSky vet om dem. */ 46 public function ping( array $info = array() ) { 47 return $this->post( 'ping', $info ); 47 48 } 48 49 -
lagersky-for-woocommerce/trunk/lagersky-for-woocommerce.php
r3717226 r3727767 4 4 * Plugin URI: https://www.lagersky.no/woocommerce 5 5 * Description: Kobler WooCommerce til lagerstyring i LagerSky. Ved fullført ordre trekkes varer fra lageret, og bilag kan bokføres automatisk. Krever en LagerSky-konto. 6 * Version: 3. 2.06 * Version: 3.3.0 7 7 * Requires at least: 6.0 8 8 * Requires PHP: 7.4 … … 18 18 if ( ! defined( 'ABSPATH' ) ) { exit; } 19 19 20 define( 'LAGERSKY_VERSION', '3. 2.0' );20 define( 'LAGERSKY_VERSION', '3.3.0' ); 21 21 define( 'LAGERSKY_OPT', 'lagersky_settings' ); 22 22 define( 'LAGERSKY_URL', 'https://www.lagersky.no' ); // fast adresse … … 44 44 'payment_days' => '14', 45 45 'stock_sync' => '0', 46 'prepaid_autopost'=> '0', 46 47 ); 47 48 return wp_parse_args( get_option( LAGERSKY_OPT, array() ), $d ); … … 64 65 'payment_days' => (string) intval( $_POST['payment_days'] ?? 14 ), 65 66 'stock_sync' => isset( $_POST['stock_sync'] ) ? '1' : '0', 67 'prepaid_autopost'=> ! empty( $_POST['prepaid_autopost'] ) ? '1' : '0', 66 68 ); 67 69 update_option( LAGERSKY_OPT, $s ); … … 144 146 if ( is_array( $cached ) ) { return $cached; } 145 147 } 146 $res = ( new Lagersky_Client( LAGERSKY_URL, $s['license'] ) )->ping( );148 $res = ( new Lagersky_Client( LAGERSKY_URL, $s['license'] ) )->ping( array( 'prepaid_autopost' => $s['prepaid_autopost'] === '1' ) ); 147 149 $status = ! empty( $res['ok'] ) 148 ? array( 'ok' => true, 'company' => $res['company'] ?? '', 'luca' => ! empty( $res['luca_configured'] ) ) 150 ? array( 'ok' => true, 'company' => $res['company'] ?? '', 'luca' => ! empty( $res['luca_configured'] ), 151 'accounts' => is_array( $res['accounts'] ?? null ) ? $res['accounts'] : array() ) 149 152 : array( 'ok' => false, 'msg' => $res['error'] ?? 'Lisensnøkkelen ble ikke godkjent.' ); 150 153 set_transient( 'lagersky_status', $status, 300 ); … … 165 168 $statuses = wc_get_order_statuses(); 166 169 $logo = LAGERSKY_URL . '/assets/lagersky-logo.png'; 170 $luca = ! empty( $st['ok'] ) && ! empty( $st['luca'] ); 171 $acc = isset( $st['accounts'] ) && is_array( $st['accounts'] ) ? $st['accounts'] : array(); 172 $clr = isset( $acc['clearing'] ) ? $acc['clearing'] : '1579'; 173 $sal = isset( $acc['sales'] ) ? $acc['sales'] : '3000'; 174 $vat = isset( $acc['vat_code'] ) ? $acc['vat_code'] : '3'; 167 175 ?> 176 <style> 177 .lsk-card{background:#fff;border:1px solid #dcdcde;border-radius:10px;padding:6px 20px 14px;margin:18px 0;max-width:980px} 178 .lsk-card h2{margin:14px 0 2px;font-size:16px} 179 .lsk-card .lsk-sub{color:#646970;margin:0 0 4px} 180 .lsk-card .form-table th{width:230px} 181 .lsk-off{opacity:.5} 182 .lsk-lock{background:#fcf9e8;border:1px solid #f0e2a8;border-radius:8px;padding:9px 12px;margin:10px 0 2px;color:#5f4b0c} 183 .lsk-acc{display:inline-block;background:#f0f6fc;border:1px solid #c5d9ed;border-radius:6px;padding:2px 8px;font-family:monospace} 184 </style> 168 185 <div class="wrap"> 169 186 <h1>LagerSky for WooCommerce</h1> 170 187 <?php settings_errors( 'lagersky' ); ?> 171 188 172 <div style="margin:14px 0;padding:14px 16px;border-radius:10px;border:1px solid <?php echo $st['ok'] ? '#b6e0c4' : '#e6b3b3'; ?>;background:<?php echo $st['ok'] ? '#eafaf0' : '#fdeded'; ?>">173 <?php if ( $st['ok'] ) : ?>174 <strong style="color:#157a49;font-size:15px">✓ Lisens aktiv</strong>175 <span style="color:#3f5170"> – tilkoblet <strong><?php echo esc_html( $st['company'] ); ?></strong><?php echo $st['luca'] ? ' · Luca Regnskap aktiv' : ' · Luca Regnskap ikke aktivert (lager føres uten bilag)'; ?></span>176 <?php else : ?>177 <strong style="color:#9c2b2b;font-size:15px">✗ Ikke aktiv</strong>178 <span style="color:#3f5170"> – <?php echo esc_html( $st['msg'] ); ?></span>179 <?php endif; ?>180 </div>181 182 189 <form method="post"> 183 190 <?php wp_nonce_field( 'lagersky_save' ); ?> 184 <table class="form-table" role="presentation"> 185 <tr><th><label for="license">Lisensnøkkel</label></th> 186 <td><input name="license" id="license" type="text" class="regular-text code" value="<?php echo esc_attr( $s['license'] ); ?>" placeholder="LSK-XXXX-XXXX-XXXX"> 187 <p class="description">Finnes under Innstillinger → Lisensnøkkel i LagerSky. Adressen til LagerSky er satt automatisk.</p></td></tr> 188 <tr><th><label for="trigger_status">Synk ved status</label></th> 189 <td><select name="trigger_status" id="trigger_status"> 190 <?php foreach ( $statuses as $key => $label ) : $k = str_replace( 'wc-', '', $key ); ?> 191 <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['trigger_status'], $k ); ?>><?php echo esc_html( $label ); ?></option> 192 <?php endforeach; ?> 193 </select> 194 <p class="description">Når ordren får denne statusen, trekkes varer fra lageret. Anbefalt: Fullført.</p></td></tr> 195 <tr><th><label for="prepaid_methods">Forhåndsbetalte betalingsmåter</label></th> 196 <td><input name="prepaid_methods" id="prepaid_methods" type="text" class="regular-text" value="<?php echo esc_attr( $s['prepaid_methods'] ); ?>"> 197 <p class="description">Kommaseparerte betalings-ID-er (f.eks. vipps). Disse trekkes fra lageret her – selve oppgjøret bokføres under «Vipps Oppgjør» i LagerSky.</p></td></tr> 198 <tr><th>Faktura</th> 199 <td><label><input type="checkbox" name="make_invoice" value="1" <?php checked( $s['make_invoice'], '1' ); ?>> Opprett kunde + fakturautkast i Luca Regnskap for ikke-forhåndsbetalte ordrer</label> 200 <p class="description">Krever at Luca Regnskap er aktivert i LagerSky. Finnes ikke kunden, opprettes den; fakturaen får riktige varelinjer med samme produktnummer.</p></td></tr> 201 <tr><th><label for="invoice_type">Fakturatype</label></th> 202 <td><select name="invoice_type" id="invoice_type"> 203 <?php foreach ( array( 'DRAFT' => 'Kladd (anbefalt ved oppstart)', 'INVOICE' => 'Faktura', 'OFFER' => 'Tilbud' ) as $k => $l ) : ?> 204 <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['invoice_type'], $k ); ?>><?php echo esc_html( $l ); ?></option> 205 <?php endforeach; ?> 206 </select></td></tr> 207 <tr><th><label for="payment_days">Betalingsfrist (dager)</label></th> 208 <td><input name="payment_days" id="payment_days" type="number" min="0" value="<?php echo esc_attr( $s['payment_days'] ); ?>" class="small-text"></td></tr> 209 <tr><th>Lager tilbake</th> 210 <td><label><input type="checkbox" name="stock_sync" value="1" <?php checked( $s['stock_sync'], '1' ); ?>> Send oppdatert lager fra LagerSky tilbake til WooCommerce (ca. hvert 15. minutt)</label> 211 <p class="description">LagerSky er master for lageret. Antallet settes <strong>absolutt</strong> ut fra varenummer (SKU), så det holder seg i takt uansett hva som endrer lageret. Pakker settes til hvor mange som kan bygges. 212 <?php $ls = get_option( 'lagersky_last_stock_sync' ); if ( is_array( $ls ) && ! empty( $ls['time'] ) ) { echo ' <br>Sist synkronisert: ' . esc_html( $ls['time'] ) . ' (' . (int) $ls['count'] . ' produkter).'; } ?></p></td></tr> 213 </table> 191 192 <!-- 1. Tilkobling --> 193 <div class="lsk-card"> 194 <h2>1. Tilkobling</h2> 195 <div style="margin:10px 0 4px;padding:12px 14px;border-radius:8px;border:1px solid <?php echo $st['ok'] ? '#b6e0c4' : '#e6b3b3'; ?>;background:<?php echo $st['ok'] ? '#eafaf0' : '#fdeded'; ?>"> 196 <?php if ( $st['ok'] ) : ?> 197 <strong style="color:#157a49">✓ Lisens aktiv</strong> 198 <span style="color:#3f5170"> – tilkoblet <strong><?php echo esc_html( $st['company'] ); ?></strong> · Luca Regnskap: <?php if ( $luca ) : ?><strong style="color:#157a49">aktiv</strong><?php else : ?><strong>ikke koblet til</strong><?php endif; ?></span> 199 <?php else : ?> 200 <strong style="color:#9c2b2b">✗ Ikke aktiv</strong> 201 <span style="color:#3f5170"> – <?php echo esc_html( $st['msg'] ); ?></span> 202 <?php endif; ?> 203 </div> 204 <table class="form-table" role="presentation"> 205 <tr><th><label for="license">Lisensnøkkel</label></th> 206 <td><input name="license" id="license" type="text" class="regular-text code" value="<?php echo esc_attr( $s['license'] ); ?>" placeholder="LSK-XXXX-XXXX-XXXX"> 207 <p class="description">Finnes under Innstillinger → Lisensnøkkel i LagerSky. Adressen til LagerSky er satt automatisk.</p></td></tr> 208 </table> 209 </div> 210 211 <!-- 2. Ordre og lager --> 212 <div class="lsk-card"> 213 <h2>2. Ordre og lager</h2> 214 <p class="lsk-sub">Når varene trekkes fra lageret, og om lageret skal synkes tilbake til nettbutikken.</p> 215 <table class="form-table" role="presentation"> 216 <tr><th><label for="trigger_status">Trekk lager ved status</label></th> 217 <td><select name="trigger_status" id="trigger_status"> 218 <?php foreach ( $statuses as $key => $label ) : $k = str_replace( 'wc-', '', $key ); ?> 219 <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['trigger_status'], $k ); ?>><?php echo esc_html( $label ); ?></option> 220 <?php endforeach; ?> 221 </select> 222 <p class="description">Når ordren får denne statusen, trekkes varene fra lageret i LagerSky. Anbefalt: Fullført.</p></td></tr> 223 <tr><th>Lager tilbake til nettbutikken</th> 224 <td><label><input type="checkbox" name="stock_sync" value="1" <?php checked( $s['stock_sync'], '1' ); ?>> Send oppdatert lager fra LagerSky tilbake til WooCommerce (ca. hvert 15. minutt)</label> 225 <p class="description">LagerSky er master for lageret. Antallet settes <strong>absolutt</strong> ut fra varenummer (SKU). Pakker settes til hvor mange som kan bygges. 226 <?php $ls = get_option( 'lagersky_last_stock_sync' ); if ( is_array( $ls ) && ! empty( $ls['time'] ) ) { echo ' <br>Sist synkronisert: ' . esc_html( $ls['time'] ) . ' (' . (int) $ls['count'] . ' produkter).'; } ?></p></td></tr> 227 </table> 228 </div> 229 230 <!-- 3. Regnskap --> 231 <div class="lsk-card"> 232 <h2>3. Regnskap (Luca Regnskap)</h2> 233 <p class="lsk-sub">Automatisk bokføring når en ordre fullføres. Kontoene hentes fra LagerSky (Innstillinger → Kontoer).</p> 234 <?php if ( ! $luca ) : ?> 235 <div class="lsk-lock">🔒 <strong>Luca Regnskap er ikke koblet til i LagerSky.</strong> Disse valgene er slått av til du legger inn API-nøkkelen i LagerSky under Innstillinger → Luca Regnskap. Lageret trekkes som vanlig.</div> 236 <?php foreach ( array( 'prepaid_methods', 'invoice_type', 'payment_days' ) as $hk ) : ?> 237 <input type="hidden" name="<?php echo esc_attr( $hk ); ?>" value="<?php echo esc_attr( $s[ $hk ] ); ?>"> 238 <?php endforeach; ?> 239 <?php if ( $s['make_invoice'] === '1' ) : ?><input type="hidden" name="make_invoice" value="1"><?php endif; ?> 240 <?php if ( $s['prepaid_autopost'] === '1' ) : ?><input type="hidden" name="prepaid_autopost" value="1"><?php endif; ?> 241 <?php endif; ?> 242 <table class="form-table<?php echo $luca ? '' : ' lsk-off'; ?>" role="presentation"> 243 <tr><th><label for="prepaid_methods">Forhåndsbetalte betalingsmåter</label></th> 244 <td><input name="prepaid_methods" id="prepaid_methods" type="text" class="regular-text" value="<?php echo esc_attr( $s['prepaid_methods'] ); ?>"<?php disabled( ! $luca ); ?>> 245 <p class="description">Kommaseparerte betalings-ID-er, f.eks. <code>vipps,vipps_mobilepay</code>. Kunden har allerede betalt, så det lages ingen faktura for disse.</p></td></tr> 246 <tr><th>Vipps/MobilePay-salg</th> 247 <td><label><input type="checkbox" name="prepaid_autopost" value="1" <?php checked( $s['prepaid_autopost'], '1' ); ?><?php disabled( ! $luca ); ?>> Bokfør salget automatisk i Luca Regnskap når ordren fullføres</label> 248 <p class="description">Føres som debet <span class="lsk-acc"><?php echo esc_html( $clr ); ?></span> (mellomkonto) / kredit <span class="lsk-acc"><?php echo esc_html( $sal ); ?></span><?php if ( $vat !== '' ) : ?> med mva-kode <span class="lsk-acc"><?php echo esc_html( $vat ); ?></span><?php endif; ?>, ordrens totalbeløp på fullføringsdatoen. 249 <br>Når dette er på, slår LagerSky automatisk på <strong>«Bokfør kun oppgjøret (steg 2)»</strong> under Vipps Oppgjør, så salget ikke blir bokført to ganger. Av: hele oppgjøret (salg + utbetaling) føres under Vipps Oppgjør.</p></td></tr> 250 <tr><th>Faktura for andre betalinger</th> 251 <td><label><input type="checkbox" name="make_invoice" value="1" <?php checked( $s['make_invoice'], '1' ); ?><?php disabled( ! $luca ); ?>> Opprett kunde og faktura i Luca Regnskap for ordrer som ikke er forhåndsbetalt</label> 252 <p class="description">Finnes ikke kunden, opprettes den. Fakturaen får de samme varelinjene og varenumrene som ordren.</p></td></tr> 253 <tr><th><label for="invoice_type">Fakturatype</label></th> 254 <td><select name="invoice_type" id="invoice_type"<?php disabled( ! $luca ); ?>> 255 <?php foreach ( array( 'DRAFT' => 'Kladd (anbefalt ved oppstart)', 'INVOICE' => 'Faktura', 'OFFER' => 'Tilbud' ) as $k => $l ) : ?> 256 <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['invoice_type'], $k ); ?>><?php echo esc_html( $l ); ?></option> 257 <?php endforeach; ?> 258 </select></td></tr> 259 <tr><th><label for="payment_days">Betalingsfrist (dager)</label></th> 260 <td><input name="payment_days" id="payment_days" type="number" min="0" value="<?php echo esc_attr( $s['payment_days'] ); ?>" class="small-text"<?php disabled( ! $luca ); ?>></td></tr> 261 </table> 262 <?php if ( $luca && ! empty( $acc['cogs'] ) ) : ?> 263 <p class="description" style="margin-top:6px">Varekost ved salg føres alltid automatisk: debet <span class="lsk-acc"><?php echo esc_html( $acc['cogs'] ); ?></span> / kredit <span class="lsk-acc"><?php echo esc_html( $acc['inventory'] ?? '1460' ); ?></span>.</p> 264 <?php endif; ?> 265 </div> 266 214 267 <p> 215 <button type="submit" name="lagersky_save" class="button button-primary">Lagre </button>268 <button type="submit" name="lagersky_save" class="button button-primary">Lagre innstillinger</button> 216 269 <button type="submit" name="lagersky_test" class="button">Sjekk lisens på nytt</button> 217 270 </p> 218 271 </form> 219 <p class="description">Lager, pakker, kontoer og bokføring styres i LagerSky. Denne pluginen sender kun ordredata dit – den har ingen databasetilgang.</p> 220 221 <hr style="margin:28px 0 18px"> 222 <h2 style="margin-top:0">Hent produktene inn i LagerSky</h2> 223 <p style="max-width:720px">Nytt i LagerSky? Send alle produktene fra nettbutikken dit med ett klikk, så slipper du å legge dem inn på nytt. Det sendes <strong>SKU (blir varenummer), navn, pris eks. mva, lagerantall og GTIN/EAN</strong>. Produkter uten SKU hoppes over.</p> 224 <p style="max-width:720px"><strong>Ingenting blir overskrevet automatisk.</strong> I LagerSky får du en oversikt: nye produkter legges til, og finnes et produkt fra før med andre verdier, vises endringene i rødt – du velger selv hva som skal oppdateres.</p> 225 <form method="post" onsubmit="return confirm('Sende alle produkter med SKU til LagerSky for gjennomgang?');"> 226 <?php wp_nonce_field( 'lagersky_import' ); ?> 227 <button type="submit" name="lagersky_import" class="button button-secondary" <?php disabled( ! $st['ok'] ); ?>>Send produkter til LagerSky</button> 228 <?php if ( ! $st['ok'] ) : ?><span class="description" style="margin-left:8px">Krever aktiv lisens.</span><?php endif; ?> 229 </form> 272 273 <!-- 4. Produkter --> 274 <div class="lsk-card"> 275 <h2>4. Hent produktene inn i LagerSky</h2> 276 <p style="max-width:760px">Nytt i LagerSky? Send alle produktene fra nettbutikken dit med ett klikk, så slipper du å legge dem inn på nytt. Det sendes <strong>SKU (blir varenummer), navn, pris eks. mva, lagerantall og GTIN/EAN</strong>. Produkter uten SKU hoppes over.</p> 277 <p style="max-width:760px"><strong>Ingenting blir overskrevet automatisk.</strong> I LagerSky får du en oversikt: nye produkter legges til, og finnes et produkt fra før med andre verdier, vises endringene i rødt – du velger selv hva som skal oppdateres.</p> 278 <form method="post" onsubmit="return confirm('Sende alle produkter med SKU til LagerSky for gjennomgang?');"> 279 <?php wp_nonce_field( 'lagersky_import' ); ?> 280 <button type="submit" name="lagersky_import" class="button button-secondary" <?php disabled( ! $st['ok'] ); ?>>Send produkter til LagerSky</button> 281 <?php if ( ! $st['ok'] ) : ?><span class="description" style="margin-left:8px">Krever aktiv lisens.</span><?php endif; ?> 282 </form> 283 </div> 284 285 <p class="description">Lager, pakker, kontoer og bokføring styres i LagerSky. Pluginen sender bare ordre- og produktdata dit – den har ingen databasetilgang.</p> 230 286 231 287 <div style="text-align:center;margin-top:40px;padding-top:24px;border-top:1px solid #e0e0e0"> … … 323 379 'payment_days' => (int) $s['payment_days'], 324 380 'gross_total' => round( (float) $order->get_total(), 2 ), 381 'prepaid_autopost' => ( $s['prepaid_autopost'] === '1' ), 382 'payment_method_title' => $order->get_payment_method_title(), 325 383 'billing' => array( 326 384 'company' => $order->get_billing_company(), -
lagersky-for-woocommerce/trunk/readme.txt
r3717226 r3727767 5 5 Tested up to: 7.1 6 6 Requires PHP: 7.4 7 Stable tag: 3. 2.07 Stable tag: 3.3.0 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 22 22 * Bundles are broken down into their components 23 23 * Optional automatic bookkeeping in Luca Regnskap (cost of goods, sales, invoices) 24 * Optional automatic posting of Vipps/MobilePay sales to Luca Regnskap when the order is completed 24 25 * Separate settings for prepaid payment methods (for example Vipps) 25 26 * License status shown directly on the settings page … … 34 35 35 36 * When an order reaches the status you have selected, order data is sent to the LagerSky API (https://www.lagersky.no/api/v1/): order number, order lines (item number/SKU, name, quantity and price) and – if you enable invoicing – billing details (name, company, email, phone and address). 36 * When you open the settings page or click "Check license", the license key is sent to verify its status .37 * When you open the settings page or click "Check license", the license key is sent to verify its status, together with whether automatic posting of prepaid (Vipps/MobilePay) sales is switched on. 37 38 * When you click "Send products to LagerSky", the product list is sent (SKU, name, price excluding VAT, stock quantity and GTIN/EAN). No customer data is sent. 38 39 * If you enable stock sync, the plugin regularly fetches updated stock levels from LagerSky (item number/SKU and quantity) and sets the quantity in WooCommerce. … … 75 76 == Changelog == 76 77 78 = 3.3.0 = 79 * New: settings are grouped into Connection, Orders & stock, Accounting and Products. 80 * New: optional automatic posting of Vipps/MobilePay sales to Luca Regnskap when an order is completed, using the accounts set in LagerSky. 81 * New: accounting options are locked (greyed out) until Luca Regnskap is connected in LagerSky. 82 77 83 = 3.2.0 = 78 84 * New: "Send products to LagerSky" button – one-time import of products from the store. Changes to existing products must be approved in LagerSky.
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)